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.

361 lines
11 KiB
TypeScript

// Copyright (C) 2020-2022 Intel Corporation
//
// SPDX-License-Identifier: MIT
import { AnyAction } from 'redux';
import { omit } from 'lodash';
import { BoundariesActionTypes } from 'actions/boundaries-actions';
import { TasksActionTypes } from 'actions/tasks-actions';
import { AuthActionTypes } from 'actions/auth-actions';
import { TasksState, Task } from './interfaces';
const defaultState: TasksState = {
initialized: false,
fetching: false,
updating: false,
hideEmpty: false,
moveTask: {
modalVisible: false,
taskId: null,
},
count: 0,
current: [],
gettingQuery: {
page: 1,
id: null,
search: null,
filter: null,
sort: null,
projectId: null,
},
activities: {
loads: {},
deletes: {},
creates: {
taskId: null,
status: '',
error: '',
},
backups: {},
},
importing: false,
};
export default (state: TasksState = defaultState, action: AnyAction): TasksState => {
switch (action.type) {
case TasksActionTypes.GET_TASKS:
return {
...state,
activities: {
...state.activities,
deletes: {},
},
initialized: false,
fetching: true,
hideEmpty: true,
count: 0,
current: [],
gettingQuery: action.payload.updateQuery ? { ...action.payload.query } : state.gettingQuery,
};
case TasksActionTypes.GET_TASKS_SUCCESS: {
const combinedWithPreviews = action.payload.array.map(
(task: any, index: number): Task => ({
instance: task,
preview: action.payload.previews[index],
}),
);
return {
...state,
initialized: true,
fetching: false,
count: action.payload.count,
current: combinedWithPreviews,
};
}
case TasksActionTypes.GET_TASKS_FAILED:
return {
...state,
initialized: true,
fetching: false,
};
case TasksActionTypes.LOAD_ANNOTATIONS: {
const { task } = action.payload;
const { loader } = action.payload;
const { loads } = state.activities;
loads[task.id] = task.id in loads ? loads[task.id] : loader.name;
return {
...state,
activities: {
...state.activities,
loads: {
...loads,
},
},
};
}
case TasksActionTypes.LOAD_ANNOTATIONS_FAILED:
case TasksActionTypes.LOAD_ANNOTATIONS_SUCCESS: {
const { task } = action.payload;
const { loads } = state.activities;
delete loads[task.id];
return {
...state,
activities: {
...state.activities,
loads: {
...loads,
},
},
};
}
case TasksActionTypes.DELETE_TASK: {
const { taskID } = action.payload;
const { deletes } = state.activities;
deletes[taskID] = false;
return {
...state,
activities: {
...state.activities,
deletes: {
...deletes,
},
},
};
}
case TasksActionTypes.DELETE_TASK_SUCCESS: {
const { taskID } = action.payload;
const { deletes } = state.activities;
deletes[taskID] = true;
return {
...state,
activities: {
...state.activities,
deletes: {
...deletes,
},
},
};
}
case TasksActionTypes.DELETE_TASK_FAILED: {
const { taskID } = action.payload;
const { deletes } = state.activities;
delete deletes[taskID];
return {
...state,
activities: {
...state.activities,
deletes: {
...deletes,
},
},
};
}
case TasksActionTypes.EXPORT_TASK: {
const { taskID } = action.payload;
const { backups } = state.activities;
return {
...state,
activities: {
...state.activities,
backups: {
...backups,
...Object.fromEntries([[taskID, true]]),
},
},
};
}
case TasksActionTypes.EXPORT_TASK_FAILED:
case TasksActionTypes.EXPORT_TASK_SUCCESS: {
const { taskID } = action.payload;
const { backups } = state.activities;
delete backups[taskID];
return {
...state,
activities: {
...state.activities,
backups: omit(backups, [taskID]),
},
};
}
case TasksActionTypes.IMPORT_TASK: {
return {
...state,
importing: true,
};
}
case TasksActionTypes.IMPORT_TASK_FAILED:
case TasksActionTypes.IMPORT_TASK_SUCCESS: {
return {
...state,
importing: false,
};
}
case TasksActionTypes.CREATE_TASK: {
return {
...state,
activities: {
...state.activities,
creates: {
taskId: null,
status: '',
error: '',
},
},
};
}
case TasksActionTypes.CREATE_TASK_STATUS_UPDATED: {
const { status } = action.payload;
return {
...state,
activities: {
...state.activities,
creates: {
...state.activities.creates,
status,
},
},
};
}
case TasksActionTypes.CREATE_TASK_SUCCESS: {
const { taskId } = action.payload;
return {
...state,
activities: {
...state.activities,
creates: {
...state.activities.creates,
taskId,
status: 'CREATED',
},
},
};
}
case TasksActionTypes.CREATE_TASK_FAILED: {
return {
...state,
activities: {
...state.activities,
creates: {
...state.activities.creates,
status: 'FAILED',
error: action.payload.error.toString(),
},
},
};
}
case TasksActionTypes.UPDATE_TASK: {
return {
...state,
updating: true,
};
}
case TasksActionTypes.UPDATE_TASK_SUCCESS: {
// a task will be undefined after updating when a user doesn't have access to the task anymore
const { task, taskID } = action.payload;
if (typeof task === 'undefined') {
return {
...state,
updating: false,
current: state.current.filter((_task: Task): boolean => _task.instance.id !== taskID),
};
}
return {
...state,
updating: false,
current: state.current.map(
(_task): Task => {
if (_task.instance.id === task.id) {
return {
..._task,
instance: task,
};
}
return _task;
},
),
};
}
case TasksActionTypes.UPDATE_TASK_FAILED: {
return {
...state,
updating: false,
current: state.current.map(
(task): Task => {
if (task.instance.id === action.payload.task.id) {
return {
...task,
instance: action.payload.task,
};
}
return task;
},
),
};
}
case TasksActionTypes.UPDATE_JOB: {
return {
...state,
updating: true,
};
}
case TasksActionTypes.UPDATE_JOB_SUCCESS: {
const { jobInstance } = action.payload;
const idx = state.current.findIndex((task: Task) => task.instance.id === jobInstance.taskId);
const newCurrent = idx === -1 ?
state.current : [...(state.current.splice(idx, 1), state.current)];
return {
...state,
current: newCurrent,
gettingQuery: state.gettingQuery.id === jobInstance.taskId ? {
...state.gettingQuery,
id: null,
} : state.gettingQuery,
updating: false,
};
}
case TasksActionTypes.HIDE_EMPTY_TASKS: {
return {
...state,
hideEmpty: action.payload.hideEmpty,
};
}
case TasksActionTypes.SWITCH_MOVE_TASK_MODAL_VISIBLE: {
return {
...state,
moveTask: {
...state.moveTask,
modalVisible: action.payload.visible,
taskId: action.payload.taskId,
},
};
}
case BoundariesActionTypes.RESET_AFTER_ERROR:
case AuthActionTypes.LOGOUT_SUCCESS: {
return { ...defaultState };
}
default:
return state;
}
};