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'}
);
};