import * as React from 'react' import { isString, isNumber, capitalizeFirst } from '..' export type ReactAttributes = React.HTMLAttributes & JSX.IntrinsicAttributes export function appendClass(child: React.ReactChild, ...classes: string[]) { if (isString(child) || isNumber(child)) { return child } let className = `${child.props.className} ${classes.join(' ')}` return overrideProps(child, _ => ({ className } as Partial)) } export function overrideProps( child: React.ReactChild, propsMapper: (props: T) => Partial, ) { if (isString(child) || isNumber(child)) { return child } return React.cloneElement(child, propsMapper(child.props)) } type Handler = (...args: Args) => void type ProxiedHandler = (origin: Handler) => Handler export function overrideEventhandler( child: React.ReactChild, eventName: T, deligator: ProxiedHandler, ) { let handlerName = 'on' + capitalizeFirst(eventName) return overrideProps(child, props => ({ [handlerName]: deligator(props[handlerName]) })) }