From 3889badb7be00f0793b7121e96fc08f2ce7e9041 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 15:23:35 +0000 Subject: [PATCH] Fix: Prevent new instance creation The app was incorrectly allowing new WhatsApp instance creation even when a connected instance already existed. This commit addresses this issue. --- .../whatsapp/useExistingInstanceCheck.ts | 15 +-- src/pages/WhatsApp.tsx | 104 ++++++++++-------- 2 files changed, 64 insertions(+), 55 deletions(-) diff --git a/src/hooks/whatsapp/useExistingInstanceCheck.ts b/src/hooks/whatsapp/useExistingInstanceCheck.ts index 5797d78..1c3498d 100644 --- a/src/hooks/whatsapp/useExistingInstanceCheck.ts +++ b/src/hooks/whatsapp/useExistingInstanceCheck.ts @@ -10,18 +10,18 @@ export const useExistingInstanceCheck = (userEmail: string) => { useEffect(() => { const checkExistingInstance = async () => { if (!userEmail) { - console.log('❌ Email do usuário não encontrado'); + console.log('❌ [EXISTING_INSTANCE] Email do usuário não encontrado'); setCheckingExistingInstance(false); return; } try { - console.log('🔍 Verificando se usuário já tem instância:', userEmail); + console.log('🔍 [EXISTING_INSTANCE] Verificando se usuário já tem instância CONECTADA:', userEmail); const existingInstance = await getUserWhatsAppInstance(userEmail); - console.log('📋 Dados da instância encontrados:', existingInstance); + console.log('📋 [EXISTING_INSTANCE] Dados da instância encontrados:', existingInstance); - // Verificação correta: deve ter instancia_zap igual ao email E status_instancia = 'conectado' + // Verificação CORRETA: instancia_zap deve ser igual ao email E status_instancia = 'conectado' const hasValidConnectedInstance = !!( existingInstance && existingInstance.instancia_zap && @@ -32,19 +32,20 @@ export const useExistingInstanceCheck = (userEmail: string) => { existingInstance.status_instancia === 'conectado' ); - console.log('✅ Usuário possui instância conectada:', hasValidConnectedInstance, { + console.log('✅ [EXISTING_INSTANCE] Usuário possui instância CONECTADA:', hasValidConnectedInstance, { instancia_zap: existingInstance?.instancia_zap, status_instancia: existingInstance?.status_instancia, userEmail: userEmail, instanceMatchesEmail: existingInstance?.instancia_zap?.toLowerCase() === userEmail.toLowerCase(), - isConnected: existingInstance?.status_instancia === 'conectado' + isConnected: existingInstance?.status_instancia === 'conectado', + hasValidConnectedInstance }); setHasExistingInstance(hasValidConnectedInstance); setExistingInstanceData(existingInstance); } catch (error) { - console.error('❌ Erro ao verificar instância existente:', error); + console.error('❌ [EXISTING_INSTANCE] Erro ao verificar instância existente:', error); setHasExistingInstance(false); setExistingInstanceData(null); } finally { diff --git a/src/pages/WhatsApp.tsx b/src/pages/WhatsApp.tsx index 5ee3ff1..043f5a9 100644 --- a/src/pages/WhatsApp.tsx +++ b/src/pages/WhatsApp.tsx @@ -1,3 +1,4 @@ + import { WhatsAppInstance } from '@/types/whatsAppTypes'; import Layout from '@/components/layout/Layout'; import CreateInstanceForm from '@/components/whatsapp/CreateInstanceForm'; @@ -38,7 +39,6 @@ const WhatsApp = () => { handleViewQrCode } = useWhatsAppActions(updateInstance, removeInstance, checkAllInstancesStatus); - // Custom hook for instance fetching and management const { instanceName, isLoading, @@ -49,28 +49,32 @@ const WhatsApp = () => { clearInstanceName } = useWhatsAppInstance(currentUserId, addInstance); - // State para controlar se deve mostrar o formulário de criação const [showCreateForm, setShowCreateForm] = useState(false); - const [hasValidInstance, setHasValidInstance] = useState(false); + const [hasConnectedInstance, setHasConnectedInstance] = useState(false); const [checkingUserInstance, setCheckingUserInstance] = useState(true); - const userEmail = localStorage.getItem('userEmail') || ''; + const userEmail = (localStorage.getItem('userEmail') || '').toLowerCase(); - // Verificar se o usuário tem instância válida conectada no banco de dados + // Verificar se o usuário tem instância CONECTADA no banco de dados useEffect(() => { - const checkUserInstanceFromDB = async () => { + const checkUserConnectedInstance = async () => { if (!userEmail) { + console.log('❌ Email do usuário não encontrado'); setCheckingUserInstance(false); setShowCreateForm(true); return; } + setCheckingUserInstance(true); + try { - console.log('🔍 Verificando instância do usuário no banco:', userEmail); + console.log('🔍 [WHATSAPP] Verificando instância conectada para:', userEmail); const instanceData = await getUserWhatsAppInstance(userEmail); - // Lógica corrigida: instancia_zap deve ser igual ao email E status deve ser 'conectado' - const hasConnectedInstance = !!( + console.log('📋 [WHATSAPP] Dados da instância encontrados:', instanceData); + + // Verificação CORRETA: instancia_zap deve ser igual ao email E status deve ser 'conectado' + const hasConnectedInstanceInDB = !!( instanceData && instanceData.instancia_zap && instanceData.instancia_zap.trim() !== '' && @@ -80,53 +84,51 @@ const WhatsApp = () => { instanceData.status_instancia === 'conectado' ); - console.log('📋 Verificação da instância:', { + console.log('✅ [WHATSAPP] Verificação da instância conectada:', { instanceData, userEmail, instanceMatchesEmail: instanceData?.instancia_zap?.toLowerCase() === userEmail.toLowerCase(), isConnected: instanceData?.status_instancia === 'conectado', - hasConnectedInstance + hasConnectedInstanceInDB }); - setHasValidInstance(hasConnectedInstance); - setShowCreateForm(!hasConnectedInstance); // Mostra formulário apenas se NÃO tiver instância conectada + setHasConnectedInstance(hasConnectedInstanceInDB); + setShowCreateForm(!hasConnectedInstanceInDB); // Mostra formulário APENAS se NÃO tiver instância conectada - if (hasConnectedInstance) { + if (hasConnectedInstanceInDB) { setInstanceFound(true); + console.log('✅ [WHATSAPP] Usuário já possui instância conectada, ocultando formulário de criação'); + } else { + console.log('❌ [WHATSAPP] Usuário NÃO possui instância conectada, mostrando formulário de criação'); } } catch (error) { - console.error('❌ Erro ao verificar instância do usuário:', error); - setHasValidInstance(false); + console.error('❌ [WHATSAPP] Erro ao verificar instância do usuário:', error); + setHasConnectedInstance(false); setShowCreateForm(true); } finally { setCheckingUserInstance(false); } }; - checkUserInstanceFromDB(); + checkUserConnectedInstance(); }, [userEmail, setInstanceFound]); - // Set up periodic status checking only after instances are loaded usePeriodicStatusCheck(instances.length, checkAllInstancesStatus); - // Handler para quando o usuário cria uma nova instância const handleInstanceCreated = (newInstance: WhatsAppInstance) => { - console.log('🎉 Nova instância criada:', newInstance); + console.log('🎉 [WHATSAPP] Nova instância criada:', newInstance); addInstance(newInstance); setInstanceFound(true); - setHasValidInstance(true); + setHasConnectedInstance(true); setShowCreateForm(false); - // Salvar o nome da instância no localStorage para uso futuro saveInstanceName(newInstance.instanceName); - // If there's a QR code in the response, show it if (newInstance.qrcode) { handleViewQrCode(newInstance); } - // Trigger a status check for all instances with a delay setTimeout(async () => { try { await checkAllInstancesStatus(); @@ -136,25 +138,22 @@ const WhatsApp = () => { }, 2000); }; - // Handler for when an instance is deleted const handleDeleteInstanceWrapper = (instanceId: string) => { - console.log(`🗑️ Solicitação de exclusão da instância ID: ${instanceId}`); + console.log(`🗑️ [WHATSAPP] Solicitação de exclusão da instância ID: ${instanceId}`); const instanceToDelete = instances.find(i => i.instanceId === instanceId); if (instanceToDelete) { handleDeleteInstance(instanceId, instanceToDelete.instanceName); - // Se a instância excluída for a atual, limpar o nome salvo e permitir criação de nova if (instanceToDelete.instanceName === instanceName) { clearInstanceName(); - setHasValidInstance(false); + setHasConnectedInstance(false); setShowCreateForm(true); } } else { - console.error(`❌ Inst ncia com ID ${instanceId} não encontrada para exclusão`); + console.error(`❌ [WHATSAPP] Instância com ID ${instanceId} não encontrada para exclusão`); } }; - // Check if we have any instances to show const hasInstances = Array.isArray(instances) && instances.length > 0; if (checkingUserInstance || isLoading) { @@ -178,7 +177,6 @@ const WhatsApp = () => { )} - {/* Update List Button - Always visible */} - {/* Show create form if user doesn't have a connected instance */} - {showCreateForm && ( - + {/* Mostra formulário APENAS se NÃO tiver instância conectada */} + {showCreateForm && !hasConnectedInstance && ( + <> + + )} - {/* Toggle Create Form Button - only show if form is hidden and user has connected instance */} - {!showCreateForm && hasValidInstance && ( - + {/* Mensagem informativa quando já possui instância conectada */} + {hasConnectedInstance && !showCreateForm && ( +
+
+
+ + + +
+
+

+ WhatsApp Conectado +

+
+

Você já possui uma instância do WhatsApp conectada. Não é necessário criar uma nova.

+
+
+
+
)} - {/* Only show stats if instances are available */} {hasInstances && } - {/* List of created instances */} { isRefreshing={isRefreshing} /> - {/* QR Code Dialog */}