/* * Kyoo - A portable and vast media library solution. * Copyright (c) Kyoo. * * See AUTHORS.md and LICENSE file in the project root for full license information. * * Kyoo is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * Kyoo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Kyoo. If not, see . */ import { Page, QueryIdentifier, useInfiniteFetch } from "@kyoo/models"; import { ReactElement } from "react"; import InfiniteScroll from "react-infinite-scroll-component"; import { useYoshiki } from "yoshiki"; import { ErrorView, WithLoading } from "./fetch"; export const InfiniteFetch = ({ query, placeholderCount = 15, children, ...props }: { query: QueryIdentifier; placeholderCount?: number; children: ( item: Data extends Page ? WithLoading : WithLoading, key: string | undefined, i: number, ) => ReactElement | null; }): JSX.Element | null => { if (!query.infinite) console.warn("A non infinite query was passed to an InfiniteFetch."); const { items, error, fetchNextPage, hasNextPage } = useInfiniteFetch(query); const { css } = useYoshiki(); if (error) return ; return ( children({ isLoading: true } as any, i.toString(), i))} {...css( { display: "flex", flexWrap: "wrap", alignItems: "flex-start", justifyContent: "center", }, props, )} > {items?.map((item, i) => children({ ...item, isLoading: false } as any, (item as any).id?.toString(), i), )} ); };