From 10f5936dbdc6459a16d00c7fe2bf10a329c4b28f Mon Sep 17 00:00:00 2001 From: Youwes09 Date: Tue, 14 Apr 2026 20:54:16 -0500 Subject: [PATCH] Fix: Attempt to fix Reader Page-Misfiring Bug & Optimize Loading (Auth Only) --- Todo | 7 +++++++ src/components/reader/Reader.svelte | 20 +++++++++++--------- src/lib/imageCache.ts | 23 ++++++++++++++++++----- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/Todo b/Todo index 387013f..b6a52a2 100644 --- a/Todo +++ b/Todo @@ -31,7 +31,14 @@ In-Progress: - Enable Cloudflare Bypass (Suwayomi Config) (Requires Patching) - Working on 3D Display Cards + - Chapter refresh Notification Looks bad (Series Detail) + - Fix Discover Workout + - Fix CSS on Saved State for Search + - Fix State & Cache names (Mapped to Discover hence needs Renaming) + - Completely Remove Discover + + - Add Small QOL Animations where Appropriate diff --git a/src/components/reader/Reader.svelte b/src/components/reader/Reader.svelte index a3c1dea..f2498a4 100644 --- a/src/components/reader/Reader.svelte +++ b/src/components/reader/Reader.svelte @@ -642,8 +642,8 @@ if (style === "double" && pageGroups.length) { advanceGroup(true); return; } if (!store.pageUrls.length) return; if (store.pageNumber < lastPage) { - if (style === "fade") { animateFade(() => { store.pageNumber++; }); } - else { store.pageNumber++; } + if (style === "fade") { animateFade(() => { store.pageNumber = Math.min(lastPage, store.pageNumber + pageStep); }); } + else { store.pageNumber = Math.min(lastPage, store.pageNumber + pageStep); } } else if (adjacent.next) { maybeMarkCurrentRead(); store.pageNumber = 1; @@ -660,11 +660,13 @@ if (style === "double" && pageGroups.length) { advanceGroup(false); return; } if (!store.pageUrls.length) return; if (store.pageNumber > 1) { - if (style === "fade") { animateFade(() => { store.pageNumber--; }); } - else { store.pageNumber--; } + if (style === "fade") { animateFade(() => { store.pageNumber = Math.max(1, store.pageNumber - pageStep); }); } + else { store.pageNumber = Math.max(1, store.pageNumber - pageStep); } } else if (adjacent.prev) { startAtLastPage = true; openReader(adjacent.prev, store.activeChapterList); } } + const pageStep = $derived(style === "double" ? 2 : 1); + const goNext = $derived(rtl ? goBack : goForward); const goPrev = $derived(rtl ? goForward : goBack); @@ -1019,11 +1021,11 @@ - {/if} - {#if !autoNext} - + {#if !autoNext} + + {/if} {/if} diff --git a/src/lib/imageCache.ts b/src/lib/imageCache.ts index 012aad6..d366350 100644 --- a/src/lib/imageCache.ts +++ b/src/lib/imageCache.ts @@ -4,7 +4,7 @@ import { store } from "../store/state.svelte"; const cache = new Map(); const inflight = new Map>(); -const MAX_CONCURRENT = 14; +const MAX_CONCURRENT = 6; let active = 0; interface QueueEntry { @@ -30,9 +30,18 @@ async function doFetch(url: string): Promise { return blobUrl; } +function insertSorted(entry: QueueEntry) { + let lo = 0, hi = queue.length; + while (lo < hi) { + const mid = (lo + hi) >>> 1; + if (queue[mid].priority > entry.priority) lo = mid + 1; + else hi = mid; + } + queue.splice(lo, 0, entry); +} + function drain() { while (active < MAX_CONCURRENT && queue.length > 0) { - queue.sort((a, b) => b.priority - a.priority); const entry = queue.shift()!; active++; doFetch(entry.url) @@ -47,7 +56,7 @@ function drain() { function enqueue(url: string, priority: number): Promise { const promise = new Promise((resolve, reject) => { - queue.push({ url, priority, resolve, reject }); + insertSorted({ url, priority, resolve, reject }); }); inflight.set(url, promise); drain(); @@ -62,8 +71,12 @@ export function getBlobUrl(url: string, priority = 0): Promise { const existing = inflight.get(url); if (existing) { - const entry = queue.find(e => e.url === url); - if (entry && priority > entry.priority) entry.priority = priority; + const idx = queue.findIndex(e => e.url === url); + if (idx !== -1 && priority > queue[idx].priority) { + const [entry] = queue.splice(idx, 1); + entry.priority = priority; + insertSorted(entry); + } return existing; }