diff --git a/src/lib/supabase.ts b/src/lib/supabase.ts index d950efc..d57e718 100644 --- a/src/lib/supabase.ts +++ b/src/lib/supabase.ts @@ -179,10 +179,10 @@ export const deleteFile = async (bucket: string, path: string) => { // Configuração de real-time para diferentes tabelas export const subscribeToTable = ( table: T, - callback: (payload: any) => void, + callback: (payload: Record) => void, filter?: string ) => { - let channel = supabase + const channel = supabase .channel(`public:${table}`) .on( 'postgres_changes', @@ -204,7 +204,7 @@ export const subscribeToTable = ( // Função para verificar conexão com o banco export const testConnection = async () => { try { - const { data, error } = await supabase + const { error } = await supabase .from('usuarios') .select('count') .limit(1) diff --git a/src/pages/AuthCallback.tsx b/src/pages/AuthCallback.tsx index 878fcda..d85b206 100644 --- a/src/pages/AuthCallback.tsx +++ b/src/pages/AuthCallback.tsx @@ -1,81 +1,114 @@ /** * Página de Callback OAuth - * - * Processa o retorno do OAuth e redireciona o usuário + * + * 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 } from 'react'; -import { useNavigate } from 'react-router-dom'; +import React, { useEffect, useState } from 'react'; import { supabase } from '../lib/supabase'; import { Loader2 } from 'lucide-react'; export const AuthCallback: React.FC = () => { - const navigate = useNavigate(); + const [status, setStatus] = useState<'loading' | 'success' | 'error'>('loading'); useEffect(() => { - console.log('🔄 AuthCallback montado.'); + console.log('🔄 AuthCallback: Aguardando sessão OAuth...'); + console.log('🔗 URL completa:', window.location.href); - const processSession = async () => { - try { - console.log('🔍 Verificando sessão em background...'); - const { data } = await supabase.auth.getSession(); + let redirected = false; - if (data.session?.user) { - const user = data.session.user; - console.log('✅ Sessão confirmada:', user.email); - - // SE FOR O SUPER ADMIN, FORÇAR O ROLE 'DEV' - if (user.email === 'admtracksteel@gmail.com') { - console.log('👑 Super Admin detectado! Atualizando permissões...'); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - await (supabase as any).from('usuarios').upsert({ - id: user.id, - email: user.email, - nome: user.user_metadata?.full_name || 'Super Admin', - role: 'dev', // Garante que seja dev - ativo: true - }); - console.log('👑 Permissões de Super Admin aplicadas!'); - } - - // Redirecionar imediatamente - window.location.replace('/'); - } else { - // Sem sessão (ainda processando ou erro), esperar um pouco e tentar dnv ou ir para login - setTimeout(() => window.location.replace('/login'), 5000); - } - } catch (e) { - console.error('⚠️ Erro na verificação de sessão:', e); - window.location.replace('/login'); + // 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...'); + await supabase.from('usuarios' as never).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); }; - - // Adiciona um pequeno delay para garantir que o supabase-js processou a URL (implicit / pkce hash) - const timer = setTimeout(() => { - processSession(); - }, 800); - - return () => clearTimeout(timer); - }, [navigate]); - - const handleForceLogin = () => { - window.location.href = '/'; - }; + }, []); return (
- -

Validando Credenciais...

-

Atualizando permissões de acesso.

+ {status === 'loading' && ( + <> + +

Validando Credenciais...

+

Aguarde enquanto verificamos sua conta.

+ + )} + + {status === 'success' && ( + <> +
+ + + +
+

Login confirmado!

+

Redirecionando para o sistema...

+ + )} + + {status === 'error' && ( + <> +
+ + + +
+

Falha na autenticação

+

Não foi possível confirmar o login. Redirecionando...

+ + )}
); }; + +export default AuthCallback;