import { Info, MoreHorizontal, Plus, UserRound } from "lucide-react"; import { useCallback, useEffect, useState } from "react"; import { createHandoffRule, deleteHandoffRule, listHandoffRules, testHandoffRule, updateHandoffRule, } from "../api"; import AgentSpark from "./AgentSpark"; import HumanHandoffDrawer from "./HumanHandoffDrawer"; import { buildRuleCardChips, EMAIL_TYPE_OPTIONS } from "../utils/handoffUtils"; function typeLabel(id) { return EMAIL_TYPE_OPTIONS.find((item) => item.id === id)?.title || id; } export default function HandoffSettings() { const token = sessionStorage.getItem("agmail_access_token"); const [rules, setRules] = useState([]); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [error, setError] = useState(""); const [notice, setNotice] = useState(""); const [drawerOpen, setDrawerOpen] = useState(false); const [editingRule, setEditingRule] = useState(null); const [menuOpenId, setMenuOpenId] = useState(null); const [testOpen, setTestOpen] = useState(false); const [testDraft, setTestDraft] = useState(null); const [testSubject, setTestSubject] = useState(""); const [testBody, setTestBody] = useState(""); const [testResult, setTestResult] = useState(null); const [testing, setTesting] = useState(false); const loadRules = useCallback(async () => { setLoading(true); setError(""); try { const data = await listHandoffRules(token); setRules(data); } catch (err) { setError(err.message); } finally { setLoading(false); } }, [token]); useEffect(() => { loadRules(); }, [loadRules]); function openCreate() { setEditingRule(null); setDrawerOpen(true); } function openEdit(rule) { setEditingRule(rule); setDrawerOpen(true); setMenuOpenId(null); } async function handleSave(payload) { setSaving(true); setError(""); try { if (editingRule) { await updateHandoffRule(editingRule.id, payload, token); setNotice("Human Handoff updated."); } else { await createHandoffRule(payload, token); setNotice("Human Handoff created."); } setDrawerOpen(false); setEditingRule(null); await loadRules(); window.setTimeout(() => setNotice(""), 2500); } catch (err) { setError(err.message); } finally { setSaving(false); } } async function handleDelete(rule) { if (!window.confirm("Delete this handoff rule?")) return; try { await deleteHandoffRule(rule.id, token); setMenuOpenId(null); await loadRules(); } catch (err) { setError(err.message); } } function openTest(draft) { setTestDraft(draft); setTestSubject(""); setTestBody(""); setTestResult(null); setTestOpen(true); } async function runTest() { if (!testDraft) return; setTesting(true); setError(""); try { const result = await testHandoffRule({ rule_id: editingRule?.id, owner_email: testDraft.owner_email, labels: testDraft.labels, email_types: testDraft.email_types, instructions: testDraft.instructions, email: { subject: testSubject, snippet: testBody, body_text: testBody, }, }, token); setTestResult(result); } catch (err) { setError(err.message); } finally { setTesting(false); } } return (
Handoff rules are saved as configuration only. Email routing remains unchanged.
{error}
} {notice &&{notice}
} {loading ? (Loading settings…
) : rules.length === 0 ? (Configure when your Agent should involve a Human Owner.