import { memo, useEffect } from 'react'; import { useUpdateNodeInternals } from '@xyflow/react'; import NodeShell from '../components/NodeShell.jsx'; import { NodeDraftInput } from '../components/NodeDraftField.jsx'; import { useWorkflow } from '../context/WorkflowContext.jsx'; import { createBrowserId } from '../lib/ids.js'; import { getNodeAccent } from '../lib/nodeRegistry.js'; function JsonParserFlowNode({ id, data, selected, type }) { const { getNodeHandles, replaceNodeData, removeHandleConnections } = useWorkflow(); const updateNodeInternals = useUpdateNodeInternals(); const handles = getNodeHandles(type, data); const runtime = data.runtime || {}; const values = runtime.values || {}; useEffect(() => { updateNodeInternals(id); }, [id, data.extracts.length, updateNodeInternals]); const addExtract = () => { replaceNodeData(id, (current) => ({ ...current, extracts: [ ...current.extracts, { id: createBrowserId('json-extract'), label: `result ${current.extracts.length}`, path: '', fields: '', }, ], })); }; const updateExtract = (extractId, patch) => { replaceNodeData(id, (current) => ({ ...current, extracts: current.extracts.map((extract) => extract.id === extractId ? { ...extract, ...patch } : extract, ), })); }; const removeExtract = (extractId) => { if (data.extracts.length <= 1) { return; } removeHandleConnections(id, extractId, 'source'); replaceNodeData(id, (current) => ({ ...current, extracts: current.extracts.filter((extract) => extract.id !== extractId), })); }; const filledValuesCount = Object.values(values).filter(Boolean).length; return (
{data.extracts.map((extract, index) => (
))}
{filledValuesCount > 0 ? `Извлечено выходов: ${filledValuesCount}.` : 'Путь использует dot notation. Поля опциональны и задаются через запятую.'}
{runtime.error ?
{runtime.error}
: null}
); } export default memo(JsonParserFlowNode);