UNPKG

3.14 kBJavaScriptView Raw
1"use strict";
2'use client';
3
4var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.default = useSlot;
9var _useForkRef = _interopRequireDefault(require("@mui/utils/useForkRef"));
10var _appendOwnerState = _interopRequireDefault(require("@mui/utils/appendOwnerState"));
11var _resolveComponentProps = _interopRequireDefault(require("@mui/utils/resolveComponentProps"));
12var _mergeSlotProps = _interopRequireDefault(require("@mui/utils/mergeSlotProps"));
13/**
14 * An internal function to create a Material UI slot.
15 *
16 * This is an advanced version of Base UI `useSlotProps` because Material UI allows leaf component to be customized via `component` prop
17 * while Base UI does not need to support leaf component customization.
18 *
19 * @param {string} name: name of the slot
20 * @param {object} parameters
21 * @returns {[Slot, slotProps]} The slot's React component and the slot's props
22 *
23 * Note: the returned slot's props
24 * - will never contain `component` prop.
25 * - might contain `as` prop.
26 */
27function useSlot(
28/**
29 * The slot's name. All Material UI components should have `root` slot.
30 *
31 * If the name is `root`, the logic behaves differently from other slots,
32 * e.g. the `externalForwardedProps` are spread to `root` slot but not other slots.
33 */
34name, parameters) {
35 const {
36 className,
37 elementType: initialElementType,
38 ownerState,
39 externalForwardedProps,
40 getSlotOwnerState,
41 internalForwardedProps,
42 ...useSlotPropsParams
43 } = parameters;
44 const {
45 component: rootComponent,
46 slots = {
47 [name]: undefined
48 },
49 slotProps = {
50 [name]: undefined
51 },
52 ...other
53 } = externalForwardedProps;
54 const elementType = slots[name] || initialElementType;
55
56 // `slotProps[name]` can be a callback that receives the component's ownerState.
57 // `resolvedComponentsProps` is always a plain object.
58 const resolvedComponentsProps = (0, _resolveComponentProps.default)(slotProps[name], ownerState);
59 const {
60 props: {
61 component: slotComponent,
62 ...mergedProps
63 },
64 internalRef
65 } = (0, _mergeSlotProps.default)({
66 className,
67 ...useSlotPropsParams,
68 externalForwardedProps: name === 'root' ? other : undefined,
69 externalSlotProps: resolvedComponentsProps
70 });
71 const ref = (0, _useForkRef.default)(internalRef, resolvedComponentsProps?.ref, parameters.ref);
72 const slotOwnerState = getSlotOwnerState ? getSlotOwnerState(mergedProps) : {};
73 const finalOwnerState = {
74 ...ownerState,
75 ...slotOwnerState
76 };
77 const LeafComponent = name === 'root' ? slotComponent || rootComponent : slotComponent;
78 const props = (0, _appendOwnerState.default)(elementType, {
79 ...(name === 'root' && !rootComponent && !slots[name] && internalForwardedProps),
80 ...(name !== 'root' && !slots[name] && internalForwardedProps),
81 ...mergedProps,
82 ...(LeafComponent && {
83 as: LeafComponent
84 }),
85 ref
86 }, finalOwnerState);
87 Object.keys(slotOwnerState).forEach(propName => {
88 delete props[propName];
89 });
90 return [elementType, props];
91}
\No newline at end of file