@base-ui-components/react
Version:
Base UI is a library of headless ('unstyled') React components and low-level hooks. You gain complete control over your app's CSS and accessibility features.
48 lines • 1.51 kB
JavaScript
import * as React from 'react';
import { getStyleHookProps } from './getStyleHookProps.js';
import { resolveClassName } from './resolveClassName.js';
import { evaluateRenderProp } from './evaluateRenderProp.js';
import { useRenderPropForkRef } from './useRenderPropForkRef.js';
import { defaultRenderFunctions } from './defaultRenderFunctions.js';
/**
* Returns a function that renders a Base UI component.
*
* @ignore - internal hook.
*/
export function useComponentRenderer(settings) {
const {
render: renderProp,
className: classNameProp,
state,
ref,
propGetter = props => props,
extraProps,
customStyleHookMapping
} = settings;
const className = resolveClassName(classNameProp, state);
const styleHooks = React.useMemo(() => {
return getStyleHookProps(state, customStyleHookMapping);
}, [state, customStyleHookMapping]);
const ownProps = {
...styleHooks,
...extraProps
};
let resolvedRenderProp;
if (typeof renderProp === 'string') {
resolvedRenderProp = defaultRenderFunctions[renderProp];
} else {
resolvedRenderProp = renderProp;
}
const renderedElementProps = propGetter(ownProps);
const propsWithRef = {
...renderedElementProps,
ref: useRenderPropForkRef(resolvedRenderProp, ref, renderedElementProps.ref)
};
if (className !== undefined) {
propsWithRef.className = className;
}
const renderElement = () => evaluateRenderProp(resolvedRenderProp, propsWithRef, state);
return {
renderElement
};
}