import { memo, useCallback, useMemo, } from 'react' import produce from 'immer' import { useTranslation } from 'react-i18next' import { useStore } from '../../store' import type { BlockEnum } from '../../types' import type { ToolDefaultValue, ToolInWorkflow, } from '../types' import Item from './item' type ToolsProps = { isCustom?: boolean onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void searchText: string } const Tools = ({ isCustom, onSelect, searchText, }: ToolsProps) => { const { t } = useTranslation() const totalToolsets = useStore(state => state.toolsets) const toolsets = useMemo(() => { return totalToolsets.filter((toolset) => { return toolset.type === (isCustom ? 'api' : 'builtin') && toolset.name.toLowerCase().includes(searchText.toLowerCase()) }) }, [totalToolsets, isCustom, searchText]) const setToolsets = useStore(state => state.setToolsets) const toolsMap = useStore(state => state.toolsMap) const setToolsMap = useStore(state => state.setToolsMap) const handleExpand = useCallback((toolId: string) => { const currentToolset = toolsets.find(toolset => toolset.id === toolId)! if (currentToolset.expanded) { setToolsets(produce(toolsets, (draft) => { const index = draft.findIndex(toolset => toolset.id === toolId) draft[index].expanded = false })) return } if (!currentToolset.expanded) { setToolsets(produce(toolsets, (draft) => { const index = draft.findIndex(toolset => toolset.id === toolId) if (!toolsMap[toolId]?.length && !currentToolset.fetching) draft[index].fetching = true draft[index].expanded = true })) } }, [setToolsets, toolsets, toolsMap]) const handleAddTools = useCallback((toolsetId: string, tools: ToolInWorkflow[]) => { setToolsMap(produce(toolsMap, (draft) => { draft[toolsetId] = tools })) }, [setToolsMap, toolsMap]) const handleFetched = useCallback((toolsetId: string) => { setToolsets(produce(toolsets, (draft) => { const index = draft.findIndex(toolset => toolset.id === toolsetId) draft[index].fetching = false })) }, [setToolsets, toolsets]) return (
{ !toolsets.length && (
{t('workflow.tabs.noResult')}
) } { toolsets.map(toolset => ( )) }
) } export default memo(Tools)