|
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'; |
|
|
|
|
|
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', []), |
|
[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, |
|
}; |
|
}; |
|
|