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.

276 lines
8.0 KiB
TypeScript

// Copyright (C) 2020-2022 Intel Corporation
// Copyright (C) 2022 CVAT.ai 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 { AnnotationActionTypes } from 'actions/annotation-actions';
import { TasksState, Task } from '.';
const defaultState: TasksState = {
initialized: false,
fetching: false,
updating: false,
hideEmpty: false,
moveTask: {
modalVisible: false,
taskId: null,
},
count: 0,
current: [],
previews: {},
gettingQuery: {
page: 1,
id: null,
search: null,
filter: null,
sort: null,
projectId: null,
},
activities: {
deletes: {},
jobUpdates: {},
},
};
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,
gettingQuery: action.payload.updateQuery ? {
...defaultState.gettingQuery,
...action.payload.query,
} : state.gettingQuery,
};
case TasksActionTypes.GET_TASKS_SUCCESS: {
return {
...state,
initialized: true,
fetching: false,
updating: false,
count: action.payload.count,
current: action.payload.array,
};
}
case TasksActionTypes.GET_TASKS_FAILED:
return {
...state,
initialized: true,
fetching: false,
};
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.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.id !== taskID),
};
}
return {
...state,
updating: false,
current: state.current.map(
(_task): Task => {
if (_task.id === task.id) {
return task;
}
return _task;
},
),
};
}
case TasksActionTypes.UPDATE_TASK_FAILED: {
return {
...state,
updating: false,
current: state.current.map(
(task): Task => {
if (task.id === action.payload.task.id) {
return action.payload.task;
}
return task;
},
),
};
}
case TasksActionTypes.UPDATE_JOB: {
const { jobID } = action.payload;
const { jobUpdates } = state.activities;
return {
...state,
updating: true,
activities: {
...state.activities,
jobUpdates: {
...jobUpdates,
...Object.fromEntries([[jobID, true]]),
},
},
};
}
case TasksActionTypes.UPDATE_JOB_SUCCESS:
case TasksActionTypes.UPDATE_JOB_FAILED: {
const { jobID } = action.payload;
const { jobUpdates } = state.activities;
delete jobUpdates[jobID];
return {
...state,
activities: {
...state.activities,
jobUpdates: omit(jobUpdates, [jobID]),
},
};
}
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 AnnotationActionTypes.CLOSE_JOB: {
return {
...state,
updating: false,
};
}
case BoundariesActionTypes.RESET_AFTER_ERROR:
case AuthActionTypes.LOGOUT_SUCCESS: {
return { ...defaultState };
}
case TasksActionTypes.GET_TASK_PREVIEW: {
const { taskID } = action.payload;
const { previews } = state;
return {
...state,
previews: {
...previews,
[taskID]: {
preview: '',
fetching: true,
initialized: false,
},
},
};
}
case TasksActionTypes.GET_TASK_PREVIEW_SUCCESS: {
const { taskID, preview } = action.payload;
const { previews } = state;
return {
...state,
previews: {
...previews,
[taskID]: {
preview,
fetching: false,
initialized: true,
},
},
};
}
case TasksActionTypes.GET_TASK_PREVIEW_FAILED: {
const { taskID } = action.payload;
const { previews } = state;
return {
...state,
previews: {
...previews,
[taskID]: {
...previews[taskID],
fetching: false,
initialized: true,
},
},
};
}
default:
return state;
}
};