import { useParams } from 'common' import { AlertCircle, LoaderCircle, X } from 'lucide-react' import SVG from 'react-inlinesvg' import { Button } from 'ui' import { StorageItemWithColumn } from '../Storage.types' import { useFetchFileUrlQuery } from '../StorageExplorer/useFetchFileUrlQuery' import { useBucketFilePickerStateSnapshot } from './BucketFilePickerState' import { BASE_PATH } from '@/lib/constants' import { formatBytes } from '@/lib/helpers' const PREVIEW_SIZE_LIMIT = 10 * 1024 * 1024 // 10MB const PreviewFile = ({ item }: { item: StorageItemWithColumn }) => { const { ref: projectRef } = useParams() const { bucket, columns } = useBucketFilePickerStateSnapshot() const path = columns.slice(0, item.columnIndex).concat(item.name).join('/') const { data: previewUrl, isPending: isLoading } = useFetchFileUrlQuery({ path, projectRef: projectRef!, bucket, }) // if the size is not available, we set it to be greater than the max size const size = +(item.metadata?.size ?? PREVIEW_SIZE_LIMIT + 1) const mimeType = item.metadata?.mimetype const isSkipped = !!mimeType && !!size && size > PREVIEW_SIZE_LIMIT if (isLoading) { return (
) } if (isSkipped) { return (
code.replace(/svg/, 'svg class="mx-auto w-32 h-32 text-color-inherit opacity-75"') } />

File size is too large to preview in the explorer

) } if (!mimeType || !previewUrl) { return ( code.replace(/svg/, 'svg class="mx-auto w-32 h-32 text-color-inherit opacity-75"') } /> ) } if (mimeType.includes('image')) { return (
) } if (mimeType.includes('audio')) { return (
) } if (mimeType.includes('video')) { return (
) } return ( code.replace(/svg/, 'svg class="mx-auto w-32 h-32 text-color-inherit opacity-75"') } /> ) } export const PreviewPane = ({ onSelect }: { onSelect: (url: string) => void }) => { const { ref: projectRef } = useParams() const { selectedFilePreview: file, setSelectedFilePreview, bucket, columns, } = useBucketFilePickerStateSnapshot() const path = file ? columns.slice(0, file.columnIndex).concat(file.name).join('/') : '' const { data: previewUrl, isLoading } = useFetchFileUrlQuery( { path, projectRef: projectRef!, bucket }, { enabled: !!file } ) if (!file) return null const size = file.metadata ? formatBytes(file.metadata.size) : null const mimeType = file.metadata ? file.metadata.mimetype : undefined const createdAt = file.created_at ? new Date(file.created_at).toLocaleString() : 'Unknown' const updatedAt = file.updated_at ? new Date(file.updated_at).toLocaleString() : 'Unknown' return (
{/* Preview Header */}
setSelectedFilePreview(undefined)} />
{/* Preview Thumbnail*/}
{/* Preview Information */}
{file.name}
{file.isCorrupted && (

File is corrupted, please delete and reupload this file again

)} {mimeType && (

{mimeType} {size && - {size}}

)}
{/* Preview Metadata */}

{createdAt}

{updatedAt}

) }