import PropTypes from 'prop-types'; import React, { Component } from 'react'; import { connect } from 'react-redux'; import { createSelector } from 'reselect'; import * as calendarActions from 'Store/Actions/calendarActions'; import { clearQueueDetails, fetchQueueDetails } from 'Store/Actions/queueActions'; import { clearTrackFiles, fetchTrackFiles } from 'Store/Actions/trackFileActions'; import hasDifferentItems from 'Utilities/Object/hasDifferentItems'; import selectUniqueIds from 'Utilities/Object/selectUniqueIds'; import { registerPagePopulator, unregisterPagePopulator } from 'Utilities/pagePopulator'; 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() { const { useCurrentPage, fetchCalendar, gotoCalendarToday } = this.props; registerPagePopulator(this.repopulate); if (useCurrentPage) { fetchCalendar(); } else { 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'); if (items.length) { 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 = { useCurrentPage: PropTypes.bool.isRequired, 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);