import { memo, useCallback, useMemo, } from 'react' import { useNodes } from 'reactflow' import { useTranslation } from 'react-i18next' import BlockIcon from '../block-icon' import type { BlockEnum, CommonNodeType } from '../types' import { BlockEnum as BlockEnumValues } from '../types' import { useNodesExtraData } from '../hooks' import { START_BLOCKS } from './constants' import type { ToolDefaultValue } from './types' import Tooltip from '@/app/components/base/tooltip' type StartBlocksProps = { searchText: string onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void availableBlocksTypes?: BlockEnum[] } const StartBlocks = ({ searchText, onSelect, availableBlocksTypes = [], }: StartBlocksProps) => { const { t } = useTranslation() const nodes = useNodes() const nodesExtraData = useNodesExtraData() const filteredBlocks = useMemo(() => { // Check if Start node already exists in workflow const hasStartNode = nodes.some(node => (node.data as CommonNodeType)?.type === BlockEnumValues.Start) return START_BLOCKS.filter((block) => { // Hide User Input (Start) if it already exists in workflow if (block.type === BlockEnumValues.Start && hasStartNode) return false // Filter by search text if (!block.title.toLowerCase().includes(searchText.toLowerCase())) return false // availableBlocksTypes now contains properly filtered entry node types from parent return availableBlocksTypes.includes(block.type) }) }, [searchText, availableBlocksTypes, nodes]) const isEmpty = filteredBlocks.length === 0 const renderBlock = useCallback((block: typeof START_BLOCKS[0]) => (
{block.title}
{nodesExtraData[block.type].about}
)} >
onSelect(block.type)} >
{block.title} {block.type === BlockEnumValues.Start && ( {t('workflow.blocks.originalStartNode')} )}
), [nodesExtraData, onSelect, t]) return (
{isEmpty && (
{t('workflow.tabs.noResult')}
)} {!isEmpty && (
{filteredBlocks.map((block, index) => (
{renderBlock(block)} {block.type === BlockEnumValues.Start && index < filteredBlocks.length - 1 && (
)}
))}
)}
) } export default memo(StartBlocks)