import * as React from 'react'; /** * @module Components */ export interface CaseInputProp { uppercase?: boolean, lowercase?: boolean, onChange?: (evt: any) => (void | any), inputComponent?: React.ReactElement, [key: string]: any } let BaseHTMLInput = React.forwardRef((props, ref) => ) /** * @class CaseInput, a react component to enable case-transforming input */ export class CaseInput extends React.Component { constructor(props) { super(props); this.onChange = this.onChange.bind(this); this.inputRef = React.createRef(); } selectionStart = null; selectionEnd = null; inputRef = null; onChange(evt) { let { selectionStart, selectionEnd } = evt.currentTarget; this.selectionStart = selectionStart; this.selectionEnd = selectionEnd; if (this.props.uppercase) { evt.currentTarget.value = evt.currentTarget.value.toUpperCase(); } else if (this.props.lowercase) { evt.currentTarget.value = evt.currentTarget.value.toLowerCase(); } this.props.onChange?.(evt); } componentDidUpdate() { if (this.props.uppercase || this.props.lowercase) { this.inputRef?.current.setSelectionRange(this.selectionStart, this.selectionEnd); } } render() { let { uppercase, lowercase, onChange, inputComponent, ...renderedProps } = this.props; let baseInputComponent = this.props.inputComponent ?? ; const InputComponent = React.cloneElement( baseInputComponent, { ref: this.inputRef, onChange: this.onChange, ...renderedProps } ); return InputComponent; } }