-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
/
Copy pathusePickerLayout.tsx
110 lines (96 loc) · 3.55 KB
/
usePickerLayout.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
'use client';
import * as React from 'react';
import useSlotProps from '@mui/utils/useSlotProps';
import composeClasses from '@mui/utils/composeClasses';
import { useRtl } from '@mui/system/RtlProvider';
import { PickersActionBar, PickersActionBarAction } from '../PickersActionBar';
import { PickerLayoutOwnerState, PickersLayoutProps, SubComponents } from './PickersLayout.types';
import { getPickersLayoutUtilityClass, PickersLayoutClasses } from './pickersLayoutClasses';
import { PickersShortcuts } from '../PickersShortcuts';
import { BaseToolbarProps } from '../internals/models/props/toolbar';
import { PickerValidValue } from '../internals/models';
import { usePickerPrivateContext } from '../internals/hooks/usePickerPrivateContext';
import { usePickerContext } from '../hooks';
function toolbarHasView(toolbarProps: BaseToolbarProps | any): toolbarProps is BaseToolbarProps {
return toolbarProps.view !== null;
}
const useUtilityClasses = (
classes: Partial<PickersLayoutClasses> | undefined,
ownerState: PickerLayoutOwnerState,
) => {
const { pickerOrientation } = ownerState;
const slots = {
root: ['root', pickerOrientation === 'landscape' && 'landscape'],
contentWrapper: ['contentWrapper'],
toolbar: ['toolbar'],
actionBar: ['actionBar'],
tabs: ['tabs'],
landscape: ['landscape'],
shortcuts: ['shortcuts'],
};
return composeClasses(slots, getPickersLayoutUtilityClass, classes);
};
interface UsePickerLayoutResponse<TValue extends PickerValidValue> extends SubComponents<TValue> {
ownerState: PickerLayoutOwnerState;
}
const usePickerLayout = <TValue extends PickerValidValue>(
props: PickersLayoutProps<TValue>,
): UsePickerLayoutResponse<TValue> => {
const { ownerState: pickerOwnerState } = usePickerPrivateContext();
const { view } = usePickerContext();
const isRtl = useRtl();
const { children, slots, slotProps, classes: classesProp } = props;
const ownerState = React.useMemo<PickerLayoutOwnerState>(
() => ({ ...pickerOwnerState, layoutDirection: isRtl ? 'rtl' : 'ltr' }),
[pickerOwnerState, isRtl],
);
const classes = useUtilityClasses(classesProp, ownerState);
// Action bar
const ActionBar = slots?.actionBar ?? PickersActionBar;
const {
// PickersActionBar does not use it and providing it breaks memoization
ownerState: destructuredOwnerState,
...actionBarProps
} = useSlotProps({
elementType: ActionBar,
externalSlotProps: slotProps?.actionBar,
additionalProps: {
actions: ['cancel', 'accept'] as PickersActionBarAction[],
},
className: classes.actionBar,
ownerState,
});
const actionBar = <ActionBar {...actionBarProps} />;
// Toolbar
const Toolbar = slots?.toolbar;
const toolbarProps = useSlotProps({
elementType: Toolbar!,
externalSlotProps: slotProps?.toolbar,
className: classes.toolbar,
ownerState,
});
const toolbar = toolbarHasView(toolbarProps) && !!Toolbar ? <Toolbar {...toolbarProps} /> : null;
// Content
const content = children;
// Tabs
const Tabs = slots?.tabs;
const tabs = view && Tabs ? <Tabs className={classes.tabs} {...slotProps?.tabs} /> : null;
// Shortcuts
const Shortcuts = slots?.shortcuts ?? PickersShortcuts;
const shortcutsProps = useSlotProps({
elementType: Shortcuts!,
externalSlotProps: slotProps?.shortcuts,
className: classes.shortcuts,
ownerState,
});
const shortcuts = view && !!Shortcuts ? <Shortcuts {...shortcutsProps} /> : null;
return {
toolbar,
content,
tabs,
actionBar,
shortcuts,
ownerState,
};
};
export default usePickerLayout;