import { StoreState } from 'app/common/store/store.types'; import { getErrorStatus, getLoadingStatus } from '../../../shared/modules/loading/getStatus'; import { createSelector } from 'reselect'; const marketsStateSlice = (state: StoreState) => state.markets; export const selectMarketForecastExposures = (state: StoreState) => marketsStateSlice(state).forecastExposure; export const selectHasImoCargoInExposure = (state: StoreState) => selectMarketForecastExposures(state).find(exposure => exposure.imoCargo !== null) !== undefined; export const createMarketsIsLoadingSelector = (marketsFetchCollectionSelector) => (state: StoreState) => getLoadingStatus(marketsFetchCollectionSelector)(state); export const createMarketsErrorStatusSelector = (marketsFetchCollectionSelector) => (state: StoreState) => getErrorStatus(marketsFetchCollectionSelector)(state); export const selectProgressBarExposures = createSelector( [ selectMarketForecastExposures, selectHasImoCargoInExposure ], (marketForecastExposures, hasImoCargoInExposure) => { const pool: number[] = []; const market: number[] = []; const legend: string[] = []; const imoCargo: number[] = []; marketForecastExposures.forEach(marketForecastExposure => { pool.push(marketForecastExposure.poolPercentage); market.push(marketForecastExposure.marketPercentage); legend.push(marketForecastExposure.market.name); if (hasImoCargoInExposure) { imoCargo.push(marketForecastExposure.imoCargo || 0); } }); return { pool, market, legend, imoCargo: hasImoCargoInExposure ? imoCargo : undefined, }; } ); export const selectComments = (store: StoreState) => store.markets.commentaries; export const selectCommentsLimit = (store: StoreState) => store.markets.limit; export const selectIsMoreComments = createSelector( selectComments, selectCommentsLimit, (comments, limit) => { return comments.length > limit; } ); export const selectOrderedComments = createSelector( selectComments, selectCommentsLimit, (comments, limit) => { return comments .sort((a, b) => new Date(b.relevantDate).getTime() - new Date(a.relevantDate).getTime()) .slice(0, limit); } );