import { useState } from "react"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { Link } from "wouter"; import { Target, ArrowLeft, Search, Plus, MoreVertical, Calendar, Users, Mail, MessageSquare, Send, BarChart3, Clock, Play, Pause, CheckCircle, Edit2, Copy, Trash2, Eye, TrendingUp, MousePointer, UserPlus } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, DropdownMenuSeparator } from "@/components/ui/dropdown-menu"; import { Progress } from "@/components/ui/progress"; interface Campaign { id: number; name: string; description: string; type: string; status: string; subject: string; content: string; scheduled_at: string; started_at: string; completed_at: string; stats: { sent: number; delivered: number; opened: number; clicked: number; converted: number; bounced: number; }; created_at: string; } export default function XosCampaigns() { const queryClient = useQueryClient(); const [activeTab, setActiveTab] = useState("all"); const [isNewCampaignOpen, setIsNewCampaignOpen] = useState(false); const [newCampaign, setNewCampaign] = useState({ name: "", type: "email", subject: "", content: "", description: "", }); const { data: campaigns = [] } = useQuery({ queryKey: ["/api/xos/campaigns"], queryFn: async () => { const res = await fetch("/api/xos/campaigns"); if (!res.ok) return []; return res.json(); }, }); const sampleCampaigns: Campaign[] = [ { id: 1, name: "Black Friday 2025", description: "Campanha promocional de Black Friday com 30% de desconto", type: "email", status: "completed", subject: "Black Friday: 30% OFF em todos os planos!", content: "Aproveite nossa maior promoção do ano...", scheduled_at: "", started_at: new Date(Date.now() - 604800000).toISOString(), completed_at: new Date(Date.now() - 518400000).toISOString(), stats: { sent: 1500, delivered: 1450, opened: 580, clicked: 145, converted: 32, bounced: 50 }, created_at: new Date(Date.now() - 864000000).toISOString(), }, { id: 2, name: "Onboarding - Novos Clientes", description: "Sequência de emails de boas-vindas para novos clientes", type: "automation", status: "active", subject: "Bem-vindo ao Arcádia Suite!", content: "Olá! Seja bem-vindo ao Arcádia Suite...", scheduled_at: "", started_at: new Date(Date.now() - 2592000000).toISOString(), completed_at: "", stats: { sent: 320, delivered: 315, opened: 250, clicked: 120, converted: 85, bounced: 5 }, created_at: new Date(Date.now() - 2592000000).toISOString(), }, { id: 3, name: "Lançamento XOS", description: "Anúncio do novo módulo XOS para base de clientes", type: "email", status: "scheduled", subject: "Novidade: Conheça o XOS!", content: "Temos o prazer de anunciar o XOS...", scheduled_at: new Date(Date.now() + 172800000).toISOString(), started_at: "", completed_at: "", stats: { sent: 0, delivered: 0, opened: 0, clicked: 0, converted: 0, bounced: 0 }, created_at: new Date(Date.now() - 86400000).toISOString(), }, { id: 4, name: "WhatsApp - Abandono de Carrinho", description: "Recuperação de leads que não concluíram a compra", type: "whatsapp", status: "draft", subject: "", content: "Olá! Notamos que você deixou itens no carrinho...", scheduled_at: "", started_at: "", completed_at: "", stats: { sent: 0, delivered: 0, opened: 0, clicked: 0, converted: 0, bounced: 0 }, created_at: new Date(Date.now() - 43200000).toISOString(), }, ]; const displayCampaigns = campaigns.length > 0 ? campaigns : sampleCampaigns; const getStatusColor = (status: string) => { const colors: Record = { draft: "bg-gray-100 text-gray-700", scheduled: "bg-blue-100 text-blue-700", active: "bg-green-100 text-green-700", paused: "bg-yellow-100 text-yellow-700", completed: "bg-slate-100 text-slate-700", }; return colors[status] || colors.draft; }; const getStatusIcon = (status: string) => { const icons: Record = { draft: Edit2, scheduled: Clock, active: Play, paused: Pause, completed: CheckCircle, }; return icons[status] || Edit2; }; const getTypeIcon = (type: string) => { const icons: Record = { email: Mail, whatsapp: MessageSquare, sms: Send, automation: TrendingUp, }; return icons[type] || Mail; }; const getTypeColor = (type: string) => { const colors: Record = { email: "bg-blue-500", whatsapp: "bg-green-500", sms: "bg-purple-500", automation: "bg-orange-500", }; return colors[type] || colors.email; }; const calculateRate = (value: number, total: number) => { if (total === 0) return 0; return Math.round((value / total) * 100); }; const filteredCampaigns = displayCampaigns.filter((c) => { if (activeTab === "all") return true; return c.status === activeTab; }); const stats = { total: displayCampaigns.length, active: displayCampaigns.filter((c) => c.status === "active").length, scheduled: displayCampaigns.filter((c) => c.status === "scheduled").length, totalSent: displayCampaigns.reduce((sum, c) => sum + (c.stats?.sent || 0), 0), totalOpened: displayCampaigns.reduce((sum, c) => sum + (c.stats?.opened || 0), 0), }; return (

Campanhas

Marketing Automation

Nova Campanha
setNewCampaign({ ...newCampaign, name: e.target.value })} data-testid="input-campaign-name" />
setNewCampaign({ ...newCampaign, subject: e.target.value })} data-testid="input-campaign-subject" />