dispatch/client/js/components/ui/TextInput.js

129 lines
3.2 KiB
JavaScript
Raw Normal View History

import React, { PureComponent } from 'react';
import { FastField } from 'formik';
import classnames from 'classnames';
import capitalize from 'lodash/capitalize';
import Error from 'components/ui/formik/Error';
2018-05-16 03:02:48 +00:00
export default class TextInput extends PureComponent {
constructor(props) {
super(props);
this.input = React.createRef();
window.addEventListener('resize', this.handleResize);
}
2018-05-16 03:02:48 +00:00
componentWillUnmount() {
window.removeEventListener('resize', this.handleResize);
}
handleResize = () => {
if (this.scroll) {
this.scroll = false;
this.scrollIntoView();
}
};
handleFocus = () => {
this.scroll = true;
setTimeout(() => {
this.scroll = false;
}, 2000);
};
scrollIntoView = () => {
if (this.input.current.scrollIntoViewIfNeeded) {
this.input.current.scrollIntoViewIfNeeded();
} else {
this.input.current.scrollIntoView();
}
};
render() {
2018-12-19 01:55:50 +00:00
const {
name,
label = capitalize(name),
noError,
noTrim,
transform,
blurTransform,
...props
} = this.props;
return (
<FastField
name={name}
2018-12-19 01:55:50 +00:00
render={({ field, form }) => (
<>
<div className="textinput">
<input
className={field.value && 'value'}
type="text"
name={name}
id={name}
2018-12-19 01:55:50 +00:00
autoCapitalize="off"
autoCorrect="off"
autoComplete="off"
spellCheck="false"
ref={this.input}
onFocus={this.handleFocus}
{...field}
{...props}
onChange={e => {
2020-05-10 00:53:39 +00:00
let v = e.target.value;
if (!noTrim) {
v = v.trim();
}
2018-12-19 01:55:50 +00:00
if (transform) {
v = transform(v);
}
if (v !== field.value) {
form.setFieldValue(name, v);
if (props.onChange) {
props.onChange(e);
}
}
}}
onBlur={e => {
2020-05-10 00:53:39 +00:00
field.onBlur(e);
if (props.onBlur) {
props.onBlur(e);
}
2018-12-19 01:55:50 +00:00
if (blurTransform) {
2020-05-10 00:53:39 +00:00
const v = blurTransform(e.target.value);
2018-12-19 01:55:50 +00:00
if (v && v !== field.value) {
2020-05-10 00:53:39 +00:00
form.setFieldValue(name, v);
2018-12-19 01:55:50 +00:00
}
}
}}
/>
<label
htmlFor={name}
className={classnames('textinput-label', 'textinput-1', {
2018-12-19 01:55:50 +00:00
value: field.value,
error: form.touched[name] && form.errors[name]
})}
>
{label}
</label>
2018-12-19 01:55:50 +00:00
<span
className={classnames('textinput-label', 'textinput-2', {
2018-12-19 01:55:50 +00:00
value: field.value,
error: form.touched[name] && form.errors[name]
})}
>
{label}
</span>
</div>
{!noError && <Error name={name} />}
</>
)}
/>
);
}
}