Checkpoint: Solution finale pour le feedback instantané lors de l'upload d'attestations : affichage immédiat du nom du fichier sélectionné dans la boîte de dialogue dès la sélection. Le nom reste visible pendant toute la durée de l'upload avec la barre de progression. Cette approche simple et fiable résout définitivement le problème de latence en donnant un feedback visuel instantané à l'utilisateur. Déployé sur le VPS de production.
This commit is contained in:
@@ -27,6 +27,7 @@ function UploadAttestationDialog({
|
|||||||
}) {
|
}) {
|
||||||
const [uploading, setUploading] = useState(false);
|
const [uploading, setUploading] = useState(false);
|
||||||
const [uploadProgress, setUploadProgress] = useState(0);
|
const [uploadProgress, setUploadProgress] = useState(0);
|
||||||
|
const [selectedFileName, setSelectedFileName] = useState<string | null>(null);
|
||||||
const [fileData, setFileData] = useState<{
|
const [fileData, setFileData] = useState<{
|
||||||
nomFichier: string;
|
nomFichier: string;
|
||||||
urlFichier: string;
|
urlFichier: string;
|
||||||
@@ -40,6 +41,7 @@ function UploadAttestationDialog({
|
|||||||
if (open) {
|
if (open) {
|
||||||
setUploading(false);
|
setUploading(false);
|
||||||
setUploadProgress(0);
|
setUploadProgress(0);
|
||||||
|
setSelectedFileName(null);
|
||||||
setFileData(null);
|
setFileData(null);
|
||||||
}
|
}
|
||||||
}, [open]);
|
}, [open]);
|
||||||
@@ -128,6 +130,11 @@ function UploadAttestationDialog({
|
|||||||
<p className="text-lg font-semibold text-blue-600 mb-2">
|
<p className="text-lg font-semibold text-blue-600 mb-2">
|
||||||
Upload en cours...
|
Upload en cours...
|
||||||
</p>
|
</p>
|
||||||
|
{selectedFileName && (
|
||||||
|
<p className="text-sm text-gray-600 font-medium mb-3 px-4 break-all">
|
||||||
|
{selectedFileName}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
<div className="w-full max-w-xs mx-auto">
|
<div className="w-full max-w-xs mx-auto">
|
||||||
<div className="flex justify-between text-sm text-gray-600 mb-2">
|
<div className="flex justify-between text-sm text-gray-600 mb-2">
|
||||||
<span className="font-medium">Progression</span>
|
<span className="font-medium">Progression</span>
|
||||||
@@ -184,15 +191,20 @@ function UploadAttestationDialog({
|
|||||||
const file = e.target.files?.[0];
|
const file = e.target.files?.[0];
|
||||||
if (!file) return;
|
if (!file) return;
|
||||||
|
|
||||||
|
// Afficher IMMÉDIATEMENT le nom du fichier sélectionné
|
||||||
|
setSelectedFileName(file.name);
|
||||||
|
|
||||||
// Validation du type de fichier
|
// Validation du type de fichier
|
||||||
if (file.type !== 'application/pdf') {
|
if (file.type !== 'application/pdf') {
|
||||||
toast.error('Seuls les fichiers PDF sont acceptés');
|
toast.error('Seuls les fichiers PDF sont acceptés');
|
||||||
|
setSelectedFileName(null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validation de la taille du fichier
|
// Validation de la taille du fichier
|
||||||
if (file.size > 10 * 1024 * 1024) {
|
if (file.size > 10 * 1024 * 1024) {
|
||||||
toast.error('Le fichier ne doit pas dépasser 10 Mo');
|
toast.error('Le fichier ne doit pas dépasser 10 Mo');
|
||||||
|
setSelectedFileName(null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
2
todo.md
2
todo.md
@@ -1478,3 +1478,5 @@
|
|||||||
- [x] Restructurer le flux d'upload avec useEffect pour affichage immédiat
|
- [x] Restructurer le flux d'upload avec useEffect pour affichage immédiat
|
||||||
|
|
||||||
- [x] Corriger la latence avec requestAnimationFrame pour affichage avant fetch bloquant
|
- [x] Corriger la latence avec requestAnimationFrame pour affichage avant fetch bloquant
|
||||||
|
|
||||||
|
- [x] Afficher immédiatement le nom du fichier sélectionné dans la boîte de dialogue
|
||||||
|
|||||||
Reference in New Issue
Block a user