@atlaskit/calendar
Version:
An interactive calendar for date selection experiences.
241 lines (239 loc) • 8.03 kB
JavaScript
"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
};
}