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.js 4.8KB

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