diff --git a/app/components/widgets/settings/text_setting.js b/app/components/widgets/settings/text_setting.js
index 87b1dd335..772382083 100644
--- a/app/components/widgets/settings/text_setting.js
+++ b/app/components/widgets/settings/text_setting.js
@@ -44,6 +44,7 @@ export default class TextSetting extends PureComponent {
'phone-pad',
'url',
]),
+ secureTextEntry: PropTypes.bool,
};
static defaultProps = {
@@ -52,6 +53,7 @@ export default class TextSetting extends PureComponent {
multiline: false,
showRequiredAsterisk: false,
keyboardType: 'default',
+ secureTextEntry: false,
};
onChangeText = (value) => {
@@ -72,6 +74,7 @@ export default class TextSetting extends PureComponent {
value,
multiline,
showRequiredAsterisk,
+ secureTextEntry,
} = this.props;
const style = getStyleSheet(theme);
@@ -162,6 +165,7 @@ export default class TextSetting extends PureComponent {
disableFullscreenUI={true}
multiline={multiline}
keyboardType={keyboardType}
+ secureTextEntry={secureTextEntry}
/>
diff --git a/app/screens/interactive_dialog/dialog_element.js b/app/screens/interactive_dialog/dialog_element.js
index 5003c12ea..59bcf61fe 100644
--- a/app/screens/interactive_dialog/dialog_element.js
+++ b/app/screens/interactive_dialog/dialog_element.js
@@ -77,6 +77,7 @@ export default class DialogElement extends PureComponent {
if (type === 'text' || type === 'textarea') {
let keyboardType = 'default';
let multiline = false;
+ let secureTextEntry = false;
if (type === 'text') {
maxLength = maxLength || TEXT_DEFAULT_MAX_LENGTH;
@@ -88,6 +89,8 @@ export default class DialogElement extends PureComponent {
keyboardType = 'phone-pad';
} else if (subtype === 'url') {
keyboardType = 'url';
+ } else if (subtype === 'password') {
+ secureTextEntry = true;
}
} else {
multiline = true;
@@ -110,6 +113,7 @@ export default class DialogElement extends PureComponent {
theme={theme}
multiline={multiline}
keyboardType={keyboardType}
+ secureTextEntry={secureTextEntry}
/>
);
} else if (type === 'select') {
diff --git a/app/screens/interactive_dialog/dialog_element.test.js b/app/screens/interactive_dialog/dialog_element.test.js
new file mode 100644
index 000000000..cf357fbe2
--- /dev/null
+++ b/app/screens/interactive_dialog/dialog_element.test.js
@@ -0,0 +1,39 @@
+// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
+// See LICENSE.txt for license information.
+
+import React from 'react';
+import {shallow} from 'enzyme';
+
+import Preferences from 'mattermost-redux/constants/preferences';
+
+import DialogElement from './dialog_element.js';
+
+describe('DialogElement', () => {
+ const baseDialogProps = {
+ displayName: 'Testing',
+ name: 'testing',
+ type: 'text',
+ };
+ const theme = Preferences.THEMES.default;
+ test('secureTextEntry is true and multiline is false when subtype is password', () => {
+ const wrapper = shallow(
+
+ );
+ expect(wrapper.find({secureTextEntry: true}).exists()).toBe(true);
+ expect(wrapper.find({multiline: false}).exists()).toBe(true);
+ });
+ test('secureTextEntry is false when subtype is not password', () => {
+ const wrapper = shallow(
+
+ );
+ expect(wrapper.find({secureTextEntry: false}).exists()).toBe(true);
+ });
+});
\ No newline at end of file