UNPKG

auspice

Version:

Web app for visualizing pathogen evolution

90 lines (85 loc) 2.84 kB
import { AnyAction } from "@reduxjs/toolkit"; import { getDefaultTreeState } from "."; import { addNodeAttrs, removeNodeAttrs } from "../../util/treeMiscHelpers"; import * as types from "../../actions/types"; import { TreeTooState } from "./types"; const treeToo = ( state: TreeTooState = getDefaultTreeState(), action: AnyAction, ): TreeTooState => { /* There are only a few actions we should always listen for, as they can change the presence / absence of the second tree */ switch (action.type) { case types.DATA_INVALID: return { ...state, loaded: false, }; case types.URL_QUERY_CHANGE_WITH_COMPUTED_STATE: /* fallthrough */ case types.CLEAN_START: if (action.treeToo) { return action.treeToo; } return getDefaultTreeState(); case types.TREE_TOO_DATA: return action.treeToo; default: // no default case } /* All other actions can only modify an existing tree, so if one doesn't exist then return early */ if (!state.loaded) { return state; } switch (action.type) { case types.REMOVE_TREE_TOO: return getDefaultTreeState(); case types.CHANGE_DATES_VISIBILITY_THICKNESS: /* fallthrough */ case types.UPDATE_VISIBILITY_AND_BRANCH_THICKNESS: if (action.tangleTipLookup) { return { ...state, tangleTipLookup: action.tangleTipLookup, visibility: action.visibilityToo, visibilityVersion: action.visibilityVersionToo, branchThickness: action.branchThicknessToo, branchThicknessVersion: action.branchThicknessVersionToo, idxOfInViewRootNode: action.idxOfInViewRootNodeToo, idxOfFilteredRoot: action.idxOfFilteredRootToo, focusNodes: action.focusNodesTreeToo, }; } return state; case types.SET_FOCUS: return { ...state, focusNodes: action.focusNodesTreeToo || undefined, } case types.UPDATE_TIP_RADII: return { ...state, tipRadii: action.dataToo, tipRadiiVersion: action.version, }; case types.NEW_COLORS: if (action.nodeColorsToo) { return { ...state, nodeColors: action.nodeColorsToo, nodeColorsVersion: action.version, }; } return state; case types.ADD_EXTRA_METADATA: // add data into `nodes` in-place, so no redux update will be triggered if you only listen to `nodes` addNodeAttrs(state.nodes, action.newNodeAttrs); return state; case types.REMOVE_METADATA: // remove data from `nodes` in-place, so no redux update will be triggered if you only listen to `nodes` removeNodeAttrs(state.nodes, action.nodeAttrsToRemove); return state; default: return state; } }; export default treeToo;