export type PageWindow = { start: number; end: number; page: number; pages: number; previousOffset: number | null; nextOffset: number | null; }; export const pageWindow = (total: number, limit: number, offset: number): PageWindow => { const safeTotal = Math.max(0, Math.trunc(total)); const safeLimit = Math.max(1, Math.trunc(limit)); const safeOffset = Math.max(0, Math.trunc(offset)); const end = Math.min(safeOffset + safeLimit, safeTotal); return { start: safeTotal > 0 && safeOffset < safeTotal ? safeOffset + 1 : 0, end, page: Math.floor(safeOffset / safeLimit) + 1, pages: Math.max(1, Math.ceil(safeTotal / safeLimit)), previousOffset: safeOffset > 0 ? Math.max(0, safeOffset - safeLimit) : null, nextOffset: end < safeTotal ? safeOffset + safeLimit : null, }; }; export const pageHref = (path: string, search: URLSearchParams, offset: number, anchor = "") => { const params = new URLSearchParams(search); if (offset > 0) params.set("offset", String(offset)); else params.delete("offset"); const query = params.toString(); return `${path}${query ? `?${query}` : ""}${anchor}`; };