import type { KPIToken, ResolvedKPIToken } from "@carrot-kpi/sdk"; import React, { useCallback, useEffect, useState } from "react"; import { useSearchParams } from "react-router-dom"; import { KPITokenCard } from "../../components/ui/kpi-token-card"; import { Empty } from "../../components/ui/empty"; import { Pagination } from "../../components/pagination"; import { usePagination } from "@carrot-kpi/react"; import { useTranslation } from "react-i18next"; const placeholder = new Array(8) .fill(null) .map((_, index) => ); interface GridProps { loading?: boolean; items: (KPIToken | ResolvedKPIToken)[]; } export const Grid = ({ loading, items }: GridProps) => { const { t } = useTranslation(); const [searchParams, setSearchParams] = useSearchParams(); const [page, setPage] = useState(1); const [itemsPerPage, setItemsPerPage] = useState(4); useEffect(() => { const pageFromSearch = searchParams.get("page"); if (!pageFromSearch) return; const parsedPage = parseInt(pageFromSearch); setPage(!isNaN(parsedPage) ? parsedPage : 1); }, [searchParams]); useEffect(() => { const resizeObserver = new ResizeObserver((entries) => { const { width } = entries[0].contentRect; if (width < 768) setItemsPerPage(4); if (width < 1024) setItemsPerPage(6); else if (width < 1280) setItemsPerPage(9); else setItemsPerPage(12); }); resizeObserver.observe(document.body); return () => { resizeObserver.unobserve(document.body); }; }); const { data: paginatedItems, totalPages } = usePagination({ data: items, page, size: itemsPerPage, }); const handlePageChange = useCallback( (page: number) => { setSearchParams((prev) => { prev.set("page", page.toString()); return prev; }); const bodyElement = window.document.getElementById("__campaigns_page"); if (!bodyElement) return; bodyElement.scrollIntoView(); }, [setSearchParams], ); return (
{!loading && paginatedItems.length === 0 ? ( ) : (
{loading ? placeholder : paginatedItems.map( (kpiToken: KPIToken | ResolvedKPIToken) => { return ( ); }, )}
)}
); };