diff --git a/front/src/applications/stdcm/hooks/useStdcm.ts b/front/src/applications/stdcm/hooks/useStdcm.ts index 97a5ee24506..251a21cc73c 100644 --- a/front/src/applications/stdcm/hooks/useStdcm.ts +++ b/front/src/applications/stdcm/hooks/useStdcm.ts @@ -20,7 +20,7 @@ import { import { useOsrdConfSelectors } from 'common/osrdContext'; import { useStoreDataForSpeedLimitByTagSelector } from 'common/SpeedLimitByTagSelector/useStoreDataForSpeedLimitByTagSelector'; import { setFailure } from 'reducers/main'; -import type { OsrdStdcmConfState } from 'reducers/osrdconf/types'; +import { getStdcmConf } from 'reducers/osrdconf/stdcmConf/selectors'; import { updateSelectedTrainId } from 'reducers/simulationResults'; import { useAppDispatch } from 'store'; import { castErrorToFailure } from 'utils/error'; @@ -49,8 +49,8 @@ const useStdcm = ({ const dispatch = useAppDispatch(); const { t } = useTranslation(['translation', 'stdcm']); - const { getConf, getTimetableID } = useOsrdConfSelectors(); - const osrdconf = useSelector(getConf) as OsrdStdcmConfState; + const { getTimetableID } = useOsrdConfSelectors(); + const osrdconf = useSelector(getStdcmConf); const timetableId = useSelector(getTimetableID); const requestPromise = useRef>(); diff --git a/front/src/modules/trainschedule/components/ManageTrainSchedule/AddTrainScheduleButton.tsx b/front/src/modules/trainschedule/components/ManageTrainSchedule/AddTrainScheduleButton.tsx index ce9c4cb85bc..c2e8acfb3e3 100644 --- a/front/src/modules/trainschedule/components/ManageTrainSchedule/AddTrainScheduleButton.tsx +++ b/front/src/modules/trainschedule/components/ManageTrainSchedule/AddTrainScheduleButton.tsx @@ -8,10 +8,10 @@ import type { TrainScheduleBase, TrainScheduleResult, } from 'common/api/osrdEditoastApi'; -import { useOsrdConfSelectors } from 'common/osrdContext'; 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'; @@ -38,8 +38,7 @@ const AddTrainScheduleButton = ({ const dispatch = useAppDispatch(); const { t } = useTranslation(['operationalStudies/manageTrainSchedule']); - const { getConf } = useOsrdConfSelectors(); - const simulationConf = useSelector(getConf); + const simulationConf = useSelector(getOperationalStudiesConf); // TODO TS2 : remove this when rollingStockName will replace rollingStockId in the store const { rollingStock } = useStoreDataForRollingStockSelector(); diff --git a/front/src/modules/trainschedule/components/ManageTrainSchedule/helpers/checkCurrentConfig.ts b/front/src/modules/trainschedule/components/ManageTrainSchedule/helpers/checkCurrentConfig.ts index 0c2091a78fa..2fad08fa225 100644 --- a/front/src/modules/trainschedule/components/ManageTrainSchedule/helpers/checkCurrentConfig.ts +++ b/front/src/modules/trainschedule/components/ManageTrainSchedule/helpers/checkCurrentConfig.ts @@ -4,7 +4,7 @@ import type { Dispatch } from 'redux'; import getStepLocation from 'modules/pathfinding/helpers/getStepLocation'; import type { ValidConfig } from 'modules/trainschedule/components/ManageTrainSchedule/types'; import { setFailure } from 'reducers/main'; -import type { OsrdConfState } from 'reducers/osrdconf/types'; +import type { OperationalStudiesConfState } from 'reducers/osrdconf/operationalStudiesConf'; import { isInvalidFloatNumber } from 'utils/numbers'; import { kmhToMs } from 'utils/physics'; @@ -12,7 +12,7 @@ import formatMargin from './formatMargin'; import formatSchedule from './formatSchedule'; const checkCurrentConfig = ( - osrdconf: OsrdConfState, + osrdconf: OperationalStudiesConfState, t: (arg0: string) => string, dispatch: Dispatch, // TODO TS2 : remove this when rollingStockName will replace rollingStockId in the store diff --git a/front/src/modules/trainschedule/components/ManageTrainSchedule/hooks/useUpdateTrainSchedule.ts b/front/src/modules/trainschedule/components/ManageTrainSchedule/hooks/useUpdateTrainSchedule.ts index 99d58445d1b..00569b74bb8 100644 --- a/front/src/modules/trainschedule/components/ManageTrainSchedule/hooks/useUpdateTrainSchedule.ts +++ b/front/src/modules/trainschedule/components/ManageTrainSchedule/hooks/useUpdateTrainSchedule.ts @@ -7,6 +7,7 @@ import { useOsrdConfSelectors } from 'common/osrdContext'; import { useStoreDataForRollingStockSelector } from 'modules/rollingStock/components/RollingStockSelector/useStoreDataForRollingStockSelector'; import checkCurrentConfig from 'modules/trainschedule/components/ManageTrainSchedule/helpers/checkCurrentConfig'; import { setFailure, setSuccess } from 'reducers/main'; +import { getOperationalStudiesConf } from 'reducers/osrdconf/operationalStudiesConf/selectors'; import { updateSelectedTrainId } from 'reducers/simulationResults'; import { useAppDispatch } from 'store'; import { formatToIsoDate } from 'utils/date'; @@ -25,9 +26,9 @@ const useUpdateTrainSchedule = ( const { t } = useTranslation(['operationalStudies/manageTrainSchedule']); const [putTrainScheduleById] = osrdEditoastApi.endpoints.putTrainScheduleById.useMutation(); const dispatch = useAppDispatch(); - const { getConf, getName, getStartTime } = useOsrdConfSelectors(); + const { getName, getStartTime } = useOsrdConfSelectors(); const confName = useSelector(getName); - const simulationConf = useSelector(getConf); + const simulationConf = useSelector(getOperationalStudiesConf); const startTime = useSelector(getStartTime); const { rollingStock } = useStoreDataForRollingStockSelector(); diff --git a/front/src/reducers/index.ts b/front/src/reducers/index.ts index 2bf9a8d36cb..5c4af363fec 100644 --- a/front/src/reducers/index.ts +++ b/front/src/reducers/index.ts @@ -17,12 +17,13 @@ import type { MapViewerState, MapViewerSlice } from 'reducers/mapViewer'; import mapViewerReducer, { mapViewerInitialState, mapViewerSlice } from 'reducers/mapViewer'; import operationalStudiesConfReducer, { operationalStudiesConfSlice, + type OperationalStudiesConfState, } from 'reducers/osrdconf/operationalStudiesConf'; import stdcmConfReducer, { stdcmConfInitialState, stdcmConfSlice, } from 'reducers/osrdconf/stdcmConf'; -import type { OsrdConfState, OsrdStdcmConfState } from 'reducers/osrdconf/types'; +import type { OsrdStdcmConfState } from 'reducers/osrdconf/types'; import simulationReducer, { simulationResultsInitialState, simulationResultsSlice, @@ -79,7 +80,7 @@ const operationalStudiesDateTransform = createTransform( ); // Useful to only blacklist a sub-propertie of osrdconf -const buildOsrdConfPersistConfig = ( +const buildOsrdConfPersistConfig = ( slice: ConfSlice ): PersistConfig => ({ key: slice.name, @@ -106,7 +107,7 @@ export interface RootState { [editorSlice.name]: EditorState; [mainSlice.name]: MainState; [stdcmConfSlice.name]: OsrdStdcmConfState; - [operationalStudiesConfSlice.name]: OsrdConfState; + [operationalStudiesConfSlice.name]: OperationalStudiesConfState; [simulationResultsSlice.name]: SimulationResultsState; [osrdEditoastApi.reducerPath]: ReturnType; [osrdGatewayApi.reducerPath]: ReturnType; @@ -132,7 +133,7 @@ export type AnyReducerState = | EditorState | MainState | OsrdStdcmConfState - | OsrdConfState + | OperationalStudiesConfState | SimulationResultsState; export const rootReducer: ReducersMapObject = { @@ -146,9 +147,9 @@ export const rootReducer: ReducersMapObject = { stdcmConfReducer ) as unknown as Reducer, [operationalStudiesConfSlice.name]: persistReducer( - buildOsrdConfPersistConfig(operationalStudiesConfSlice), + buildOsrdConfPersistConfig(operationalStudiesConfSlice), operationalStudiesConfReducer - ) as unknown as Reducer, + ) as unknown as Reducer, [simulationResultsSlice.name]: simulationReducer, [osrdEditoastApi.reducerPath]: osrdEditoastApi.reducer, [osrdGatewayApi.reducerPath]: osrdGatewayApi.reducer, diff --git a/front/src/reducers/osrdconf/helpers.ts b/front/src/reducers/osrdconf/helpers.ts index 64c6067e992..0af704eec02 100644 --- a/front/src/reducers/osrdconf/helpers.ts +++ b/front/src/reducers/osrdconf/helpers.ts @@ -8,13 +8,14 @@ import { pathStepMatchesOp } from 'modules/pathfinding/utils'; import type { SuggestedOP } from 'modules/trainschedule/components/ManageTrainSchedule/types'; import { addElementAtIndex } from 'utils/array'; -import type { OsrdConfState, PathStep } from './types'; +import type { OperationalStudiesConfState } from './operationalStudiesConf'; +import type { PathStep } from './types'; export const insertViaFromMap = ( - pathSteps: OsrdConfState['pathSteps'], + pathSteps: OperationalStudiesConfState['pathSteps'], newVia: PathStep, pathProperties: ManageTrainSchedulePathProperties -): OsrdConfState['pathSteps'] => { +): OperationalStudiesConfState['pathSteps'] => { // If one of these is missing, via is not valid (it hasn't been added via click on map) and we return the same array if (!('track' in newVia) || !newVia.coordinates) return pathSteps; diff --git a/front/src/reducers/osrdconf/operationalStudiesConf/powerRestrictionReducer.ts b/front/src/reducers/osrdconf/operationalStudiesConf/powerRestrictionReducer.ts index daaf7f71c9a..2889e251f6b 100644 --- a/front/src/reducers/osrdconf/operationalStudiesConf/powerRestrictionReducer.ts +++ b/front/src/reducers/osrdconf/operationalStudiesConf/powerRestrictionReducer.ts @@ -4,12 +4,13 @@ import { compact, isEqual, keyBy, sortBy } from 'lodash'; import type { PowerRestriction } from 'applications/operationalStudies/types'; import { NO_POWER_RESTRICTION } from 'modules/powerRestriction/consts'; -import type { OsrdConfState, PathStep } from 'reducers/osrdconf/types'; +import type { PathStep } from 'reducers/osrdconf/types'; import { addElementAtIndex } from 'utils/array'; +import type { OperationalStudiesConfState } from '.'; import { addPathStep, cleanPathSteps, isRangeCovered, updateRestrictions } from './utils'; -export type PowerRestrictionReducer = { +export type PowerRestrictionReducer = { ['updatePowerRestrictionRanges']: CaseReducer>; ['upsertPowerRestrictionRanges']: CaseReducer< S, @@ -35,7 +36,9 @@ export type PowerRestrictionReducer = { >; }; -export function builPowerRestrictionReducer(): PowerRestrictionReducer { +export function builPowerRestrictionReducer< + S extends OperationalStudiesConfState, +>(): PowerRestrictionReducer { return { updatePowerRestrictionRanges(state: Draft, action: PayloadAction) { state.powerRestriction = action.payload; diff --git a/front/src/reducers/osrdconf/operationalStudiesConf/selectors.ts b/front/src/reducers/osrdconf/operationalStudiesConf/selectors.ts index 1120e743f8c..3d9b81fd652 100644 --- a/front/src/reducers/osrdconf/operationalStudiesConf/selectors.ts +++ b/front/src/reducers/osrdconf/operationalStudiesConf/selectors.ts @@ -1,17 +1,21 @@ +import type { RootState } from 'reducers'; import { operationalStudiesConfSlice } from 'reducers/osrdconf/operationalStudiesConf'; import buildCommonConfSelectors from 'reducers/osrdconf/osrdConfCommon/selectors'; -import type { OsrdConfState } from '../types'; - const buildOperationalStudiesConfSelectors = () => { - const commonConfSelectors = buildCommonConfSelectors(operationalStudiesConfSlice); + const commonConfSelectors = buildCommonConfSelectors(operationalStudiesConfSlice); + const getOperationalStudiesConf = (state: RootState) => state[operationalStudiesConfSlice.name]; + return { ...commonConfSelectors, + getOperationalStudiesConf, }; }; const selectors = buildOperationalStudiesConfSelectors(); +export const { getOperationalStudiesConf } = selectors; + export type OperationalStudiesConfSelectors = typeof selectors; export default selectors; diff --git a/front/src/reducers/osrdconf/osrdConfCommon/selectors.ts b/front/src/reducers/osrdconf/osrdConfCommon/selectors.ts index 028ff6bd59b..0822931d92d 100644 --- a/front/src/reducers/osrdconf/osrdConfCommon/selectors.ts +++ b/front/src/reducers/osrdconf/osrdConfCommon/selectors.ts @@ -5,14 +5,10 @@ import type { RootState } from 'reducers'; import buildInfraStateSelectors from 'reducers/infra/selectors'; import type { OperationalStudiesConfSlice } from 'reducers/osrdconf/operationalStudiesConf'; import type { StdcmConfSlice } from 'reducers/osrdconf/stdcmConf'; -import type { OsrdConfState } from 'reducers/osrdconf/types'; import { makeSubSelector } from 'utils/selectors'; -const buildCommonConfSelectors = ( - slice: OperationalStudiesConfSlice | StdcmConfSlice -) => { - const getConf = (state: RootState) => state[slice.name] as ConfState; - const makeOsrdConfSelector = makeSubSelector(getConf); +const buildCommonConfSelectors = (slice: OperationalStudiesConfSlice | StdcmConfSlice) => { + const makeOsrdConfSelector = makeSubSelector((state: RootState) => state[slice.name]); const getPathSteps = makeOsrdConfSelector('pathSteps'); @@ -26,7 +22,6 @@ const buildCommonConfSelectors = ( return { ...buildInfraStateSelectors(slice), - getConf, getConstraintDistribution: makeOsrdConfSelector('constraintDistribution'), getName: makeOsrdConfSelector('name'), getTrainCount: makeOsrdConfSelector('trainCount'), diff --git a/front/src/reducers/osrdconf/stdcmConf/selectors.ts b/front/src/reducers/osrdconf/stdcmConf/selectors.ts index d3909c675cb..35f3b9c113a 100644 --- a/front/src/reducers/osrdconf/stdcmConf/selectors.ts +++ b/front/src/reducers/osrdconf/stdcmConf/selectors.ts @@ -5,13 +5,16 @@ import type { OsrdStdcmConfState } from 'reducers/osrdconf/types'; import { makeSubSelector } from 'utils/selectors'; const buildStdcmConfSelectors = () => { - const commonConfSelectors = buildCommonConfSelectors(stdcmConfSlice); - const makeOsrdConfSelector = makeSubSelector(commonConfSelectors.getConf); + const commonConfSelectors = buildCommonConfSelectors(stdcmConfSlice); + + const getStdcmConf = (state: RootState) => state[stdcmConfSlice.name]; + const makeOsrdConfSelector = makeSubSelector(getStdcmConf); const getStdcmPathSteps = makeOsrdConfSelector('stdcmPathSteps'); return { ...commonConfSelectors, + getStdcmConf, getStandardStdcmAllowance: makeOsrdConfSelector('standardStdcmAllowance'), getTotalMass: makeOsrdConfSelector('totalMass'), getTotalLength: makeOsrdConfSelector('totalLength'), @@ -40,6 +43,8 @@ const buildStdcmConfSelectors = () => { const selectors = buildStdcmConfSelectors(); +export const { getStdcmConf } = selectors; + export type StdcmConfSelectors = typeof selectors; export default selectors; diff --git a/front/src/reducers/osrdconf/types.ts b/front/src/reducers/osrdconf/types.ts index 5179206b930..8bec928808a 100644 --- a/front/src/reducers/osrdconf/types.ts +++ b/front/src/reducers/osrdconf/types.ts @@ -17,7 +17,7 @@ import type { import type { IsoDurationString } from 'common/types'; import type { InfraState } from 'reducers/infra'; -export interface OsrdConfState extends InfraState { +export type OsrdConfState = InfraState & { constraintDistribution: Distribution; name: string; trainCount: number; @@ -42,14 +42,14 @@ export interface OsrdConfState extends InfraState { pathSteps: (PathStep | null)[]; rollingStockComfort: Comfort; startTime: Date; -} +}; export interface StandardAllowance { type: AllowanceValue['value_type']; value?: number; } -export interface OsrdStdcmConfState extends OsrdConfState { +export type OsrdStdcmConfState = OsrdConfState & { stdcmPathSteps: StdcmPathStep[]; standardStdcmAllowance?: StandardAllowance; totalMass?: number; @@ -57,7 +57,7 @@ export interface OsrdStdcmConfState extends OsrdConfState { maxSpeed?: number; towedRollingStockID?: number; linkedTrains: LinkedTrains; -} +}; export type PathStep = PathItemLocation & { id: string;