UNPKG

react-infinite-calendar

Version:

Infinite scrolling date-picker built with React, with localization, themes, keyboard support, and more.

98 lines (85 loc) 3.34 kB
import _withState from 'recompose/withState'; import _withPropsOnChange from 'recompose/withPropsOnChange'; import _withProps from 'recompose/withProps'; import _compose from 'recompose/compose'; function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } import { withDefaultProps } from './'; import { sanitizeDate, withImmutableProps } from '../utils'; import enhanceHeader from '../Header/withMultipleDates'; import format from 'date-fns/format'; import parse from 'date-fns/parse'; // Enhance Day component to display selected state based on an array of selected dates export var enhanceDay = _withPropsOnChange(['selected'], function (props) { return { isSelected: props.selected.indexOf(props.date) !== -1 }; }); // Enhance year component var enhanceYears = _withProps(function (_ref) { var displayDate = _ref.displayDate; return { selected: displayDate ? parse(displayDate) : null }; }); // Enhancer to handle selecting and displaying multiple dates var withMultipleDates = _compose(withDefaultProps, _withState('scrollDate', 'setScrollDate', getInitialDate), _withState('displayDate', 'setDisplayDate', getInitialDate), withImmutableProps(function (_ref2) { var DayComponent = _ref2.DayComponent, HeaderComponent = _ref2.HeaderComponent, YearsComponent = _ref2.YearsComponent; return { DayComponent: enhanceDay(DayComponent), HeaderComponent: enhanceHeader(HeaderComponent), YearsComponent: enhanceYears(YearsComponent) }; }), _withProps(function (_ref3) { var displayDate = _ref3.displayDate, onSelect = _ref3.onSelect, setDisplayDate = _ref3.setDisplayDate, scrollToDate = _ref3.scrollToDate, props = _objectWithoutProperties(_ref3, ['displayDate', 'onSelect', 'setDisplayDate', 'scrollToDate']); return { passThrough: { Day: { onClick: function onClick(date) { return handleSelect(date, { onSelect: onSelect, setDisplayDate: setDisplayDate }); } }, Header: { setDisplayDate: setDisplayDate }, Years: { displayDate: displayDate, onSelect: function onSelect(year, e, callback) { return handleYearSelect(year, callback); }, selected: displayDate } }, selected: props.selected.filter(function (date) { return sanitizeDate(date, props); }).map(function (date) { return format(date, 'YYYY-MM-DD'); }) }; })); export { withMultipleDates }; function handleSelect(date, _ref4) { var onSelect = _ref4.onSelect, setDisplayDate = _ref4.setDisplayDate; onSelect(date); setDisplayDate(date); } function handleYearSelect(date, callback) { callback(parse(date)); } function getInitialDate(_ref5) { var selected = _ref5.selected; return selected.length ? selected[0] : new Date(); } export function defaultMultipleDateInterpolation(date, selected) { var selectedMap = selected.map(function (date) { return format(date, 'YYYY-MM-DD'); }); var index = selectedMap.indexOf(format(date, 'YYYY-MM-DD')); return index === -1 ? [].concat(selected, [date]) : [].concat(selected.slice(0, index), selected.slice(index + 1)); }