import { InfiniteData } from '@tanstack/react-query' import { ApiCollection, MessageResource } from '../../types' import { RequestData } from '../client' export type MessagesWindow = InfiniteData< ApiCollection, Partial | undefined > export const livePageParam: Partial = {} export const anchoredPageParam = (anchor: string): Partial => ({ where: { id_around: anchor }, }) export function isBehindLiveEdge(data: MessagesWindow | undefined): boolean { return !!data?.pages[0]?.meta?.prev } export function newerPageParam( firstPage: ApiCollection ): Partial | undefined { const newestId = firstPage.meta?.prev?.idGt if (!newestId) return undefined // Without asc the server hands back the newest page instead, leaving a gap. return { where: { id_gt: newestId }, order: 'asc' } } // The server returns newer pages oldest first, linking only to the next newer page. // Storing them newest first with an older link lets a refetch replay the window // forward from its top page like any other. export function newestFirst>( page: Page, pageParam: Partial | undefined ): Page { if (pageParam?.order !== 'asc') return page const data = [...page.data].reverse() const oldest = data[data.length - 1] return { ...page, data, meta: { ...page.meta, prev: page.meta?.next, next: oldest && { idLt: oldest.id } }, } } export function markLiveIfCaughtUp(data: MessagesWindow | undefined): MessagesWindow | undefined { if (!data) return data const topIsLive = !data.pageParams[0]?.where if (topIsLive || isBehindLiveEdge(data)) return data return { ...data, pageParams: [livePageParam, ...data.pageParams.slice(1)] } }