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 3.3KB

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