2023-01-22 11:17:50 +00:00
|
|
|
import { useEffect, useState } from "react";
|
2023-02-08 21:10:26 +00:00
|
|
|
import { FormattedMessage } from "react-intl";
|
2023-01-17 17:13:22 +00:00
|
|
|
import { useInView } from "react-intersection-observer";
|
|
|
|
|
2023-02-08 21:10:26 +00:00
|
|
|
import messages from "./messages";
|
|
|
|
|
2023-02-07 20:04:50 +00:00
|
|
|
export default function LoadMore({
|
|
|
|
onLoadMore,
|
|
|
|
shouldLoadMore,
|
|
|
|
children,
|
|
|
|
}: {
|
|
|
|
onLoadMore: () => void;
|
|
|
|
shouldLoadMore: boolean;
|
|
|
|
children?: React.ReactNode;
|
|
|
|
}) {
|
|
|
|
const { ref, inView } = useInView();
|
|
|
|
const [tick, setTick] = useState<number>(0);
|
2023-01-17 17:13:22 +00:00
|
|
|
|
2023-02-07 20:04:50 +00:00
|
|
|
useEffect(() => {
|
|
|
|
if (inView === true && shouldLoadMore === true) {
|
|
|
|
onLoadMore();
|
|
|
|
}
|
|
|
|
}, [inView, shouldLoadMore, tick]);
|
2023-01-22 11:17:50 +00:00
|
|
|
|
2023-02-07 20:04:50 +00:00
|
|
|
useEffect(() => {
|
2023-02-07 19:47:57 +00:00
|
|
|
const t = setInterval(() => {
|
2023-02-09 12:26:54 +00:00
|
|
|
setTick(x => (x += 1));
|
2023-02-07 20:04:50 +00:00
|
|
|
}, 500);
|
|
|
|
return () => clearInterval(t);
|
|
|
|
}, []);
|
2023-01-22 11:17:50 +00:00
|
|
|
|
2023-02-07 20:04:50 +00:00
|
|
|
return (
|
|
|
|
<div ref={ref} className="mb10">
|
2023-02-08 21:10:26 +00:00
|
|
|
{children ?? <FormattedMessage {...messages.Loading} />}
|
2023-02-07 20:04:50 +00:00
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|