mirror of
https://github.com/moku-project/Moku.git
synced 2026-06-13 09:19:56 -05:00
Feat: Backtracing + NavPage Store
This commit is contained in:
@@ -76,7 +76,7 @@
|
||||
let filtered = allSources;
|
||||
if (kw_selectedLangs.size > 0)
|
||||
filtered = filtered.filter((s) => kw_selectedLangs.has(s.lang));
|
||||
if (!store.settings.showNsfw)
|
||||
if (store.settings.contentLevel !== "unrestricted")
|
||||
filtered = filtered.filter((s) => !shouldHideSource(s, store.settings));
|
||||
return filtered;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
import { deprioritizeQueue } from "@core/cache/imageCache";
|
||||
import { dedupeSourcesByLang }from "@core/algorithms/filter";
|
||||
import { shouldHideNsfw } from "@core/util";
|
||||
import { store, setSearchPrefill, setPreviewManga } from "@store/state.svelte";
|
||||
import { store, setSearchPrefill, setPreviewManga, setSearchQuery } from "@store/state.svelte";
|
||||
import {
|
||||
toCachedManga,
|
||||
type CachedManga,
|
||||
@@ -288,6 +288,8 @@
|
||||
popularResults={popular_results}
|
||||
popularLoading={popular_loading}
|
||||
{sourceCache}
|
||||
query={store.searchQuery}
|
||||
onQueryChange={setSearchQuery}
|
||||
onPrefillConsumed={() => (pendingPrefill = "")}
|
||||
onPreview={setPreviewManga}
|
||||
/>
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
store, setCategories, setLibraryUpdates, addToast,
|
||||
setTabSort, toggleTabSortDir, setTabStatus, toggleTabFilter, clearTabFilters,
|
||||
} from "../store/libraryState.svelte";
|
||||
import { saveScroll, getScroll } from "@store/state.svelte";
|
||||
import type { LibrarySortMode, LibrarySortDir, LibraryStatusFilter, LibraryContentFilter, LibraryUpdateEntry } from "@store/state.svelte";
|
||||
import type { Manga, Category, Chapter } from "@types";
|
||||
import { checkAndMarkCompleted as storeCheckAndMarkCompleted, updateSettings } from "@store/state.svelte";
|
||||
@@ -171,7 +172,18 @@
|
||||
|
||||
$effect(() => { filtered; untrack(() => { renderVisible = paginator.reset(); }); });
|
||||
$effect(() => { retryCount; loading = true; error = null; if (retryCount > 0) cache.clear(CACHE_KEYS.LIBRARY); untrack(() => loadData()); });
|
||||
$effect(() => { if (scrollEl) scrollEl.scrollTo({ top: 0 }); });
|
||||
let prevTab = tab;
|
||||
$effect(() => {
|
||||
const nextTab = tab;
|
||||
if (scrollEl && nextTab !== prevTab) {
|
||||
saveScroll(`library:${prevTab}`, scrollEl.scrollTop);
|
||||
const saved = getScroll(`library:${nextTab}`);
|
||||
untrack(() => { scrollEl.scrollTo({ top: saved }); });
|
||||
prevTab = nextTab;
|
||||
} else if (scrollEl && nextTab === prevTab) {
|
||||
scrollEl.scrollTo({ top: 0 });
|
||||
}
|
||||
});
|
||||
$effect(() => {
|
||||
const f = tab;
|
||||
if (f === "library" || f === "downloaded") return;
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
enqueueing: Set<number>;
|
||||
chapterPage: number;
|
||||
totalPages: number;
|
||||
scrollEl?: HTMLDivElement | null;
|
||||
onOpen: (ch: Chapter, inProgress: boolean) => void;
|
||||
onToggleSelect: (id: number, e: MouseEvent | KeyboardEvent) => void;
|
||||
onEnqueue: (ch: Chapter, e: MouseEvent) => void;
|
||||
@@ -25,6 +26,7 @@
|
||||
let {
|
||||
pageChapters, sortedChapters, viewMode, loadingChapters,
|
||||
selectedIds, enqueueing, chapterPage, totalPages,
|
||||
scrollEl = $bindable(null),
|
||||
onOpen, onToggleSelect, onEnqueue, onDeleteDownload,
|
||||
onPageChange, buildCtxItems,
|
||||
}: Props = $props();
|
||||
@@ -48,7 +50,7 @@
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class={viewMode === "grid" ? "ch-grid" : "ch-list"}>
|
||||
<div class={viewMode === "grid" ? "ch-grid" : "ch-list"} bind:this={scrollEl}>
|
||||
{#if loadingChapters && sortedChapters.length === 0}
|
||||
{#if viewMode === "grid"}
|
||||
{#each Array(24) as _}<div class="grid-cell-skeleton skeleton"></div>{/each}
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
addBookmark, acknowledgeUpdate,
|
||||
checkAndMarkCompleted as storeCheckAndMarkCompleted,
|
||||
clearMarkersForManga,
|
||||
saveScroll, getScroll,
|
||||
} from "@store/state.svelte";
|
||||
import { trackingState } from "@features/tracking/store/trackingState.svelte";
|
||||
import type { MangaPrefs } from "@store/state.svelte";
|
||||
@@ -583,6 +584,20 @@
|
||||
} catch (e) { console.error(e); }
|
||||
}
|
||||
|
||||
let chapterListEl: HTMLDivElement | null = $state(null);
|
||||
let prevMangaId: number | null = null;
|
||||
|
||||
$effect(() => {
|
||||
const mangaId = store.activeManga?.id ?? null;
|
||||
if (mangaId === prevMangaId) return;
|
||||
if (chapterListEl && prevMangaId !== null) saveScroll(`series:${prevMangaId}`, chapterListEl.scrollTop);
|
||||
prevMangaId = mangaId;
|
||||
if (chapterListEl && mangaId !== null) {
|
||||
const saved = getScroll(`series:${mangaId}`);
|
||||
chapterListEl.scrollTo({ top: saved });
|
||||
}
|
||||
});
|
||||
|
||||
onMount(() => () => { mangaAbort?.abort(); chapterAbort?.abort(); });
|
||||
</script>
|
||||
|
||||
@@ -665,6 +680,7 @@
|
||||
{enqueueing}
|
||||
{chapterPage}
|
||||
{totalPages}
|
||||
bind:scrollEl={chapterListEl}
|
||||
onOpen={openReaderWithAhead}
|
||||
onToggleSelect={toggleSelect}
|
||||
onEnqueue={enqueue}
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
function openManga() {
|
||||
if (!record.manga) return;
|
||||
setActiveManga(record.manga as any);
|
||||
setNavPage("library");
|
||||
setNavPage(store.navPage);
|
||||
onClose();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user