26 lines
663 B
TypeScript
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 };
|
|
}
|