in src/providers/LiveEventMessagesProvider/state.ts [43:208]
export function reducer(state: State, action: Action) {
const { type, payload } = action;
switch (type) {
case Type.INIT_MESSAGES: {
const messages = [];
const queuedMessages = [];
for (let i = 0; i < payload.length; i++) {
const message = payload[i];
const inLocalQueue = message.QueueId === state.attendeeId;
const formattedMessage: any = {
payload: {
inLocalQueue,
name: message.Name,
message: message.Question,
attendeeId: message.AttendeeId,
liveEventId: message.LiveEventId,
queueId: message.QueueId || null,
},
};
if (inLocalQueue) {
queuedMessages.push(formattedMessage);
} else {
messages.push(formattedMessage);
}
}
return {
...state,
messages,
queuedMessages,
};
}
case Type.ADD_MESSAGE: {
const inQueue =
state.queuedMessages.filter(
msg => msg?.payload?.attendeeId === payload?.payload?.attendeeId
).length > 0;
const wasQueued = state.queuedAttendeeIds.find(
attendeeId => attendeeId === payload?.payload?.attendeeId
);
if (inQueue) {
return state;
}
if (wasQueued) {
return {
...state,
queuedMessages: [...state.queuedMessages, payload],
};
}
const inMessages =
state.messages.filter(
msg => msg?.payload?.attendeeId === payload?.payload?.attendeeId
).length > 0;
if (inMessages) {
return state;
}
return {
...state,
messages: [...state.messages, payload],
};
}
case Type.QUEUE_MESSAGE: {
const queuedMessages = [...state.queuedMessages];
const queuedAttendeeIds = [...state.queuedAttendeeIds];
const targetMessage = state.messages.find(
msg => msg?.payload?.attendeeId === payload
);
targetMessage && queuedMessages.push(targetMessage);
const messages = state.messages.filter(
msg => msg?.payload?.attendeeId !== payload
);
if (queuedAttendeeIds.indexOf(payload) === -1) {
queuedAttendeeIds.push(payload);
}
return {
...state,
messages,
queuedMessages,
queuedAttendeeIds,
};
}
case Type.REMOVE_QUEUED_MESSAGE: {
const { attendeeId, event } = payload as RemoveMessagePayload;
let queuedAttendeeIds = [...state.queuedAttendeeIds];
let queuedMessages = [...state.queuedMessages];
if (event === RemoveMessageEventType.MODERATOR_REMOVE_CLICK) {
queuedAttendeeIds = state.queuedAttendeeIds.filter(
id => id !== attendeeId
);
}
queuedMessages = state.queuedMessages.filter(
msg => msg?.payload?.attendeeId !== attendeeId
);
return {
...state,
queuedMessages,
queuedAttendeeIds,
};
}
case Type.REMOVE_MESSAGE: {
const { attendeeId } = payload as RemoveMessagePayload;
const messages = state.messages.filter(
msg => msg?.payload?.attendeeId !== attendeeId
);
return {
...state,
messages,
};
}
case Type.REMOVE_ATTENDEE_MESSAGE: {
const { attendeeId } = payload as RemoveMessagePayload;
const messages = state.messages.filter(
msg => msg?.payload?.attendeeId !== attendeeId
);
const queuedMessages = state.queuedMessages.filter(
msg => msg?.payload?.attendeeId !== attendeeId
);
if (
messages.length === state.messages.length &&
queuedMessages.length === state.queuedMessages.length
) {
return state;
}
return {
...state,
messages,
queuedMessages,
};
}
case Type.UPDATE_HAND_RAISE: {
let updated = false;
const messages = state.messages.map(msg => {
if (msg.payload?.attendeeId === payload.AttendeeId) {
updated = true;
const inLocalQueue = payload.QueueId === state.attendeeId;
return {
payload: { ...msg.payload, inLocalQueue, queueId: payload.QueueId },
};
}
return msg;
});
if (updated) {
return { ...state, messages };
}
return state;
}
default:
return state;
}
}