// @flow strict import * as React from 'react'; import classify from '../classify'; export function nameHoc, C2>( WrapperComponent: T, WrappedComponent: React.ComponentType, hocName: string, ): T { const wrappedComponentName = WrappedComponent.displayName || WrappedComponent.name || 'Component'; WrapperComponent.displayName = `${hocName}(${wrappedComponentName})`; return WrapperComponent; } export type ClassNameComponent< T = 'div', I = React.ElementRef, > = React.AbstractComponent, I>; export function makeClassNameComponent( baseClassName: string, // $FlowFixMe not sure how to type this correctly ComponentType: C = 'div', name?: string, ): React.AbstractComponent, React.ElementRef> { return React.forwardRef( // $FlowFixMe[escaped-generic] nameComponent( ({className, ...props}, ref) => ( // $FlowFixMe[escaped-generic] ), `CNC(${name || ComponentType})`, ), ); } export function makeClassNameComponentCustom< C: $ReadOnly<{className?: string}>, B, >( baseClassName: string, ComponentType: React.AbstractComponent, ): React.AbstractComponent { return React.forwardRef( nameHoc( ({className, ...props}, ref) => ( ), ComponentType, 'CNC', ), ); } function nameComponent(component, name) { component.displayName = name; return component; }