12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- import {
- SET_AUDIO_INPUT_DEVICE,
- SET_AUDIO_OUTPUT_DEVICE,
- SET_VIDEO_INPUT_DEVICE,
- UPDATE_DEVICE_LIST
- } from './actionTypes';
-
- import { ReducerRegistry } from '../redux';
-
- const DEFAULT_STATE = {
- audioInput: [],
- audioOutput: [],
- videoInput: []
- };
-
- /**
- * Listen for actions which changes the state of known and used devices.
- *
- * @param {Object} state - The Redux state of the feature features/base/devices.
- * @param {Object} action - Action object.
- * @param {string} action.type - Type of action.
- * @param {Array<MediaDeviceInfo>} action.devices - All available audio and
- * video devices.
- * @returns {Object}
- */
- ReducerRegistry.register(
- 'features/base/devices',
- (state = DEFAULT_STATE, action) => {
- switch (action.type) {
- case UPDATE_DEVICE_LIST: {
- const deviceList = _groupDevicesByKind(action.devices);
-
- return {
- ...deviceList
- };
- }
-
- // TODO: Changing of current audio and video device id is currently
- // handled outside of react/redux. Fall through to default logic for
- // now.
- case SET_AUDIO_INPUT_DEVICE:
- case SET_VIDEO_INPUT_DEVICE:
- case SET_AUDIO_OUTPUT_DEVICE:
- default:
- return state;
- }
- });
-
- /**
- * Converts an array of media devices into an object organized by device kind.
- *
- * @param {Array<MediaDeviceInfo>} devices - Available media devices.
- * @private
- * @returns {Object} An object with the media devices split by type. The keys
- * are device type and the values are arrays with devices matching the device
- * type.
- */
- function _groupDevicesByKind(devices) {
- return {
- audioInput: devices.filter(device => device.kind === 'audioinput'),
- audioOutput: devices.filter(device => device.kind === 'audiooutput'),
- videoInput: devices.filter(device => device.kind === 'videoinput')
- };
- }
|