import React, { useState, useEffect, useRef, useCallback } from 'react'; import { motion, AnimatePresence } from 'framer-motion'; import { Zap, X, ChevronDown, ChevronRight, Wifi, WifiOff, MessageSquare, Send, Image, FileText, Video, Music, Phone, Users, RefreshCw, CheckCheck, AlertCircle, QrCode, Link, Unlink, Trash2, Activity, ArrowDownLeft, ArrowUpRight, Filter, LayoutGrid, ShieldCheck, Clock } from 'lucide-react'; import { io, Socket } from 'socket.io-client'; import { useAuthStore } from '../../store/authStore'; // ─── Types ──────────────────────────────────────────────────────────────────── type EventCategory = 'all' | 'connection' | 'received' | 'sent' | 'media' | 'chat' | 'system'; interface BaileysEvent { id: string; timestamp: number; sessionId: string; event: string; data: any; category: EventCategory; mediaType?: 'image' | 'video' | 'audio' | 'document' | 'sticker'; fromMe?: boolean; } interface SessionStats { received: number; sent: number; media: number; chats: number; } interface SessionInfo { id: string; name?: string; status: 'connected' | 'disconnected' | 'connecting' | 'qr'; lastSeen: number; eventCount: number; events: BaileysEvent[]; engine?: 'infinite' | 'official'; dbStats?: SessionStats; // contagens do banco (carregadas no mount) liveStats?: Partial; // incrementos ao vivo (Socket.IO) } // ─── Método de envio: labels para o usuário final ───────────────────────────── const METODOS = [ { value: 'infinite' as const, label: 'Método 1', desc: 'Com botões', hint: 'Instável', icon: , color: 'text-amber-400', bg: 'bg-amber-500/10', border: 'border-amber-500/30', dot: 'bg-amber-400', }, { value: 'official' as const, label: 'Método 2', desc: 'Sem botões', hint: 'Estável', icon: , color: 'text-emerald-400', bg: 'bg-emerald-500/10', border: 'border-emerald-500/30', dot: 'bg-emerald-400', }, ]; // ─── Helpers ────────────────────────────────────────────────────────────────── function fmtCount(n: number): string { if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`; if (n >= 1_000) return `${(n / 1_000).toFixed(n >= 10_000 ? 0 : 1)}k`; return String(n); } function categorizeEvent(event: string, data: any): { category: EventCategory; mediaType?: BaileysEvent['mediaType']; fromMe?: boolean } { const e = event.toLowerCase(); if (e.includes('connection') || e.includes('qr') || e.includes('connect') || e.includes('disconnect') || e.includes('open') || e.includes('close')) { return { category: 'connection' }; } if (e.includes('message') || e.includes('msg')) { const fromMe = data?.fromMe ?? data?.key?.fromMe ?? false; let mediaType: BaileysEvent['mediaType'] | undefined; if (data?.imageMessage || data?.message?.imageMessage) mediaType = 'image'; else if (data?.videoMessage || data?.message?.videoMessage) mediaType = 'video'; else if (data?.audioMessage || data?.message?.audioMessage) mediaType = 'audio'; else if (data?.documentMessage || data?.message?.documentMessage) mediaType = 'document'; else if (data?.stickerMessage || data?.message?.stickerMessage) mediaType = 'sticker'; if (mediaType) return { category: 'media', mediaType, fromMe }; return { category: fromMe ? 'sent' : 'received', fromMe }; } if (e.includes('chat')) return { category: 'chat' }; return { category: 'system' }; } function parseData(raw: any): any { if (typeof raw === 'string') { try { return JSON.parse(raw); } catch { return raw; } } return raw; } const EVENT_META: Record = { all: { color: 'text-slate-300', bg: 'bg-slate-500/20', label: 'Todos' }, connection: { color: 'text-emerald-400', bg: 'bg-emerald-500/20', label: 'Conexão' }, received: { color: 'text-blue-400', bg: 'bg-blue-500/20', label: 'Recebidas' }, sent: { color: 'text-brand-400', bg: 'bg-brand-500/20', label: 'Enviadas' }, media: { color: 'text-purple-400', bg: 'bg-purple-500/20', label: 'Mídia' }, chat: { color: 'text-yellow-400', bg: 'bg-yellow-500/20', label: 'Chats' }, system: { color: 'text-slate-400', bg: 'bg-slate-500/20', label: 'Sistema' }, }; function EventIcon({ ev }: { ev: BaileysEvent }) { const cls = 'w-4 h-4 shrink-0'; if (ev.category === 'connection') { if (ev.event.toLowerCase().includes('qr')) return ; if (ev.event.toLowerCase().includes('disconnect') || ev.event.toLowerCase().includes('close')) return ; return ; } if (ev.category === 'sent') return ; if (ev.category === 'received') return ; if (ev.category === 'media') { if (ev.mediaType === 'image') return ; if (ev.mediaType === 'video') return