import { useUtils } from '../_shared/hooks/useUtils'; import { DatePickerToolbar } from './DatePickerToolbar'; import { WithViewsProps } from '../Picker/SharedPickerProps'; import { ResponsiveWrapper } from '../wrappers/ResponsiveWrapper'; import { useParsedDate, OverrideParsableDateProps } from '../_shared/hooks/date-helpers-hooks'; import { ExportedCalendarViewProps } from '../views/Calendar/CalendarView'; import { MobileWrapper, DesktopWrapper, StaticWrapper, SomeWrapper } from '../wrappers/Wrapper'; import { makeValidationHook, ValidationProps } from '../_shared/hooks/useValidation'; import { ParsableDate, defaultMinDate, defaultMaxDate } from '../constants/prop-types'; import { makePickerWithStateAndWrapper, AllPickerProps, SharedPickerProps, } from '../Picker/makePickerWithState'; import { getFormatAndMaskByViews, DateValidationError, validateDate } from '../_helpers/date-utils'; export type DatePickerView = 'year' | 'date' | 'month'; export interface BaseDatePickerProps extends WithViewsProps<'year' | 'date' | 'month'>, ValidationProps, OverrideParsableDateProps, 'minDate' | 'maxDate'> {} const datePickerConfig = { useValidation: makeValidationHook< DateValidationError, ParsableDate, BaseDatePickerProps >(validateDate), DefaultToolbarComponent: DatePickerToolbar, useInterceptProps: ({ openTo = 'date', views = ['year', 'date'], minDate: __minDate = defaultMinDate, maxDate: __maxDate = defaultMaxDate, ...other }: AllPickerProps>) => { const utils = useUtils(); const minDate = useParsedDate(__minDate); const maxDate = useParsedDate(__maxDate); return { views, openTo, minDate, maxDate, ...getFormatAndMaskByViews(views, utils), ...other, }; }, }; type DatePickerComponent = ( props: BaseDatePickerProps & SharedPickerProps ) => JSX.Element; export const DatePicker = makePickerWithStateAndWrapper>( ResponsiveWrapper, { name: 'MuiDatePicker', ...datePickerConfig, } ) as DatePickerComponent; export type DatePickerProps = React.ComponentProps; export const MobileDatePicker = makePickerWithStateAndWrapper>( MobileWrapper, { name: 'MuiMobileDatePicker', ...datePickerConfig, } ) as DatePickerComponent; export type MobileDatePickerProps = React.ComponentProps; export const DesktopDatePicker = makePickerWithStateAndWrapper>( DesktopWrapper, { name: 'MuiDesktopDatePicker', ...datePickerConfig, } ); export type DesktopDatePickerProps = React.ComponentProps; export const StaticDatePicker = makePickerWithStateAndWrapper>( StaticWrapper, { name: 'MuiStaticDatePicker', ...datePickerConfig, } ) as DatePickerComponent; export type StaticDatePickerProps = React.ComponentProps;