Some checks failed
Close stale issues and PRs / stale (push) Has been cancelled
133 lines
3.6 KiB
TypeScript
133 lines
3.6 KiB
TypeScript
import { CONFERENCE_PROPERTIES_CHANGED, CONFERENCE_WILL_LEAVE } from '../base/conference/actionTypes';
|
|
import ReducerRegistry from '../base/redux/ReducerRegistry';
|
|
|
|
import {
|
|
CLEAR_VISITOR_PROMOTION_REQUEST,
|
|
I_AM_VISITOR_MODE,
|
|
SET_IN_VISITORS_QUEUE,
|
|
SET_VISITORS_SUPPORTED,
|
|
SET_VISITOR_DEMOTE_ACTOR,
|
|
SUBSCRIBE_VISITORS_LIST,
|
|
UPDATE_VISITORS_IN_QUEUE_COUNT,
|
|
UPDATE_VISITORS_LIST,
|
|
VISITOR_PROMOTION_REQUEST
|
|
} from './actionTypes';
|
|
import { IPromotionRequest, IVisitorListParticipant } from './types';
|
|
|
|
const DEFAULT_STATE = {
|
|
count: 0,
|
|
iAmVisitor: false,
|
|
inQueue: false,
|
|
inQueueCount: 0,
|
|
showNotification: false,
|
|
supported: false,
|
|
promotionRequests: [],
|
|
visitors: [] as IVisitorListParticipant[],
|
|
visitorsListSubscribed: false
|
|
};
|
|
|
|
export interface IVisitorsState {
|
|
count?: number;
|
|
demoteActorDisplayName?: string;
|
|
iAmVisitor: boolean;
|
|
inQueue: boolean;
|
|
inQueueCount?: number;
|
|
promotionRequests: IPromotionRequest[];
|
|
supported: boolean;
|
|
visitors: IVisitorListParticipant[];
|
|
visitorsListSubscribed: boolean;
|
|
}
|
|
ReducerRegistry.register<IVisitorsState>('features/visitors', (state = DEFAULT_STATE, action): IVisitorsState => {
|
|
switch (action.type) {
|
|
case CONFERENCE_PROPERTIES_CHANGED: {
|
|
const visitorCount = Number(action.properties?.['visitor-count']);
|
|
|
|
if (!isNaN(visitorCount) && state.count !== visitorCount) {
|
|
return {
|
|
...state,
|
|
count: visitorCount
|
|
};
|
|
}
|
|
|
|
break;
|
|
}
|
|
case CONFERENCE_WILL_LEAVE: {
|
|
return {
|
|
...state,
|
|
...DEFAULT_STATE,
|
|
|
|
// If the action was called because a visitor was promoted don't clear the iAmVisitor field. It will be set
|
|
// to false with the I_AM_VISITOR_MODE action and we will be able to distinguish leaving the conference use
|
|
// case and promoting a visitor use case.
|
|
iAmVisitor: action.isRedirect ? state.iAmVisitor : DEFAULT_STATE.iAmVisitor
|
|
};
|
|
}
|
|
case UPDATE_VISITORS_IN_QUEUE_COUNT: {
|
|
if (state.inQueueCount === action.count) {
|
|
return state;
|
|
}
|
|
|
|
return {
|
|
...state,
|
|
inQueueCount: action.count
|
|
};
|
|
}
|
|
case I_AM_VISITOR_MODE: {
|
|
return {
|
|
...state,
|
|
iAmVisitor: action.enabled
|
|
};
|
|
}
|
|
case SET_IN_VISITORS_QUEUE: {
|
|
return {
|
|
...state,
|
|
inQueue: action.value
|
|
};
|
|
}
|
|
case SET_VISITOR_DEMOTE_ACTOR: {
|
|
return {
|
|
...state,
|
|
demoteActorDisplayName: action.displayName
|
|
};
|
|
}
|
|
case SET_VISITORS_SUPPORTED: {
|
|
return {
|
|
...state,
|
|
supported: action.value
|
|
};
|
|
}
|
|
case SUBSCRIBE_VISITORS_LIST: {
|
|
return {
|
|
...state,
|
|
visitorsListSubscribed: true
|
|
};
|
|
}
|
|
case UPDATE_VISITORS_LIST: {
|
|
return {
|
|
...state,
|
|
visitors: action.visitors
|
|
};
|
|
}
|
|
case VISITOR_PROMOTION_REQUEST: {
|
|
const currentRequests = state.promotionRequests || [];
|
|
|
|
return {
|
|
...state,
|
|
promotionRequests: [ ...currentRequests, action.request ]
|
|
};
|
|
}
|
|
case CLEAR_VISITOR_PROMOTION_REQUEST: {
|
|
let currentRequests = state.promotionRequests || [];
|
|
|
|
currentRequests = currentRequests.filter(r => r.from !== action.request.from);
|
|
|
|
return {
|
|
...state,
|
|
promotionRequests: currentRequests
|
|
};
|
|
}
|
|
}
|
|
|
|
return state;
|
|
});
|