diff --git a/react/features/base/testing/components/AbstractTestHint.js b/react/features/base/testing/components/AbstractTestHint.js
index 0544a1bca..183582cfe 100644
--- a/react/features/base/testing/components/AbstractTestHint.js
+++ b/react/features/base/testing/components/AbstractTestHint.js
@@ -1,5 +1,7 @@
/* @flow */
+import { isTestModeEnabled } from '../functions';
+
/**
* Describes the {@link TestHint}'s properties.
*
@@ -10,6 +12,13 @@
*/
export type TestHintProps = {
+ /**
+ * The indicator which determines whether the test mode is enabled.
+ * {@link TestHint} components are rendered only if this flag is set to
+ * {@code true}.
+ */
+ _testModeEnabled: boolean,
+
/**
* The test hint's identifier string. Must be unique in the app instance
* scope.
@@ -21,3 +30,26 @@ export type TestHintProps = {
*/
value: string
}
+
+/**
+ * Maps (parts of) the redux state to {@link TestHint}'s React {@code Component}
+ * props.
+ *
+ * @param {Object} state - The redux store/state.
+ * @private
+ * @returns {{
+ * _testModeEnabled: boolean
+ * }}
+ */
+export function _mapStateToProps(state: Object) {
+ return {
+
+ /**
+ * The indicator which determines whether the test mode is enabled.
+ *
+ * @protected
+ * @type {boolean}
+ */
+ _testModeEnabled: isTestModeEnabled(state)
+ };
+}
diff --git a/react/features/base/testing/components/TestConnectionInfo.js b/react/features/base/testing/components/TestConnectionInfo.js
index 088222f40..6d4a61b63 100644
--- a/react/features/base/testing/components/TestConnectionInfo.js
+++ b/react/features/base/testing/components/TestConnectionInfo.js
@@ -11,6 +11,7 @@ import { getLocalParticipant } from '../../participants';
import { statsEmitter } from '../../../connection-indicator';
import { TestHint } from './index';
+import { isTestModeEnabled } from '../functions';
/**
* Defines the TestConnectionInfo's properties.
@@ -209,14 +210,11 @@ function _mapStateToProps(state) {
= Boolean(state['features/base/conference'].conference);
const localParticipant = getLocalParticipant(state);
- const testingConfig = state['features/base/config'].testing;
- const testMode = Boolean(testingConfig && testingConfig.testMode);
-
return {
_conferenceConnectionState: state['features/testing'].connectionState,
_conferenceJoinedState: conferenceJoined.toString(),
_localUserId: localParticipant && localParticipant.id,
- _testMode: testMode
+ _testMode: isTestModeEnabled(state)
};
}
diff --git a/react/features/base/testing/components/TestHint.android.js b/react/features/base/testing/components/TestHint.android.js
index e1f1c59e5..7d3c02591 100644
--- a/react/features/base/testing/components/TestHint.android.js
+++ b/react/features/base/testing/components/TestHint.android.js
@@ -1,9 +1,11 @@
/* @flow */
import React, { Component } from 'react';
+import { connect } from 'react-redux';
import { Text } from 'react-native';
import type { TestHintProps } from './AbstractTestHint';
+import { _mapStateToProps } from './AbstractTestHint';
/**
* The Android version of TestHint
. It will put the identifier,
@@ -22,7 +24,7 @@ import type { TestHintProps } from './AbstractTestHint';
* the TestHint class is to be the abstraction layer which masks the problem by
* exposing id and value properties.
*/
-export default class TestHint extends Component {
+class TestHint extends Component {
/**
* Renders the test hint on Android.
@@ -30,6 +32,10 @@ export default class TestHint extends Component {
* @returns {ReactElement}
*/
render() {
+ if (!this.props._testModeEnabled) {
+ return null;
+ }
+
return (
{ this.props.value }
@@ -37,3 +43,5 @@ export default class TestHint extends Component {
);
}
}
+
+export default connect(_mapStateToProps)(TestHint);
diff --git a/react/features/base/testing/components/TestHint.ios.js b/react/features/base/testing/components/TestHint.ios.js
index b4158bec2..c7353ee20 100644
--- a/react/features/base/testing/components/TestHint.ios.js
+++ b/react/features/base/testing/components/TestHint.ios.js
@@ -1,9 +1,11 @@
/* @flow */
import React, { Component } from 'react';
+import { connect } from 'react-redux';
import { Text } from 'react-native';
import type { TestHintProps } from './AbstractTestHint';
+import { _mapStateToProps } from './AbstractTestHint';
/**
* This is the iOS version of the TestHint.
@@ -12,13 +14,17 @@ import type { TestHintProps } from './AbstractTestHint';
* files to understand what a test hint is and why different iOS and Android
* components are necessary.
*/
-export default class TestHint extends Component {
+class TestHint extends Component {
/**
* Renders the test hint on Android.
*
* @returns {ReactElement}
*/
render() {
+ if (!this.props._testModeEnabled) {
+ return null;
+ }
+
return (
{
);
}
}
+
+export default connect(_mapStateToProps)(TestHint);
diff --git a/react/features/base/testing/functions.js b/react/features/base/testing/functions.js
new file mode 100644
index 000000000..2ee2965e3
--- /dev/null
+++ b/react/features/base/testing/functions.js
@@ -0,0 +1,15 @@
+// @flow
+
+/**
+ * Indicates whether the test mode is enabled. When it's enabled
+ * {@link TestHint} and other components from the testing package will be
+ * rendered in various places across the app to help with automatic testing.
+ *
+ * @param {Object} state - The redux store state.
+ * @returns {boolean}
+ */
+export function isTestModeEnabled(state: Object): boolean {
+ const testingConfig = state['features/base/config'].testing;
+
+ return Boolean(testingConfig && testingConfig.testMode);
+}
diff --git a/react/features/base/testing/index.js b/react/features/base/testing/index.js
index daaa5d02a..65787823f 100644
--- a/react/features/base/testing/index.js
+++ b/react/features/base/testing/index.js
@@ -1,4 +1,5 @@
export * from './components';
+export * from './functions';
import './middleware';
import './reducer';