'use client' import { useState, useRef } from 'react' import { Card, CardContent } from '@/components/ui/card' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Upload, X, FileText, AlertCircle } from 'lucide-react' interface FileRequirement { id: string label: string description?: string mimeTypes: string[] maxSizeMb?: number required: boolean } interface FileUploadSlotProps { requirement: FileRequirement isLocked: boolean onUpload: (file: File) => void } function formatFileSize(bytes: number): string { if (bytes === 0) return '0 B' const k = 1024 const sizes = ['B', 'KB', 'MB', 'GB'] const i = Math.floor(Math.log(bytes) / Math.log(k)) return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i] } function formatMimeTypes(mimeTypes: string[]): string { const extensions = mimeTypes.map(mime => { const parts = mime.split('/') return parts[1] || mime }) return extensions.join(', ').toUpperCase() } export function FileUploadSlot({ requirement, isLocked, onUpload }: FileUploadSlotProps) { const [selectedFile, setSelectedFile] = useState(null) const [error, setError] = useState(null) const fileInputRef = useRef(null) const handleFileSelect = (event: React.ChangeEvent) => { const file = event.target.files?.[0] if (!file) return setError(null) // Validate file type if (requirement.mimeTypes.length > 0 && !requirement.mimeTypes.includes(file.type)) { setError(`File type not allowed. Accepted types: ${formatMimeTypes(requirement.mimeTypes)}`) return } // Validate file size if (requirement.maxSizeMb) { const maxBytes = requirement.maxSizeMb * 1024 * 1024 if (file.size > maxBytes) { setError(`File size exceeds ${requirement.maxSizeMb} MB limit`) return } } setSelectedFile(file) onUpload(file) } const handleRemove = () => { setSelectedFile(null) setError(null) if (fileInputRef.current) { fileInputRef.current.value = '' } } const handleClick = () => { if (!isLocked) { fileInputRef.current?.click() } } return (

{requirement.label}

{requirement.required && ( Required )} {isLocked && ( Locked )}
{requirement.description && (

{requirement.description}

)}
{requirement.mimeTypes.length > 0 && ( Accepted: {formatMimeTypes(requirement.mimeTypes)} )} {requirement.maxSizeMb && ( • Max size: {requirement.maxSizeMb} MB )}
{/* File preview or upload button */} {selectedFile ? (

{selectedFile.name}

{formatFileSize(selectedFile.size)}

) : (
)} {/* Error message */} {error && (

{error}

)}
) }