您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

FooterContextMenu.js 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // @flow
  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 { requestDisableModeration, requestEnableModeration } from '../../av-moderation/actions';
  7. import {
  8. isEnabled as isAvModerationEnabled,
  9. isSupported as isAvModerationSupported
  10. } from '../../av-moderation/functions';
  11. import { openDialog } from '../../base/dialog';
  12. import { Icon, IconCheck, IconVideoOff } from '../../base/icons';
  13. import { MEDIA_TYPE } from '../../base/media';
  14. import {
  15. getLocalParticipant,
  16. isEveryoneModerator
  17. } from '../../base/participants';
  18. import { MuteEveryonesVideoDialog } from '../../video-menu/components';
  19. import {
  20. ContextMenu,
  21. ContextMenuItem
  22. } from './styled';
  23. const useStyles = makeStyles(() => {
  24. return {
  25. contextMenu: {
  26. bottom: 'auto',
  27. margin: '0',
  28. padding: '8px 0',
  29. right: 0,
  30. top: '-8px',
  31. transform: 'translateY(-100%)',
  32. width: '238px'
  33. },
  34. text: {
  35. marginLeft: '52px',
  36. lineHeight: '40px'
  37. },
  38. paddedAction: {
  39. marginLeft: '36px;'
  40. }
  41. };
  42. });
  43. type Props = {
  44. /**
  45. * Callback for the mouse leaving this item
  46. */
  47. onMouseLeave: Function
  48. };
  49. export const FooterContextMenu = ({ onMouseLeave }: Props) => {
  50. const dispatch = useDispatch();
  51. const isModerationSupported = useSelector(isAvModerationSupported());
  52. const allModerators = useSelector(isEveryoneModerator);
  53. const isModerationEnabled = useSelector(isAvModerationEnabled(MEDIA_TYPE.AUDIO));
  54. const { id } = useSelector(getLocalParticipant);
  55. const { t } = useTranslation();
  56. const disable = useCallback(() => dispatch(requestDisableModeration()), [ dispatch ]);
  57. const enable = useCallback(() => dispatch(requestEnableModeration()), [ dispatch ]);
  58. const classes = useStyles();
  59. const muteAllVideo = useCallback(
  60. () => dispatch(openDialog(MuteEveryonesVideoDialog, { exclude: [ id ] })), [ dispatch ]);
  61. return (
  62. <ContextMenu
  63. className = { classes.contextMenu }
  64. onMouseLeave = { onMouseLeave }>
  65. <ContextMenuItem
  66. id = 'participants-pane-context-menu-stop-video'
  67. onClick = { muteAllVideo }>
  68. <Icon
  69. size = { 20 }
  70. src = { IconVideoOff } />
  71. <span>{ t('participantsPane.actions.stopEveryonesVideo') }</span>
  72. </ContextMenuItem>
  73. { isModerationSupported && !allModerators ? (
  74. <>
  75. <div className = { classes.text }>
  76. {t('participantsPane.actions.allow')}
  77. </div>
  78. { isModerationEnabled ? (
  79. <ContextMenuItem
  80. id = 'participants-pane-context-menu-start-moderation'
  81. onClick = { disable }>
  82. <span className = { classes.paddedAction }>
  83. { t('participantsPane.actions.startModeration') }
  84. </span>
  85. </ContextMenuItem>
  86. ) : (
  87. <ContextMenuItem
  88. id = 'participants-pane-context-menu-stop-moderation'
  89. onClick = { enable }>
  90. <Icon
  91. size = { 20 }
  92. src = { IconCheck } />
  93. <span>{ t('participantsPane.actions.startModeration') }</span>
  94. </ContextMenuItem>
  95. )}
  96. </>
  97. ) : undefined
  98. }
  99. </ContextMenu>
  100. );
  101. };