UNPKG

@material-ui/lab

Version:

Material-UI Lab - Incubator for Material-UI React components.

123 lines (109 loc) 4.18 kB
import * as React from 'react'; import { useOpenState } from './useOpenState'; import { useUtils, useNow } from './useUtils'; export function usePickerState(props, valueManager) { var inputFormat = props.inputFormat, disabled = props.disabled, readOnly = props.readOnly, onAccept = props.onAccept, onChange = props.onChange, disableCloseOnSelect = props.disableCloseOnSelect, value = props.value; if (!inputFormat) { throw new Error('inputFormat prop is required'); } var now = useNow(); var utils = useUtils(); var _useOpenState = useOpenState(props), isOpen = _useOpenState.isOpen, setIsOpen = _useOpenState.setIsOpen; var _React$useState = React.useState(valueManager.parseInput(utils, props)), pickerDate = _React$useState[0], setPickerDate = _React$useState[1]; // Mobile keyboard view is a special case. // When it's open picker should work like closed, cause we are just showing text field var _React$useState2 = React.useState(false), isMobileKeyboardViewOpen = _React$useState2[0], setMobileKeyboardViewOpen = _React$useState2[1]; React.useEffect(function () { var parsedDateValue = valueManager.parseInput(utils, props); setPickerDate(function (currentPickerDate) { if (!valueManager.areValuesEqual(utils, currentPickerDate, parsedDateValue)) { return parsedDateValue; } return currentPickerDate; }); // We need to react only on value change, because `date` could potentially return new Date() on each render }, [value, utils]); // eslint-disable-line var acceptDate = React.useCallback(function (acceptedDate, needClosePicker) { onChange(acceptedDate); if (needClosePicker) { setIsOpen(false); if (onAccept) { onAccept(acceptedDate); } } }, [onAccept, onChange, setIsOpen]); var wrapperProps = React.useMemo(function () { return { open: isOpen, onClear: function onClear() { return acceptDate(valueManager.emptyValue, true); }, onAccept: function onAccept() { return acceptDate(pickerDate, true); }, onDismiss: function onDismiss() { return setIsOpen(false); }, onSetToday: function onSetToday() { // TODO FIX ME setPickerDate(now); acceptDate(now, !disableCloseOnSelect); } }; }, [acceptDate, disableCloseOnSelect, isOpen, now, pickerDate, setIsOpen, valueManager.emptyValue]); var pickerProps = React.useMemo(function () { return { date: pickerDate, isMobileKeyboardViewOpen: isMobileKeyboardViewOpen, toggleMobileKeyboardView: function toggleMobileKeyboardView() { return setMobileKeyboardViewOpen(!isMobileKeyboardViewOpen); }, onDateChange: function onDateChange(newDate, wrapperVariant) { var selectionState = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'partial'; setPickerDate(newDate); if (selectionState === 'partial') { acceptDate(newDate, false); } if (selectionState === 'finish') { var shouldCloseOnSelect = !(disableCloseOnSelect !== null && disableCloseOnSelect !== void 0 ? disableCloseOnSelect : wrapperVariant === 'mobile'); acceptDate(newDate, shouldCloseOnSelect); } // if selectionState === "shallow" do nothing (we already update picker state) } }; }, [acceptDate, disableCloseOnSelect, isMobileKeyboardViewOpen, pickerDate]); var inputProps = React.useMemo(function () { return { onChange: onChange, inputFormat: inputFormat, open: isOpen, rawValue: value, openPicker: function openPicker() { return !readOnly && !disabled && setIsOpen(true); } }; }, [onChange, inputFormat, isOpen, value, readOnly, disabled, setIsOpen]); var pickerState = { pickerProps: pickerProps, inputProps: inputProps, wrapperProps: wrapperProps }; React.useDebugValue(pickerState, function () { return { MuiPickerState: { pickerDate: pickerDate, other: pickerState } }; }); return pickerState; }