瀏覽代碼

feat(native-participants-pane) removed mock data

master
Calin Chitu 4 年之前
父節點
當前提交
14a5c45fa3

+ 2
- 2
react/features/participants-pane/components/native/ContextMenuLobbyParticipantReject.js 查看文件

39
                 <Avatar
39
                 <Avatar
40
                     className = 'participant-avatar'
40
                     className = 'participant-avatar'
41
                     participantId = { p.id }
41
                     participantId = { p.id }
42
-                    size = { 24 } />
42
+                    size = { 20 } />
43
                 <View style = { styles.contextMenuItemText }>
43
                 <View style = { styles.contextMenuItemText }>
44
                     <Text style = { styles.contextMenuItemName }>
44
                     <Text style = { styles.contextMenuItemName }>
45
                         { displayName }
45
                         { displayName }
51
                 onPress = { reject }
51
                 onPress = { reject }
52
                 style = { styles.contextMenuItem }>
52
                 style = { styles.contextMenuItem }>
53
                 <Icon
53
                 <Icon
54
-                    size = { 24 }
54
+                    size = { 20 }
55
                     src = { IconClose }
55
                     src = { IconClose }
56
                     style = { styles.contextMenuItemIcon } />
56
                     style = { styles.contextMenuItemIcon } />
57
                 <Text style = { styles.contextMenuItemText }>{ t('lobby.reject') }</Text>
57
                 <Text style = { styles.contextMenuItemText }>{ t('lobby.reject') }</Text>

+ 7
- 7
react/features/participants-pane/components/native/ContextMenuMeetingParticipantDetails.js 查看文件

81
                 <Avatar
81
                 <Avatar
82
                     className = 'participant-avatar'
82
                     className = 'participant-avatar'
83
                     participantId = { p.id }
83
                     participantId = { p.id }
84
-                    size = { 24 } />
84
+                    size = { 20 } />
85
                 <View style = { styles.contextMenuItemText }>
85
                 <View style = { styles.contextMenuItemText }>
86
                     <Text style = { styles.contextMenuItemName }>
86
                     <Text style = { styles.contextMenuItemName }>
87
                         { displayName }
87
                         { displayName }
95
                     onPress = { muteAudio }
95
                     onPress = { muteAudio }
96
                     style = { styles.contextMenuItem }>
96
                     style = { styles.contextMenuItem }>
97
                     <Icon
97
                     <Icon
98
-                        size = { 24 }
98
+                        size = { 20 }
99
                         src = { IconMicrophoneEmptySlash }
99
                         src = { IconMicrophoneEmptySlash }
100
                         style = { styles.contextMenuItemIcon } />
100
                         style = { styles.contextMenuItemIcon } />
101
                     <Text style = { styles.contextMenuItemText }>
101
                     <Text style = { styles.contextMenuItemText }>
109
                     onPress = { muteEveryoneElse }
109
                     onPress = { muteEveryoneElse }
110
                     style = { styles.contextMenuItem }>
110
                     style = { styles.contextMenuItem }>
111
                     <Icon
111
                     <Icon
112
-                        size = { 24 }
112
+                        size = { 20 }
113
                         src = { IconMuteEveryoneElse }
113
                         src = { IconMuteEveryoneElse }
114
                         style = { styles.contextMenuItemIcon } />
114
                         style = { styles.contextMenuItemIcon } />
115
                     <Text style = { styles.contextMenuItemText }>
115
                     <Text style = { styles.contextMenuItemText }>
125
                         onPress = { muteVideo }
125
                         onPress = { muteVideo }
126
                         style = { styles.contextMenuItemSection }>
126
                         style = { styles.contextMenuItemSection }>
127
                         <Icon
127
                         <Icon
128
-                            size = { 24 }
128
+                            size = { 20 }
129
                             src = { IconVideoOff }
129
                             src = { IconVideoOff }
130
                             style = { styles.contextMenuItemIcon } />
130
                             style = { styles.contextMenuItemIcon } />
131
                         <Text style = { styles.contextMenuItemText }>
131
                         <Text style = { styles.contextMenuItemText }>
140
                     onPress = { kickRemoteParticipant }
140
                     onPress = { kickRemoteParticipant }
141
                     style = { styles.contextMenuItem }>
141
                     style = { styles.contextMenuItem }>
142
                     <Icon
142
                     <Icon
143
-                        size = { 24 }
143
+                        size = { 20 }
144
                         src = { IconCloseCircle }
144
                         src = { IconCloseCircle }
145
                         style = { styles.contextMenuItemIcon } />
145
                         style = { styles.contextMenuItemIcon } />
146
                     <Text style = { styles.contextMenuItemText }>
146
                     <Text style = { styles.contextMenuItemText }>
152
                 onPress = { sendPrivateMessage }
152
                 onPress = { sendPrivateMessage }
153
                 style = { styles.contextMenuItem }>
153
                 style = { styles.contextMenuItem }>
154
                 <Icon
154
                 <Icon
155
-                    size = { 24 }
155
+                    size = { 20 }
156
                     src = { IconMessage }
156
                     src = { IconMessage }
157
                     style = { styles.contextMenuItemIcon } />
157
                     style = { styles.contextMenuItemIcon } />
158
                 <Text style = { styles.contextMenuItemText }>
158
                 <Text style = { styles.contextMenuItemText }>
162
             <TouchableOpacity
162
             <TouchableOpacity
163
                 style = { styles.contextMenuItemSection }>
163
                 style = { styles.contextMenuItemSection }>
164
                 <Icon
164
                 <Icon
165
-                    size = { 24 }
165
+                    size = { 20 }
166
                     src = { IconConnectionActive }
166
                     src = { IconConnectionActive }
167
                     style = { styles.contextMenuItemIcon } />
167
                     style = { styles.contextMenuItemIcon } />
168
                 <Text style = { styles.contextMenuItemText }>{ t('participantsPane.actions.networkStats') }</Text>
168
                 <Text style = { styles.contextMenuItemText }>{ t('participantsPane.actions.networkStats') }</Text>

+ 2
- 2
react/features/participants-pane/components/native/ContextMenuMore.js 查看文件

45
                 onPress = { muteEveryoneVideo }
45
                 onPress = { muteEveryoneVideo }
46
                 style = { styles.contextMenuItem }>
46
                 style = { styles.contextMenuItem }>
47
                 <Icon
47
                 <Icon
48
-                    size = { 24 }
48
+                    size = { 20 }
49
                     src = { IconVideoOff } />
49
                     src = { IconVideoOff } />
50
                 <Text style = { styles.contextMenuItemText }>{t('participantsPane.actions.stopEveryonesVideo')}</Text>
50
                 <Text style = { styles.contextMenuItemText }>{t('participantsPane.actions.stopEveryonesVideo')}</Text>
51
             </TouchableOpacity>
51
             </TouchableOpacity>
52
             <TouchableOpacity
52
             <TouchableOpacity
53
                 style = { styles.contextMenuItem }>
53
                 style = { styles.contextMenuItem }>
54
                 <Icon
54
                 <Icon
55
-                    size = { 24 }
55
+                    size = { 20 }
56
                     src = { IconMicDisabledHollow }
56
                     src = { IconMicDisabledHollow }
57
                     style = { styles.contextMenuIcon } />
57
                     style = { styles.contextMenuIcon } />
58
                 <Text style = { styles.contextMenuItemText }>{t('participantsPane.actions.dontAllowUnmute')}</Text>
58
                 <Text style = { styles.contextMenuItemText }>{t('participantsPane.actions.dontAllowUnmute')}</Text>

+ 21
- 8
react/features/participants-pane/components/native/LobbyParticipantList.js 查看文件

4
 import { useTranslation } from 'react-i18next';
4
 import { useTranslation } from 'react-i18next';
5
 import { Text, View } from 'react-native';
5
 import { Text, View } from 'react-native';
6
 import { Button } from 'react-native-paper';
6
 import { Button } from 'react-native-paper';
7
-import { useDispatch } from 'react-redux';
7
+import { useDispatch, useSelector } from 'react-redux';
8
 
8
 
9
+import { getLobbyState } from '../../../lobby/functions';
9
 import { admitAllKnockingParticipants } from '../../../video-menu/actions.any';
10
 import { admitAllKnockingParticipants } from '../../../video-menu/actions.any';
10
 
11
 
11
 import { LobbyParticipantItem } from './LobbyParticipantItem';
12
 import { LobbyParticipantItem } from './LobbyParticipantItem';
12
-import { participants } from './participants';
13
 import styles from './styles';
13
 import styles from './styles';
14
 
14
 
15
 export const LobbyParticipantList = () => {
15
 export const LobbyParticipantList = () => {
16
+    const {
17
+        lobbyEnabled,
18
+        knockingParticipants: participants
19
+    } = useSelector(getLobbyState);
20
+
16
     const dispatch = useDispatch();
21
     const dispatch = useDispatch();
17
-    const admitAll = useCallback(() => dispatch(admitAllKnockingParticipants()), [ dispatch ]);
22
+    const admitAll = useCallback(() =>
23
+        dispatch(admitAllKnockingParticipants(participants, lobbyEnabled)),
24
+        [ dispatch ]);
18
     const { t } = useTranslation();
25
     const { t } = useTranslation();
19
 
26
 
27
+    if (!lobbyEnabled || !participants.length) {
28
+        return null;
29
+    }
30
+
20
     return (
31
     return (
21
         <View style = { styles.lobbyList }>
32
         <View style = { styles.lobbyList }>
22
             <View style = { styles.lobbyListDetails } >
33
             <View style = { styles.lobbyListDetails } >
33
                     {t('lobby.admitAll')}
44
                     {t('lobby.admitAll')}
34
                 </Button>
45
                 </Button>
35
             </View>
46
             </View>
36
-            { participants.map(p => (
37
-                <LobbyParticipantItem
38
-                    key = { p.id }
39
-                    participant = { p } />)
40
-            )}
47
+            {
48
+                participants.map(p => (
49
+                    <LobbyParticipantItem
50
+                        key = { p.id }
51
+                        participant = { p } />)
52
+                )
53
+            }
41
         </View>
54
         </View>
42
     );
55
     );
43
 };
56
 };

+ 30
- 24
react/features/participants-pane/components/native/MeetingParticipantList.js 查看文件

4
 import { useTranslation } from 'react-i18next';
4
 import { useTranslation } from 'react-i18next';
5
 import { Text, View } from 'react-native';
5
 import { Text, View } from 'react-native';
6
 import { Button } from 'react-native-paper';
6
 import { Button } from 'react-native-paper';
7
-import { useDispatch } from 'react-redux';
7
+import { useDispatch, useSelector, useStore } from 'react-redux';
8
 
8
 
9
-import { createToolbarEvent, sendAnalytics } from '../../../analytics';
10
 import { Icon, IconInviteMore } from '../../../base/icons';
9
 import { Icon, IconInviteMore } from '../../../base/icons';
10
+import { getParticipants } from '../../../base/participants';
11
 import { doInvitePeople } from '../../../invite/actions.native';
11
 import { doInvitePeople } from '../../../invite/actions.native';
12
+import { shouldRenderInviteButton } from '../../functions';
12
 
13
 
13
 import { MeetingParticipantItem } from './MeetingParticipantItem';
14
 import { MeetingParticipantItem } from './MeetingParticipantItem';
14
-import { participants } from './participants';
15
 import styles from './styles';
15
 import styles from './styles';
16
 
16
 
17
 export const MeetingParticipantList = () => {
17
 export const MeetingParticipantList = () => {
18
     const dispatch = useDispatch();
18
     const dispatch = useDispatch();
19
-    const onInvite = useCallback(() => {
20
-        sendAnalytics(createToolbarEvent('invite'));
21
-        dispatch(doInvitePeople());
22
-    }, [ dispatch ]);
19
+    const onInvite = useCallback(() => dispatch(doInvitePeople()), [ dispatch ]);
20
+    const showInviteButton = useSelector(shouldRenderInviteButton);
21
+    const store = useStore();
22
+    const state = store.getState();
23
+    const participants = getParticipants(state);
23
     const { t } = useTranslation();
24
     const { t } = useTranslation();
24
 
25
 
25
     return (
26
     return (
28
                 {t('participantsPane.headings.participantsList',
29
                 {t('participantsPane.headings.participantsList',
29
                     { count: participants.length })}
30
                     { count: participants.length })}
30
             </Text>
31
             </Text>
31
-            <Button
32
-                children = { t('participantsPane.actions.invite') }
33
-                /* eslint-disable-next-line react/jsx-no-bind */
34
-                icon = { () =>
35
-                    (<Icon
36
-                        size = { 24 }
37
-                        src = { IconInviteMore } />)
38
-                }
39
-                labelStyle = { styles.inviteLabel }
40
-                mode = 'contained'
41
-                onPress = { onInvite }
42
-                style = { styles.inviteButton } />
43
-            { participants.map(p => (
44
-                <MeetingParticipantItem
45
-                    key = { p.id }
46
-                    participant = { p } />)
47
-            )}
32
+            {
33
+                showInviteButton
34
+                && <Button
35
+                    children = { t('participantsPane.actions.invite') }
36
+                    /* eslint-disable-next-line react/jsx-no-bind */
37
+                    icon = { () =>
38
+                        (<Icon
39
+                            size = { 24 }
40
+                            src = { IconInviteMore } />)
41
+                    }
42
+                    labelStyle = { styles.inviteLabel }
43
+                    mode = 'contained'
44
+                    onPress = { onInvite }
45
+                    style = { styles.inviteButton } />
46
+            }
47
+            {
48
+                participants.map(p => (
49
+                    <MeetingParticipantItem
50
+                        key = { p.id }
51
+                        participant = { p } />)
52
+                )
53
+            }
48
         </View>
54
         </View>
49
     );
55
     );
50
 };
56
 };

+ 7
- 4
react/features/participants-pane/components/native/ParticipantItem.js 查看文件

67
  * @returns {React$Element<any>}
67
  * @returns {React$Element<any>}
68
  */
68
  */
69
 function ParticipantItem({
69
 function ParticipantItem({
70
-    audioMuteState = MediaState.None,
71
     children,
70
     children,
72
     isKnockingParticipant,
71
     isKnockingParticipant,
73
     name,
72
     name,
74
     onPress,
73
     onPress,
75
     participant: p,
74
     participant: p,
75
+    audioMuteState = MediaState.None,
76
     videoMuteState = MediaState.None
76
     videoMuteState = MediaState.None
77
 }: Props) {
77
 }: Props) {
78
 
78
 
96
                     { p.local ? <Text style = { styles.isLocal }>({t('chat.you')})</Text> : null }
96
                     { p.local ? <Text style = { styles.isLocal }>({t('chat.you')})</Text> : null }
97
                 </View>
97
                 </View>
98
                 {
98
                 {
99
-                    !isKnockingParticipant && <>
100
-                        {p.raisedHand && <RaisedHandIndicator />}
99
+                    !isKnockingParticipant
100
+                    && <>
101
+                        {
102
+                            p.raisedHand && <RaisedHandIndicator />
103
+                        }
101
                         <View style = { styles.participantStatesContainer }>
104
                         <View style = { styles.participantStatesContainer }>
102
                             <View style = { styles.participantStateVideo }>{VideoStateIcons[videoMuteState]}</View>
105
                             <View style = { styles.participantStateVideo }>{VideoStateIcons[videoMuteState]}</View>
103
                             <View>{AudioStateIcons[audioMuteState]}</View>
106
                             <View>{AudioStateIcons[audioMuteState]}</View>
105
                     </>
108
                     </>
106
                 }
109
                 }
107
             </TouchableOpacity>
110
             </TouchableOpacity>
108
-            { children }
111
+            { !p.local && children }
109
         </View>
112
         </View>
110
     );
113
     );
111
 }
114
 }

+ 27
- 22
react/features/participants-pane/components/native/ParticipantsPane.js 查看文件

4
 import { useTranslation } from 'react-i18next';
4
 import { useTranslation } from 'react-i18next';
5
 import { ScrollView, View } from 'react-native';
5
 import { ScrollView, View } from 'react-native';
6
 import { Button } from 'react-native-paper';
6
 import { Button } from 'react-native-paper';
7
-import { useDispatch } from 'react-redux';
7
+import { useDispatch, useSelector } from 'react-redux';
8
 
8
 
9
 import { hideDialog, openDialog } from '../../../base/dialog';
9
 import { hideDialog, openDialog } from '../../../base/dialog';
10
 import { Icon, IconClose, IconHorizontalPoints } from '../../../base/icons';
10
 import { Icon, IconClose, IconHorizontalPoints } from '../../../base/icons';
11
 import { JitsiModal } from '../../../base/modal';
11
 import { JitsiModal } from '../../../base/modal';
12
+import { isLocalParticipantModerator } from '../../../base/participants';
12
 import MuteEveryoneDialog
13
 import MuteEveryoneDialog
13
     from '../../../video-menu/components/native/MuteEveryoneDialog';
14
     from '../../../video-menu/components/native/MuteEveryoneDialog';
14
 
15
 
24
  */
25
  */
25
 export function ParticipantsPane() {
26
 export function ParticipantsPane() {
26
     const dispatch = useDispatch();
27
     const dispatch = useDispatch();
27
-    const openMoreMenu = useCallback(() => dispatch(openDialog(ContextMenuMore)));
28
+    const openMoreMenu = useCallback(() => dispatch(openDialog(ContextMenuMore)), [ dispatch ]);
28
     const closePane = useCallback(() => dispatch(hideDialog()), [ dispatch ]);
29
     const closePane = useCallback(() => dispatch(hideDialog()), [ dispatch ]);
30
+    const isLocalModerator = useSelector(isLocalParticipantModerator);
29
     const muteAll = useCallback(() => dispatch(openDialog(MuteEveryoneDialog)),
31
     const muteAll = useCallback(() => dispatch(openDialog(MuteEveryoneDialog)),
30
         [ dispatch ]);
32
         [ dispatch ]);
31
     const { t } = useTranslation();
33
     const { t } = useTranslation();
51
                 <LobbyParticipantList />
53
                 <LobbyParticipantList />
52
                 <MeetingParticipantList />
54
                 <MeetingParticipantList />
53
             </ScrollView>
55
             </ScrollView>
54
-            <View style = { styles.footer }>
55
-                <Button
56
-                    children = { t('participantsPane.actions.muteAll') }
57
-                    contentStyle = { styles.muteAllContent }
58
-                    labelStyle = { styles.muteAllLabel }
59
-                    mode = 'contained'
60
-                    onPress = { muteAll }
61
-                    style = { styles.muteAllButton } />
62
-                <Button
63
-                    contentStyle = { styles.moreIcon }
64
-                    /* eslint-disable-next-line react/jsx-no-bind */
65
-                    icon = { () =>
66
-                        (<Icon
67
-                            size = { 24 }
68
-                            src = { IconHorizontalPoints } />)
69
-                    }
70
-                    mode = 'contained'
71
-                    onPress = { openMoreMenu }
72
-                    style = { styles.moreButton } />
73
-            </View>
56
+            {
57
+                isLocalModerator
58
+                && <View style = { styles.footer }>
59
+                    <Button
60
+                        children = { t('participantsPane.actions.muteAll') }
61
+                        contentStyle = { styles.muteAllContent }
62
+                        labelStyle = { styles.muteAllLabel }
63
+                        mode = 'contained'
64
+                        onPress = { muteAll }
65
+                        style = { styles.muteAllButton } />
66
+                    <Button
67
+                        contentStyle = { styles.moreIcon }
68
+                        /* eslint-disable-next-line react/jsx-no-bind */
69
+                        icon = { () =>
70
+                            (<Icon
71
+                                size = { 24 }
72
+                                src = { IconHorizontalPoints } />)
73
+                        }
74
+                        mode = 'contained'
75
+                        onPress = { openMoreMenu }
76
+                        style = { styles.moreButton } />
77
+                </View>
78
+            }
74
         </JitsiModal>
79
         </JitsiModal>
75
     );
80
     );
76
 }
81
 }

+ 5
- 0
react/features/participants-pane/components/native/ParticipantsPaneButton.js 查看文件

5
 import { openDialog } from '../../../base/dialog';
5
 import { openDialog } from '../../../base/dialog';
6
 import { translate } from '../../../base/i18n';
6
 import { translate } from '../../../base/i18n';
7
 import { IconParticipants } from '../../../base/icons';
7
 import { IconParticipants } from '../../../base/icons';
8
+import { setActiveModalId } from '../../../base/modal';
8
 import { connect } from '../../../base/redux';
9
 import { connect } from '../../../base/redux';
9
 import { AbstractButton, type AbstractButtonProps } from '../../../base/toolbox/components';
10
 import { AbstractButton, type AbstractButtonProps } from '../../../base/toolbox/components';
11
+import {
12
+    PARTICIPANTS_PANE_ID
13
+} from '../../../invite/constants';
10
 
14
 
11
 import { ParticipantsPane } from './';
15
 import { ParticipantsPane } from './';
12
 
16
 
35
      */
39
      */
36
     _handleClick() {
40
     _handleClick() {
37
         this.props.dispatch(openDialog(ParticipantsPane));
41
         this.props.dispatch(openDialog(ParticipantsPane));
42
+        this.props.dispatch(setActiveModalId(PARTICIPANTS_PANE_ID));
38
     }
43
     }
39
 }
44
 }
40
 
45
 

+ 2
- 2
react/features/toolbox/components/native/OverflowMenuButton.js 查看文件

3
 import { openDialog } from '../../../base/dialog';
3
 import { openDialog } from '../../../base/dialog';
4
 import { getFeatureFlag, OVERFLOW_MENU_ENABLED } from '../../../base/flags';
4
 import { getFeatureFlag, OVERFLOW_MENU_ENABLED } from '../../../base/flags';
5
 import { translate } from '../../../base/i18n';
5
 import { translate } from '../../../base/i18n';
6
-import { IconMenuThumb } from '../../../base/icons';
6
+import { IconHorizontalPoints } from '../../../base/icons';
7
 import { connect } from '../../../base/redux';
7
 import { connect } from '../../../base/redux';
8
 import { AbstractButton, type AbstractButtonProps } from '../../../base/toolbox/components';
8
 import { AbstractButton, type AbstractButtonProps } from '../../../base/toolbox/components';
9
 
9
 
25
  */
25
  */
26
 class OverflowMenuButton extends AbstractButton<Props, *> {
26
 class OverflowMenuButton extends AbstractButton<Props, *> {
27
     accessibilityLabel = 'toolbar.accessibilityLabel.moreActions';
27
     accessibilityLabel = 'toolbar.accessibilityLabel.moreActions';
28
-    icon = IconMenuThumb;
28
+    icon = IconHorizontalPoints;
29
     label = 'toolbar.moreActions';
29
     label = 'toolbar.moreActions';
30
 
30
 
31
     /**
31
     /**

Loading…
取消
儲存