diff --git a/src/routes/series/[mangaId]/+page.svelte b/src/routes/series/[mangaId]/+page.svelte index dfb456a..8fb6be1 100644 --- a/src/routes/series/[mangaId]/+page.svelte +++ b/src/routes/series/[mangaId]/+page.svelte @@ -1,33 +1,501 @@ - - Series - Selected manga id: {mangaId} - Series detail UI will be implemented in Phase 4. + + {#if seriesState.current} + + + + + + Chapters + {filteredChapters.length} visible + + + + + Search + + + + + + Unread only + + + + + Downloaded only + + + (seriesState.chapterSortDesc = !seriesState.chapterSortDesc)} + > + Sort: {seriesState.chapterSortDesc ? 'Newest' : 'Oldest'} + + + + + {#if seriesState.chaptersLoading} + Loading chapters... + {:else if filteredChapters.length === 0} + No chapters match the current filters. + {:else} + + {#each filteredChapters as chapter (chapter.id)} + + openChapter(chapter)}> + {chapter.name} + Ch. {formatChapterNumber(chapter)} + + + + {#if chapter.downloaded} + Downloaded + {/if} + toggleChapterRead(chapter)} + aria-label={chapter.read ? 'Mark chapter unread' : 'Mark chapter read'} + > + {#if chapter.read} + + {:else} + + {/if} + + + + {/each} + + {/if} + + {:else} + Could not load this series. + {/if} diff --git a/src/routes/series/[mangaId]/+page.ts b/src/routes/series/[mangaId]/+page.ts new file mode 100644 index 0000000..a6135ef --- /dev/null +++ b/src/routes/series/[mangaId]/+page.ts @@ -0,0 +1,48 @@ +import { error } from '@sveltejs/kit' +import type { PageLoad } from './$types' +import { getAdapter } from '$lib/request-manager' +import { seriesState } from '$lib/state/series.svelte' +import { readerState } from '$lib/state/reader.svelte' + +export const load: PageLoad = async ({ params }) => { + const mangaId = params.mangaId + + if (!mangaId) { + throw error(400, 'Missing manga id') + } + + try { + seriesState.loading = true + seriesState.error = null + seriesState.chaptersLoading = true + seriesState.chaptersError = null + + const adapter = getAdapter() + const [manga, chapters] = await Promise.all([ + adapter.getManga(mangaId), + adapter.getChapters(mangaId), + ]) + + seriesState.current = manga + seriesState.chapters = chapters + + readerState.manga = manga + readerState.chapters = chapters + + return { + manga, + chapters, + mangaId, + } + } catch (err) { + const message = err instanceof Error ? err.message : String(err) + + seriesState.error = message + seriesState.chaptersError = message + + throw error(500, message) + } finally { + seriesState.loading = false + seriesState.chaptersLoading = false + } +} \ No newline at end of file
Selected manga id: {mangaId}
Series detail UI will be implemented in Phase 4.
{filteredChapters.length} visible