diff --git a/src/store/documentSlice.ts b/src/store/documentSlice.ts index a08408c..f2866c1 100644 --- a/src/store/documentSlice.ts +++ b/src/store/documentSlice.ts @@ -370,6 +370,9 @@ const documentSlice = createSlice({ state.error = action.error.message || 'Erreur lors de la création du dossier par défaut' }) .addCase(loadFolderResults.fulfilled, (state, action) => { + console.log(`[STORE] loadFolderResults.fulfilled appelé avec:`, action.payload) + console.log(`[STORE] Nombre de résultats reçus:`, action.payload.results?.length || 0) + state.folderResults = action.payload.results state.currentFolderHash = action.payload.folderHash state.loading = false @@ -379,17 +382,31 @@ const documentSlice = createSlice({ state.hasPending = action.payload.hasPending || false // Convertir les résultats en documents pour la compatibilité - state.documents = action.payload.results.map((result, index) => ({ - id: result.fileHash, - name: result.document.fileName, - mimeType: result.document.mimeType, - size: 0, // Taille non disponible dans la structure actuelle - uploadDate: new Date(result.document.uploadTimestamp), - status: 'completed' as const, - previewUrl: `blob:folder-${result.fileHash}` - })) + if (action.payload.results && action.payload.results.length > 0) { + state.documents = action.payload.results.map((result, index) => { + console.log(`[STORE] Mapping résultat ${index}:`, { + fileHash: result.fileHash, + fileName: result.document?.fileName, + mimeType: result.document?.mimeType + }) + + return { + id: result.fileHash, + name: result.document.fileName, + mimeType: result.document.mimeType, + size: 0, // Taille non disponible dans la structure actuelle + uploadDate: new Date(result.document.uploadTimestamp), + status: 'completed' as const, + previewUrl: `blob:folder-${result.fileHash}` + } + }) + } else { + console.log(`[STORE] Aucun résultat à mapper`) + state.documents = [] + } console.log(`[STORE] Dossier chargé: ${action.payload.results.length} résultats, ${action.payload.pending?.length || 0} pending`) + console.log(`[STORE] Documents finaux:`, state.documents.length) console.log(`[STORE] Documents mappés:`, state.documents.map(d => ({ id: d.id, name: d.name, status: d.status }))) }) .addCase(loadFolderResults.pending, (state) => { diff --git a/src/views/UploadView.tsx b/src/views/UploadView.tsx index f33126b..9603267 100644 --- a/src/views/UploadView.tsx +++ b/src/views/UploadView.tsx @@ -13,7 +13,14 @@ import { ListItemText, ListItemIcon, Divider, - Card + Card, + TextField, + Dialog, + DialogTitle, + DialogContent, + DialogActions, + IconButton, + Tooltip } from '@mui/material' import { CloudUpload, @@ -23,10 +30,13 @@ import { Visibility, Description, Image, - PictureAsPdf + PictureAsPdf, + FolderOpen, + Add, + ContentCopy } from '@mui/icons-material' import { useAppDispatch, useAppSelector } from '../store' -import { uploadFileToFolderThunk, loadFolderResults, removeDocument } from '../store/documentSlice' +import { uploadFileToFolderThunk, loadFolderResults, removeDocument, createDefaultFolderThunk, setCurrentFolderHash } from '../store/documentSlice' import { Layout } from '../components/Layout' import { FilePreview } from '../components/FilePreview' import type { Document } from '../types' @@ -37,6 +47,42 @@ export default function UploadView() { console.log('🏠 [UPLOAD_VIEW] Component loaded, documents count:', documents.length) const [previewDocument, setPreviewDocument] = useState(null) + const [dialogOpen, setDialogOpen] = useState(false) + const [newFolderHash, setNewFolderHash] = useState('') + + // Fonction pour créer un nouveau dossier + const handleCreateNewFolder = useCallback(async () => { + try { + const result = await dispatch(createDefaultFolderThunk()).unwrap() + console.log('✅ [UPLOAD] Nouveau dossier créé:', result.folderHash) + setDialogOpen(false) + } catch (error) { + console.error('❌ [UPLOAD] Erreur lors de la création du dossier:', error) + } + }, [dispatch]) + + // Fonction pour charger un dossier existant + const handleLoadFolder = useCallback(async () => { + if (!newFolderHash.trim()) return + + try { + dispatch(setCurrentFolderHash(newFolderHash.trim())) + await dispatch(loadFolderResults(newFolderHash.trim())).unwrap() + console.log('✅ [UPLOAD] Dossier chargé:', newFolderHash.trim()) + setDialogOpen(false) + setNewFolderHash('') + } catch (error) { + console.error('❌ [UPLOAD] Erreur lors du chargement du dossier:', error) + } + }, [dispatch, newFolderHash]) + + // Fonction pour copier le hash du dossier + const handleCopyFolderHash = useCallback(() => { + if (currentFolderHash) { + navigator.clipboard.writeText(currentFolderHash) + console.log('📋 [UPLOAD] Hash du dossier copié:', currentFolderHash) + } + }, [currentFolderHash]) const onDrop = useCallback( async (acceptedFiles: File[]) => { @@ -50,10 +96,10 @@ export default function UploadView() { try { console.log(`📤 [UPLOAD] Upload de ${file.name} dans le dossier ${currentFolderHash}`) await dispatch(uploadFileToFolderThunk({ file, folderHash: currentFolderHash })).unwrap() - + // Recharger les résultats du dossier après upload await dispatch(loadFolderResults(currentFolderHash)).unwrap() - + console.log(`✅ [UPLOAD] ${file.name} uploadé avec succès`) } catch (error) { console.error(`❌ [UPLOAD] Erreur lors du traitement de ${file.name}:`, error) @@ -118,6 +164,57 @@ export default function UploadView() { Analyse de documents 4NK IA + {/* En-tête avec hash du dossier et boutons */} + + + + + Dossier actuel : + + + + {currentFolderHash || 'Aucun dossier sélectionné'} + + {currentFolderHash && ( + + + + + + )} + + + + + + + + + {/* Zone de drop */} setPreviewDocument(null)} /> )} + + {/* Dialogue pour charger un dossier existant */} + setDialogOpen(false)} maxWidth="sm" fullWidth> + + + + Charger un dossier existant + + + + + Entrez le hash du dossier que vous souhaitez charger. Le hash est un identifiant unique de 32 caractères. + + setNewFolderHash(e.target.value)} + sx={{ fontFamily: 'monospace' }} + helperText="Le hash doit contenir exactement 32 caractères hexadécimaux" + /> + + + + + + ) }