| 'use client' |
| import React, { useEffect, useState } from 'react' |
| import { useTranslation } from 'react-i18next' |
| import { XMarkIcon } from '@heroicons/react/20/solid' |
| import s from './index.module.css' |
| import cn from '@/utils/classnames' |
| import type { CustomFile as File } from '@/models/datasets' |
| import { fetchFilePreview } from '@/service/common' |
|
|
| type IProps = { |
| file?: File |
| hidePreview: () => void |
| } |
|
|
| const FilePreview = ({ |
| file, |
| hidePreview, |
| }: IProps) => { |
| const { t } = useTranslation() |
| const [previewContent, setPreviewContent] = useState('') |
| const [loading, setLoading] = useState(true) |
|
|
| const getPreviewContent = async (fileID: string) => { |
| try { |
| const res = await fetchFilePreview({ fileID }) |
| setPreviewContent(res.content) |
| setLoading(false) |
| } |
| catch { } |
| } |
|
|
| const getFileName = (currentFile?: File) => { |
| if (!currentFile) |
| return '' |
| const arr = currentFile.name.split('.') |
| return arr.slice(0, -1).join() |
| } |
|
|
| useEffect(() => { |
| if (file?.id) { |
| setLoading(true) |
| getPreviewContent(file.id) |
| } |
| }, [file]) |
|
|
| return ( |
| <div className={cn(s.filePreview)}> |
| <div className={cn(s.previewHeader)}> |
| <div className={cn(s.title)}> |
| <span>{t('datasetCreation.stepOne.filePreview')}</span> |
| <div className='flex items-center justify-center w-6 h-6 cursor-pointer' onClick={hidePreview}> |
| <XMarkIcon className='h-4 w-4'></XMarkIcon> |
| </div> |
| </div> |
| <div className={cn(s.fileName)}> |
| <span>{getFileName(file)}</span><span className={cn(s.filetype)}>.{file?.extension}</span> |
| </div> |
| </div> |
| <div className={cn(s.previewContent)}> |
| {loading && <div className={cn(s.loading)} />} |
| {!loading && ( |
| <div className={cn(s.fileContent)}>{previewContent}</div> |
| )} |
| </div> |
| </div> |
| ) |
| } |
|
|
| export default FilePreview |
|
|