fix: detectar OAuth callback para no cortar sesión en redirect

This commit is contained in:
2026-06-03 00:19:14 -03:00
parent 0e089155da
commit 33b1d47229

View File

@@ -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 }) { export function AuthProvider({ children }: { children: ReactNode }) {
// Inicialización sincrónica desde localStorage — 0ms, sin red // Si hay un OAuth callback en la URL, no leer localStorage (el token aún no está ahí).
const [user, setUser] = useState<AuthUser | null>(getUserFromStorage()) // Supabase lo procesará en onAuthStateChange y actualizará el estado.
// loading siempre false: la respuesta de localStorage es inmediata const isOAuthRedirect = hasOAuthCallback()
const [loading] = useState(false) const [user, setUser] = useState<AuthUser | null>(
isOAuthRedirect ? null : getUserFromStorage()
)
// Si es un OAuth redirect, mantener loading=true hasta que Supabase procese el token.
const [loading, setLoading] = useState(isOAuthRedirect)
useEffect(() => { 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) // 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) => { const unsubscribe = authService.onAuthStateChange((u) => {
setUser(u) setUser(u)
setLoading(false)
}) })
return () => unsubscribe() return () => unsubscribe()
}, []) }, [])