4NK_IA_front/src/App.tsx
Nicolas Cantu a7c944621e backend
2025-09-16 05:18:29 +02:00

105 lines
3.5 KiB
TypeScript

import { useEffect, useCallback } from 'react'
import './App.css'
import { AppRouter } from './router'
import { useAppDispatch, useAppSelector } from './store'
import {
createDefaultFolderThunk,
loadFolderResults,
setCurrentFolderHash,
setBootstrapped,
setPollingInterval,
stopPolling
} from './store/documentSlice'
export default function App() {
const dispatch = useAppDispatch()
const { documents, bootstrapped, currentFolderHash, folderResults, hasPending, pollingInterval } = useAppSelector((state) => state.document)
// Bootstrap au démarrage de l'application avec système de dossiers
useEffect(() => {
console.log('🔍 [APP] useEffect déclenché:', {
documentsLength: documents.length,
bootstrapped,
currentFolderHash,
folderResultsLength: folderResults.length,
isDev: import.meta.env.DEV
})
// Récupérer le hash du dossier depuis l'URL
const urlParams = new URLSearchParams(window.location.search)
const urlFolderHash = urlParams.get('hash')
console.log('🔍 [APP] Hash du dossier depuis URL:', urlFolderHash)
const initializeFolder = async () => {
try {
let folderHash = urlFolderHash || currentFolderHash
// Si pas de hash de dossier, créer le dossier par défaut
if (!folderHash) {
console.log('🚀 [APP] Création du dossier par défaut...')
const result = await dispatch(createDefaultFolderThunk()).unwrap()
folderHash = result.folderHash
console.log('✅ [APP] Dossier par défaut créé:', folderHash)
}
// Charger les résultats du dossier
console.log('📁 [APP] Chargement des résultats du dossier:', folderHash)
await dispatch(loadFolderResults(folderHash)).unwrap()
// Marquer le bootstrap comme terminé
dispatch(setBootstrapped(true))
console.log('🎉 [APP] Bootstrap terminé avec le dossier:', folderHash)
} catch (error) {
console.error('❌ [APP] Erreur lors de l\'initialisation du dossier:', error)
}
}
// Ne pas refaire le bootstrap si déjà fait
if (bootstrapped) {
console.log('⏭️ [APP] Bootstrap déjà effectué, dossier:', currentFolderHash)
return
}
initializeFolder()
}, [dispatch, bootstrapped, currentFolderHash, folderResults.length])
// Fonction pour démarrer le polling
const startPolling = useCallback((folderHash: string) => {
console.log('🔄 [APP] Démarrage du polling pour le dossier:', folderHash)
const interval = setInterval(() => {
console.log('🔄 [APP] Polling - Vérification des résultats...')
dispatch(loadFolderResults(folderHash))
}, 5000) // Polling toutes les 5 secondes
dispatch(setPollingInterval(interval))
}, [dispatch])
// Fonction pour arrêter le polling
const stopPollingCallback = useCallback(() => {
console.log('⏹️ [APP] Arrêt du polling')
dispatch(stopPolling())
}, [dispatch])
// Gestion du polling basé sur l'état hasPending
useEffect(() => {
if (hasPending && currentFolderHash && !pollingInterval) {
startPolling(currentFolderHash)
} else if (!hasPending && pollingInterval) {
stopPollingCallback()
}
}, [hasPending, currentFolderHash, pollingInterval, startPolling, stopPollingCallback])
// Nettoyage au démontage du composant
useEffect(() => {
return () => {
if (pollingInterval) {
clearInterval(pollingInterval)
}
}
}, [pollingInterval])
return <AppRouter />
}