jiti-meet/react/features/base/sounds/middleware.ts

73 lines
1.9 KiB
TypeScript
Raw Normal View History

import { IStore } from '../../app/types';
import MiddlewareRegistry from '../redux/MiddlewareRegistry';
import { PLAY_SOUND, STOP_SOUND } from './actionTypes';
import logger from './logger';
/**
* Implements the entry point of the middleware of the feature base/media.
*
* @param {Store} store - The redux store.
* @returns {Function}
*/
MiddlewareRegistry.register(store => next => action => {
switch (action.type) {
case PLAY_SOUND:
_playSound(store, action.soundId);
break;
case STOP_SOUND:
_stopSound(store, action.soundId);
break;
}
return next(action);
});
/**
* Plays sound from audio element registered in the Redux store.
*
* @param {Store} store - The Redux store instance.
* @param {string} soundId - Audio element identifier.
* @private
* @returns {void}
*/
function _playSound({ getState }: IStore, soundId: string) {
const sounds = getState()['features/base/sounds'];
const sound = sounds.get(soundId);
if (sound) {
if (sound.audioElement) {
sound.audioElement.play();
} else {
logger.warn(`PLAY_SOUND: sound not loaded yet for id: ${soundId}`);
}
} else {
logger.warn(`PLAY_SOUND: no sound found for id: ${soundId}`);
}
}
/**
* Stop sound from audio element registered in the Redux store.
*
* @param {Store} store - The Redux store instance.
* @param {string} soundId - Audio element identifier.
* @private
* @returns {void}
*/
function _stopSound({ getState }: IStore, soundId: string) {
const sounds = getState()['features/base/sounds'];
const sound = sounds.get(soundId);
if (sound) {
const { audioElement } = sound;
if (audioElement) {
audioElement.stop();
} else {
logger.warn(`STOP_SOUND: sound not loaded yet for id: ${soundId}`);
}
} else {
logger.warn(`STOP_SOUND: no sound found for id: ${soundId}`);
}
}