/ src / components / PageModal.svelte
PageModal.svelte
 1  <script lang="ts">
 2      import { onMount, type SvelteComponent } from 'svelte';
 3      import type { GenericPage } from '@jet-app/app-store/api/models';
 4  
 5      import Modal from '@amp/web-app-components/src/components/Modal/Modal.svelte';
 6      import { getModalPageStore } from '~/stores/modalPage';
 7      import ShelfComponent from '~/components/jet/shelf/Shelf.svelte';
 8      import ContentModal from '~/components/jet/item/ContentModal.svelte';
 9      import { LICENSE_AGREEMENT_MODAL_ID } from '~/utils/metrics';
10  
11      let modalElement: SvelteComponent;
12      let modalPage = getModalPageStore();
13      let page: GenericPage | undefined;
14  
15      $: page = $modalPage?.page;
16      $: shelves = page?.shelves ?? [];
17      $: title = page?.title ?? null;
18      $: targetId =
19          $modalPage?.pageDetail === 'licenseAgreement'
20              ? LICENSE_AGREEMENT_MODAL_ID
21              : undefined;
22  
23      onMount(() => {
24          return modalPage.clearPage;
25      });
26  
27      $: {
28          if ($modalPage) {
29              modalElement?.showModal();
30          } else {
31              handleModalClose();
32          }
33      }
34  
35      function handleModalClose() {
36          modalElement?.close();
37          modalPage.clearPage();
38      }
39  </script>
40  
41  <Modal
42      modalTriggerElement={null}
43      bind:this={modalElement}
44      on:close={handleModalClose}
45  >
46      <div class="modal-content">
47          {#if page}
48              <ContentModal
49                  {title}
50                  subtitle={null}
51                  on:close={handleModalClose}
52                  {targetId}
53              >
54                  <svelte:fragment slot="content">
55                      {#each shelves as shelf}
56                          <ShelfComponent {shelf}>
57                              <slot
58                                  name="marker-shelf"
59                                  slot="marker-shelf"
60                                  let:shelf
61                                  {shelf}
62                              />
63                          </ShelfComponent>
64                      {/each}
65                  </svelte:fragment>
66              </ContentModal>
67          {/if}
68      </div>
69  </Modal>
70  
71  <style lang="scss">
72      .modal-content :global(p) {
73          user-select: text;
74          margin-bottom: 15px;
75          overflow-wrap: break-word;
76      }
77  
78      :global(.noscroll) {
79          overflow: hidden;
80          touch-action: none;
81      }
82  </style>