/** * Team Admin > Providers */ const { html } = window; const { useState, useEffect, useCallback } = hooks; export default function ProvidersSection({ teamId }) { const [configs, setConfigs] = useState([]); const [providerTypes, setProviderTypes] = useState([]); const [loading, setLoading] = useState(true); const [editing, setEditing] = useState(null); // null | 'new' | config object const load = useCallback(async () => { try { const [c, t] = await Promise.all([ sw.api.teams.providers(teamId), sw.api.admin.providers.types().catch(() => ({ types: [] })), ]); setConfigs(c.data || []); setProviderTypes(t || []); } catch (e) { sw.toast(e.message, 'error'); } finally { setLoading(false); } }, [teamId]); useEffect(() => { load(); }, [load]); async function saveProvider(e) { e.preventDefault(); const form = e.target; const data = { name: form.pname.value.trim(), provider: form.provider.value, endpoint: form.endpoint.value.trim(), api_key: form.api_key.value || undefined, }; try { if (editing === 'new') { await sw.api.teams.createProvider(teamId, data); sw.toast('Provider created', 'success'); } else { await sw.api.teams.updateProvider(teamId, editing.id, data); sw.toast('Provider updated', 'success'); } setEditing(null); load(); } catch (e) { sw.toast(e.message, 'error'); } } async function syncModels(pid) { try { const result = await sw.api.teams.providerModels(teamId, pid); sw.toast(`Models synced: ${result.added || result.count || 0}`, 'success'); } catch (e) { sw.toast(e.message, 'error'); } } async function deleteProvider(pid) { const ok = await sw.confirm('Delete this provider config?', true); if (!ok) return; try { await sw.api.teams.deleteProvider(teamId, pid); sw.toast('Provider deleted', 'success'); load(); } catch (e) { sw.toast(e.message, 'error'); } } if (loading) return html`
Loading\u2026
`; return html`
${editing && html`

${editing === 'new' ? 'Add Provider' : 'Edit Provider'}

`}
${configs.length === 0 && html`
No provider configs
`} ${configs.map(c => html`
${c.name} ${c.provider} ${c.has_key ? html`key set` : html`no key`}
${c.endpoint || '(default)'}
`)}
`; }