Spaces:
Paused
Paused
import get from 'lodash/get'; | |
import { useCallback, useMemo } from 'react'; | |
import { v4 as uuid } from 'uuid'; | |
import { Operator } from '../constant'; | |
import { IGenerateParameter } from '../interface'; | |
import useGraphStore from '../store'; | |
// exclude nodes with branches | |
const ExcludedNodes = [Operator.Categorize, Operator.Relevant]; | |
export const useBuildComponentIdSelectOptions = (nodeId?: string) => { | |
const nodes = useGraphStore((state) => state.nodes); | |
const options = useMemo(() => { | |
return nodes | |
.filter( | |
(x) => | |
x.id !== nodeId && !ExcludedNodes.some((y) => y === x.data.label), | |
) | |
.map((x) => ({ label: x.data.name, value: x.id })); | |
}, [nodes, nodeId]); | |
return options; | |
}; | |
export const useHandleOperateParameters = (nodeId: string) => { | |
const { getNode, updateNodeForm } = useGraphStore((state) => state); | |
const node = getNode(nodeId); | |
const dataSource: IGenerateParameter[] = useMemo( | |
() => get(node, 'data.form.parameters', []) as IGenerateParameter[], | |
[node], | |
); | |
const handleComponentIdChange = useCallback( | |
(row: IGenerateParameter) => (value: string) => { | |
const newData = [...dataSource]; | |
const index = newData.findIndex((item) => row.id === item.id); | |
const item = newData[index]; | |
newData.splice(index, 1, { | |
...item, | |
component_id: value, | |
}); | |
updateNodeForm(nodeId, { parameters: newData }); | |
}, | |
[updateNodeForm, nodeId, dataSource], | |
); | |
const handleRemove = useCallback( | |
(id?: string) => () => { | |
const newData = dataSource.filter((item) => item.id !== id); | |
updateNodeForm(nodeId, { parameters: newData }); | |
}, | |
[updateNodeForm, nodeId, dataSource], | |
); | |
const handleAdd = useCallback(() => { | |
updateNodeForm(nodeId, { | |
parameters: [ | |
...dataSource, | |
{ | |
id: uuid(), | |
key: '', | |
component_id: undefined, | |
}, | |
], | |
}); | |
}, [dataSource, nodeId, updateNodeForm]); | |
const handleSave = (row: IGenerateParameter) => { | |
const newData = [...dataSource]; | |
const index = newData.findIndex((item) => row.id === item.id); | |
const item = newData[index]; | |
newData.splice(index, 1, { | |
...item, | |
...row, | |
}); | |
updateNodeForm(nodeId, { parameters: newData }); | |
}; | |
return { | |
handleAdd, | |
handleRemove, | |
handleComponentIdChange, | |
handleSave, | |
dataSource, | |
}; | |
}; | |