import moment from 'moment'; import { connect } from 'react-redux'; import { createSelector } from 'reselect'; import * as commandNames from 'Commands/commandNames'; import withCurrentPage from 'Components/withCurrentPage'; import { searchMissing, setCalendarDaysCount, setCalendarFilter } from 'Store/Actions/calendarActions'; import { executeCommand } from 'Store/Actions/commandActions'; import createCommandExecutingSelector from 'Store/Selectors/createCommandExecutingSelector'; import createCommandsSelector from 'Store/Selectors/createCommandsSelector'; import createMovieCountSelector from 'Store/Selectors/createMovieCountSelector'; import createUISettingsSelector from 'Store/Selectors/createUISettingsSelector'; import { isCommandExecuting } from 'Utilities/Command'; import isBefore from 'Utilities/Date/isBefore'; import CalendarPage from './CalendarPage'; function createMissingMovieIdsSelector() { return createSelector( (state) => state.calendar.start, (state) => state.calendar.end, (state) => state.calendar.items, (state) => state.queue.details.items, (start, end, movies, queueDetails) => { return movies.reduce((acc, movie) => { const inCinemas = movie.inCinemas; if ( !movie.movieFileId && moment(inCinemas).isAfter(start) && moment(inCinemas).isBefore(end) && isBefore(movie.inCinemas) && !queueDetails.some((details) => details.movieId === movie.id) ) { acc.push(movie.id); } return acc; }, []); } ); } function createIsSearchingSelector() { return createSelector( (state) => state.calendar.searchMissingCommandId, createCommandsSelector(), (searchMissingCommandId, commands) => { if (searchMissingCommandId == null) { return false; } return isCommandExecuting(commands.find((command) => { return command.id === searchMissingCommandId; })); } ); } function createMapStateToProps() { return createSelector( (state) => state.calendar.selectedFilterKey, (state) => state.calendar.filters, createMovieCountSelector(), createUISettingsSelector(), createMissingMovieIdsSelector(), createCommandExecutingSelector(commandNames.RSS_SYNC), createIsSearchingSelector(), ( selectedFilterKey, filters, movieCount, uiSettings, missingMovieIds, isRssSyncExecuting, isSearchingForMissing ) => { return { selectedFilterKey, filters, colorImpairedMode: uiSettings.enableColorImpairedMode, hasMovie: !!movieCount.count, movieError: movieCount.error, movieIsFetching: movieCount.isFetching, movieIsPopulated: movieCount.isPopulated, missingMovieIds, isRssSyncExecuting, isSearchingForMissing }; } ); } function createMapDispatchToProps(dispatch, props) { return { onRssSyncPress() { dispatch(executeCommand({ name: commandNames.RSS_SYNC })); }, onSearchMissingPress(movieIds) { dispatch(searchMissing({ movieIds })); }, onDaysCountChange(dayCount) { dispatch(setCalendarDaysCount({ dayCount })); }, onFilterSelect(selectedFilterKey) { dispatch(setCalendarFilter({ selectedFilterKey })); } }; } export default withCurrentPage( connect(createMapStateToProps, createMapDispatchToProps)(CalendarPage) );