123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- // @flow
-
- import { PersistencyRegistry, ReducerRegistry } from '../base/redux';
-
- import {
- STORE_CURRENT_CONFERENCE,
- UPDATE_CONFERENCE_DURATION
- } from './actionTypes';
- import { LIST_SIZE } from './constants';
-
- /**
- * The initial state of this feature.
- */
- const DEFAULT_STATE = {
- list: []
- };
-
- /**
- * The Redux subtree of this feature.
- */
- const STORE_NAME = 'features/recent-list';
-
- /**
- * Registers the redux store subtree of this feature for persistency.
- */
- PersistencyRegistry.register(STORE_NAME, {
- list: true
- });
-
- /**
- * Reduces the Redux actions of the feature features/recent-list.
- */
- ReducerRegistry.register(STORE_NAME, (state = DEFAULT_STATE, action) => {
- switch (action.type) {
- case STORE_CURRENT_CONFERENCE:
- return _storeCurrentConference(state, action);
-
- case UPDATE_CONFERENCE_DURATION:
- return _updateConferenceDuration(state, action);
-
- default:
- return state;
- }
- });
-
- /**
- * Adds a new list entry to the redux store.
- *
- * @param {Object} state - The redux state.
- * @param {Object} action - The redux action.
- * @returns {Object}
- */
- function _storeCurrentConference(state, action) {
- const { locationURL } = action;
- const conference = locationURL.href;
-
- // If the current conference is already in the list, we remove it to re-add
- // it to the top.
- const list = state.list.filter(e => e.conference !== conference);
-
- // This is a reverse sorted array (i.e. newer elements at the end).
- list.push({
- conference,
- conferenceDuration: 0, // we don't have this data yet
- date: Date.now()
- });
-
- // maximising the size
- list.splice(0, list.length - LIST_SIZE);
-
- return {
- list
- };
- }
-
- /**
- * Updates the conference length when left.
- *
- * @param {Object} state - The redux state.
- * @param {Object} action - The redux action.
- * @returns {Object}
- */
- function _updateConferenceDuration(state, action) {
- const { locationURL } = action;
-
- if (locationURL && locationURL.href) {
- const list = state.list;
-
- if (list.length > 0) {
- const mostRecentURL = list[list.length - 1];
-
- if (mostRecentURL.conference === locationURL.href) {
- // The last conference start was stored so we need to update the
- // length.
- mostRecentURL.conferenceDuration
- = Date.now() - mostRecentURL.date;
-
- return {
- list
- };
- }
- }
- }
-
- return state;
- }
|