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 || '');
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 <Navigate to="/complete-profile" replace />;
}

View File

@ -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');

View File

@ -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('/');