UNPKG

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