fannypack-v5
Version:
An accessible, composable, and friendly React UI Kit
27 lines (25 loc) • 828 B
text/typescript
import * as React from 'react';
import { useDefaultProps } from './useDefaultProps';
export function createComponent<Props>(
Component: React.FunctionComponent<Props>,
config?: {
attach?: {
displayName?: string;
useProps: (props?: Partial<Props>, config?: { themeKey?: string }) => any;
};
defaultProps?: Partial<Props>;
themeKey?: string;
shouldMemo?: boolean;
}
) {
const Comp = (props: Props, ref) => {
const { props: newProps } = useDefaultProps(props, config);
// @ts-ignore
return React.createElement(Component, { ...newProps, elementRef: ref }, props?.children);
};
let ForwardedComponent = React.forwardRef(Comp);
if (config.shouldMemo) {
ForwardedComponent = React.memo(ForwardedComponent);
}
return Object.assign(ForwardedComponent, config.attach);
}