108 lines
3.9 KiB
TypeScript
108 lines
3.9 KiB
TypeScript
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);
|
|
});
|