import React from 'react'; import { ClockIcon } from '../_shared/icons/Clock'; import { ParsableDate } from '../constants/prop-types'; import { TimePickerToolbar } from './TimePickerToolbar'; import { ExportedClockViewProps } from '../views/Clock/ClockView'; import { ResponsiveWrapper } from '../wrappers/ResponsiveWrapper'; import { pick12hOr24hFormat } from '../_helpers/text-field-helper'; import { useParsedDate, OverrideParsableDateProps } from '../_shared/hooks/date-helpers-hooks'; import { useUtils, MuiPickersAdapter } from '../_shared/hooks/useUtils'; import { validateTime, TimeValidationError } from '../_helpers/time-utils'; import { WithViewsProps, AllSharedPickerProps } from '../Picker/SharedPickerProps'; import { ValidationProps, makeValidationHook } from '../_shared/hooks/useValidation'; import { MobileWrapper, DesktopWrapper, StaticWrapper, SomeWrapper } from '../wrappers/Wrapper'; import { SharedPickerProps, makePickerWithStateAndWrapper } from '../Picker/makePickerWithState'; export interface BaseTimePickerProps extends ValidationProps>, WithViewsProps<'hours' | 'minutes' | 'seconds'>, OverrideParsableDateProps, 'minTime' | 'maxTime'> {} export function getTextFieldAriaText(value: ParsableDate, utils: MuiPickersAdapter) { return value && utils.isValid(utils.date(value)) ? `Choose time, selected time is ${utils.format(utils.date(value), 'fullTime')}` : 'Choose time'; } function useInterceptProps({ ampm, inputFormat, maxTime: __maxTime, minTime: __minTime, openTo = 'hours', views = ['hours', 'minutes'], ...other }: BaseTimePickerProps & AllSharedPickerProps) { const utils = useUtils(); const minTime = useParsedDate(__minTime); const maxTime = useParsedDate(__maxTime); const willUseAmPm = ampm ?? utils.is12HourCycleInCurrentLocale(); return { views, openTo, minTime, maxTime, ampm: willUseAmPm, acceptRegex: willUseAmPm ? /[\dapAP]/gi : /\d/gi, mask: '__:__', disableMaskedInput: willUseAmPm, getOpenDialogAriaText: getTextFieldAriaText, openPickerIcon: , inputFormat: pick12hOr24hFormat(inputFormat, willUseAmPm, { localized: utils.formats.fullTime, '12h': utils.formats.fullTime12h, '24h': utils.formats.fullTime24h, }), ...other, }; } const timePickerConfig = { useInterceptProps, useValidation: makeValidationHook< TimeValidationError, ParsableDate, BaseTimePickerProps >(validateTime), DefaultToolbarComponent: TimePickerToolbar, }; type TimePickerComponent = ( props: BaseTimePickerProps & SharedPickerProps ) => JSX.Element; export const TimePicker = makePickerWithStateAndWrapper(ResponsiveWrapper, { name: 'MuiTimePicker', ...timePickerConfig, }) as TimePickerComponent; export type TimePickerProps = React.ComponentProps; export const DesktopTimePicker = makePickerWithStateAndWrapper( DesktopWrapper, { name: 'MuiDesktopTimePicker', ...timePickerConfig, } ) as TimePickerComponent; export type DesktopTimePickerProps = React.ComponentProps; export const MobileTimePicker = makePickerWithStateAndWrapper(MobileWrapper, { name: 'MuiMobileTimePicker', ...timePickerConfig, }) as TimePickerComponent; export type MobileTimePickerProps = React.ComponentProps; export const StaticTimePicker = makePickerWithStateAndWrapper(StaticWrapper, { name: 'MuiStaticTimePicker', ...timePickerConfig, }); export type StaticTimePickerProps = React.ComponentProps;