105 lines
3.5 KiB
TypeScript
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 />
|
|
}
|