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:
parent
61e154ed02
commit
3889badb7b
@ -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 {
|
||||||
|
|||||||
@ -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ê já 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}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user