import _extends from "@babel/runtime/helpers/esm/extends"; import * as React from 'react'; import PropTypes from 'prop-types'; import { resolveComponentProps } from '@mui/base/utils'; import { refType } from '@mui/utils'; import { singleItemValueManager } from '../internals/utils/valueManagers'; import { TimeField } from '../TimeField'; import { useTimePickerDefaultizedProps } from '../TimePicker/shared'; import { useLocaleText, useUtils } from '../internals/hooks/useUtils'; import { validateTime } from '../internals/utils/validation/validateTime'; import { useMobilePicker } from '../internals/hooks/useMobilePicker'; import { extractValidationProps } from '../internals/utils/validation/extractValidationProps'; import { renderTimeViewClock } from '../timeViewRenderers'; import { resolveTimeFormat } from '../internals/utils/time-utils'; /** * Demos: * * - [TimePicker](https://mui.com/x/react-date-pickers/time-picker/) * - [Validation](https://mui.com/x/react-date-pickers/validation/) * * API: * * - [MobileTimePicker API](https://mui.com/x/api/date-pickers/mobile-time-picker/) */ const MobileTimePicker = /*#__PURE__*/React.forwardRef(function MobileTimePicker(inProps, ref) { var _defaultizedProps$amp, _defaultizedProps$slo2, _props$localeText$ope, _props$localeText; const localeText = useLocaleText(); const utils = useUtils(); // Props with the default values common to all time pickers const defaultizedProps = useTimePickerDefaultizedProps(inProps, 'MuiMobileTimePicker'); const viewRenderers = _extends({ hours: renderTimeViewClock, minutes: renderTimeViewClock, seconds: renderTimeViewClock }, defaultizedProps.viewRenderers); const ampmInClock = (_defaultizedProps$amp = defaultizedProps.ampmInClock) != null ? _defaultizedProps$amp : false; // Props with the default values specific to the mobile variant const props = _extends({}, defaultizedProps, { ampmInClock, viewRenderers, format: resolveTimeFormat(utils, defaultizedProps), slots: _extends({ field: TimeField }, defaultizedProps.slots), slotProps: _extends({}, defaultizedProps.slotProps, { field: ownerState => { var _defaultizedProps$slo; return _extends({}, resolveComponentProps((_defaultizedProps$slo = defaultizedProps.slotProps) == null ? void 0 : _defaultizedProps$slo.field, ownerState), extractValidationProps(defaultizedProps), { ref }); }, toolbar: _extends({ hidden: false, ampmInClock }, (_defaultizedProps$slo2 = defaultizedProps.slotProps) == null ? void 0 : _defaultizedProps$slo2.toolbar) }) }); const { renderPicker } = useMobilePicker({ props, valueManager: singleItemValueManager, valueType: 'time', getOpenDialogAriaText: (_props$localeText$ope = (_props$localeText = props.localeText) == null ? void 0 : _props$localeText.openTimePickerDialogue) != null ? _props$localeText$ope : localeText.openTimePickerDialogue, validator: validateTime }); return renderPicker(); }); MobileTimePicker.propTypes = { // ----------------------------- Warning -------------------------------- // | These PropTypes are generated from the TypeScript type definitions | // | To update them edit the TypeScript types and run "yarn proptypes" | // ---------------------------------------------------------------------- /** * 12h/24h view for hour selection clock. * @default `utils.is12HourCycleInCurrentLocale()` */ ampm: PropTypes.bool, /** * Display ampm controls under the clock (instead of in the toolbar). * @default true on desktop, false on mobile */ ampmInClock: PropTypes.bool, /** * If `true`, the main element is focused during the first mount. * This main element is: * - the element chosen by the visible view if any (i.e: the selected day on the `day` view). * - the `input` element if there is a field rendered. */ autoFocus: PropTypes.bool, /** * Class name applied to the root element. */ className: PropTypes.string, /** * If `true`, the popover or modal will close after submitting the full date. * @default `true` for desktop, `false` for mobile (based on the chosen wrapper and `desktopModeMediaQuery` prop). */ closeOnSelect: PropTypes.bool, /** * Overridable components. * @default {} * @deprecated Please use `slots`. */ components: PropTypes.object, /** * The props used for each component slot. * @default {} * @deprecated Please use `slotProps`. */ componentsProps: PropTypes.object, /** * The default value. * Used when the component is not controlled. */ defaultValue: PropTypes.any, /** * If `true`, the picker and text field are disabled. * @default false */ disabled: PropTypes.bool, /** * If `true`, disable values after the current date for date components, time for time components and both for date time components. * @default false */ disableFuture: PropTypes.bool, /** * Do not ignore date part when validating min/max time. * @default false */ disableIgnoringDatePartForTimeValidation: PropTypes.bool, /** * If `true`, the open picker button will not be rendered (renders only the field). * @default false */ disableOpenPicker: PropTypes.bool, /** * If `true`, disable values before the current date for date components, time for time components and both for date time components. * @default false */ disablePast: PropTypes.bool, /** * Format of the date when rendered in the input(s). * Defaults to localized format based on the used `views`. */ format: PropTypes.string, /** * Density of the format when rendered in the input. * Setting `formatDensity` to `"spacious"` will add a space before and after each `/`, `-` and `.` character. * @default "dense" */ formatDensity: PropTypes.oneOf(['dense', 'spacious']), /** * Pass a ref to the `input` element. */ inputRef: refType, /** * The label content. */ label: PropTypes.node, /** * Locale for components texts. * Allows overriding texts coming from `LocalizationProvider` and `theme`. */ localeText: PropTypes.object, /** * Maximal selectable time. * The date part of the object will be ignored unless `props.disableIgnoringDatePartForTimeValidation === true`. */ maxTime: PropTypes.any, /** * Minimal selectable time. * The date part of the object will be ignored unless `props.disableIgnoringDatePartForTimeValidation === true`. */ minTime: PropTypes.any, /** * Step over minutes. * @default 1 */ minutesStep: PropTypes.number, /** * Name attribute used by the `input` element in the Field. */ name: PropTypes.string, /** * Callback fired when the value is accepted. * @template TValue The value type. Will be either the same type as `value` or `null`. Can be in `[start, end]` format in case of range value. * @param {TValue} value The value that was just accepted. */ onAccept: PropTypes.func, /** * Callback fired when the value changes. * @template TValue The value type. Will be either the same type as `value` or `null`. Can be in `[start, end]` format in case of range value. * @template TError The validation error type. Will be either `string` or a `null`. Can be in `[start, end]` format in case of range value. * @param {TValue} value The new value. * @param {FieldChangeHandlerContext} context The context containing the validation result of the current value. */ onChange: PropTypes.func, /** * Callback fired when the popup requests to be closed. * Use in controlled mode (see `open`). */ onClose: PropTypes.func, /** * Callback fired when the error associated to the current value changes. * If the error has a non-null value, then the `TextField` will be rendered in `error` state. * * @template TValue The value type. Will be either the same type as `value` or `null`. Can be in `[start, end]` format in case of range value. * @template TError The validation error type. Will be either `string` or a `null`. Can be in `[start, end]` format in case of range value. * @param {TError} error The new error describing why the current value is not valid. * @param {TValue} value The value associated to the error. */ onError: PropTypes.func, /** * Callback fired when the popup requests to be opened. * Use in controlled mode (see `open`). */ onOpen: PropTypes.func, /** * Callback fired when the selected sections change. * @param {FieldSelectedSections} newValue The new selected sections. */ onSelectedSectionsChange: PropTypes.func, /** * Callback fired on view change. * @template TView * @param {TView} view The new view. */ onViewChange: PropTypes.func, /** * Control the popup or dialog open state. * @default false */ open: PropTypes.bool, /** * The default visible view. * Used when the component view is not controlled. * Must be a valid option from `views` list. */ openTo: PropTypes.oneOf(['hours', 'minutes', 'seconds']), /** * Force rendering in particular orientation. */ orientation: PropTypes.oneOf(['landscape', 'portrait']), readOnly: PropTypes.bool, /** * If `true`, disable heavy animations. * @default `@media(prefers-reduced-motion: reduce)` || `navigator.userAgent` matches Android <10 or iOS <13 */ reduceAnimations: PropTypes.bool, /** * The date used to generate the new value when both `value` and `defaultValue` are empty. * @default The closest valid date-time using the validation props, except callbacks like `shouldDisable<...>`. */ referenceDate: PropTypes.any, /** * The currently selected sections. * This prop accept four formats: * 1. If a number is provided, the section at this index will be selected. * 2. If an object with a `startIndex` and `endIndex` properties are provided, the sections between those two indexes will be selected. * 3. If a string of type `FieldSectionType` is provided, the first section with that name will be selected. * 4. If `null` is provided, no section will be selected * If not provided, the selected sections will be handled internally. */ selectedSections: PropTypes.oneOfType([PropTypes.oneOf(['all', 'day', 'hours', 'meridiem', 'minutes', 'month', 'seconds', 'weekDay', 'year']), PropTypes.number, PropTypes.shape({ endIndex: PropTypes.number.isRequired, startIndex: PropTypes.number.isRequired })]), /** * Disable specific clock time. * @param {number} clockValue The value to check. * @param {TimeView} view The clock type of the timeValue. * @returns {boolean} If `true` the time will be disabled. * @deprecated Consider using `shouldDisableTime`. */ shouldDisableClock: PropTypes.func, /** * Disable specific time. * @template TDate * @param {TDate} value The value to check. * @param {TimeView} view The clock type of the timeValue. * @returns {boolean} If `true` the time will be disabled. */ shouldDisableTime: PropTypes.func, /** * The props used for each component slot. * @default {} */ slotProps: PropTypes.object, /** * Overridable component slots. * @default {} */ slots: PropTypes.object, /** * The system prop that allows defining system overrides as well as additional CSS styles. */ sx: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.func, PropTypes.object, PropTypes.bool])), PropTypes.func, PropTypes.object]), /** * Choose which timezone to use for the value. * Example: "default", "system", "UTC", "America/New_York". * If you pass values from other timezones to some props, they will be converted to this timezone before being used. * @see See the {@link https://mui.com/x/react-date-pickers/timezone/ timezones documention} for more details. * @default The timezone of the `value` or `defaultValue` prop is defined, 'default' otherwise. */ timezone: PropTypes.string, /** * The selected value. * Used when the component is controlled. */ value: PropTypes.any, /** * The visible view. * Used when the component view is controlled. * Must be a valid option from `views` list. */ view: PropTypes.oneOf(['hours', 'minutes', 'seconds']), /** * Define custom view renderers for each section. * If `null`, the section will only have field editing. * If `undefined`, internally defined view will be the used. */ viewRenderers: PropTypes.shape({ hours: PropTypes.func, minutes: PropTypes.func, seconds: PropTypes.func }), /** * Available views. */ views: PropTypes.arrayOf(PropTypes.oneOf(['hours', 'minutes', 'seconds']).isRequired) }; export { MobileTimePicker };