You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

201 lines
5.8 KiB
TypeScript

// Copyright (C) 2020-2021 Intel Corporation
//
// SPDX-License-Identifier: MIT
import { AnyAction } from 'redux';
import { ProjectsActionTypes } from 'actions/projects-actions';
import { BoundariesActionTypes } from 'actions/boundaries-actions';
import { AuthActionTypes } from 'actions/auth-actions';
import { Project, ProjectsState } from './interfaces';
const defaultState: ProjectsState = {
initialized: false,
fetching: false,
count: 0,
current: [],
gettingQuery: {
page: 1,
id: null,
search: null,
owner: null,
assignee: null,
name: null,
status: null,
},
activities: {
deletes: {},
creates: {
id: null,
error: '',
},
},
};
export default (state: ProjectsState = defaultState, action: AnyAction): ProjectsState => {
switch (action.type) {
case ProjectsActionTypes.UPDATE_PROJECTS_GETTING_QUERY:
return {
...state,
gettingQuery: {
...defaultState.gettingQuery,
...action.payload.query,
},
};
case ProjectsActionTypes.GET_PROJECTS:
return {
...state,
initialized: false,
fetching: true,
count: 0,
current: [],
};
case ProjectsActionTypes.GET_PROJECTS_SUCCESS: {
const combinedWithPreviews = action.payload.array.map(
(project: any, index: number): Project => ({
instance: project,
preview: action.payload.previews[index],
}),
);
return {
...state,
initialized: true,
fetching: false,
count: action.payload.count,
current: combinedWithPreviews,
};
}
case ProjectsActionTypes.GET_PROJECTS_FAILED: {
return {
...state,
initialized: true,
fetching: false,
};
}
case ProjectsActionTypes.CREATE_PROJECT: {
return {
...state,
activities: {
...state.activities,
creates: {
id: null,
error: '',
},
},
};
}
case ProjectsActionTypes.CREATE_PROJECT_FAILED: {
return {
...state,
activities: {
...state.activities,
creates: {
...state.activities.creates,
error: action.payload.error.toString(),
},
},
};
}
case ProjectsActionTypes.CREATE_PROJECT_SUCCESS: {
return {
...state,
activities: {
...state.activities,
creates: {
id: action.payload.projectId,
error: '',
},
},
};
}
case ProjectsActionTypes.UPDATE_PROJECT: {
return {
...state,
};
}
case ProjectsActionTypes.UPDATE_PROJECT_SUCCESS: {
return {
...state,
current: state.current.map(
(project): Project => ({
...project,
instance:
project.instance.id === action.payload.project.id ?
action.payload.project :
project.instance,
}),
),
};
}
case ProjectsActionTypes.UPDATE_PROJECT_FAILED: {
return {
...state,
current: state.current.map(
(project): Project => ({
...project,
instance:
project.instance.id === action.payload.project.id ?
action.payload.project :
project.instance,
}),
),
};
}
case ProjectsActionTypes.DELETE_PROJECT: {
const { projectId } = action.payload;
const { deletes } = state.activities;
deletes[projectId] = false;
return {
...state,
activities: {
...state.activities,
deletes: {
...deletes,
},
},
};
}
case ProjectsActionTypes.DELETE_PROJECT_SUCCESS: {
const { projectId } = action.payload;
const { deletes } = state.activities;
deletes[projectId] = true;
return {
...state,
activities: {
...state.activities,
deletes: {
...deletes,
},
},
};
}
case ProjectsActionTypes.DELETE_PROJECT_FAILED: {
const { projectId } = action.payload;
const { deletes } = state.activities;
delete deletes[projectId];
return {
...state,
activities: {
...state.activities,
deletes: {
...deletes,
},
},
};
}
case BoundariesActionTypes.RESET_AFTER_ERROR:
case AuthActionTypes.LOGOUT_SUCCESS: {
return { ...defaultState };
}
default:
return state;
}
};