import { WebApplication } from '@/Application/Application' import { getBase64FromBlob } from '@/Utils' import { FileItem } 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 { ImageZoomLevelProps } from './ImageZoomLevelProps' import { PreviewableTextFileTypes, RequiresNativeFilePreview } from './isFilePreviewable' import TextPreview from './TextPreview' type Props = { application: WebApplication file: FileItem bytes: Uint8Array isEmbeddedInSuper: boolean } & ImageZoomLevelProps const PreviewComponent: FunctionComponent = ({ application, file, bytes, isEmbeddedInSuper, imageZoomLevel, setImageZoomLevel, }) => { 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, }), ) void application.mobileDevice().previewFile(fileBase64, file.name) }, [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