-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy pathAddTrainScheduleButton.tsx
106 lines (90 loc) · 3.64 KB
/
AddTrainScheduleButton.tsx
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
import { Plus } from '@osrd-project/ui-icons';
import { useTranslation } from 'react-i18next';
import { useSelector } from 'react-redux';
import { osrdEditoastApi } from 'common/api/osrdEditoastApi';
import type {
InfraState,
TrainScheduleBase,
TrainScheduleResult,
} from 'common/api/osrdEditoastApi';
import { useStoreDataForRollingStockSelector } from 'modules/rollingStock/components/RollingStockSelector/useStoreDataForRollingStockSelector';
import trainNameWithNum from 'modules/trainschedule/components/ManageTrainSchedule/helpers/trainNameHelper';
import { setFailure, setSuccess } from 'reducers/main';
import { getOperationalStudiesConf } from 'reducers/osrdconf/operationalStudiesConf/selectors';
import { useAppDispatch } from 'store';
import { isoDateToMs, isoDateWithTimezoneToSec } from 'utils/date';
import { castErrorToFailure } from 'utils/error';
import { sec2time } from 'utils/timeManipulation';
import checkCurrentConfig from './helpers/checkCurrentConfig';
import formatTrainSchedulePayload from './helpers/formatTrainSchedulePayload';
type AddTrainScheduleButtonProps = {
infraState?: InfraState;
setIsWorking: (isWorking: boolean) => void;
upsertTrainSchedules: (trainSchedules: TrainScheduleResult[]) => void;
dtoImport: () => void;
};
const AddTrainScheduleButton = ({
infraState,
setIsWorking,
upsertTrainSchedules,
dtoImport,
}: AddTrainScheduleButtonProps) => {
const [postTrainSchedule] =
osrdEditoastApi.endpoints.postTimetableByIdTrainSchedule.useMutation();
const dispatch = useAppDispatch();
const { t } = useTranslation(['operationalStudies/manageTrainSchedule']);
const simulationConf = useSelector(getOperationalStudiesConf);
// TODO TS2 : remove this when rollingStockName will replace rollingStockId in the store
const { rollingStock } = useStoreDataForRollingStockSelector();
const createTrainSchedules = async () => {
const validTrainConfig = checkCurrentConfig(simulationConf, t, dispatch, rollingStock?.name);
if (validTrainConfig) {
const { timetableId, firstStartTime, trainCount, trainDelta, trainStep, baseTrainName } =
validTrainConfig;
setIsWorking(true);
const formattedStartTimeMs = isoDateToMs(firstStartTime);
const trainScheduleParams: TrainScheduleBase[] = [];
let actualTrainCount = 1;
for (let nb = 1; nb <= trainCount; nb += 1) {
const newStartTime = new Date(formattedStartTimeMs + 1000 * 60 * trainDelta * (nb - 1));
const trainName = trainNameWithNum(baseTrainName, actualTrainCount, trainCount);
const trainSchedule = formatTrainSchedulePayload(validTrainConfig, trainName, newStartTime);
trainScheduleParams.push({ ...trainSchedule });
actualTrainCount += trainStep;
}
try {
const newTrainSchedules = await postTrainSchedule({
id: timetableId,
body: trainScheduleParams,
}).unwrap();
dispatch(
setSuccess({
title: t('trainAdded'),
text: `${baseTrainName}: ${sec2time(isoDateWithTimezoneToSec(firstStartTime))}`,
})
);
setIsWorking(false);
dtoImport();
upsertTrainSchedules(newTrainSchedules);
} catch (e) {
setIsWorking(false);
dispatch(setFailure(castErrorToFailure(e)));
}
}
};
return (
<button
className="btn btn-primary mb-2"
type="button"
disabled={infraState !== 'CACHED'}
onClick={createTrainSchedules}
data-testid="add-train-schedules"
>
<span className="mr-2">
<Plus size="lg" />
</span>
{t('addTrainSchedule')}
</button>
);
};
export default AddTrainScheduleButton;