From dcb33773493c85ae9a0f58ce62144bfbcb19dd7e Mon Sep 17 00:00:00 2001 From: Youwes09 Date: Mon, 23 Mar 2026 11:39:01 -0500 Subject: [PATCH] Chore: Standardized UI & Revamped Series-Detail --- src/components/layout/Layout.svelte | 4 +- src/components/layout/RecentActivity.svelte | 46 +-- src/components/pages/Downloads.svelte | 10 +- src/components/pages/Extensions.svelte | 40 +-- src/components/pages/History.svelte | 250 ---------------- src/components/pages/Library.svelte | 7 +- src/components/pages/Search.svelte | 2 +- src/components/pages/SeriesDetail.svelte | 299 ++++++++++---------- src/components/pages/Tracking.svelte | 133 ++++++++- src/components/shared/SourceList.svelte | 9 +- src/components/shared/TrackingPanel.svelte | 104 ++++++- 11 files changed, 428 insertions(+), 476 deletions(-) delete mode 100644 src/components/pages/History.svelte diff --git a/src/components/layout/Layout.svelte b/src/components/layout/Layout.svelte index 7650ecc..235d1a8 100644 --- a/src/components/layout/Layout.svelte +++ b/src/components/layout/Layout.svelte @@ -4,7 +4,7 @@ import Home from "../pages/Home.svelte"; import Library from "../pages/Library.svelte"; import SeriesDetail from "../pages/SeriesDetail.svelte"; - import History from "../pages/History.svelte"; + import RecentActivity from "./RecentActivity.svelte"; import Search from "../pages/Search.svelte"; import Discover from "../pages/Discover.svelte"; import GenreDrillPage from "../pages/GenreDrillPage.svelte"; @@ -25,7 +25,7 @@ {:else if store.navPage === "search"} {:else if store.navPage === "history"} - + {:else if (store.navPage === "explore" || store.navPage === "sources") && store.genreFilter} {:else if store.navPage === "explore" || store.navPage === "sources"} diff --git a/src/components/layout/RecentActivity.svelte b/src/components/layout/RecentActivity.svelte index f0c3881..5ddec63 100644 --- a/src/components/layout/RecentActivity.svelte +++ b/src/components/layout/RecentActivity.svelte @@ -79,11 +79,11 @@ } const filtered = $derived(search.trim() - ? store..filter((e) => + ? store.history.filter((e) => e.mangaTitle.toLowerCase().includes(search.toLowerCase()) || e.chapterName.toLowerCase().includes(search.toLowerCase()) ) - : store.); + : store.history); const sessions = $derived(buildSessions(filtered)); @@ -97,10 +97,16 @@ return Array.from(map.entries()).map(([label, items]) => ({ label, items })); }); + // Resume: navigate to the manga's SeriesDetail (which will pick up from + // activeChapterList once chapters load). We can't hold a stale chapter list + // here — SeriesDetail fetches fresh chapters itself. function resume(session: Session) { - const ch = store..find((c) => c.id === session.latestChapterId); - if (ch && store..length > 0) openReader(ch, ); - else setActiveManga({ id: session.mangaId, title: session.mangaTitle, thumbnailUrl: session.thumbnailUrl } as any); + setActiveManga({ + id: session.mangaId, + title: session.mangaTitle, + thumbnailUrl: session.thumbnailUrl, + inLibrary: false, + } as any); } function handleClear() { @@ -111,17 +117,17 @@
-
+
{#if loading}
{#each Array(12) as _} @@ -275,6 +276,7 @@
{/if} {/if} +
{/if} @@ -286,11 +288,12 @@ {/if} diff --git a/src/components/pages/Tracking.svelte b/src/components/pages/Tracking.svelte index 380c6e9..1e06afe 100644 --- a/src/components/pages/Tracking.svelte +++ b/src/components/pages/Tracking.svelte @@ -35,6 +35,9 @@ // Mutation state let updatingId: number | null = $state(null); let syncingId: number | null = $state(null); + // Chapter editing: recordId → draft value + let editingChapter: number | null = $state(null); + let chapterDraft: number = $state(0); // ── Load ─────────────────────────────────────────────────────────────────── @@ -187,14 +190,40 @@ setActiveManga(record.manga as any); setNavPage("library"); } + + function openChapterEditor(record: FlatRecord) { + editingChapter = record.id; + chapterDraft = record.lastChapterRead; + } + + function cancelChapterEditor() { + editingChapter = null; + } + + async function submitChapter(record: FlatRecord) { + const val = Math.max(0, chapterDraft); + editingChapter = null; + if (val === record.lastChapterRead) return; + updatingId = record.id; + try { + const res = await gql<{ updateTrack: { trackRecord: TrackRecord } }>( + UPDATE_TRACK, { recordId: record.id, lastChapterRead: val } + ); + patchRecord(record.trackerId, res.updateTrack.trackRecord); + } catch (e: any) { + addToast({ kind: "error", title: "Update failed", body: e?.message }); + } finally { + updatingId = null; + } + }
-