import { WebApplication } from '@/Application/WebApplication' import { getBase64FromBlob } from '@/Utils' import { FileItem, classNames } from '@standardnotes/snjs' import { FunctionComponent, useCallback, useEffect, useMemo, useRef } from 'react' import Button from '../Button/Button' import { createObjectURLWithRef } from './CreateObjectURLWithRef' import ImagePreview from './ImagePreview' import { OptionalSuperEmbeddedImageProps } from './OptionalSuperEmbeddedImageProps' import { PreviewableTextFileTypes, RequiresNativeFilePreview } from './isFilePreviewable' import TextPreview from './TextPreview' import { parseFileName, sanitizeFileName } from '@standardnotes/utils' import VideoPreview from './VideoPreview' type Props = { application: WebApplication file: FileItem bytes: Uint8Array isEmbeddedInSuper: boolean } & OptionalSuperEmbeddedImageProps const PreviewComponent: FunctionComponent = ({ application, file, bytes, isEmbeddedInSuper, imageZoomLevel, setImageZoomLevel, alignment, changeAlignment, }) => { const objectUrlRef = useRef() const objectUrl = useMemo(() => { return createObjectURLWithRef(file.mimeType, bytes, objectUrlRef) }, [bytes, file.mimeType]) useEffect(() => { const objectUrl = objectUrlRef.current return () => { if (objectUrl) { URL.revokeObjectURL(objectUrl) objectUrlRef.current = '' } } }, []) const isNativeMobileWeb = application.isNativeMobileWeb() const requiresNativePreview = RequiresNativeFilePreview.includes(file.mimeType) const openNativeFilePreview = useCallback(async () => { if (!isNativeMobileWeb) { throw new Error('Native file preview cannot be used on non-native platform') } const fileBase64 = await getBase64FromBlob( new Blob([bytes], { type: file.mimeType, }), ) const { name, ext } = parseFileName(file.name) const sanitizedName = sanitizeFileName(name) const filename = `${sanitizedName}.${ext}` void application.mobileDevice.previewFile(fileBase64, filename) }, [application, bytes, file.mimeType, file.name, isNativeMobileWeb]) if (isNativeMobileWeb && requiresNativePreview) { return (
This file can only be previewed in an external app
) } if (file.mimeType.startsWith('image/')) { return ( ) } if (file.mimeType.startsWith('video/')) { return ( ) } if (file.mimeType.startsWith('audio/')) { return (
) } if (PreviewableTextFileTypes.includes(file.mimeType)) { return } const isPDF = file.mimeType === 'application/pdf' return ( ) } export default PreviewComponent