| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 | // @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;
}
 |