32 lines
1.1 KiB
TypeScript
32 lines
1.1 KiB
TypeScript
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}`;
|
|
};
|