@razorpay/blade
Version:
The Design System that powers Razorpay
167 lines (164 loc) • 5.87 kB
JavaScript
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
import dayjs from 'dayjs';
import { useState, useEffect } from 'react';
import { useUncontrolledDates } from './useControlledDates.js';
function isInRange(date, range) {
var _range = _toConsumableArray(range).sort(function (a, b) {
return a.getTime() - b.getTime();
});
return dayjs(_range[0]).startOf('day').subtract(1, 'ms').isBefore(date) && dayjs(_range[1]).endOf('day').add(1, 'ms').isAfter(date);
}
function useDatesState(_ref) {
var type = _ref.type,
level = _ref.level,
value = _ref.value,
defaultValue = _ref.defaultValue,
onChange = _ref.onChange,
allowSingleDateInRange = _ref.allowSingleDateInRange,
allowDeselect = _ref.allowDeselect,
onMouseLeave = _ref.onMouseLeave,
_ref$applyTimezone = _ref.applyTimezone,
applyTimezone = _ref$applyTimezone === void 0 ? true : _ref$applyTimezone;
var _useUncontrolledDates = useUncontrolledDates({
type: type,
value: value,
defaultValue: defaultValue,
onChange: onChange,
applyTimezone: applyTimezone
}),
_useUncontrolledDates2 = _slicedToArray(_useUncontrolledDates, 2),
_value = _useUncontrolledDates2[0],
setValue = _useUncontrolledDates2[1];
var _useState = useState(type === 'range' ? _value[0] && !_value[1] ? _value[0] : null : null),
_useState2 = _slicedToArray(_useState, 2),
pickedDate = _useState2[0],
setPickedDate = _useState2[1];
var _useState3 = useState(null),
_useState4 = _slicedToArray(_useState3, 2),
hoveredDate = _useState4[0],
setHoveredDate = _useState4[1];
var onDateChange = function onDateChange(date, changeValue) {
var shouldChangeValue = (changeValue === 'month' || changeValue === 'year') && type === 'default';
if (shouldChangeValue) {
var prevDate = _value || new Date();
var newDate = new Date(prevDate);
if (changeValue === 'month') {
newDate.setMonth(date.getMonth());
} else if (changeValue === 'year') {
newDate.setFullYear(date.getFullYear());
}
date = newDate;
}
if (type === 'range') {
if (pickedDate instanceof Date && !_value[1]) {
if (dayjs(date).isSame(pickedDate, level) && !allowSingleDateInRange) {
setPickedDate(null);
setHoveredDate(null);
setValue([null, null]);
return;
}
var result = [date, pickedDate];
result.sort(function (a, b) {
return a.getTime() - b.getTime();
});
setValue(result);
setHoveredDate(null);
setPickedDate(null);
return;
}
if (_value[0] && !_value[1] && dayjs(date).isSame(_value[0], level) && !allowSingleDateInRange) {
setPickedDate(null);
setHoveredDate(null);
setValue([null, null]);
return;
}
setValue([date, null]);
setHoveredDate(null);
setPickedDate(date);
return;
}
if (_value && allowDeselect && dayjs(date).isSame(_value, level)) {
setValue(null);
} else {
setValue(date);
}
};
var isDateInRange = function isDateInRange(date) {
if (pickedDate instanceof Date && hoveredDate instanceof Date) {
return isInRange(date, [hoveredDate, pickedDate]);
}
if (_value[0] instanceof Date && _value[1] instanceof Date) {
return isInRange(date, _value);
}
return false;
};
var handleReset = function handleReset() {
setPickedDate(null);
setHoveredDate(null);
setValue([null, null]);
};
var onRootMouseLeave = type === 'range' ? function (event) {
onMouseLeave === null || onMouseLeave === void 0 ? void 0 : onMouseLeave(event);
setHoveredDate(null);
} : onMouseLeave;
var isFirstInRange = function isFirstInRange(date) {
if (!(_value[0] instanceof Date)) {
return false;
}
if (dayjs(date).isSame(_value[0], level)) {
return !(hoveredDate && dayjs(hoveredDate).isBefore(_value[0]));
}
return false;
};
var isLastInRange = function isLastInRange(date) {
if (_value[1] instanceof Date) {
return dayjs(date).isSame(_value[1], level);
}
if (!(_value[0] instanceof Date) || !hoveredDate) {
return false;
}
return dayjs(hoveredDate).isBefore(_value[0]) && dayjs(date).isSame(_value[0], level);
};
var getControlProps = function getControlProps(date) {
if (type === 'range') {
return {
selected: _value.some(function (selection) {
return selection && dayjs(selection).isSame(date, level);
}),
inRange: isDateInRange(date),
firstInRange: isFirstInRange(date),
lastInRange: isLastInRange(date),
'data-autofocus': !!_value[0] && dayjs(_value[0]).isSame(date, level) || undefined,
'data-celltype': level,
'data-date': "".concat(date.getMonth(), "-").concat(date.getDate())
};
}
var selected = dayjs(_value).isSame(date, level);
return {
selected: selected,
'data-autofocus': selected || undefined,
'data-celltype': level,
'data-date': "".concat(date.getMonth(), "-").concat(date.getDate())
};
};
var onHoveredDateChange = type === 'range' && pickedDate ? setHoveredDate : function () {};
useEffect(function () {
if (type === 'range' && !_value[0] && !_value[1]) {
setPickedDate(null);
}
}, [value]);
return {
onDateChange: onDateChange,
onRootMouseLeave: onRootMouseLeave,
onHoveredDateChange: onHoveredDateChange,
getControlProps: getControlProps,
setPickedDate: setPickedDate,
pickedDate: pickedDate,
controlledValue: _value,
setControlledValue: setValue,
handleReset: handleReset
};
}
export { useDatesState };
//# sourceMappingURL=useDatesState.js.map