// AGENTFORGE-IA — Áreas sensibles de operación interna const OPS_LABELS = { ops_finance: 'Finanzas', ops_sales: 'Ventas', ops_marketing: 'Marketing', ops_operations: 'Operaciones', ops_hr: 'RRHH', ops_support: 'Atención al cliente', }; const DEFAULT_CONNECTORS = [ 'Google Workspace: Gmail', 'Google Workspace: Drive', 'Google Workspace: Calendar', ]; function InternalOpsArea({ areaId }) { const token = sessionStorage.getItem('af_token') || ''; const [loading, setLoading] = React.useState(true); const [saving, setSaving] = React.useState(false); const [objective, setObjective] = React.useState(''); const [notes, setNotes] = React.useState(''); const [rules, setRules] = React.useState([]); const [newRule, setNewRule] = React.useState(''); const [connectors, setConnectors] = React.useState([]); const [newConnector, setNewConnector] = React.useState(''); const readError = async (res, fallback) => { try { const payload = await res.json(); if (payload && typeof payload.detail === 'string' && payload.detail.trim()) return payload.detail; } catch (_) {} return fallback; }; const load = React.useCallback(async () => { setLoading(true); try { const res = await fetch('/api/v1/internal-ops/areas/' + encodeURIComponent(areaId), { headers: { Authorization: 'Bearer ' + token }, }); if (!res.ok) { window.afNotify && window.afNotify(await readError(res, 'Sin permisos para esta área')); setLoading(false); return; } const data = await res.json(); setObjective(data.objective || ''); setNotes(data.notes || ''); setRules(Array.isArray(data.rules) ? data.rules : []); const c = Array.isArray(data.connectors) ? data.connectors : []; setConnectors(c.length ? c : DEFAULT_CONNECTORS); } catch (_) { window.afNotify && window.afNotify('Error cargando configuración del área'); } finally { setLoading(false); } }, [areaId, token]); React.useEffect(() => { load(); }, [load]); const save = async () => { setSaving(true); try { const res = await fetch('/api/v1/internal-ops/areas/' + encodeURIComponent(areaId), { method: 'PUT', headers: { Authorization: 'Bearer ' + token, 'Content-Type': 'application/json' }, body: JSON.stringify({ objective, notes, rules, connectors, }), }); if (!res.ok) { window.afNotify && window.afNotify(await readError(res, 'No se pudo guardar la configuración')); return; } window.afNotify && window.afNotify('Configuración guardada'); } catch (_) { window.afNotify && window.afNotify('Error de red al guardar'); } finally { setSaving(false); } }; const seedDemo = async () => { try { const res = await fetch('/api/v1/internal-ops/seed-demo', { method: 'POST', headers: { Authorization: 'Bearer ' + token }, }); if (!res.ok) { window.afNotify && window.afNotify(await readError(res, 'No se pudo cargar la demo')); return; } window.afNotify && window.afNotify('Datos demo cargados en todas las áreas'); await load(); } catch (_) { window.afNotify && window.afNotify('Error de red al cargar demo'); } }; if (loading) { return