import { useEffect, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { campaignApi, type Campaign } from '../api'; import { useCampaign } from '../contexts/CampaignContext'; export default function Campaigns() { const [campaigns, setCampaigns] = useState([]); const [name, setName] = useState(''); const [editingId, setEditingId] = useState(null); const [editName, setEditName] = useState(''); const nav = useNavigate(); const { setCampaign, refreshCampaigns } = useCampaign(); const load = async () => { const list = await campaignApi.list(); setCampaigns(list); }; useEffect(() => { load(); }, []); const create = async () => { if (!name.trim()) return; const c = await campaignApi.create(name.trim()); setName(''); await load(); await refreshCampaigns(); setCampaign(c); nav('/'); }; const startEdit = (c: Campaign) => { setEditingId(c.id); setEditName(c.name); }; const saveEdit = async (id: string) => { if (!editName.trim()) return; await campaignApi.update(id, { name: editName.trim() }); setEditingId(null); await load(); await refreshCampaigns(); }; const deleteCampaign = async (id: string) => { if (!confirm('Delete this campaign? Sessions will be unlinked (notes/history preserved).')) return; await campaignApi.delete(id); await load(); await refreshCampaigns(); }; const select = (c: Campaign) => { setCampaign(c); nav('/'); }; return (
Nat20 Notes

Campaigns

New campaign

setName(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && create()} />
{campaigns.length === 0 && (

No campaigns yet — create one above.

)} {campaigns.map((c) => (
select(c)}> {editingId === c.id ? ( setEditName(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') saveEdit(c.id); if (e.key === 'Escape') setEditingId(null); }} onBlur={() => saveEdit(c.id)} autoFocus onClick={(e) => e.stopPropagation()} /> ) : ( <>
{c.name}
{c.session_count} session{c.session_count !== 1 ? 's' : ''} {c.description && ` \u00B7 ${c.description}`}
)}
))}
); }