From da4e465125e6c9fa37bd16dc03ba490c661a98b1 Mon Sep 17 00:00:00 2001 From: Hermann_Kitio Date: Wed, 22 Apr 2026 20:15:53 +0300 Subject: [PATCH] fix(navigation): correctifs flux retour post-rapport et post-sujets (reset sticky useEffect) Co-Authored-By: Claude Opus 4.7 (1M context) --- src/app/router.tsx | 10 +++++--- .../simulations/pages/SimulationPage.tsx | 22 +++++----------- src/features/simulations/pages/SujetsPage.tsx | 25 +++++++++++++------ 3 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/app/router.tsx b/src/app/router.tsx index ca1a829..06aeda4 100644 --- a/src/app/router.tsx +++ b/src/app/router.tsx @@ -54,17 +54,19 @@ export function AppRouter() { } /> } /> - {/* Simulation — /simulation/ee et /sujets partagent le SimulationFlowProvider. */} + {/* Simulation — /simulation/ee, /sujets et /rapport/:id partagent le + SimulationFlowProvider. L'instance est préservée entre ces routes + par React Router tant que le layout parent reste monté, ce qui + permet à RapportPage.reset() d'agir sur le même state que + SimulationPage (bouton « Nouvelle simulation » + breadcrumb). */} } /> }> } /> } /> + } /> } /> - {/* Rapport */} - } /> - {/* Autres sections — Sprint 4+ */} } /> } /> diff --git a/src/features/simulations/pages/SimulationPage.tsx b/src/features/simulations/pages/SimulationPage.tsx index 75ae147..00aa983 100644 --- a/src/features/simulations/pages/SimulationPage.tsx +++ b/src/features/simulations/pages/SimulationPage.tsx @@ -8,8 +8,6 @@ * Règle H : aucune logique métier — tout est dans useSimulation() et les entités. */ -import { useEffect } from 'react' -import { useNavigate } from 'react-router-dom' import { usePlan } from '@/features/dashboard/hooks/usePlan' import { Button } from '@/shared/ui/Button' import { useSimulation } from '../hooks/useSimulation' @@ -30,8 +28,6 @@ function SimulationSkeleton() { } export function SimulationPage() { - const navigate = useNavigate() - const { data: planData, isLoading: isPlanLoading, @@ -52,18 +48,12 @@ export function SimulationPage() { reset, } = useSimulation() - // Redirige vers /sujets dès que la création aboutit pour une tâche avec catalogue. - useEffect(() => { - if (step === 'choosing-subject' && production) { - navigate('/sujets') - } - }, [step, production, navigate]) - - useEffect(() => { - if (step === 'done' && production) { - navigate(`/rapport/${production.id}`) - } - }, [step, production, navigate]) + // Le reset sticky (step='done' ou 'choosing-subject' au retour) est déclenché + // explicitement par les callers qui ramènent vers /simulation/ee : + // - RapportPage.goToSimulations : reset() avant navigate + // - SujetsPage bouton « ← Retour » : reset() avant navigate + // Un useEffect réactif ici annulerait les transitions légitimes de + // createMutation.onSuccess (idle → choosing-subject → navigate /sujets). return (
diff --git a/src/features/simulations/pages/SujetsPage.tsx b/src/features/simulations/pages/SujetsPage.tsx index 15a5b38..5a7993c 100644 --- a/src/features/simulations/pages/SujetsPage.tsx +++ b/src/features/simulations/pages/SujetsPage.tsx @@ -34,19 +34,24 @@ function SujetsSkeleton() { export function SujetsPage() { const navigate = useNavigate() - const { production, changeSubject, setStep } = useSimulationFlow() + const { step, production, changeSubject, setStep, reset } = useSimulationFlow() - // MVP : pas de production en contexte (refresh direct) → retour à /simulation/ee + // Redirige vers /simulation/ee si : + // - production absente (refresh direct sur /sujets sans contexte) + // - step === 'idle' (état initial, pas de simulation en cours) + // - step === 'done' (simulation corrigée — /sujets ne doit pas patcher + // une simulation dont le rapport est déjà persisté — cf. FTD-23) + const shouldRedirect = !production || step === 'idle' || step === 'done' useEffect(() => { - if (!production) navigate('/simulation/ee', { replace: true }) - }, [production, navigate]) + if (shouldRedirect) navigate('/simulation/ee', { replace: true }) + }, [shouldRedirect, navigate]) const { data: sujets, isLoading, isError, refetch } = useSujets( production?.tache ?? 'EE_T1', - !!production, + !!production && !shouldRedirect, ) - if (!production) return null + if (shouldRedirect || !production) return null function handleSelect(sujet: SujetData) { changeSubject(sujet) @@ -71,7 +76,13 @@ export function SujetsPage() {