index.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React from 'react'
  4. import cn from 'classnames'
  5. import { useTranslation } from 'react-i18next'
  6. import TypeIcon from '../type-icon'
  7. import RemoveIcon from '../../base/icons/remove-icon'
  8. import s from './style.module.css'
  9. import type { DataSet } from '@/models/datasets'
  10. import { formatNumber } from '@/utils/format'
  11. import Tooltip from '@/app/components/base/tooltip'
  12. export type ICardItemProps = {
  13. className?: string
  14. config: DataSet
  15. onRemove: (id: string) => void
  16. readonly?: boolean
  17. }
  18. const CardItem: FC<ICardItemProps> = ({
  19. className,
  20. config,
  21. onRemove,
  22. readonly,
  23. }) => {
  24. const { t } = useTranslation()
  25. return (
  26. <div
  27. className={
  28. cn(className, s.card,
  29. 'flex items-center justify-between rounded-xl px-3 py-2.5 bg-white border border-gray-200 cursor-pointer')
  30. }>
  31. <div className='shrink-0 flex items-center space-x-2'>
  32. <div className={cn(!config.embedding_available && 'opacity-50')}>
  33. <TypeIcon type="upload_file" />
  34. </div>
  35. <div>
  36. <div className='flex items-center w-[160px] mr-1'>
  37. <div className={cn('text-[13px] leading-[18px] font-medium text-gray-800 overflow-hidden text-ellipsis whitespace-nowrap', !config.embedding_available && 'opacity-50')}>{config.name}</div>
  38. {!config.embedding_available && (
  39. <Tooltip
  40. selector={`unavailable-tag-${config.id}`}
  41. htmlContent={t('dataset.unavailableTip')}
  42. >
  43. <span className='shrink-0 inline-flex whitespace-nowrap px-1 border boder-gray-200 rounded-md text-gray-500 text-xs font-normal leading-[18px]'>{t('dataset.unavailable')}</span>
  44. </Tooltip>
  45. )}
  46. </div>
  47. <div className={cn('flex text-xs text-gray-500', !config.embedding_available && 'opacity-50')}>
  48. {formatNumber(config.word_count)} {t('appDebug.feature.dataSet.words')} · {formatNumber(config.document_count)} {t('appDebug.feature.dataSet.textBlocks')}
  49. </div>
  50. </div>
  51. </div>
  52. {!readonly && <RemoveIcon className={`${s.deleteBtn} shrink-0`} onClick={() => onRemove(config.id)} />}
  53. </div>
  54. )
  55. }
  56. export default React.memo(CardItem)