Add typescript paths to top level folders
[arvados-workbench2.git] / src / store / tree-picker / tree-picker-reducer.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { createTree, setNodeValueWith, TreeNode, setNode, mapTreeValues } from "~/models/tree";
6 import { TreePicker, TreePickerNode } from "./tree-picker";
7 import { treePickerActions, TreePickerAction } from "./tree-picker-actions";
8 import { TreeItemStatus } from "~/components/tree/tree";
9
10 export const treePickerReducer = (state: TreePicker = createTree(), action: TreePickerAction) =>
11     treePickerActions.match(action, {
12         LOAD_TREE_PICKER_NODE: ({ id }) =>
13             setNodeValueWith(setPending)(id)(state),
14         LOAD_TREE_PICKER_NODE_SUCCESS: ({ id, nodes }) => {
15             const [newState] = [state]
16                 .map(receiveNodes(nodes)(id))
17                 .map(setNodeValueWith(setLoaded)(id));
18             return newState;
19         },
20         TOGGLE_TREE_PICKER_NODE_COLLAPSE: ({ id }) =>
21             setNodeValueWith(toggleCollapse)(id)(state),
22         TOGGLE_TREE_PICKER_NODE_SELECT: ({ id }) =>
23             mapTreeValues(toggleSelect(id))(state),
24         default: () => state
25     });
26
27 const setPending = (value: TreePickerNode): TreePickerNode =>
28     ({ ...value, status: TreeItemStatus.PENDING });
29
30 const setLoaded = (value: TreePickerNode): TreePickerNode =>
31     ({ ...value, status: TreeItemStatus.LOADED });
32
33 const toggleCollapse = (value: TreePickerNode): TreePickerNode =>
34     ({ ...value, collapsed: !value.collapsed });
35
36 const toggleSelect = (id: string) => (value: TreePickerNode): TreePickerNode =>
37     value.id === id
38         ? ({ ...value, selected: !value.selected })
39         : ({ ...value, selected: false });
40
41 const receiveNodes = (nodes: Array<TreePickerNode>) => (parent: string) => (state: TreePicker) =>
42     nodes.reduce((tree, node) =>
43         setNode(
44             createTreeNode(parent)(node)
45         )(tree), state);
46
47 const createTreeNode = (parent: string) => (node: TreePickerNode): TreeNode<TreePickerNode> => ({
48     children: [],
49     id: node.id,
50     parent,
51     value: node
52 });