/** * Página de Callback OAuth * * Aguarda o evento SIGNED_IN via onAuthStateChange após o Supabase * processar o código/hash da URL automaticamente (PKCE ou Implicit). */ import React, { useEffect, useState } from 'react'; import { supabase } from '../lib/supabase'; import { Loader2 } from 'lucide-react'; export const AuthCallback: React.FC = () => { const [status, setStatus] = useState<'loading' | 'success' | 'error'>('loading'); useEffect(() => { console.log('🔄 AuthCallback: Aguardando sessão OAuth...'); console.log('🔗 URL completa:', window.location.href); let redirected = false; // Timer de segurança: se em 15s não logar, volta para o login const fallbackTimer = setTimeout(() => { if (!redirected) { console.warn('⏰ Timeout: nenhuma sessão recebida em 15s. Redirecionando para /login'); setStatus('error'); setTimeout(() => window.location.replace('/login'), 2000); } }, 15000); // onAuthStateChange é o jeito correto de detectar o retorno OAuth // O supabase-js detecta automaticamente ?code= (PKCE) ou #access_token= (Implicit) // e dispara SIGNED_IN quando a sessão estiver pronta const { data: { subscription } } = supabase.auth.onAuthStateChange(async (event, session) => { console.log('🔔 Auth Event:', event, '| User:', session?.user?.email ?? 'nenhum'); if (event === 'SIGNED_IN' && session?.user) { redirected = true; clearTimeout(fallbackTimer); setStatus('success'); // Garantir permissões do Super Admin if (session.user.email === 'admtracksteel@gmail.com') { console.log('👑 Super Admin detectado! Atualizando permissões...'); // eslint-disable-next-line @typescript-eslint/no-explicit-any await (supabase.from('usuarios') as any).upsert({ id: session.user.id, email: session.user.email, nome: session.user.user_metadata?.full_name || 'Super Admin', role: 'dev', ativo: true }); console.log('👑 Permissões de Super Admin aplicadas!'); } console.log('✅ Sessão confirmada! Redirecionando para /'); // Pequeno delay para o estado atualizar no UI setTimeout(() => { window.location.replace('/'); }, 500); } }); return () => { subscription.unsubscribe(); clearTimeout(fallbackTimer); }; }, []); return (
Aguarde enquanto verificamos sua conta.
> )} {status === 'success' && ( <>Redirecionando para o sistema...
> )} {status === 'error' && ( <>Não foi possível confirmar o login. Redirecionando...
> )}