UNPKG

@helpscout/hsds-react

Version:

React component library for Help Scout's Design System

149 lines (120 loc) 6.55 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _hooks = require("@datepicker-react/hooks"); var _classnames = _interopRequireDefault(require("classnames")); var _Datepicker = _interopRequireDefault(require("./Datepicker.Context")); var _Datepicker2 = require("./Datepicker.utils"); var _Datepicker3 = require("./Datepicker.css"); var _jsxRuntime = require("react/jsx-runtime"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function Day(_ref) { var dayLabel = _ref.dayLabel, date = _ref.date, _ref$leading = _ref.leading, leading = _ref$leading === void 0 ? false : _ref$leading, _ref$trailing = _ref.trailing, trailing = _ref$trailing === void 0 ? false : _ref$trailing; var dayRef = (0, _react.useRef)(null); var _useContext = (0, _react.useContext)(_Datepicker.default), enableRangeSelection = _useContext.enableRangeSelection, endDate = _useContext.endDate, startDate = _useContext.startDate, isDateBlocked = _useContext.isDateBlocked, isDateFocused = _useContext.isDateFocused, isDateHovered = _useContext.isDateHovered, isDateSelected = _useContext.isDateSelected, isFirstOrLastSelectedDate = _useContext.isFirstOrLastSelectedDate, onDateSelect = _useContext.onDateSelect, onDateHover = _useContext.onDateHover; var _useDay = (0, _hooks.useDay)({ date: date, isDateBlocked: isDateBlocked, isDateFocused: isDateFocused, isDateHovered: isDateHovered, isDateSelected: isDateSelected, isFirstOrLastSelectedDate: isFirstOrLastSelectedDate, onDateSelect: handleDaySelect, onDateHover: handleDayHover, dayRef: dayRef }), isSelected = _useDay.isSelected, isSelectedStartOrEnd = _useDay.isSelectedStartOrEnd, isWithinHoverRange = _useDay.isWithinHoverRange, disabledDate = _useDay.disabledDate, onClick = _useDay.onClick, onMouseEnter = _useDay.onMouseEnter; var isDateToday = (0, _Datepicker2.isToday)(date); var dateString = (0, _Datepicker2.getValidDateTimeString)(getCorrectDateToSet(date)); var startDateString = (0, _Datepicker2.getValidDateTimeString)(startDate); var endDateString = (0, _Datepicker2.getValidDateTimeString)(endDate); var isTrailingDayInsideRange; if (enableRangeSelection && trailing && startDate && endDate) { isTrailingDayInsideRange = (0, _Datepicker2.isInsideRange)({ to: endDate, from: startDate, check: getCorrectDateToSet(date) }); } var isDaySelected = isSelected || dateString === endDateString || isTrailingDayInsideRange; function handleDayHover(date) { onDateHover(getCorrectDateToSet(date)); } function handleDaySelect(date) { onDateSelect(getCorrectDateToSet(date)); dayRef && dayRef.current && dayRef.current.focus(); } /** * "trailing" days are not supported by `@datepicker-react/hooks` * if one is clicked and it's going to move to January, make sure to also * go to the next year */ function getCorrectDateToSet(date) { if (!date) return ''; // Avoid mutation of `date` var dateCopy = new Date(date.toString()); if (trailing && date.getMonth() === 0) { dateCopy.setFullYear(dateCopy.getFullYear() + 1); } return dateCopy; } /** * This UI Helper is the light blue background * that appears on a start and end dates in a range */ function shouldShowDateRangeBGHelper() { if (!enableRangeSelection) return false; if (startDateString === endDateString) return false; if (isSelectedStartOrEnd && isSelected) return true; if (isSelectedStartOrEnd && !isWithinHoverRange) return false; if (trailing && isDaySelected) return true; return isSelectedStartOrEnd; } function getClassNames() { return (0, _classnames.default)('c-DatepickerDay', (trailing || leading) && 'is-from-another-month', isDaySelected && 'is-selected', enableRangeSelection && isSelectedStartOrEnd && dateString === startDateString && 'is-selected-start', enableRangeSelection && (isSelectedStartOrEnd || isSelected || dateString === endDateString) && dateString === endDateString && 'is-selected-end', isDateToday && 'is-today', enableRangeSelection && 'with-range-selection', isWithinHoverRange && 'is-within-hover-range', disabledDate && 'is-disabled'); } return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Datepicker3.DayUI, { className: getClassNames(), enableRangeSelection: enableRangeSelection, "aria-selected": isDaySelected, "aria-label": (0, _Datepicker2.getHumanReadableDate)(dateString), disabled: disabledDate, isSelected: isDaySelected, isDateToday: isDateToday, onClick: onClick, onMouseEnter: onMouseEnter, ref: dayRef, tabIndex: trailing || leading ? '-1' : '0', type: "button", children: [shouldShowDateRangeBGHelper() ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Datepicker3.DateRangeBGHelperUI, { className: (0, _classnames.default)('selected-date-marker', dateString === startDateString && 'is-selected-start-marker', dateString === endDateString && 'is-selected-end-marker') }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(_Datepicker3.TimeUI, { dateTime: dateString, children: dayLabel })] }); } var _default = Day; exports.default = _default;