| 
									
										
										
										
											2024-05-27 21:57:08 +08:00
										 |  |  | import { | 
					
						
							|  |  |  |   useMemo, | 
					
						
							|  |  |  |   useState, | 
					
						
							|  |  |  | } from 'react' | 
					
						
							|  |  |  | import type { | 
					
						
							|  |  |  |   OnSelectBlock, | 
					
						
							|  |  |  |   ToolWithProvider, | 
					
						
							|  |  |  | } from '../types' | 
					
						
							|  |  |  | import { useStore } from '../store' | 
					
						
							|  |  |  | import { ToolTypeEnum } from './types' | 
					
						
							|  |  |  | import Tools from './tools' | 
					
						
							|  |  |  | import { useToolTabs } from './hooks' | 
					
						
							| 
									
										
										
										
											2024-07-09 15:05:40 +08:00
										 |  |  | import cn from '@/utils/classnames' | 
					
						
							| 
									
										
										
										
											2024-05-27 21:57:08 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | type AllToolsProps = { | 
					
						
							|  |  |  |   searchText: string | 
					
						
							|  |  |  |   onSelect: OnSelectBlock | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | const AllTools = ({ | 
					
						
							|  |  |  |   searchText, | 
					
						
							|  |  |  |   onSelect, | 
					
						
							|  |  |  | }: AllToolsProps) => { | 
					
						
							|  |  |  |   const tabs = useToolTabs() | 
					
						
							|  |  |  |   const [activeTab, setActiveTab] = useState(ToolTypeEnum.All) | 
					
						
							|  |  |  |   const buildInTools = useStore(s => s.buildInTools) | 
					
						
							|  |  |  |   const customTools = useStore(s => s.customTools) | 
					
						
							|  |  |  |   const workflowTools = useStore(s => s.workflowTools) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-11 11:32:41 +08:00
										 |  |  |   const isMatchingKeywords = (text: string, keywords: string) => { | 
					
						
							|  |  |  |     return text.toLowerCase().includes(keywords.toLowerCase()) | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-27 21:57:08 +08:00
										 |  |  |   const tools = useMemo(() => { | 
					
						
							|  |  |  |     let mergedTools: ToolWithProvider[] = [] | 
					
						
							|  |  |  |     if (activeTab === ToolTypeEnum.All) | 
					
						
							| 
									
										
										
										
											2024-05-29 13:04:23 +08:00
										 |  |  |       mergedTools = [...buildInTools, ...customTools, ...workflowTools] | 
					
						
							| 
									
										
										
										
											2024-05-27 21:57:08 +08:00
										 |  |  |     if (activeTab === ToolTypeEnum.BuiltIn) | 
					
						
							|  |  |  |       mergedTools = buildInTools | 
					
						
							|  |  |  |     if (activeTab === ToolTypeEnum.Custom) | 
					
						
							|  |  |  |       mergedTools = customTools | 
					
						
							|  |  |  |     if (activeTab === ToolTypeEnum.Workflow) | 
					
						
							|  |  |  |       mergedTools = workflowTools | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return mergedTools.filter((toolWithProvider) => { | 
					
						
							| 
									
										
										
										
											2024-11-11 11:32:41 +08:00
										 |  |  |       return isMatchingKeywords(toolWithProvider.name, searchText) | 
					
						
							| 
									
										
										
										
											2024-12-17 12:20:49 +08:00
										 |  |  |         || toolWithProvider.tools.some((tool) => { | 
					
						
							|  |  |  |           return Object.values(tool.label).some((label) => { | 
					
						
							|  |  |  |             return isMatchingKeywords(label, searchText) | 
					
						
							|  |  |  |           }) | 
					
						
							| 
									
										
										
										
											2024-11-11 11:32:41 +08:00
										 |  |  |         }) | 
					
						
							| 
									
										
										
										
											2024-05-27 21:57:08 +08:00
										 |  |  |     }) | 
					
						
							| 
									
										
										
										
											2024-11-11 11:32:41 +08:00
										 |  |  |   }, [activeTab, buildInTools, customTools, workflowTools, searchText]) | 
					
						
							| 
									
										
										
										
											2024-05-27 21:57:08 +08:00
										 |  |  |   return ( | 
					
						
							|  |  |  |     <div> | 
					
						
							| 
									
										
										
										
											2024-12-17 12:20:49 +08:00
										 |  |  |       <div className='flex items-center px-3 h-8 space-x-1 bg-background-default-hover border-b-[0.5px] border-divider-subtle shadow-xs'> | 
					
						
							| 
									
										
										
										
											2024-05-27 21:57:08 +08:00
										 |  |  |         { | 
					
						
							|  |  |  |           tabs.map(tab => ( | 
					
						
							|  |  |  |             <div | 
					
						
							|  |  |  |               className={cn( | 
					
						
							| 
									
										
										
										
											2024-12-17 12:20:49 +08:00
										 |  |  |                 'flex items-center px-2 h-6 rounded-md hover:bg-state-base-hover-alt cursor-pointer', | 
					
						
							|  |  |  |                 'system-xs-medium text-text-tertiary', | 
					
						
							|  |  |  |                 activeTab === tab.key && 'system-xs-semibold bg-state-base-hover-alt text-text-primary', | 
					
						
							| 
									
										
										
										
											2024-05-27 21:57:08 +08:00
										 |  |  |               )} | 
					
						
							|  |  |  |               key={tab.key} | 
					
						
							|  |  |  |               onClick={() => setActiveTab(tab.key)} | 
					
						
							|  |  |  |             > | 
					
						
							|  |  |  |               {tab.name} | 
					
						
							|  |  |  |             </div> | 
					
						
							|  |  |  |           )) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |       <Tools | 
					
						
							|  |  |  |         showWorkflowEmpty={activeTab === ToolTypeEnum.Workflow} | 
					
						
							|  |  |  |         tools={tools} | 
					
						
							|  |  |  |         onSelect={onSelect} | 
					
						
							|  |  |  |       /> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default AllTools |