| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  | import { useCallback, useMemo } from 'react' | 
					
						
							|  |  |  | import produce from 'immer' | 
					
						
							|  |  |  | import { useStoreApi } from 'reactflow' | 
					
						
							|  |  |  | import { VarType } from '../../types' | 
					
						
							|  |  |  | import type { ValueSelector, Var } from '../../types' | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  | import { WriteMode } from './types' | 
					
						
							|  |  |  | import type { AssignerNodeOperation, AssignerNodeType } from './types' | 
					
						
							|  |  |  | import { useGetAvailableVars } from './hooks' | 
					
						
							|  |  |  | import { convertV1ToV2 } from './utils' | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  | import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud' | 
					
						
							|  |  |  | import { | 
					
						
							|  |  |  |   useIsChatMode, | 
					
						
							|  |  |  |   useNodesReadOnly, | 
					
						
							|  |  |  |   useWorkflow, | 
					
						
							|  |  |  |   useWorkflowVariables, | 
					
						
							|  |  |  | } from '@/app/components/workflow/hooks' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  | const useConfig = (id: string, rawPayload: AssignerNodeType) => { | 
					
						
							|  |  |  |   const payload = useMemo(() => convertV1ToV2(rawPayload), [rawPayload]) | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  |   const { nodesReadOnly: readOnly } = useNodesReadOnly() | 
					
						
							|  |  |  |   const isChatMode = useIsChatMode() | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  |   const getAvailableVars = useGetAvailableVars() | 
					
						
							|  |  |  |   const filterVar = (varType: VarType) => { | 
					
						
							|  |  |  |     return (v: Var) => { | 
					
						
							|  |  |  |       if (varType === VarType.any) | 
					
						
							|  |  |  |         return true | 
					
						
							|  |  |  |       if (v.type === VarType.any) | 
					
						
							|  |  |  |         return true | 
					
						
							|  |  |  |       return v.type === varType | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   const store = useStoreApi() | 
					
						
							| 
									
										
										
										
											2025-04-01 16:52:07 +08:00
										 |  |  |   const { getBeforeNodesInSameBranchIncludeParent } = useWorkflow() | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   const { | 
					
						
							|  |  |  |     getNodes, | 
					
						
							|  |  |  |   } = store.getState() | 
					
						
							|  |  |  |   const currentNode = getNodes().find(n => n.id === id) | 
					
						
							|  |  |  |   const isInIteration = payload.isInIteration | 
					
						
							|  |  |  |   const iterationNode = isInIteration ? getNodes().find(n => n.id === currentNode!.parentId) : null | 
					
						
							|  |  |  |   const availableNodes = useMemo(() => { | 
					
						
							| 
									
										
										
										
											2025-04-01 16:52:07 +08:00
										 |  |  |     return getBeforeNodesInSameBranchIncludeParent(id) | 
					
						
							|  |  |  |   }, [getBeforeNodesInSameBranchIncludeParent, id]) | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  |   const { inputs, setInputs } = useNodeCrud<AssignerNodeType>(id, payload) | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  |   const newSetInputs = useCallback((newInputs: AssignerNodeType) => { | 
					
						
							|  |  |  |     const finalInputs = produce(newInputs, (draft) => { | 
					
						
							|  |  |  |       if (draft.version !== '2') | 
					
						
							|  |  |  |         draft.version = '2' | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |     setInputs(finalInputs) | 
					
						
							|  |  |  |   }, [setInputs]) | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   const { getCurrentVariableType } = useWorkflowVariables() | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  |   const getAssignedVarType = useCallback((valueSelector: ValueSelector) => { | 
					
						
							|  |  |  |     return getCurrentVariableType({ | 
					
						
							| 
									
										
										
										
											2025-04-01 16:52:07 +08:00
										 |  |  |       parentNode: isInIteration ? iterationNode : null, | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  |       valueSelector: valueSelector || [], | 
					
						
							|  |  |  |       availableNodes, | 
					
						
							|  |  |  |       isChatMode, | 
					
						
							|  |  |  |       isConstant: false, | 
					
						
							|  |  |  |     }) | 
					
						
							| 
									
										
										
										
											2025-04-01 16:52:07 +08:00
										 |  |  |   }, [getCurrentVariableType, isInIteration, iterationNode, availableNodes, isChatMode]) | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  |   const handleOperationListChanges = useCallback((items: AssignerNodeOperation[]) => { | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  |     const newInputs = produce(inputs, (draft) => { | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  |       draft.items = [...items] | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  |     }) | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  |     newSetInputs(newInputs) | 
					
						
							|  |  |  |   }, [inputs, newSetInputs]) | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-30 15:50:00 +08:00
										 |  |  |   const writeModeTypesArr = [WriteMode.overwrite, WriteMode.clear, WriteMode.append, WriteMode.extend, WriteMode.removeFirst, WriteMode.removeLast] | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  |   const writeModeTypes = [WriteMode.overwrite, WriteMode.clear, WriteMode.set] | 
					
						
							|  |  |  |   const writeModeTypesNum = [WriteMode.increment, WriteMode.decrement, WriteMode.multiply, WriteMode.divide] | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  |   const getToAssignedVarType = useCallback((assignedVarType: VarType, write_mode: WriteMode) => { | 
					
						
							|  |  |  |     if (write_mode === WriteMode.overwrite || write_mode === WriteMode.increment || write_mode === WriteMode.decrement | 
					
						
							|  |  |  |       || write_mode === WriteMode.multiply || write_mode === WriteMode.divide || write_mode === WriteMode.extend) | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  |       return assignedVarType | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  |     if (write_mode === WriteMode.append) { | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  |       if (assignedVarType === VarType.arrayString) | 
					
						
							|  |  |  |         return VarType.string | 
					
						
							|  |  |  |       if (assignedVarType === VarType.arrayNumber) | 
					
						
							|  |  |  |         return VarType.number | 
					
						
							|  |  |  |       if (assignedVarType === VarType.arrayObject) | 
					
						
							|  |  |  |         return VarType.object | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return VarType.string | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  |   }, []) | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   const filterAssignedVar = useCallback((varPayload: Var, selector: ValueSelector) => { | 
					
						
							| 
									
										
										
										
											2025-04-01 16:52:07 +08:00
										 |  |  |     if (varPayload.isLoopVariable) | 
					
						
							|  |  |  |       return true | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  |     return selector.join('.').startsWith('conversation') | 
					
						
							|  |  |  |   }, []) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  |   const filterToAssignedVar = useCallback((varPayload: Var, assignedVarType: VarType, write_mode: WriteMode) => { | 
					
						
							|  |  |  |     if (write_mode === WriteMode.overwrite || write_mode === WriteMode.extend || write_mode === WriteMode.increment | 
					
						
							|  |  |  |       || write_mode === WriteMode.decrement || write_mode === WriteMode.multiply || write_mode === WriteMode.divide) { | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  |       return varPayload.type === assignedVarType | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  |     else if (write_mode === WriteMode.append) { | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  |       switch (assignedVarType) { | 
					
						
							|  |  |  |         case VarType.arrayString: | 
					
						
							|  |  |  |           return varPayload.type === VarType.string | 
					
						
							|  |  |  |         case VarType.arrayNumber: | 
					
						
							|  |  |  |           return varPayload.type === VarType.number | 
					
						
							|  |  |  |         case VarType.arrayObject: | 
					
						
							|  |  |  |           return varPayload.type === VarType.object | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |           return false | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return true | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  |   }, []) | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return { | 
					
						
							|  |  |  |     readOnly, | 
					
						
							|  |  |  |     inputs, | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  |     handleOperationListChanges, | 
					
						
							|  |  |  |     getAssignedVarType, | 
					
						
							|  |  |  |     getToAssignedVarType, | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  |     writeModeTypes, | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  |     writeModeTypesArr, | 
					
						
							|  |  |  |     writeModeTypesNum, | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  |     filterAssignedVar, | 
					
						
							|  |  |  |     filterToAssignedVar, | 
					
						
							| 
									
										
										
										
											2024-12-03 13:56:40 +08:00
										 |  |  |     getAvailableVars, | 
					
						
							|  |  |  |     filterVar, | 
					
						
							| 
									
										
										
										
											2024-08-13 14:44:10 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default useConfig |