Skip to article
Documentation

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;
}