import { useStableCallback } from "use-common-hook"; import { DataForSync, GetData, UseUploaderData } from "../../hookTypes"; import { transformToLoaded } from "../../internalUtils"; import { pipe, prop, uniqueForFirstSet, valuesOfSetEquals } from "../../utils"; export const useSync = ({ getData, setData, }: Omit, "data">) => { type Data = GetData; const enrichInternal = useStableCallback((dataForEnrich: Data) => { const files = getData(); const extractId = prop("id"); const [fileIds, enrichFileIds] = [ new Set(files.map(extractId)), new Set(dataForEnrich.map(extractId)), ]; if (valuesOfSetEquals(fileIds, enrichFileIds)) return; const idsWithNewInfo = uniqueForFirstSet(enrichFileIds, fileIds); const newData: Data = dataForEnrich.filter( pipe(extractId, (itemId) => idsWithNewInfo.has(itemId)) ); setData((currentFiles) => [...currentFiles, ...newData]); }); const enrich = useStableCallback((filesForEnrich: DataForSync[]) => enrichInternal(transformToLoaded(filesForEnrich)) ); const sync = useStableCallback((filesForSync: DataForSync[]) => { setData((currentData) => { currentData.forEach( (item) => item.status === "loading" && item.discard() ); return transformToLoaded(filesForSync); }); }); return { enrichInternal, enrich, sync } as const; };