action-item.tsx 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. import { RiCheckLine } from '@remixicon/react'
  14. import Badge from '@/app/components/base/badge'
  15. type Props = {
  16. provider: ToolWithProvider
  17. payload: Tool
  18. disabled?: boolean
  19. onSelect: (type: BlockEnum, tool?: ToolDefaultValue) => void
  20. }
  21. const ToolItem: FC<Props> = ({
  22. provider,
  23. payload,
  24. onSelect,
  25. disabled,
  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 text-text-secondary leading-[18px]'>{payload.description[language]}</div>
  44. </div>
  45. )}
  46. >
  47. <div
  48. key={payload.name}
  49. className='flex justify-between items-center pr-1 rounded-lg pl-[21px] hover:bg-state-base-hover cursor-pointer'
  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. title: payload.label[language],
  65. is_team_authorization: provider.is_team_authorization,
  66. output_schema: payload.output_schema,
  67. paramSchemas: payload.parameters,
  68. params,
  69. })
  70. }}
  71. >
  72. <div className={cn('h-8 leading-8 border-l-2 border-divider-subtle pl-4 truncate text-text-secondary system-sm-medium', disabled && 'opacity-30')}>{payload.label[language]}</div>
  73. {disabled && <Badge
  74. className='flex items-center h-5 text-text-tertiary space-x-0.5'
  75. uppercase
  76. >
  77. <RiCheckLine className='w-3 h-3 ' />
  78. <div>{t('tools.addToolModal.added')}</div>
  79. </Badge>
  80. }
  81. </div>
  82. </Tooltip >
  83. )
  84. }
  85. export default React.memo(ToolItem)