'use client'; import { useState } from 'react'; interface Group { id: string; name: string; platform: string; isActive: boolean; } interface Route { id: string; sourceGroupId: string; targetGroupId: string; sourceGroup: { name: string }; targetGroup: { name: string }; } export function RouteManager({ groups, initialRoutes, }: { groups: Group[]; initialRoutes: Route[]; }) { const [routes, setRoutes] = useState(initialRoutes); const [sourceId, setSourceId] = useState(''); const [targetIds, setTargetIds] = useState>(new Set()); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); // Group routes by source group name const grouped = new Map(); for (const r of routes) { const key = r.sourceGroup.name; if (!grouped.has(key)) grouped.set(key, { sourceId: r.sourceGroupId, targets: [] }); grouped.get(key)!.targets.push(r); } function toggleTarget(id: string) { setTargetIds((prev) => { const next = new Set(prev); if (next.has(id)) next.delete(id); else next.add(id); return next; }); setError(null); } async function addRoutes() { if (!sourceId || targetIds.size === 0) return; setBusy(true); setError(null); try { const res = await fetch('/api/routes/batch', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ sourceGroupId: sourceId, targetGroupIds: [...targetIds] }), }); if (res.status === 409) { const errBody = await res.json(); setError(errBody.message ?? 'Some routes already exist'); return; } if (!res.ok) { setError('Failed to create routes'); return; } const created: Route[] = await res.json(); setRoutes((prev) => [...created, ...prev]); setSourceId(''); setTargetIds(new Set()); } finally { setBusy(false); } } async function deleteRoute(id: string) { const res = await fetch(`/api/routes/${id}`, { method: 'DELETE' }); if (res.ok) setRoutes((prev) => prev.filter((r) => r.id !== id)); } const eligibleTargets = groups.filter((g) => g.id !== sourceId && g.platform === 'whatsapp' && g.isActive); return (

Active sync routes

{routes.length === 0 ? (

No routes configured.

) : (
    {[...grouped.entries()].map(([sourceName, { sourceId: sId, targets }]) => (
  • {sourceName}
    {targets.map((r) => (
    {r.targetGroup.name}
    ))}
  • ))}
)}

Add routes

{targetIds.size} target{targetIds.size !== 1 ? 's' : ''} selected
{sourceId && eligibleTargets.length > 0 && (
{eligibleTargets.map((g) => { const checked = targetIds.has(g.id); return ( ); })}
)} {error && (

{error}

)}
); }