diff --git a/front/src/applications/operationalStudies/hooks/useLazySimulateTrains.ts b/front/src/applications/operationalStudies/hooks/useLazySimulateTrains.ts index 998e2f03255..1e7e58698b6 100644 --- a/front/src/applications/operationalStudies/hooks/useLazySimulateTrains.ts +++ b/front/src/applications/operationalStudies/hooks/useLazySimulateTrains.ts @@ -1,5 +1,6 @@ import { useRef, useEffect, useCallback, useState } from 'react'; +import { osrdEditoastApi } from 'common/api/osrdEditoastApi'; import type { LightRollingStockWithLiveries, TrainScheduleSimulationSummaryResult, @@ -47,6 +48,7 @@ export default function useLazySimulateTrains({ const [simulatedTrainsById, setSimulatedTrainsById] = useState< Map >(new Map()); + const [allSimulationsDone, setAllSimulationsDone] = useState(false); const onProgressRef = useRef(null); onProgressRef.current = onProgress; @@ -54,6 +56,11 @@ export default function useLazySimulateTrains({ useEffect(() => { if (!rollingStocks) return undefined; + const idsToSimulate = [...trainSchedulesByIdRef.current.keys()]; + if (idsToSimulate.length > 0) { + setAllSimulationsDone(false); + } + const loader = new TrainSimulationLazyLoader({ dispatch, infraId, @@ -67,10 +74,14 @@ export default function useLazySimulateTrains({ ); setSimulatedTrainsById((prev) => new Map([...prev.entries(), ...summaries.entries()])); if (onProgressRef.current) onProgressRef.current(summaries); + if (loader.pending.length === 0) { + setAllSimulationsDone(true); + dispatch(osrdEditoastApi.util.invalidateTags(['conflicts'])); + } }, }); - loader.simulateTrainSchedules([...trainSchedulesByIdRef.current.keys()]); + loader.simulateTrainSchedules(idsToSimulate); loaderRef.current = loader; return () => { @@ -84,6 +95,11 @@ export default function useLazySimulateTrains({ trainSchedulesByIdRef.current.set(trainSchedule.id, trainSchedule); } + if (trainSchedules.length === 0) { + setAllSimulationsDone(true); + return; + } + setAllSimulationsDone(false); loaderRef.current?.simulateTrainSchedules(trainSchedules.map(({ id }) => id)); }, []); @@ -124,6 +140,6 @@ export default function useLazySimulateTrains({ simulateTrainSchedules, removeSimulatedTrainSchedules, updateSimulatedTrainScheduleDepartureTime, - allTrainsSimulated: loaderRef.current && loaderRef.current.pending.length === 0, + allTrainsSimulated: allSimulationsDone, }; } diff --git a/front/src/applications/operationalStudies/hooks/useScenarioData.ts b/front/src/applications/operationalStudies/hooks/useScenarioData.ts index 597e5025a6a..0b1c8165bf1 100644 --- a/front/src/applications/operationalStudies/hooks/useScenarioData.ts +++ b/front/src/applications/operationalStudies/hooks/useScenarioData.ts @@ -206,6 +206,7 @@ const useScenarioData = (scenario: ScenarioWithDetails, infraId: number, timetab }).unwrap(); setTrainScheduleDepartureTime(trainScheduleId, newDeparture); + dispatch(osrdEditoastApi.util.invalidateTags(['conflicts'])); }, [trainSchedules] ); diff --git a/front/src/common/api/osrdEditoastApi.ts b/front/src/common/api/osrdEditoastApi.ts index 14b0eaf0f12..ca55f1361e5 100644 --- a/front/src/common/api/osrdEditoastApi.ts +++ b/front/src/common/api/osrdEditoastApi.ts @@ -268,6 +268,7 @@ const osrdEditoastApi = generatedEditoastApi }), }) .enhanceEndpoints({ + addTagTypes: ['conflicts'] as const, endpoints: { getLightRollingStock: { transformResponse: (response: GetLightRollingStockApiResponse) => ({ @@ -281,8 +282,11 @@ const osrdEditoastApi = generatedEditoastApi // As we always use all get train_schedule endpoints after updating the timetable, // we don't want to invalidate the train_schedule tags here to prevent multiple calls + getTimetableByIdConflicts: { + providesTags: ['conflicts'], + }, deleteTrainSchedules: { - invalidatesTags: ['timetable', 'scenarios'], + invalidatesTags: ['timetable', 'scenarios', 'conflicts'], }, postTrainScheduleSetsByIdTrainSchedules: { invalidatesTags: ['train_schedule_set', 'scenarios', 'timetable'],