import * as _ from "lodash";
-import actions, { ProjectAction } from "./project-action";
-import { TreeItem, TreeItemStatus } from "../../components/tree/tree";
-import { ProjectResource } from "../../models/project";
+import { projectActions, ProjectAction } from "./project-action";
+import { TreeItem, TreeItemStatus } from "~/components/tree/tree";
+import { ProjectResource } from "~/models/project";
export type ProjectState = {
items: Array<TreeItem<ProjectResource>>,
currentItemId: string,
- creator: ProjectCreator
+ creator: ProjectCreator,
+ updater: ProjectUpdater
};
interface ProjectCreator {
opened: boolean;
- pending: boolean;
ownerUuid: string;
error?: string;
}
+interface ProjectUpdater {
+ opened: boolean;
+ uuid: string;
+}
+
export function findTreeItem<T>(tree: Array<TreeItem<T>>, itemId: string): TreeItem<T> | undefined {
let item;
for (const t of tree) {
if (parentItemId) {
treeItem = findTreeItem(tree, parentItemId);
if (treeItem) {
- treeItem.status = TreeItemStatus.Loaded;
+ treeItem.status = TreeItemStatus.LOADED;
}
}
const items = projects.map(p => ({
id: p.uuid,
open: false,
active: false,
- status: TreeItemStatus.Initial,
+ status: TreeItemStatus.INITIAL,
data: p,
items: []
} as TreeItem<ProjectResource>));
}
});
+const updateProject = (state: ProjectState, updater?: Partial<ProjectUpdater>) => ({
+ ...state,
+ updater: {
+ ...state.updater,
+ ...updater
+ }
+});
+
const initialState: ProjectState = {
items: [],
currentItemId: "",
creator: {
opened: false,
- pending: false,
ownerUuid: ""
+ },
+ updater: {
+ opened: false,
+ uuid: ''
}
};
-const projectsReducer = (state: ProjectState = initialState, action: ProjectAction) => {
- return actions.match(action, {
+export const projectsReducer = (state: ProjectState = initialState, action: ProjectAction) => {
+ return projectActions.match(action, {
OPEN_PROJECT_CREATOR: ({ ownerUuid }) => updateCreator(state, { ownerUuid, opened: true }),
CLOSE_PROJECT_CREATOR: () => updateCreator(state, { opened: false }),
CREATE_PROJECT: () => updateCreator(state, { error: undefined }),
CREATE_PROJECT_SUCCESS: () => updateCreator(state, { opened: false, ownerUuid: "" }),
+ OPEN_PROJECT_UPDATER: ({ uuid }) => updateProject(state, { uuid, opened: true }),
+ CLOSE_PROJECT_UPDATER: () => updateProject(state, { opened: false, uuid: "" }),
+ UPDATE_PROJECT_SUCCESS: () => updateProject(state, { opened: false, uuid: "" }),
REMOVE_PROJECT: () => state,
PROJECTS_REQUEST: itemId => {
const items = _.cloneDeep(state.items);
const item = findTreeItem(items, itemId);
if (item) {
- item.status = TreeItemStatus.Pending;
+ item.status = TreeItemStatus.PENDING;
state.items = items;
}
return { ...state, items };
const items = _.cloneDeep(state.items);
const item = findTreeItem(items, itemId);
if (item) {
- item.toggled = true;
item.open = !item.open;
}
return {
resetTreeActivity(items);
const item = findTreeItem(items, itemId);
if (item) {
- item.toggled = true;
item.active = true;
}
return {
default: () => state
});
};
-
-export default projectsReducer;