prometheus/web/ui/react-app/src/components/CustomInfiniteScroll.tsx
Łukasz Mierzwa 4e3b6fc043
Upgrade create-react-app to v5 (#10396)
* Upgrade create-react-app to v5

Some other dependencies needs to be upgraded as well, plus some typescript errors fixed.

Signed-off-by: Łukasz Mierzwa <l.mierzwa@gmail.com>

* Use ESM imports for codemirror-promql

Signed-off-by: Łukasz Mierzwa <l.mierzwa@gmail.com>

* Update FontAwesome to v6

Signed-off-by: Łukasz Mierzwa <l.mierzwa@gmail.com>
2022-03-05 20:45:55 +01:00

51 lines
1.5 KiB
TypeScript

import { ComponentType, useEffect, useState } from 'react';
import InfiniteScroll from 'react-infinite-scroll-component';
const initialNumberOfItemsDisplayed = 50;
export interface InfiniteScrollItemsProps<T> {
items: T[];
}
interface CustomInfiniteScrollProps<T> {
allItems: T[];
child: ComponentType<InfiniteScrollItemsProps<T>>;
}
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
const CustomInfiniteScroll = <T,>({ allItems, child }: CustomInfiniteScrollProps<T>) => {
const [items, setItems] = useState<T[]>(allItems.slice(0, 50));
const [index, setIndex] = useState<number>(initialNumberOfItemsDisplayed);
const [hasMore, setHasMore] = useState<boolean>(allItems.length > initialNumberOfItemsDisplayed);
const Child = child;
useEffect(() => {
setItems(allItems.slice(0, initialNumberOfItemsDisplayed));
setHasMore(allItems.length > initialNumberOfItemsDisplayed);
}, [allItems]);
const fetchMoreData = () => {
if (items.length === allItems.length) {
setHasMore(false);
} else {
const newIndex = index + initialNumberOfItemsDisplayed;
setIndex(newIndex);
setItems(allItems.slice(0, newIndex));
}
};
return (
<InfiniteScroll
next={fetchMoreData}
hasMore={hasMore}
loader={<h4>loading...</h4>}
dataLength={items.length}
height={items.length > 25 ? '75vh' : ''}
>
<Child items={items} />
</InfiniteScroll>
);
};
export default CustomInfiniteScroll;