Compare commits

...

2 Commits

Author SHA1 Message Date
discollizard
a13ac6a0db added resources exhausted check to timeout 2024-06-24 00:29:22 -03:00
discollizard
68205a9aac basic infinite scroll added to catalogue page 2024-06-24 00:25:27 -03:00

View File

@@ -21,10 +21,13 @@ export function Catalogue() {
const [searchResults, setSearchResults] = useState<CatalogueEntry[]>([]); const [searchResults, setSearchResults] = useState<CatalogueEntry[]>([]);
const [isLoading, setIsLoading] = useState(false); const [isLoading, setIsLoading] = useState(false);
const [isLoadingInfScroll, setIsLoadingInfScroll] = useState(false);
const [resultsExhausted, setResultsExhausted] = useState(false);
const contentRef = useRef<HTMLElement>(null); const contentRef = useRef<HTMLElement>(null);
const cursorRef = useRef<number>(0); const cursorRef = useRef<number>(0);
const cursorInfScrollRef = useRef<number>(cursorRef.current + 24);
const navigate = useNavigate(); const navigate = useNavigate();
@@ -62,9 +65,44 @@ export function Catalogue() {
cursor: cursorRef.current.toString(), cursor: cursorRef.current.toString(),
}); });
resetInfiniteScroll();
navigate(`/catalogue?${params.toString()}`); navigate(`/catalogue?${params.toString()}`);
}; };
const resetInfiniteScroll = () => {
cursorInfScrollRef.current = cursorRef.current + 24;
setResultsExhausted(false);
};
const infiniteLoading = () => {
if (resultsExhausted || !contentRef.current) return;
const isAtBottom =
contentRef.current.offsetHeight + contentRef.current.scrollTop ==
contentRef.current.scrollHeight;
if (isAtBottom) {
setIsLoadingInfScroll(true);
window.electron
.getGames(24, cursorInfScrollRef.current)
.then(({ results, cursor }) => {
return new Promise((resolve) => {
setTimeout(() => {
if (results.length == 0) {
setResultsExhausted(true);
}
cursorInfScrollRef.current += cursor;
setSearchResults([...searchResults, ...results]);
resolve(null);
}, 500);
});
})
.finally(() => {
setIsLoadingInfScroll(false);
});
}
};
return ( return (
<SkeletonTheme baseColor={vars.color.background} highlightColor="#444"> <SkeletonTheme baseColor={vars.color.background} highlightColor="#444">
<section <section
@@ -78,7 +116,10 @@ export function Catalogue() {
}} }}
> >
<Button <Button
onClick={() => navigate(-1)} onClick={() => {
resetInfiniteScroll();
navigate(-1);
}}
theme="outline" theme="outline"
disabled={cursor === 0 || isLoading} disabled={cursor === 0 || isLoading}
> >
@@ -92,7 +133,11 @@ export function Catalogue() {
</Button> </Button>
</section> </section>
<section ref={contentRef} className={styles.content}> <section
ref={contentRef}
className={styles.content}
onScroll={infiniteLoading}
>
<section className={styles.cards}> <section className={styles.cards}>
{isLoading && {isLoading &&
Array.from({ length: 12 }).map((_, index) => ( Array.from({ length: 12 }).map((_, index) => (
@@ -110,6 +155,11 @@ export function Catalogue() {
))} ))}
</> </>
)} )}
{isLoadingInfScroll &&
Array.from({ length: 12 }).map((_, index) => (
<Skeleton key={index} className={styles.cardSkeleton} />
))}
</section> </section>
</section> </section>
</SkeletonTheme> </SkeletonTheme>