diff --git a/src/AuthContext.tsx b/src/AuthContext.tsx index 57672f9c..a74f6eea 100644 --- a/src/AuthContext.tsx +++ b/src/AuthContext.tsx @@ -121,6 +121,7 @@ export const AuthProvider: FC> = ({ */ useEffect(() => { isMountedRef.current = true; + setIsLoading(true); (async () => { const user = await userManager!.getUser(); if (!user || user.expired) { @@ -128,7 +129,6 @@ export const AuthProvider: FC> = ({ if (hasCodeInUrl(location)) { const user = (await userManager.signinCallback()) || null; setUserData(user); - setIsLoading(false); onSignIn && onSignIn(user); } // If autoSignIn is enabled, redirect to the OIDC provider. @@ -140,8 +140,8 @@ export const AuthProvider: FC> = ({ // Otherwise if the user is already signed in, set the user data. else if (isMountedRef.current) { setUserData(user); - setIsLoading(false); } + setIsLoading(false); })(); return () => { isMountedRef.current = false; @@ -153,7 +153,7 @@ export const AuthProvider: FC> = ({ */ useEffect(() => { const updateUserData: UserLoadedCallback = (user: User): void => { - setUserData(user); + isMountedRef.current && setUserData(user); }; const onSilentRenewError: SilentRenewErrorCallback = async (): Promise => { diff --git a/src/__tests__/AuthContext.test.tsx b/src/__tests__/AuthContext.test.tsx index 3917e772..75b0eaad 100644 --- a/src/__tests__/AuthContext.test.tsx +++ b/src/__tests__/AuthContext.test.tsx @@ -97,25 +97,29 @@ describe('AuthContext', () => { }); it('should generate a UserManager', async () => { - render( - , - ); + await act(async () => { + render( + , + ); + }); expect(UserManager).toHaveBeenCalled(); }); it('should use post-logout redirect URI when given', async () => { - render( - , - ); + await act(async () => { + render( + , + ); + }); expect(UserManager).toHaveBeenLastCalledWith( expect.objectContaining({ post_logout_redirect_uri: 'https://localhost', @@ -124,40 +128,46 @@ describe('AuthContext', () => { }); it('should fall back to redirectUri when post-logout redirect URI is not given', async () => { - render( - , - ); + await act(async () => { + render( + , + ); + }); expect(UserManager).toHaveBeenLastCalledWith( expect.objectContaining({ post_logout_redirect_uri: 'http://127.0.0.1' }), ); }); it('should use silent redirect URI when given', async () => { - render( - , - ); + await act(async () => { + render( + , + ); + }); expect(UserManager).toHaveBeenLastCalledWith( expect.objectContaining({ silent_redirect_uri: 'https://localhost' }), ); }); it('should fall back to redirectUri when silent redirect URI is not given', async () => { - render( - , - ); + await act(async () => { + render( + , + ); + }); expect(UserManager).toHaveBeenLastCalledWith( expect.objectContaining({ silent_redirect_uri: 'http://127.0.0.1' }), );