This commit is contained in:
23
react/features/polls-history/actionTypes.ts
Normal file
23
react/features/polls-history/actionTypes.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
* The type of the action which signals that we need to remove poll from the history(local storage).
|
||||
*
|
||||
* {
|
||||
* type: REMOVE_POLL_FROM_HISTORY,
|
||||
* meetingId: string,
|
||||
* pollId: string,
|
||||
* poll: IPoll
|
||||
* }
|
||||
*/
|
||||
export const REMOVE_POLL_FROM_HISTORY = 'REMOVE_POLL_FROM_HISTORY';
|
||||
|
||||
/**
|
||||
* The type of the action triggered when the poll is saved in history(local storage).
|
||||
*
|
||||
* {
|
||||
* type: SAVE_POLL_IN_HISTORY,
|
||||
* poll: Poll,
|
||||
* pollId: string,
|
||||
* saved: boolean
|
||||
* }
|
||||
*/
|
||||
export const SAVE_POLL_IN_HISTORY = 'SAVE_POLL_IN_HISTORY';
|
||||
47
react/features/polls-history/actions.ts
Normal file
47
react/features/polls-history/actions.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
import { IPoll } from '../polls/types';
|
||||
|
||||
import { REMOVE_POLL_FROM_HISTORY, SAVE_POLL_IN_HISTORY } from './actionTypes';
|
||||
|
||||
/**
|
||||
* Action to signal saving a poll in history(local storage).
|
||||
*
|
||||
* @param {string} meetingId - The id of the meeting in which polls get to be saved.
|
||||
* @param {string} pollId - The id of the poll that gets to be saved.
|
||||
* @param {IPoll} poll - The Poll object that gets to be saved.
|
||||
* @returns {{
|
||||
* type: SAVE_POLL_IN_HISTORY,
|
||||
* meetingId: string,
|
||||
* pollId: string,
|
||||
* poll: IPoll
|
||||
* }}
|
||||
*/
|
||||
export function savePollInHistory(meetingId: string | undefined, pollId: string, poll: IPoll) {
|
||||
return {
|
||||
type: SAVE_POLL_IN_HISTORY,
|
||||
meetingId,
|
||||
pollId,
|
||||
poll
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Action to signal that existing poll needs to be deleted from history(local storage).
|
||||
*
|
||||
* @param {string} meetingId - The id of the meeting in which poll gets to be removed.
|
||||
* @param {string} pollId - The id of the poll that gets to be removed.
|
||||
* @param {IPoll} poll - The incoming IPoll object.
|
||||
* @returns {{
|
||||
* type: REMOVE_POLL_FROM_HISTORY,
|
||||
* meetingId: string,
|
||||
* pollId: string,
|
||||
* poll: IPoll
|
||||
* }}
|
||||
*/
|
||||
export const removePollFromHistory = (meetingId: string | undefined, pollId: string, poll: IPoll) => {
|
||||
return {
|
||||
type: REMOVE_POLL_FROM_HISTORY,
|
||||
meetingId,
|
||||
pollId,
|
||||
poll
|
||||
};
|
||||
};
|
||||
46
react/features/polls-history/middleware.ts
Normal file
46
react/features/polls-history/middleware.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
import { CONFERENCE_JOINED } from '../base/conference/actionTypes';
|
||||
import MiddlewareRegistry from '../base/redux/MiddlewareRegistry';
|
||||
import { REMOVE_POLL, SAVE_POLL } from '../polls/actionTypes';
|
||||
import { savePoll } from '../polls/actions';
|
||||
|
||||
import { removePollFromHistory, savePollInHistory } from './actions';
|
||||
|
||||
MiddlewareRegistry.register(({ dispatch, getState }) => next => action => {
|
||||
const result = next(action);
|
||||
const { room: meetingId } = getState()['features/base/conference'];
|
||||
|
||||
switch (action.type) {
|
||||
|
||||
case CONFERENCE_JOINED: {
|
||||
const state = getState();
|
||||
const pollsHistory = meetingId && state['features/polls-history'].polls?.[meetingId];
|
||||
|
||||
if (!pollsHistory) {
|
||||
return null;
|
||||
}
|
||||
|
||||
for (const key in pollsHistory) {
|
||||
if (pollsHistory.hasOwnProperty(key) && pollsHistory[key].saved) {
|
||||
dispatch(savePoll(key, pollsHistory[key]));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case REMOVE_POLL: {
|
||||
const { poll, pollId } = action;
|
||||
|
||||
dispatch(removePollFromHistory(meetingId, pollId, poll));
|
||||
break;
|
||||
}
|
||||
|
||||
case SAVE_POLL: {
|
||||
const { poll, pollId } = action;
|
||||
|
||||
dispatch(savePollInHistory(meetingId, pollId, poll));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
});
|
||||
52
react/features/polls-history/reducer.ts
Normal file
52
react/features/polls-history/reducer.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
import PersistenceRegistry from '../base/redux/PersistenceRegistry';
|
||||
import ReducerRegistry from '../base/redux/ReducerRegistry';
|
||||
import { IPoll } from '../polls/types';
|
||||
|
||||
import { REMOVE_POLL_FROM_HISTORY, SAVE_POLL_IN_HISTORY } from './actionTypes';
|
||||
|
||||
const INITIAL_STATE = {
|
||||
polls: {}
|
||||
};
|
||||
|
||||
export interface IPollsHistoryState {
|
||||
polls: {
|
||||
[meetingId: string]: {
|
||||
[pollId: string]: IPoll;
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
const STORE_NAME = 'features/polls-history';
|
||||
|
||||
PersistenceRegistry.register(STORE_NAME, INITIAL_STATE);
|
||||
|
||||
ReducerRegistry.register<IPollsHistoryState>(STORE_NAME, (state = INITIAL_STATE, action): IPollsHistoryState => {
|
||||
switch (action.type) {
|
||||
|
||||
case REMOVE_POLL_FROM_HISTORY: {
|
||||
if (Object.keys(state.polls[action.meetingId] ?? {})?.length === 1) {
|
||||
delete state.polls[action.meetingId];
|
||||
} else {
|
||||
delete state.polls[action.meetingId]?.[action.pollId];
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
case SAVE_POLL_IN_HISTORY: {
|
||||
return {
|
||||
...state,
|
||||
polls: {
|
||||
...state.polls,
|
||||
[action.meetingId]: {
|
||||
...state.polls[action.meetingId],
|
||||
[action.pollId]: action.poll
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
default:
|
||||
return state;
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user