Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. 'use client'
  2. import React, { useEffect, useState } from 'react'
  3. import { useTranslation } from 'react-i18next'
  4. import { XMarkIcon } from '@heroicons/react/20/solid'
  5. import Loading from '@/app/components/base/loading'
  6. import s from './index.module.css'
  7. import cn from '@/utils/classnames'
  8. import type { CustomFile as File } from '@/models/datasets'
  9. import { fetchFilePreview } from '@/service/common'
  10. type IProps = {
  11. file?: File
  12. hidePreview: () => void
  13. }
  14. const FilePreview = ({
  15. file,
  16. hidePreview,
  17. }: IProps) => {
  18. const { t } = useTranslation()
  19. const [previewContent, setPreviewContent] = useState('')
  20. const [loading, setLoading] = useState(true)
  21. const getPreviewContent = async (fileID: string) => {
  22. try {
  23. const res = await fetchFilePreview({ fileID })
  24. setPreviewContent(res.content)
  25. setLoading(false)
  26. }
  27. catch { }
  28. }
  29. const getFileName = (currentFile?: File) => {
  30. if (!currentFile)
  31. return ''
  32. const arr = currentFile.name.split('.')
  33. return arr.slice(0, -1).join()
  34. }
  35. useEffect(() => {
  36. if (file?.id) {
  37. setLoading(true)
  38. getPreviewContent(file.id)
  39. }
  40. }, [file])
  41. return (
  42. <div className={cn(s.filePreview, 'h-full')}>
  43. <div className={cn(s.previewHeader)}>
  44. <div className={cn(s.title, 'title-md-semi-bold')}>
  45. <span>{t('datasetCreation.stepOne.filePreview')}</span>
  46. <div className='flex h-6 w-6 cursor-pointer items-center justify-center' onClick={hidePreview}>
  47. <XMarkIcon className='h-4 w-4'></XMarkIcon>
  48. </div>
  49. </div>
  50. <div className={cn(s.fileName, 'system-xs-medium')}>
  51. <span>{getFileName(file)}</span><span className={cn(s.filetype)}>.{file?.extension}</span>
  52. </div>
  53. </div>
  54. <div className={cn(s.previewContent)}>
  55. {loading && <Loading type='area' />}
  56. {!loading && (
  57. <div className={cn(s.fileContent, 'body-md-regular')}>{previewContent}</div>
  58. )}
  59. </div>
  60. </div>
  61. )
  62. }
  63. export default FilePreview