import * as React from 'react'; import { useRef, useCallback, useEffect } from 'react'; import { List, ListItem, ListItemText, ListItemIcon, Button, Typography, } from '@mui/material'; import { useInfiniteGetList } from '..'; import { CoreAdminContext } from '../core'; import { countries } from '../storybook/data'; export default { title: 'ra-core/dataProvider/useInfiniteGetList' }; export const Basic = props => { let { dataProvider, ...rest } = props; if (!dataProvider) { dataProvider = { getList: (resource, params) => { return new Promise(resolve => { setTimeout( () => resolve({ data: countries.slice( (params.pagination.page - 1) * params.pagination.perPage, (params.pagination.page - 1) * params.pagination.perPage + params.pagination.perPage ), total: countries.length, }), 300 ); }); }, } as any; } return ( ); }; const UseInfiniteComponent = ({ resource = 'countries', pagination = { page: 1, perPage: 20 }, sort = { field: 'id', order: 'DESC' }, filter = {}, options = {}, meta = undefined, ...rest }) => { const { data, fetchNextPage, hasNextPage, isFetchingNextPage, } = useInfiniteGetList( resource, { pagination, sort, filter, meta }, options ); return (
{data?.pages.map(page => { return page.data.map(country => ( {country.emoji} {country.name} -- {country.code} )); })}
{hasNextPage && ( )}
); }; export const PageInfo = props => { let { dataProvider, ...rest } = props; if (!dataProvider) { dataProvider = { getList: (resource, params) => { return new Promise(resolve => { setTimeout( () => resolve({ data: countries.slice( (params.pagination.page - 1) * params.pagination.perPage, (params.pagination.page - 1) * params.pagination.perPage + params.pagination.perPage ), // no total here pageInfo: { hasNextPage: countries.length > params.pagination.page * params.pagination.perPage, hasPreviousPage: params.pagination.page > 1, }, }), 300 ); }); }, } as any; } return ( ); }; export const InfiniteScroll = () => { const dataProvider = { getList: (resource, params) => { return new Promise(resolve => { setTimeout( () => resolve({ data: countries.slice( (params.pagination.page - 1) * params.pagination.perPage, (params.pagination.page - 1) * params.pagination.perPage + params.pagination.perPage ), total: countries.length, }), 300 ); }); }, } as any; return ( ); }; const UseInfiniteComponentWithIntersectionObserver = () => { const { data, fetchNextPage, hasNextPage, isFetchingNextPage, } = useInfiniteGetList('countries', { pagination: { page: 1, perPage: 20 }, sort: { field: 'id', order: 'DESC' }, }); const observerElem = useRef(null); const handleObserver = useCallback( entries => { const [target] = entries; if (target.isIntersecting && hasNextPage) { fetchNextPage(); } }, [fetchNextPage, hasNextPage] ); useEffect(() => { const element = observerElem.current; if (!element) return; const option = { threshold: 0 }; const observer = new IntersectionObserver(handleObserver, option); observer.observe(element); return () => observer.unobserve(element); }, [fetchNextPage, hasNextPage, handleObserver]); return (
{data?.pages.map(page => { return page.data.map(country => ( {country.emoji} {country.name} -- {country.code} )); })} {isFetchingNextPage && hasNextPage ? 'Loading...' : 'End of list'}
); };