From 33b1d472292361da24eace89220ca4d317334638 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Ben=C3=ADtez?= Date: Wed, 3 Jun 2026 00:19:14 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20detectar=20OAuth=20callback=20para=20no?= =?UTF-8?q?=20cortar=20sesi=C3=B3n=20en=20redirect?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/auth/AuthContext.tsx | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/auth/AuthContext.tsx b/src/auth/AuthContext.tsx index f348537..5d3dc66 100644 --- a/src/auth/AuthContext.tsx +++ b/src/auth/AuthContext.tsx @@ -38,18 +38,35 @@ function getUserFromStorage(): AuthUser | null { } } +// Detecta si la URL tiene un callback de OAuth (token en el hash o code en query). +// En ese caso NO usar localStorage — dejar que Supabase procese el hash primero. +function hasOAuthCallback(): boolean { + const hash = window.location.hash + const search = window.location.search + return ( + hash.includes('access_token') || + hash.includes('refresh_token') || + search.includes('code=') + ) +} + export function AuthProvider({ children }: { children: ReactNode }) { - // Inicialización sincrónica desde localStorage — 0ms, sin red - const [user, setUser] = useState(getUserFromStorage()) - // loading siempre false: la respuesta de localStorage es inmediata - const [loading] = useState(false) + // Si hay un OAuth callback en la URL, no leer localStorage (el token aún no está ahí). + // Supabase lo procesará en onAuthStateChange y actualizará el estado. + const isOAuthRedirect = hasOAuthCallback() + const [user, setUser] = useState( + isOAuthRedirect ? null : getUserFromStorage() + ) + // Si es un OAuth redirect, mantener loading=true hasta que Supabase procese el token. + const [loading, setLoading] = useState(isOAuthRedirect) useEffect(() => { - // Verificar y sincronizar con Supabase en background + // Verificar y sincronizar con Supabase en background. // Si la sesión expiró o fue revocada, onAuthStateChange llamará callback(null) - // y el router redirigirá a /login + // y el router redirigirá a /login. const unsubscribe = authService.onAuthStateChange((u) => { setUser(u) + setLoading(false) }) return () => unsubscribe() }, [])