// @flow /** * Infinite-scroll and batch-resolving handling for `claimList` instances. * * By default, the list is "locked" during initial mount to have a stable * pagination, but can be disabled through the `disableListLock` parameter. */ import React from 'react'; export default function useClaimListInfiniteScroll( allUris: Array, doResolveUris: (uris: Array, returnCachedClaims: boolean, resolveReposts: boolean) => void, pageSize: number = 30, disableListLock: boolean = false ) { // Lock the full set of uris on mount, so we have a stable list for pagination. const [uris, setUris] = React.useState([]); // Infinite-scroll handling. 'page' is 0-indexed. const [page, setPage] = React.useState(-1); const lastPage = Math.max(0, Math.ceil(allUris.length / pageSize) - 1); const [isLoadingPage, setIsLoadingPage] = React.useState(true); async function resolveUris(uris) { return doResolveUris(uris, true, false); } async function resolveNextPage(uris, currPage, pageSize) { const nextPage = currPage + 1; const nextUriBatch = uris.slice(nextPage * pageSize, (nextPage + 1) * pageSize); return resolveUris(nextUriBatch); } function bumpPage() { if (page < lastPage) { setIsLoadingPage(true); resolveNextPage(uris, page, pageSize).finally(() => { setIsLoadingPage(false); setPage(page + 1); }); } } // -- Initial mount: lock list and resolve first batch: React.useEffect(() => { setUris(allUris); resolveNextPage(allUris, -1, pageSize).finally(() => { setIsLoadingPage(false); setPage(0); }); }, []); // -- Optional: remove the locking behavior for whatever reason: React.useEffect(() => { if (disableListLock) { setUris(allUris); } }, [allUris]); return { uris, page, isLoadingPage, bumpPage }; }