import { useEffect, useState } from "preact/hooks"; import { t } from "../../i18n"; import { api, apiErrorText } from "../../features/customize/api"; import { custTab } from "../../features/customize/actions"; import { nestedEditor } from "../../features/customize/state"; import { DATAPRO_CONNECTOR_ID } from "../../features/customize/vendors"; import { asList, asString, confirmAction, hint, } from "../../features/customize/host"; import { useAlive } from "./use-timer-lease"; import { markCustomizeFailed, markCustomizeLoaded } from "../../features/customize/load"; import { Hdr, IconGhost, Pill, Subhead, Toggle } from "./ui"; import { DataProCard } from "./vendors/datapro"; export function ConnectorsTab() { const alive = useAlive(); const [err, setErr] = useState(null); const [conns, setConns] = useState[]>([]); const [directory, setDirectory] = useState[]>([]); const [datapro, setDatapro] = useState<{ config: Record; error: unknown; }>({ config: {}, error: null }); const [name, setName] = useState(""); const [cmd, setCmd] = useState(""); useEffect(() => { void (async () => { try { const [d, dp] = await Promise.all([ api("/connectors"), api("/datapro/config") .then((config) => ({ config, error: null as unknown })) .catch((error) => ({ config: {} as Record, error })), ]); if (!alive()) return; setConns(asList(d.connectors) as Record[]); setDatapro(dp); markCustomizeLoaded(); try { const dir = await api("/connectors/directory"); if (!alive()) return; setDirectory(asList(dir.directory) as Record[]); } catch { if (!alive()) return; setDirectory([]); } } catch (e) { if (!alive()) return; const message = t("versions.load.err", (e as Error).message); setErr(message); markCustomizeFailed(message); } })(); }, [alive]); if (err) return
{err}
; return (
{conns .filter((k) => k.connector_id !== DATAPRO_CONNECTOR_ID) .map((k) => ( ))} {t("cust.connectors.fromDirectory")} {directory.map((item) => { if ( item.id === DATAPRO_CONNECTOR_ID || conns.some((k) => k.connector_id === item.id) ) { return null; } return (
{asString(item.name)}
{asString(item.description)}
); })}
{t("cust.connectors.customAddName")}
setName((e.target as HTMLInputElement).value)} /> setCmd((e.target as HTMLInputElement).value)} />
); } function ConnectorRow({ k }: { k: Record }) { const [on, setOn] = useState(!!k.enabled); const [testing, setTesting] = useState(false); return (
{asString(k.name)} {asString(k.connector_id)}
{asString(k.description)}
{ nestedEditor.value = { kind: "connector", connector: k }; }} /> { const next = !on; setOn(next); try { await api(`/connectors/${k.connector_id}/enabled`, { method: "PUT", body: JSON.stringify({ enabled: next }), }); } catch { setOn(!next); } }} /> { if (!confirmAction(t("cust.connectors.deleteConfirm", asString(k.name)))) return; try { await api(`/connectors/${k.connector_id}`, { method: "DELETE" }); custTab("connectors"); } catch { /* original swallowed */ } }} />
); }