| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- import {useInfiniteQuery, useQueryClient} from '@tanstack/react-query';
- import {useReady} from '@tarojs/taro';
- import {useState, useRef, useLayoutEffect} from 'react';
- export function useInfiniteFetch({key, fn, limit: propsLimit, params}) {
- const [enabled, setEnabled] = useState(false);
- const page = useRef(1);
- const limit = propsLimit ?? '10';
- useLayoutEffect(
- function () {
- page.current = 1;
- },
- // eslint-disable-next-line react-hooks/exhaustive-deps
- key,
- );
- const {
- data,
- fetchNextPage,
- isFetching,
- isFetchingNextPage,
- hasNextPage,
- refetch,
- } = useInfiniteQuery(
- key,
- async function () {
- const result = await fn({page: page.current, limit, ...params});
- result.code === '200' && result.data.list.length > 0 && page.current++;
- return result;
- },
- {
- enabled,
- cacheTime: 0,
- select(data) {
- const list = data.pages
- .map(function (val) {
- return val.data.list;
- })
- .filter(val => val.length > 0);
- return {pageParams: data.pageParams, pages: list.flat(2)};
- },
- getNextPageParam(last) {
- if (!last) return false;
- return last.data.hasNextPage;
- },
- },
- );
- useReady(function () {
- setTimeout(() => setEnabled(true), 50);
- });
- const isEmpty =
- page.current === 1 && !data?.pages.length && !isFetching && !hasNextPage;
- const queryClient = useQueryClient();
- function refresh() {
- if (isFetching) return;
- page.current = 1;
- refetch({refetchPage: (_, index) => index === 0}).then(function () {
- queryClient.setQueriesData(key, function (data) {
- const firstData = data?.pages[0];
- return {
- pageParams: data.pageParams,
- pages: [firstData],
- };
- });
- });
- }
- return [
- {data, isFetching, isFetchingNextPage, hasNextPage, isEmpty},
- {fetchNextPage, refresh},
- ];
- }
|