import React, { Component, PropTypes } from 'react'; import CssTransitionGroup from 'react-addons-css-transition-group'; import { SlideLeft, SlideRight } from '../animations'; import time from '../utils/time.js'; import utils from '../utils/utils.js'; import CalendarMonth from './CalendarMonth.js'; const DIRECTION_STEPS = { left: -1, right: 1 }; const factory = (IconButton) => { class Calendar extends Component { static propTypes = { display: PropTypes.oneOf(['months', 'years']), locale: React.PropTypes.oneOfType([ React.PropTypes.string, React.PropTypes.object ]), maxDate: PropTypes.object, minDate: PropTypes.object, onChange: PropTypes.func, selectedDate: PropTypes.object, sundayFirstDayOfWeek: React.PropTypes.bool, theme: PropTypes.shape({ active: PropTypes.string, calendar: PropTypes.string, next: PropTypes.string, prev: PropTypes.string, years: PropTypes.string }), viewDate: PropTypes.object }; static defaultProps = { display: 'months', selectedDate: new Date() }; state = { viewDate: this.props.selectedDate }; componentDidUpdate () { if (this.refs.activeYear) { this.scrollToActive(); } } scrollToActive () { this.refs.years.scrollTop = this.refs.activeYear.offsetTop - this.refs.years.offsetHeight / 2 + this.refs.activeYear.offsetHeight / 2; } handleDayClick = (day) => { this.props.onChange(time.setDay(this.state.viewDate, day), true); }; handleYearClick = (event) => { const year = parseInt(event.target.id); const viewDate = time.setYear(this.props.selectedDate, year); this.setState({viewDate}); this.props.onChange(viewDate, false); }; changeViewMonth = (event) => { const direction = event.target.id; this.setState({ direction, viewDate: time.addMonths(this.state.viewDate, DIRECTION_STEPS[direction]) }); }; renderYears () { return ( ); } renderMonths () { const { theme } = this.props; const animation = this.state.direction === 'left' ? SlideLeft : SlideRight; return (
); } render () { return (
{this.props.display === 'months' ? this.renderMonths() : this.renderYears()}
); } } return Calendar; }; export default factory;