'use client' import type { FolderEntry } from '@/lib/client-types' import { revokeEntryUrls } from '@/lib/client-object-urls' import { useSecret } from '@/hooks/useSecret' import { useFolderEntries } from '@/hooks/useFolderEntries' import { useUploadOrchestrator } from '@/hooks/useUploadOrchestrator' import SecretInput from './upload/SecretInput' import FolderDropzone from './upload/FolderDropzone' import FolderCard from './upload/FolderCard' import ActionButtons from './upload/ActionButtons' import OverwriteConfirmModal from './upload/OverwriteConfirmModal' import NoChangesModal from './upload/NoChangesModal' import DriveErrorModal from './upload/DriveErrorModal' export default function UploadZone() { const { secret, secretError, secretVisible, isSecretEmpty, setSecretError, handleSecretChange, toggleSecretVisible, } = useSecret() const { entries, setEntries, updateEntry, removeEntry, resetEntries, allDone, hasErrors, } = useFolderEntries() const { isUploading, isChecking, isResolvingDriveError, globalError, setGlobalError, overwriteConfirm, setOverwriteConfirm, noChangesFolder, setNoChangesFolder, driveError, handleUpload, handleOverwriteCancel, handleDriveContinue, handleDriveCancel, handleCancel, handleReset, proceedUpload, } = useUploadOrchestrator({ secret, setSecretError, entries, updateEntry, resetEntries, }) const handleFolderSelected = (entry: FolderEntry) => { entries.forEach(revokeEntryUrls) setGlobalError(null) setEntries([entry]) } const handleToggleViewer = (index: number) => { const entry = entries[index] if (entry?.modelUrl) { updateEntry(index, { viewerOpen: !entry.viewerOpen }) } } const hasPendingOrErrors = entries.some((f) => f.status === 'pending' || f.status === 'error') return (
Deposez un dossier complet contenant votre modele 3D nomme {' '}model.gltf {' '}ainsi que toutes les textures et fichiers binaires necessaires. {' '}Les fichiers associes peuvent etre en {' '}.png, {' '}.jpg {' '}.webp {' '}ou .bin. {' '}Utilisez un nom simple si la texture s'applique au modele entier, et un nom detaille si elle correspond a une partie precise du modele, {' '}par exemple color_porte.jpg, {' '}roughness_tuyaux.png, {' '}normal_dashboard.webp {' '}ou opacity_fenetre.png. {' '}Les exports classiques comme porte_baseColor.png {' '}ou porte_normal_opengl.png sont normalises automatiquement pour Git.
)} {entries.length > 0 && (Plus votre dossier est volumineux et contient de nombreux fichiers, {' '}plus l'upload peut prendre du temps. {' '}L'envoi se fait en 3 etapes : {' '}verification du dossier existant, {' '}archivage sur le Drive, {' '}puis envoi sur Git. {' '}Soyez patient pendant le traitement, surtout pour les gros assets !
)}{globalError}
)} {entries.length > 0 && (