import type { FieldPolicy, Reference } from '@apollo/client'; type KeyArgs = FieldPolicy['keyArgs']; export type TEdge = | { node: TNode; } | Reference; export type TPageInfo = { currentPage: number; totalPages: number; }; export type TExisting = Readonly<{ edges: TEdge[]; pageInfo: TPageInfo; }>; export type TIncoming = { edges: TEdge[]; pageInfo: TPageInfo; }; export type CustomFieldPolicy = FieldPolicy< TExisting | null, TIncoming | null, TIncoming | null >; const makeEmptyData = (): TExisting => { return { edges: [], pageInfo: { currentPage: 1, totalPages: 1, }, }; }; function offsetLimitPagination( keyArgs: KeyArgs = false ): CustomFieldPolicy { return { keyArgs, merge(existing, incoming, { args }) { if (!existing) { existing = makeEmptyData(); } if (!incoming || incoming === null) return existing; const existingEdges = existing?.edges || []; const incomingEdges = incoming.edges || []; if (args) { const newEdges = [...existingEdges, ...incomingEdges]; return { pageInfo: incoming.pageInfo, edges: newEdges, }; } else { return existing; } }, }; } export default offsetLimitPagination;