Merge pull request #1294 from robintown/client-loading
Restore the client 'loading' state
This commit is contained in:
@@ -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 =
|
||||||
|
initClientState === null
|
||||||
|
? undefined
|
||||||
|
: {
|
||||||
client: initClientState.client,
|
client: initClientState.client,
|
||||||
isPasswordlessUser: initClientState.passwordlessUser,
|
isPasswordlessUser: initClientState.passwordlessUser,
|
||||||
changePassword,
|
changePassword,
|
||||||
logout,
|
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");
|
||||||
|
|||||||
Reference in New Issue
Block a user