import { useEffect, useState } from "react"; // Fetches once per fetcher identity. Wrap per-widget fetchers in useCallback // so visibility/search/filter state changes never trigger a refetch. export function useTableData(fetcher: () => Promise) { const [rows, setRows] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { let alive = true; setLoading(true); fetcher() .then((data) => { if (alive) setRows(data); }) .finally(() => { if (alive) setLoading(false); }); return () => { alive = false; }; }, [fetcher]); return { rows, loading }; }