import { BrowserFrame } from "@/components/Browser/BrowserFrame"; import { useState, useEffect, useRef } from "react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Avatar, AvatarFallback } from "@/components/ui/avatar"; import { Badge } from "@/components/ui/badge"; import { Smartphone, QrCode, Loader2, CheckCircle, XCircle, RefreshCw, Send, Phone, MessageSquare, Wifi, WifiOff, LogOut } from "lucide-react"; import { useAuth } from "@/hooks/use-auth"; import QRCode from "qrcode"; interface WhatsAppStatus { status: "disconnected" | "connecting" | "qr_pending" | "connected"; qrCode: string | null; phoneNumber: string | null; } async function fetchStatus(): Promise { const response = await fetch("/api/whatsapp/status", { credentials: "include" }); if (!response.ok) throw new Error("Failed to fetch status"); return response.json(); } async function connectWhatsApp(): Promise { const response = await fetch("/api/whatsapp/connect", { method: "POST", credentials: "include", }); if (!response.ok) throw new Error("Failed to connect"); return response.json(); } async function disconnectWhatsApp(): Promise { const response = await fetch("/api/whatsapp/disconnect", { method: "POST", credentials: "include", }); if (!response.ok) throw new Error("Failed to disconnect"); } export default function WhatsApp() { const queryClient = useQueryClient(); const { user } = useAuth(); const [qrDataUrl, setQrDataUrl] = useState(null); const [isPolling, setIsPolling] = useState(false); const { data: status, isLoading, refetch } = useQuery({ queryKey: ["whatsapp-status"], queryFn: fetchStatus, refetchInterval: isPolling ? 2000 : false, }); const connectMutation = useMutation({ mutationFn: connectWhatsApp, onSuccess: (data) => { setIsPolling(true); if (data.qrCode) { generateQrDataUrl(data.qrCode); } queryClient.invalidateQueries({ queryKey: ["whatsapp-status"] }); }, }); const disconnectMutation = useMutation({ mutationFn: disconnectWhatsApp, onSuccess: () => { setIsPolling(false); setQrDataUrl(null); queryClient.invalidateQueries({ queryKey: ["whatsapp-status"] }); }, }); const generateQrDataUrl = async (qr: string) => { try { const url = await QRCode.toDataURL(qr, { width: 256, margin: 2, color: { dark: "#000000", light: "#ffffff" } }); setQrDataUrl(url); } catch (err) { console.error("QR generation error:", err); } }; useEffect(() => { if (status?.qrCode && status.status === "qr_pending") { generateQrDataUrl(status.qrCode); } if (status?.status === "connected") { setIsPolling(false); setQrDataUrl(null); } }, [status?.qrCode, status?.status]); const handleConnect = () => { connectMutation.mutate(); }; const handleDisconnect = () => { disconnectMutation.mutate(); }; const getStatusBadge = () => { switch (status?.status) { case "connected": return Conectado; case "connecting": return Conectando; case "qr_pending": return Aguardando QR; default: return Desconectado; } }; return (

WhatsApp Web

{getStatusBadge()} {status?.phoneNumber && ( +{status.phoneNumber} )}
{status?.status === "connected" && ( )}
{isLoading ? (

Carregando...

) : status?.status === "connected" ? (
WhatsApp Conectado Seu WhatsApp está conectado ao Arcádia Suite

Número conectado

+{status.phoneNumber}

Status

Online e sincronizado

As mensagens recebidas aparecerão automaticamente no chat interno.

) : status?.status === "qr_pending" && qrDataUrl ? ( Escaneie o QR Code Abra o WhatsApp no seu celular e escaneie o código abaixo
WhatsApp QR Code

1. Abra o WhatsApp no seu celular

2. Toque em Menu ou Configurações

3. Selecione Aparelhos conectados

4. Toque em Conectar um aparelho

5. Aponte seu celular para esta tela

) : (
Conectar WhatsApp Conecte sua conta do WhatsApp para enviar e receber mensagens

Você precisará escanear um QR Code com seu celular para conectar.

)}
); }