'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

) : (
{filename.split('.').pop()?.toUpperCase()}
)}
{/* Spinner overlay while uploading */}
{file.status === 'uploading' && (
)}
{filename}
)
})