From e41618415d6facbf436c3c798390be04572ace90 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 18:57:20 +0000 Subject: [PATCH] Refactor: Split WhatsApp page into components Split the WhatsApp page into smaller, reusable components to improve code organization and readability. --- .../whatsapp/ConnectedInstanceMessage.tsx | 33 ++++++ src/components/whatsapp/WhatsAppHeader.tsx | 36 ++++++ src/components/whatsapp/WhatsAppManager.tsx | 84 ++++++++++++++ .../useWhatsAppInstanceVerification.ts | 83 -------------- src/pages/WhatsApp.tsx | 104 ++++-------------- 5 files changed, 174 insertions(+), 166 deletions(-) create mode 100644 src/components/whatsapp/ConnectedInstanceMessage.tsx create mode 100644 src/components/whatsapp/WhatsAppHeader.tsx create mode 100644 src/components/whatsapp/WhatsAppManager.tsx delete mode 100644 src/hooks/whatsappGroups/useWhatsAppInstanceVerification.ts diff --git a/src/components/whatsapp/ConnectedInstanceMessage.tsx b/src/components/whatsapp/ConnectedInstanceMessage.tsx new file mode 100644 index 0000000..8cae5f7 --- /dev/null +++ b/src/components/whatsapp/ConnectedInstanceMessage.tsx @@ -0,0 +1,33 @@ + +interface ConnectedInstanceMessageProps { + instanceData: { + instancia_zap: string; + status_instancia: string; + }; +} + +const ConnectedInstanceMessage = ({ instanceData }: ConnectedInstanceMessageProps) => { + return ( +
+
+
+ + + +
+
+

+ WhatsApp Conectado ✅ +

+
+

Você já possui uma instância do WhatsApp conectada: {instanceData.instancia_zap}

+

Status: {instanceData.status_instancia}

+

Agora você pode criar grupos WhatsApp!

+
+
+
+
+ ); +}; + +export default ConnectedInstanceMessage; diff --git a/src/components/whatsapp/WhatsAppHeader.tsx b/src/components/whatsapp/WhatsAppHeader.tsx new file mode 100644 index 0000000..c3cde16 --- /dev/null +++ b/src/components/whatsapp/WhatsAppHeader.tsx @@ -0,0 +1,36 @@ + +import { Button } from '@/components/ui/button'; +import { RefreshCw } from 'lucide-react'; + +interface WhatsAppHeaderProps { + userEmail: string; + onRefresh: () => void; + isRefreshing: boolean; +} + +const WhatsAppHeader = ({ userEmail, onRefresh, isRefreshing }: WhatsAppHeaderProps) => { + return ( +
+
+

Conectar WhatsApp

+ {userEmail && ( +

+ Mostrando instâncias para: {userEmail} +

+ )} +
+ + +
+ ); +}; + +export default WhatsAppHeader; diff --git a/src/components/whatsapp/WhatsAppManager.tsx b/src/components/whatsapp/WhatsAppManager.tsx new file mode 100644 index 0000000..a6f54ae --- /dev/null +++ b/src/components/whatsapp/WhatsAppManager.tsx @@ -0,0 +1,84 @@ + +import { WhatsAppInstance } from '@/types/whatsAppTypes'; +import CreateInstanceForm from '@/components/whatsapp/CreateInstanceForm'; +import InstanceList from '@/components/whatsapp/InstanceList'; +import InstanceStats from '@/components/whatsapp/InstanceStats'; +import QrCodeDialog from '@/components/whatsapp/QrCodeDialog'; +import ConnectedInstanceMessage from './ConnectedInstanceMessage'; + +interface WhatsAppManagerProps { + hasExistingInstance: boolean; + existingInstanceData: any; + instances: WhatsAppInstance[]; + isRefreshing: boolean; + activeInstance: WhatsAppInstance | null; + qrDialogOpen: boolean; + onInstanceCreated: (instance: WhatsAppInstance) => void; + onViewQrCode: (instance: WhatsAppInstance) => void; + onDelete: (instanceId: string) => void; + onRestart: (instance: WhatsAppInstance) => Promise; + onLogout: (instance: WhatsAppInstance) => Promise; + onDisconnect: (instance: WhatsAppInstance) => Promise; + onSetPresence: (instance: WhatsAppInstance, presence: 'online' | 'offline') => Promise; + onRefreshInstances: () => void; + onStatusCheck: () => Promise; + setQrDialogOpen: (open: boolean) => void; +} + +const WhatsAppManager = ({ + hasExistingInstance, + existingInstanceData, + instances, + isRefreshing, + activeInstance, + qrDialogOpen, + onInstanceCreated, + onViewQrCode, + onDelete, + onRestart, + onLogout, + onDisconnect, + onSetPresence, + onRefreshInstances, + onStatusCheck, + setQrDialogOpen +}: WhatsAppManagerProps) => { + const hasInstances = Array.isArray(instances) && instances.length > 0; + + return ( + <> + {/* Formulário de criação - APENAS se NÃO tiver instância conectada */} + {!hasExistingInstance && ( + + )} + + {/* Mensagem quando já tem instância conectada */} + {hasExistingInstance && existingInstanceData && ( + + )} + + {hasInstances && } + + + + + + ); +}; + +export default WhatsAppManager; diff --git a/src/hooks/whatsappGroups/useWhatsAppInstanceVerification.ts b/src/hooks/whatsappGroups/useWhatsAppInstanceVerification.ts deleted file mode 100644 index 4299bbe..0000000 --- a/src/hooks/whatsappGroups/useWhatsAppInstanceVerification.ts +++ /dev/null @@ -1,83 +0,0 @@ - -import { useState, useEffect } from 'react'; -import { getUserWhatsAppInstance } from '@/services/whatsAppInstanceService'; - -interface WhatsAppInstanceData { - instancia_zap: string | null; - status_instancia: string | null; - whatsapp: string | null; -} - -export const useWhatsAppInstanceVerification = (userEmail: string) => { - const [hasWhatsAppInstance, setHasWhatsAppInstance] = useState(false); - const [checkingInstance, setCheckingInstance] = useState(true); - const [userInstance, setUserInstance] = useState(null); - - const checkUserInstance = async () => { - if (!userEmail) { - console.log('❌ Email do usuário não fornecido'); - setCheckingInstance(false); - return; - } - - setCheckingInstance(true); - try { - console.log('🔍 [GRUPO] Verificando instância para criação de grupo:', userEmail); - - const instanceData = await getUserWhatsAppInstance(userEmail); - console.log('📋 [GRUPO] Dados da instância encontrados:', instanceData); - - if (instanceData) { - // Verificação correta: deve ter instancia_zap igual ao email E status conectado - const hasValidInstance = !!( - instanceData && - instanceData.instancia_zap && - instanceData.instancia_zap.trim() !== '' && - instanceData.instancia_zap !== 'null' && - instanceData.instancia_zap !== null && - instanceData.instancia_zap.toLowerCase() === userEmail.toLowerCase() && - instanceData.status_instancia === 'conectado' - ); - - console.log('✅ [GRUPO] Instância válida para criar grupos:', hasValidInstance, { - instancia_zap: instanceData.instancia_zap, - status_instancia: instanceData.status_instancia, - userEmail: userEmail, - instanceMatchesEmail: instanceData.instancia_zap?.toLowerCase() === userEmail.toLowerCase(), - isConnected: instanceData.status_instancia === 'conectado', - hasValidInstance - }); - - setHasWhatsAppInstance(hasValidInstance); - setUserInstance(instanceData); - } else { - console.log('❌ [GRUPO] Nenhuma instância encontrada'); - setHasWhatsAppInstance(false); - setUserInstance(null); - } - } catch (error) { - console.error('❌ [GRUPO] Erro ao verificar instância do usuário:', error); - setHasWhatsAppInstance(false); - setUserInstance(null); - } finally { - setCheckingInstance(false); - } - }; - - useEffect(() => { - checkUserInstance(); - }, [userEmail]); - - // Função para forçar re-verificação (útil quando o status da instância muda) - const recheckInstance = () => { - console.log('🔄 [GRUPO] Forçando re-verificação da instância'); - checkUserInstance(); - }; - - return { - hasWhatsAppInstance, - checkingInstance, - userInstance, - recheckInstance - }; -}; diff --git a/src/pages/WhatsApp.tsx b/src/pages/WhatsApp.tsx index 751d162..6daa525 100644 --- a/src/pages/WhatsApp.tsx +++ b/src/pages/WhatsApp.tsx @@ -1,18 +1,14 @@ import { WhatsAppInstance } from '@/types/whatsAppTypes'; import Layout from '@/components/layout/Layout'; -import CreateInstanceForm from '@/components/whatsapp/CreateInstanceForm'; -import InstanceList from '@/components/whatsapp/InstanceList'; -import InstanceStats from '@/components/whatsapp/InstanceStats'; -import QrCodeDialog from '@/components/whatsapp/QrCodeDialog'; import LoadingState from '@/components/whatsapp/LoadingState'; +import WhatsAppHeader from '@/components/whatsapp/WhatsAppHeader'; +import WhatsAppManager from '@/components/whatsapp/WhatsAppManager'; import { useWhatsAppInstances } from '@/hooks/useWhatsAppInstances'; import { useWhatsAppActions } from '@/hooks/useWhatsAppActions'; import { useWhatsAppInstance, WHATSAPP_INSTANCE_KEY } from '@/hooks/whatsApp/useWhatsAppInstance'; import { usePeriodicStatusCheck } from '@/hooks/whatsApp/usePeriodicStatusCheck'; import { useExistingInstanceCheck } from '@/hooks/whatsapp/useExistingInstanceCheck'; -import { Button } from '@/components/ui/button'; -import { RefreshCw } from 'lucide-react'; const WhatsApp = () => { const { @@ -50,13 +46,10 @@ const WhatsApp = () => { const userEmail = (localStorage.getItem('userEmail') || '').toLowerCase(); - // Hook UNIFICADO para verificação de instância existente const { hasExistingInstance, - checkingExistingInstance, - existingInstanceData, - setHasExistingInstance, - setExistingInstanceData, + checkingInstance, + instanceData, recheckInstance } = useExistingInstanceCheck(userEmail); @@ -72,12 +65,10 @@ const WhatsApp = () => { handleViewQrCode(newInstance); } - // O mais importante: após criar, chame a função para re-verificar do banco de dados! - // Isso garante que o estado seja baseado em dados reais, não em uma suposição. setTimeout(() => { recheckInstance(); checkAllInstancesStatus(); - }, 2000); // Um pequeno delay para dar tempo ao backend de atualizar + }, 2000); }; const handleDeleteInstanceWrapper = (instanceId: string) => { @@ -88,16 +79,11 @@ const WhatsApp = () => { if (instanceToDelete.instanceName === instanceName) { clearInstanceName(); - setHasExistingInstance(false); - setExistingInstanceData(null); } } }; - const hasInstances = Array.isArray(instances) && instances.length > 0; - - // Loading enquanto verifica instância - if (checkingExistingInstance || isLoading) { + if (checkingInstance || isLoading) { return ( @@ -108,77 +94,29 @@ const WhatsApp = () => { return (
-
-
-

Conectar WhatsApp

- {userEmail && ( -

- Mostrando instâncias para: {userEmail} -

- )} -
- - -
+ - {/* Formulário de criação - APENAS se NÃO tiver instância conectada */} - {!hasExistingInstance && ( - - )} - - {/* Mensagem quando já tem instância conectada */} - {hasExistingInstance && existingInstanceData && ( -
-
-
- - - -
-
-

- WhatsApp Conectado ✅ -

-
-

Você já possui uma instância do WhatsApp conectada: {existingInstanceData.instancia_zap}

-

Status: {existingInstanceData.status_instancia}

-

Agora você pode criar grupos WhatsApp!

-
-
-
-
- )} - - {hasInstances && } - - - -