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;
+ }
+ }