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.

AudioSettingsButton.js 2.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // @flow
  2. import React, { Component } from 'react';
  3. import { isMobileBrowser } from '../../../base/environment/utils';
  4. import { IconArrowDown } from '../../../base/icons';
  5. import JitsiMeetJS from '../../../base/lib-jitsi-meet/_';
  6. import { connect } from '../../../base/redux';
  7. import { ToolboxButtonWithIcon } from '../../../base/toolbox/components';
  8. import { AudioSettingsPopup, toggleAudioSettings } from '../../../settings';
  9. import { isAudioSettingsButtonDisabled } from '../../functions';
  10. import AudioMuteButton from '../AudioMuteButton';
  11. type Props = {
  12. /**
  13. * Indicates whether audio permissions have been granted or denied.
  14. */
  15. hasPermissions: boolean,
  16. /**
  17. * Click handler for the small icon. Opens audio options.
  18. */
  19. onAudioOptionsClick: Function,
  20. /**
  21. * If the button should be disabled.
  22. */
  23. isDisabled: boolean,
  24. /**
  25. * Flag controlling the visibility of the button.
  26. * AudioSettings popup is disabled on mobile browsers.
  27. */
  28. visible: boolean
  29. };
  30. /**
  31. * Button used for audio & audio settings.
  32. *
  33. * @returns {ReactElement}
  34. */
  35. class AudioSettingsButton extends Component<Props> {
  36. /**
  37. * Implements React's {@link Component#render}.
  38. *
  39. * @inheritdoc
  40. */
  41. render() {
  42. const { hasPermissions, isDisabled, onAudioOptionsClick, visible } = this.props;
  43. const settingsDisabled = !hasPermissions
  44. || isDisabled
  45. || !JitsiMeetJS.mediaDevices.isMultipleAudioInputSupported();
  46. return visible ? (
  47. <AudioSettingsPopup>
  48. <ToolboxButtonWithIcon
  49. icon = { IconArrowDown }
  50. iconDisabled = { settingsDisabled }
  51. onIconClick = { onAudioOptionsClick }>
  52. <AudioMuteButton />
  53. </ToolboxButtonWithIcon>
  54. </AudioSettingsPopup>
  55. ) : <AudioMuteButton />;
  56. }
  57. }
  58. /**
  59. * Function that maps parts of Redux state tree into component props.
  60. *
  61. * @param {Object} state - Redux state.
  62. * @returns {Object}
  63. */
  64. function mapStateToProps(state) {
  65. const { permissions = {} } = state['features/base/devices'];
  66. return {
  67. hasPermissions: permissions.audio,
  68. isDisabled: isAudioSettingsButtonDisabled(state),
  69. visible: !isMobileBrowser()
  70. };
  71. }
  72. const mapDispatchToProps = {
  73. onAudioOptionsClick: toggleAudioSettings
  74. };
  75. export default connect(
  76. mapStateToProps,
  77. mapDispatchToProps,
  78. )(AudioSettingsButton);