Skip to content

Commit 5c9341e

Browse files
[pickers] Use the new ownerState in PickersCalendarHeader, PickersArrowSwitcher and DayCalendarSkeleton
1 parent 340acbd commit 5c9341e

File tree

8 files changed

+74
-64
lines changed

8 files changed

+74
-64
lines changed

packages/x-date-pickers/src/DateCalendar/PickersFadeTransitionGroup.tsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@ export interface PickersFadeTransitionGroupProps {
2020
classes?: Partial<PickersFadeTransitionGroupClasses>;
2121
}
2222

23-
const useUtilityClasses = (ownerState: PickersFadeTransitionGroupProps) => {
24-
const { classes } = ownerState;
23+
const useUtilityClasses = (classes: Partial<PickersFadeTransitionGroupClasses> | undefined) => {
2524
const slots = {
2625
root: ['root'],
2726
};
@@ -43,9 +42,10 @@ const PickersFadeTransitionGroupRoot = styled(TransitionGroup, {
4342
*/
4443
export function PickersFadeTransitionGroup(inProps: PickersFadeTransitionGroupProps) {
4544
const props = useThemeProps({ props: inProps, name: 'MuiPickersFadeTransitionGroup' });
46-
const { children, className, reduceAnimations, transKey } = props;
47-
const classes = useUtilityClasses(props);
45+
const { children, className, reduceAnimations, transKey, classes: classesProp } = props;
46+
const classes = useUtilityClasses(classesProp);
4847
const theme = useTheme();
48+
4949
if (reduceAnimations) {
5050
return children;
5151
}

packages/x-date-pickers/src/DateCalendar/PickersSlideTransition.tsx

+18-5
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,15 @@ import {
1010
pickersSlideTransitionClasses,
1111
PickersSlideTransitionClasses,
1212
} from './pickersSlideTransitionClasses';
13+
import { PickerOwnerState } from '../models/pickers';
14+
import { usePickerPrivateContext } from '../internals/hooks/usePickerPrivateContext';
1315

1416
export type SlideDirection = 'right' | 'left';
17+
18+
interface PickerSlideTransitionOwnerState extends PickerOwnerState {
19+
slideDirection: SlideDirection;
20+
}
21+
1522
export interface ExportedSlideTransitionProps {
1623
/**
1724
* Override or extend the styles applied to the component.
@@ -28,8 +35,12 @@ export interface SlideTransitionProps
2835
transKey: React.Key;
2936
}
3037

31-
const useUtilityClasses = (ownerState: SlideTransitionProps) => {
32-
const { classes, slideDirection } = ownerState;
38+
const useUtilityClasses = (
39+
classes: Partial<PickersSlideTransitionClasses> | undefined,
40+
ownerState: PickerSlideTransitionOwnerState,
41+
) => {
42+
const { slideDirection } = ownerState;
43+
3344
const slots = {
3445
root: ['root'],
3546
exit: ['slideExit'],
@@ -117,11 +128,13 @@ export function PickersSlideTransition(inProps: SlideTransitionProps) {
117128
reduceAnimations,
118129
slideDirection,
119130
transKey,
120-
// extracting `classes` from `other`
121-
classes: providedClasses,
131+
classes: classesProp,
122132
...other
123133
} = props;
124-
const classes = useUtilityClasses(props);
134+
135+
const { ownerState: pickerOwnerState } = usePickerPrivateContext();
136+
const ownerState = { ...pickerOwnerState, slideDirection };
137+
const classes = useUtilityClasses(classesProp, ownerState);
125138
const theme = useTheme();
126139
if (reduceAnimations) {
127140
return <div className={clsx(classes.root, className)}>{children}</div>;

packages/x-date-pickers/src/DayCalendarSkeleton/DayCalendarSkeleton.tsx

+9-13
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ export interface DayCalendarSkeletonProps extends HTMLDivProps {
2626
ref?: React.Ref<HTMLDivElement>;
2727
}
2828

29-
const useUtilityClasses = (ownerState: DayCalendarSkeletonProps) => {
30-
const { classes } = ownerState;
29+
const useUtilityClasses = (classes: Partial<DayCalendarSkeletonClasses> | undefined) => {
3130
const slots = {
3231
root: ['root'],
3332
week: ['week'],
@@ -59,14 +58,11 @@ const DayCalendarSkeletonDay = styled(Skeleton, {
5958
name: 'MuiDayCalendarSkeleton',
6059
slot: 'DaySkeleton',
6160
overridesResolver: (props, styles) => styles.daySkeleton,
62-
})<{ ownerState: { day: number } }>({
61+
})({
6362
margin: `0 ${DAY_MARGIN}px`,
64-
variants: [
65-
{
66-
props: { day: 0 },
67-
style: { visibility: 'hidden' },
68-
},
69-
],
63+
'&[data-day-in-month="0"]': {
64+
visibility: 'hidden',
65+
},
7066
});
7167

7268
const monthMap = [
@@ -92,22 +88,22 @@ function DayCalendarSkeleton(inProps: DayCalendarSkeletonProps) {
9288
name: 'MuiDayCalendarSkeleton',
9389
});
9490

95-
const { className, ...other } = props;
91+
const { className, classes: classesProp, ...other } = props;
9692

97-
const classes = useUtilityClasses(other);
93+
const classes = useUtilityClasses(classesProp);
9894

9995
return (
10096
<DayCalendarSkeletonRoot className={clsx(classes.root, className)} {...other}>
10197
{monthMap.map((week, index) => (
10298
<DayCalendarSkeletonWeek key={index} className={classes.week}>
103-
{week.map((day, index2) => (
99+
{week.map((dayInMonth, index2) => (
104100
<DayCalendarSkeletonDay
105101
key={index2}
106102
variant="circular"
107103
width={DAY_SIZE}
108104
height={DAY_SIZE}
109105
className={classes.daySkeleton}
110-
ownerState={{ day }}
106+
data-day-in-month={dayInMonth}
111107
/>
112108
))}
113109
</DayCalendarSkeletonWeek>

packages/x-date-pickers/src/PickersCalendarHeader/PickersCalendarHeader.tsx

+13-14
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,14 @@ import {
1818
} from '../internals/hooks/date-helpers-hooks';
1919
import {
2020
getPickersCalendarHeaderUtilityClass,
21+
PickersCalendarHeaderClasses,
2122
pickersCalendarHeaderClasses,
2223
} from './pickersCalendarHeaderClasses';
23-
import {
24-
PickersCalendarHeaderOwnerState,
25-
PickersCalendarHeaderProps,
26-
} from './PickersCalendarHeader.types';
24+
import { PickersCalendarHeaderProps } from './PickersCalendarHeader.types';
25+
import { PickerOwnerState } from '../models/pickers';
26+
import { usePickerPrivateContext } from '../internals/hooks/usePickerPrivateContext';
2727

28-
const useUtilityClasses = (ownerState: PickersCalendarHeaderOwnerState) => {
29-
const { classes } = ownerState;
28+
const useUtilityClasses = (classes: Partial<PickersCalendarHeaderClasses> | undefined) => {
3029
const slots = {
3130
root: ['root'],
3231
labelContainer: ['labelContainer'],
@@ -43,7 +42,7 @@ const PickersCalendarHeaderRoot = styled('div', {
4342
slot: 'Root',
4443
overridesResolver: (_, styles) => styles.root,
4544
})<{
46-
ownerState: PickersCalendarHeaderOwnerState;
45+
ownerState: PickerOwnerState;
4746
}>({
4847
display: 'flex',
4948
alignItems: 'center',
@@ -61,7 +60,7 @@ const PickersCalendarHeaderLabelContainer = styled('div', {
6160
slot: 'LabelContainer',
6261
overridesResolver: (_, styles) => styles.labelContainer,
6362
})<{
64-
ownerState: PickersCalendarHeaderOwnerState;
63+
ownerState: PickerOwnerState;
6564
}>(({ theme }) => ({
6665
display: 'flex',
6766
overflow: 'hidden',
@@ -77,7 +76,7 @@ const PickersCalendarHeaderLabel = styled('div', {
7776
slot: 'Label',
7877
overridesResolver: (_, styles) => styles.label,
7978
})<{
80-
ownerState: PickersCalendarHeaderOwnerState;
79+
ownerState: PickerOwnerState;
8180
}>({
8281
marginRight: 6,
8382
});
@@ -87,7 +86,7 @@ const PickersCalendarHeaderSwitchViewButton = styled(IconButton, {
8786
slot: 'SwitchViewButton',
8887
overridesResolver: (_, styles) => styles.switchViewButton,
8988
})<{
90-
ownerState: PickersCalendarHeaderOwnerState;
89+
ownerState: PickerOwnerState;
9190
}>({
9291
marginRight: 'auto',
9392
variants: [
@@ -107,7 +106,7 @@ const PickersCalendarHeaderSwitchViewIcon = styled(ArrowDropDownIcon, {
107106
slot: 'SwitchViewIcon',
108107
overridesResolver: (_, styles) => styles.switchViewIcon,
109108
})<{
110-
ownerState: PickersCalendarHeaderOwnerState;
109+
ownerState: PickerOwnerState;
111110
}>(({ theme }) => ({
112111
willChange: 'transform',
113112
transition: theme.transitions.create('transform'),
@@ -154,14 +153,14 @@ const PickersCalendarHeader = React.forwardRef(function PickersCalendarHeader(
154153
views,
155154
labelId,
156155
className,
156+
classes: classesProp,
157157
timezone,
158158
format = `${utils.formats.month} ${utils.formats.year}`,
159159
...other
160160
} = props;
161161

162-
const ownerState = props;
163-
164-
const classes = useUtilityClasses(props);
162+
const { ownerState } = usePickerPrivateContext();
163+
const classes = useUtilityClasses(classesProp);
165164

166165
const SwitchViewButton = slots?.switchViewButton ?? PickersCalendarHeaderSwitchViewButton;
167166
const switchViewButtonProps = useSlotProps({

packages/x-date-pickers/src/PickersCalendarHeader/PickersCalendarHeader.types.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
PickersArrowSwitcherSlotProps,
1010
} from '../internals/components/PickersArrowSwitcher';
1111
import { MonthValidationOptions } from '../internals/hooks/date-helpers-hooks';
12-
import { PickerValidDate, DateView } from '../models';
12+
import { PickerValidDate, DateView, PickerOwnerState } from '../models';
1313
import { SlideDirection } from '../DateCalendar/PickersSlideTransition';
1414
import { PickersCalendarHeaderClasses } from './pickersCalendarHeaderClasses';
1515

@@ -29,19 +29,17 @@ export interface PickersCalendarHeaderSlots extends PickersArrowSwitcherSlots {
2929
// We keep the interface to allow module augmentation
3030
export interface PickersCalendarHeaderSlotPropsOverrides {}
3131

32-
export type PickersCalendarHeaderOwnerState = PickersCalendarHeaderProps;
33-
3432
export interface PickersCalendarHeaderSlotProps extends PickersArrowSwitcherSlotProps {
3533
switchViewButton?: SlotComponentProps<
3634
typeof IconButton,
3735
PickersCalendarHeaderSlotPropsOverrides,
38-
PickersCalendarHeaderOwnerState
36+
PickerOwnerState
3937
>;
4038

4139
switchViewIcon?: SlotComponentProps<
4240
typeof SvgIcon,
4341
PickersCalendarHeaderSlotPropsOverrides,
44-
PickersCalendarHeaderOwnerState
42+
PickerOwnerState
4543
>;
4644
}
4745

packages/x-date-pickers/src/internals/components/PickersArrowSwitcher/PickersArrowSwitcher.tsx

+15-13
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,20 @@ import composeClasses from '@mui/utils/composeClasses';
77
import useSlotProps from '@mui/utils/useSlotProps';
88
import IconButton from '@mui/material/IconButton';
99
import { ArrowLeftIcon, ArrowRightIcon } from '../../../icons';
10+
import { PickersArrowSwitcherProps } from './PickersArrowSwitcher.types';
1011
import {
11-
PickersArrowSwitcherOwnerState,
12-
PickersArrowSwitcherProps,
13-
} from './PickersArrowSwitcher.types';
14-
import { getPickersArrowSwitcherUtilityClass } from './pickersArrowSwitcherClasses';
12+
getPickersArrowSwitcherUtilityClass,
13+
PickersArrowSwitcherClasses,
14+
} from './pickersArrowSwitcherClasses';
15+
import { usePickerPrivateContext } from '../../hooks/usePickerPrivateContext';
16+
import { PickerOwnerState } from '../../../models';
1517

1618
const PickersArrowSwitcherRoot = styled('div', {
1719
name: 'MuiPickersArrowSwitcher',
1820
slot: 'Root',
1921
overridesResolver: (props, styles) => styles.root,
2022
})<{
21-
ownerState: PickersArrowSwitcherProps;
23+
ownerState: PickerOwnerState;
2224
}>({
2325
display: 'flex',
2426
});
@@ -28,7 +30,7 @@ const PickersArrowSwitcherSpacer = styled('div', {
2830
slot: 'Spacer',
2931
overridesResolver: (props, styles) => styles.spacer,
3032
})<{
31-
ownerState: PickersArrowSwitcherProps;
33+
ownerState: PickerOwnerState;
3234
}>(({ theme }) => ({
3335
width: theme.spacing(3),
3436
}));
@@ -38,7 +40,7 @@ const PickersArrowSwitcherButton = styled(IconButton, {
3840
slot: 'Button',
3941
overridesResolver: (props, styles) => styles.button,
4042
})<{
41-
ownerState: PickersArrowSwitcherProps;
43+
ownerState: PickerOwnerState;
4244
}>({
4345
variants: [
4446
{
@@ -48,8 +50,7 @@ const PickersArrowSwitcherButton = styled(IconButton, {
4850
],
4951
});
5052

51-
const useUtilityClasses = (ownerState: PickersArrowSwitcherOwnerState) => {
52-
const { classes } = ownerState;
53+
const useUtilityClasses = (classes: Partial<PickersArrowSwitcherClasses> | undefined) => {
5354
const slots = {
5455
root: ['root'],
5556
spacer: ['spacer'],
@@ -84,12 +85,13 @@ export const PickersArrowSwitcher = React.forwardRef(function PickersArrowSwitch
8485
onGoToPrevious,
8586
previousLabel,
8687
labelId,
88+
classes: classesProp,
8789
...other
8890
} = props;
8991

90-
const ownerState = props;
92+
const { ownerState } = usePickerPrivateContext();
9193

92-
const classes = useUtilityClasses(ownerState);
94+
const classes = useUtilityClasses(classesProp);
9395

9496
const nextProps = {
9597
isDisabled: isNextDisabled,
@@ -117,7 +119,7 @@ export const PickersArrowSwitcher = React.forwardRef(function PickersArrowSwitch
117119
edge: 'end',
118120
onClick: previousProps.goTo,
119121
},
120-
ownerState: { ...ownerState, hidden: previousProps.isHidden },
122+
ownerState: { ...ownerState, hidden: previousProps.isHidden ?? false },
121123
className: clsx(classes.button, classes.previousIconButton),
122124
});
123125

@@ -133,7 +135,7 @@ export const PickersArrowSwitcher = React.forwardRef(function PickersArrowSwitch
133135
edge: 'start',
134136
onClick: nextProps.goTo,
135137
},
136-
ownerState: { ...ownerState, hidden: nextProps.isHidden },
138+
ownerState: { ...ownerState, hidden: nextProps.isHidden ?? false },
137139
className: clsx(classes.button, classes.nextIconButton),
138140
});
139141

packages/x-date-pickers/src/internals/components/PickersArrowSwitcher/PickersArrowSwitcher.types.tsx

+11-9
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { SlotComponentProps } from '@mui/utils';
33
import IconButton from '@mui/material/IconButton';
44
import SvgIcon from '@mui/material/SvgIcon';
55
import { PickersArrowSwitcherClasses } from './pickersArrowSwitcherClasses';
6+
import { PickerOwnerState } from '../../../models';
67

78
export interface ExportedPickersArrowSwitcherProps {
89
/**
@@ -41,7 +42,12 @@ export interface PickersArrowSwitcherProps
4142
labelId?: string;
4243
}
4344

44-
export type PickersArrowSwitcherOwnerState = PickersArrowSwitcherProps;
45+
export interface PickersArrowSwitcherOwnerState extends PickerOwnerState {
46+
/**
47+
* If `true`, this button should be hidden.
48+
*/
49+
hidden: boolean;
50+
}
4551

4652
export interface PickersArrowSwitcherSlotPropsOverrides {}
4753

@@ -68,29 +74,25 @@ export interface PickersArrowSwitcherSlots {
6874
rightArrowIcon?: React.ElementType;
6975
}
7076

71-
export interface PickersArrowSwitcherButtonSlotOwnerState extends PickersArrowSwitcherOwnerState {
72-
hidden?: boolean;
73-
}
74-
7577
export interface PickersArrowSwitcherSlotProps {
7678
previousIconButton?: SlotComponentProps<
7779
typeof IconButton,
7880
PickersArrowSwitcherSlotPropsOverrides,
79-
PickersArrowSwitcherButtonSlotOwnerState
81+
PickersArrowSwitcherOwnerState
8082
>;
8183
nextIconButton?: SlotComponentProps<
8284
typeof IconButton,
8385
PickersArrowSwitcherSlotPropsOverrides,
84-
PickersArrowSwitcherButtonSlotOwnerState
86+
PickersArrowSwitcherOwnerState
8587
>;
8688
leftArrowIcon?: SlotComponentProps<
8789
typeof SvgIcon,
8890
PickersArrowSwitcherSlotPropsOverrides,
89-
PickersArrowSwitcherButtonSlotOwnerState
91+
PickerOwnerState
9092
>;
9193
rightArrowIcon?: SlotComponentProps<
9294
typeof SvgIcon,
9395
PickersArrowSwitcherSlotPropsOverrides,
94-
PickersArrowSwitcherButtonSlotOwnerState
96+
PickerOwnerState
9597
>;
9698
}

0 commit comments

Comments
 (0)