You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ContextMenuMore.tsx 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import React, { useCallback } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import { TouchableOpacity, View, ViewStyle } from 'react-native';
  4. import { Divider, Text } from 'react-native-paper';
  5. import { useDispatch, useSelector } from 'react-redux';
  6. import { IReduxState } from '../../../app/types';
  7. import {
  8. requestDisableAudioModeration,
  9. requestDisableVideoModeration,
  10. requestEnableAudioModeration,
  11. requestEnableVideoModeration
  12. } from '../../../av-moderation/actions';
  13. import {
  14. isEnabled as isAvModerationEnabled,
  15. isSupported as isAvModerationSupported
  16. } from '../../../av-moderation/functions';
  17. import { hideSheet, openDialog } from '../../../base/dialog/actions';
  18. import BottomSheet from '../../../base/dialog/components/native/BottomSheet';
  19. import Icon from '../../../base/icons/components/Icon';
  20. import { IconCheck, IconVideoOff } from '../../../base/icons/svg';
  21. import { MEDIA_TYPE } from '../../../base/media/constants';
  22. import { getParticipantCount, isEveryoneModerator } from '../../../base/participants/functions';
  23. import MuteEveryonesVideoDialog
  24. from '../../../video-menu/components/native/MuteEveryonesVideoDialog';
  25. import styles from './styles';
  26. export const ContextMenuMore = () => {
  27. const dispatch = useDispatch();
  28. const muteAllVideo = useCallback(() => {
  29. dispatch(openDialog(MuteEveryonesVideoDialog));
  30. dispatch(hideSheet());
  31. }, [ dispatch ]);
  32. const { t } = useTranslation();
  33. const isModerationSupported = useSelector((state: IReduxState) => isAvModerationSupported()(state));
  34. const allModerators = useSelector(isEveryoneModerator);
  35. const participantCount = useSelector(getParticipantCount);
  36. const isAudioModerationEnabled = useSelector(isAvModerationEnabled(MEDIA_TYPE.AUDIO));
  37. const isVideoModerationEnabled = useSelector(isAvModerationEnabled(MEDIA_TYPE.VIDEO));
  38. const disableAudioModeration = useCallback(() => dispatch(requestDisableAudioModeration()), [ dispatch ]);
  39. const disableVideoModeration = useCallback(() => dispatch(requestDisableVideoModeration()), [ dispatch ]);
  40. const enableAudioModeration = useCallback(() => dispatch(requestEnableAudioModeration()), [ dispatch ]);
  41. const enableVideoModeration = useCallback(() => dispatch(requestEnableVideoModeration()), [ dispatch ]);
  42. return (
  43. <BottomSheet
  44. addScrollViewPadding = { false }
  45. showSlidingView = { true }>
  46. <TouchableOpacity
  47. onPress = { muteAllVideo }
  48. style = { styles.contextMenuItem as ViewStyle }>
  49. <Icon
  50. size = { 24 }
  51. src = { IconVideoOff } />
  52. <Text style = { styles.contextMenuItemText }>{t('participantsPane.actions.stopEveryonesVideo')}</Text>
  53. </TouchableOpacity>
  54. {isModerationSupported && ((participantCount === 1 || !allModerators)) && <>
  55. {/* @ts-ignore */}
  56. <Divider style = { styles.divider } />
  57. <View style = { styles.contextMenuItem as ViewStyle }>
  58. <Text style = { styles.contextMenuItemText }>{t('participantsPane.actions.allow')}</Text>
  59. </View>
  60. {isAudioModerationEnabled
  61. ? <TouchableOpacity
  62. onPress = { disableAudioModeration }
  63. style = { styles.contextMenuItem as ViewStyle }>
  64. <Text style = { styles.contextMenuItemTextNoIcon }>
  65. {t('participantsPane.actions.audioModeration')}
  66. </Text>
  67. </TouchableOpacity>
  68. : <TouchableOpacity
  69. onPress = { enableAudioModeration }
  70. style = { styles.contextMenuItem as ViewStyle }>
  71. <Icon
  72. size = { 24 }
  73. src = { IconCheck } />
  74. <Text style = { styles.contextMenuItemText }>
  75. {t('participantsPane.actions.audioModeration')}
  76. </Text>
  77. </TouchableOpacity> }
  78. {isVideoModerationEnabled
  79. ? <TouchableOpacity
  80. onPress = { disableVideoModeration }
  81. style = { styles.contextMenuItem as ViewStyle }>
  82. <Text style = { styles.contextMenuItemTextNoIcon }>
  83. {t('participantsPane.actions.videoModeration')}
  84. </Text>
  85. </TouchableOpacity>
  86. : <TouchableOpacity
  87. onPress = { enableVideoModeration }
  88. style = { styles.contextMenuItem as ViewStyle }>
  89. <Icon
  90. size = { 24 }
  91. src = { IconCheck } />
  92. <Text style = { styles.contextMenuItemText }>
  93. {t('participantsPane.actions.videoModeration')}
  94. </Text>
  95. </TouchableOpacity>}
  96. </>}
  97. </BottomSheet>
  98. );
  99. };