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.
This commit is contained in:
gpt-engineer-app[bot] 2025-06-21 15:23:35 +00:00
parent 61e154ed02
commit 3889badb7b
2 changed files with 64 additions and 55 deletions

View File

@ -10,18 +10,18 @@ export const useExistingInstanceCheck = (userEmail: string) => {
useEffect(() => { useEffect(() => {
const checkExistingInstance = async () => { const checkExistingInstance = async () => {
if (!userEmail) { if (!userEmail) {
console.log('❌ Email do usuário não encontrado'); console.log('❌ [EXISTING_INSTANCE] Email do usuário não encontrado');
setCheckingExistingInstance(false); setCheckingExistingInstance(false);
return; return;
} }
try { 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); 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 = !!( const hasValidConnectedInstance = !!(
existingInstance && existingInstance &&
existingInstance.instancia_zap && existingInstance.instancia_zap &&
@ -32,19 +32,20 @@ export const useExistingInstanceCheck = (userEmail: string) => {
existingInstance.status_instancia === 'conectado' 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, instancia_zap: existingInstance?.instancia_zap,
status_instancia: existingInstance?.status_instancia, status_instancia: existingInstance?.status_instancia,
userEmail: userEmail, userEmail: userEmail,
instanceMatchesEmail: existingInstance?.instancia_zap?.toLowerCase() === userEmail.toLowerCase(), instanceMatchesEmail: existingInstance?.instancia_zap?.toLowerCase() === userEmail.toLowerCase(),
isConnected: existingInstance?.status_instancia === 'conectado' isConnected: existingInstance?.status_instancia === 'conectado',
hasValidConnectedInstance
}); });
setHasExistingInstance(hasValidConnectedInstance); setHasExistingInstance(hasValidConnectedInstance);
setExistingInstanceData(existingInstance); setExistingInstanceData(existingInstance);
} catch (error) { } catch (error) {
console.error('❌ Erro ao verificar instância existente:', error); console.error('❌ [EXISTING_INSTANCE] Erro ao verificar instância existente:', error);
setHasExistingInstance(false); setHasExistingInstance(false);
setExistingInstanceData(null); setExistingInstanceData(null);
} finally { } finally {

View File

@ -1,3 +1,4 @@
import { WhatsAppInstance } from '@/types/whatsAppTypes'; import { WhatsAppInstance } from '@/types/whatsAppTypes';
import Layout from '@/components/layout/Layout'; import Layout from '@/components/layout/Layout';
import CreateInstanceForm from '@/components/whatsapp/CreateInstanceForm'; import CreateInstanceForm from '@/components/whatsapp/CreateInstanceForm';
@ -38,7 +39,6 @@ const WhatsApp = () => {
handleViewQrCode handleViewQrCode
} = useWhatsAppActions(updateInstance, removeInstance, checkAllInstancesStatus); } = useWhatsAppActions(updateInstance, removeInstance, checkAllInstancesStatus);
// Custom hook for instance fetching and management
const { const {
instanceName, instanceName,
isLoading, isLoading,
@ -49,28 +49,32 @@ const WhatsApp = () => {
clearInstanceName clearInstanceName
} = useWhatsAppInstance(currentUserId, addInstance); } = useWhatsAppInstance(currentUserId, addInstance);
// State para controlar se deve mostrar o formulário de criação
const [showCreateForm, setShowCreateForm] = useState(false); const [showCreateForm, setShowCreateForm] = useState(false);
const [hasValidInstance, setHasValidInstance] = useState(false); const [hasConnectedInstance, setHasConnectedInstance] = useState(false);
const [checkingUserInstance, setCheckingUserInstance] = useState(true); 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(() => { useEffect(() => {
const checkUserInstanceFromDB = async () => { const checkUserConnectedInstance = async () => {
if (!userEmail) { if (!userEmail) {
console.log('❌ Email do usuário não encontrado');
setCheckingUserInstance(false); setCheckingUserInstance(false);
setShowCreateForm(true); setShowCreateForm(true);
return; return;
} }
setCheckingUserInstance(true);
try { 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); const instanceData = await getUserWhatsAppInstance(userEmail);
// Lógica corrigida: instancia_zap deve ser igual ao email E status deve ser 'conectado' console.log('📋 [WHATSAPP] Dados da instância encontrados:', instanceData);
const hasConnectedInstance = !!(
// Verificação CORRETA: instancia_zap deve ser igual ao email E status deve ser 'conectado'
const hasConnectedInstanceInDB = !!(
instanceData && instanceData &&
instanceData.instancia_zap && instanceData.instancia_zap &&
instanceData.instancia_zap.trim() !== '' && instanceData.instancia_zap.trim() !== '' &&
@ -80,53 +84,51 @@ const WhatsApp = () => {
instanceData.status_instancia === 'conectado' instanceData.status_instancia === 'conectado'
); );
console.log('📋 Verificação da instância:', { console.log('✅ [WHATSAPP] Verificação da instância conectada:', {
instanceData, instanceData,
userEmail, userEmail,
instanceMatchesEmail: instanceData?.instancia_zap?.toLowerCase() === userEmail.toLowerCase(), instanceMatchesEmail: instanceData?.instancia_zap?.toLowerCase() === userEmail.toLowerCase(),
isConnected: instanceData?.status_instancia === 'conectado', isConnected: instanceData?.status_instancia === 'conectado',
hasConnectedInstance hasConnectedInstanceInDB
}); });
setHasValidInstance(hasConnectedInstance); setHasConnectedInstance(hasConnectedInstanceInDB);
setShowCreateForm(!hasConnectedInstance); // Mostra formulário apenas se NÃO tiver instância conectada setShowCreateForm(!hasConnectedInstanceInDB); // Mostra formulário APENAS se NÃO tiver instância conectada
if (hasConnectedInstance) { if (hasConnectedInstanceInDB) {
setInstanceFound(true); 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) { } catch (error) {
console.error('❌ Erro ao verificar instância do usuário:', error); console.error('❌ [WHATSAPP] Erro ao verificar instância do usuário:', error);
setHasValidInstance(false); setHasConnectedInstance(false);
setShowCreateForm(true); setShowCreateForm(true);
} finally { } finally {
setCheckingUserInstance(false); setCheckingUserInstance(false);
} }
}; };
checkUserInstanceFromDB(); checkUserConnectedInstance();
}, [userEmail, setInstanceFound]); }, [userEmail, setInstanceFound]);
// Set up periodic status checking only after instances are loaded
usePeriodicStatusCheck(instances.length, checkAllInstancesStatus); usePeriodicStatusCheck(instances.length, checkAllInstancesStatus);
// Handler para quando o usuário cria uma nova instância
const handleInstanceCreated = (newInstance: WhatsAppInstance) => { const handleInstanceCreated = (newInstance: WhatsAppInstance) => {
console.log('🎉 Nova instância criada:', newInstance); console.log('🎉 [WHATSAPP] Nova instância criada:', newInstance);
addInstance(newInstance); addInstance(newInstance);
setInstanceFound(true); setInstanceFound(true);
setHasValidInstance(true); setHasConnectedInstance(true);
setShowCreateForm(false); setShowCreateForm(false);
// Salvar o nome da instância no localStorage para uso futuro
saveInstanceName(newInstance.instanceName); saveInstanceName(newInstance.instanceName);
// If there's a QR code in the response, show it
if (newInstance.qrcode) { if (newInstance.qrcode) {
handleViewQrCode(newInstance); handleViewQrCode(newInstance);
} }
// Trigger a status check for all instances with a delay
setTimeout(async () => { setTimeout(async () => {
try { try {
await checkAllInstancesStatus(); await checkAllInstancesStatus();
@ -136,25 +138,22 @@ const WhatsApp = () => {
}, 2000); }, 2000);
}; };
// Handler for when an instance is deleted
const handleDeleteInstanceWrapper = (instanceId: string) => { 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); const instanceToDelete = instances.find(i => i.instanceId === instanceId);
if (instanceToDelete) { if (instanceToDelete) {
handleDeleteInstance(instanceId, instanceToDelete.instanceName); 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) { if (instanceToDelete.instanceName === instanceName) {
clearInstanceName(); clearInstanceName();
setHasValidInstance(false); setHasConnectedInstance(false);
setShowCreateForm(true); setShowCreateForm(true);
} }
} else { } 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; const hasInstances = Array.isArray(instances) && instances.length > 0;
if (checkingUserInstance || isLoading) { if (checkingUserInstance || isLoading) {
@ -178,7 +177,6 @@ const WhatsApp = () => {
)} )}
</div> </div>
{/* Update List Button - Always visible */}
<Button <Button
variant="outline" variant="outline"
onClick={refreshInstances} onClick={refreshInstances}
@ -190,28 +188,39 @@ const WhatsApp = () => {
</Button> </Button>
</div> </div>
{/* Show create form if user doesn't have a connected instance */} {/* Mostra formulário APENAS se NÃO tiver instância conectada */}
{showCreateForm && ( {showCreateForm && !hasConnectedInstance && (
<CreateInstanceForm <>
onInstanceCreated={handleInstanceCreated} <CreateInstanceForm
initialInstanceName={instanceName} onInstanceCreated={handleInstanceCreated}
/> initialInstanceName={instanceName}
/>
</>
)} )}
{/* Toggle Create Form Button - only show if form is hidden and user has connected instance */} {/* Mensagem informativa quando já possui instância conectada */}
{!showCreateForm && hasValidInstance && ( {hasConnectedInstance && !showCreateForm && (
<Button <div className="bg-green-50 border border-green-200 rounded-lg p-4">
onClick={() => setShowCreateForm(true)} <div className="flex items-center">
className="mb-4" <div className="flex-shrink-0">
> <svg className="h-5 w-5 text-green-400" viewBox="0 0 20 20" fill="currentColor">
Conectar Novo WhatsApp <path fillRule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clipRule="evenodd" />
</Button> </svg>
</div>
<div className="ml-3">
<h3 className="text-sm font-medium text-green-800">
WhatsApp Conectado
</h3>
<div className="mt-2 text-sm text-green-700">
<p>Você possui uma instância do WhatsApp conectada. Não é necessário criar uma nova.</p>
</div>
</div>
</div>
</div>
)} )}
{/* Only show stats if instances are available */}
{hasInstances && <InstanceStats instances={instances} />} {hasInstances && <InstanceStats instances={instances} />}
{/* List of created instances */}
<InstanceList <InstanceList
instances={instances} instances={instances}
onViewQrCode={handleViewQrCode} onViewQrCode={handleViewQrCode}
@ -224,7 +233,6 @@ const WhatsApp = () => {
isRefreshing={isRefreshing} isRefreshing={isRefreshing}
/> />
{/* QR Code Dialog */}
<QrCodeDialog <QrCodeDialog
open={qrDialogOpen} open={qrDialogOpen}
onOpenChange={setQrDialogOpen} onOpenChange={setQrDialogOpen}