src/features/inbox/pagination.ts
Linked repository file from this build.
export interface InboxPages {
newPage: number;
touchedPage: number;
eventsPage: number;
queuePage: number;
}
export interface InboxTotals {
newReviews: number;
lastTouched: number;
events: number;
awaitingReview: number;
}
/** Live queues can shrink between requests; keep every list on a reachable page. */
export function clampInboxPages(
pages: InboxPages,
totals: InboxTotals,
pageSize: number,
): InboxPages {
const clamp = (page: number, total: number) =>
Math.min(page, Math.max(0, Math.ceil(total / pageSize) - 1));
const next = {
newPage: clamp(pages.newPage, totals.newReviews),
touchedPage: clamp(pages.touchedPage, totals.lastTouched),
eventsPage: clamp(pages.eventsPage, totals.events),
queuePage: clamp(pages.queuePage, totals.awaitingReview),
};
return (Object.keys(pages) as (keyof InboxPages)[]).every((key) => pages[key] === next[key])
? pages
: next;
}