Skip to content

Commit f91b8ec

Browse files
committed
front: add scenario train ids to query params and local storage
Signed-off-by: Alice Khoudli <[email protected]>
1 parent 2449281 commit f91b8ec

File tree

3 files changed

+91
-10
lines changed

3 files changed

+91
-10
lines changed

front/src/applications/operationalStudies/hooks/useScenarioData.ts

-10
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import {
1111
type TrainScheduleResult,
1212
} from 'common/api/osrdEditoastApi';
1313
import { setFailure } from 'reducers/main';
14-
import { updateSelectedTrainId, updateTrainIdUsedForProjection } from 'reducers/simulationResults';
1514
import {
1615
getSelectedTrainId,
1716
getTrainIdUsedForProjection,
@@ -164,15 +163,6 @@ const useScenarioData = (
164163
});
165164
}, []);
166165

167-
useEffect(() => {
168-
dispatch(updateTrainIdUsedForProjection(undefined));
169-
dispatch(updateSelectedTrainId(undefined));
170-
return () => {
171-
dispatch(updateTrainIdUsedForProjection(undefined));
172-
dispatch(updateSelectedTrainId(undefined));
173-
};
174-
}, []);
175-
176166
return {
177167
selectedTrainId,
178168
trainScheduleSummaries,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import { useEffect, useCallback, useMemo } from 'react';
2+
3+
import { useSelector } from 'react-redux';
4+
import { useLocation, useNavigate, useParams } from 'react-router-dom';
5+
6+
import { updateSelectedTrainId, updateTrainIdUsedForProjection } from 'reducers/simulationResults';
7+
import {
8+
getSelectedTrainId,
9+
getTrainIdUsedForProjection,
10+
} from 'reducers/simulationResults/selectors';
11+
import { useAppDispatch } from 'store';
12+
13+
type SimulationParams = {
14+
projectId: string;
15+
studyId: string;
16+
scenarioId: string;
17+
};
18+
19+
const useScenarioQueryParams = () => {
20+
const location = useLocation();
21+
const navigate = useNavigate();
22+
const dispatch = useAppDispatch();
23+
24+
const {
25+
projectId: urlProjectId,
26+
studyId: urlStudyId,
27+
scenarioId: urlScenarioId,
28+
} = useParams() as SimulationParams;
29+
const localKey = `useScenarioQueryParams_project${urlProjectId}_study${urlStudyId}_scenario${urlScenarioId}`;
30+
31+
const searchParams = useMemo(() => new URLSearchParams(location.search), [location.search]);
32+
33+
const reduxSelectedTrainId = useSelector(getSelectedTrainId);
34+
const reduxProjectionTrainId = useSelector(getTrainIdUsedForProjection);
35+
36+
// Helper function to get a parameter from the URL, or if absent from local storage
37+
const getParamFromUrlOrStorage = useCallback(
38+
(paramName: string) =>
39+
searchParams.get(paramName) || localStorage.getItem(`${localKey}_${paramName}`) || undefined,
40+
[localKey, searchParams]
41+
);
42+
43+
// Helper function to get a parameter from the URL or local storage
44+
const setParamsInUrlAndStorage = useCallback(
45+
(paramName: string, paramValue: string | undefined) => {
46+
if (paramValue === undefined) {
47+
searchParams.delete(paramName);
48+
localStorage.removeItem(`${localKey}_${paramName}`);
49+
} else {
50+
searchParams.set(paramName, paramValue);
51+
localStorage.setItem(`${localKey}_${paramName}`, paramValue);
52+
}
53+
navigate(`${location.pathname}?${searchParams.toString()}`, { replace: true });
54+
},
55+
[localKey, searchParams, location.pathname, navigate]
56+
);
57+
58+
// Update the redux store on page load
59+
useEffect(() => {
60+
const selectedTrainFromUrl = getParamFromUrlOrStorage('selected_train');
61+
const projectionFromUrl = getParamFromUrlOrStorage('projection');
62+
63+
if (selectedTrainFromUrl) {
64+
dispatch(updateSelectedTrainId(Number(selectedTrainFromUrl)));
65+
}
66+
if (projectionFromUrl) {
67+
dispatch(updateTrainIdUsedForProjection(Number(projectionFromUrl)));
68+
}
69+
}, [dispatch, getParamFromUrlOrStorage]);
70+
71+
// Update the URL and local storage on redux store change
72+
useEffect(() => {
73+
if (reduxSelectedTrainId?.toString() !== getParamFromUrlOrStorage('selected_train')) {
74+
setParamsInUrlAndStorage('selected_train', reduxSelectedTrainId?.toString());
75+
}
76+
if (reduxProjectionTrainId?.toString() !== getParamFromUrlOrStorage('projection')) {
77+
setParamsInUrlAndStorage('projection', reduxProjectionTrainId?.toString());
78+
}
79+
}, [
80+
reduxSelectedTrainId,
81+
reduxProjectionTrainId,
82+
setParamsInUrlAndStorage,
83+
getParamFromUrlOrStorage,
84+
]);
85+
};
86+
87+
export default useScenarioQueryParams;

front/src/applications/operationalStudies/views/Scenario.tsx

+4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
import BreadCrumbs from 'applications/operationalStudies/components/BreadCrumbs';
22
import ScenarioContent from 'applications/operationalStudies/components/Scenario/ScenarioContent';
33
import useScenario from 'applications/operationalStudies/hooks/useScenario';
4+
import useScenarioQueryParams from 'applications/operationalStudies/hooks/useScenarioQueryParams';
45
import NavBarSNCF from 'common/BootstrapSNCF/NavBarSNCF';
56
import useInfraStatus from 'modules/pathfinding/hooks/useInfraStatus';
67

78
const Scenario = () => {
89
const { scenario, timetable } = useScenario();
910

11+
// Initialize and sync the URL and local storage with Redux
12+
useScenarioQueryParams();
13+
1014
const infraData = useInfraStatus();
1115
const { infra } = infraData;
1216

0 commit comments

Comments
 (0)