@hitachivantara/uikit-react-utils
Version:
UI Kit utilities package.
40 lines (39 loc) • 1.25 kB
JavaScript
import { useCss } from "./useCss.js";
import { useTheme } from "./useTheme.js";
import { useMemo } from "react";
//#region src/hooks/useDefaultProps.ts
/** Filter out `undefined` entries from `props` object. */
function filterProps(props) {
return Object.keys(props).reduce((acc, key) => {
if (props[key] !== void 0) acc[key] = props[key];
return acc;
}, {});
}
/** Injects into `props` the props defined in the theme `componentName`. */
function useDefaultProps(componentName, props) {
const { activeTheme } = useTheme();
const { css, cx } = useCss();
const themeDefaultProps = activeTheme?.components?.[componentName];
const classes = useMemo(() => {
const themeClasses = themeDefaultProps?.classes || {};
const propsClasses = props?.classes || {};
const classKeys = [...Object.keys(themeClasses), ...Object.keys(propsClasses)];
if (classKeys.length === 0) return void 0;
return classKeys.reduce((acc, key) => {
acc[key] = cx(themeClasses[key] && css(themeClasses[key]), propsClasses[key]);
return acc;
}, {});
}, [
css,
cx,
props?.classes,
themeDefaultProps?.classes
]);
return {
...themeDefaultProps,
...filterProps(props),
...classes && { classes }
};
}
//#endregion
export { useDefaultProps };