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.

action-item.tsx 2.9KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React from 'react'
  4. import type { ToolWithProvider } from '../../types'
  5. import { BlockEnum } from '../../types'
  6. import type { ToolDefaultValue } from '../types'
  7. import Tooltip from '@/app/components/base/tooltip'
  8. import type { Tool } from '@/app/components/tools/types'
  9. import { useGetLanguage } from '@/context/i18n'
  10. import BlockIcon from '../../block-icon'
  11. import cn from '@/utils/classnames'
  12. import { useTranslation } from 'react-i18next'
  13. type Props = {
  14. provider: ToolWithProvider
  15. payload: Tool
  16. disabled?: boolean
  17. isAdded?: boolean
  18. onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void
  19. }
  20. const ToolItem: FC<Props> = ({
  21. provider,
  22. payload,
  23. onSelect,
  24. disabled,
  25. isAdded,
  26. }) => {
  27. const { t } = useTranslation()
  28. const language = useGetLanguage()
  29. return (
  30. <Tooltip
  31. key={payload.name}
  32. position='right'
  33. popupClassName='!p-0 !px-3 !py-2.5 !w-[200px] !leading-[18px] !text-xs !text-gray-700 !border-[0.5px] !border-black/5 !rounded-xl !shadow-lg'
  34. popupContent={(
  35. <div>
  36. <BlockIcon
  37. size='md'
  38. className='mb-2'
  39. type={BlockEnum.Tool}
  40. toolIcon={provider.icon}
  41. />
  42. <div className='mb-1 text-sm leading-5 text-text-primary'>{payload.label[language]}</div>
  43. <div className='text-xs leading-[18px] text-text-secondary'>{payload.description[language]}</div>
  44. </div>
  45. )}
  46. >
  47. <div
  48. key={payload.name}
  49. className='flex cursor-pointer items-center justify-between rounded-lg pl-[21px] pr-1 hover:bg-state-base-hover'
  50. onClick={() => {
  51. if (disabled) return
  52. const params: Record<string, string> = {}
  53. if (payload.parameters) {
  54. payload.parameters.forEach((item) => {
  55. params[item.name] = ''
  56. })
  57. }
  58. onSelect(BlockEnum.Tool, {
  59. provider_id: provider.id,
  60. provider_type: provider.type,
  61. provider_name: provider.name,
  62. tool_name: payload.name,
  63. tool_label: payload.label[language],
  64. tool_description: payload.description[language],
  65. title: payload.label[language],
  66. is_team_authorization: provider.is_team_authorization,
  67. output_schema: payload.output_schema,
  68. paramSchemas: payload.parameters,
  69. params,
  70. meta: provider.meta,
  71. })
  72. }}
  73. >
  74. <div className={cn('system-sm-medium h-8 truncate border-l-2 border-divider-subtle pl-4 leading-8 text-text-secondary')}>
  75. <span className={cn(disabled && 'opacity-30')}>{payload.label[language]}</span>
  76. </div>
  77. {isAdded && (
  78. <div className='system-xs-regular mr-4 text-text-tertiary'>{t('tools.addToolModal.added')}</div>
  79. )}
  80. </div>
  81. </Tooltip >
  82. )
  83. }
  84. export default React.memo(ToolItem)