/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; const { assert, immutableUpdate, } = require("resource://devtools/shared/DevToolsUtils.js"); const { actions, individualsState, viewState, } = require("resource://devtools/client/memory/constants.js"); const handlers = Object.create(null); handlers[actions.POP_VIEW] = function (_state, _action) { return null; }; handlers[actions.CHANGE_VIEW] = function (individuals, { newViewState }) { if (newViewState === viewState.INDIVIDUALS) { assert( !individuals, "Should not switch to individuals view when already in individuals view" ); return Object.freeze({ state: individualsState.COMPUTING_DOMINATOR_TREE, }); } return null; }; handlers[actions.FOCUS_INDIVIDUAL] = function (individuals, { node }) { assert(individuals, "Should have individuals"); return immutableUpdate(individuals, { focused: node }); }; handlers[actions.FETCH_INDIVIDUALS_START] = function (individuals) { assert(individuals, "Should have individuals"); return Object.freeze({ state: individualsState.FETCHING, focused: individuals.focused, }); }; handlers[actions.FETCH_INDIVIDUALS_END] = function (individuals, action) { assert(individuals, "Should have individuals"); assert(!individuals.nodes, "Should not have nodes"); assert( individuals.state === individualsState.FETCHING, "Should only end fetching individuals after starting." ); const focused = individuals.focused ? action.nodes.find(n => n.nodeId === individuals.focused.nodeId) : null; return Object.freeze({ state: individualsState.FETCHED, nodes: action.nodes, id: action.id, censusBreakdown: action.censusBreakdown, indices: action.indices, labelDisplay: action.labelDisplay, focused, dominatorTree: action.dominatorTree, }); }; handlers[actions.INDIVIDUALS_ERROR] = function (_, { error }) { return Object.freeze({ error, nodes: null, state: individualsState.ERROR, }); }; module.exports = function (individuals = null, action) { const handler = handlers[action.type]; return handler ? handler(individuals, action) : individuals; };