summaryrefslogtreecommitdiff
path: root/src/components/PageModal.svelte
diff options
context:
space:
mode:
authorrxliuli <rxliuli@gmail.com>2025-11-04 05:03:50 +0800
committerrxliuli <rxliuli@gmail.com>2025-11-04 05:03:50 +0800
commitbce557cc2dc767628bed6aac87301a1be7c5431b (patch)
treeb51a051228d01fe3306cd7626d4a96768aadb944 /src/components/PageModal.svelte
init commit
Diffstat (limited to 'src/components/PageModal.svelte')
-rw-r--r--src/components/PageModal.svelte82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/components/PageModal.svelte b/src/components/PageModal.svelte
new file mode 100644
index 0000000..9e5ee50
--- /dev/null
+++ b/src/components/PageModal.svelte
@@ -0,0 +1,82 @@
+<script lang="ts">
+ import { onMount, type SvelteComponent } from 'svelte';
+ import type { GenericPage } from '@jet-app/app-store/api/models';
+
+ import Modal from '@amp/web-app-components/src/components/Modal/Modal.svelte';
+ import { getModalPageStore } from '~/stores/modalPage';
+ import ShelfComponent from '~/components/jet/shelf/Shelf.svelte';
+ import ContentModal from '~/components/jet/item/ContentModal.svelte';
+ import { LICENSE_AGREEMENT_MODAL_ID } from '~/utils/metrics';
+
+ let modalElement: SvelteComponent;
+ let modalPage = getModalPageStore();
+ let page: GenericPage | undefined;
+
+ $: page = $modalPage?.page;
+ $: shelves = page?.shelves ?? [];
+ $: title = page?.title ?? null;
+ $: targetId =
+ $modalPage?.pageDetail === 'licenseAgreement'
+ ? LICENSE_AGREEMENT_MODAL_ID
+ : undefined;
+
+ onMount(() => {
+ return modalPage.clearPage;
+ });
+
+ $: {
+ if ($modalPage) {
+ modalElement?.showModal();
+ } else {
+ handleModalClose();
+ }
+ }
+
+ function handleModalClose() {
+ modalElement?.close();
+ modalPage.clearPage();
+ }
+</script>
+
+<Modal
+ modalTriggerElement={null}
+ bind:this={modalElement}
+ on:close={handleModalClose}
+>
+ <div class="modal-content">
+ {#if page}
+ <ContentModal
+ {title}
+ subtitle={null}
+ on:close={handleModalClose}
+ {targetId}
+ >
+ <svelte:fragment slot="content">
+ {#each shelves as shelf}
+ <ShelfComponent {shelf}>
+ <slot
+ name="marker-shelf"
+ slot="marker-shelf"
+ let:shelf
+ {shelf}
+ />
+ </ShelfComponent>
+ {/each}
+ </svelte:fragment>
+ </ContentModal>
+ {/if}
+ </div>
+</Modal>
+
+<style lang="scss">
+ .modal-content :global(p) {
+ user-select: text;
+ margin-bottom: 15px;
+ overflow-wrap: break-word;
+ }
+
+ :global(.noscroll) {
+ overflow: hidden;
+ touch-action: none;
+ }
+</style>