-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy pathuseSpeedSpaceChart.ts
122 lines (108 loc) · 3.78 KB
/
useSpeedSpaceChart.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import { useEffect, useState } from 'react';
import type {
LayerData,
PowerRestrictionValues,
} from '@osrd-project/ui-speedspacechart/dist/types/chartTypes';
import { useTranslation } from 'react-i18next';
import type { PathPropertiesFormatted } from 'applications/operationalStudies/types';
import { preparePathPropertiesData } from 'applications/operationalStudies/utils';
import {
osrdEditoastApi,
type PathfindingResultSuccess,
type SimulationResponse,
type TrainScheduleResult,
} from 'common/api/osrdEditoastApi';
import { useInfraID } from 'common/osrdContext';
import usePathProperties from 'modules/pathfinding/hooks/usePathProperties';
import formatPowerRestrictionRangesWithHandled from 'modules/powerRestriction/helpers/formatPowerRestrictionRangesWithHandled';
import type { SpeedSpaceChartData } from 'modules/simulationResult/types';
import { updateChartSynchronizerTrainData } from '../ChartSynchronizer/utils';
/** Prepare data needed for speedSpaceChart */
const useSpeedSpaceChart = (
trainScheduleResult?: TrainScheduleResult,
pathfindingResult?: PathfindingResultSuccess,
simulation?: SimulationResponse,
departureTime?: string
): SpeedSpaceChartData | null => {
const { t } = useTranslation('simulation');
const infraId = useInfraID();
const [formattedPathProperties, setFormattedPathProperties] = useState<PathPropertiesFormatted>();
const [formattedPowerRestrictions, setFormattedPowerRestrictions] =
useState<LayerData<PowerRestrictionValues>[]>();
const rollingStockName = trainScheduleResult?.rolling_stock_name;
const { data: rollingStock } =
osrdEditoastApi.endpoints.getRollingStockNameByRollingStockName.useQuery(
{
rollingStockName: rollingStockName!,
},
{ skip: !rollingStockName }
);
const pathProperties = usePathProperties(infraId, pathfindingResult, [
'electrifications',
'geometry',
'operational_points',
'curves',
'slopes',
]);
// retrieve and format pathfinding properties
useEffect(() => {
const getPathProperties = async () => {
if (
infraId &&
trainScheduleResult &&
rollingStock &&
pathfindingResult &&
simulation?.status === 'success' &&
pathProperties
) {
const formattedPathProps = preparePathPropertiesData(
simulation.electrical_profiles,
pathProperties,
pathfindingResult,
trainScheduleResult.path,
t
);
setFormattedPathProperties(formattedPathProps);
}
};
getPathProperties();
}, [
infraId,
trainScheduleResult,
rollingStock,
pathfindingResult,
simulation?.status,
pathProperties,
]);
useEffect(() => {
if (trainScheduleResult && rollingStock && pathfindingResult && formattedPathProperties) {
const powerRestrictions = formatPowerRestrictionRangesWithHandled({
selectedTrainSchedule: trainScheduleResult,
selectedTrainRollingStock: rollingStock,
pathfindingResult,
pathProperties: formattedPathProperties,
});
setFormattedPowerRestrictions(powerRestrictions);
}
}, [formattedPathProperties, trainScheduleResult]);
// setup chart synchronizer
useEffect(() => {
if (simulation?.status === 'success' && trainScheduleResult && rollingStock && departureTime) {
updateChartSynchronizerTrainData(simulation, rollingStock, departureTime);
}
}, [simulation, trainScheduleResult, rollingStock, departureTime]);
return trainScheduleResult &&
rollingStock &&
simulation?.status === 'success' &&
formattedPathProperties &&
departureTime
? {
rollingStock,
formattedPowerRestrictions,
simulation,
formattedPathProperties,
departureTime,
}
: null;
};
export default useSpeedSpaceChart;