Merge pull request #1294 from robintown/client-loading

Restore the client 'loading' state
This commit is contained in:
Robin
2023-07-24 10:46:39 -04:00
committed by GitHub

View File

@@ -153,8 +153,9 @@ interface Props {
export const ClientProvider: FC<Props> = ({ children }) => { export const ClientProvider: FC<Props> = ({ children }) => {
const history = useHistory(); const history = useHistory();
// null = signed out, undefined = loading
const [initClientState, setInitClientState] = useState< const [initClientState, setInitClientState] = useState<
InitResult | undefined InitResult | null | undefined
>(undefined); >(undefined);
const initializing = useRef(false); const initializing = useRef(false);
@@ -166,14 +167,7 @@ export const ClientProvider: FC<Props> = ({ children }) => {
initializing.current = true; initializing.current = true;
loadClient() loadClient()
.then((maybeClient) => { .then(setInitClientState)
if (!maybeClient) {
logger.error("Failed to initialize client");
return;
}
setInitClientState(maybeClient);
})
.catch((err) => logger.error(err)) .catch((err) => logger.error(err))
.finally(() => (initializing.current = false)); .finally(() => (initializing.current = false));
}, []); }, []);
@@ -270,20 +264,22 @@ export const ClientProvider: FC<Props> = ({ children }) => {
const [isDisconnected, setIsDisconnected] = useState(false); const [isDisconnected, setIsDisconnected] = useState(false);
const state: ClientState = useMemo(() => { const state: ClientState | undefined = useMemo(() => {
if (alreadyOpenedErr) { if (alreadyOpenedErr) {
return { state: "error", error: alreadyOpenedErr }; return { state: "error", error: alreadyOpenedErr };
} }
let authenticated = undefined; if (initClientState === undefined) return undefined;
if (initClientState) {
authenticated = { const authenticated =
client: initClientState.client, initClientState === null
isPasswordlessUser: initClientState.passwordlessUser, ? undefined
changePassword, : {
logout, client: initClientState.client,
}; isPasswordlessUser: initClientState.passwordlessUser,
} changePassword,
logout,
};
return { return {
state: "valid", state: "valid",
@@ -343,7 +339,7 @@ type InitResult = {
passwordlessUser: boolean; passwordlessUser: boolean;
}; };
async function loadClient(): Promise<InitResult> { async function loadClient(): Promise<InitResult | null> {
if (widget) { if (widget) {
// We're inside a widget, so let's engage *matryoshka mode* // We're inside a widget, so let's engage *matryoshka mode*
logger.log("Using a matryoshka client"); logger.log("Using a matryoshka client");
@@ -357,7 +353,8 @@ async function loadClient(): Promise<InitResult> {
try { try {
const session = loadSession(); const session = loadSession();
if (!session) { if (!session) {
throw new Error("No session stored"); logger.log("No session stored; continuing without a client");
return null;
} }
logger.log("Using a standalone client"); logger.log("Using a standalone client");