import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { connect } from 'react-redux'; import { createSelector } from 'reselect'; import { registerPagePopulator, unregisterPagePopulator } from 'Utilities/pagePopulator'; import hasDifferentItems from 'Utilities/Object/hasDifferentItems'; import selectUniqueIds from 'Utilities/Object/selectUniqueIds'; import * as calendarActions from 'Store/Actions/calendarActions'; import { fetchTrackFiles, clearTrackFiles } from 'Store/Actions/trackFileActions'; import { fetchQueueDetails, clearQueueDetails } from 'Store/Actions/queueActions'; import Calendar from './Calendar'; const UPDATE_DELAY = 3600000; // 1 hour function createMapStateToProps() { return createSelector( (state) => state.calendar, (calendar) => { return calendar; } ); } const mapDispatchToProps = { ...calendarActions, fetchTrackFiles, clearTrackFiles, fetchQueueDetails, clearQueueDetails }; class CalendarConnector extends Component { // // Lifecycle constructor(props, context) { super(props, context); this.updateTimeoutId = null; } componentDidMount() { registerPagePopulator(this.repopulate); this.props.gotoCalendarToday(); this.scheduleUpdate(); } componentDidUpdate(prevProps) { const { items, time } = this.props; if (hasDifferentItems(prevProps.items, items)) { const albumIds = selectUniqueIds(items, 'id'); // const trackFileIds = selectUniqueIds(items, 'trackFileId'); this.props.fetchQueueDetails({ albumIds }); // if (trackFileIds.length) { // this.props.fetchTrackFiles({ trackFileIds }); // } } if (prevProps.time !== time) { this.scheduleUpdate(); } } componentWillUnmount() { unregisterPagePopulator(this.repopulate); this.props.clearCalendar(); this.props.clearQueueDetails(); this.props.clearTrackFiles(); this.clearUpdateTimeout(); } // // Control repopulate = () => { const { time, view } = this.props; this.props.fetchQueueDetails({ time, view }); this.props.fetchCalendar({ time, view }); } scheduleUpdate = () => { this.clearUpdateTimeout(); this.updateTimeoutId = setTimeout(this.updateCalendar, UPDATE_DELAY); } clearUpdateTimeout = () => { if (this.updateTimeoutId) { clearTimeout(this.updateTimeoutId); } } updateCalendar = () => { this.props.gotoCalendarToday(); this.scheduleUpdate(); } // // Listeners onCalendarViewChange = (view) => { this.props.setCalendarView({ view }); } onTodayPress = () => { this.props.gotoCalendarToday(); } onPreviousPress = () => { this.props.gotoCalendarPreviousRange(); } onNextPress = () => { this.props.gotoCalendarNextRange(); } // // Render render() { return ( ); } } CalendarConnector.propTypes = { time: PropTypes.string, view: PropTypes.string.isRequired, items: PropTypes.arrayOf(PropTypes.object).isRequired, setCalendarView: PropTypes.func.isRequired, gotoCalendarToday: PropTypes.func.isRequired, gotoCalendarPreviousRange: PropTypes.func.isRequired, gotoCalendarNextRange: PropTypes.func.isRequired, clearCalendar: PropTypes.func.isRequired, fetchCalendar: PropTypes.func.isRequired, fetchTrackFiles: PropTypes.func.isRequired, clearTrackFiles: PropTypes.func.isRequired, fetchQueueDetails: PropTypes.func.isRequired, clearQueueDetails: PropTypes.func.isRequired }; export default connect(createMapStateToProps, mapDispatchToProps)(CalendarConnector);