From 86b7382a048c3db7fe1a0f0f96e99d41ad70fd45 Mon Sep 17 00:00:00 2001 From: Froidefond Julien Date: Sun, 15 Mar 2026 16:39:33 +0100 Subject: [PATCH] refactor: merge onDeck and ongoingBooks into single "continue reading" carousel Uses /books/ongoing as single source for Stripstream, displayed with featured header style. Removes separate "up next" section. Co-Authored-By: Claude Opus 4.6 --- src/components/home/HomeContent.tsx | 24 +++++++++++-------- .../stripstream/stripstream.provider.ts | 13 ++++------ 2 files changed, 19 insertions(+), 18 deletions(-) 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, }; }