| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 | 
							- import {
 
-   useCallback,
 
-   useMemo,
 
- } from 'react'
 
- import { useTranslation } from 'react-i18next'
 
- import { useStoreApi } from 'reactflow'
 
- import type {
 
-   Edge,
 
-   Node,
 
- } from '../types'
 
- import { BlockEnum } from '../types'
 
- import { useStore } from '../store'
 
- import {
 
-   getToolCheckParams,
 
-   getValidTreeNodes,
 
- } from '../utils'
 
- import {
 
-   CUSTOM_NODE,
 
-   MAX_TREE_DEEPTH,
 
- } from '../constants'
 
- import type { ToolNodeType } from '../nodes/tool/types'
 
- import { useIsChatMode } from './use-workflow'
 
- import { useNodesExtraData } from './use-nodes-data'
 
- import { useToastContext } from '@/app/components/base/toast'
 
- import { CollectionType } from '@/app/components/tools/types'
 
- import { useGetLanguage } from '@/context/i18n'
 
- export const useChecklist = (nodes: Node[], edges: Edge[]) => {
 
-   const { t } = useTranslation()
 
-   const language = useGetLanguage()
 
-   const nodesExtraData = useNodesExtraData()
 
-   const isChatMode = useIsChatMode()
 
-   const buildInTools = useStore(s => s.buildInTools)
 
-   const customTools = useStore(s => s.customTools)
 
-   const workflowTools = useStore(s => s.workflowTools)
 
-   const needWarningNodes = useMemo(() => {
 
-     const list = []
 
-     const { validNodes } = getValidTreeNodes(nodes.filter(node => node.type === CUSTOM_NODE), edges)
 
-     for (let i = 0; i < nodes.length; i++) {
 
-       const node = nodes[i]
 
-       let toolIcon
 
-       let moreDataForCheckValid
 
-       if (node.data.type === BlockEnum.Tool) {
 
-         const { provider_type } = node.data
 
-         moreDataForCheckValid = getToolCheckParams(node.data as ToolNodeType, buildInTools, customTools, workflowTools, language)
 
-         if (provider_type === CollectionType.builtIn)
 
-           toolIcon = buildInTools.find(tool => tool.id === node.data.provider_id)?.icon
 
-         if (provider_type === CollectionType.custom)
 
-           toolIcon = customTools.find(tool => tool.id === node.data.provider_id)?.icon
 
-         if (provider_type === CollectionType.workflow)
 
-           toolIcon = workflowTools.find(tool => tool.id === node.data.provider_id)?.icon
 
-       }
 
-       if (node.type === CUSTOM_NODE) {
 
-         const { errorMessage } = nodesExtraData[node.data.type].checkValid(node.data, t, moreDataForCheckValid)
 
-         if (errorMessage || !validNodes.find(n => n.id === node.id)) {
 
-           list.push({
 
-             id: node.id,
 
-             type: node.data.type,
 
-             title: node.data.title,
 
-             toolIcon,
 
-             unConnected: !validNodes.find(n => n.id === node.id),
 
-             errorMessage,
 
-           })
 
-         }
 
-       }
 
-     }
 
-     if (isChatMode && !nodes.find(node => node.data.type === BlockEnum.Answer)) {
 
-       list.push({
 
-         id: 'answer-need-added',
 
-         type: BlockEnum.Answer,
 
-         title: t('workflow.blocks.answer'),
 
-         errorMessage: t('workflow.common.needAnswerNode'),
 
-       })
 
-     }
 
-     if (!isChatMode && !nodes.find(node => node.data.type === BlockEnum.End)) {
 
-       list.push({
 
-         id: 'end-need-added',
 
-         type: BlockEnum.End,
 
-         title: t('workflow.blocks.end'),
 
-         errorMessage: t('workflow.common.needEndNode'),
 
-       })
 
-     }
 
-     return list
 
-   }, [t, nodes, edges, nodesExtraData, buildInTools, customTools, workflowTools, language, isChatMode])
 
-   return needWarningNodes
 
- }
 
- export const useChecklistBeforePublish = () => {
 
-   const { t } = useTranslation()
 
-   const language = useGetLanguage()
 
-   const buildInTools = useStore(s => s.buildInTools)
 
-   const customTools = useStore(s => s.customTools)
 
-   const workflowTools = useStore(s => s.workflowTools)
 
-   const { notify } = useToastContext()
 
-   const isChatMode = useIsChatMode()
 
-   const store = useStoreApi()
 
-   const nodesExtraData = useNodesExtraData()
 
-   const handleCheckBeforePublish = useCallback(() => {
 
-     const {
 
-       getNodes,
 
-       edges,
 
-     } = store.getState()
 
-     const nodes = getNodes().filter(node => node.type === CUSTOM_NODE)
 
-     const {
 
-       validNodes,
 
-       maxDepth,
 
-     } = getValidTreeNodes(nodes.filter(node => node.type === CUSTOM_NODE), edges)
 
-     if (maxDepth > MAX_TREE_DEEPTH) {
 
-       notify({ type: 'error', message: t('workflow.common.maxTreeDepth', { depth: MAX_TREE_DEEPTH }) })
 
-       return false
 
-     }
 
-     for (let i = 0; i < nodes.length; i++) {
 
-       const node = nodes[i]
 
-       let moreDataForCheckValid
 
-       if (node.data.type === BlockEnum.Tool)
 
-         moreDataForCheckValid = getToolCheckParams(node.data as ToolNodeType, buildInTools, customTools, workflowTools, language)
 
-       const { errorMessage } = nodesExtraData[node.data.type as BlockEnum].checkValid(node.data, t, moreDataForCheckValid)
 
-       if (errorMessage) {
 
-         notify({ type: 'error', message: `[${node.data.title}] ${errorMessage}` })
 
-         return false
 
-       }
 
-       if (!validNodes.find(n => n.id === node.id)) {
 
-         notify({ type: 'error', message: `[${node.data.title}] ${t('workflow.common.needConnecttip')}` })
 
-         return false
 
-       }
 
-     }
 
-     if (isChatMode && !nodes.find(node => node.data.type === BlockEnum.Answer)) {
 
-       notify({ type: 'error', message: t('workflow.common.needAnswerNode') })
 
-       return false
 
-     }
 
-     if (!isChatMode && !nodes.find(node => node.data.type === BlockEnum.End)) {
 
-       notify({ type: 'error', message: t('workflow.common.needEndNode') })
 
-       return false
 
-     }
 
-     return true
 
-   }, [nodesExtraData, notify, t, store, isChatMode, buildInTools, customTools, workflowTools, language])
 
-   return {
 
-     handleCheckBeforePublish,
 
-   }
 
- }
 
 
  |