fix: detectar OAuth callback para no cortar sesión en redirect
This commit is contained in:
@@ -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()
|
||||||
}, [])
|
}, [])
|
||||||
|
|||||||
Reference in New Issue
Block a user