import { Button, Spinner } from "@fluentui/react-components"; import React, { useEffect, useRef, useState } from "react"; enum State { Loading, Ready, Error, } export function AsyncWidget(p: { loadKey: any; load: () => Promise; errMsg: string; build: () => React.ReactElement; ready?: boolean; buildLoading?: () => React.ReactElement; buildError?: (e: string) => React.ReactElement; errAdditionalElement?: () => React.ReactElement; loadingMessage?: string; }): React.ReactElement { const [state, setState] = useState(State.Loading); const counter = useRef(null); const load = async () => { try { setState(State.Loading); await p.load(); setState(State.Ready); } catch (e) { console.error(e); setState(State.Error); } }; useEffect(() => { if (counter.current === p.loadKey) return; counter.current = p.loadKey; load(); }); if (state === State.Error) return ( p.buildError?.(p.errMsg) ?? (
{p.errMsg}
{p.errAdditionalElement && p.errAdditionalElement()}
) ); if (state === State.Loading || p.ready === false) return ( p.buildLoading?.() ?? ( ) ); return p.build(); }