瀏覽代碼

feat(profile-tab) Update Profile tab in Settings Dialog (#12992)

Implement redesign
Move some options from More to this tab
factor2
Robert Pintilii 2 年之前
父節點
當前提交
b1a71d55d7
No account linked to committer's email address

+ 2
- 2
lang/main.json 查看文件

@@ -886,9 +886,9 @@
886 886
     },
887 887
     "profile": {
888 888
         "avatar": "avatar",
889
-        "setDisplayNameLabel": "Set your display name",
889
+        "setDisplayNameLabel": "Name",
890 890
         "setEmailInput": "Enter email",
891
-        "setEmailLabel": "Set your gravatar email",
891
+        "setEmailLabel": "Gravatar email",
892 892
         "title": "Profile"
893 893
     },
894 894
     "raisedHand": "Would like to speak",

+ 8
- 8
react/features/settings/actions.ts 查看文件

@@ -107,20 +107,12 @@ export function submitMoreTab(newState: any) {
107 107
             }));
108 108
         }
109 109
 
110
-        if (newState.currentLanguage !== currentState.currentLanguage) {
111
-            i18next.changeLanguage(newState.currentLanguage);
112
-        }
113
-
114 110
         if (newState.currentFramerate !== currentState.currentFramerate) {
115 111
             const frameRate = parseInt(newState.currentFramerate, 10);
116 112
 
117 113
             dispatch(setScreenshareFramerate(frameRate));
118 114
         }
119 115
 
120
-        if (newState.hideSelfView !== currentState.hideSelfView) {
121
-            dispatch(updateSettings({ disableSelfView: newState.hideSelfView }));
122
-        }
123
-
124 116
         if (newState.maxStageParticipants !== currentState.maxStageParticipants) {
125 117
             dispatch(updateSettings({ maxStageParticipants: Number(newState.maxStageParticipants) }));
126 118
         }
@@ -174,6 +166,14 @@ export function submitProfileTab(newState: any) {
174 166
         if (newState.email !== currentState.email) {
175 167
             APP.conference.changeLocalEmail(newState.email);
176 168
         }
169
+
170
+        if (newState.hideSelfView !== currentState.hideSelfView) {
171
+            dispatch(updateSettings({ disableSelfView: newState.hideSelfView }));
172
+        }
173
+
174
+        if (newState.currentLanguage !== currentState.currentLanguage) {
175
+            i18next.changeLanguage(newState.currentLanguage);
176
+        }
177 177
     };
178 178
 }
179 179
 

+ 1
- 118
react/features/settings/components/web/MoreTab.tsx 查看文件

@@ -22,22 +22,11 @@ export type Props = AbstractDialogTabProps & WithTranslation & {
22 22
      */
23 23
     currentFramerate: string;
24 24
 
25
-    /**
26
-     * The currently selected language to display in the language select
27
-     * dropdown.
28
-     */
29
-    currentLanguage: string;
30
-
31 25
     /**
32 26
      * All available desktop capture frame rates.
33 27
      */
34 28
     desktopShareFramerates: Array<number>;
35 29
 
36
-    /**
37
-     * Whether to show hide self view setting.
38
-     */
39
-    disableHideSelfView: boolean;
40
-
41 30
     /**
42 31
      * The types of enabled notifications that can be configured and their specific visibility.
43 32
      */
@@ -48,26 +37,11 @@ export type Props = AbstractDialogTabProps & WithTranslation & {
48 37
      */
49 38
     followMeActive: boolean;
50 39
 
51
-    /**
52
-     * Whether or not to hide self-view screen.
53
-     */
54
-    hideSelfView: boolean;
55
-
56
-    /**
57
-     * All available languages to display in the language select dropdown.
58
-     */
59
-    languages: Array<string>;
60
-
61 40
     /**
62 41
      * The number of max participants to display on stage.
63 42
      */
64 43
     maxStageParticipants: number;
65 44
 
66
-    /**
67
-     * Whether or not to display the language select dropdown.
68
-     */
69
-    showLanguageSettings: boolean;
70
-
71 45
     /**
72 46
      * Whether or not to display moderator-only settings.
73 47
      */
@@ -116,11 +90,9 @@ class MoreTab extends AbstractDialogTab<Props, any> {
116 90
 
117 91
         // Bind event handler so it is only bound once for every instance.
118 92
         this._onFramerateItemSelect = this._onFramerateItemSelect.bind(this);
119
-        this._onLanguageItemSelect = this._onLanguageItemSelect.bind(this);
120 93
         this._onEnabledNotificationsChanged = this._onEnabledNotificationsChanged.bind(this);
121 94
         this._onShowPrejoinPageChanged = this._onShowPrejoinPageChanged.bind(this);
122 95
         this._onKeyboardShortcutEnableChanged = this._onKeyboardShortcutEnableChanged.bind(this);
123
-        this._onHideSelfViewChanged = this._onHideSelfViewChanged.bind(this);
124 96
         this._renderMaxStageParticipantsSelect = this._renderMaxStageParticipantsSelect.bind(this);
125 97
         this._onMaxStageParticipantsSelect = this._onMaxStageParticipantsSelect.bind(this);
126 98
     }
@@ -159,19 +131,6 @@ class MoreTab extends AbstractDialogTab<Props, any> {
159 131
         super._onChange({ currentFramerate: frameRate });
160 132
     }
161 133
 
162
-    /**
163
-     * Callback invoked to select a language from select dropdown.
164
-     *
165
-     * @param {Object} e - The key event to handle.
166
-     *
167
-     * @returns {void}
168
-     */
169
-    _onLanguageItemSelect(e: React.ChangeEvent<HTMLSelectElement>) {
170
-        const language = e.target.value;
171
-
172
-        super._onChange({ currentLanguage: language });
173
-    }
174
-
175 134
     /**
176 135
      * Callback invoked to select if the lobby
177 136
      * should be shown.
@@ -215,17 +174,6 @@ class MoreTab extends AbstractDialogTab<Props, any> {
215 174
         super._onChange({ keyboardShortcutEnable: checked });
216 175
     }
217 176
 
218
-    /**
219
-     * Callback invoked to select if hide self view should be enabled.
220
-     *
221
-     * @param {Object} e - The key event to handle.
222
-     *
223
-     * @returns {void}
224
-     */
225
-    _onHideSelfViewChanged({ target: { checked } }: React.ChangeEvent<HTMLInputElement>) {
226
-        super._onChange({ hideSelfView: checked });
227
-    }
228
-
229 177
     /**
230 178
      * Callback invoked to select a max number of stage participants from the select dropdown.
231 179
      *
@@ -296,67 +244,6 @@ class MoreTab extends AbstractDialogTab<Props, any> {
296 244
         );
297 245
     }
298 246
 
299
-    /**
300
-     * Returns the React Element for self view setting.
301
-     *
302
-     * @private
303
-     * @returns {ReactElement}
304
-     */
305
-    _renderSelfViewCheckbox() {
306
-        const { hideSelfView, t } = this.props;
307
-
308
-        return (
309
-            <div
310
-                className = 'settings-sub-pane-element'
311
-                key = 'selfview'>
312
-                <span className = 'checkbox-label'>
313
-                    { t('settings.selfView') }
314
-                </span>
315
-                <Checkbox
316
-                    checked = { hideSelfView }
317
-                    label = { t('videothumbnail.hideSelfView') }
318
-                    name = 'hide-self-view'
319
-                    onChange = { this._onHideSelfViewChanged } />
320
-            </div>
321
-        );
322
-    }
323
-
324
-    /**
325
-     * Returns the menu item for changing displayed language.
326
-     *
327
-     * @private
328
-     * @returns {ReactElement}
329
-     */
330
-    _renderLanguageSelect() {
331
-        const {
332
-            currentLanguage,
333
-            languages,
334
-            t
335
-        } = this.props;
336
-
337
-        const languageItems
338
-            = languages.map((language: string) => {
339
-                return {
340
-                    value: language,
341
-                    label: t(`languages:${language}`)
342
-                };
343
-            });
344
-
345
-        return (
346
-            <div
347
-                className = 'settings-sub-pane-element'
348
-                key = 'language'>
349
-                <div className = 'dropdown-menu'>
350
-                    <Select
351
-                        label = { t('settings.language') }
352
-                        onChange = { this._onLanguageItemSelect }
353
-                        options = { languageItems }
354
-                        value = { currentLanguage } />
355
-                </div>
356
-            </div>
357
-        );
358
-    }
359
-
360 247
     /**
361 248
      * Returns the React Element for modifying prejoin screen settings.
362 249
      *
@@ -454,13 +341,10 @@ class MoreTab extends AbstractDialogTab<Props, any> {
454 341
      * @returns {ReactElement}
455 342
      */
456 343
     _renderSettingsRight() {
457
-        const { showLanguageSettings } = this.props;
458
-
459 344
         return (
460 345
             <div
461 346
                 className = 'settings-sub-pane right'
462 347
                 key = 'settings-sub-pane-right'>
463
-                { showLanguageSettings && this._renderLanguageSelect() }
464 348
                 { this._renderFramerateSelect() }
465 349
                 { this._renderMaxStageParticipantsSelect() }
466 350
             </div>
@@ -473,7 +357,7 @@ class MoreTab extends AbstractDialogTab<Props, any> {
473 357
      * @returns {ReactElement}
474 358
      */
475 359
     _renderSettingsLeft() {
476
-        const { disableHideSelfView, showNotificationsSettings, showPrejoinSettings } = this.props;
360
+        const { showNotificationsSettings, showPrejoinSettings } = this.props;
477 361
 
478 362
         return (
479 363
             <div
@@ -482,7 +366,6 @@ class MoreTab extends AbstractDialogTab<Props, any> {
482 366
                 { showPrejoinSettings && this._renderPrejoinScreenSettings() }
483 367
                 { showNotificationsSettings && this._renderNotificationsSettings() }
484 368
                 { this._renderKeyboardShortcutCheckbox() }
485
-                { !disableHideSelfView && this._renderSelfViewCheckbox() }
486 369
             </div>
487 370
         );
488 371
     }

+ 167
- 40
react/features/settings/components/web/ProfileTab.tsx 查看文件

@@ -1,4 +1,5 @@
1
-/* eslint-disable lines-around-comment */
1
+import { Theme } from '@mui/material';
2
+import { withStyles } from '@mui/styles';
2 3
 import React from 'react';
3 4
 import { WithTranslation } from 'react-i18next';
4 5
 
@@ -6,20 +7,22 @@ import { WithTranslation } from 'react-i18next';
6 7
 import UIEvents from '../../../../../service/UI/UIEvents';
7 8
 import { createProfilePanelButtonEvent } from '../../../analytics/AnalyticsEvents';
8 9
 import { sendAnalytics } from '../../../analytics/functions';
10
+// eslint-disable-next-line lines-around-comment
9 11
 // @ts-ignore
10
-import { AbstractDialogTab } from '../../../base/dialog';
11
-// @ts-ignore
12
-import type { Props as AbstractDialogTabProps } from '../../../base/dialog';
12
+import Avatar from '../../../base/avatar/components/Avatar';
13
+import AbstractDialogTab, {
14
+    IProps as AbstractDialogTabProps } from '../../../base/dialog/components/web/AbstractDialogTab';
13 15
 import { translate } from '../../../base/i18n/functions';
14 16
 import Button from '../../../base/ui/components/web/Button';
17
+import Checkbox from '../../../base/ui/components/web/Checkbox';
15 18
 import Input from '../../../base/ui/components/web/Input';
19
+import Select from '../../../base/ui/components/web/Select';
16 20
 import { openLogoutDialog } from '../../actions';
17
-/* eslint-enable lines-around-comment */
18 21
 
19 22
 /**
20 23
  * The type of the React {@code Component} props of {@link ProfileTab}.
21 24
  */
22
-export type Props = AbstractDialogTabProps & WithTranslation & {
25
+export interface IProps extends AbstractDialogTabProps, WithTranslation {
23 26
 
24 27
     /**
25 28
      * Whether or not server-side authentication is available.
@@ -31,6 +34,22 @@ export type Props = AbstractDialogTabProps & WithTranslation & {
31 34
      */
32 35
     authLogin: string;
33 36
 
37
+    /**
38
+     * CSS classes object.
39
+     */
40
+    classes: any;
41
+
42
+    /**
43
+     * The currently selected language to display in the language select
44
+     * dropdown.
45
+     */
46
+    currentLanguage: string;
47
+
48
+    /**
49
+     * Whether to show hide self view setting.
50
+     */
51
+    disableHideSelfView: boolean;
52
+
34 53
     /**
35 54
      * The display name to display for the local participant.
36 55
      */
@@ -46,15 +65,52 @@ export type Props = AbstractDialogTabProps & WithTranslation & {
46 65
      */
47 66
     hideEmailInSettings?: boolean;
48 67
 
68
+    /**
69
+     * Whether or not to hide self-view screen.
70
+     */
71
+    hideSelfView: boolean;
72
+
73
+    /**
74
+     * The id of the local participant.
75
+     */
76
+    id: string;
77
+
78
+    /**
79
+     * All available languages to display in the language select dropdown.
80
+     */
81
+    languages: Array<string>;
82
+
49 83
     /**
50 84
      * If the display name is read only.
51 85
      */
52 86
     readOnlyName: boolean;
53 87
 
54 88
     /**
55
-     * Invoked to obtain translated strings.
89
+     * Whether or not to display the language select dropdown.
56 90
      */
57
-    t: Function;
91
+    showLanguageSettings: boolean;
92
+}
93
+
94
+const styles = (theme: Theme) => {
95
+    return {
96
+        container: {
97
+            display: 'flex',
98
+            flexDirection: 'column' as const,
99
+            width: '100%',
100
+            padding: '0 2px'
101
+        },
102
+
103
+        avatarContainer: {
104
+            display: 'flex',
105
+            width: '100%',
106
+            justifyContent: 'center',
107
+            marginBottom: theme.spacing(4)
108
+        },
109
+
110
+        bottomMargin: {
111
+            marginBottom: theme.spacing(4)
112
+        }
113
+    };
58 114
 };
59 115
 
60 116
 /**
@@ -62,7 +118,7 @@ export type Props = AbstractDialogTabProps & WithTranslation & {
62 118
  *
63 119
  * @augments Component
64 120
  */
65
-class ProfileTab extends AbstractDialogTab<Props> {
121
+class ProfileTab extends AbstractDialogTab<IProps, any> {
66 122
     static defaultProps = {
67 123
         displayName: '',
68 124
         email: ''
@@ -71,16 +127,18 @@ class ProfileTab extends AbstractDialogTab<Props> {
71 127
     /**
72 128
      * Initializes a new {@code ConnectedSettingsDialog} instance.
73 129
      *
74
-     * @param {Props} props - The React {@code Component} props to initialize
130
+     * @param {IProps} props - The React {@code Component} props to initialize
75 131
      * the new {@code ConnectedSettingsDialog} instance with.
76 132
      */
77
-    constructor(props: Props) {
133
+    constructor(props: IProps) {
78 134
         super(props);
79 135
 
80 136
         // Bind event handlers so they are only bound once for every instance.
81 137
         this._onAuthToggle = this._onAuthToggle.bind(this);
82 138
         this._onDisplayNameChange = this._onDisplayNameChange.bind(this);
83 139
         this._onEmailChange = this._onEmailChange.bind(this);
140
+        this._onHideSelfViewChanged = this._onHideSelfViewChanged.bind(this);
141
+        this._onLanguageItemSelect = this._onLanguageItemSelect.bind(this);
84 142
     }
85 143
 
86 144
     /**
@@ -105,6 +163,62 @@ class ProfileTab extends AbstractDialogTab<Props> {
105 163
         super._onChange({ email: value });
106 164
     }
107 165
 
166
+    /**
167
+     * Callback invoked to select if hide self view should be enabled.
168
+     *
169
+     * @param {Object} e - The key event to handle.
170
+     *
171
+     * @returns {void}
172
+     */
173
+    _onHideSelfViewChanged({ target: { checked } }: React.ChangeEvent<HTMLInputElement>) {
174
+        super._onChange({ hideSelfView: checked });
175
+    }
176
+
177
+    /**
178
+     * Callback invoked to select a language from select dropdown.
179
+     *
180
+     * @param {Object} e - The key event to handle.
181
+     *
182
+     * @returns {void}
183
+     */
184
+    _onLanguageItemSelect(e: React.ChangeEvent<HTMLSelectElement>) {
185
+        const language = e.target.value;
186
+
187
+        super._onChange({ currentLanguage: language });
188
+    }
189
+
190
+    /**
191
+     * Returns the menu item for changing displayed language.
192
+     *
193
+     * @private
194
+     * @returns {ReactElement}
195
+     */
196
+    _renderLanguageSelect() {
197
+        const {
198
+            classes,
199
+            currentLanguage,
200
+            languages,
201
+            t
202
+        } = this.props;
203
+
204
+        const languageItems
205
+            = languages.map((language: string) => {
206
+                return {
207
+                    value: language,
208
+                    label: t(`languages:${language}`)
209
+                };
210
+            });
211
+
212
+        return (
213
+            <Select
214
+                className = { classes.bottomMargin }
215
+                label = { t('settings.language') }
216
+                onChange = { this._onLanguageItemSelect }
217
+                options = { languageItems }
218
+                value = { currentLanguage } />
219
+        );
220
+    }
221
+
108 222
     /**
109 223
      * Implements React's {@link Component#render()}.
110 224
      *
@@ -114,38 +228,55 @@ class ProfileTab extends AbstractDialogTab<Props> {
114 228
     render() {
115 229
         const {
116 230
             authEnabled,
231
+            classes,
232
+            disableHideSelfView,
117 233
             displayName,
118 234
             email,
119 235
             hideEmailInSettings,
236
+            hideSelfView,
237
+            id,
120 238
             readOnlyName,
121
-            t // @ts-ignore
239
+            showLanguageSettings,
240
+            t
122 241
         } = this.props;
123 242
 
124 243
         return (
125
-            <div>
126
-                <div className = 'profile-edit'>
127
-                    <div className = 'profile-edit-field'>
128
-                        <Input
129
-                            disabled = { readOnlyName }
130
-                            id = 'setDisplayName'
131
-                            label = { t('profile.setDisplayNameLabel') }
132
-                            name = 'name'
133
-                            onChange = { this._onDisplayNameChange }
134
-                            placeholder = { t('settings.name') }
135
-                            type = 'text'
136
-                            value = { displayName } />
137
-                    </div>
138
-                    {!hideEmailInSettings && <div className = 'profile-edit-field'>
139
-                        <Input
140
-                            id = 'setEmail'
141
-                            label = { t('profile.setEmailLabel') }
142
-                            name = 'email'
143
-                            onChange = { this._onEmailChange }
144
-                            placeholder = { t('profile.setEmailInput') }
145
-                            type = 'text'
146
-                            value = { email } />
147
-                    </div>}
244
+            <div className = { classes.container } >
245
+                <div className = { classes.avatarContainer }>
246
+                    <Avatar
247
+                        participantId = { id }
248
+                        size = { 60 } />
148 249
                 </div>
250
+                <Input
251
+                    className = { classes.bottomMargin }
252
+                    disabled = { readOnlyName }
253
+                    id = 'setDisplayName'
254
+                    label = { t('profile.setDisplayNameLabel') }
255
+                    name = 'name'
256
+                    onChange = { this._onDisplayNameChange }
257
+                    placeholder = { t('settings.name') }
258
+                    type = 'text'
259
+                    value = { displayName } />
260
+                {!hideEmailInSettings && <div className = 'profile-edit-field'>
261
+                    <Input
262
+                        className = { classes.bottomMargin }
263
+                        id = 'setEmail'
264
+                        label = { t('profile.setEmailLabel') }
265
+                        name = 'email'
266
+                        onChange = { this._onEmailChange }
267
+                        placeholder = { t('profile.setEmailInput') }
268
+                        type = 'text'
269
+                        value = { email } />
270
+                </div>}
271
+                {!disableHideSelfView && (
272
+                    <Checkbox
273
+                        checked = { hideSelfView }
274
+                        className = { classes.bottomMargin }
275
+                        label = { t('videothumbnail.hideSelfView') }
276
+                        name = 'hide-self-view'
277
+                        onChange = { this._onHideSelfViewChanged } />
278
+                )}
279
+                {showLanguageSettings && this._renderLanguageSelect()}
149 280
                 { authEnabled && this._renderAuth() }
150 281
             </div>
151 282
         );
@@ -159,7 +290,6 @@ class ProfileTab extends AbstractDialogTab<Props> {
159 290
      * @returns {void}
160 291
      */
161 292
     _onAuthToggle() {
162
-        // @ts-ignore
163 293
         if (this.props.authLogin) {
164 294
             sendAnalytics(createProfilePanelButtonEvent('logout.button'));
165 295
 
@@ -183,8 +313,6 @@ class ProfileTab extends AbstractDialogTab<Props> {
183 313
         const {
184 314
             authLogin,
185 315
             t
186
-
187
-            // @ts-ignore
188 316
         } = this.props;
189 317
 
190 318
         return (
@@ -206,5 +334,4 @@ class ProfileTab extends AbstractDialogTab<Props> {
206 334
     }
207 335
 }
208 336
 
209
-// @ts-ignore
210
-export default translate(ProfileTab);
337
+export default withStyles(styles)(translate(ProfileTab));

+ 1
- 18
react/features/settings/components/web/SettingsDialog.tsx 查看文件

@@ -84,10 +84,6 @@ const styles = (theme: Theme) => {
84 84
             display: 'flex',
85 85
             width: '100%',
86 86
 
87
-            '&.profile-pane': {
88
-                flexDirection: 'column'
89
-            },
90
-
91 87
             '& .auth-name': {
92 88
                 marginBottom: theme.spacing(1)
93 89
             },
@@ -130,19 +126,6 @@ const styles = (theme: Theme) => {
130 126
                 width: '100%'
131 127
             },
132 128
 
133
-            '& .profile-edit': {
134
-                display: 'flex',
135
-                width: '100%',
136
-                padding: '0 2px',
137
-                boxSizing: 'border-box'
138
-            },
139
-
140
-            '& .profile-edit-field': {
141
-                flex: 0.5,
142
-                marginRight: '20px',
143
-                marginTop: theme.spacing(3)
144
-            },
145
-
146 129
             '& .settings-sub-pane': {
147 130
                 flex: 1
148 131
             },
@@ -303,7 +286,7 @@ function _mapStateToProps(state: IReduxState, ownProps: any) {
303 286
             component: ProfileTab,
304 287
             labelKey: 'profile.title',
305 288
             props: getProfileTabProps(state),
306
-            className: `settings-pane ${classes.settingsDialog} profile-pane`,
289
+            className: `settings-pane ${classes.settingsDialog}`,
307 290
             submit: submitProfileTab,
308 291
             icon: IconUser
309 292
         });

+ 12
- 11
react/features/settings/functions.any.ts 查看文件

@@ -116,22 +116,12 @@ export function getNotificationsMap(stateful: IStateful) {
116 116
 export function getMoreTabProps(stateful: IStateful) {
117 117
     const state = toState(stateful);
118 118
     const framerate = state['features/screen-share'].captureFrameRate ?? SS_DEFAULT_FRAME_RATE;
119
-    const language = i18next.language || DEFAULT_LANGUAGE;
120
-    const configuredTabs: string[] = interfaceConfig.SETTINGS_SECTIONS || [];
121 119
     const enabledNotifications = getNotificationsMap(stateful);
122 120
     const stageFilmstripEnabled = isStageFilmstripEnabled(state);
123 121
 
124
-    // when self view is controlled by the config we hide the settings
125
-    const { disableSelfView, disableSelfViewSettings } = state['features/base/config'];
126
-
127 122
     return {
128 123
         currentFramerate: framerate,
129
-        currentLanguage: language,
130 124
         desktopShareFramerates: SS_SUPPORTED_FRAMERATES,
131
-        disableHideSelfView: disableSelfViewSettings || disableSelfView,
132
-        hideSelfView: getHideSelfView(state),
133
-        languages: LANGUAGES,
134
-        showLanguageSettings: configuredTabs.includes('language'),
135 125
         enabledNotifications,
136 126
         showNotificationsSettings: Object.keys(enabledNotifications).length > 0,
137 127
         showPrejoinPage: !state['features/base/settings'].userSelectedSkipPrejoin,
@@ -207,14 +197,25 @@ export function getProfileTabProps(stateful: IStateful) {
207 197
     } = state['features/base/conference'];
208 198
     const { hideEmailInSettings } = state['features/base/config'];
209 199
     const localParticipant = getLocalParticipant(state);
200
+    const language = i18next.language || DEFAULT_LANGUAGE;
201
+    const configuredTabs: string[] = interfaceConfig.SETTINGS_SECTIONS || [];
202
+
203
+    // when self view is controlled by the config we hide the settings
204
+    const { disableSelfView, disableSelfViewSettings } = state['features/base/config'];
210 205
 
211 206
     return {
212 207
         authEnabled: Boolean(conference && authEnabled),
213 208
         authLogin,
209
+        disableHideSelfView: disableSelfViewSettings || disableSelfView,
210
+        currentLanguage: language,
214 211
         displayName: localParticipant?.name,
215 212
         email: localParticipant?.email,
213
+        hideEmailInSettings,
214
+        hideSelfView: getHideSelfView(state),
215
+        id: localParticipant?.id,
216
+        languages: LANGUAGES,
216 217
         readOnlyName: isNameReadOnly(state),
217
-        hideEmailInSettings
218
+        showLanguageSettings: configuredTabs.includes('language')
218 219
     };
219 220
 }
220 221
 

+ 1
- 1
react/features/settings/middleware.web.ts 查看文件

@@ -22,7 +22,7 @@ MiddlewareRegistry.register(({ dispatch, getState }) => next => action => {
22 22
                 titleKey: 'notify.selfViewTitle',
23 23
                 customActionNameKey: [ 'settings.title' ],
24 24
                 customActionHandler: [ () =>
25
-                    dispatch(openSettingsDialog(SETTINGS_TABS.MORE))
25
+                    dispatch(openSettingsDialog(SETTINGS_TABS.PROFILE))
26 26
                 ]
27 27
             }, NOTIFICATION_TIMEOUT_TYPE.STICKY));
28 28
         }

+ 1
- 1
react/features/subtitles/components/LanguageSelectorDialog.web.tsx 查看文件

@@ -92,7 +92,7 @@ const LanguageSelectorDialog = ({
92 92
     }, [ _language ]);
93 93
 
94 94
     const onSourceLanguageClick = useCallback(() => {
95
-        dispatch(openSettingsDialog(SETTINGS_TABS.MORE, false));
95
+        dispatch(openSettingsDialog(SETTINGS_TABS.PROFILE, false));
96 96
     }, []);
97 97
 
98 98
     return (

Loading…
取消
儲存