import { StoreState } from 'app/common/store/store.types'; import { createSelector } from 'reselect'; import datePipe from '../../../shared/pipes/date.pipe'; import { getErrorStatus, getLoadingStatus } from '../../../shared/modules/loading/getStatus'; import { FORECAST } from './forecast.constants'; const forecastStateSlice = (state: StoreState) => state.forecast; export const selectForecastCalculations = (state: StoreState) => forecastStateSlice(state).aggregations; export const selectForecastActiveCalculationId = (state: StoreState) => forecastStateSlice(state).selectedAggregation; export const createForecastIsLoadingSelector = (forecastFetchCollectionSelector) => (state) => getLoadingStatus(forecastFetchCollectionSelector)(state); export const createForecastErrorStatusSelector = (forecastFetchCollectionSelector) => (state) => getErrorStatus(forecastFetchCollectionSelector)(state); const createBarData = (aggregation) => { return { id: aggregation.id, date: aggregation.date, label: datePipe.formatShortMonth(aggregation.date).toUpperCase(), value: aggregation.currentCalculatedRate, filledRatio: aggregation.type === FORECAST.TYPE_PAST ? 100 : aggregation.fixedPercentage, previousValue: aggregation.previousCalculatedRate, type: aggregation.type, trend: aggregation.trend, }; }; const reduceAggregationMaxValue = (previousMax, aggregation) => { return Math.max(previousMax, aggregation.currentCalculatedRate); }; export const selectForecastChartData = createSelector( [ selectForecastCalculations, selectForecastActiveCalculationId ], (calculations, activeCalculationId) => { const maxValue = calculations.reduce(reduceAggregationMaxValue, 0) * 1.1; const barSeries = calculations.map(createBarData); return { maxValue: maxValue, selectedId: activeCalculationId, barSeries: barSeries, }; } ); export const selectKeyValues = createSelector( selectForecastCalculations, selectForecastActiveCalculationId, (forecasts, activeForecastId) => { if (!forecasts || activeForecastId === null) { return {}; } const forecast = forecasts[activeForecastId]; return { selectedMonth: datePipe.formatLongMonthWithYear(forecast.date), lastUpdateDate: datePipe.formatDayWithLongMonth(forecast.createdAt), value: forecast.currentCalculatedRate, fixedPercentage: forecast.fixedPercentage, unfixedPercentage: forecast.unfixedPercentage, fixedRate: forecast.fixedRate, unfixedRate: forecast.unfixedRate, payoutRatio: forecast.payoutRatio, }; } );