forked from akirachix/tesfa-frontend
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuseFetchTaskAssignment.ts
More file actions
99 lines (94 loc) · 3.61 KB
/
useFetchTaskAssignment.ts
File metadata and controls
99 lines (94 loc) · 3.61 KB
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
"use client"
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import { Task, ApiTask, TaskStatus } from "../utils/type";
import {
fetchTaskAssignments,
updateTaskAssignmentStatus,
deleteTaskAssignment,
} from "../utils/fetchTaskAssignment";
import { mapApiTask, fetchTasksForAssignments } from "../utils/fetchTasks";
import { getToken } from "../utils/getToken";
export const useFetchTaskAssignments = () => {
const queryClient = useQueryClient();
const { data: assignedTasks, isLoading: loading, error } = useQuery<Task[]>({
queryKey: ["taskAssignments"],
queryFn: async () => {
const assignments = await fetchTaskAssignments();
if (!assignments || assignments.length === 0) {
return [];
}
const token = getToken();
const headers: HeadersInit = {};
if (token) {
headers["Authorization"] = `Token ${token}`;
}
const taskPromises = fetchTasksForAssignments(assignments, headers);
const tasksData: ApiTask[] = await Promise.all(taskPromises);
const formattedTasks = await Promise.all(tasksData.map(mapApiTask));
const tasksWithAssignments = formattedTasks.map((task) => {
const assignment = assignments.find(
(a) => a.task.toString() === task.id
);
return {
...task,
assignmentId: assignment ? assignment.id : undefined,
status: assignment ? assignment.status : "pending",
};
});
return tasksWithAssignments;
},
});
const { mutateAsync: updateTaskStatus } = useMutation({
mutationFn: ({ taskId, newStatus }: { taskId: string; newStatus: TaskStatus }) => {
const task = assignedTasks?.find((t) => t.id === taskId);
if (!task || !task.assignmentId) {
throw new Error("Task or assignmentId not found for mutation.");
}
return updateTaskAssignmentStatus(task.assignmentId, newStatus);
},
onMutate: async ({ taskId, newStatus }) => {
await queryClient.cancelQueries({ queryKey: ["taskAssignments"] });
const previousTasks = queryClient.getQueryData<Task[]>(["taskAssignments"]);
queryClient.setQueryData<Task[]>(["taskAssignments"], (oldTasks = []) =>
oldTasks.map((task) =>
task.id === taskId ? { ...task, status: newStatus } : task
)
);
return { previousTasks };
},
onError: (err, variables, context) => {
if (context?.previousTasks) {
queryClient.setQueryData(["taskAssignments"], context.previousTasks);
}
},
onSettled: () => {
queryClient.invalidateQueries({ queryKey: ["taskAssignments"] });
},
});
const { mutateAsync: deleteTask } = useMutation({
mutationFn: (assignmentId: number) => deleteTaskAssignment(assignmentId),
onMutate: async (assignmentId) => {
await queryClient.cancelQueries({ queryKey: ["taskAssignments"] });
const previousTasks = queryClient.getQueryData<Task[]>(["taskAssignments"]);
queryClient.setQueryData<Task[]>(["taskAssignments"], (oldTasks = []) =>
oldTasks.filter((task) => task.assignmentId !== assignmentId)
);
return { previousTasks };
},
onError: (err, variables, context) => {
if (context?.previousTasks) {
queryClient.setQueryData(["taskAssignments"], context.previousTasks);
}
},
onSettled: () => {
queryClient.invalidateQueries({ queryKey: ["taskAssignments"] });
},
});
return {
assignedTasks: assignedTasks || [],
loading,
error,
updateTaskStatus,
deleteTask,
};
};