| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 | // @flow
import { assign, ReducerRegistry } from '../base/redux';
import {
    CANCEL_LOGIN,
    STOP_WAIT_FOR_OWNER,
    UPGRADE_ROLE_FINISHED,
    UPGRADE_ROLE_STARTED,
    WAIT_FOR_OWNER
} from './actionTypes';
/**
 * Listens for actions which change the state of the authentication feature.
 *
 * @param {Object} state - The Redux state of the authentication feature.
 * @param {Object} action - Action object.
 * @param {string} action.type - Type of action.
 * @returns {Object}
 */
ReducerRegistry.register('features/authentication', (state = {}, action) => {
    switch (action.type) {
    case CANCEL_LOGIN:
        return assign(state, {
            error: undefined,
            progress: undefined,
            thenableWithCancel: undefined
        });
    case STOP_WAIT_FOR_OWNER:
        return assign(state, {
            error: undefined,
            waitForOwnerTimeoutID: undefined
        });
    case UPGRADE_ROLE_FINISHED: {
        let { thenableWithCancel } = action;
        if (state.thenableWithCancel === thenableWithCancel) {
            const { error, progress } = action;
            // An error interrupts the process of authenticating and upgrading
            // the role of the local participant/user i.e. the process is no
            // more. Obviously, the process seizes to exist also when it does
            // its whole job.
            if (error || progress === 1) {
                thenableWithCancel = undefined;
            }
            return assign(state, {
                error,
                progress: progress || undefined,
                thenableWithCancel
            });
        }
        break;
    }
    case UPGRADE_ROLE_STARTED:
        return assign(state, {
            error: undefined,
            progress: undefined,
            thenableWithCancel: action.thenableWithCancel
        });
    case WAIT_FOR_OWNER:
        return assign(state, {
            waitForOwnerTimeoutID: action.waitForOwnerTimeoutID
        });
    }
    return state;
});
 |