|
|
|
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');
|
|
|
|
|
|
|
|
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 (
|
|
|
|
<Calendar
|
|
|
|
{...this.props}
|
|
|
|
onCalendarViewChange={this.onCalendarViewChange}
|
|
|
|
onTodayPress={this.onTodayPress}
|
|
|
|
onPreviousPress={this.onPreviousPress}
|
|
|
|
onNextPress={this.onNextPress}
|
|
|
|
/>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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);
|