import React, { useEffect, useState } from "react"; import { Spinner } from "@patternfly/react-core"; type DataLoaderProps = { loader: () => Promise; deps?: any[]; children: ((arg: Result) => any) | React.ReactNode; }; type Result = { data: T; refresh: () => void; }; export function DataLoader(props: DataLoaderProps) { const [data, setData] = useState<{ result: T } | undefined>(undefined); const loadData = async () => { const result = await props.loader(); setData({ result }); }; useEffect(() => { setData(undefined); loadData(); }, [props]); if (data) { if (props.children instanceof Function) { return props.children({ data: data.result, refresh: () => loadData(), }); } return props.children; } return (
); }