var actionTypes = require( './../actionTypes' ), nextState = require( './nextState' ); /** * Reducer for actions that modify the state of the preview model * * @param {Object} state before action * @param {Object} action Redux action that modified state. * Must have `type` property. * @return {Object} state after action */ module.exports = function ( state, action ) { if ( state === undefined ) { state = { enabled: undefined, activeLink: undefined, activeEvent: undefined, activeToken: '', shouldShow: false, isUserDwelling: false }; } switch ( action.type ) { case actionTypes.BOOT: return nextState( state, { enabled: action.isEnabled } ); case actionTypes.SETTINGS_CHANGE: return nextState( state, { enabled: action.enabled } ); case actionTypes.LINK_DWELL: // New interaction if ( action.el !== state.activeLink ) { return nextState( state, { activeLink: action.el, activeEvent: action.event, activeToken: action.token, // When the user dwells on a link with their keyboard, a preview is // renderered, and then dwells on another link, the ABANDON_END // action will be ignored. // // Ensure that all the preview is hidden. shouldShow: false, isUserDwelling: true } ); } else { // Dwelling back into the same link return nextState( state, { isUserDwelling: true } ); } case actionTypes.ABANDON_END: if ( action.token === state.activeToken && !state.isUserDwelling ) { return nextState( state, { activeLink: undefined, activeToken: undefined, activeEvent: undefined, fetchResponse: undefined, shouldShow: false } ); } return state; case actionTypes.PREVIEW_DWELL: return nextState( state, { isUserDwelling: true } ); case actionTypes.ABANDON_START: return nextState( state, { isUserDwelling: false } ); case actionTypes.FETCH_START: return nextState( state, { fetchResponse: undefined } ); case actionTypes.FETCH_COMPLETE: if ( action.token === state.activeToken ) { return nextState( state, { fetchResponse: action.result, shouldShow: true } ); } /* falls through */ default: return state; } };