123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- import { JitsiConferenceEvents } from '../base/lib-jitsi-meet';
- import { getParticipantById } from '../base/participants/functions';
- import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
- import StateListenerRegistry from '../base/redux/StateListenerRegistry';
- import { editMessage } from '../chat/actions.any';
- import { MESSAGE_TYPE_REMOTE } from '../chat/constants';
-
- import { UPDATE_BREAKOUT_ROOMS } from './actionTypes';
- import { moveToRoom } from './actions';
- import logger from './logger';
- import { IRooms } from './types';
-
- /**
- * Registers a change handler for state['features/base/conference'].conference to
- * set the event listeners needed for the breakout rooms feature to operate.
- */
- StateListenerRegistry.register(
- state => state['features/base/conference'].conference,
- (conference, { dispatch }, previousConference) => {
- if (conference && !previousConference) {
- conference.on(JitsiConferenceEvents.BREAKOUT_ROOMS_MOVE_TO_ROOM, (roomId: string) => {
- logger.debug(`Moving to room: ${roomId}`);
- dispatch(moveToRoom(roomId));
- });
-
- conference.on(JitsiConferenceEvents.BREAKOUT_ROOMS_UPDATED, ({ rooms, roomCounter }: {
- roomCounter: number; rooms: IRooms;
- }) => {
- logger.debug('Room list updated');
- if (typeof APP !== 'undefined') {
- APP.API.notifyBreakoutRoomsUpdated(rooms);
- }
- dispatch({
- type: UPDATE_BREAKOUT_ROOMS,
- rooms,
- roomCounter
- });
- });
- }
- });
-
- MiddlewareRegistry.register(({ dispatch, getState }) => next => action => {
- const { type } = action;
-
- switch (type) {
- case UPDATE_BREAKOUT_ROOMS: {
- // edit name if it was overwritten
- if (!action.updatedNames) {
- const { overwrittenNameList } = getState()['features/base/participants'];
-
- if (Object.keys(overwrittenNameList).length > 0) {
- const newRooms: IRooms = {};
-
- Object.entries(action.rooms as IRooms).forEach(([ key, r ]) => {
- let participants = r?.participants || {};
- let jid;
-
- for (const id of Object.keys(overwrittenNameList)) {
- jid = Object.keys(participants).find(p => p.slice(p.indexOf('/') + 1) === id);
-
- if (jid) {
- participants = {
- ...participants,
- [jid]: {
- ...participants[jid],
- displayName: overwrittenNameList[id as keyof typeof overwrittenNameList]
- }
- };
- }
- }
-
- newRooms[key] = {
- ...r,
- participants
- };
- });
-
- action.rooms = newRooms;
- }
- }
-
- // edit the chat history to match names for participants in breakout rooms
- const { messages } = getState()['features/chat'];
-
- messages?.forEach(m => {
- if (m.messageType === MESSAGE_TYPE_REMOTE && !getParticipantById(getState(), m.id)) {
- const rooms: IRooms = action.rooms;
-
- for (const room of Object.values(rooms)) {
- const participants = room.participants || {};
- const matchedJid = Object.keys(participants).find(jid => jid.endsWith(m.id));
-
- if (matchedJid) {
- m.displayName = participants[matchedJid].displayName;
-
- dispatch(editMessage(m));
- }
- }
- }
- });
-
- break;
- }
- }
-
- return next(action);
- });
|