import { useUtils } from '../_shared/hooks/useUtils'; import { DateTimePickerToolbar } from './DateTimePickerToolbar'; 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 { ExportedCalendarViewProps } from '../views/Calendar/CalendarView'; import { makePickerWithStateAndWrapper, SharedPickerProps } from '../Picker/makePickerWithState'; import { DesktopWrapper, MobileWrapper, StaticWrapper, SomeWrapper } from '../wrappers/Wrapper'; import { WithViewsProps, AllSharedPickerProps } from '../Picker/SharedPickerProps'; import { DateAndTimeValidationError, validateDateAndTime } from './date-time-utils'; import { makeValidationHook, ValidationProps } from '../_shared/hooks/useValidation'; import { ParsableDate, defaultMinDate, defaultMaxDate } from '../constants/prop-types'; export type DateTimePickerView = 'year' | 'date' | 'month' | 'hours' | 'minutes' | 'seconds'; type DateTimePickerViewsProps = OverrideParsableDateProps< TDate, ExportedClockViewProps & ExportedCalendarViewProps, 'minDate' | 'maxDate' | 'minTime' | 'maxTime' >; export interface BaseDateTimePickerProps extends WithViewsProps<'year' | 'date' | 'month' | 'hours' | 'minutes'>, ValidationProps, DateTimePickerViewsProps { /** * To show tabs. */ hideTabs?: boolean; /** * Date tab icon. */ dateRangeIcon?: React.ReactNode; /** * Time tab icon. */ timeIcon?: React.ReactNode; /** * Minimal selectable moment of time with binding to date, to set min time in each day use `minTime`. */ minDateTime?: ParsableDate; /** * Minimal selectable moment of time with binding to date, to set max time in each day use `maxTime`. */ maxDateTime?: ParsableDate; /** * Date format, that is displaying in toolbar. */ toolbarFormat?: string; } function useInterceptProps({ ampm, inputFormat, maxDate: __maxDate = defaultMaxDate, maxDateTime: __maxDateTime, maxTime: __maxTime, minDate: __minDate = defaultMinDate, minDateTime: __minDateTime, minTime: __minTime, openTo = 'date', orientation = 'portrait', views = ['year', 'date', 'hours', 'minutes'], ...other }: BaseDateTimePickerProps & AllSharedPickerProps) { const utils = useUtils(); const minTime = useParsedDate(__minTime); const maxTime = useParsedDate(__maxTime); const minDate = useParsedDate(__minDate); const maxDate = useParsedDate(__maxDate); const minDateTime = useParsedDate(__minDateTime); const maxDateTime = useParsedDate(__maxDateTime); const willUseAmPm = ampm ?? utils.is12HourCycleInCurrentLocale(); if (orientation !== 'portrait') { throw new Error('We are not supporting custom orientation for DateTimePicker yet :('); } return { openTo, views, ampm: willUseAmPm, ampmInClock: true, orientation, showToolbar: true, showTabs: true, allowSameDateSelection: true, minDate: minDateTime || minDate, minTime: minDateTime || minTime, maxDate: maxDateTime || maxDate, maxTime: maxDateTime || maxTime, disableIgnoringDatePartForTimeValidation: Boolean(minDateTime || maxDateTime), acceptRegex: willUseAmPm ? /[\dap]/gi : /\d/gi, mask: '__/__/____ __:__', disableMaskedInput: willUseAmPm, inputFormat: pick12hOr24hFormat(inputFormat, willUseAmPm, { localized: utils.formats.keyboardDateTime, '12h': utils.formats.keyboardDateTime12h, '24h': utils.formats.keyboardDateTime24h, }), ...other, }; } const useValidation = makeValidationHook< DateAndTimeValidationError, ParsableDate, BaseDateTimePickerProps >(validateDateAndTime); const dateTimePickerConfig = { useInterceptProps, useValidation, DefaultToolbarComponent: DateTimePickerToolbar, }; type DateTimePickerComponent = ( props: BaseDateTimePickerProps & SharedPickerProps ) => JSX.Element; export const DateTimePicker = makePickerWithStateAndWrapper>( ResponsiveWrapper, { name: 'MuiDateTimePicker', ...dateTimePickerConfig, } ) as DateTimePickerComponent; export type DateTimePickerProps = React.ComponentProps; export const DesktopDateTimePicker = makePickerWithStateAndWrapper< BaseDateTimePickerProps >(DesktopWrapper, { name: 'MuiDesktopDateTimePicker', ...dateTimePickerConfig, }) as DateTimePickerComponent; export type DesktopDateTimePickerProps = React.ComponentProps; export const MobileDateTimePicker = makePickerWithStateAndWrapper>( MobileWrapper, { name: 'MuiMobileDateTimePicker', ...dateTimePickerConfig, } ) as DateTimePickerComponent; export type MobileDateTimePickerProps = React.ComponentProps; export const StaticDateTimePicker = makePickerWithStateAndWrapper>( StaticWrapper, { name: 'MuiStaticDateTimePicker', ...dateTimePickerConfig, } ) as DateTimePickerComponent; export type StaticDateTimePickerProps = React.ComponentProps;