@mui/utils
Version:
Utility functions for React components.
55 lines (54 loc) • 2.14 kB
JavaScript
import clsx from 'clsx';
/**
* Add keys, values of `defaultProps` that does not exist in `props`
* @param defaultProps
* @param props
* @param mergeClassNameAndStyle If `true`, merges `className` and `style` props instead of overriding them.
* When `false` (default), props override defaultProps. When `true`, `className` values are concatenated
* and `style` objects are merged with props taking precedence.
* @returns resolved props
*/
export default function resolveProps(defaultProps, props, mergeClassNameAndStyle = false) {
const output = {
...props
};
for (const key in defaultProps) {
if (Object.prototype.hasOwnProperty.call(defaultProps, key)) {
const propName = key;
if (propName === 'components' || propName === 'slots') {
output[propName] = {
...defaultProps[propName],
...output[propName]
};
} else if (propName === 'componentsProps' || propName === 'slotProps') {
const defaultSlotProps = defaultProps[propName];
const slotProps = props[propName];
if (!slotProps) {
output[propName] = defaultSlotProps || {};
} else if (!defaultSlotProps) {
output[propName] = slotProps;
} else {
output[propName] = {
...slotProps
};
for (const slotKey in defaultSlotProps) {
if (Object.prototype.hasOwnProperty.call(defaultSlotProps, slotKey)) {
const slotPropName = slotKey;
output[propName][slotPropName] = resolveProps(defaultSlotProps[slotPropName], slotProps[slotPropName], mergeClassNameAndStyle);
}
}
}
} else if (propName === 'className' && mergeClassNameAndStyle && props.className) {
output.className = clsx(defaultProps?.className, props?.className);
} else if (propName === 'style' && mergeClassNameAndStyle && props.style) {
output.style = {
...defaultProps?.style,
...props?.style
};
} else if (output[propName] === undefined) {
output[propName] = defaultProps[propName];
}
}
}
return output;
}