From 0ffb54e2ccd24a266aab6981da8ddab678492a6f Mon Sep 17 00:00:00 2001
From: schroda <50052685+schroda@users.noreply.github.com>
Date: Wed, 15 Oct 2025 22:34:11 +0200
Subject: [PATCH] Fix infinite loading
- Reset "requires auth" flag in session storage for reset on tab refresh
- Fix context los for resolving, rejecting queued request
- Process queued requests after successful login
Regression 6636cc66b12c058d0a932df976d827315ea4277e
fixes #1028
---
src/features/authentication/components/AuthGuard.tsx | 11 ++++++++++-
src/features/authentication/screens/LoginPage.tsx | 1 +
src/lib/requests/client/BaseClient.ts | 11 +++++++----
3 files changed, 18 insertions(+), 5 deletions(-)
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 {