mattermost-mobile/app/screens/interactive_dialog/dialog_element.js
Jesse Hallam e127951230 MM-21632: fix toggling interactive dialog boolean (#3793)
* MM-21632: fix toggling interactive dialog boolean

My fix for MM-17519 broke the /rendering/ of the boolean toggle, but not
the underlying interactive dialog state (and the thrust of the original
issue).

* MM-21683: fix handling of boolean defaults

* unit tests
2020-01-20 21:29:43 +08:00

175 lines
5.5 KiB
JavaScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React, {PureComponent} from 'react';
import PropTypes from 'prop-types';
import BoolSetting from 'app/components/widgets/settings/bool_setting';
import TextSetting from 'app/components/widgets/settings/text_setting';
import AutocompleteSelector from 'app/components/autocomplete_selector';
import RadioSetting from 'app/components/widgets/settings/radio_setting';
const TEXT_DEFAULT_MAX_LENGTH = 150;
const TEXTAREA_DEFAULT_MAX_LENGTH = 3000;
export default class DialogElement extends PureComponent {
static propTypes = {
displayName: PropTypes.string.isRequired,
name: PropTypes.string.isRequired,
type: PropTypes.string.isRequired,
subtype: PropTypes.string,
placeholder: PropTypes.string,
helpText: PropTypes.string,
errorText: PropTypes.node,
maxLength: PropTypes.number,
dataSource: PropTypes.string,
optional: PropTypes.bool,
options: PropTypes.arrayOf(PropTypes.object),
value: PropTypes.any,
onChange: PropTypes.func,
theme: PropTypes.object,
isLandscape: PropTypes.bool.isRequired,
};
constructor(props) {
super(props);
this.state = {
selected: null,
};
}
onChange = (name, value) => {
const {type, subtype, onChange} = this.props;
let newValue = value;
if (type === 'text' && subtype === 'number') {
newValue = parseInt(value, 10);
}
onChange(name, newValue);
}
handleAutocompleteSelect = (selected) => {
if (!selected) {
return;
}
this.setState({selected});
const {name, onChange} = this.props;
onChange(name, selected.value);
}
render() {
const {
name,
type,
subtype,
displayName,
value,
placeholder,
helpText,
errorText,
optional,
theme,
dataSource,
options,
isLandscape,
} = this.props;
let {maxLength} = this.props;
if (type === 'text' || type === 'textarea') {
let keyboardType = 'default';
let multiline = false;
let secureTextEntry = false;
if (type === 'text') {
maxLength = maxLength || TEXT_DEFAULT_MAX_LENGTH;
if (subtype === 'email') {
keyboardType = 'email-address';
} else if (subtype === 'number') {
keyboardType = 'numeric';
} else if (subtype === 'tel') {
keyboardType = 'phone-pad';
} else if (subtype === 'url') {
keyboardType = 'url';
} else if (subtype === 'password') {
secureTextEntry = true;
}
} else {
multiline = true;
maxLength = maxLength || TEXTAREA_DEFAULT_MAX_LENGTH;
}
return (
<TextSetting
id={name}
label={displayName}
maxLength={maxLength}
value={String(value || '')}
placeholder={placeholder}
helpText={helpText}
errorText={errorText}
onChange={this.onChange}
optional={optional}
showRequiredAsterisk={true}
resizable={false}
theme={theme}
multiline={multiline}
keyboardType={keyboardType}
secureTextEntry={secureTextEntry}
isLandscape={isLandscape}
/>
);
} else if (type === 'select') {
return (
<AutocompleteSelector
id={name}
label={displayName}
dataSource={dataSource}
options={options}
optional={optional}
onSelected={this.handleAutocompleteSelect}
helpText={helpText}
errorText={errorText}
placeholder={placeholder}
showRequiredAsterisk={true}
selected={this.state.selected}
roundedBorders={false}
isLandscape={isLandscape}
/>
);
} else if (type === 'radio') {
return (
<RadioSetting
id={name}
label={displayName}
helpText={helpText}
errorText={errorText}
options={options}
theme={theme}
default={value}
onChange={this.onChange}
isLandscape={isLandscape}
/>
);
} else if (type === 'bool') {
return (
<BoolSetting
id={name}
label={displayName}
value={Boolean(value)}
placeholder={placeholder}
helpText={helpText}
errorText={errorText}
optional={optional}
theme={theme}
onChange={this.onChange}
isLandscape={isLandscape}
/>
);
}
return null;
}
}