選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

FooterContextMenu.tsx 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /* eslint-disable lines-around-comment */
  2. import { makeStyles } from '@material-ui/core/styles';
  3. import React, { useCallback } from 'react';
  4. import { useTranslation } from 'react-i18next';
  5. import { useDispatch, useSelector } from 'react-redux';
  6. import {
  7. requestDisableAudioModeration,
  8. requestDisableVideoModeration,
  9. requestEnableAudioModeration,
  10. requestEnableVideoModeration
  11. // @ts-ignore
  12. } from '../../../av-moderation/actions';
  13. import {
  14. isEnabled as isAvModerationEnabled,
  15. isSupported as isAvModerationSupported
  16. // @ts-ignore
  17. } from '../../../av-moderation/functions';
  18. // @ts-ignore
  19. import { ContextMenu, ContextMenuItemGroup } from '../../../base/components';
  20. // @ts-ignore
  21. import { openDialog } from '../../../base/dialog';
  22. import {
  23. IconCheck,
  24. IconHorizontalPoints,
  25. IconVideoOff
  26. } from '../../../base/icons/svg';
  27. import { MEDIA_TYPE } from '../../../base/media/constants';
  28. import {
  29. getParticipantCount,
  30. isEveryoneModerator
  31. } from '../../../base/participants/functions';
  32. // @ts-ignore
  33. import { isInBreakoutRoom } from '../../../breakout-rooms/functions';
  34. import {
  35. SETTINGS_TABS,
  36. openSettingsDialog,
  37. shouldShowModeratorSettings
  38. // @ts-ignore
  39. } from '../../../settings';
  40. // @ts-ignore
  41. import { MuteEveryonesVideoDialog } from '../../../video-menu/components';
  42. const useStyles = makeStyles((theme: any) => {
  43. return {
  44. contextMenu: {
  45. bottom: 'auto',
  46. margin: '0',
  47. right: 0,
  48. top: '-8px',
  49. transform: 'translateY(-100%)',
  50. width: '283px'
  51. },
  52. text: {
  53. color: theme.palette.text02,
  54. padding: '10px 16px',
  55. height: '40px',
  56. overflow: 'hidden',
  57. display: 'flex',
  58. alignItems: 'center',
  59. boxSizing: 'border-box'
  60. },
  61. indentedLabel: {
  62. '& > span': {
  63. marginLeft: '36px'
  64. }
  65. }
  66. };
  67. });
  68. type Props = {
  69. /**
  70. * Whether the menu is open.
  71. */
  72. isOpen: boolean,
  73. /**
  74. * Drawer close callback.
  75. */
  76. onDrawerClose: Function,
  77. /**
  78. * Callback for the mouse leaving this item.
  79. */
  80. onMouseLeave?: Function
  81. };
  82. export const FooterContextMenu = ({ isOpen, onDrawerClose, onMouseLeave }: Props) => {
  83. const dispatch = useDispatch();
  84. const isModerationSupported = useSelector(isAvModerationSupported);
  85. const allModerators = useSelector(isEveryoneModerator);
  86. const isModeratorSettingsTabEnabled = useSelector(shouldShowModeratorSettings);
  87. const participantCount = useSelector(getParticipantCount);
  88. const isAudioModerationEnabled = useSelector(isAvModerationEnabled(MEDIA_TYPE.AUDIO));
  89. const isVideoModerationEnabled = useSelector(isAvModerationEnabled(MEDIA_TYPE.VIDEO));
  90. const isBreakoutRoom = useSelector(isInBreakoutRoom);
  91. const { t } = useTranslation();
  92. const disableAudioModeration = useCallback(() => dispatch(requestDisableAudioModeration()), [ dispatch ]);
  93. const disableVideoModeration = useCallback(() => dispatch(requestDisableVideoModeration()), [ dispatch ]);
  94. const enableAudioModeration = useCallback(() => dispatch(requestEnableAudioModeration()), [ dispatch ]);
  95. const enableVideoModeration = useCallback(() => dispatch(requestEnableVideoModeration()), [ dispatch ]);
  96. const classes = useStyles();
  97. const muteAllVideo = useCallback(
  98. () => dispatch(openDialog(MuteEveryonesVideoDialog)), [ dispatch ]);
  99. const openModeratorSettings = () => dispatch(openSettingsDialog(SETTINGS_TABS.MODERATOR));
  100. const actions = [
  101. {
  102. accessibilityLabel: t('participantsPane.actions.audioModeration'),
  103. className: isAudioModerationEnabled ? classes.indentedLabel : '',
  104. id: isAudioModerationEnabled
  105. ? 'participants-pane-context-menu-stop-audio-moderation'
  106. : 'participants-pane-context-menu-start-audio-moderation',
  107. icon: !isAudioModerationEnabled && IconCheck,
  108. onClick: isAudioModerationEnabled ? disableAudioModeration : enableAudioModeration,
  109. text: t('participantsPane.actions.audioModeration')
  110. }, {
  111. accessibilityLabel: t('participantsPane.actions.videoModeration'),
  112. className: isVideoModerationEnabled ? classes.indentedLabel : '',
  113. id: isVideoModerationEnabled
  114. ? 'participants-pane-context-menu-stop-video-moderation'
  115. : 'participants-pane-context-menu-start-video-moderation',
  116. icon: !isVideoModerationEnabled && IconCheck,
  117. onClick: isVideoModerationEnabled ? disableVideoModeration : enableVideoModeration,
  118. text: t('participantsPane.actions.videoModeration')
  119. }
  120. ];
  121. return (
  122. <ContextMenu
  123. className = { classes.contextMenu }
  124. hidden = { !isOpen }
  125. isDrawerOpen = { isOpen }
  126. onDrawerClose = { onDrawerClose }
  127. onMouseLeave = { onMouseLeave }>
  128. <ContextMenuItemGroup
  129. actions = { [ {
  130. accessibilityLabel: t('participantsPane.actions.stopEveryonesVideo'),
  131. id: 'participants-pane-context-menu-stop-video',
  132. icon: IconVideoOff,
  133. onClick: muteAllVideo,
  134. text: t('participantsPane.actions.stopEveryonesVideo')
  135. } ] } />
  136. {!isBreakoutRoom && isModerationSupported && (participantCount === 1 || !allModerators) && (
  137. <ContextMenuItemGroup actions = { actions }>
  138. <div className = { classes.text }>
  139. <span>{t('participantsPane.actions.allow')}</span>
  140. </div>
  141. </ContextMenuItemGroup>
  142. )}
  143. {isModeratorSettingsTabEnabled && (
  144. <ContextMenuItemGroup
  145. actions = { [ {
  146. accessibilityLabel: t('participantsPane.actions.moreModerationControls'),
  147. id: 'participants-pane-open-moderation-control-settings',
  148. icon: IconHorizontalPoints,
  149. onClick: openModeratorSettings,
  150. text: t('participantsPane.actions.moreModerationControls')
  151. } ] } />
  152. )}
  153. </ContextMenu>
  154. );
  155. };