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.
This commit is contained in:
gpt-engineer-app[bot] 2025-06-21 14:25:52 +00:00
parent 9427d396b6
commit 4950dae761
3 changed files with 50 additions and 11 deletions

View File

@ -24,8 +24,26 @@ const ProtectedRoute = ({ children }: ProtectedRouteProps) => {
const { isChecking } = useProfileCompletion(session?.user?.email || ''); const { isChecking } = useProfileCompletion(session?.user?.email || '');
useEffect(() => { 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( const { data: { subscription } } = supabase.auth.onAuthStateChange(
(_event, session) => { (_event, session) => {
console.log('🔄 Mudança de auth:', _event, session?.user?.email);
setSession(session); setSession(session);
setLoggedIn(!!session); setLoggedIn(!!session);
setUser(session?.user ? { id: session.user.id } : null); 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 // Se tem sessão mas perfil não está completo, redirecionar para completar perfil
if (session && !isProfileComplete) { if (session && !isProfileComplete) {
console.log('🚨 Redirecionando para complete-profile - perfil incompleto');
return <Navigate to="/complete-profile" replace />; return <Navigate to="/complete-profile" replace />;
} }

View File

@ -27,9 +27,22 @@ export const useProfileCompletion = (userEmail: string) => {
console.error('❌ Erro ao verificar perfil:', error); console.error('❌ Erro ao verificar perfil:', error);
setProfileComplete(false); setProfileComplete(false);
} else if (usuario) { } else if (usuario) {
// Verificar se tem nome e whatsapp preenchidos // Verificar se tem nome REAL (não placeholder) e whatsapp válido
const isComplete = !!(usuario.nome?.trim() && usuario.whatsapp?.trim()); const hasRealName = usuario.nome &&
console.log('📋 Perfil completo:', isComplete, { nome: usuario.nome, whatsapp: usuario.whatsapp }); 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); setProfileComplete(isComplete);
} else { } else {
console.log('👤 Usuário não encontrado na tabela usuarios'); console.log('👤 Usuário não encontrado na tabela usuarios');

View File

@ -29,9 +29,13 @@ const CompleteProfile = () => {
setUserEmail(user.email || ''); setUserEmail(user.email || '');
setUserId(user.id); setUserId(user.id);
console.log('👤 Dados do usuário Google:', user.user_metadata);
// Pre-fill nome if available from Google // Pre-fill nome if available from Google
const displayName = user.user_metadata?.full_name || user.user_metadata?.name || ''; const displayName = user.user_metadata?.full_name ||
if (displayName) { user.user_metadata?.name ||
user.user_metadata?.display_name || '';
if (displayName && displayName !== 'Nome não informado') {
setNome(displayName); setNome(displayName);
} }
} else { } else {
@ -65,6 +69,7 @@ const CompleteProfile = () => {
try { try {
console.log('📝 Salvando dados complementares do perfil...'); console.log('📝 Salvando dados complementares do perfil...');
const whatsappOnly = whatsapp.replace(/\D/g, '');
// Atualizar dados do usuário no Supabase // Atualizar dados do usuário no Supabase
const { error: updateError } = await supabase const { error: updateError } = await supabase
@ -72,7 +77,7 @@ const CompleteProfile = () => {
.update({ .update({
nome: nome.trim(), nome: nome.trim(),
empresa: empresa.trim() || null, empresa: empresa.trim() || null,
whatsapp: whatsapp.replace(/\D/g, '') whatsapp: whatsappOnly
}) })
.eq('email', userEmail.toLowerCase().trim()); .eq('email', userEmail.toLowerCase().trim());
@ -88,22 +93,24 @@ const CompleteProfile = () => {
const webhookSuccess = await sendNewUserWebhook( const webhookSuccess = await sendNewUserWebhook(
userEmail, userEmail,
userId, userId,
whatsapp.replace(/\D/g, '') whatsappOnly
); );
if (webhookSuccess) { if (webhookSuccess) {
console.log('✅ Webhook N8N enviado com sucesso'); console.log('✅ Webhook N8N enviado com sucesso');
toast.success("Perfil completado!", {
description: "Seus dados foram salvos e seu workspace está sendo configurado.",
});
} else { } else {
console.warn('⚠️ Falha no webhook N8N, mas perfil foi salvo'); 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 // Marcar perfil como completo
setProfileComplete(true); setProfileComplete(true);
toast.success("Perfil completado!", {
description: "Seus dados foram salvos e sua conta está ativa.",
});
// Redirecionar para dashboard // Redirecionar para dashboard
navigate('/'); navigate('/');