diff --git a/src/features/authentication/components/AuthGuard.tsx b/src/features/authentication/components/AuthGuard.tsx index 584708d8..154e684b 100644 --- a/src/features/authentication/components/AuthGuard.tsx +++ b/src/features/authentication/components/AuthGuard.tsx @@ -6,7 +6,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { ReactNode } from 'react'; +import { ReactNode, useEffect } from 'react'; import { useSessionContext } from '@/features/authentication/SessionContext.tsx'; import { SplashScreen } from '@/features/authentication/components/SplashScreen.tsx'; import { requestManager } from '@/lib/requests/RequestManager.ts'; @@ -28,6 +28,15 @@ export const AuthGuard = ({ children }: { children: ReactNode }) => { }, }); + useEffect(() => { + const handleUnload = () => { + AuthManager.setAuthRequired(null); + }; + + window.addEventListener('beforeunload', handleUnload); + return () => window.removeEventListener('beforeunload', handleUnload); + }, []); + if (isAuthRequired === null) { return ; } diff --git a/src/features/authentication/screens/LoginPage.tsx b/src/features/authentication/screens/LoginPage.tsx index 1707f777..f9d72073 100644 --- a/src/features/authentication/screens/LoginPage.tsx +++ b/src/features/authentication/screens/LoginPage.tsx @@ -47,6 +47,7 @@ export const LoginPage = () => { if (data) { AuthManager.setTokens(data.login.accessToken, data.login.refreshToken); + requestManager.processQueues(); navigate(redirect ?? AppRoutes.root.path); } } catch (e) { diff --git a/src/lib/requests/client/BaseClient.ts b/src/lib/requests/client/BaseClient.ts index 259ec43c..9db55342 100644 --- a/src/lib/requests/client/BaseClient.ts +++ b/src/lib/requests/client/BaseClient.ts @@ -39,7 +39,8 @@ export abstract class BaseClient { ): Promise { const refreshToken = AuthManager.getRefreshToken(); - if (!AuthManager.isAuthRequired()) { + if (!AuthManager.isAuthInitialized()) { + AuthManager.setAuthInitialized(true); AuthManager.setAuthRequired(true); } @@ -65,7 +66,6 @@ export abstract class BaseClient { } AuthManager.setAccessToken(data.refreshToken.accessToken); - AuthManager.setAuthInitialized(true); BaseClient.onTokenRefreshComplete?.(); @@ -106,7 +106,10 @@ export abstract class BaseClient { return executor(); } - const { promise: requestPromise, reject, resolve } = new ControlledPromise(); + const queuedRequest = new ControlledPromise(); + const resolve = queuedRequest.resolve.bind(queuedRequest); + const reject = queuedRequest.reject.bind(queuedRequest); + this.requestQueue.push({ execute: () => { executor().then(resolve).catch(reject); @@ -115,7 +118,7 @@ export abstract class BaseClient { reject, }); - return requestPromise; + return queuedRequest.promise; } public processQueue(): void {