// ============================================================================ // public/screens/integrations.jsx — Integrations Manager (Phase 7B) // ============================================================================ function IntegrationsScreen() { const [tab, setTab] = React.useState("apps"); // apps | webhooks return (
{tab === "apps" && } {tab === "webhooks" && }
); } function IntegrationsTab() { const [items, setItems] = React.useState(null); const load = () => VoaisAPI.get("/api/integrations").then(r => { if (r.ok) setItems(r.data.integrations); }); React.useEffect(() => { load(); }, []); const toggle = async (key, connected) => { if (connected) await VoaisAPI.del("/api/integrations/" + key); else await VoaisAPI.post("/api/integrations/" + key, {}); load(); }; if (!items) return ; const cats = [...new Set(items.map(i => i.category))]; return (
{cats.map(cat => (
{cat}
{items.filter(i => i.category === cat).map(i => (
{I[i.icon] ? React.createElement(I[i.icon], { size: 18 }) : }
{i.name}
{i.description}
toggle(i.key, i.connected)}/> {i.connected ? "Connected" : "Not connected"} {i.last_error && Error}
))}
))}
); } function WebhooksTab() { const [hooks, setHooks] = React.useState(null); const [showCreate, setShow] = React.useState(false); const load = () => VoaisAPI.get("/api/integrations/webhooks").then(r => { if (r.ok) setHooks(r.data.webhooks); }); React.useEffect(() => { load(); }, []); const del = async (id) => { if (!confirm("Delete webhook?")) return; await VoaisAPI.del("/api/integrations/webhooks/" + id); load(); }; if (!hooks) return ; return (
{hooks.length} webhooks
} onClick={() => setShow(true)}>Add webhook
{hooks.map(h => ( ))}{hooks.length === 0 && }
NameURLEventsActive
{h.name || "—"} {h.url} {(h.events||[]).map(e => {e})} {h.active ? "Active" : "Off"} del(h.id)}>
No webhooks configured.
{showCreate && setShow(false)} width={460}> { setShow(false); load(); }}/>}
); } function CreateWebhookForm({ onCreated }) { const [name, setName] = React.useState(""); const [url, setUrl] = React.useState(""); const [events, setEvents] = React.useState("call.completed"); const [sub, setSub] = React.useState(false); const submit = async () => { if (!url.trim()) return; setSub(true); const r = await VoaisAPI.post("/api/integrations/webhooks", { name, url, events: events.split(",").map(s=>s.trim()) }); setSub(false); if (r.ok) { alert("Webhook secret: " + r.data.secret); onCreated(); } }; return (
setName(e.target.value)} placeholder="e.g. CRM sync"/> setUrl(e.target.value)} placeholder="https://your-server.com/webhook"/> setEvents(e.target.value)}/> {sub ? "Creating..." : "Create webhook"}
); } window.IntegrationsScreen = IntegrationsScreen;