diff --git a/src/components/home/HomeContent.tsx b/src/components/home/HomeContent.tsx index 0bd0c50..83565ca 100644 --- a/src/components/home/HomeContent.tsx +++ b/src/components/home/HomeContent.tsx @@ -6,12 +6,24 @@ interface HomeContentProps { } export function HomeContent({ data }: HomeContentProps) { + // Merge onDeck (next unread per series) and ongoingBooks (currently reading), + // deduplicate by id, onDeck first + const continueReading = (() => { + const items = [...(data.onDeck ?? []), ...(data.ongoingBooks ?? [])]; + const seen = new Set(); + return items.filter((item) => { + if (seen.has(item.id)) return false; + seen.add(item.id); + return true; + }); + })(); + return (
- {data.ongoingBooks && data.ongoingBooks.length > 0 && ( + {continueReading.length > 0 && ( @@ -33,14 +45,6 @@ export function HomeContent({ data }: HomeContentProps) { /> )} - {data.onDeck && data.onDeck.length > 0 && ( - - )} - {data.latestSeries && data.latestSeries.length > 0 && ( { const homeOpts = { revalidate: CACHE_TTL_MED, tags: [HOME_CACHE_TAG] }; const [ongoingBooksResult, ongoingSeriesResult, booksPage, libraries] = await Promise.allSettled([ - this.client.fetch("books/ongoing", { limit: "10" }, homeOpts), + this.client.fetch("books/ongoing", { limit: "20" }, homeOpts), this.client.fetch("series/ongoing", { limit: "10" }, homeOpts), this.client.fetch("books", { limit: "10" }, homeOpts), this.client.fetch("libraries", undefined, { revalidate: CACHE_TTL_LONG, tags: [HOME_CACHE_TAG] }), ]); - const onDeck = ongoingBooksResult.status === "fulfilled" + // /books/ongoing returns both currently reading and next unread per series + const ongoingBooks = ongoingBooksResult.status === "fulfilled" ? ongoingBooksResult.value.map(StripstreamAdapter.toNormalizedBook) : []; @@ -213,10 +214,6 @@ export class StripstreamProvider implements IMediaProvider { ? ongoingSeriesResult.value.map(StripstreamAdapter.toNormalizedSeries) : []; - const ongoingBooks = booksPage.status === "fulfilled" - ? booksPage.value.items.filter((b) => b.reading_status === "reading").map(StripstreamAdapter.toNormalizedBook) - : []; - const recentlyRead = booksPage.status === "fulfilled" ? booksPage.value.items.map(StripstreamAdapter.toNormalizedBook) : []; @@ -241,9 +238,9 @@ export class StripstreamProvider implements IMediaProvider { return { ongoing: ongoingSeries, - ongoingBooks, + ongoingBooks: [], recentlyRead, - onDeck, + onDeck: ongoingBooks, latestSeries, }; }