This commit is contained in:
Nicolas Cantu 2025-09-16 05:23:17 +02:00
parent a7c944621e
commit 8e2ac42410
2 changed files with 167 additions and 14 deletions

View File

@ -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) => {

View File

@ -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<Document | null>(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
</Typography>
{/* En-tête avec hash du dossier et boutons */}
<Box sx={{ mb: 3, p: 2, bgcolor: 'grey.50', borderRadius: 1, border: '1px solid', borderColor: 'grey.200' }}>
<Box display="flex" alignItems="center" justifyContent="space-between" flexWrap="wrap" gap={2}>
<Box display="flex" alignItems="center" gap={2}>
<Typography variant="h6" color="text.secondary">
Dossier actuel :
</Typography>
<Box display="flex" alignItems="center" gap={1}>
<Typography
variant="body1"
sx={{
fontFamily: 'monospace',
bgcolor: 'grey.100',
px: 1,
py: 0.5,
borderRadius: 1,
fontSize: '0.875rem'
}}
>
{currentFolderHash || 'Aucun dossier sélectionné'}
</Typography>
{currentFolderHash && (
<Tooltip title="Copier le hash du dossier">
<IconButton size="small" onClick={handleCopyFolderHash}>
<ContentCopy fontSize="small" />
</IconButton>
</Tooltip>
)}
</Box>
</Box>
<Box display="flex" gap={1}>
<Button
variant="outlined"
startIcon={<Add />}
onClick={handleCreateNewFolder}
size="small"
>
Nouveau dossier
</Button>
<Button
variant="outlined"
startIcon={<FolderOpen />}
onClick={() => setDialogOpen(true)}
size="small"
>
Charger dossier
</Button>
</Box>
</Box>
</Box>
{/* Zone de drop */}
<Paper
@ -244,6 +341,45 @@ export default function UploadView() {
onClose={() => setPreviewDocument(null)}
/>
)}
{/* Dialogue pour charger un dossier existant */}
<Dialog open={dialogOpen} onClose={() => setDialogOpen(false)} maxWidth="sm" fullWidth>
<DialogTitle>
<Box display="flex" alignItems="center" gap={1}>
<FolderOpen />
Charger un dossier existant
</Box>
</DialogTitle>
<DialogContent>
<Typography variant="body2" color="text.secondary" sx={{ mb: 2 }}>
Entrez le hash du dossier que vous souhaitez charger. Le hash est un identifiant unique de 32 caractères.
</Typography>
<TextField
autoFocus
margin="dense"
label="Hash du dossier"
placeholder="ex: 0e7ae08a4f14f3154be1bd69d5617c74"
fullWidth
variant="outlined"
value={newFolderHash}
onChange={(e) => setNewFolderHash(e.target.value)}
sx={{ fontFamily: 'monospace' }}
helperText="Le hash doit contenir exactement 32 caractères hexadécimaux"
/>
</DialogContent>
<DialogActions>
<Button onClick={() => setDialogOpen(false)}>
Annuler
</Button>
<Button
onClick={handleLoadFolder}
variant="contained"
disabled={!newFolderHash.trim() || newFolderHash.trim().length !== 32}
>
Charger le dossier
</Button>
</DialogActions>
</Dialog>
</Layout>
)
}