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.

FooterContextMenu.js 4.0KB

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