You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

tabs.tsx 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. import type { FC } from 'react'
  2. import { memo } from 'react'
  3. import { useAllBuiltInTools, useAllCustomTools, useAllMCPTools, useAllWorkflowTools } from '@/service/use-tools'
  4. import type {
  5. BlockEnum,
  6. NodeDefault,
  7. OnSelectBlock,
  8. ToolWithProvider,
  9. } from '../types'
  10. import { TabsEnum } from './types'
  11. import Blocks from './blocks'
  12. import AllTools from './all-tools'
  13. import DataSources from './data-sources'
  14. import cn from '@/utils/classnames'
  15. export type TabsProps = {
  16. activeTab: TabsEnum
  17. onActiveTabChange: (activeTab: TabsEnum) => void
  18. searchText: string
  19. tags: string[]
  20. onSelect: OnSelectBlock
  21. availableBlocksTypes?: BlockEnum[]
  22. blocks: NodeDefault[]
  23. dataSources?: ToolWithProvider[]
  24. tabs: Array<{
  25. key: TabsEnum
  26. name: string
  27. }>
  28. filterElem: React.ReactNode
  29. noBlocks?: boolean
  30. noTools?: boolean
  31. }
  32. const Tabs: FC<TabsProps> = ({
  33. activeTab,
  34. onActiveTabChange,
  35. tags,
  36. searchText,
  37. onSelect,
  38. availableBlocksTypes,
  39. blocks,
  40. dataSources = [],
  41. tabs = [],
  42. filterElem,
  43. noBlocks,
  44. noTools,
  45. }) => {
  46. const { data: buildInTools } = useAllBuiltInTools()
  47. const { data: customTools } = useAllCustomTools()
  48. const { data: workflowTools } = useAllWorkflowTools()
  49. const { data: mcpTools } = useAllMCPTools()
  50. return (
  51. <div onClick={e => e.stopPropagation()}>
  52. {
  53. !noBlocks && (
  54. <div className='relative flex bg-background-section-burn pl-1 pt-1'>
  55. {
  56. tabs.map(tab => (
  57. <div
  58. key={tab.key}
  59. className={cn(
  60. 'system-sm-medium relative mr-0.5 flex h-8 cursor-pointer items-center rounded-t-lg px-3 ',
  61. activeTab === tab.key
  62. ? 'sm-no-bottom cursor-default bg-components-panel-bg text-text-accent'
  63. : 'text-text-tertiary',
  64. )}
  65. onClick={() => onActiveTabChange(tab.key)}
  66. >
  67. {tab.name}
  68. </div>
  69. ))
  70. }
  71. </div>
  72. )
  73. }
  74. {filterElem}
  75. {
  76. activeTab === TabsEnum.Blocks && !noBlocks && (
  77. <div className='border-t border-divider-subtle'>
  78. <Blocks
  79. searchText={searchText}
  80. onSelect={onSelect}
  81. availableBlocksTypes={availableBlocksTypes}
  82. blocks={blocks}
  83. />
  84. </div>
  85. )
  86. }
  87. {
  88. activeTab === TabsEnum.Sources && !!dataSources.length && (
  89. <div className='border-t border-divider-subtle'>
  90. <DataSources
  91. searchText={searchText}
  92. onSelect={onSelect}
  93. dataSources={dataSources}
  94. />
  95. </div>
  96. )
  97. }
  98. {
  99. activeTab === TabsEnum.Tools && !noTools && (
  100. <AllTools
  101. searchText={searchText}
  102. onSelect={onSelect}
  103. tags={tags}
  104. canNotSelectMultiple
  105. buildInTools={buildInTools || []}
  106. customTools={customTools || []}
  107. workflowTools={workflowTools || []}
  108. mcpTools={mcpTools || []}
  109. canChooseMCPTool
  110. />
  111. )
  112. }
  113. </div>
  114. )
  115. }
  116. export default memo(Tabs)