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

FooterContextMenu.js 3.9KB

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