UNPKG

@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
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