import { WebApplication } from '@/Application/Application' import { concatenateUint8Arrays } from '@/Utils' import { FileItem } from '@standardnotes/snjs' import { useEffect, useMemo, useState } from 'react' import FilePreviewError from './FilePreviewError' import { isFileTypePreviewable } from './isFilePreviewable' import PreviewComponent from './PreviewComponent' type Props = { application: WebApplication file: FileItem } const FilePreview = ({ file, application }: Props) => { const isFilePreviewable = useMemo(() => { return isFileTypePreviewable(file.mimeType) }, [file.mimeType]) const [isDownloading, setIsDownloading] = useState(true) const [downloadProgress, setDownloadProgress] = useState(0) const [downloadedBytes, setDownloadedBytes] = useState() useEffect(() => { if (!isFilePreviewable) { setIsDownloading(false) setDownloadProgress(0) setDownloadedBytes(undefined) return } const downloadFileForPreview = async () => { if (downloadedBytes) { return } setIsDownloading(true) try { const chunks: Uint8Array[] = [] setDownloadProgress(0) await application.files.downloadFile(file, async (decryptedChunk, progress) => { chunks.push(decryptedChunk) if (progress) { setDownloadProgress(Math.round(progress.percentComplete)) } }) const finalDecryptedBytes = concatenateUint8Arrays(chunks) setDownloadedBytes(finalDecryptedBytes) } catch (error) { console.error(error) } finally { setIsDownloading(false) } } void downloadFileForPreview() }, [application.files, downloadedBytes, file, isFilePreviewable]) return isDownloading ? (
{downloadProgress}%
Loading file...
) : downloadedBytes ? ( ) : ( { setDownloadedBytes(undefined) }} isFilePreviewable={isFilePreviewable} /> ) } export default FilePreview