UNPKG

@appearhere/bloom

Version:

Appear Here's pattern library and styleguide

114 lines (101 loc) 3.36 kB
import PropTypes from 'prop-types'; import React, { Component } from 'react'; import cx from 'classnames'; import momentPropTypes from 'react-moment-proptypes'; import keyMirror from 'key-mirror'; import Icon from '../../Icon/Icon'; import noop from '../../../utils/noop'; import DayPickerItem from './DayPickerItem'; import moment from '../../../utils/moment/moment'; import BtnContainer from '../../BtnContainer/BtnContainer'; import ScreenReadable from '../../ScreenReadable/ScreenReadable'; import CalendarMonth, { defaultClassNames } from '../CalendarMonth/CalendarMonth'; import css from './DayPicker.css'; const classNames = Object.assign({}, defaultClassNames, { head: cx(defaultClassNames.head, css.head), cell: cx(defaultClassNames.cell, css.cell), }); export const SELECT_DATE = keyMirror({ START: null, END: null, }); export const getDates = (startDate, endDate) => { if (!endDate) return [startDate]; if (!startDate) return [endDate]; return startDate.isAfter(endDate) ? Array.from(moment.range(endDate, startDate).by('day')) : Array.from(moment.range(startDate, endDate).by('day')); }; const today = moment(); export default class DayPicker extends Component { static propTypes = { month: momentPropTypes.momentObj, onInteraction: PropTypes.func, onMonthChange: PropTypes.func, dayProps: PropTypes.object, accessibilityNextLabel: PropTypes.string, accessibilityPrevLabel: PropTypes.string, }; static defaultProps = { month: today, onInteraction: noop, onHighlight: noop, onMonthChange: noop, dayProps: {}, accessibilityNextLabel: 'Go to next month', accessibilityPrevLabel: 'Go to previous month', }; handleNextMonth = (e) => { const { month, onMonthChange } = this.props; const nextMonth = month.clone().add(1, 'month'); onMonthChange(e, nextMonth); }; handlePreviousMonth = (e) => { const { month, onMonthChange } = this.props; const prevMonth = month.clone().add(-1, 'month'); onMonthChange(e, prevMonth); }; render() { const { month, dayProps, onInteraction, accessibilityNextLabel, accessibilityPrevLabel, } = this.props; return ( <div className={css.root}> <div className={css.header}> <div className={cx(css.control, css.prevControl)}> <BtnContainer onClick={this.handlePreviousMonth}> <Icon name="chevron" className={css.prevIcon} /> <ScreenReadable>{ accessibilityPrevLabel }</ScreenReadable> </BtnContainer> </div> <div className={css.month}> { month.format('MMMM YYYY') } </div> <div className={cx(css.control, css.nextControl)}> <BtnContainer onClick={this.handleNextMonth}> <Icon name="chevron" className={css.nextIcon} /> <ScreenReadable>{ accessibilityNextLabel }</ScreenReadable> </BtnContainer> </div> </div> <CalendarMonth {...this.props} classNames={classNames} month={month} columnHeadingProps={{ className: css.columnHeader, }} dayProps={{ ...dayProps, onInteraction, }} DayComponent={DayPickerItem} /> </div> ); } }