UNPKG

@atlaskit/calendar

Version:

An interactive calendar for date selection experiences.

241 lines (239 loc) 8.03 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = useHandleDateChange; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = require("react"); var _constants = require("../constants"); var _dateToString = _interopRequireDefault(require("../utils/date-to-string")); var _getDaysInMonth = _interopRequireDefault(require("../utils/get-days-in-month")); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var getNextMonth = function getNextMonth(monthValue, yearValue) { var month = monthValue; var year = yearValue; if (month === _constants.monthsPerYear) { month = 1; year += 1; } else { month += 1; } return { month: month, year: year }; }; var getPrevMonth = function getPrevMonth(monthValue, yearValue) { var month = monthValue; var year = yearValue; if (month === 1) { month = _constants.monthsPerYear; year -= 1; } else { month -= 1; } return { month: month, year: year }; }; // eslint-disable-next-line @repo/internal/react/require-jsdoc function useHandleDateChange(_ref) { var _ref$day = (0, _slicedToArray2.default)(_ref.day, 2), dayValue = _ref$day[0], setDayValue = _ref$day[1], _ref$month = (0, _slicedToArray2.default)(_ref.month, 2), monthValue = _ref$month[0], setMonthValue = _ref$month[1], _ref$year = (0, _slicedToArray2.default)(_ref.year, 2), yearValue = _ref$year[0], setYearValue = _ref$year[1], _ref$shouldSetFocus = (0, _slicedToArray2.default)(_ref.shouldSetFocus, 2), _shouldSetFocus = _ref$shouldSetFocus[0], setShouldSetFocus = _ref$shouldSetFocus[1], onChange = _ref.onChange; var dateRef = (0, _react.useRef)({ day: dayValue, month: monthValue, year: yearValue }); (0, _react.useEffect)(function () { dateRef.current = { day: dayValue, month: monthValue, year: yearValue }; }, [dayValue, monthValue, yearValue]); var triggerOnChange = (0, _react.useCallback)(function (_ref2) { var year = _ref2.year, month = _ref2.month, day = _ref2.day, type = _ref2.type; var iso = (0, _dateToString.default)({ year: year, month: month, day: day }); var isFocusableType = ['up', 'down', 'left', 'right'].includes(type); onChange({ day: day, month: month, year: year, iso: iso, type: type }); setDayValue(day); setMonthValue(month); setYearValue(year); setShouldSetFocus(isFocusableType); }, [onChange, setDayValue, setMonthValue, setYearValue, setShouldSetFocus]); var navigate = (0, _react.useCallback)(function (type) { var _dateRef$current = dateRef.current, day = _dateRef$current.day, month = _dateRef$current.month, year = _dateRef$current.year; if (type === 'down') { var next = day + _constants.daysPerWeek; var daysInMonth = (0, _getDaysInMonth.default)(year, month - 1); if (next > daysInMonth) { var _getNextMonth = getNextMonth(month, year), nextMonth = _getNextMonth.month, nextYear = _getNextMonth.year; triggerOnChange({ year: nextYear, month: nextMonth, day: next - daysInMonth, type: type }); } else { triggerOnChange({ year: year, month: month, day: next, type: type }); } } else if (type === 'left') { var prev = day - 1; if (prev < 1) { var _getPrevMonth = getPrevMonth(month, year), prevMonth = _getPrevMonth.month, prevYear = _getPrevMonth.year; var prevDay = (0, _getDaysInMonth.default)(prevYear, prevMonth - 1); triggerOnChange({ year: prevYear, month: prevMonth, day: prevDay, type: type }); } else { triggerOnChange({ year: year, month: month, day: prev, type: type }); } } else if (type === 'right') { var _next = day + 1; var _daysInMonth = (0, _getDaysInMonth.default)(year, month - 1); if (_next > _daysInMonth) { var _getNextMonth2 = getNextMonth(month, year), _nextMonth = _getNextMonth2.month, _nextYear = _getNextMonth2.year; triggerOnChange({ year: _nextYear, month: _nextMonth, day: 1, type: type }); } else { triggerOnChange({ year: year, month: month, day: _next, type: type }); } } else if (type === 'up') { var _prev = day - _constants.daysPerWeek; if (_prev < 1) { var _getPrevMonth2 = getPrevMonth(month, year), _prevMonth = _getPrevMonth2.month, _prevYear = _getPrevMonth2.year; var _prevDay = (0, _getDaysInMonth.default)(_prevYear, _prevMonth - 1) + _prev; triggerOnChange({ year: _prevYear, month: _prevMonth, day: _prevDay, type: type }); } else { triggerOnChange({ year: year, month: month, day: _prev, type: type }); } } }, [triggerOnChange]); var handleClickNextMonth = (0, _react.useCallback)(function () { var _dateRef$current$getN = _objectSpread(_objectSpread({}, dateRef.current), getNextMonth(dateRef.current.month, dateRef.current.year)), day = _dateRef$current$getN.day, month = _dateRef$current$getN.month, year = _dateRef$current$getN.year; triggerOnChange({ day: day, month: month, year: year, type: 'nextMonth' }); }, [triggerOnChange]); var handleClickNextYear = (0, _react.useCallback)(function () { var _dateRef$current2 = dateRef.current, day = _dateRef$current2.day, month = _dateRef$current2.month, year = _dateRef$current2.year; triggerOnChange({ day: day, month: month, year: year + 1, type: 'nextYear' }); }, [triggerOnChange]); var handleClickPrevMonth = (0, _react.useCallback)(function () { var _dateRef$current$getP = _objectSpread(_objectSpread({}, dateRef.current), getPrevMonth(dateRef.current.month, dateRef.current.year)), day = _dateRef$current$getP.day, month = _dateRef$current$getP.month, year = _dateRef$current$getP.year; triggerOnChange({ day: day, month: month, year: year, type: 'prevMonth' }); }, [triggerOnChange]); var handleClickPrevYear = (0, _react.useCallback)(function () { var _dateRef$current3 = dateRef.current, day = _dateRef$current3.day, month = _dateRef$current3.month, year = _dateRef$current3.year; triggerOnChange({ day: day, month: month, year: year - 1, type: 'prevYear' }); }, [triggerOnChange]); return { navigate: navigate, handleClickNextMonth: handleClickNextMonth, handleClickNextYear: handleClickNextYear, handleClickPrevMonth: handleClickPrevMonth, handleClickPrevYear: handleClickPrevYear }; }