diff --git a/src/index.js b/src/index.js index 16f85f7..2ddf089 100644 --- a/src/index.js +++ b/src/index.js @@ -36,11 +36,32 @@ class InputTrigger extends Component { this.handleTrigger = this.handleTrigger.bind(this); this.resetState = this.resetState.bind(this); - this.element = this.props.elementRef; + this.findInput = this.findInput.bind(this); } + componentDidMount() { this.props.endTrigger(this.resetState); + this.element = this.findInput(); + } + + findInput() { + if (this.props.getElement) { + return this.props.getElement(this); + } + if (this.childElemnt instanceof Element && ['INPUT', 'TEXTAREA'].find(tag => tag === this.childElemnt.tagName)) { + return this.childElemnt; + } + const inputs = this.div.getElementsByTagName('input'); + if (inputs.length) { + return inputs[0]; + } + const textareas = this.div.getElementsByTagName('textarea'); + if (textareas.length) { + return textareas[0]; + } + return null;// Would like to warn, but lint disallowed console logs. + // console.warn('Multiple or no inputs detected', inputs); } handleTrigger(event) { @@ -109,7 +130,7 @@ class InputTrigger extends Component { render() { const { - elementRef, + getElement, children, trigger, onStart, @@ -124,15 +145,18 @@ class InputTrigger extends Component { role="textbox" tabIndex={-1} onKeyDown={this.handleTrigger} + ref={(el) => { + this.div = el; + }} {...rest} > { - !elementRef + !getElement ? ( React.Children.map(this.props.children, child => ( React.cloneElement(child, { ref: (element) => { - this.element = element; + this.childElemnt = element; if (typeof child.ref === 'function') { child.ref(element); } @@ -161,7 +185,7 @@ InputTrigger.propTypes = { onType: PropTypes.func, endTrigger: PropTypes.func, children: PropTypes.element.isRequired, - elementRef: PropTypes.element, + getElement: PropTypes.func, }; InputTrigger.defaultProps = { @@ -175,7 +199,7 @@ InputTrigger.defaultProps = { onCancel: () => {}, onType: () => {}, endTrigger: () => {}, - elementRef: null, + getElement: undefined, }; export default InputTrigger;