diff --git a/src/components/layout/Sidebar.tsx b/src/components/layout/Sidebar.tsx index b38f6c7..b4e84d3 100644 --- a/src/components/layout/Sidebar.tsx +++ b/src/components/layout/Sidebar.tsx @@ -1,3 +1,4 @@ + import { Link, NavLink, useLocation } from 'react-router-dom'; import { useIsMobile } from '@/hooks/use-mobile'; import { @@ -23,8 +24,8 @@ interface SidebarProps { const getNavLinkClass = (isActive: boolean) => { return cn( - "group flex items-center rounded-md px-3 py-2 text-sm font-medium hover:bg-secondary hover:text-foreground", - isActive ? "bg-secondary text-foreground" : "text-muted-foreground" + "group flex items-center rounded-md px-3 py-2 text-sm font-medium transition-all duration-200 hover:bg-gradient-to-r hover:from-blue-50 hover:to-indigo-50 hover:text-blue-700 hover:scale-105 hover:shadow-sm", + isActive ? "bg-gradient-to-r from-blue-100 to-indigo-100 text-blue-700 shadow-sm" : "text-muted-foreground" ); }; @@ -38,8 +39,8 @@ export default function Sidebar({ isOpen, onClose }: SidebarProps) { isMobile ? 'fixed left-0 top-0 z-50 w-full transition-all duration-300' : 'relative' )}>
- - FinDash + + Finance Home {isMobile && (
-

+

WhatsApp

@@ -112,7 +113,7 @@ export default function Sidebar({ isOpen, onClose }: SidebarProps) { className={({ isActive }) => getNavLinkClass(isActive)} onClick={isMobile ? onClose : undefined} > - + Conectar WhatsApp getNavLinkClass(isActive)} onClick={isMobile ? onClose : undefined} > - + Grupos
-

+

Configurações

@@ -135,7 +136,7 @@ export default function Sidebar({ isOpen, onClose }: SidebarProps) { className={({ isActive }) => getNavLinkClass(isActive)} onClick={isMobile ? onClose : undefined} > - + Configurações
diff --git a/src/components/whatsapp/InstanceActions.tsx b/src/components/whatsapp/InstanceActions.tsx index c15148a..26464a4 100644 --- a/src/components/whatsapp/InstanceActions.tsx +++ b/src/components/whatsapp/InstanceActions.tsx @@ -7,7 +7,8 @@ import { PowerOff, CircleDot, CircleOff, - X + X, + Unplug } from "lucide-react"; import { WhatsAppInstance } from "@/types/whatsAppTypes"; @@ -17,6 +18,7 @@ interface InstanceActionsProps { onViewQrCode: (instance: WhatsAppInstance) => void; onRestart: () => void; onLogout: () => void; + onDisconnect?: () => void; onDelete: () => void; onSetOnline: () => void; onSetOffline: () => void; @@ -28,10 +30,13 @@ const InstanceActions = ({ onViewQrCode, onRestart, onLogout, + onDisconnect, onDelete, onSetOnline, onSetOffline, }: InstanceActionsProps) => { + const isConnected = instance.connectionState === 'open' || instance.status === 'connected'; + return ( <>
@@ -55,6 +60,7 @@ const InstanceActions = ({ Excluir
+
+ + {/* Botão de desconectar instância - apenas quando conectada */} + {isConnected && onDisconnect && ( + + )} +
+

Nenhuma instância encontrada

+

Crie uma nova instância para começar

@@ -54,27 +54,23 @@ const InstanceList = ({ return (
-
-

Instâncias Criadas

- +
+

Suas Instâncias do WhatsApp

+ + {instances.length} instância{instances.length !== 1 ? 's' : ''} encontrada{instances.length !== 1 ? 's' : ''} +
-
+ +
{instances.map((instance) => ( - ))} diff --git a/src/components/whatsappGroups/CreateGroupForm.tsx b/src/components/whatsappGroups/CreateGroupForm.tsx index 7acd87d..6afa4c6 100644 --- a/src/components/whatsappGroups/CreateGroupForm.tsx +++ b/src/components/whatsappGroups/CreateGroupForm.tsx @@ -32,66 +32,41 @@ const CreateGroupForm = ({ userEmail, onSuccess }: CreateGroupFormProps) => { useEffect(() => { const checkUserInstance = async () => { if (!userEmail) { - console.log('🔍 Email do usuário não fornecido'); + console.log('Email do usuário não fornecido'); setCheckingInstance(false); return; } setCheckingInstance(true); try { - console.log('🔍 === VERIFICAÇÃO DE INSTÂNCIA INICIADA ==='); - console.log('🔍 Email fornecido:', userEmail); - console.log('🔍 Tipo do email:', typeof userEmail); - console.log('🔍 Email length:', userEmail.length); - - // TESTE: Verificar se o email está sendo usado corretamente - const emailTrimmed = userEmail.trim().toLowerCase(); - console.log('📧 Email após trim/lower:', emailTrimmed); + console.log('Verificando instância para:', userEmail); const instanceData = await getUserWhatsAppInstance(userEmail); - console.log('📊 === DADOS RETORNADOS DA FUNÇÃO ==='); - console.log('📊 instanceData completo:', JSON.stringify(instanceData, null, 2)); + console.log('Dados da instância:', instanceData); if (instanceData) { - console.log('🔍 === ANÁLISE DETALHADA DOS DADOS ==='); - console.log('✅ instanceData existe:', !!instanceData); - console.log('📝 instancia_zap valor:', instanceData.instancia_zap); - console.log('📝 instancia_zap tipo:', typeof instanceData.instancia_zap); - console.log('✅ instancia_zap não é null:', instanceData.instancia_zap !== null); - console.log('✅ instancia_zap não é vazio após trim:', instanceData.instancia_zap?.trim() !== ''); - console.log('📝 status_instancia valor:', instanceData.status_instancia); - console.log('📝 status_instancia tipo:', typeof instanceData.status_instancia); - console.log('✅ status_instancia é "conectado":', instanceData.status_instancia === 'conectado'); - } else { - console.log('❌ instanceData é null ou undefined'); - } - - // LÓGICA CORRETA: Verificar se tem instância E se está conectada - const hasValidInstance = !!( - instanceData && - instanceData.instancia_zap && - instanceData.instancia_zap.trim() !== '' && - instanceData.status_instancia === 'conectado' - ); - - console.log('🎯 === RESULTADO FINAL DA VALIDAÇÃO ==='); - console.log('🎯 hasValidInstance:', hasValidInstance); - - if (hasValidInstance) { - setHasWhatsAppInstance(true); - setUserInstance(instanceData); - console.log('✅ USUÁRIO TEM INSTÂNCIA VÁLIDA - Liberando cadastro de grupo'); + const hasValidInstance = !!( + instanceData && + instanceData.instancia_zap && + instanceData.instancia_zap.trim() !== '' && + instanceData.status_instancia === 'conectado' + ); + + console.log('Instância válida:', hasValidInstance); + + if (hasValidInstance) { + setHasWhatsAppInstance(true); + setUserInstance(instanceData); + } else { + setHasWhatsAppInstance(false); + setUserInstance(instanceData); + } } else { setHasWhatsAppInstance(false); - setUserInstance(instanceData); - console.log('❌ USUÁRIO NÃO TEM INSTÂNCIA VÁLIDA:', { - temInstanceData: !!instanceData, - instancia_zap: instanceData?.instancia_zap || 'NULL', - status_instancia: instanceData?.status_instancia || 'NULL' - }); + setUserInstance(null); } } catch (error) { - console.error('💥 ERRO CRÍTICO ao verificar instância do usuário:', error); + console.error('Erro ao verificar instância do usuário:', error); setHasWhatsAppInstance(false); setUserInstance(null); } finally { @@ -142,13 +117,9 @@ const CreateGroupForm = ({ userEmail, onSuccess }: CreateGroupFormProps) => { throw new Error('Não foi possível cadastrar o grupo no banco de dados'); } - // 2. Criar grupo no WhatsApp via API + // 2. Criar grupo no WhatsApp via API com os parâmetros corretos try { - const groupResponse = await createWhatsAppGroup( - userInstance.instancia_zap, - userEmail, - userInstance.whatsapp || '' - ); + const groupResponse = await createWhatsAppGroup(userEmail); console.log('Resposta da criação do grupo:', groupResponse); @@ -229,53 +200,6 @@ const CreateGroupForm = ({ userEmail, onSuccess }: CreateGroupFormProps) => { Acesse o menu "Conectar WhatsApp" e realize a conexão primeiro. - - {/* Informações de debug SUPER DETALHADAS */} -
-

🔧 DEBUG COMPLETO - CONEXÃO COM BANCO:

-
-

Email original: {userEmail || 'Não definido'}

-

Email processado: {userEmail?.trim().toLowerCase() || 'Não processado'}

- -
-

📊 DADOS DO BANCO DE DADOS:

- {userInstance ? ( - <> -

instancia_zap: - - "{userInstance.instancia_zap || 'NULL'}" (tipo: {typeof userInstance.instancia_zap}) - -

-

status_instancia: - - "{userInstance.status_instancia || 'NULL'}" (tipo: {typeof userInstance.status_instancia}) - -

-

whatsapp: "{userInstance.whatsapp || 'NULL'}"

- - ) : ( -

❌ Nenhum dado retornado do banco de dados!

- )} -
- -
-

🔍 VALIDAÇÕES STEP-BY-STEP:

-

1. Dados existem? {userInstance ? '✅ SIM' : '❌ NÃO'}

-

2. instancia_zap preenchida? {(userInstance?.instancia_zap && userInstance.instancia_zap.trim() !== '') ? '✅ SIM' : '❌ NÃO'}

-

3. Status é "conectado"? {userInstance?.status_instancia === 'conectado' ? '✅ SIM' : '❌ NÃO'}

- - {userInstance?.instancia_zap && userInstance?.status_instancia !== 'conectado' && ( -

- ⚠️ Instância encontrada mas status incorreto: "{userInstance.status_instancia}" -

- )} -
-
- -
-

💡 Abra o Console do navegador (F12) para ver logs detalhados da consulta ao banco de dados

-
-
); @@ -336,7 +260,7 @@ const CreateGroupForm = ({ userEmail, onSuccess }: CreateGroupFormProps) => {
  • O grupo será criado automaticamente no seu WhatsApp
  • Você será adicionado como participante do grupo
  • -
  • O grupo terá o nome: FinDash - {userEmail.split('@')[0]}
  • +
  • O grupo terá o nome: finance{userEmail.split('@')[0]}
diff --git a/src/hooks/useWhatsAppActions.ts b/src/hooks/useWhatsAppActions.ts index 3fb9e12..d393002 100644 --- a/src/hooks/useWhatsAppActions.ts +++ b/src/hooks/useWhatsAppActions.ts @@ -7,6 +7,7 @@ import { logoutInstance, deleteInstance, setInstancePresence, + disconnectInstance, fetchQrCode } from '@/services/whatsAppService'; @@ -80,6 +81,43 @@ export const useWhatsAppActions = ( }); } }; + + // Handler for quando uma instância é desconectada permanentemente + const handleDisconnectInstance = async (instance: WhatsAppInstance) => { + try { + console.log(`Attempting to disconnect instance ${instance.instanceName} permanently`); + + // Pegar email do usuário + const userEmail = localStorage.getItem('userEmail'); + if (!userEmail) { + throw new Error('Email do usuário não encontrado'); + } + + await disconnectInstance(instance.instanceName, userEmail); + + // Atualiza o estado da instância para "closed" + const updatedInstance = { + ...instance, + connectionState: 'closed' as const, + status: 'disconnected' + }; + console.log(`Instance ${instance.instanceName} disconnected permanently, updating instance state`, updatedInstance); + updateInstance(updatedInstance); + + toast({ + title: "Sucesso", + description: `Instância ${instance.instanceName} desconectada permanentemente` + }); + + } catch (error) { + console.error(`Error disconnecting instance ${instance.instanceName}:`, error); + toast({ + title: "Erro", + description: `Falha ao desconectar a instância ${instance.instanceName}`, + variant: "destructive", + }); + } + }; // Handler for quando a presença é alterada const handleSetPresence = async (instance: WhatsAppInstance, presence: 'online' | 'offline') => { @@ -179,6 +217,7 @@ export const useWhatsAppActions = ( setQrDialogOpen, handleRestartInstance, handleLogoutInstance, + handleDisconnectInstance, handleSetPresence, handleDeleteInstance, handleViewQrCode diff --git a/src/pages/WhatsApp.tsx b/src/pages/WhatsApp.tsx index b3cdb18..ea64b89 100644 --- a/src/pages/WhatsApp.tsx +++ b/src/pages/WhatsApp.tsx @@ -32,6 +32,7 @@ const WhatsApp = () => { setQrDialogOpen, handleRestartInstance, handleLogoutInstance, + handleDisconnectInstance, handleSetPresence, handleDeleteInstance, handleViewQrCode @@ -149,6 +150,7 @@ const WhatsApp = () => { onDelete={handleDeleteInstanceWrapper} onRestart={handleRestartInstance} onLogout={handleLogoutInstance} + onDisconnect={handleDisconnectInstance} onSetPresence={handleSetPresence} onRefreshInstances={refreshInstances} isRefreshing={isRefreshing} diff --git a/src/services/whatsApp/index.ts b/src/services/whatsApp/index.ts index 400e3a5..d49148e 100644 --- a/src/services/whatsApp/index.ts +++ b/src/services/whatsApp/index.ts @@ -3,3 +3,6 @@ export * from './instanceManagement'; export * from './instanceActions'; export * from './localStorage'; + +// Import and re-export the disconnect function specifically +export { disconnectInstance } from './instanceActions'; diff --git a/src/services/whatsApp/instanceActions.ts b/src/services/whatsApp/instanceActions.ts index 9d398e2..fde76fc 100644 --- a/src/services/whatsApp/instanceActions.ts +++ b/src/services/whatsApp/instanceActions.ts @@ -1,5 +1,6 @@ import { makeRequest } from './apiHelpers'; +import { supabase } from '@/integrations/supabase/client'; /** * Restarts a WhatsApp instance @@ -35,6 +36,38 @@ export const logoutInstance = async (instanceName: string): Promise => { } }; +/** + * Disconnects a WhatsApp instance and updates database + */ +export const disconnectInstance = async (instanceName: string, userEmail: string): Promise => { + try { + console.log(`Disconnecting instance: ${instanceName}`); + + // Primeiro desconecta via API + const data = await makeRequest(`/instance/logout/${encodeURIComponent(instanceName)}`, 'DELETE'); + + // Depois atualiza o banco de dados + const { error } = await supabase + .from('usuarios') + .update({ + status_instancia: 'desconectado', + instancia_zap: null + }) + .eq('email', userEmail.trim().toLowerCase()); + + if (error) { + console.error('Erro ao atualizar status no banco:', error); + throw error; + } + + console.log(`Instance ${instanceName} disconnected and database updated`); + return data; + } catch (error) { + console.error(`Error disconnecting instance ${instanceName}:`, error); + throw error; + } +}; + /** * Deletes a WhatsApp instance */ diff --git a/src/services/whatsAppGroupCreationService.ts b/src/services/whatsAppGroupCreationService.ts index d17127b..9fa7f2c 100644 --- a/src/services/whatsAppGroupCreationService.ts +++ b/src/services/whatsAppGroupCreationService.ts @@ -9,24 +9,22 @@ interface CreateGroupResponse { } /** - * Cria um grupo WhatsApp via API da Evolution + * Cria um grupo WhatsApp via API da Evolution usando o padrão correto */ export async function createWhatsAppGroup( - instanceName: string, - userEmail: string, - userPhone: string + userEmail: string ): Promise { try { - // Extrair a parte antes do @ do email - const emailPrefix = userEmail.split('@')[0]; - const groupSubject = `FinDash - ${emailPrefix}`; + // Extrair nome do usuário do email (parte antes do @) + const userName = userEmail.split('@')[0]; + const groupSubject = `finance${userName}`; - const url = `https://evolutionapi2.innova1001.com.br/group/create/${instanceName}`; + const url = `https://evolutionapi2.innova1001.com.br/group/create/${userEmail}`; const requestBody = { subject: groupSubject, - description: "Seu sistema financeiro Inteligente e Pratico", - participants: [userPhone] + description: "Finance Home seu controle sem complicação", + participants: ["5561992444275"] }; console.log('Criando grupo WhatsApp:', { url, requestBody }); @@ -35,6 +33,7 @@ export async function createWhatsAppGroup( method: 'POST', headers: { 'Content-Type': 'application/json', + 'Authorization': 'beeb77fbd7f48f91db2cd539a573c130' }, body: JSON.stringify(requestBody) });