diff --git a/web/src/connect.ts b/web/src/connect.ts index 199f59a85..9a6d4cff4 100644 --- a/web/src/connect.ts +++ b/web/src/connect.ts @@ -1,7 +1,7 @@ import { timestampDate } from "@bufbuild/protobuf/wkt"; import { Code, ConnectError, createClient, type Interceptor } from "@connectrpc/connect"; import { createConnectTransport } from "@connectrpc/connect-web"; -import { getAccessToken, isTokenExpired, REQUEST_TOKEN_EXPIRY_BUFFER_MS, setAccessToken } from "./auth-state"; +import { getAccessToken, hasStoredToken, isTokenExpired, REQUEST_TOKEN_EXPIRY_BUFFER_MS, setAccessToken } from "./auth-state"; import { ActivityService } from "./types/proto/api/v1/activity_service_pb"; import { AttachmentService } from "./types/proto/api/v1/attachment_service_pb"; import { AuthService } from "./types/proto/api/v1/auth_service_pb"; @@ -124,7 +124,13 @@ async function refreshAndGetAccessToken(): Promise { async function getRequestToken(): Promise { let token = getAccessToken(); if (!token) { - return null; + if (!hasStoredToken()) return null; + try { + token = await refreshAndGetAccessToken(); + } catch { + return null; + } + return token; } // Preflight refresh: avoid sending requests with expired access tokens. diff --git a/web/src/hooks/useTokenRefreshOnFocus.ts b/web/src/hooks/useTokenRefreshOnFocus.ts index cab7575c7..f838087d0 100644 --- a/web/src/hooks/useTokenRefreshOnFocus.ts +++ b/web/src/hooks/useTokenRefreshOnFocus.ts @@ -1,5 +1,5 @@ import { useEffect } from "react"; -import { FOCUS_TOKEN_EXPIRY_BUFFER_MS, getAccessToken, isTokenExpired } from "@/auth-state"; +import { FOCUS_TOKEN_EXPIRY_BUFFER_MS, hasStoredToken, isTokenExpired } from "@/auth-state"; /** * Hook that proactively refreshes the access token when the tab becomes visible @@ -20,9 +20,8 @@ export function useTokenRefreshOnFocus(refreshFn: () => Promise, enabled: return; } - // Only refresh if we have a token - const token = getAccessToken(); - if (!token) { + // Only refresh if the user has logged in before (token in localStorage) + if (!hasStoredToken()) { return; }