import { memo, useMemo, useState, } from 'react' import { useTranslation } from 'react-i18next' import { getIncomers, getOutgoers, useEdges, useNodes, } from 'reactflow' import BlockIcon from '../block-icon' import { useNodesExtraData, useNodesInteractions, } from '../hooks' import type { CommonNodeType } from '../types' import { BlockEnum } from '../types' import { useStore } from '../store' import { PortalToFollowElem, PortalToFollowElemContent, PortalToFollowElemTrigger, } from '@/app/components/base/portal-to-follow-elem' import { Checklist, ChecklistSquare, XClose, } from '@/app/components/base/icons/src/vender/line/general' import { AlertTriangle } from '@/app/components/base/icons/src/vender/line/alertsAndFeedback' const WorkflowChecklist = () => { const { t } = useTranslation() const [open, setOpen] = useState(false) const nodes = useNodes() const edges = useEdges() const nodesExtraData = useNodesExtraData() const { handleNodeSelect } = useNodesInteractions() const buildInTools = useStore(s => s.buildInTools) const customTools = useStore(s => s.customTools) const needWarningNodes = useMemo(() => { const list = [] for (let i = 0; i < nodes.length; i++) { const node = nodes[i] const incomers = getIncomers(node, nodes, edges) const outgoers = getOutgoers(node, nodes, edges) const { errorMessage } = nodesExtraData[node.data.type].checkValid(node.data, t) let toolIcon if (node.data.type === BlockEnum.Tool) { if (node.data.provider_type === 'builtin') toolIcon = buildInTools.find(tool => tool.id === node.data.provider_id)?.icon if (node.data.provider_type === 'custom') toolIcon = customTools.find(tool => tool.id === node.data.provider_id)?.icon } if (errorMessage || ((!incomers.length && !outgoers.length))) { list.push({ id: node.id, type: node.data.type, title: node.data.title, toolIcon, unConnected: !incomers.length && !outgoers.length, errorMessage, }) } } return list }, [t, nodes, edges, nodesExtraData, buildInTools, customTools]) return ( setOpen(v => !v)}>
{ !!needWarningNodes.length && (
{needWarningNodes.length}
) }
{t('workflow.panel.checklist')}{needWarningNodes.length ? `(${needWarningNodes.length})` : ''}
setOpen(false)} >
{ !!needWarningNodes.length && ( <>
{t('workflow.panel.checklistTip')}
{ needWarningNodes.map(node => (
handleNodeSelect(node.id)} >
{node.title}
{ node.unConnected && (
{t('workflow.common.needConnecttip')}
) } { node.errorMessage && (
{node.errorMessage}
) }
)) }
) } { !needWarningNodes.length && (
{t('workflow.panel.checklistResolved')}
) }
) } export default memo(WorkflowChecklist)