balibabu
feat: Extract the code for building categorize operator coordinates to hooks.ts #1739 (#2005)
16f8eca
import { useTranslate } from '@/hooks/common-hooks'; | |
import { useCallback, useMemo } from 'react'; | |
import { Operator, RestrictedUpstreamMap } from './constant'; | |
import useGraphStore from './store'; | |
const ExcludedNodesMap = { | |
// exclude some nodes downstream of the classification node | |
[Operator.Categorize]: [ | |
Operator.Categorize, | |
Operator.Answer, | |
Operator.Begin, | |
Operator.Relevant, | |
], | |
[Operator.Relevant]: [Operator.Begin, Operator.Answer, Operator.Relevant], | |
[Operator.Generate]: [Operator.Begin], | |
[Operator.Switch]: [Operator.Begin], | |
}; | |
export const useBuildFormSelectOptions = ( | |
operatorName: Operator, | |
selfId?: string, // exclude the current node | |
) => { | |
const nodes = useGraphStore((state) => state.nodes); | |
const buildCategorizeToOptions = useCallback( | |
(toList: string[]) => { | |
const excludedNodes: Operator[] = | |
RestrictedUpstreamMap[operatorName] ?? []; | |
return nodes | |
.filter( | |
(x) => | |
excludedNodes.every((y) => y !== x.data.label) && | |
x.id !== selfId && | |
!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, operatorName, selfId], | |
); | |
return buildCategorizeToOptions; | |
}; | |
/** | |
* dumped | |
* @param nodeId | |
* @returns | |
*/ | |
export const useHandleFormSelectChange = (nodeId?: string) => { | |
const { addEdge, deleteEdgeBySourceAndSourceHandle } = useGraphStore( | |
(state) => state, | |
); | |
const handleSelectChange = useCallback( | |
(name?: string) => (value?: string) => { | |
if (nodeId && name) { | |
if (value) { | |
addEdge({ | |
source: nodeId, | |
target: value, | |
sourceHandle: name, | |
targetHandle: null, | |
}); | |
} else { | |
// clear selected value | |
deleteEdgeBySourceAndSourceHandle({ | |
source: nodeId, | |
sourceHandle: name, | |
}); | |
} | |
} | |
}, | |
[addEdge, nodeId, deleteEdgeBySourceAndSourceHandle], | |
); | |
return { handleSelectChange }; | |
}; | |
export const useBuildSortOptions = () => { | |
const { t } = useTranslate('flow'); | |
const options = useMemo(() => { | |
return ['data', 'relevance'].map((x) => ({ | |
value: x, | |
label: t(x), | |
})); | |
}, [t]); | |
return options; | |
}; | |