import * as React from 'react'; import { Component, ComponentClass, MouseEvent, ReactNode } from 'react'; import getPassThrough, { PassTroughFunction } from '../../utils/getPassThrough'; export interface DropdownOptionProps { children: ReactNode; className?: string; disabled: boolean; innerRef(instance: HTMLElement): void; onClick(event: MouseEvent, value: T): void; selected: boolean; value: T; } export interface OptionNodeProps { className?: string; disabled?: boolean; children: ReactNode; innerRef(instance: HTMLElement): void; onClick(event: MouseEvent): void; selected: boolean; } export interface DefaultTemplateProps { className?: string; disabled?: boolean; children: ReactNode; innerRef(instance: HTMLElement): void; onClick(event: MouseEvent): void; selected: boolean; } export interface DropdownOptionFactoryArgs { OptionNode: ComponentClass; DefaultTemplate: ComponentClass; passthrough: PassTroughFunction< DropdownOptionProps, 'OptionNode' | 'DefaultTemplate' >; } export default function dropdownOptionFactory({ OptionNode, DefaultTemplate, passthrough, }: DropdownOptionFactoryArgs): ComponentClass> { const passProps = getPassThrough(passthrough); return class DropdownOption extends Component, {}> { rootNode: HTMLElement | null = null; handleClick = (event: MouseEvent) => { if (this.props.onClick) { this.props.onClick(event, this.props.value); } }; render() { const { children, className, disabled, innerRef, onClick, selected, value, ...rest, } = this.props; let content; if (!children || typeof children === 'string') { content = ( {children} ); } return ( {content || children} ); } }; }