From 4950dae761b0828e4cbeea6bc3de82977831d078 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Sat, 21 Jun 2025 14:25:52 +0000 Subject: [PATCH] Fix: Enforce profile completion and webhook trigger The user reported that the app allows navigation without completing the profile (Name, WhatsApp) after Google login, and the N8N webhook is not triggered. This commit addresses these issues by ensuring the `/complete-profile` page is shown until the required data is provided, and the `sendNewUserWebhook` is called after successful profile completion. --- src/components/auth/ProtectedRoute.tsx | 19 +++++++++++++++++++ src/hooks/useProfileCompletion.ts | 19 ++++++++++++++++--- src/pages/CompleteProfile.tsx | 23 +++++++++++++++-------- 3 files changed, 50 insertions(+), 11 deletions(-) diff --git a/src/components/auth/ProtectedRoute.tsx b/src/components/auth/ProtectedRoute.tsx index 0d51ee1..0d1bbfa 100644 --- a/src/components/auth/ProtectedRoute.tsx +++ b/src/components/auth/ProtectedRoute.tsx @@ -24,8 +24,26 @@ const ProtectedRoute = ({ children }: ProtectedRouteProps) => { const { isChecking } = useProfileCompletion(session?.user?.email || ''); useEffect(() => { + // Verificar sessão inicial + supabase.auth.getSession().then(({ data: { session } }) => { + console.log('🔐 Sessão inicial:', session?.user?.email); + setSession(session); + setLoggedIn(!!session); + setUser(session?.user ? { id: session.user.id } : null); + + if (session?.user?.email) { + localStorage.setItem('userEmail', session.user.email); + } else { + localStorage.removeItem('userEmail'); + } + + setIsLoading(false); + }); + + // Listener para mudanças de auth const { data: { subscription } } = supabase.auth.onAuthStateChange( (_event, session) => { + console.log('🔄 Mudança de auth:', _event, session?.user?.email); setSession(session); setLoggedIn(!!session); setUser(session?.user ? { id: session.user.id } : null); @@ -61,6 +79,7 @@ const ProtectedRoute = ({ children }: ProtectedRouteProps) => { // Se tem sessão mas perfil não está completo, redirecionar para completar perfil if (session && !isProfileComplete) { + console.log('🚨 Redirecionando para complete-profile - perfil incompleto'); return ; } diff --git a/src/hooks/useProfileCompletion.ts b/src/hooks/useProfileCompletion.ts index bc28856..27ca952 100644 --- a/src/hooks/useProfileCompletion.ts +++ b/src/hooks/useProfileCompletion.ts @@ -27,9 +27,22 @@ export const useProfileCompletion = (userEmail: string) => { console.error('❌ Erro ao verificar perfil:', error); setProfileComplete(false); } else if (usuario) { - // Verificar se tem nome e whatsapp preenchidos - const isComplete = !!(usuario.nome?.trim() && usuario.whatsapp?.trim()); - console.log('📋 Perfil completo:', isComplete, { nome: usuario.nome, whatsapp: usuario.whatsapp }); + // Verificar se tem nome REAL (não placeholder) e whatsapp válido + const hasRealName = usuario.nome && + usuario.nome.trim() !== '' && + usuario.nome !== 'Nome não informado'; + const hasValidWhatsApp = usuario.whatsapp && + usuario.whatsapp.trim() !== '' && + usuario.whatsapp !== '00000000000' && + usuario.whatsapp.length >= 10; + + const isComplete = hasRealName && hasValidWhatsApp; + console.log('📋 Perfil completo:', isComplete, { + nome: usuario.nome, + whatsapp: usuario.whatsapp, + hasRealName, + hasValidWhatsApp + }); setProfileComplete(isComplete); } else { console.log('👤 Usuário não encontrado na tabela usuarios'); diff --git a/src/pages/CompleteProfile.tsx b/src/pages/CompleteProfile.tsx index 3eb374c..6856daf 100644 --- a/src/pages/CompleteProfile.tsx +++ b/src/pages/CompleteProfile.tsx @@ -29,9 +29,13 @@ const CompleteProfile = () => { setUserEmail(user.email || ''); setUserId(user.id); + console.log('👤 Dados do usuário Google:', user.user_metadata); + // Pre-fill nome if available from Google - const displayName = user.user_metadata?.full_name || user.user_metadata?.name || ''; - if (displayName) { + const displayName = user.user_metadata?.full_name || + user.user_metadata?.name || + user.user_metadata?.display_name || ''; + if (displayName && displayName !== 'Nome não informado') { setNome(displayName); } } else { @@ -65,6 +69,7 @@ const CompleteProfile = () => { try { console.log('📝 Salvando dados complementares do perfil...'); + const whatsappOnly = whatsapp.replace(/\D/g, ''); // Atualizar dados do usuário no Supabase const { error: updateError } = await supabase @@ -72,7 +77,7 @@ const CompleteProfile = () => { .update({ nome: nome.trim(), empresa: empresa.trim() || null, - whatsapp: whatsapp.replace(/\D/g, '') + whatsapp: whatsappOnly }) .eq('email', userEmail.toLowerCase().trim()); @@ -88,22 +93,24 @@ const CompleteProfile = () => { const webhookSuccess = await sendNewUserWebhook( userEmail, userId, - whatsapp.replace(/\D/g, '') + whatsappOnly ); if (webhookSuccess) { console.log('✅ Webhook N8N enviado com sucesso'); + toast.success("Perfil completado!", { + description: "Seus dados foram salvos e seu workspace está sendo configurado.", + }); } else { console.warn('⚠️ Falha no webhook N8N, mas perfil foi salvo'); + toast.success("Perfil completado!", { + description: "Seus dados foram salvos. A configuração do workspace pode demorar alguns minutos.", + }); } // Marcar perfil como completo setProfileComplete(true); - toast.success("Perfil completado!", { - description: "Seus dados foram salvos e sua conta está ativa.", - }); - // Redirecionar para dashboard navigate('/');