balibabu
feat: after deleting the edge, set the corresponding field in the node's form field to undefined #918 (#1393)
f8510ae
| import pick from 'lodash/pick'; | |
| import { useCallback, useEffect } from 'react'; | |
| import { Edge } from 'reactflow'; | |
| import { IOperatorForm } from '../interface'; | |
| import useGraphStore from '../store'; | |
| export const useBuildRelevantOptions = () => { | |
| const nodes = useGraphStore((state) => state.nodes); | |
| const buildRelevantOptions = useCallback( | |
| (toList: string[]) => { | |
| return nodes | |
| .filter( | |
| (x) => !toList.some((y) => y === x.id), // filter out selected values in other to fields from the current drop-down box options | |
| ) | |
| .map((x) => ({ label: x.data.name, value: x.id })); | |
| }, | |
| [nodes], | |
| ); | |
| return buildRelevantOptions; | |
| }; | |
| const getTargetOfEdge = (edges: Edge[], sourceHandle: string) => | |
| edges.find((x) => x.sourceHandle === sourceHandle)?.target; | |
| /** | |
| * monitor changes in the connection and synchronize the target to the yes and no fields of the form | |
| * similar to the categorize-form's useHandleFormValuesChange method | |
| * @param param0 | |
| */ | |
| export const useWatchConnectionChanges = ({ nodeId, form }: IOperatorForm) => { | |
| const edges = useGraphStore((state) => state.edges); | |
| const getNode = useGraphStore((state) => state.getNode); | |
| const node = getNode(nodeId); | |
| const watchFormChanges = useCallback(() => { | |
| if (node) { | |
| form?.setFieldsValue(pick(node, ['yes', 'no'])); | |
| } | |
| }, [node, form]); | |
| const watchConnectionChanges = useCallback(() => { | |
| const edgeList = edges.filter((x) => x.source === nodeId); | |
| const yes = getTargetOfEdge(edgeList, 'yes'); | |
| const no = getTargetOfEdge(edgeList, 'no'); | |
| form?.setFieldsValue({ yes, no }); | |
| }, [edges, nodeId, form]); | |
| useEffect(() => { | |
| watchFormChanges(); | |
| }, [watchFormChanges]); | |
| }; | |