diff --git a/src/pages/taskmanager/components/task-detail/TaskDetailModal.tsx b/src/pages/taskmanager/components/task-detail/TaskDetailModal.tsx index eb1e430..96b6f23 100644 --- a/src/pages/taskmanager/components/task-detail/TaskDetailModal.tsx +++ b/src/pages/taskmanager/components/task-detail/TaskDetailModal.tsx @@ -151,6 +151,7 @@ const TaskDetailModal: FC = ({ open, task, statusLabel, onClose }) => { { + const { t } = useTranslation("global"); + const updateCheckListItem = useUpdateCheckListItem(); + const items = checkListItems.map((item) => ({ id: item.id, title: item.title, @@ -25,12 +34,23 @@ const CheckLists = ({ const doneCount = completedCheckListItemCount ?? items.filter((item) => item.checked).length; const progress = totalCount > 0 ? Math.round((doneCount / totalCount) * 100) : 0; + const handleToggle = (id: string, checked: boolean) => { + updateCheckListItem.mutate( + { id, params: { isDone: !checked }, taskId }, + { + onError: (error: ErrorType) => { + toast.error(error.response?.data?.error.message[0]); + }, + }, + ); + }; + if (checkListItems.length === 0) return null; return (
-
چک لیست
+
{t("taskmanager.task_detail.checklist")}
{}} color="#FF0000" />
@@ -46,7 +66,7 @@ const CheckLists = ({ key={item.id} title={item.title} checked={item.checked} - onToggle={() => {}} + onToggle={() => handleToggle(item.id, item.checked)} onEdit={() => {}} onDelete={() => {}} /> diff --git a/src/pages/taskmanager/task/hooks/useTaskData.ts b/src/pages/taskmanager/task/hooks/useTaskData.ts index e778a6d..71f9b6e 100644 --- a/src/pages/taskmanager/task/hooks/useTaskData.ts +++ b/src/pages/taskmanager/task/hooks/useTaskData.ts @@ -1,6 +1,12 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import * as api from "../service/TaskService"; -import { CreateCheckListItemType, CreateTaskRemarkType, CreateTaskType, UpdateTaskType } from "../types/TaskTypes"; +import { + CreateCheckListItemType, + CreateTaskRemarkType, + CreateTaskType, + UpdateCheckListItemType, + UpdateTaskType, +} from "../types/TaskTypes"; export const useGetTaskDetail = (id: string, enabled = true) => { return useQuery({ @@ -69,3 +75,16 @@ export const useCreateCheckListItem = () => { }, }); }; + +export const useUpdateCheckListItem = () => { + const queryClient = useQueryClient(); + + return useMutation({ + mutationFn: ({ id, params }: { id: string; params: UpdateCheckListItemType; taskId: string }) => + api.updateCheckListItem(id, params), + onSuccess: (_data, variables) => { + queryClient.invalidateQueries({ queryKey: ["task-detail", variables.taskId] }); + queryClient.invalidateQueries({ queryKey: ["project"] }); + }, + }); +}; diff --git a/src/pages/taskmanager/task/service/TaskService.ts b/src/pages/taskmanager/task/service/TaskService.ts index bead4ab..0f7d852 100644 --- a/src/pages/taskmanager/task/service/TaskService.ts +++ b/src/pages/taskmanager/task/service/TaskService.ts @@ -6,6 +6,8 @@ import { CreateTaskRemarkType, CreateTaskType, GetTaskDetailResponse, + UpdateCheckListItemResponse, + UpdateCheckListItemType, UpdateTaskType, } from "../types/TaskTypes"; @@ -38,3 +40,11 @@ export const createCheckListItem = async (params: CreateCheckListItemType): Prom const { data } = await axios.post(`/task-manager/check-list-items`, params); return data; }; + +export const updateCheckListItem = async ( + id: string, + params: UpdateCheckListItemType, +): Promise => { + const { data } = await axios.patch(`/task-manager/check-list-items/${id}`, params); + return data; +}; diff --git a/src/pages/taskmanager/task/types/TaskTypes.ts b/src/pages/taskmanager/task/types/TaskTypes.ts index 6f1aa9a..0f79922 100644 --- a/src/pages/taskmanager/task/types/TaskTypes.ts +++ b/src/pages/taskmanager/task/types/TaskTypes.ts @@ -57,6 +57,14 @@ export interface CreateCheckListItemResponse extends IResponse<{ checkListItem: statusCode: number; } +export type UpdateCheckListItemType = { + isDone: boolean; +}; + +export interface UpdateCheckListItemResponse extends IResponse<{ checkListItem: TaskChecklistItemType }> { + statusCode: number; +} + export type TaskChecklistType = { id: string; title: string;