Convert EditableTextContainer to TS
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
This commit is contained in:
parent
ea623e79bb
commit
17d2998ec1
1 changed files with 60 additions and 61 deletions
|
@ -15,9 +15,34 @@ limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import * as sdk from '../../../index';
|
|
||||||
import { replaceableComponent } from "../../../utils/replaceableComponent";
|
import { replaceableComponent } from "../../../utils/replaceableComponent";
|
||||||
|
import Spinner from "./Spinner";
|
||||||
|
import EditableText from "./EditableText";
|
||||||
|
|
||||||
|
interface IProps {
|
||||||
|
/* callback to retrieve the initial value. */
|
||||||
|
getInitialValue?: () => Promise<string>;
|
||||||
|
|
||||||
|
/* initial value; used if getInitialValue is not given */
|
||||||
|
initialValue?: string;
|
||||||
|
|
||||||
|
/* placeholder text to use when the value is empty (and not being
|
||||||
|
* edited) */
|
||||||
|
placeholder?: string;
|
||||||
|
|
||||||
|
/* callback to update the value. Called with a single argument: the new
|
||||||
|
* value. */
|
||||||
|
onSubmit?: (value: string) => Promise<{} | void>;
|
||||||
|
|
||||||
|
/* should the input submit when focus is lost? */
|
||||||
|
blurToSubmit?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IState {
|
||||||
|
busy: boolean;
|
||||||
|
errorString: string;
|
||||||
|
value: string;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A component which wraps an EditableText, with a spinner while updates take
|
* A component which wraps an EditableText, with a spinner while updates take
|
||||||
|
@ -31,50 +56,51 @@ import { replaceableComponent } from "../../../utils/replaceableComponent";
|
||||||
* taken from the 'initialValue' property.
|
* taken from the 'initialValue' property.
|
||||||
*/
|
*/
|
||||||
@replaceableComponent("views.elements.EditableTextContainer")
|
@replaceableComponent("views.elements.EditableTextContainer")
|
||||||
export default class EditableTextContainer extends React.Component {
|
export default class EditableTextContainer extends React.Component<IProps, IState> {
|
||||||
constructor(props) {
|
private _unmounted = false;
|
||||||
|
public static defaultProps: Partial<IProps> = {
|
||||||
|
initialValue: "",
|
||||||
|
placeholder: "",
|
||||||
|
blurToSubmit: false,
|
||||||
|
onSubmit: () => { return Promise.resolve(); },
|
||||||
|
};
|
||||||
|
|
||||||
|
constructor(props: IProps) {
|
||||||
super(props);
|
super(props);
|
||||||
|
|
||||||
this._unmounted = false;
|
|
||||||
this.state = {
|
this.state = {
|
||||||
busy: false,
|
busy: false,
|
||||||
errorString: null,
|
errorString: null,
|
||||||
value: props.initialValue,
|
value: props.initialValue,
|
||||||
};
|
};
|
||||||
this._onValueChanged = this._onValueChanged.bind(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
public async componentDidMount(): Promise<void> {
|
||||||
if (this.props.getInitialValue === undefined) {
|
|
||||||
// use whatever was given in the initialValue property.
|
// use whatever was given in the initialValue property.
|
||||||
return;
|
if (this.props.getInitialValue === undefined) return;
|
||||||
}
|
|
||||||
|
|
||||||
this.setState({ busy: true });
|
this.setState({ busy: true });
|
||||||
|
try {
|
||||||
this.props.getInitialValue().then(
|
const initialValue = await this.props.getInitialValue();
|
||||||
(result) => {
|
if (this._unmounted) return;
|
||||||
if (this._unmounted) { return; }
|
|
||||||
this.setState({
|
this.setState({
|
||||||
busy: false,
|
busy: false,
|
||||||
value: result,
|
value: initialValue,
|
||||||
});
|
});
|
||||||
},
|
} catch (error) {
|
||||||
(error) => {
|
if (this._unmounted) return;
|
||||||
if (this._unmounted) { return; }
|
|
||||||
this.setState({
|
this.setState({
|
||||||
errorString: error.toString(),
|
errorString: error.toString(),
|
||||||
busy: false,
|
busy: false,
|
||||||
});
|
});
|
||||||
},
|
}
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount() {
|
public componentWillUnmount(): void {
|
||||||
this._unmounted = true;
|
this._unmounted = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
_onValueChanged(value, shouldSubmit) {
|
private onValueChanged = (value: string, shouldSubmit: boolean): void => {
|
||||||
if (!shouldSubmit) {
|
if (!shouldSubmit) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -100,24 +126,22 @@ export default class EditableTextContainer extends React.Component {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
render() {
|
public render(): JSX.Element {
|
||||||
if (this.state.busy) {
|
if (this.state.busy) {
|
||||||
const Loader = sdk.getComponent("elements.Spinner");
|
|
||||||
return (
|
return (
|
||||||
<Loader />
|
<Spinner />
|
||||||
);
|
);
|
||||||
} else if (this.state.errorString) {
|
} else if (this.state.errorString) {
|
||||||
return (
|
return (
|
||||||
<div className="error">{ this.state.errorString }</div>
|
<div className="error">{ this.state.errorString }</div>
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
const EditableText = sdk.getComponent('elements.EditableText');
|
|
||||||
return (
|
return (
|
||||||
<EditableText initialValue={this.state.value}
|
<EditableText initialValue={this.state.value}
|
||||||
placeholder={this.props.placeholder}
|
placeholder={this.props.placeholder}
|
||||||
onValueChanged={this._onValueChanged}
|
onValueChanged={this.onValueChanged}
|
||||||
blurToSubmit={this.props.blurToSubmit}
|
blurToSubmit={this.props.blurToSubmit}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
@ -125,28 +149,3 @@ export default class EditableTextContainer extends React.Component {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EditableTextContainer.propTypes = {
|
|
||||||
/* callback to retrieve the initial value. */
|
|
||||||
getInitialValue: PropTypes.func,
|
|
||||||
|
|
||||||
/* initial value; used if getInitialValue is not given */
|
|
||||||
initialValue: PropTypes.string,
|
|
||||||
|
|
||||||
/* placeholder text to use when the value is empty (and not being
|
|
||||||
* edited) */
|
|
||||||
placeholder: PropTypes.string,
|
|
||||||
|
|
||||||
/* callback to update the value. Called with a single argument: the new
|
|
||||||
* value. */
|
|
||||||
onSubmit: PropTypes.func,
|
|
||||||
|
|
||||||
/* should the input submit when focus is lost? */
|
|
||||||
blurToSubmit: PropTypes.bool,
|
|
||||||
};
|
|
||||||
|
|
||||||
EditableTextContainer.defaultProps = {
|
|
||||||
initialValue: "",
|
|
||||||
placeholder: "",
|
|
||||||
blurToSubmit: false,
|
|
||||||
onSubmit: function(v) {return Promise.resolve(); },
|
|
||||||
};
|
|
Loading…
Reference in a new issue