Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

tabs.tsx 3.4KB

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