2018-03-26 00:46:45 +05:30
|
|
|
// @flow
|
2018-05-05 12:13:43 +05:30
|
|
|
import type { Skin, Color } from 'components/ui';
|
|
|
|
import type { MessageDescriptor } from 'react-intl';
|
2017-08-23 00:19:50 +05:30
|
|
|
import React from 'react';
|
2018-03-26 00:46:45 +05:30
|
|
|
import TextareaAutosize from 'react-textarea-autosize';
|
2016-05-22 22:55:38 +05:30
|
|
|
import classNames from 'classnames';
|
2016-07-29 22:44:52 +05:30
|
|
|
import { uniqueId, omit } from 'functions';
|
2018-03-26 00:46:45 +05:30
|
|
|
import { SKIN_DARK, COLOR_GREEN } from 'components/ui';
|
2016-05-22 22:55:38 +05:30
|
|
|
|
|
|
|
import styles from './form.scss';
|
|
|
|
import FormInputComponent from './FormInputComponent';
|
|
|
|
|
2018-03-26 00:46:45 +05:30
|
|
|
type TextareaAutosizeProps = {
|
2019-11-27 14:33:32 +05:30
|
|
|
onHeightChange?: (number, TextareaAutosizeProps) => void,
|
|
|
|
useCacheForDOMMeasurements?: boolean,
|
|
|
|
minRows?: number,
|
|
|
|
maxRows?: number,
|
|
|
|
inputRef?: (?HTMLTextAreaElement) => void,
|
2018-05-05 12:13:43 +05:30
|
|
|
};
|
2018-03-26 00:46:45 +05:30
|
|
|
|
2019-11-27 14:33:32 +05:30
|
|
|
export default class TextArea extends FormInputComponent<
|
|
|
|
{
|
2018-03-26 00:46:45 +05:30
|
|
|
placeholder?: string | MessageDescriptor,
|
|
|
|
label?: string | MessageDescriptor,
|
|
|
|
error?: string,
|
|
|
|
skin: Skin,
|
|
|
|
color: Color,
|
2019-11-27 14:33:32 +05:30
|
|
|
} & TextareaAutosizeProps,
|
|
|
|
> {
|
|
|
|
static defaultProps = {
|
|
|
|
color: COLOR_GREEN,
|
|
|
|
skin: SKIN_DARK,
|
|
|
|
};
|
|
|
|
|
|
|
|
elRef = React.createRef<HTMLTextAreaElement>();
|
|
|
|
|
|
|
|
render() {
|
|
|
|
const { color, skin } = this.props;
|
|
|
|
let { label } = this.props;
|
|
|
|
|
|
|
|
const props = omit(
|
|
|
|
{
|
|
|
|
type: 'text',
|
|
|
|
...this.props,
|
|
|
|
},
|
|
|
|
['label', 'error', 'skin', 'color'],
|
|
|
|
);
|
|
|
|
|
|
|
|
if (label) {
|
|
|
|
if (!props.id) {
|
|
|
|
props.id = uniqueId('textarea');
|
|
|
|
}
|
|
|
|
|
|
|
|
label = this.formatMessage(label);
|
|
|
|
|
|
|
|
label = (
|
|
|
|
<label className={styles.textFieldLabel} htmlFor={props.id}>
|
|
|
|
{label}
|
|
|
|
</label>
|
|
|
|
);
|
2016-05-22 22:55:38 +05:30
|
|
|
}
|
|
|
|
|
2019-11-27 14:33:32 +05:30
|
|
|
props.placeholder = this.formatMessage(props.placeholder);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div className={styles.formRow}>
|
|
|
|
{label}
|
|
|
|
<div className={styles.textAreaContainer}>
|
|
|
|
<TextareaAutosize
|
|
|
|
inputRef={this.elRef}
|
|
|
|
className={classNames(
|
|
|
|
styles.textArea,
|
|
|
|
styles[`${skin}TextField`],
|
|
|
|
styles[`${color}TextField`],
|
|
|
|
)}
|
|
|
|
{...props}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
{this.renderError()}
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
getValue() {
|
|
|
|
const { current: el } = this.elRef;
|
|
|
|
|
|
|
|
return el && el.value;
|
|
|
|
}
|
|
|
|
|
|
|
|
focus() {
|
|
|
|
const { current: el } = this.elRef;
|
|
|
|
|
|
|
|
if (!el) {
|
|
|
|
return;
|
2016-05-22 22:55:38 +05:30
|
|
|
}
|
|
|
|
|
2019-11-27 14:33:32 +05:30
|
|
|
el.focus();
|
|
|
|
setTimeout(el.focus.bind(el), 10);
|
|
|
|
}
|
2016-05-22 22:55:38 +05:30
|
|
|
}
|