2026-10-07 12:49:10 +03:00

26 lines
663 B
TypeScript

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<T>(fetcher: () => Promise<T[]>) {
const [rows, setRows] = useState<T[]>([]);
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 };
}