import { useCallback, useMemo, useState, type ChangeEvent } from "react"; import { validateLogicSourceCode } from "@arronqzy/blueprint-dsl"; import type { LogicNodeConfig } from "@arronqzy/blueprint-dsl"; import { useI18n } from "@arronqzy/i18n/react"; import type { BlueprintGraphNode } from "../graph/document"; import { resolveNodeLogicConfig } from "../graph/document"; import { ConfigSectionTitle } from "./ConfigHintIcon"; export type LogicNodeConfigPanelProps = { node: BlueprintGraphNode; onUpdateNode: ( nodeId: string, patch: Partial> ) => void; }; function patchLogicConfig( node: BlueprintGraphNode, patch: Partial ) { return { logicConfig: { ...resolveNodeLogicConfig(node), ...patch }, configSource: "logic" as const, }; } export function LogicNodeConfigPanel({ node, onUpdateNode, }: LogicNodeConfigPanelProps) { const { t } = useI18n(); const logicConfig = resolveNodeLogicConfig(node); const [draftError, setDraftError] = useState(null); const storedValidation = useMemo( () => validateLogicSourceCode(logicConfig.sourceCode), [logicConfig.sourceCode] ); const parseError = draftError ?? (storedValidation.ok ? null : storedValidation.error); const handleChange = useCallback( (e: ChangeEvent) => { const sourceCode = e.target.value; const result = validateLogicSourceCode(sourceCode); setDraftError(result.ok ? null : result.error); onUpdateNode(node.id, patchLogicConfig(node, { sourceCode })); }, [node, onUpdateNode] ); return (