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

AudioSettingsButton.js 2.6KB

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