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ů.

file-preview.tsx 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. 'use client'
  2. import React, { useMemo } from 'react'
  3. import { useTranslation } from 'react-i18next'
  4. import Loading from './loading'
  5. import type { CustomFile as File } from '@/models/datasets'
  6. import { RiCloseLine } from '@remixicon/react'
  7. import { useFilePreview } from '@/service/use-common'
  8. import DocumentFileIcon from '../../../common/document-file-icon'
  9. import { formatFileSize, formatNumberAbbreviated } from '@/utils/format'
  10. type FilePreviewProps = {
  11. file: File
  12. hidePreview: () => void
  13. }
  14. const FilePreview = ({
  15. file,
  16. hidePreview,
  17. }: FilePreviewProps) => {
  18. const { t } = useTranslation()
  19. const { data: fileData, isFetching } = useFilePreview(file.id || '')
  20. const fileName = useMemo(() => {
  21. if (!file)
  22. return ''
  23. const arr = file.name.split('.')
  24. return arr.slice(0, -1).join()
  25. }, [file])
  26. return (
  27. <div className='flex h-full w-full flex-col rounded-t-xl border-l border-t border-components-panel-border bg-background-default-lighter shadow-md shadow-shadow-shadow-5'>
  28. <div className='flex gap-x-2 border-b border-divider-subtle pb-3 pl-6 pr-4 pt-4'>
  29. <div className='flex grow flex-col gap-y-1'>
  30. <div className='system-2xs-semibold-uppercase text-text-accent'>{t('datasetPipeline.addDocuments.stepOne.preview')}</div>
  31. <div className='title-md-semi-bold text-tex-primary'>{`${fileName}.${file.extension || ''}`}</div>
  32. <div className='system-xs-medium flex items-center gap-x-1 text-text-tertiary'>
  33. <DocumentFileIcon
  34. className='size-3.5 shrink-0'
  35. name={file.name}
  36. extension={file.extension}
  37. />
  38. <span className='uppercase'>{file.extension}</span>
  39. <span>·</span>
  40. <span>{formatFileSize(file.size)}</span>
  41. {fileData && (
  42. <>
  43. <span>·</span>
  44. <span>{`${formatNumberAbbreviated(fileData.content.length)} ${t('datasetPipeline.addDocuments.characters')}`}</span>
  45. </>
  46. )}
  47. </div>
  48. </div>
  49. <button
  50. type='button'
  51. className='flex h-8 w-8 shrink-0 items-center justify-center'
  52. onClick={hidePreview}
  53. >
  54. <RiCloseLine className='size-[18px]' />
  55. </button>
  56. </div>
  57. {isFetching && (
  58. <div className='grow'>
  59. <Loading />
  60. </div>
  61. )}
  62. {!isFetching && fileData && (
  63. <div className='body-md-regular grow overflow-hidden px-6 py-5 text-text-secondary'>
  64. {fileData.content}
  65. </div>
  66. )}
  67. </div>
  68. )
  69. }
  70. export default FilePreview