{"version":3,"file":"useInfiniteAssets.mjs","sources":["../../../../../../admin/src/future/pages/Assets/hooks/useInfiniteAssets.ts"],"sourcesContent":["import { useState, useCallback, useMemo, useEffect, useRef } from 'react';\n\nimport { useGetAssetsQuery } from '../../../services/assets';\n\nimport type { File } from '../../../../../../shared/contracts/files';\n\nconst PAGE_SIZE = 20;\n\ninterface UseInfiniteAssetsOptions {\n  folder?: number | null;\n  sort?: string;\n}\n\nconst useInfiniteAssets = ({ folder = null, sort }: UseInfiniteAssetsOptions = {}) => {\n  const [page, setPage] = useState(1);\n  const lastResultsRef = useRef<File[]>([]);\n  const isMountRef = useRef(true);\n\n  const {\n    currentData: data,\n    isLoading,\n    isFetching,\n    error,\n  } = useGetAssetsQuery({\n    folder,\n    page,\n    pageSize: PAGE_SIZE,\n    sort,\n  });\n\n  const pagination = data?.pagination;\n\n  // Accumulate pages. When cache is invalidated the current page is refetched\n  // detect this and reset to avoid a gap in the results.\n  const assets = useMemo(() => {\n    if (!data) {\n      return lastResultsRef.current;\n    }\n\n    const currentPageResults = data.results;\n\n    if (page === 1) {\n      lastResultsRef.current = currentPageResults;\n    } else {\n      // If accumulated length doesn't match expectation, cache was cleared\n      const expectedPrior = (page - 1) * PAGE_SIZE;\n      if (lastResultsRef.current.length < expectedPrior - PAGE_SIZE) {\n        return lastResultsRef.current;\n      }\n\n      // Only append if these aren't already accumulated\n      if (lastResultsRef.current.length < page * PAGE_SIZE) {\n        lastResultsRef.current = [...lastResultsRef.current, ...currentPageResults];\n      }\n    }\n\n    return lastResultsRef.current;\n  }, [data, page]);\n\n  // Reset on filter/sort change — skip the initial mount since the memo\n  // already handles page 1 correctly\n  useEffect(() => {\n    if (isMountRef.current) {\n      isMountRef.current = false;\n\n      return;\n    }\n    setPage(1);\n    lastResultsRef.current = [];\n  }, [folder, sort]);\n\n  const hasNextPage = pagination ? page < pagination.pageCount : false;\n  const isFetchingMore = isFetching && page > 1;\n\n  const fetchNextPage = useCallback(() => {\n    setPage((prev) => prev + 1);\n  }, []);\n\n  return { assets, pagination, isLoading, isFetchingMore, hasNextPage, fetchNextPage, error };\n};\n\nexport { useInfiniteAssets };\nexport { PAGE_SIZE };\n"],"names":["PAGE_SIZE","useInfiniteAssets","folder","sort","page","setPage","useState","lastResultsRef","useRef","isMountRef","currentData","data","isLoading","isFetching","error","useGetAssetsQuery","pageSize","pagination","assets","useMemo","current","currentPageResults","results","expectedPrior","length","useEffect","hasNextPage","pageCount","isFetchingMore","fetchNextPage","useCallback","prev"],"mappings":";;;AAMA,MAAMA,SAAAA,GAAY;AAOlB,MAAMC,iBAAAA,GAAoB,CAAC,EAAEC,MAAAA,GAAS,IAAI,EAAEC,IAAI,EAA4B,GAAG,EAAE,GAAA;AAC/E,IAAA,MAAM,CAACC,IAAAA,EAAMC,OAAAA,CAAQ,GAAGC,QAAAA,CAAS,CAAA,CAAA;IACjC,MAAMC,cAAAA,GAAiBC,OAAe,EAAE,CAAA;AACxC,IAAA,MAAMC,aAAaD,MAAAA,CAAO,IAAA,CAAA;IAE1B,MAAM,EACJE,WAAAA,EAAaC,IAAI,EACjBC,SAAS,EACTC,UAAU,EACVC,KAAK,EACN,GAAGC,iBAAAA,CAAkB;AACpBb,QAAAA,MAAAA;AACAE,QAAAA,IAAAA;QACAY,QAAAA,EAAUhB,SAAAA;AACVG,QAAAA;AACF,KAAA,CAAA;AAEA,IAAA,MAAMc,aAAaN,IAAAA,EAAMM,UAAAA;;;AAIzB,IAAA,MAAMC,SAASC,OAAAA,CAAQ,IAAA;AACrB,QAAA,IAAI,CAACR,IAAAA,EAAM;AACT,YAAA,OAAOJ,eAAea,OAAO;AAC/B,QAAA;QAEA,MAAMC,kBAAAA,GAAqBV,KAAKW,OAAO;AAEvC,QAAA,IAAIlB,SAAS,CAAA,EAAG;AACdG,YAAAA,cAAAA,CAAea,OAAO,GAAGC,kBAAAA;QAC3B,CAAA,MAAO;;AAEL,YAAA,MAAME,aAAAA,GAAiBnB,CAAAA,IAAAA,GAAO,CAAA,IAAKJ,SAAAA;AACnC,YAAA,IAAIO,eAAea,OAAO,CAACI,MAAM,GAAGD,gBAAgBvB,SAAAA,EAAW;AAC7D,gBAAA,OAAOO,eAAea,OAAO;AAC/B,YAAA;;AAGA,YAAA,IAAIb,eAAea,OAAO,CAACI,MAAM,GAAGpB,OAAOJ,SAAAA,EAAW;AACpDO,gBAAAA,cAAAA,CAAea,OAAO,GAAG;AAAIb,oBAAAA,GAAAA,cAAAA,CAAea,OAAO;AAAKC,oBAAAA,GAAAA;AAAmB,iBAAA;AAC7E,YAAA;AACF,QAAA;AAEA,QAAA,OAAOd,eAAea,OAAO;IAC/B,CAAA,EAAG;AAACT,QAAAA,IAAAA;AAAMP,QAAAA;AAAK,KAAA,CAAA;;;IAIfqB,SAAAA,CAAU,IAAA;QACR,IAAIhB,UAAAA,CAAWW,OAAO,EAAE;AACtBX,YAAAA,UAAAA,CAAWW,OAAO,GAAG,KAAA;AAErB,YAAA;AACF,QAAA;QACAf,OAAAA,CAAQ,CAAA,CAAA;QACRE,cAAAA,CAAea,OAAO,GAAG,EAAE;IAC7B,CAAA,EAAG;AAAClB,QAAAA,MAAAA;AAAQC,QAAAA;AAAK,KAAA,CAAA;AAEjB,IAAA,MAAMuB,WAAAA,GAAcT,UAAAA,GAAab,IAAAA,GAAOa,UAAAA,CAAWU,SAAS,GAAG,KAAA;IAC/D,MAAMC,cAAAA,GAAiBf,cAAcT,IAAAA,GAAO,CAAA;AAE5C,IAAA,MAAMyB,gBAAgBC,WAAAA,CAAY,IAAA;QAChCzB,OAAAA,CAAQ,CAAC0B,OAASA,IAAAA,GAAO,CAAA,CAAA;AAC3B,IAAA,CAAA,EAAG,EAAE,CAAA;IAEL,OAAO;AAAEb,QAAAA,MAAAA;AAAQD,QAAAA,UAAAA;AAAYL,QAAAA,SAAAA;AAAWgB,QAAAA,cAAAA;AAAgBF,QAAAA,WAAAA;AAAaG,QAAAA,aAAAA;AAAef,QAAAA;AAAM,KAAA;AAC5F;;;;"}