Skip to content

Commit 0be51e3

Browse files
committed
front: introduce DefaultBaseMap
Signed-off-by: Clara Ni <[email protected]>
1 parent 96ac78f commit 0be51e3

File tree

4 files changed

+145
-279
lines changed

4 files changed

+145
-279
lines changed

front/src/applications/stdcm/components/StdcmForm/StdcmConfig.tsx

+5-9
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ import {
1212
validateTotalLength,
1313
validateTotalMass,
1414
} from 'applications/stdcm/utils/consistValidation';
15+
import DefaultBaseMap from 'common/Map/DefaultBaseMap';
1516
import { useOsrdConfSelectors } from 'common/osrdContext';
1617
import useInfraStatus from 'modules/pathfinding/hooks/useInfraStatus';
1718
import { useStoreDataForRollingStockSelector } from 'modules/rollingStock/components/RollingStockSelector/useStoreDataForRollingStockSelector';
18-
import NewMap from 'modules/trainschedule/components/ManageTrainSchedule/NewMap';
1919
import { resetMargins, restoreStdcmConfig, updateStdcmPathStep } from 'reducers/osrdconf/stdcmConf';
2020
import {
2121
getMaxSpeed,
@@ -289,14 +289,10 @@ const StdcmConfig = ({
289289
</div>
290290

291291
<div className="osrd-config-item-container osrd-config-item-container-map stdcm-map">
292-
<NewMap
293-
id="stdcm-map-config"
294-
hideAttribution
295-
hideItinerary
296-
preventPointSelection
297-
pathGeometry={pathfinding?.geometry}
298-
showStdcmAssets
299-
simulationPathSteps={markersInfo}
292+
<DefaultBaseMap
293+
mapId="stdcm-map-config"
294+
infraId={infra?.id}
295+
pathStepMarkers={markersInfo}
300296
/>
301297
</div>
302298
</div>

front/src/applications/stdcm/components/StdcmResults/StdcmResults.tsx

+9-7
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import {
1212
getOperationalPointsWithTimes,
1313
} from 'applications/stdcm/utils/formatSimulationReportSheet';
1414
import { hasConflicts, hasResults } from 'applications/stdcm/utils/simulationOutputUtils';
15-
import NewMap from 'modules/trainschedule/components/ManageTrainSchedule/NewMap';
15+
import DefaultBaseMap from 'common/Map/DefaultBaseMap';
16+
import { useInfraID } from 'common/osrdContext';
1617
import {
1718
getRetainedSimulationIndex,
1819
getSelectedSimulation,
@@ -43,6 +44,8 @@ const StcdmResults = ({
4344
buttonsVisible,
4445
showStatusBanner,
4546
}: StcdmResultsProps) => {
47+
const infraId = useInfraID();
48+
4649
const { t } = useTranslation('stdcm', { keyPrefix: 'simulation.results' });
4750
const { stdcmName } = useDeploymentSettings();
4851

@@ -173,13 +176,12 @@ const StcdmResults = ({
173176
</div>
174177
)}
175178
<div className="osrd-config-item-container osrd-config-item-container-map map-results">
176-
<NewMap
177-
id="stdcm-map-result"
178-
hideAttribution
179-
showStdcmAssets
179+
<DefaultBaseMap
180+
mapId="stdcm-map-result"
181+
infraId={infraId}
182+
geometry={outputs?.pathProperties?.geometry}
183+
pathStepMarkers={markersInfo}
180184
isFeasible={!hasConflictResults}
181-
pathGeometry={outputs?.pathProperties?.geometry}
182-
simulationPathSteps={markersInfo}
183185
/>
184186
</div>
185187
</div>
+131
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
import { type PropsWithChildren, useCallback, useEffect, useRef, useState } from 'react';
2+
3+
import bbox from '@turf/bbox';
4+
import { compact } from 'lodash';
5+
import type { MapRef } from 'react-map-gl/maplibre';
6+
7+
import type { GeoJsonLineString } from 'common/api/osrdEditoastApi';
8+
import BaseMap from 'common/Map/BaseMap';
9+
import MapButtons from 'common/Map/Buttons/MapButtons';
10+
import { computeBBoxViewport } from 'common/Map/WarpedMap/core/helpers';
11+
import { LAYER_GROUPS_ORDER, LAYERS } from 'config/layerOrder';
12+
import ItineraryLayer from 'modules/trainschedule/components/ManageTrainSchedule/ManageTrainScheduleMap/ItineraryLayer';
13+
import ItineraryMarkers, {
14+
type MarkerInformation,
15+
} from 'modules/trainschedule/components/ManageTrainSchedule/ManageTrainScheduleMap/ItineraryMarkers';
16+
import { mapInitialState } from 'reducers/map';
17+
import type { Viewport } from 'reducers/map';
18+
19+
type DefaultBaseMapProps = {
20+
mapId: string;
21+
infraId?: number;
22+
geometry?: GeoJsonLineString;
23+
pathStepMarkers?: MarkerInformation[];
24+
isFeasible?: boolean;
25+
};
26+
27+
const ZOOM_DEFAULT = 5;
28+
const ZOOM_DELTA = 1.5;
29+
30+
/**
31+
* Default base map used to display a path and some markers.
32+
* No interactions are available, except zoom in/out, pan and reset pitch/bearing.
33+
*/
34+
const DefaultBaseMap = ({
35+
mapId,
36+
infraId,
37+
geometry,
38+
pathStepMarkers = [],
39+
isFeasible = true,
40+
children,
41+
}: PropsWithChildren<DefaultBaseMapProps>) => {
42+
const mapRef = useRef<MapRef | null>(null);
43+
const [viewPort, setViewPort] = useState(mapInitialState.viewport);
44+
45+
const updateViewportChange = useCallback(
46+
(partialViewPort: Partial<Viewport>) =>
47+
setViewPort((prev) => ({
48+
...prev,
49+
...partialViewPort,
50+
})),
51+
[]
52+
);
53+
54+
const resetPitchBearing = () => {
55+
updateViewportChange({
56+
...viewPort,
57+
bearing: 0,
58+
pitch: 0,
59+
});
60+
};
61+
62+
const zoomIn = () => {
63+
updateViewportChange({
64+
...viewPort,
65+
zoom: (viewPort.zoom || ZOOM_DEFAULT) + ZOOM_DELTA,
66+
});
67+
};
68+
const zoomOut = () => {
69+
updateViewportChange({
70+
...viewPort,
71+
zoom: (viewPort.zoom || ZOOM_DEFAULT) - ZOOM_DELTA,
72+
});
73+
};
74+
75+
useEffect(() => {
76+
const points = geometry ?? {
77+
coordinates: compact(pathStepMarkers.map((step) => step.coordinates)),
78+
type: 'LineString',
79+
};
80+
if (points.coordinates.length >= 2) {
81+
const newViewport = computeBBoxViewport(bbox(points), viewPort);
82+
updateViewportChange(newViewport);
83+
}
84+
}, [geometry, pathStepMarkers]);
85+
86+
return (
87+
<>
88+
<MapButtons
89+
zoomIn={zoomIn}
90+
zoomOut={zoomOut}
91+
map={mapRef.current ?? undefined}
92+
resetPitchBearing={resetPitchBearing}
93+
bearing={viewPort.bearing}
94+
withMapKeyButton={false}
95+
withSearchButton={false}
96+
withToggleLayersButton={false}
97+
viewPort={viewPort}
98+
isNewButtons
99+
/>
100+
<BaseMap
101+
mapId={mapId}
102+
mapRef={mapRef}
103+
infraId={infraId}
104+
interactiveLayerIds={[]}
105+
mapStyle={mapInitialState.mapStyle}
106+
viewPort={viewPort}
107+
updatePartialViewPort={updateViewportChange}
108+
hideAttribution
109+
showOSM
110+
>
111+
<ItineraryLayer
112+
layerOrder={LAYER_GROUPS_ORDER[LAYERS.ITINERARY.GROUP]}
113+
geometry={geometry}
114+
isFeasible={isFeasible}
115+
showStdcmAssets
116+
/>
117+
{infraId && (
118+
<ItineraryMarkers
119+
infraId={infraId}
120+
simulationPathSteps={pathStepMarkers}
121+
showStdcmAssets
122+
/>
123+
)}
124+
125+
{children}
126+
</BaseMap>
127+
</>
128+
);
129+
};
130+
131+
export default DefaultBaseMap;

0 commit comments

Comments
 (0)