fix(front): corrige les 4 erreurs eslint restantes

Le dépôt sortait 7 erreurs eslint au début de cette série de correctifs,
dont certaines antérieures. Il n'en reste aucune.

- Dashboard et Users appelaient setState de façon synchrone dans un
  effet, ce qui provoque des rendus en cascade. Le chargement initial
  passe par une fonction asynchrone qui n'écrit qu'après l'await, avec
  annulation au démontage. Sur le Dashboard, l'indicateur de chargement
  est allumé par les gestionnaires d'événement, et le bouton Actualiser
  relance l'effet via un compteur plutôt qu'en appelant le chargement.
- L'import ExternalLink de Documentation.jsx n'était pas utilisé.
- AuthContext.jsx exportait à la fois un composant, le contexte et un
  hook, ce qui désactivait le rafraîchissement à chaud de Vite pour ce
  fichier. Le contexte et le hook vivent désormais dans leurs propres
  modules ; les 5 fichiers concernés sont mis à jour.
This commit is contained in:
2026-08-15 14:32:02 +02:00
parent 82a1b93211
commit 6ad76ca773
11 changed files with 90 additions and 40 deletions
+40 -21
View File
@@ -18,6 +18,7 @@ export default function Dashboard() {
const [filtreCategorie, setFiltreCategorie] = useState('');
const [loading, setLoading] = useState(true);
const [erreur, setErreur] = useState('');
const [rafraichissement, setRafraichissement] = useState(0);
/* Chargement initial des filtres.
On n'utilise pas les référentiels SERVICE / CATEGORIE complets : ils
@@ -52,39 +53,57 @@ export default function Dashboard() {
/* Changer de service peut rendre la catégorie sélectionnée sans résultat :
on la remet à zéro dans le même rendu, pour ne déclencher qu'un seul appel. */
function handleServiceChange(service) {
setLoading(true);
setFiltreService(service);
if (filtreCategorie && !categoriesDisponibles(service).includes(filtreCategorie)) {
setFiltreCategorie('');
}
}
/* Chargement des données dashboard */
const loadData = useCallback(async () => {
function handleCategorieChange(categorie) {
setLoading(true);
setErreur('');
try {
const [sum, data] = await Promise.all([
getDashboardSummary(),
getDashboard(filtreService, filtreCategorie),
]);
setSummary(sum);
setMonitorings(Array.isArray(data) ? data : []);
} catch (e) {
setErreur(e.message || 'Erreur lors du chargement du dashboard.');
} finally {
setLoading(false);
}
}, [filtreService, filtreCategorie]);
setFiltreCategorie(categorie);
}
/* Le bouton Actualiser relance l'effet en changeant cette valeur. */
function handleActualiser() {
setLoading(true);
setRafraichissement(compteur => compteur + 1);
}
/* Les données sont rechargées à chaque changement de filtre. L'indicateur de
chargement est allumé par les gestionnaires d'événement ci-dessus, jamais
dans l'effet : y appeler setState de façon synchrone provoquerait un rendu
en cascade. */
useEffect(() => {
loadData();
}, [loadData]);
let annule = false;
async function charger() {
try {
const [sum, data] = await Promise.all([
getDashboardSummary(),
getDashboard(filtreService, filtreCategorie),
]);
if (annule) return;
setSummary(sum);
setMonitorings(Array.isArray(data) ? data : []);
setErreur('');
} catch (e) {
if (!annule) setErreur(e.message || 'Erreur lors du chargement du dashboard.');
} finally {
if (!annule) setLoading(false);
}
}
charger();
return () => { annule = true; };
}, [filtreService, filtreCategorie, rafraichissement]);
return (
<div className={styles.page}>
<div className={styles.pageHeader}>
<h1 className={styles.title}>Dashboard</h1>
<button className={styles.refreshBtn} onClick={loadData} disabled={loading}>
<button className={styles.refreshBtn} onClick={handleActualiser} disabled={loading}>
<RefreshCw size={14} className={loading ? styles.spinning : ''} />
Actualiser
</button>
@@ -131,7 +150,7 @@ export default function Dashboard() {
<select
className={styles.select}
value={filtreCategorie}
onChange={e => setFiltreCategorie(e.target.value)}
onChange={e => handleCategorieChange(e.target.value)}
>
<option value="">Toutes les catégories</option>
{categories.map(c => (
@@ -144,7 +163,7 @@ export default function Dashboard() {
{loading ? (
<LoadingSpinner message="Chargement du dashboard..." />
) : erreur ? (
<ErrorMessage message={erreur} onRetry={loadData} />
<ErrorMessage message={erreur} onRetry={handleActualiser} />
) : (
<>
{monitorings.length === 0 ? (