"use client"; import * as React from "react"; import { ContentCard } from "@/components/content-card"; import { ContentService } from "@/services/content.service"; import type { Content, PaginatedResponse } from "@/types/content"; import { Spinner } from "@/components/ui/spinner"; import { useInfiniteScroll } from "@/app/(dashboard)/_hooks/use-infinite-scroll"; interface ContentListProps { fetchFn: (params: { limit: number; offset: number }) => Promise>; title?: string; } export function ContentList({ fetchFn, title }: ContentListProps) { const [contents, setContents] = React.useState([]); const [loading, setLoading] = React.useState(true); const [offset, setOffset] = React.useState(0); const [hasMore, setHasMore] = React.useState(true); const loadMore = React.useCallback(async () => { if (!hasMore || loading) return; setLoading(true); try { const response = await fetchFn({ limit: 10, offset: offset + 10, }); setContents(prev => [...prev, ...response.data]); setOffset(prev => prev + 10); setHasMore(response.data.length === 10); } catch (error) { console.error("Failed to load more contents:", error); } finally { setLoading(false); } }, [offset, hasMore, loading, fetchFn]); const { loaderRef } = useInfiniteScroll({ hasMore, loading, onLoadMore: loadMore, }); React.useEffect(() => { const fetchInitial = async () => { setLoading(true); try { const response = await fetchFn({ limit: 10, offset: 0, }); setContents(response.data); setHasMore(response.data.length === 10); } catch (error) { console.error("Failed to fetch contents:", error); } finally { setLoading(false); } }; fetchInitial(); }, [fetchFn]); return (
{title &&

{title}

}
{contents.map((content) => ( ))}
{loading && } {!hasMore && contents.length > 0 && (

Vous avez atteint la fin ! 🐐

)} {!loading && contents.length === 0 && (

Aucun mème trouvé ici... pour l'instant !

)}
); }