Use union type for openidloader state

Co-authored-by: Daniel Abramov <inetcrack2@gmail.com>
This commit is contained in:
David Baker
2023-07-04 15:44:55 +01:00
committed by GitHub
parent 6ca5b46df7
commit fc7a7b1799

View File

@@ -47,8 +47,9 @@ export function OpenIDLoader({
roomName, roomName,
children, children,
}: Props) { }: Props) {
const [sfuConfig, setSFUConfig] = useState<SFUConfig>(); const [state, setState] = useState<
const [error, setError] = useState<Error>(); SFUConfigLoading | SFUConfigLoaded | SFUConfigFailed
>({ kind: "loading" });
useEffect(() => { useEffect(() => {
(async () => { (async () => {
@@ -58,23 +59,38 @@ export function OpenIDLoader({
livekitServiceURL, livekitServiceURL,
roomName roomName
); );
setSFUConfig(result); setState({ kind: "loaded", sfuConfig: result });
} catch (e) { } catch (e) {
logger.error("Failed to fetch SFU config: ", e); logger.error("Failed to fetch SFU config: ", e);
setError(new Error("Failed to fetch SFU config")); setState({ kind: "failed", error: e });
} }
})(); })();
}, [client, livekitServiceURL, roomName]); }, [client, livekitServiceURL, roomName]);
if (error) { switch (state.kind) {
return <ErrorView error={error} />; case "loading":
} else if (sfuConfig) { return <LoadingView />;
return ( case "failed":
<SFUConfigContext.Provider value={sfuConfig}> return <ErrorView error={state.error} />;
{children} case "loaded":
</SFUConfigContext.Provider> return (
); <SFUConfigContext.Provider value={state.sfuConfig}>
} else { {children}
return <LoadingView />; </SFUConfigContext.Provider>
);
} }
} }
type SFUConfigLoading = {
kind: "loading";
};
type SFUConfigLoaded = {
kind: "loaded";
sfuConfig: SFUConfig;
};
type SFUConfigFailed = {
kind: "failed";
error: Error;
};