Files
Mangalord/frontend/src/lib/chapterProgress.ts
MechaCat02 3824eaafb2 fix(history): count distinct new chapter numbers, authoritative on detail
new_chapters_count over-counted when scanlations share a chapter number
((manga_id, number) is non-unique, migration 0013): COUNT(*) tallied rows,
so duplicate-numbered chapters inflated the badge. Switch both the list and
per-manga read-progress queries to COUNT(DISTINCT number), and drop the dead
COALESCE (an empty set counts as 0, and the NULL-number case is handled by
the predicate). Fix the misleading comment.

Expose new_chapters_count on GET /me/read-progress/:manga_id and drive the
detail page's "N new" badge from it, instead of recomputing over the
paginated chapter list — which under-counted series past 50 chapters and
disagreed with the homepage shelf. Read markers stay client-side over the
loaded chapters and are documented as by-number (all we persist).

Adds duplicate-scanlation tests at both endpoints.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 21:48:36 +02:00

18 lines
841 B
TypeScript

// Pure helper for reflecting a reader's personal progress on a manga's
// chapter list. Kept UI-free so the read/unread logic is unit-testable
// without rendering the detail page.
/**
* A chapter counts as read once its number is at or before the reader's
* last-read chapter number. An unknown last-read position (guest, never
* opened, or a deleted chapter) marks nothing — we never guess.
*/
export function isChapterRead(chapterNumber: number, lastReadNumber: number | null): boolean {
return lastReadNumber != null && chapterNumber <= lastReadNumber;
}
// Note: the "new since last read" *count* is computed server-side
// (distinct chapter numbers over ALL chapters — see
// repo::read_progress) and delivered on the read-progress payloads, so it
// isn't recomputed here over the detail page's paginated chapter list.