jiti-meet/react/features/calendar-sync/reducer.js

82 lines
2.0 KiB
JavaScript

// @flow
import { ReducerRegistry } from '../base/redux';
import { PersistenceRegistry } from '../base/storage';
import {
CALENDAR_ACCESS_REQUESTED,
NEW_CALENDAR_ENTRY_LIST,
NEW_KNOWN_DOMAIN
} from './actionTypes';
const DEFAULT_STATE = {
/**
* Note: If features/calendar-sync ever gets persisted, do not persist the
* calendarAccessStatus value as it's needed to remain a runtime value to
* see if we need to re-request the calendar permission from the user.
*/
calendarAccessStatus: undefined,
events: [],
knownDomains: []
};
const MAX_DOMAIN_LIST_SIZE = 10;
const STORE_NAME = 'features/calendar-sync';
PersistenceRegistry.register(STORE_NAME, {
knownDomains: true
});
ReducerRegistry.register(
STORE_NAME,
(state = DEFAULT_STATE, action) => {
switch (action.type) {
case CALENDAR_ACCESS_REQUESTED:
return {
...state,
calendarAccessStatus: action.status
};
case NEW_CALENDAR_ENTRY_LIST:
return {
...state,
events: action.events
};
case NEW_KNOWN_DOMAIN:
return _maybeAddNewDomain(state, action);
default:
return state;
}
});
/**
* Adds a new domain to the known domain list if not present yet.
*
* @private
* @param {Object} state - The redux state.
* @param {Object} action - The redux action.
* @returns {Object}
*/
function _maybeAddNewDomain(state, action) {
let { domainName } = action;
const { knownDomains } = state;
if (domainName && domainName.length) {
domainName = domainName.toLowerCase();
if (knownDomains.indexOf(domainName) === -1) {
knownDomains.push(domainName);
// Ensure the list doesn't exceed a/the maximum size.
knownDomains.splice(0, knownDomains.length - MAX_DOMAIN_LIST_SIZE);
}
}
return {
...state,
knownDomains
};
}