93 lines
2.3 KiB
JavaScript
93 lines
2.3 KiB
JavaScript
// @flow
|
|
|
|
import { ReducerRegistry } from '../base/redux';
|
|
import { PersistenceRegistry } from '../base/storage';
|
|
|
|
import {
|
|
ADD_KNOWN_DOMAIN,
|
|
SET_CALENDAR_AUTHORIZATION,
|
|
SET_CALENDAR_EVENTS
|
|
} from './actionTypes';
|
|
import { CALENDAR_ENABLED } from './constants';
|
|
|
|
const DEFAULT_STATE = {
|
|
/**
|
|
* Note: If features/calendar-sync ever gets persisted, do not persist the
|
|
* authorization value as it's needed to remain a runtime value to see if we
|
|
* need to re-request the calendar permission from the user.
|
|
*/
|
|
authorization: undefined,
|
|
events: [],
|
|
knownDomains: []
|
|
};
|
|
|
|
const MAX_DOMAIN_LIST_SIZE = 10;
|
|
|
|
const STORE_NAME = 'features/calendar-sync';
|
|
|
|
CALENDAR_ENABLED
|
|
&& PersistenceRegistry.register(STORE_NAME, {
|
|
knownDomains: true
|
|
});
|
|
|
|
CALENDAR_ENABLED
|
|
&& ReducerRegistry.register(STORE_NAME, (state = DEFAULT_STATE, action) => {
|
|
switch (action.type) {
|
|
case ADD_KNOWN_DOMAIN:
|
|
return _addKnownDomain(state, action);
|
|
|
|
case SET_CALENDAR_AUTHORIZATION:
|
|
return {
|
|
...state,
|
|
authorization: action.status
|
|
};
|
|
|
|
case SET_CALENDAR_EVENTS:
|
|
return {
|
|
...state,
|
|
events: action.events
|
|
};
|
|
|
|
default:
|
|
return state;
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Adds a new domain to the known domain list if not present yet.
|
|
*
|
|
* @param {Object} state - The redux state.
|
|
* @param {Object} action - The redux action.
|
|
* @private
|
|
* @returns {Object}
|
|
*/
|
|
function _addKnownDomain(state, action) {
|
|
let { knownDomain } = action;
|
|
|
|
if (knownDomain) {
|
|
knownDomain = knownDomain.toLowerCase();
|
|
|
|
let { knownDomains } = state;
|
|
|
|
if (knownDomains.indexOf(knownDomain) === -1) {
|
|
// Add the specified known domain and at the same time avoid
|
|
// modifying the knownDomains Array instance referenced by the
|
|
// current redux state.
|
|
knownDomains = [
|
|
...state.knownDomains,
|
|
knownDomain
|
|
];
|
|
|
|
// Ensure the list doesn't exceed a/the maximum size.
|
|
knownDomains.splice(0, knownDomains.length - MAX_DOMAIN_LIST_SIZE);
|
|
|
|
return {
|
|
...state,
|
|
knownDomains
|
|
};
|
|
}
|
|
}
|
|
|
|
return state;
|
|
}
|