UNPKG

@appannie/react-infinite-calendar

Version:

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

242 lines (216 loc) 8.44 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _objectSpread = require('@babel/runtime/helpers/objectSpread2'); var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties'); var _defineProperty = require('@babel/runtime/helpers/defineProperty'); var React = require('react'); var recompose = require('recompose'); var classNames = require('classnames'); var index = require('./index.js'); var index$1 = require('../utils/index.js'); var withRange$1 = require('../Header/withRange.js'); var dateFnV2 = require('../utils/dateFnV2.js'); var Day = require('../Day/Day.scss.js'); var parse = require('../utils/parse.js'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var _objectSpread__default = /*#__PURE__*/_interopDefaultLegacy(_objectSpread); var _objectWithoutProperties__default = /*#__PURE__*/_interopDefaultLegacy(_objectWithoutProperties); var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty); var React__default = /*#__PURE__*/_interopDefaultLegacy(React); var classNames__default = /*#__PURE__*/_interopDefaultLegacy(classNames); var isTouchDevice = false; var EVENT_TYPE = { END: 3, HOVER: 2, START: 1 }; // Enhance Day component to display selected state based on an array of selected dates var enhanceDay = recompose.withPropsOnChange(['selected'], function (_ref) { var _classNames; var date = _ref.date, selected = _ref.selected, theme = _ref.theme, isWeeklySelection = _ref.isWeeklySelection; var start = selected.start, end = selected.end; if (isWeeklySelection) { start = dateFnV2.format(dateFnV2.startOfWeek(start), 'yyyy-MM-dd'); end = dateFnV2.format(dateFnV2.endOfWeek(end), 'yyyy-MM-dd'); } var isSelected = date >= start && date <= end; var isStart = date === start; var isEnd = date === end; var isRange = !(isStart && isEnd); var style = isRange && (isStart && { backgroundColor: theme.accentColor } || isEnd && { backgroundColor: theme.accentColor }); return { className: isSelected && isRange && classNames__default['default'](Day['default'].range, (_classNames = {}, _defineProperty__default['default'](_classNames, Day['default'].start, isStart), _defineProperty__default['default'](_classNames, Day['default'].betweenRange, !isStart && !isEnd), _defineProperty__default['default'](_classNames, Day['default'].end, isEnd), _classNames)), isSelected: isSelected, selectionStyle: style }; }); // Enhancer to handle selecting and displaying multiple dates var withRange = function withRange(Calendar) { var CalendarWithRef = function CalendarWithRef(_ref2) { var forwardedRef = _ref2.forwardedRef, props = _objectWithoutProperties__default['default'](_ref2, ["forwardedRef"]); return /*#__PURE__*/React__default['default'].createElement(Calendar, Object.assign({}, props, { ref: forwardedRef })); }; var EnhancedCalendar = recompose.compose(index.withDefaultProps, recompose.withState('scrollDate', 'setScrollDate', getInitialDate), recompose.withState('displayKey', 'setDisplayKey', getInitialDate), recompose.withState('selectionStart', 'setSelectionStart', null), recompose.withState('hoveredDate', 'setHoveredDate'), index$1.withImmutableProps(function (_ref3) { var DayComponent = _ref3.DayComponent, HeaderComponent = _ref3.HeaderComponent; return { DayComponent: enhanceDay(DayComponent), HeaderComponent: withRange$1['default'](HeaderComponent) }; }), recompose.withProps(function (_ref4) { var displayKey = _ref4.displayKey, passThrough = _ref4.passThrough, selected = _ref4.selected, setDisplayKey = _ref4.setDisplayKey, hoveredDate = _ref4.hoveredDate, setHoveredDate = _ref4.setHoveredDate, forwardedRef = _ref4.forwardedRef, props = _objectWithoutProperties__default['default'](_ref4, ["displayKey", "passThrough", "selected", "setDisplayKey", "hoveredDate", "setHoveredDate", "forwardedRef"]); return { /* eslint-disable sort-keys */ passThrough: _objectSpread__default['default'](_objectSpread__default['default']({}, passThrough), {}, { Day: { hoveredDate: hoveredDate, isWeeklySelection: Boolean(props.isWeeklySelection), onClick: function onClick(date) { return handleSelect(date, _objectSpread__default['default']({ selected: selected }, props)); }, onMouseEnter: setHoveredDate, onMouseLeave: function onMouseLeave() { return setHoveredDate(undefined); }, handlers: { onMouseOver: !isTouchDevice && props.selectionStart ? function (e) { return handleMouseOver(e, _objectSpread__default['default']({ selected: selected }, props)); } : null } }, Years: { selected: selected && selected[displayKey], onSelect: function onSelect(date) { return handleYearSelect(date, _objectSpread__default['default']({ displayKey: displayKey, selected: selected }, props)); } }, Header: { isWeeklySelection: Boolean(props.isWeeklySelection), onYearClick: function onYearClick(date, e, key) { return setDisplayKey(key || 'start'); } } }), selected: { start: selected && dateFnV2.format(selected.start, 'yyyy-MM-dd'), end: selected && dateFnV2.format(selected.end, 'yyyy-MM-dd') }, forwardedRef: forwardedRef }; }))(CalendarWithRef); return /*#__PURE__*/React.forwardRef(function (props, ref) { return /*#__PURE__*/React__default['default'].createElement(EnhancedCalendar, Object.assign({}, props, { forwardedRef: ref })); }); }; function getSortedSelection(_ref5) { var start = _ref5.start, end = _ref5.end; return dateFnV2.isBefore(start, end) ? { start: start, end: end } : { start: end, end: start }; } function handleSelect(date, _ref6) { var onSelect = _ref6.onSelect, selectionStart = _ref6.selectionStart, setSelectionStart = _ref6.setSelectionStart, isWeeklySelection = _ref6.isWeeklySelection; if (selectionStart) { var _getSortedSelection = getSortedSelection({ start: selectionStart, end: date }), start = _getSortedSelection.start, end = _getSortedSelection.end; if (isWeeklySelection) { start = dateFnV2.startOfWeek(start); end = dateFnV2.endOfWeek(end); } onSelect({ eventType: EVENT_TYPE.END, start: start, end: end }); setSelectionStart(null); } else { if (isWeeklySelection) { onSelect({ eventType: EVENT_TYPE.START, start: dateFnV2.startOfWeek(date), end: dateFnV2.endOfWeek(date) }); setSelectionStart(dateFnV2.startOfWeek(date)); } else { onSelect({ eventType: EVENT_TYPE.START, start: date, end: date }); setSelectionStart(date); } } } function handleMouseOver(e, _ref7) { var onSelect = _ref7.onSelect, selectionStart = _ref7.selectionStart; var dateStr = e.target.getAttribute('data-date'); var date = dateStr && parse.parseDate(dateStr); if (!date) { return; } onSelect(_objectSpread__default['default']({ eventType: EVENT_TYPE.HOVER }, getSortedSelection({ start: selectionStart, end: date }))); } function handleYearSelect(date, _ref8) { var displayKey = _ref8.displayKey, onSelect = _ref8.onSelect, selected = _ref8.selected, setScrollDate = _ref8.setScrollDate; setScrollDate(date); onSelect(getSortedSelection(Object.assign({}, selected, _defineProperty__default['default']({}, displayKey, parse.parseDate(date))))); } function getInitialDate(_ref9) { var selected = _ref9.selected; return selected && selected.start || new Date(); } if (typeof window !== 'undefined') { window.addEventListener('touchstart', function onTouch() { isTouchDevice = true; window.removeEventListener('touchstart', onTouch, false); }); } exports.EVENT_TYPE = EVENT_TYPE; exports.enhanceDay = enhanceDay; exports.withRange = withRange;