InfiniteScroll.tsx 1.7 Ko
Télécharger le fichier
import { useVirtualizer } from '@tanstack/react-virtual';
import { FC, ReactElement, useRef, useState } from 'react';
import { Base } from './Base';
interface InfiniteScrollProps<T = any> {
rows: T[];
overscan?: number;
scrollToBottom?: boolean;
rowRender: (row: T) => ReactElement;
}
export const InfiniteScroll: FC<InfiniteScrollProps> = (props) => {
const { rows = [], overscan = 5, scrollToBottom = false, rowRender = null } = props;
const [scrollIndex, setScrollIndex] = useState<number>(rows.length - 1);
const parentRef = useRef<HTMLDivElement>(null);
const virtualizer = useVirtualizer({
count: rows.length,
overscan,
getScrollElement: () => parentRef.current,
estimateSize: () => 45
});
const items = virtualizer.getVirtualItems();
return (
<Base fit innerRef={parentRef} overflow="auto" position="relative">
<div
style={{
height: virtualizer.getTotalSize(),
width: '100%',
position: 'relative'
}}
>
<div
style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
transform: `translateY(${items[0]?.start ?? 0}px)`
}}
>
{items.map((virtualRow) => (
<div key={virtualRow.key} ref={virtualizer.measureElement} data-index={virtualRow.index}>
{rowRender(rows[virtualRow.index])}
</div>
))}
</div>
</div>
</Base>
);
};
