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} 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} 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') }; }