@100mslive/react-native-room-kit
Version:
100ms Room Kit provides simple & easy to use UI components to build Live Streaming & Video Conferencing experiences in your apps.
351 lines (344 loc) • 14.6 kB
JavaScript
import { HmsStateActionTypes } from '../actionTypes';
const INITIAL_STATE = {
isLocalAudioMuted: undefined,
isLocalVideoMuted: undefined,
isLocalScreenShared: undefined,
reconnecting: false,
roomLocallyMuted: false,
room: null,
localPeer: null,
groupedParticipants: {},
activeSpeakers: [],
roles: [],
previewPeersList: [],
layoutConfig: null,
roleChangeRequest: null,
noiseCancellationPlugin: null,
videoPlugin: null,
whiteboard: null
};
const hmsStatesReducer = (state = INITIAL_STATE, action) => {
switch (action.type) {
case HmsStateActionTypes.SET_ROOM_STATE:
return {
...state,
room: action.room
};
case HmsStateActionTypes.SET_LOCAL_PEER_STATE:
{
var _action$localPeer4, _action$localPeer5;
let updatedGroupedParticipants = state.groupedParticipants;
if (action.localPeer !== null) {
let previousRoleName = null;
let savedLocalPeer = null;
for (const groupName in state.groupedParticipants) {
if (Object.prototype.hasOwnProperty.call(state.groupedParticipants, groupName)) {
const participantsList = state.groupedParticipants[groupName];
if (Array.isArray(participantsList)) {
const result = participantsList.find(participant => {
var _action$localPeer;
return participant.peerID === ((_action$localPeer = action.localPeer) === null || _action$localPeer === void 0 ? void 0 : _action$localPeer.peerID);
});
if (result) {
previousRoleName = groupName;
savedLocalPeer = result;
break;
}
}
}
}
// update peer or check if role change happened
if (savedLocalPeer) {
var _action$localPeer$rol;
const currentRoleName = (_action$localPeer$rol = action.localPeer.role) === null || _action$localPeer$rol === void 0 ? void 0 : _action$localPeer$rol.name;
const roleChanged = previousRoleName && previousRoleName !== currentRoleName;
if (roleChanged && previousRoleName) {
const previousList = state.groupedParticipants[previousRoleName];
const currentList = state.groupedParticipants[currentRoleName];
updatedGroupedParticipants = {
...state.groupedParticipants,
// add to new list
[currentRoleName]: Array.isArray(currentList) ? [action.localPeer, ...currentList] : [action.localPeer],
// delete from old list
[previousRoleName]: Array.isArray(previousList) ? previousList.filter(peer => {
var _action$localPeer2;
return peer.peerID !== ((_action$localPeer2 = action.localPeer) === null || _action$localPeer2 === void 0 ? void 0 : _action$localPeer2.peerID);
}) : []
};
} else {
const participants = state.groupedParticipants[currentRoleName];
updatedGroupedParticipants = {
...state.groupedParticipants,
[currentRoleName]: Array.isArray(participants) ? participants.map(participant => {
var _action$localPeer3;
return participant.peerID === ((_action$localPeer3 = action.localPeer) === null || _action$localPeer3 === void 0 ? void 0 : _action$localPeer3.peerID) ? action.localPeer : participant;
}) : [action.localPeer]
};
}
}
// add peer
else {
var _action$localPeer$rol2;
const localPeerRoleName = (_action$localPeer$rol2 = action.localPeer.role) === null || _action$localPeer$rol2 === void 0 ? void 0 : _action$localPeer$rol2.name;
if (localPeerRoleName) {
const participants = state.groupedParticipants[localPeerRoleName];
updatedGroupedParticipants = {
...state.groupedParticipants,
[localPeerRoleName]: Array.isArray(participants) ? [action.localPeer, ...participants] : [action.localPeer]
};
}
}
}
return {
...state,
localPeer: action.localPeer,
isLocalAudioMuted: (_action$localPeer4 = action.localPeer) === null || _action$localPeer4 === void 0 || (_action$localPeer4 = _action$localPeer4.audioTrack) === null || _action$localPeer4 === void 0 ? void 0 : _action$localPeer4.isMute(),
isLocalVideoMuted: (_action$localPeer5 = action.localPeer) === null || _action$localPeer5 === void 0 || (_action$localPeer5 = _action$localPeer5.videoTrack) === null || _action$localPeer5 === void 0 ? void 0 : _action$localPeer5.isMute(),
// Adding or updating local peer in participants list
groupedParticipants: updatedGroupedParticipants
};
}
case HmsStateActionTypes.ADD_PARTICIPANT:
{
var _action$participant$r;
const participantRoleName = (_action$participant$r = action.participant.role) === null || _action$participant$r === void 0 ? void 0 : _action$participant$r.name;
if (!participantRoleName) {
return state;
}
const participants = state.groupedParticipants[participantRoleName];
if (Array.isArray(participants) && participants.findIndex(participant => participant.peerID === action.participant.peerID) >= 0) {
return state;
}
return {
...state,
groupedParticipants: {
...state.groupedParticipants,
[participantRoleName]: Array.isArray(participants) ? [...participants, action.participant] : [action.participant]
}
};
}
case HmsStateActionTypes.ADD_PARTICIPANTS:
{
const participantsToAdd = new Map();
const participants = Object.values(state.groupedParticipants).flat();
action.participants.forEach(peerToAdd => {
// check if `peerToAdd` already exists
const exists = participants.findIndex(participant => participant.peerID === peerToAdd.peerID) >= 0;
// if not exists, push to existing list or create new against the role
if (!exists) {
var _peerToAdd$role;
const list = participantsToAdd.get((_peerToAdd$role = peerToAdd.role) === null || _peerToAdd$role === void 0 ? void 0 : _peerToAdd$role.name);
if (list) {
list.push(peerToAdd);
} else {
var _peerToAdd$role2;
participantsToAdd.set((_peerToAdd$role2 = peerToAdd.role) === null || _peerToAdd$role2 === void 0 ? void 0 : _peerToAdd$role2.name, [peerToAdd]);
}
}
});
if (participantsToAdd.size === 0) {
return state;
}
let updatedGroupedParticipants = {
...state.groupedParticipants
};
participantsToAdd.forEach((list, roleName) => {
const oldList = updatedGroupedParticipants[roleName];
updatedGroupedParticipants[roleName] = Array.isArray(oldList) ? [...oldList, ...list] : list;
});
return {
...state,
groupedParticipants: updatedGroupedParticipants
};
}
case HmsStateActionTypes.REMOVE_PARTICIPANT:
{
var _action$participant$r2;
const participantRoleName = (_action$participant$r2 = action.participant.role) === null || _action$participant$r2 === void 0 ? void 0 : _action$participant$r2.name;
if (!participantRoleName) {
return state;
}
const participants = state.groupedParticipants[participantRoleName];
if (Array.isArray(participants) && participants.findIndex(participant => participant.peerID === action.participant.peerID) >= 0) {
return {
...state,
groupedParticipants: {
...state.groupedParticipants,
[participantRoleName]: participants.filter(participant => participant.peerID !== action.participant.peerID)
}
};
}
return state;
}
case HmsStateActionTypes.REMOVE_PARTICIPANTS:
{
const participantsToRemove = new Map();
const participants = Object.values(state.groupedParticipants).flat();
action.participants.forEach(peerToAdd => {
// check if `peerToAdd` already exists
const exists = participants.findIndex(participant => participant.peerID === peerToAdd.peerID) >= 0;
// if exists, push to existing list or create new against the role
if (exists) {
var _peerToAdd$role3;
const list = participantsToRemove.get((_peerToAdd$role3 = peerToAdd.role) === null || _peerToAdd$role3 === void 0 ? void 0 : _peerToAdd$role3.name);
if (list) {
list.push(peerToAdd);
} else {
var _peerToAdd$role4;
participantsToRemove.set((_peerToAdd$role4 = peerToAdd.role) === null || _peerToAdd$role4 === void 0 ? void 0 : _peerToAdd$role4.name, [peerToAdd]);
}
}
});
if (participantsToRemove.size === 0) {
return state;
}
let updatedGroupedParticipants = {
...state.groupedParticipants
};
participantsToRemove.forEach((list, roleName) => {
const oldList = updatedGroupedParticipants[roleName];
updatedGroupedParticipants[roleName] = Array.isArray(oldList) ? oldList.filter(participant => {
const notExists = list.findIndex(peerToRemove => peerToRemove.peerID === participant.peerID) < 0;
// if `participant` is not in `removedPeers` list
// then keep it, otherwise remove it
return notExists;
}) : [];
});
return {
...state,
groupedParticipants: updatedGroupedParticipants
};
}
case HmsStateActionTypes.UPDATE_PARTICIPANT:
{
var _action$participant$r3;
let previousRoleName = null;
for (const groupName in state.groupedParticipants) {
if (Object.prototype.hasOwnProperty.call(state.groupedParticipants, groupName)) {
const participantsList = state.groupedParticipants[groupName];
if (Array.isArray(participantsList)) {
const result = participantsList.find(participant => participant.peerID === action.participant.peerID);
if (result) {
previousRoleName = groupName;
break;
}
}
}
}
if (!previousRoleName) {
return state;
}
const currentRoleName = (_action$participant$r3 = action.participant.role) === null || _action$participant$r3 === void 0 ? void 0 : _action$participant$r3.name;
// check if role change
if (previousRoleName !== currentRoleName) {
const previousRoleList = state.groupedParticipants[previousRoleName];
const currentRoleList = state.groupedParticipants[currentRoleName];
return {
...state,
groupedParticipants: {
...state.groupedParticipants,
// - add to new
[currentRoleName]: Array.isArray(currentRoleList) ? [...currentRoleList, action.participant] : [action.participant],
// - delete from old
[previousRoleName]: Array.isArray(previousRoleList) ? previousRoleList.filter(p => p.peerID !== action.participant.peerID) : []
}
};
}
// update existing
const currentList = state.groupedParticipants[currentRoleName];
return {
...state,
groupedParticipants: {
...state.groupedParticipants,
[currentRoleName]: Array.isArray(currentList) ? currentList.map(p => p.peerID === action.participant.peerID ? action.participant : p) : [action.participant]
}
};
}
case HmsStateActionTypes.REPLACE_PARTICIPANTS_LIST:
{
return {
...state,
groupedParticipants: {
...state.groupedParticipants,
[action.roleName]: action.participants
}
};
}
case HmsStateActionTypes.SET_ROLES_STATE:
return {
...state,
roles: action.roles
};
case HmsStateActionTypes.SET_ACTIVE_SPEAKERS:
return {
...state,
activeSpeakers: action.activeSpeakers
};
case HmsStateActionTypes.SET_IS_LOCAL_AUDIO_MUTED_STATE:
return {
...state,
isLocalAudioMuted: action.isLocalAudioMuted
};
case HmsStateActionTypes.SET_IS_LOCAL_VIDEO_MUTED_STATE:
return {
...state,
isLocalVideoMuted: action.isLocalVideoMuted
};
case HmsStateActionTypes.SET_IS_LOCAL_SCREEN_SHARED_STATE:
return {
...state,
isLocalScreenShared: action.isLocalScreenShared
};
case HmsStateActionTypes.SET_ROOM_LOCALLY_MUTED:
return {
...state,
roomLocallyMuted: action.roomLocallyMuted
};
case HmsStateActionTypes.ADD_TO_PREVIEW_PEERS_LIST:
return {
...state,
previewPeersList: [...state.previewPeersList, action.peer]
};
case HmsStateActionTypes.REMOVE_FROM_PREVIEW_PEERS_LIST:
return {
...state,
previewPeersList: state.previewPeersList.filter(prevPeer => prevPeer.peerID !== action.peerId)
};
case HmsStateActionTypes.SET_LAYOUT_CONFIG:
return {
...state,
layoutConfig: action.layoutConfig
};
case HmsStateActionTypes.SET_ROLE_CHANGE_REQUEST:
return {
...state,
roleChangeRequest: action.roleChangeRequest
};
case HmsStateActionTypes.SET_RECONNECTING:
return {
...state,
reconnecting: action.reconnecting
};
case HmsStateActionTypes.SET_NOISE_CANCELLATION_PLUGIN:
return {
...state,
noiseCancellationPlugin: action.noiseCancellationPlugin
};
case HmsStateActionTypes.SET_VIDEO_PLUGIN:
return {
...state,
videoPlugin: action.videoPlugin
};
case HmsStateActionTypes.SET_WHITEBOARD:
return {
...state,
whiteboard: action.whiteboard
};
case HmsStateActionTypes.CLEAR_STATES:
return INITIAL_STATE;
default:
return state;
}
};
export default hmsStatesReducer;
//# sourceMappingURL=hmsStates.js.map