123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- // @flow
-
- import { PARTICIPANT_LEFT } from '../base/participants';
- import { ReducerRegistry } from '../base/redux';
-
- import {
- REMOVE_STAGE_PARTICIPANT,
- SET_STAGE_PARTICIPANTS,
- SET_FILMSTRIP_ENABLED,
- SET_FILMSTRIP_VISIBLE,
- SET_FILMSTRIP_WIDTH,
- SET_HORIZONTAL_VIEW_DIMENSIONS,
- SET_REMOTE_PARTICIPANTS,
- SET_STAGE_FILMSTRIP_DIMENSIONS,
- SET_TILE_VIEW_DIMENSIONS,
- SET_USER_FILMSTRIP_WIDTH,
- SET_USER_IS_RESIZING,
- SET_VERTICAL_VIEW_DIMENSIONS,
- SET_VISIBLE_REMOTE_PARTICIPANTS,
- SET_VOLUME,
- SET_MAX_STAGE_PARTICIPANTS,
- CLEAR_STAGE_PARTICIPANTS
- } from './actionTypes';
-
- const DEFAULT_STATE = {
-
- /**
- * The list of participants to be displayed on the stage filmstrip.
- */
- activeParticipants: [],
-
- /**
- * The indicator which determines whether the {@link Filmstrip} is enabled.
- *
- * @public
- * @type {boolean}
- */
- enabled: true,
-
- /**
- * The horizontal view dimensions.
- *
- * @public
- * @type {Object}
- */
- horizontalViewDimensions: {},
-
- /**
- * Whether or not the user is actively resizing the filmstrip.
- *
- * @public
- * @type {boolean}
- */
- isResizing: false,
-
- /**
- * The current max number of participants to be displayed on the stage filmstrip.
- *
- * @public
- * @type {Number}
- */
- maxStageParticipants: 1,
-
- /**
- * The custom audio volume levels per participant.
- *
- * @type {Object}
- */
- participantsVolume: {},
-
- /**
- * The ordered IDs of the remote participants displayed in the filmstrip.
- *
- * @public
- * @type {Array<string>}
- */
- remoteParticipants: [],
-
- /**
- * The stage filmstrip view dimensions.
- *
- * @public
- * @type {Object}
- */
- stageFilmstripDimensions: {},
-
- /**
- * The tile view dimensions.
- *
- * @public
- * @type {Object}
- */
- tileViewDimensions: {},
-
- /**
- * The vertical view dimensions.
- *
- * @public
- * @type {Object}
- */
- verticalViewDimensions: {},
-
- /**
- * The indicator which determines whether the {@link Filmstrip} is visible.
- *
- * @public
- * @type {boolean}
- */
- visible: true,
-
- /**
- * The end index in the remote participants array that is visible in the filmstrip.
- *
- * @public
- * @type {number}
- */
- visibleParticipantsEndIndex: 0,
-
- /**
- * The start index in the remote participants array that is visible in the filmstrip.
- *
- * @public
- * @type {number}
- */
- visibleParticipantsStartIndex: 0,
-
- /**
- * The visible remote participants in the filmstrip.
- *
- * @public
- * @type {Set<string>}
- */
- visibleRemoteParticipants: new Set(),
-
- /**
- * The width of the resizable filmstrip.
- *
- * @public
- * @type {Object}
- */
- width: {
- /**
- * Current width. Affected by: user filmstrip resize,
- * window resize, panels open/ close.
- */
- current: null,
-
- /**
- * Width set by user resize. Used as the preferred width.
- */
- userSet: null
- }
- };
-
- ReducerRegistry.register(
- 'features/filmstrip',
- (state = DEFAULT_STATE, action) => {
- switch (action.type) {
- case SET_FILMSTRIP_ENABLED:
- return {
- ...state,
- enabled: action.enabled
- };
-
- case SET_FILMSTRIP_VISIBLE:
- return {
- ...state,
- visible: action.visible
- };
-
- case SET_HORIZONTAL_VIEW_DIMENSIONS:
- return {
- ...state,
- horizontalViewDimensions: action.dimensions
- };
- case SET_REMOTE_PARTICIPANTS: {
- state.remoteParticipants = action.participants;
- const { visibleParticipantsStartIndex: startIndex, visibleParticipantsEndIndex: endIndex } = state;
-
- state.visibleRemoteParticipants = new Set(state.remoteParticipants.slice(startIndex, endIndex + 1));
-
- return { ...state };
- }
- case SET_TILE_VIEW_DIMENSIONS:
- return {
- ...state,
- tileViewDimensions: action.dimensions
- };
- case SET_VERTICAL_VIEW_DIMENSIONS:
- return {
- ...state,
- verticalViewDimensions: action.dimensions
- };
- case SET_VOLUME:
- return {
- ...state,
- participantsVolume: {
- ...state.participantsVolume,
-
- // NOTE: This would fit better in the features/base/participants. But currently we store
- // the participants as an array which will make it expensive to search for the volume for
- // every participant separately.
- [action.participantId]: action.volume
- }
- };
- case SET_VISIBLE_REMOTE_PARTICIPANTS: {
- const { endIndex, startIndex } = action;
- const { remoteParticipants } = state;
- const visibleRemoteParticipants = new Set(remoteParticipants.slice(startIndex, endIndex + 1));
-
- return {
- ...state,
- visibleParticipantsStartIndex: startIndex,
- visibleParticipantsEndIndex: endIndex,
- visibleRemoteParticipants
- };
- }
- case PARTICIPANT_LEFT: {
- const { id, local } = action.participant;
-
- if (local) {
- return state;
- }
- delete state.participantsVolume[id];
-
- return {
- ...state
- };
- }
- case SET_FILMSTRIP_WIDTH: {
- return {
- ...state,
- width: {
- ...state.width,
- current: action.width
- }
- };
- }
- case SET_USER_FILMSTRIP_WIDTH: {
- const { width } = action;
-
- return {
- ...state,
- width: {
- current: width,
- userSet: width
- }
- };
- }
- case SET_USER_IS_RESIZING: {
- return {
- ...state,
- isResizing: action.resizing
- };
- }
- case SET_STAGE_FILMSTRIP_DIMENSIONS: {
- return {
- ...state,
- stageFilmstripDimensions: action.dimensions
- };
- }
- case SET_STAGE_PARTICIPANTS: {
- return {
- ...state,
- activeParticipants: action.queue
- };
- }
- case REMOVE_STAGE_PARTICIPANT: {
- return {
- ...state,
- activeParticipants: state.activeParticipants.filter(p => p.participantId !== action.participantId)
- };
- }
- case SET_MAX_STAGE_PARTICIPANTS: {
- return {
- ...state,
- maxStageParticipants: action.maxParticipants
- };
- }
- case CLEAR_STAGE_PARTICIPANTS: {
- return {
- ...state,
- activeParticipants: []
- };
- }
- }
-
- return state;
- });
|