import React, { useState, useEffect } from 'react'; import { History, CheckCircle2, XCircle, Clock, ExternalLink, Filter } from 'lucide-react'; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Badge } from "@/components/ui/badge"; import { motion } from 'framer-motion'; export default function RunHistory() { const [runs, setRuns] = useState([]); const [loading, setLoading] = useState(true); const [filterStatus, setFilterStatus] = useState('all'); const [searchQuery, setSearchQuery] = useState(''); useEffect(() => { fetchRuns(); }, []); const fetchRuns = async () => { try { setLoading(true); const response = await fetch('/api/smartlead-runs'); if (response.ok) { const data = await response.json(); setRuns(data); } } catch (error) { console.error('Error fetching runs:', error); } finally { setLoading(false); } }; const filteredRuns = runs.filter(run => { const matchesStatus = filterStatus === 'all' || run.status === filterStatus; const matchesSearch = searchQuery === '' || run.campaign_name?.toLowerCase().includes(searchQuery.toLowerCase()) || run.campaign_id?.toLowerCase().includes(searchQuery.toLowerCase()) || run.run_id?.toLowerCase().includes(searchQuery.toLowerCase()); return matchesStatus && matchesSearch; }); const getStatusBadge = (status) => { const variants = { 'completed': 'bg-green-100 text-green-700', 'failed': 'bg-red-100 text-red-700', 'pending': 'bg-yellow-100 text-yellow-700', 'dry_run_completed': 'bg-blue-100 text-blue-700' }; return variants[status] || 'bg-slate-100 text-slate-700'; }; const getStatusIcon = (status) => { if (status === 'completed' || status === 'dry_run_completed') { return ; } else if (status === 'failed') { return ; } else { return ; } }; const formatDate = (dateString) => { if (!dateString) return 'N/A'; const date = new Date(dateString); return date.toLocaleString(); }; return (
{/* Header */}

Run History

Smartlead campaign push history

{/* Filters */}
setSearchQuery(e.target.value)} className="pl-10" />
{/* Runs List */} {loading ? (

Loading runs...

) : filteredRuns.length === 0 ? (

No runs found

Push sequences to Smartlead to see history here

) : (
{filteredRuns.map((run, index) => (
{getStatusIcon(run.status)}

{run.campaign_name || 'Unnamed Campaign'}

{run.status} {run.dry_run && ( Dry Run )}
{run.campaign_id && ( Campaign: {run.campaign_id} )} {run.mode === 'new' ? 'New Campaign' : 'Existing Campaign'} {run.steps_count} {run.steps_count === 1 ? 'step' : 'steps'}
{formatDate(run.created_at)}
{run.completed_at && (
Completed: {formatDate(run.completed_at)}
)}
{/* Stats */}
Total Leads
{run.total_leads}
Added
{run.added_leads}
{run.skipped_leads > 0 && (
Skipped
{run.skipped_leads}
)} {run.failed_leads > 0 && (
Failed
{run.failed_leads}
)}
{/* Run ID */}
Run ID: {run.run_id} {run.campaign_id && ( )}
))}
)}
); }