From cddd3e2389a99d4d086a80ba05bf305aebbf45a0 Mon Sep 17 00:00:00 2001 From: fullsizemalt <106900403+fullsizemalt@users.noreply.github.com> Date: Tue, 23 Dec 2025 15:40:03 -0800 Subject: [PATCH] fix: Silent handling of expired auth tokens (no console error) --- frontend/contexts/auth-context.tsx | 44 ++++++++++++++++-------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/frontend/contexts/auth-context.tsx b/frontend/contexts/auth-context.tsx index f7f10e6..78e5711 100644 --- a/frontend/contexts/auth-context.tsx +++ b/frontend/contexts/auth-context.tsx @@ -1,6 +1,6 @@ "use client" -import React, { createContext, useContext, useState, useEffect } from "react" +import React, { createContext, useContext, useState, useEffect, useCallback } from "react" import { getApiUrl } from "@/lib/api-config" interface User { @@ -32,15 +32,33 @@ export function AuthProvider({ children }: { children: React.ReactNode }) { const [token, setToken] = useState(null) const [loading, setLoading] = useState(true) + const fetchUser = useCallback(async (authToken: string): Promise => { + const res = await fetch(`${getApiUrl()}/auth/users/me`, { + headers: { + Authorization: `Bearer ${authToken}` + } + }) + if (res.ok) { + const userData = await res.json() + setUser(userData) + return true + } else if (res.status === 401 || res.status === 403) { + // Token expired or invalid - handle silently + return false + } else { + // Unexpected error + console.warn("Auth check failed with status:", res.status) + return false + } + }, []) + useEffect(() => { const initAuth = async () => { const storedToken = localStorage.getItem("token") if (storedToken) { setToken(storedToken) - try { - await fetchUser(storedToken) - } catch (err) { - console.error("Auth init failed", err) + const success = await fetchUser(storedToken) + if (!success) { localStorage.removeItem("token") setToken(null) } @@ -48,21 +66,7 @@ export function AuthProvider({ children }: { children: React.ReactNode }) { setLoading(false) } initAuth() - }, []) - - const fetchUser = async (token: string) => { - const res = await fetch(`${getApiUrl()}/auth/users/me`, { - headers: { - Authorization: `Bearer ${token}` - } - }) - if (res.ok) { - const userData = await res.json() - setUser(userData) - } else { - throw new Error("Failed to fetch user") - } - } + }, [fetchUser]) const login = async (newToken: string) => { localStorage.setItem("token", newToken)