@renderlesskit/react
Version:
Collection of headless components/hooks that are accessible, composable, customizable from low level to build your own UI & Design System powered by Reakit
96 lines (85 loc) • 3.68 kB
JavaScript
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
/**
* All credit goes to [React Spectrum](https://github.com/adobe/react-spectrum)
* We improved the Calendar from Stately [useDatePickerState](https://github.com/adobe/react-spectrum/blob/main/packages/%40react-stately/datepicker/src/useDatePickerState.ts)
* to work with Reakit System
*/
import * as React from "react";
import { useCalendarState } from "../calendar";
import { usePickerBaseState } from "../picker-base";
import { useSegmentState } from "../segment";
import { toUTCString, useControllableState } from "../utils";
export var useDatePickerState = function useDatePickerState() {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var {
value: initialValue,
defaultValue = toUTCString(new Date()),
onChange,
minValue,
maxValue,
isRequired,
autoFocus,
formatOptions,
placeholderDate
} = props;
var [value, setValue] = useControllableState({
value: initialValue,
defaultValue,
onChange
});
var date = new Date(value);
var setDate = date => setValue(toUTCString(date));
var minDateValue = minValue ? new Date(minValue) : new Date(-864e13);
var maxDateValue = maxValue ? new Date(maxValue) : new Date(864e13);
var segmentState = useSegmentState({
value: date,
onChange: setDate,
formatOptions,
placeholderDate
});
var popover = usePickerBaseState(_objectSpread({
segmentFocus: segmentState.first
}, props));
var selectDate = newValue => {
setValue(newValue);
popover.hide();
};
var calendar = useCalendarState({
value,
onChange: selectDate,
minValue: minValue,
maxValue: maxValue
});
var validationState = props.validationState || (isInvalidDateRange(date) ? "invalid" : "valid");
React.useEffect(() => {
if (popover.visible) {
calendar.setFocused(true);
calendar.focusCell(date);
} // eslint-disable-next-line react-hooks/exhaustive-deps
}, [popover.visible]);
React.useEffect(() => {
if (autoFocus) {
segmentState.first();
} // eslint-disable-next-line react-hooks/exhaustive-deps
}, [autoFocus, segmentState.first]);
function isInvalidDateRange(value) {
var min = new Date(minDateValue);
var max = new Date(maxDateValue);
return value < min || value > max;
}
return _objectSpread(_objectSpread(_objectSpread({
dateValue: value,
setDateValue: setValue,
selectDate,
validationState,
minValue,
maxValue,
isRequired
}, popover), segmentState), {}, {
calendar,
isDateRangePicker: false
});
};
//# sourceMappingURL=DatePickerState.js.map