import { InfiniteData } from '@tanstack/react-query'; export const addData = ( data: InfiniteData, collectionName: string, newData: TData, findIndex: (page: TCollection) => number, ) => { const dataJson = JSON.parse(JSON.stringify(data)) as InfiniteData; const { pageIndex, index } = findPage(data, findIndex); if (pageIndex !== -1 && index !== -1) { return updateData(data, collectionName, newData, findIndex); } dataJson.pages[0][collectionName].unshift({ ...newData, updatedAt: new Date().toISOString(), }); return dataJson; }; export function findPage(data: InfiniteData, findIndex: (page: TData) => number) { for (let pageIndex = 0; pageIndex < data.pages.length; pageIndex++) { const page = data.pages[pageIndex]; const index = findIndex(page); if (index !== -1) { return { pageIndex, index }; } } return { pageIndex: -1, index: -1 }; // Not found } export const updateData = ( data: InfiniteData, collectionName: string, updatedData: TData, findIndex: (page: TCollection) => number, ) => { const newData = JSON.parse(JSON.stringify(data)) as InfiniteData; const { pageIndex, index } = findPage(data, findIndex); if (pageIndex !== -1 && index !== -1) { // Remove the data from its current position newData.pages[pageIndex][collectionName].splice(index, 1); // Add the updated data to the top of the first page newData.pages[0][collectionName].unshift({ ...updatedData, updatedAt: new Date().toISOString(), }); } return newData; }; export const deleteData = ( data: TData, collectionName: string, findIndex: (page: TCollection) => number, ): TData => { const newData = JSON.parse(JSON.stringify(data)); const { pageIndex, index } = findPage(newData, findIndex); if (pageIndex !== -1 && index !== -1) { // Delete the data from its current page newData.pages[pageIndex][collectionName].splice(index, 1); } return newData; }; /** * Normalize the data so that the number of data on each page is within pageSize */ export const normalizeData = ( data: InfiniteData, collectionName: string, pageSize: number, ): InfiniteData => { const infiniteData = JSON.parse(JSON.stringify(data)) as InfiniteData; const pageCount = infiniteData.pages.length; if (pageCount === 0) { return infiniteData; } const pageParams = infiniteData.pageParams; // Combine all conversations of all pages into one array const collection = infiniteData.pages.flatMap((page) => page[collectionName]); if (collection.length === 0) { return infiniteData; } // Create the restructured pages const restructuredPages = Array.from({ length: pageCount }, (_, i) => ({ ...infiniteData.pages[i], [collectionName]: collection.slice(i * pageSize, (i + 1) * pageSize), })).filter((page) => page[collectionName].length > 0); // Remove empty pages return { pageParams: pageParams.slice(0, restructuredPages.length), pages: restructuredPages, }; };