@material-ui/lab
Version:
Material-UI Lab - Incubator for Material-UI React components.
123 lines (109 loc) • 4.18 kB
JavaScript
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;
}