'use client'; import { useEffect, useState } from 'react'; interface AssignedRule { id: string; matchType: string; matchValue: string; action: string; ruleIntent: 'POSITIVE' | 'NEGATIVE'; isActive: boolean; assignedAt: string; } interface TenantRule { id: string; matchType: string; matchValue: string; action: string; ruleIntent: 'POSITIVE' | 'NEGATIVE'; isActive: boolean; } export function RouteRulesDialog({ routeId, targetGroupName, onClose, }: { routeId: string; targetGroupName: string; onClose: () => void; }) { const [assigned, setAssigned] = useState([]); const [allRules, setAllRules] = useState([]); const [loading, setLoading] = useState(true); const [busy, setBusy] = useState(null); useEffect(() => { Promise.all([ fetch(`/api/routes/${routeId}/rules`).then((r) => r.json()), fetch('/api/rules').then((r) => r.json()), ]).then(([a, all]) => { setAssigned(Array.isArray(a) ? a : []); setAllRules(Array.isArray(all) ? all : []); }).catch(() => {}).finally(() => setLoading(false)); }, [routeId]); const assignedIds = new Set(assigned.map((r) => r.id)); const available = allRules.filter((r) => r.isActive && !assignedIds.has(r.id)); async function assign(tenantRuleId: string) { setBusy(tenantRuleId); try { const res = await fetch(`/api/routes/${routeId}/rules/${tenantRuleId}`, { method: 'POST' }); if (res.ok) { const rule = allRules.find((r) => r.id === tenantRuleId)!; setAssigned((prev) => [...prev, { ...rule, assignedAt: new Date().toISOString() }]); } } finally { setBusy(null); } } async function unassign(tenantRuleId: string) { setBusy(tenantRuleId); try { const res = await fetch(`/api/routes/${routeId}/rules/${tenantRuleId}`, { method: 'DELETE' }); if (res.ok || res.status === 204) { setAssigned((prev) => prev.filter((r) => r.id !== tenantRuleId)); } } finally { setBusy(null); } } return (

Rules for route

→ {targetGroupName}

{loading ? (

Loading…

) : (

Assigned ({assigned.length})

{assigned.length === 0 ? (

No rules assigned — route uses approval mode only.

) : (
    {assigned.map((rule) => (
  • {rule.ruleIntent} {rule.matchValue} {rule.matchType}
  • ))}
)}
{available.length > 0 && (

Add from your rules

    {available.map((rule) => (
  • {rule.ruleIntent} {rule.matchValue} {rule.matchType}
  • ))}
)} {available.length === 0 && assigned.length > 0 && (

All active rules are assigned to this route.

)}
)}
); }