import React, { useState } from 'react'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Badge } from '@/components/ui/badge'; import { Textarea } from '@/components/ui/textarea'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Mail, Plus, Send, Clock, CheckCircle, XCircle, BarChart3, Users, Eye, MousePointer, ShoppingCart, Calendar } from 'lucide-react'; import { useToast } from '@/hooks/use-toast'; import { z } from 'zod'; const campaignSchema = z.object({ name: z.string().trim().min(1, 'Nombre requerido').max(100, 'Nombre muy largo'), subject: z.string().trim().min(1, 'Asunto requerido').max(200, 'Asunto muy largo'), segment: z.string().min(1, 'Selecciona un segmento'), message: z.string().trim().min(10, 'Mensaje muy corto').max(2000, 'Mensaje muy largo'), }); const Campaigns = () => { const { toast } = useToast(); const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false); const [formData, setFormData] = useState({ name: '', subject: '', segment: '', message: '' }); const [formErrors, setFormErrors] = useState>({}); const campaigns = [ { id: 1, name: 'Promoción Verano 2024', status: 'sent', segment: 'VIP Travelers', sentDate: '2024-03-10', recipients: 2847, opened: 1423, clicked: 456, conversions: 89, revenue: '$12,450' }, { id: 2, name: 'Newsletter Mensual', status: 'scheduled', segment: 'Todos', sentDate: '2024-03-20', recipients: 5234, opened: 0, clicked: 0, conversions: 0, revenue: '$0' }, { id: 3, name: 'Reactivación Clientes', status: 'sending', segment: 'Inactivos', sentDate: '2024-03-15', recipients: 1245, opened: 623, clicked: 187, conversions: 34, revenue: '$4,230' }, { id: 4, name: 'Ofertas Especiales Familias', status: 'draft', segment: 'Familias', sentDate: null, recipients: 891, opened: 0, clicked: 0, conversions: 0, revenue: '$0' } ]; const segments = ['Todos', 'VIP Travelers', 'Business', 'Familias', 'Aventureros', 'Inactivos']; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); try { campaignSchema.parse(formData); setFormErrors({}); toast({ title: 'Campaña creada', description: `La campaña "${formData.name}" ha sido creada exitosamente.`, }); setIsCreateDialogOpen(false); setFormData({ name: '', subject: '', segment: '', message: '' }); } catch (error) { if (error instanceof z.ZodError) { const errors: Record = {}; error.errors.forEach((err) => { if (err.path[0]) { errors[err.path[0].toString()] = err.message; } }); setFormErrors(errors); } } }; const getStatusBadge = (status: string) => { const statusConfig = { sent: { label: 'Enviada', variant: 'default' as const, icon: CheckCircle, color: 'text-green-600' }, scheduled: { label: 'Programada', variant: 'secondary' as const, icon: Clock, color: 'text-blue-600' }, sending: { label: 'Enviando', variant: 'outline' as const, icon: Send, color: 'text-orange-600' }, draft: { label: 'Borrador', variant: 'outline' as const, icon: Mail, color: 'text-gray-600' }, failed: { label: 'Fallida', variant: 'destructive' as const, icon: XCircle, color: 'text-red-600' } }; return statusConfig[status as keyof typeof statusConfig] || statusConfig.draft; }; return (
{/* Header */}

Campañas

Gestiona tus campañas de marketing

Crear Nueva Campaña Configura tu campaña de email marketing
setFormData({ ...formData, name: e.target.value })} placeholder="Ej: Promoción Verano 2024" className={formErrors.name ? 'border-red-500' : ''} /> {formErrors.name && (

{formErrors.name}

)}
setFormData({ ...formData, subject: e.target.value })} placeholder="Asunto atractivo para tus clientes" className={formErrors.subject ? 'border-red-500' : ''} /> {formErrors.subject && (

{formErrors.subject}

)}
{formErrors.segment && (

{formErrors.segment}

)}