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.

AudioSettingsPopup.js 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // @flow
  2. import InlineDialog from '@atlaskit/inline-dialog';
  3. import React from 'react';
  4. import {
  5. getAudioInputDeviceData,
  6. getAudioOutputDeviceData,
  7. setAudioInputDeviceAndUpdateSettings,
  8. setAudioOutputDevice as setAudioOutputDeviceAction
  9. } from '../../../../base/devices';
  10. import { connect } from '../../../../base/redux';
  11. import { SMALL_MOBILE_WIDTH } from '../../../../base/responsive-ui/constants';
  12. import {
  13. getCurrentMicDeviceId,
  14. getCurrentOutputDeviceId
  15. } from '../../../../base/settings';
  16. import { toggleAudioSettings } from '../../../actions';
  17. import { getAudioSettingsVisibility } from '../../../functions';
  18. import AudioSettingsContent, { type Props as AudioSettingsContentProps } from './AudioSettingsContent';
  19. type Props = AudioSettingsContentProps & {
  20. /**
  21. * Component's children (the audio button).
  22. */
  23. children: React$Node,
  24. /**
  25. * Flag controlling the visibility of the popup.
  26. */
  27. isOpen: boolean,
  28. /**
  29. * Callback executed when the popup closes.
  30. */
  31. onClose: Function,
  32. /**
  33. * The popup placement enum value.
  34. */
  35. popupPlacement: string
  36. }
  37. /**
  38. * Popup with audio settings.
  39. *
  40. * @returns {ReactElement}
  41. */
  42. function AudioSettingsPopup({
  43. children,
  44. currentMicDeviceId,
  45. currentOutputDeviceId,
  46. isOpen,
  47. microphoneDevices,
  48. setAudioInputDevice,
  49. setAudioOutputDevice,
  50. onClose,
  51. outputDevices,
  52. popupPlacement
  53. }: Props) {
  54. return (
  55. <div className = 'audio-preview'>
  56. <InlineDialog
  57. content = { <AudioSettingsContent
  58. currentMicDeviceId = { currentMicDeviceId }
  59. currentOutputDeviceId = { currentOutputDeviceId }
  60. microphoneDevices = { microphoneDevices }
  61. outputDevices = { outputDevices }
  62. setAudioInputDevice = { setAudioInputDevice }
  63. setAudioOutputDevice = { setAudioOutputDevice } /> }
  64. isOpen = { isOpen }
  65. onClose = { onClose }
  66. placement = { popupPlacement }>
  67. {children}
  68. </InlineDialog>
  69. </div>
  70. );
  71. }
  72. /**
  73. * Function that maps parts of Redux state tree into component props.
  74. *
  75. * @param {Object} state - Redux state.
  76. * @returns {Object}
  77. */
  78. function mapStateToProps(state) {
  79. const { clientWidth } = state['features/base/responsive-ui'];
  80. return {
  81. popupPlacement: clientWidth <= SMALL_MOBILE_WIDTH ? 'auto' : 'top-start',
  82. currentMicDeviceId: getCurrentMicDeviceId(state),
  83. currentOutputDeviceId: getCurrentOutputDeviceId(state),
  84. isOpen: getAudioSettingsVisibility(state),
  85. microphoneDevices: getAudioInputDeviceData(state),
  86. outputDevices: getAudioOutputDeviceData(state)
  87. };
  88. }
  89. const mapDispatchToProps = {
  90. onClose: toggleAudioSettings,
  91. setAudioInputDevice: setAudioInputDeviceAndUpdateSettings,
  92. setAudioOutputDevice: setAudioOutputDeviceAction
  93. };
  94. export default connect(mapStateToProps, mapDispatchToProps)(AudioSettingsPopup);