UNPKG

@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
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