all-tools.tsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import {
  2. useMemo,
  3. useState,
  4. } from 'react'
  5. import type {
  6. OnSelectBlock,
  7. ToolWithProvider,
  8. } from '../types'
  9. import { useStore } from '../store'
  10. import { ToolTypeEnum } from './types'
  11. import Tools from './tools'
  12. import { useToolTabs } from './hooks'
  13. import cn from '@/utils/classnames'
  14. import { useGetLanguage } from '@/context/i18n'
  15. type AllToolsProps = {
  16. searchText: string
  17. onSelect: OnSelectBlock
  18. }
  19. const AllTools = ({
  20. searchText,
  21. onSelect,
  22. }: AllToolsProps) => {
  23. const language = useGetLanguage()
  24. const tabs = useToolTabs()
  25. const [activeTab, setActiveTab] = useState(ToolTypeEnum.All)
  26. const buildInTools = useStore(s => s.buildInTools)
  27. const customTools = useStore(s => s.customTools)
  28. const workflowTools = useStore(s => s.workflowTools)
  29. const tools = useMemo(() => {
  30. let mergedTools: ToolWithProvider[] = []
  31. if (activeTab === ToolTypeEnum.All)
  32. mergedTools = [...buildInTools, ...customTools, ...workflowTools]
  33. if (activeTab === ToolTypeEnum.BuiltIn)
  34. mergedTools = buildInTools
  35. if (activeTab === ToolTypeEnum.Custom)
  36. mergedTools = customTools
  37. if (activeTab === ToolTypeEnum.Workflow)
  38. mergedTools = workflowTools
  39. return mergedTools.filter((toolWithProvider) => {
  40. return toolWithProvider.tools.some((tool) => {
  41. return tool.label[language].toLowerCase().includes(searchText.toLowerCase())
  42. })
  43. })
  44. }, [activeTab, buildInTools, customTools, workflowTools, searchText, language])
  45. return (
  46. <div>
  47. <div className='flex items-center px-3 h-8 space-x-1 bg-gray-25 border-b-[0.5px] border-black/[0.08] shadow-xs'>
  48. {
  49. tabs.map(tab => (
  50. <div
  51. className={cn(
  52. 'flex items-center px-2 h-6 rounded-md hover:bg-gray-100 cursor-pointer',
  53. 'text-xs font-medium text-gray-700',
  54. activeTab === tab.key && 'bg-gray-200',
  55. )}
  56. key={tab.key}
  57. onClick={() => setActiveTab(tab.key)}
  58. >
  59. {tab.name}
  60. </div>
  61. ))
  62. }
  63. </div>
  64. <Tools
  65. showWorkflowEmpty={activeTab === ToolTypeEnum.Workflow}
  66. tools={tools}
  67. onSelect={onSelect}
  68. />
  69. </div>
  70. )
  71. }
  72. export default AllTools