insomnia/packages/insomnia-app/app/ui/components/base/debounced-input.js
Gregory Schier 549ce23ce8
Merge All Repositories into Monorepo for easier maintenance (#629)
* All projects into monorepo

* Update CI

* More CI updates

* Extracted a bunch of things into packages

* Publish

 - insomnia-plugin-base64@1.0.1
 - insomnia-plugin-default-headers@1.0.2
 - insomnia-plugin-file@1.0.1
 - insomnia-plugin-hash@1.0.1
 - insomnia-plugin-now@1.0.1
 - insomnia-plugin-request@1.0.1
 - insomnia-plugin-response@1.0.1
 - insomnia-plugin-uuid@1.0.1
 - insomnia-cookies@0.0.2
 - insomnia-importers@1.5.2
 - insomnia-prettify@0.0.3
 - insomnia-url@0.0.2
 - insomnia-xpath@0.0.2

* A bunch of small fixes

* Improved build script

* Fixed

* Merge dangling files

* Usability refactor

* Handle duplicate plugin names
2017-11-26 20:45:40 +00:00

149 lines
2.8 KiB
JavaScript

import React, {PureComponent} from 'react';
import PropTypes from 'prop-types';
import autobind from 'autobind-decorator';
import {debounce} from '../../../common/misc';
@autobind
class DebouncedInput extends PureComponent {
constructor (props) {
super(props);
if (!props.delay) {
this._handleValueChange = props.onChange;
} else {
this._handleValueChange = debounce(props.onChange, props.delay || 500);
}
this._hasFocus = false;
}
_handleChange (e) {
this._handleValueChange(e.target.value);
}
_handleFocus (e) {
this._hasFocus = true;
this.props.onFocus && this.props.onFocus(e);
}
_handleBlur (e) {
this._hasFocus = false;
this.props.onBlur && this.props.onBlur(e);
}
_setRef (n) {
this._input = n;
}
setAttribute (name, value) {
this._input.setAttribute(name, value);
}
removeAttribute (name) {
this._input.removeAttribute(name);
}
getAttribute (name) {
this._input.getAttribute(name);
}
hasFocus () {
return this._hasFocus;
}
getSelectionStart () {
if (this._input) {
return this._input.selectionStart;
} else {
return -1;
}
}
getSelectionEnd () {
if (this._input) {
return this._input.selectionEnd;
} else {
return -1;
}
}
focus () {
if (this._input) {
this._input.focus();
}
}
focusEnd () {
if (this._input) {
// Hack to focus the end (set value to current value);
this._input.value = this.getValue();
this._input.focus();
}
}
blur () {
if (this._input) {
this._input.blur();
}
}
select () {
if (this._input) {
this._input.select();
}
}
getValue () {
if (this._input) {
return this._input.value;
} else {
return '';
}
}
render () {
const {
onChange, // eslint-disable-line no-unused-vars
onFocus, // eslint-disable-line no-unused-vars
onBlur, // eslint-disable-line no-unused-vars
delay, // eslint-disable-line no-unused-vars
textarea,
...props
} = this.props;
if (textarea) {
return (
<textarea
ref={this._setRef}
{...props}
onChange={this._handleChange}
onFocus={this._handleFocus}
onBlur={this._handleBlur}
/>
);
} else {
return (
<input
ref={this._setRef}
{...props}
onChange={this._handleChange}
onFocus={this._handleFocus}
onBlur={this._handleBlur}
/>
);
}
}
}
DebouncedInput.propTypes = {
// Required
onChange: PropTypes.func.isRequired,
// Optional
onFocus: PropTypes.func,
onBlur: PropTypes.func,
textarea: PropTypes.bool,
delay: PropTypes.number
};
export default DebouncedInput;