@helpscout/hsds-react
Version:
React component library for Help Scout's Design System
149 lines (120 loc) • 6.55 kB
JavaScript
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;
;