index.tsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. 'use client'
  2. import React, { useEffect, useState } from 'react'
  3. import { useTranslation } from 'react-i18next'
  4. import cn from 'classnames'
  5. import { XMarkIcon } from '@heroicons/react/20/solid'
  6. import s from './index.module.css'
  7. import type { File } from '@/models/datasets'
  8. import { fetchFilePreview } from '@/service/common'
  9. type IProps = {
  10. file?: File
  11. notionPage?: any
  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)
  37. getPreviewContent(file.id)
  38. }, [file])
  39. return (
  40. <div className={cn(s.filePreview)}>
  41. <div className={cn(s.previewHeader)}>
  42. <div className={cn(s.title)}>
  43. <span>{t('datasetCreation.stepOne.filePreview')}</span>
  44. <div className='flex items-center justify-center w-6 h-6 cursor-pointer' onClick={hidePreview}>
  45. <XMarkIcon className='h-4 w-4'></XMarkIcon>
  46. </div>
  47. </div>
  48. <div className={cn(s.fileName)}>
  49. <span>{getFileName(file)}</span><span className={cn(s.filetype)}>.{file?.extension}</span>
  50. </div>
  51. </div>
  52. <div className={cn(s.previewContent)}>
  53. {loading && <div className={cn(s.loading)}/>}
  54. {!loading && (
  55. <div className={cn(s.fileContent)}>{previewContent}</div>
  56. )}
  57. </div>
  58. </div>
  59. )
  60. }
  61. export default FilePreview