123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- import React, { useCallback } from 'react';
- import { useTranslation } from 'react-i18next';
- import { TouchableOpacity, View, ViewStyle } from 'react-native';
- import { Divider, Text } from 'react-native-paper';
- import { useDispatch, useSelector } from 'react-redux';
-
- import { IReduxState } from '../../../app/types';
- import {
- requestDisableAudioModeration,
- requestDisableVideoModeration,
- requestEnableAudioModeration,
- requestEnableVideoModeration
- } from '../../../av-moderation/actions';
- import {
- isEnabled as isAvModerationEnabled,
- isSupported as isAvModerationSupported
- } from '../../../av-moderation/functions';
- import { getCurrentConference } from '../../../base/conference/functions';
- import { hideSheet, openDialog } from '../../../base/dialog/actions';
- import BottomSheet from '../../../base/dialog/components/native/BottomSheet';
- import Icon from '../../../base/icons/components/Icon';
- import { IconCheck, IconRaiseHand, IconVideoOff } from '../../../base/icons/svg';
- import { MEDIA_TYPE } from '../../../base/media/constants';
- import { raiseHand } from '../../../base/participants/actions';
- import { getParticipantCount, getRaiseHandsQueue, isEveryoneModerator, isLocalParticipantModerator }
- from '../../../base/participants/functions';
- import { LOWER_HAND_MESSAGE } from '../../../base/tracks/constants';
- import MuteEveryonesVideoDialog
- from '../../../video-menu/components/native/MuteEveryonesVideoDialog';
-
- import styles from './styles';
-
- export const ContextMenuMore = () => {
- const dispatch = useDispatch();
- const muteAllVideo = useCallback(() => {
- dispatch(openDialog(MuteEveryonesVideoDialog));
- dispatch(hideSheet());
- }, [ dispatch ]);
- const conference = useSelector(getCurrentConference);
- const raisedHandsQueue = useSelector(getRaiseHandsQueue);
- const moderator = useSelector(isLocalParticipantModerator);
- const lowerAllHands = useCallback(() => {
- dispatch(raiseHand(false));
- conference?.sendEndpointMessage('', { name: LOWER_HAND_MESSAGE });
- dispatch(hideSheet());
- }, [ dispatch ]);
- const { t } = useTranslation();
-
- const isModerationSupported = useSelector((state: IReduxState) => isAvModerationSupported()(state));
- const allModerators = useSelector(isEveryoneModerator);
- const participantCount = useSelector(getParticipantCount);
-
- const isAudioModerationEnabled = useSelector(isAvModerationEnabled(MEDIA_TYPE.AUDIO));
- const isVideoModerationEnabled = useSelector(isAvModerationEnabled(MEDIA_TYPE.VIDEO));
-
- const disableAudioModeration = useCallback(() => dispatch(requestDisableAudioModeration()), [ dispatch ]);
- const disableVideoModeration = useCallback(() => dispatch(requestDisableVideoModeration()), [ dispatch ]);
-
- const enableAudioModeration = useCallback(() => dispatch(requestEnableAudioModeration()), [ dispatch ]);
- const enableVideoModeration = useCallback(() => dispatch(requestEnableVideoModeration()), [ dispatch ]);
-
- return (
- <BottomSheet
- addScrollViewPadding = { false }
- showSlidingView = { true }>
- <TouchableOpacity
- onPress = { muteAllVideo }
- style = { styles.contextMenuItem as ViewStyle }>
- <Icon
- size = { 24 }
- src = { IconVideoOff } />
- <Text style = { styles.contextMenuItemText }>{t('participantsPane.actions.stopEveryonesVideo')}</Text>
- </TouchableOpacity>
- { moderator && raisedHandsQueue.length !== 0 && <TouchableOpacity
- onPress = { lowerAllHands }
- style = { styles.contextMenuItem as ViewStyle }>
- <Icon
- size = { 24 }
- src = { IconRaiseHand } />
- <Text style = { styles.contextMenuItemText }>{t('participantsPane.actions.lowerAllHands')}</Text>
- </TouchableOpacity> }
- {isModerationSupported && ((participantCount === 1 || !allModerators)) && <>
- {/* @ts-ignore */}
- <Divider style = { styles.divider } />
- <View style = { styles.contextMenuItem as ViewStyle }>
- <Text style = { styles.contextMenuItemText }>{t('participantsPane.actions.allow')}</Text>
- </View>
- {isAudioModerationEnabled
- ? <TouchableOpacity
- onPress = { disableAudioModeration }
- style = { styles.contextMenuItem as ViewStyle }>
- <Text style = { styles.contextMenuItemTextNoIcon }>
- {t('participantsPane.actions.audioModeration')}
- </Text>
- </TouchableOpacity>
- : <TouchableOpacity
- onPress = { enableAudioModeration }
- style = { styles.contextMenuItem as ViewStyle }>
- <Icon
- size = { 24 }
- src = { IconCheck } />
- <Text style = { styles.contextMenuItemText }>
- {t('participantsPane.actions.audioModeration')}
- </Text>
- </TouchableOpacity> }
- {isVideoModerationEnabled
- ? <TouchableOpacity
- onPress = { disableVideoModeration }
- style = { styles.contextMenuItem as ViewStyle }>
- <Text style = { styles.contextMenuItemTextNoIcon }>
- {t('participantsPane.actions.videoModeration')}
- </Text>
- </TouchableOpacity>
- : <TouchableOpacity
- onPress = { enableVideoModeration }
- style = { styles.contextMenuItem as ViewStyle }>
- <Icon
- size = { 24 }
- src = { IconCheck } />
- <Text style = { styles.contextMenuItemText }>
- {t('participantsPane.actions.videoModeration')}
- </Text>
- </TouchableOpacity>}
- </>}
- </BottomSheet>
- );
- };
|