> = [
{
label: 'Column 1',
name: 'content1',
tooltip: 'Some content for the tooltip',
render: (row) => row.content1,
sortable: true,
sorted: 'descend',
},
{
label: 'Column 2',
name: 'content2',
tooltip: (
<>
Some richer content for the tooltip with a{' '}
link
>
),
render: (row) => row.content2,
},
{
label: 'Column 3',
name: 'content3',
tooltip: (
<>
Some richer content for the tooltip with a{' '}
link
>
),
render: (row) => row.content3,
sortable: true,
},
{
label: 'Column 4',
name: 'content4',
render: (row) => row.content4,
width: '30vw',
sortable: true,
},
{
label: ,
name: 'content5',
render: (row) => row.content5,
},
];
const generateData = (numberElements: number) =>
getLipsumObjectArray({
keys: columns.map((column) => column.name),
numberElements,
});
type Args = {
children: (props: P) => ReactNode;
} & Except, 'children'>;
export const DataLoaderDecorator = ({
children,
...props
}: Args>) => {
let loadingData = false;
const numberDataPointsPerRequest = 6;
const sleepDuration = 0.75;
const numberInitialDataPoints = 1;
const [data, setData] = useState(
numberInitialDataPoints > 0 ? generateData(numberInitialDataPoints) : []
);
function onLoadMoreItems() {
if (loadingData) {
return null;
}
loadingData = true;
const numberDataPoints = Math.min(
numberDataPointsPerRequest,
totalNumberDataPoints - data.length
);
const moreData = generateData(numberDataPoints);
return setTimeout(() => {
loadingData = false;
setData([...data, ...moreData]);
}, sleepDuration * 1000);
}
const hasMoreData = data.length < totalNumberDataPoints;
return (
{children({
data,
getIdKey,
columns,
hasMoreData,
onLoadMoreItems,
})}
);
};
export const DataDecorator = ({ children, ...props }: Args) => (
{children({
data: generateData(totalNumberDataPoints),
getIdKey,
columns,
})}
);