import * as React from 'react'; import { Component, ComponentClass, MouseEvent, ReactNode } from 'react'; import getPassThrough, { PassTroughFunction } from '../../utils/getPassThrough'; export interface ListItemNodeProps { className?: string; disabled?: boolean; onClick(event: MouseEvent): void; onMouseDown(event: MouseEvent): void; onMouseEnter(event: MouseEvent): void; onMouseLeave(event: MouseEvent): void; } export interface ListItemFactoryArgs { ListItemNode: ComponentClass; passthrough: PassTroughFunction, 'ListItemNode'>; } export interface ListItemProps { children: ReactNode; className?: string; disabled?: boolean; onClick?(event: MouseEvent, value: T): void; onMouseDown?(event: MouseEvent, value: T): void; onMouseEnter?(event: MouseEvent, value: T): void; onMouseLeave?(event: MouseEvent, value: T): void; value: T; } export default function listItemFactory({ ListItemNode, passthrough, }: ListItemFactoryArgs): ComponentClass> { const passProps = getPassThrough(passthrough); return class ListItem extends Component, {}> { static defaultProps = { disabled: false, }; handleClick = (event: MouseEvent) => { const { disabled, onClick, value } = this.props; if (!disabled && onClick) { onClick(event, value); } }; handleMouseDown = (event: MouseEvent) => { const { disabled, onMouseDown, value } = this.props; if (!disabled && onMouseDown) { onMouseDown(event, value); } }; handleMouseEnter = (event: MouseEvent) => { const { disabled, onMouseEnter, value } = this.props; if (!disabled && onMouseEnter) { onMouseEnter(event, value); } }; handleMouseLeave = (event: MouseEvent) => { const { disabled, onMouseLeave, value } = this.props; if (!disabled && onMouseLeave) { onMouseLeave(event, value); } }; render() { const { children, className, disabled, onClick, onMouseDown, onMouseEnter, onMouseLeave, value, ...rest, } = this.props; return ( {children} ); } }; }