From 3f6bd71aaac4277d046485fe8ea2a791ea089cd8 Mon Sep 17 00:00:00 2001 From: Wolfgang Müller Date: Tue, 18 Feb 2025 15:51:14 +0100 Subject: frontend: Migrate PageView to Svelte 5 --- frontend/src/lib/Reader.svelte.ts | 59 +++++++++++++++++ frontend/src/lib/reader/PageView.svelte | 19 +++--- frontend/src/lib/reader/Reader.svelte | 73 +--------------------- .../lib/reader/components/CloseReaderButton.svelte | 2 +- .../src/lib/reader/components/PageIndicator.svelte | 2 +- .../lib/reader/components/ReaderMenuButton.svelte | 2 +- frontend/src/routes/archives/[id]/+page.svelte | 3 +- frontend/src/routes/comics/[id]/+page.svelte | 3 +- frontend/tests/Reader.test.ts | 2 +- 9 files changed, 78 insertions(+), 87 deletions(-) create mode 100644 frontend/src/lib/Reader.svelte.ts (limited to 'frontend') diff --git a/frontend/src/lib/Reader.svelte.ts b/frontend/src/lib/Reader.svelte.ts new file mode 100644 index 0000000..f5a5322 --- /dev/null +++ b/frontend/src/lib/Reader.svelte.ts @@ -0,0 +1,59 @@ +import { Layout, type PageFragment } from '$gql/graphql'; +import { getContext, setContext } from 'svelte'; + +export interface Chunk { + main: PageFragment; + secondary?: PageFragment; + index: number; +} + +class ReaderContext { + visible = $state(false); + sidebar = $state(false); + pages: PageFragment[] = $state([]); + page = $state(0); + + open = (page: number) => { + this.page = page; + this.visible = true; + }; +} + +export function initReaderContext() { + return setContext('reader', new ReaderContext()); +} + +export function getReaderContext() { + return getContext('reader'); +} + +export function partition(pages: PageFragment[], layout: Layout): [Chunk[], number[]] { + const single = layout === Layout.Single; + const offset = layout === Layout.DoubleOffset; + + const chunks: Chunk[] = []; + const lookup: number[] = Array(pages.length); + + for (let chunkIndex = 0, pageIndex = 0; pageIndex < pages.length; chunkIndex++) { + const wide = () => pages[pageIndex].image.aspectRatio > 1; + + const nextPage = () => { + lookup[pageIndex] = chunkIndex; + return pages[pageIndex++]; + }; + + const offsetFirst = pageIndex === 0 && offset; + const full = single || wide() || offsetFirst; + + const chunk: Chunk = { index: pageIndex, main: nextPage() }; + + if (!full && pageIndex < pages.length) { + if (!wide()) { + chunk.secondary = nextPage(); + } + } + + chunks.push(chunk); + } + return [chunks, lookup]; +} diff --git a/frontend/src/lib/reader/PageView.svelte b/frontend/src/lib/reader/PageView.svelte index fc45cfa..2f8def7 100644 --- a/frontend/src/lib/reader/PageView.svelte +++ b/frontend/src/lib/reader/PageView.svelte @@ -1,20 +1,14 @@ {/if} +
+ +