import { useEffect, useState } from 'react'; interface Campaign { id: string; name: string; status: string; startDate?: string; endDate?: string; } export function CampaignList() { const [campaigns, setCampaigns] = useState([]); const [loading, setLoading] = useState(true); const [selectedCampaignId, setSelectedCampaignId] = useState(null); const [rules, setRules] = useState([]); const [loadingRules, setLoadingRules] = useState(false); useEffect(() => { fetch('http://localhost:9332/api/v1/agent/campaigns') .then((res) => res.json()) .then((data) => { if (Array.isArray(data)) setCampaigns(data); else if (data && Array.isArray(data.content)) setCampaigns(data.content); else if (data && Array.isArray(data.data)) setCampaigns(data.data); else setCampaigns([]); }) .catch((err) => { console.error('Failed to fetch campaigns', err); setCampaigns([]); }) .finally(() => setLoading(false)); }, []); const handleSelectCampaign = (id: string) => { if (selectedCampaignId === id) { setSelectedCampaignId(null); setRules([]); return; } setSelectedCampaignId(id); setLoadingRules(true); fetch(`http://localhost:9332/api/v1/agent/campaigns/${id}/rules`) .then((res) => res.json()) .then((data) => { if (Array.isArray(data)) setRules(data); else if (data && Array.isArray(data.content)) setRules(data.content); else if (data && Array.isArray(data.data)) setRules(data.data); else setRules([]); }) .catch((err) => { console.error('Failed to fetch rules', err); setRules([]); }) .finally(() => setLoadingRules(false)); }; if (loading) { return
Loading campaigns...
; } if (campaigns.length === 0) { return
No campaigns found.
; } return (
{campaigns.map((camp) => (
handleSelectCampaign(camp.id)} className={`glass-card rounded-xl p-4 text-sm group cursor-pointer relative overflow-hidden transition-all duration-200 ${selectedCampaignId === camp.id ? 'ring-2 ring-primary/50' : ''}`}>
{camp.name || 'Unnamed Campaign'}
{camp.status === 'A' ? 'Active' : camp.status} {camp.id}
{selectedCampaignId === camp.id && (
{loadingRules ? (
Loading rules...
) : rules.length === 0 ? (
No rules found.
) : ( rules.map((rule, idx) => (
{rule.name || 'Unnamed Rule'}
{rule.description || 'No description'}
{rule.status && (
Status: {rule.status}
)}
)) )}
)}
))}
); }