'use client' import React from 'react' import { IconLoader2 as Loader2, IconX as X } from '@tabler/icons-react' import { UploadedFile } from '@/lib/types' interface UploadedFileListProps { files: UploadedFile[] onRemove: (index: number) => void } export const UploadedFileList = React.memo(function UploadedFileList({ files, onRemove }: UploadedFileListProps) { return (
{files.map((it, index) => { return ( ) })}
) }) const UploadedFileListItem = React.memo(function UploadedFileListItem({ file, index, onRemove }: { file: UploadedFile index: number onRemove: (index: number) => void }) { const [objectUrl, setObjectUrl] = React.useState< { file: File; url: string } | undefined >() const mediaType = file.mediaType ?? file.file?.type ?? '' const filename = file.name ?? file.file?.name ?? 'file' const isImage = mediaType.startsWith('image/') const imageSrc = file.url && file.status === 'uploaded' ? file.url : objectUrl && objectUrl.file === file.file ? objectUrl.url : undefined React.useEffect(() => { if ((file.url && file.status === 'uploaded') || !file.file) { setObjectUrl(undefined) return } const nextObjectUrl = URL.createObjectURL(file.file) setObjectUrl({ file: file.file, url: nextObjectUrl }) return () => URL.revokeObjectURL(nextObjectUrl) }, [file.file, file.status, file.url]) return (
{isImage && imageSrc ? ( // eslint-disable-next-line @next/next/no-img-element {`file-${index}`} ) : (
{filename.split('.').pop()?.toUpperCase()}
)} {/* Spinner overlay while uploading */} {file.status === 'uploading' && (
)}
{filename}
) })