fix: prevent useAuth infinite loop causing rate limit storms

checkAuth was defined as a plain function and used as a useEffect
dependency, causing it to fire on every render. Moved it inside the
effect with an empty dependency array so it runs once on mount.
This commit is contained in:
Siddharth Kumar Sah
2026-03-26 01:10:51 +08:00
parent 200e7d10c1
commit 3b4f522bf4
+31 -31
View File
@@ -14,42 +14,42 @@ export function useAuth(): AuthState {
});
useEffect(() => {
checkAuth();
}, [checkAuth]);
async function checkAuth() {
try {
// Check if auth is enabled
const configRes = await fetch("/api/v1/config/auth");
const config = await configRes.json();
async function checkAuth() {
try {
// Check if auth is enabled
const configRes = await fetch("/api/v1/config/auth");
const config = await configRes.json();
if (!config.authEnabled) {
setState({ loading: false, authEnabled: false, isAuthenticated: true });
return;
}
if (!config.authEnabled) {
// Auth is enabled — check if we have a valid session
const token = localStorage.getItem("stirling-token");
if (!token) {
setState({ loading: false, authEnabled: true, isAuthenticated: false });
return;
}
const sessionRes = await fetch("/api/auth/session", {
headers: { Authorization: `Bearer ${token}` },
});
if (sessionRes.ok) {
setState({ loading: false, authEnabled: true, isAuthenticated: true });
} else {
localStorage.removeItem("stirling-token");
setState({ loading: false, authEnabled: true, isAuthenticated: false });
}
} catch {
// Can't reach API — assume no auth needed (dev mode)
setState({ loading: false, authEnabled: false, isAuthenticated: true });
return;
}
// Auth is enabled — check if we have a valid session
const token = localStorage.getItem("stirling-token");
if (!token) {
setState({ loading: false, authEnabled: true, isAuthenticated: false });
return;
}
const sessionRes = await fetch("/api/auth/session", {
headers: { Authorization: `Bearer ${token}` },
});
if (sessionRes.ok) {
setState({ loading: false, authEnabled: true, isAuthenticated: true });
} else {
localStorage.removeItem("stirling-token");
setState({ loading: false, authEnabled: true, isAuthenticated: false });
}
} catch {
// Can't reach API — assume no auth needed (dev mode)
setState({ loading: false, authEnabled: false, isAuthenticated: true });
}
}
checkAuth();
}, []);
return state;
}