// @flow import { APP_WILL_MOUNT, APP_WILL_UNMOUNT } from '../app'; import { CONFERENCE_JOINED } from '../base/conference'; import { JitsiConferenceEvents } from '../base/lib-jitsi-meet'; import { MiddlewareRegistry } from '../base/redux'; import { playSound, registerSound, unregisterSound } from '../base/sounds'; import { INCOMING_MSG_SOUND_ID } from './constants'; import { INCOMING_MSG_SOUND_SRC } from './sounds'; declare var APP: Object; /** * Implements the middleware of the chat feature. * * @param {Store} store - The redux store. * @returns {Function} */ MiddlewareRegistry.register(store => next => action => { switch (action.type) { case APP_WILL_MOUNT: { // Register chat msg sound only on web typeof APP !== 'undefined' && store.dispatch( registerSound(INCOMING_MSG_SOUND_ID, INCOMING_MSG_SOUND_SRC)); break; } case APP_WILL_UNMOUNT: { // Register chat msg sound only on web typeof APP !== 'undefined' && store.dispatch(unregisterSound(INCOMING_MSG_SOUND_ID)); break; } case CONFERENCE_JOINED: typeof APP !== 'undefined' && _addChatMsgListener(action.conference, store); break; } return next(action); }); /** * Registers listener for {@link JitsiConferenceEvents.MESSAGE_RECEIVED} which * will play a sound on the event, given that the chat is not currently visible. * * @param {JitsiConference} conference - The conference instance on which the * new event listener will be registered. * @param {Dispatch} next - The redux dispatch function to dispatch the * specified action to the specified store. * @returns {void} * @private */ function _addChatMsgListener(conference, { dispatch }) { // XXX Currently there's no need to remove the listener, because // conference instance can not be re-used. Listener will be gone with // the conference instance. conference.on( JitsiConferenceEvents.MESSAGE_RECEIVED, () => { if (!APP.UI.isChatVisible()) { dispatch(playSound(INCOMING_MSG_SOUND_ID)); } }); }