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.9KB

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