Skip to content

Commit eb5b6fd

Browse files
[pickers] Improve typing of the range pickers (#14716)
1 parent c0ab117 commit eb5b6fd

File tree

3 files changed

+79
-85
lines changed

3 files changed

+79
-85
lines changed

Diff for: packages/x-date-pickers-pro/src/internals/hooks/useDesktopRangePicker/useDesktopRangePicker.tsx

+12-26
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,19 @@ import {
1212
DateOrTimeViewWithMeridiem,
1313
ExportedBaseTabsProps,
1414
} from '@mui/x-date-pickers/internals';
15-
import {
16-
PickerValidDate,
17-
FieldRef,
18-
BaseSingleInputFieldProps,
19-
InferError,
20-
} from '@mui/x-date-pickers/models';
15+
import { PickerValidDate, FieldRef, InferError } from '@mui/x-date-pickers/models';
2116
import {
2217
DesktopRangePickerAdditionalViewProps,
2318
UseDesktopRangePickerParams,
2419
UseDesktopRangePickerProps,
2520
UseDesktopRangePickerSlotProps,
2621
} from './useDesktopRangePicker.types';
27-
import { useEnrichedRangePickerFieldProps } from '../useEnrichedRangePickerFieldProps';
22+
import {
23+
RangePickerPropsForFieldSlot,
24+
useEnrichedRangePickerFieldProps,
25+
} from '../useEnrichedRangePickerFieldProps';
2826
import { getReleaseInfo } from '../../utils/releaseInfo';
29-
import { DateRange, BaseMultiInputFieldProps, RangeFieldSection } from '../../../models';
27+
import { DateRange, RangeFieldSection } from '../../../models';
3028
import { useRangePosition } from '../useRangePosition';
3129

3230
const releaseInfo = getReleaseInfo();
@@ -138,24 +136,12 @@ export const useDesktopRangePicker = <
138136
const fieldProps = useSlotProps<
139137
typeof Field,
140138
UseDesktopRangePickerSlotProps<TDate, TView, TEnableAccessibleFieldDOMStructure>['field'],
141-
| Partial<
142-
BaseSingleInputFieldProps<
143-
DateRange<TDate>,
144-
TDate,
145-
RangeFieldSection,
146-
TEnableAccessibleFieldDOMStructure,
147-
InferError<TExternalProps>
148-
>
149-
>
150-
| Partial<
151-
BaseMultiInputFieldProps<
152-
DateRange<TDate>,
153-
TDate,
154-
RangeFieldSection,
155-
TEnableAccessibleFieldDOMStructure,
156-
InferError<TExternalProps>
157-
>
158-
>,
139+
RangePickerPropsForFieldSlot<
140+
boolean,
141+
TDate,
142+
TEnableAccessibleFieldDOMStructure,
143+
InferError<TExternalProps>
144+
>,
159145
TExternalProps
160146
>({
161147
elementType: Field,

Diff for: packages/x-date-pickers-pro/src/internals/hooks/useEnrichedRangePickerFieldProps.ts

+55-33
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import {
1919
} from '@mui/x-date-pickers/hooks';
2020
import { PickersInputLocaleText } from '@mui/x-date-pickers/locales';
2121
import {
22-
BaseFieldProps,
2322
onSpaceOrEnter,
2423
UsePickerResponse,
2524
WrapperVariant,
@@ -83,24 +82,37 @@ export interface RangePickerFieldSlotProps<
8382
>;
8483
}
8584

85+
export type RangePickerPropsForFieldSlot<
86+
TIsSingleInput extends boolean,
87+
TDate extends PickerValidDate,
88+
TEnableAccessibleFieldDOMStructure extends boolean,
89+
TError,
90+
> =
91+
| (TIsSingleInput extends true
92+
? BaseSingleInputFieldProps<
93+
DateRange<TDate>,
94+
TDate,
95+
RangeFieldSection,
96+
TEnableAccessibleFieldDOMStructure,
97+
TError
98+
>
99+
: never)
100+
| (TIsSingleInput extends false
101+
? BaseMultiInputFieldProps<
102+
DateRange<TDate>,
103+
TDate,
104+
RangeFieldSection,
105+
TEnableAccessibleFieldDOMStructure,
106+
TError
107+
>
108+
: never);
109+
86110
export interface UseEnrichedRangePickerFieldPropsParams<
111+
TIsSingleInput extends boolean,
87112
TDate extends PickerValidDate,
88113
TView extends DateOrTimeViewWithMeridiem,
89114
TEnableAccessibleFieldDOMStructure extends boolean,
90115
TError,
91-
FieldProps extends BaseFieldProps<
92-
DateRange<TDate>,
93-
TDate,
94-
RangeFieldSection,
95-
TEnableAccessibleFieldDOMStructure,
96-
TError
97-
> = BaseFieldProps<
98-
DateRange<TDate>,
99-
TDate,
100-
RangeFieldSection,
101-
TEnableAccessibleFieldDOMStructure,
102-
TError
103-
>,
104116
> extends Pick<
105117
UsePickerResponse<DateRange<TDate>, TView, RangeFieldSection, any>,
106118
'open' | 'actions'
@@ -116,7 +128,12 @@ export interface UseEnrichedRangePickerFieldPropsParams<
116128
localeText: PickersInputLocaleText<TDate> | undefined;
117129
pickerSlotProps: RangePickerFieldSlotProps<TDate, TEnableAccessibleFieldDOMStructure> | undefined;
118130
pickerSlots: RangePickerFieldSlots | undefined;
119-
fieldProps: FieldProps;
131+
fieldProps: RangePickerPropsForFieldSlot<
132+
TIsSingleInput,
133+
TDate,
134+
TEnableAccessibleFieldDOMStructure,
135+
TError
136+
>;
120137
anchorRef?: React.Ref<HTMLDivElement>;
121138
currentView?: TView | null;
122139
initialView?: TView;
@@ -151,17 +168,11 @@ const useMultiInputFieldSlotProps = <
151168
startFieldRef,
152169
endFieldRef,
153170
}: UseEnrichedRangePickerFieldPropsParams<
171+
false,
154172
TDate,
155173
TView,
156174
TEnableAccessibleFieldDOMStructure,
157-
TError,
158-
BaseMultiInputFieldProps<
159-
DateRange<TDate>,
160-
TDate,
161-
RangeFieldSection,
162-
TEnableAccessibleFieldDOMStructure,
163-
TError
164-
>
175+
TError
165176
>) => {
166177
type ReturnType = BaseMultiInputFieldProps<
167178
DateRange<TDate>,
@@ -336,17 +347,11 @@ const useSingleInputFieldSlotProps = <
336347
anchorRef,
337348
currentView,
338349
}: UseEnrichedRangePickerFieldPropsParams<
350+
true,
339351
TDate,
340352
TView,
341353
TEnableAccessibleFieldDOMStructure,
342-
TError,
343-
BaseSingleInputFieldProps<
344-
DateRange<TDate>,
345-
TDate,
346-
RangeFieldSection,
347-
TEnableAccessibleFieldDOMStructure,
348-
TError
349-
>
354+
TError
350355
>) => {
351356
type ReturnType = BaseSingleInputFieldProps<
352357
DateRange<TDate>,
@@ -453,6 +458,7 @@ export const useEnrichedRangePickerFieldProps = <
453458
TError,
454459
>(
455460
params: UseEnrichedRangePickerFieldPropsParams<
461+
boolean,
456462
TDate,
457463
TView,
458464
TEnableAccessibleFieldDOMStructure,
@@ -470,9 +476,25 @@ export const useEnrichedRangePickerFieldProps = <
470476
}
471477

472478
if (params.fieldType === 'multi-input') {
473-
return useMultiInputFieldSlotProps(params);
479+
return useMultiInputFieldSlotProps(
480+
params as unknown as UseEnrichedRangePickerFieldPropsParams<
481+
false,
482+
TDate,
483+
TView,
484+
TEnableAccessibleFieldDOMStructure,
485+
TError
486+
>,
487+
);
474488
}
475489

476-
return useSingleInputFieldSlotProps(params);
490+
return useSingleInputFieldSlotProps(
491+
params as UseEnrichedRangePickerFieldPropsParams<
492+
true,
493+
TDate,
494+
TView,
495+
TEnableAccessibleFieldDOMStructure,
496+
TError
497+
>,
498+
);
477499
/* eslint-enable react-hooks/rules-of-hooks */
478500
};

Diff for: packages/x-date-pickers-pro/src/internals/hooks/useMobileRangePicker/useMobileRangePicker.tsx

+12-26
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,20 @@ import {
1111
ExportedBaseTabsProps,
1212
} from '@mui/x-date-pickers/internals';
1313
import { usePickersTranslations } from '@mui/x-date-pickers/hooks';
14-
import {
15-
PickerValidDate,
16-
FieldRef,
17-
BaseSingleInputFieldProps,
18-
InferError,
19-
} from '@mui/x-date-pickers/models';
14+
import { PickerValidDate, FieldRef, InferError } from '@mui/x-date-pickers/models';
2015
import useId from '@mui/utils/useId';
2116
import {
2217
MobileRangePickerAdditionalViewProps,
2318
UseMobileRangePickerParams,
2419
UseMobileRangePickerProps,
2520
UseMobileRangePickerSlotProps,
2621
} from './useMobileRangePicker.types';
27-
import { useEnrichedRangePickerFieldProps } from '../useEnrichedRangePickerFieldProps';
22+
import {
23+
RangePickerPropsForFieldSlot,
24+
useEnrichedRangePickerFieldProps,
25+
} from '../useEnrichedRangePickerFieldProps';
2826
import { getReleaseInfo } from '../../utils/releaseInfo';
29-
import { DateRange, BaseMultiInputFieldProps, RangeFieldSection } from '../../../models';
27+
import { DateRange, RangeFieldSection } from '../../../models';
3028
import { useRangePosition } from '../useRangePosition';
3129

3230
const releaseInfo = getReleaseInfo();
@@ -114,24 +112,12 @@ export const useMobileRangePicker = <
114112
const fieldProps = useSlotProps<
115113
typeof Field,
116114
UseMobileRangePickerSlotProps<TDate, TView, TEnableAccessibleFieldDOMStructure>['field'],
117-
| Partial<
118-
BaseSingleInputFieldProps<
119-
DateRange<TDate>,
120-
TDate,
121-
RangeFieldSection,
122-
TEnableAccessibleFieldDOMStructure,
123-
InferError<TExternalProps>
124-
>
125-
>
126-
| Partial<
127-
BaseMultiInputFieldProps<
128-
DateRange<TDate>,
129-
TDate,
130-
RangeFieldSection,
131-
TEnableAccessibleFieldDOMStructure,
132-
InferError<TExternalProps>
133-
>
134-
>,
115+
RangePickerPropsForFieldSlot<
116+
boolean,
117+
TDate,
118+
TEnableAccessibleFieldDOMStructure,
119+
InferError<TExternalProps>
120+
>,
135121
TExternalProps
136122
>({
137123
elementType: Field,

0 commit comments

Comments
 (0)