import { useCallback, useMemo, useState, type ChangeEvent } from "react"; import { validateJsonString } from "@arronqzy/blueprint-dsl"; import type { JsonNodeConfig } from "@arronqzy/blueprint-dsl"; import { useI18n } from "@arronqzy/i18n/react"; import type { BlueprintGraphNode } from "../graph/document"; import { resolveNodeJsonConfig } from "../graph/document"; import { ConfigSectionTitle } from "./ConfigHintIcon"; export type JsonNodeConfigPanelProps = { node: BlueprintGraphNode; onUpdateNode: ( nodeId: string, patch: Partial> ) => void; }; function patchJsonConfig( node: BlueprintGraphNode, patch: Partial ) { return { jsonConfig: { ...resolveNodeJsonConfig(node), ...patch }, configSource: "json" as const, }; } export function JsonNodeConfigPanel({ node, onUpdateNode, }: JsonNodeConfigPanelProps) { const { t } = useI18n(); const jsonConfig = resolveNodeJsonConfig(node); const [draftError, setDraftError] = useState(null); const storedValidation = useMemo( () => validateJsonString(jsonConfig.jsonString), [jsonConfig.jsonString] ); const parseError = draftError ?? (storedValidation.ok ? null : storedValidation.error); const handleChange = useCallback( (e: ChangeEvent) => { const jsonString = e.target.value; const result = validateJsonString(jsonString); setDraftError(result.ok ? null : result.error); onUpdateNode(node.id, patchJsonConfig(node, { jsonString })); }, [node, onUpdateNode] ); return (