import { useState } from "preact/hooks"; import { t } from "../../../i18n"; import { api, apiErrorText } from "../../../features/customize/api"; import { currentId } from "../../../stores/session"; import { DATAPRO_CONNECTOR_ID, dataproIndexComplete, dataproResponseCode, dataproResultText, } from "../../../features/customize/vendors"; import { asString, dropSkillsCatalog, hint, openViewer, } from "../../../features/customize/host"; export function DataProCard({ config, configError, }: { config: Record; configError: unknown; }) { const [keyConfigured, setKeyConfigured] = useState(!!config.key_configured); const [arkKeyReused, setArkKeyReused] = useState(!!config.ark_key_reused); const [connectorEnabled, setConnectorEnabled] = useState(!!config.connector_enabled); const [skillEnabled, setSkillEnabled] = useState(!!config.skill_enabled); const [skillBusy, setSkillBusy] = useState(false); const [key, setKey] = useState(""); const [keyState, setKeyState] = useState( configError ? t("cust.datapro.requestFailed", apiErrorText(configError)) : arkKeyReused ? t("cust.datapro.keyArkReused") : keyConfigured ? t("cust.datapro.keyConfigured") : t("cust.datapro.keyMissing"), ); const [keyBad, setKeyBad] = useState(!!configError || (!keyConfigured && !arkKeyReused)); const [query, setQuery] = useState(""); const [status, setStatus] = useState(""); const [statusClass, setStatusClass] = useState("datapro-status"); const [indexText, setIndexText] = useState(""); const [indexClass, setIndexClass] = useState("datapro-index-status hidden"); const [result, setResult] = useState(t("cust.datapro.noResult")); const [artifact, setArtifact] = useState | null>(null); const [searching, setSearching] = useState(false); const [savingKey, setSavingKey] = useState(false); const placeholder = arkKeyReused ? t("cust.datapro.keyPlaceholderArk") : keyConfigured ? t("cust.datapro.keyPlaceholderSet") : t("cust.datapro.keyPlaceholder"); const saveKey = async () => { let secret = key.trim(); setKey(""); if (!secret) { hint(t("cust.datapro.keyRequired"), true); return; } setSavingKey(true); const request = api("/datapro/config", { method: "POST", body: JSON.stringify({ agent_plan_key: secret }), }); secret = ""; try { const saved = await request; setKeyConfigured(!!saved.key_configured); setArkKeyReused(!!saved.ark_key_reused); setKeyState( saved.ark_key_reused ? t("cust.datapro.keyArkReused") : t("cust.datapro.keyConfigured"), ); setKeyBad(false); hint(t("cust.datapro.keySaved")); } catch (error) { setKeyState(t("cust.datapro.requestFailed", apiErrorText(error))); setKeyBad(true); } finally { setKey(""); setSavingKey(false); } }; const runSearch = async () => { const text = query.trim(); if (!text) { hint(t("cust.datapro.queryRequired"), true); return; } setSearching(true); setStatus(t("cust.datapro.searching")); setStatusClass("datapro-status"); setIndexText(""); setIndexClass("datapro-index-status hidden"); setResult(t("cust.datapro.noResult")); setArtifact(null); try { const body: Record = { query: text }; if (currentId.value) body.frame_id = currentId.value; const response = await api("/datapro/search", { method: "POST", body: JSON.stringify(body), }); const code = dataproResponseCode(response); const indexed = code === 0 && dataproIndexComplete(response); setStatus( indexed ? t("cust.datapro.available") : code === 0 ? t("cust.datapro.indexFailed") : code === 4011 ? t("cust.datapro.auth4011") : asString(response.message) || t("cust.datapro.unavailable", code == null ? "?" : code), ); setStatusClass("datapro-status " + (indexed ? "ok" : "bad")); if (indexed) { const index = response.index as Record; setIndexText( t("cust.datapro.indexed", index.entry_count, index.source_leaf_count), ); setIndexClass("datapro-index-status ok"); } setResult(dataproResultText(response) || t("cust.datapro.noResult")); const saved = response.artifact as Record | undefined; setArtifact(saved && typeof saved === "object" ? saved : null); } catch (error) { setStatus(t("cust.datapro.requestFailed", apiErrorText(error))); setStatusClass("datapro-status bad"); setResult(t("cust.datapro.noResult")); setArtifact(null); } finally { setSearching(false); } }; return (
{t("cust.datapro.title")}
{t("cust.datapro.desc")}
setKey((e.target as HTMLInputElement).value)} onKeyDown={(e) => { if (e.key === "Enter") { e.preventDefault(); void saveKey(); } }} />
{keyState}