This repository has been archived by the owner on Jan 20, 2024. It is now read-only.
/
tasks.ts
63 lines (60 loc) · 2.21 KB
/
tasks.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import Actions from "../actions/list";
import { TaskAction } from "../typings/actions";
import { Task } from "../typings/tasks";
/** Sorts a task array in ascending order. Returns a new sorted array. */
const sort = (tasks: Task[]) => [...tasks.sort((a, b) => a.ID - b.ID)];
export interface TaskState {
tasks: Task[];
}
export const taskReducer = (
state: TaskState = { tasks: [] },
action: TaskAction
): TaskState => {
switch (action.type) {
case Actions.TasksFetch:
return { tasks: sort(action.data as Task[]) };
case Actions.TasksFetchError:
return { tasks: sort(state.tasks) };
case Actions.TaskCreate: {
state.tasks.push(action.data as Task);
return { tasks: sort(state.tasks) };
}
case Actions.TaskCreateError: {
const newTask = action.data as Task;
newTask.ToSync = true;
state.tasks.push(newTask);
return { tasks: sort(state.tasks) };
}
case Actions.TaskDelete: {
const IDToRemove = (action.data as Task).ID;
const tasks = state.tasks.filter((task) => task.ID !== IDToRemove);
return { tasks: sort(tasks) };
}
case Actions.TaskDeleteError: {
const index = state.tasks.findIndex(
(task) => task.ID === (action.data as Task).ID
);
state.tasks[index].ToRemove = true;
return { tasks: sort(state.tasks) };
}
case Actions.TaskUpdate: {
const index = state.tasks.findIndex(
(task) => task.ID === (action.data as Task).ID
);
state.tasks[index] = action.data as Task;
state.tasks[index].LastMod = Date.now();
return { tasks: sort(state.tasks) };
}
case Actions.TaskUpdateError: {
const index = state.tasks.findIndex(
(task) => task.ID === (action.data as Task).ID
);
state.tasks[index] = action.data as Task;
state.tasks[index].ToSync = true;
state.tasks[index].LastMod = Date.now();
return { tasks: sort(state.tasks) };
}
default:
return state;
}
};