import { AnyAction, combineReducers } from 'redux'; import { BENCHMARK_MODE_SPOT, ON_NEXT_PAGE, ON_PREVIOUS_PAGE, RESET_TCE_AGGREGATIONS, SELECT_TCE_AGGREGATION, SET_BENCHMARK_MODE, SET_NUMBER_PER_PAGE, SET_TCE_AGGREGATIONS, SET_TCE_CURRENT_PAGE, SET_TCE_KEY_VALUES, SET_TCE_NUMBER_OF_PAGES, } from 'app/modules/earnings/store/earnings.constants'; import { vesselsReducer } from 'app/modules/earnings/store/vessels/vessels.reducer'; import { EarningsPaginationState, EarningsState, TceAggregation, TceKeyValues, TceState, } from 'app/modules/earnings/store/earnings.types'; const defaultKeyValuesState: TceKeyValues = { current: 0, versusGlobalSpot: 0, versusOneYearTc: 0, versusPreviousAggregationPeriod: 0, versusSamePeriodLastYear: 0, }; const defaultTceAggregations: TceAggregation[] = []; const defaultTcePagination: EarningsPaginationState = { currentPage: 1, numberOfPages: 1, numberPerPage: 12, }; const tceKeyValuesReducer = (state = defaultKeyValuesState, action: AnyAction = { type: '' }) => { switch (action.type) { case SET_TCE_KEY_VALUES: return { ...state, ...action.payload, }; default: return state; } }; const tceAggregationsReducer = (state = defaultTceAggregations, action: AnyAction = { type: '' }) => { switch (action.type) { case SET_TCE_AGGREGATIONS: return action.payload; case RESET_TCE_AGGREGATIONS: return defaultTceAggregations; default: return state; } }; const tceSelectedAggregationReducer = (state: number | null = null, action: AnyAction = { type: '' }) => { switch (action.type) { case SELECT_TCE_AGGREGATION: return action.payload; default: return state; } }; const tceBenchmarkModeReducer = (state = BENCHMARK_MODE_SPOT, action: AnyAction = { type: '' }) => { switch (action.type) { case SET_BENCHMARK_MODE: return action.payload; default: return state; } }; const tcePaginationReducer = (state = defaultTcePagination, action: AnyAction = { type: '' }) => { switch (action.type) { case ON_NEXT_PAGE: return { ...state, currentPage: Math.min(state.numberOfPages - 1, state.currentPage + 1), }; case ON_PREVIOUS_PAGE: return { ...state, currentPage: Math.max(0, state.currentPage - 1), }; case SET_TCE_CURRENT_PAGE: return { ...state, currentPage: action.payload, }; case SET_TCE_NUMBER_OF_PAGES: return { ...state, numberOfPages: Math.max(0, action.payload - state.numberPerPage + 1), }; case SET_NUMBER_PER_PAGE: return { ...state, numberPerPage: action.payload, }; default: return state; } }; const earningsReducer = combineReducers({ tce: combineReducers({ keyValues: tceKeyValuesReducer, aggregations: tceAggregationsReducer, selectedAggregation: tceSelectedAggregationReducer, benchmarkMode: tceBenchmarkModeReducer, pagination: tcePaginationReducer, }), vessels: vesselsReducer, }); export { earningsReducer };