import type { FolderEntry } from '@/lib/client-types' import { validateFolder } from '@/lib/validate-folder' interface FolderDropzoneProps { isUploading: boolean onFolderSelected: (entry: FolderEntry) => void onError: (message: string) => void } export default function FolderDropzone({ isUploading, onFolderSelected, onError, }: FolderDropzoneProps) { const handleChange = (e: React.ChangeEvent) => { const selected = e.target.files if (!selected || selected.length === 0) return const fileArray = Array.from(selected) const folderName = fileArray[0].webkitRelativePath?.split('/')[0] || 'folder' const validation = validateFolder(fileArray) if (validation.errors.length > 0) { onError(validation.errors.join(' | ')) return } const entry: FolderEntry = { folderName, modelFile: validation.model!, textures: validation.textures, status: 'pending', progress: 0, warnings: validation.warnings, modelUrl: URL.createObjectURL(validation.model!), viewerOpen: true, } onFolderSelected(entry) } return ( <> )} multiple className="hidden" onChange={handleChange} />
document.getElementById('folder-input')?.click()} className={` relative border-2 border-dashed rounded-2xl p-8 text-center cursor-pointer transition-all duration-200 bg-black-800 ${isUploading ? 'cursor-not-allowed opacity-60 border-white/20' : ''} ${!isUploading ? 'border-white/30 hover:border-white/50 hover:bg-black-700' : ''} `} >

Deposez votre dossier ici ou cliquez pour parcourir

Contenu attendu : model.glb/gltf + textures (roughness, normal, metalness, color, displace)

) }