import AKDropdownMenu from '@atlaskit/dropdown-menu'; import ExpandIcon from '@atlaskit/icon/glyph/expand'; import React, { Component } from 'react'; import { translate } from '../../base/i18n'; /** * React component for selecting a device from a select element. Wraps * AKDropdownMenu with device selection specific logic. * * @extends Component */ class DeviceSelector extends Component { /** * DeviceSelector component's property types. * * @static */ static propTypes = { /** * MediaDeviceInfos used for display in the select element. */ devices: React.PropTypes.array, /** * If false, will return a selector with no selection options. */ hasPermission: React.PropTypes.bool, /** * CSS class for the icon to the left of the dropdown trigger. */ icon: React.PropTypes.string, /** * If true, will render the selector disabled with a default selection. */ isDisabled: React.PropTypes.bool, /** * The translation key to display as a menu label. */ label: React.PropTypes.string, /** * The callback to invoke when a selection is made. */ onSelect: React.PropTypes.func, /** * The default device to display as selected. */ selectedDeviceId: React.PropTypes.string, /** * Invoked to obtain translated strings. */ t: React.PropTypes.func }; /** * Initializes a new DeviceSelector instance. * * @param {Object} props - The read-only React Component props with which * the new instance is to be initialized. */ constructor(props) { super(props); this._onSelect = this._onSelect.bind(this); } /** * Implements React's {@link Component#render()}. * * @inheritdoc * @returns {ReactElement} */ render() { if (!this.props.hasPermission) { return this._renderNoPermission(); } if (!this.props.devices || !this.props.devices.length) { return this._renderNoDevices(); } const items = this.props.devices.map(this._createDropdownItem); const defaultSelected = items.find(item => item.value === this.props.selectedDeviceId ); return this._createDropdown({ defaultSelected, isDisabled: this.props.isDisabled, items, placeholder: this.props.t('deviceSelection.selectADevice') }); } /** * Creates a React Element for displaying the passed in text surrounded by * two icons. The left icon is the icon class passed in through props and * the right icon is AtlasKit ExpandIcon. * * @param {string} triggerText - The text to display within the element. * @private * @returns {ReactElement} */ _createDropdownTrigger(triggerText) { return (