| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | import { useMemo } from 'react' | 
					
						
							|  |  |  | import { useTranslation } from 'react-i18next' | 
					
						
							|  |  |  | import produce from 'immer' | 
					
						
							| 
									
										
										
										
											2024-05-27 21:57:08 +08:00
										 |  |  | import { BlockEnum } from '../types' | 
					
						
							| 
									
										
										
										
											2024-04-08 18:51:46 +08:00
										 |  |  | import { | 
					
						
							|  |  |  |   NODES_EXTRA_DATA, | 
					
						
							|  |  |  |   NODES_INITIAL_DATA, | 
					
						
							|  |  |  | } from '../constants' | 
					
						
							|  |  |  | import { useIsChatMode } from './use-workflow' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export const useNodesInitialData = () => { | 
					
						
							|  |  |  |   const { t } = useTranslation() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return useMemo(() => produce(NODES_INITIAL_DATA, (draft) => { | 
					
						
							|  |  |  |     Object.keys(draft).forEach((key) => { | 
					
						
							|  |  |  |       draft[key as BlockEnum].title = t(`workflow.blocks.${key}`) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |   }), [t]) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export const useNodesExtraData = () => { | 
					
						
							|  |  |  |   const { t } = useTranslation() | 
					
						
							|  |  |  |   const isChatMode = useIsChatMode() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return useMemo(() => produce(NODES_EXTRA_DATA, (draft) => { | 
					
						
							|  |  |  |     Object.keys(draft).forEach((key) => { | 
					
						
							|  |  |  |       draft[key as BlockEnum].about = t(`workflow.blocksAbout.${key}`) | 
					
						
							|  |  |  |       draft[key as BlockEnum].availablePrevNodes = draft[key as BlockEnum].getAvailablePrevNodes(isChatMode) | 
					
						
							|  |  |  |       draft[key as BlockEnum].availableNextNodes = draft[key as BlockEnum].getAvailableNextNodes(isChatMode) | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |   }), [t, isChatMode]) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-05-27 21:57:08 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | export const useAvailableBlocks = (nodeType?: BlockEnum, isInIteration?: boolean) => { | 
					
						
							|  |  |  |   const nodesExtraData = useNodesExtraData() | 
					
						
							|  |  |  |   const availablePrevBlocks = useMemo(() => { | 
					
						
							|  |  |  |     if (!nodeType) | 
					
						
							|  |  |  |       return [] | 
					
						
							|  |  |  |     return nodesExtraData[nodeType].availablePrevNodes || [] | 
					
						
							|  |  |  |   }, [nodeType, nodesExtraData]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const availableNextBlocks = useMemo(() => { | 
					
						
							|  |  |  |     if (!nodeType) | 
					
						
							|  |  |  |       return [] | 
					
						
							|  |  |  |     return nodesExtraData[nodeType].availableNextNodes || [] | 
					
						
							|  |  |  |   }, [nodeType, nodesExtraData]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return useMemo(() => { | 
					
						
							|  |  |  |     return { | 
					
						
							|  |  |  |       availablePrevBlocks: availablePrevBlocks.filter((nType) => { | 
					
						
							|  |  |  |         if (isInIteration && (nType === BlockEnum.Iteration || nType === BlockEnum.End)) | 
					
						
							|  |  |  |           return false | 
					
						
							|  |  |  |         return true | 
					
						
							|  |  |  |       }), | 
					
						
							|  |  |  |       availableNextBlocks: availableNextBlocks.filter((nType) => { | 
					
						
							|  |  |  |         if (isInIteration && (nType === BlockEnum.Iteration || nType === BlockEnum.End)) | 
					
						
							|  |  |  |           return false | 
					
						
							|  |  |  |         return true | 
					
						
							|  |  |  |       }), | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }, [isInIteration, availablePrevBlocks, availableNextBlocks]) | 
					
						
							|  |  |  | } |