You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

reducer.js 1.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // @flow
  2. import { ReducerRegistry } from '../base/redux';
  3. import { PersistenceRegistry } from '../base/storage';
  4. import { NEW_CALENDAR_ENTRY_LIST, NEW_KNOWN_DOMAIN } from './actionTypes';
  5. /**
  6. * ZB: this is an object, as further data is to come here, like:
  7. * - known domain list
  8. */
  9. const DEFAULT_STATE = {
  10. events: [],
  11. knownDomains: []
  12. };
  13. const MAX_DOMAIN_LIST_SIZE = 10;
  14. const STORE_NAME = 'features/calendar-sync';
  15. PersistenceRegistry.register(STORE_NAME, {
  16. knownDomains: true
  17. });
  18. ReducerRegistry.register(
  19. STORE_NAME,
  20. (state = DEFAULT_STATE, action) => {
  21. switch (action.type) {
  22. case NEW_CALENDAR_ENTRY_LIST:
  23. return {
  24. ...state,
  25. events: action.events
  26. };
  27. case NEW_KNOWN_DOMAIN:
  28. return _maybeAddNewDomain(state, action);
  29. default:
  30. return state;
  31. }
  32. });
  33. /**
  34. * Adds a new domain to the known domain list if not present yet.
  35. *
  36. * @private
  37. * @param {Object} state - The redux state.
  38. * @param {Object} action - The redux action.
  39. * @returns {Object}
  40. */
  41. function _maybeAddNewDomain(state, action) {
  42. let { domainName } = action;
  43. const { knownDomains } = state;
  44. if (domainName && domainName.length) {
  45. domainName = domainName.toLowerCase();
  46. if (knownDomains.indexOf(domainName) === -1) {
  47. knownDomains.push(domainName);
  48. // Ensure the list doesn't exceed a/the maximum size.
  49. knownDomains.splice(0, knownDomains.length - MAX_DOMAIN_LIST_SIZE);
  50. }
  51. }
  52. return {
  53. ...state,
  54. knownDomains
  55. };
  56. }