diff --git a/web/src/lib/api/client/app/crm/taskTypes/createTaskType.ts b/web/src/lib/api/client/app/crm/taskTypes/createTaskType.ts new file mode 100644 index 00000000..f8ac4bc8 --- /dev/null +++ b/web/src/lib/api/client/app/crm/taskTypes/createTaskType.ts @@ -0,0 +1,11 @@ +import type TaskType from "@/lib/api/models/app/crm/TaskType"; +import Request from "../../../Request"; + +export default async function createTaskType(data: { name: string; color?: string }): Promise { + return await Request({ + method: "POST", + url: "/crm/task-types", + data, + authorization: true, + }); +} diff --git a/web/src/lib/api/client/app/crm/taskTypes/deleteTaskType.ts b/web/src/lib/api/client/app/crm/taskTypes/deleteTaskType.ts new file mode 100644 index 00000000..4247f5c1 --- /dev/null +++ b/web/src/lib/api/client/app/crm/taskTypes/deleteTaskType.ts @@ -0,0 +1,9 @@ +import Request from "../../../Request"; + +export default async function deleteTaskType(id: string): Promise { + await Request({ + method: "DELETE", + url: `/crm/task-types/${id}`, + authorization: true, + }); +} diff --git a/web/src/lib/api/client/app/crm/taskTypes/listTaskTypes.ts b/web/src/lib/api/client/app/crm/taskTypes/listTaskTypes.ts new file mode 100644 index 00000000..dfbbe335 --- /dev/null +++ b/web/src/lib/api/client/app/crm/taskTypes/listTaskTypes.ts @@ -0,0 +1,12 @@ +import type TaskType from "@/lib/api/models/app/crm/TaskType"; +import Request from "../../../Request"; + +export default async function listTaskTypes(): Promise { + const res = await Request<{ data: TaskType[] } | TaskType[]>({ + method: "GET", + url: "/crm/task-types", + authorization: true, + }); + if (Array.isArray(res)) return res; + return res?.data ?? []; +} diff --git a/web/src/lib/api/client/app/crm/taskTypes/updateTaskType.ts b/web/src/lib/api/client/app/crm/taskTypes/updateTaskType.ts new file mode 100644 index 00000000..becdabdf --- /dev/null +++ b/web/src/lib/api/client/app/crm/taskTypes/updateTaskType.ts @@ -0,0 +1,14 @@ +import type TaskType from "@/lib/api/models/app/crm/TaskType"; +import Request from "../../../Request"; + +export default async function updateTaskType( + id: string, + data: { name?: string; color?: string; position?: number }, +): Promise { + return await Request({ + method: "PATCH", + url: `/crm/task-types/${id}`, + data, + authorization: true, + }); +} diff --git a/web/src/lib/api/hooks/app/crm/taskTypes/useCreateTaskType.ts b/web/src/lib/api/hooks/app/crm/taskTypes/useCreateTaskType.ts new file mode 100644 index 00000000..bf30056a --- /dev/null +++ b/web/src/lib/api/hooks/app/crm/taskTypes/useCreateTaskType.ts @@ -0,0 +1,10 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import createTaskType from "@/lib/api/client/app/crm/taskTypes/createTaskType"; + +export default function useCreateTaskType() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: (data: { name: string; color?: string }) => createTaskType(data), + onSuccess: () => queryClient.invalidateQueries({ queryKey: ["crm", "task-types"] }), + }); +} diff --git a/web/src/lib/api/hooks/app/crm/taskTypes/useDeleteTaskType.ts b/web/src/lib/api/hooks/app/crm/taskTypes/useDeleteTaskType.ts new file mode 100644 index 00000000..60bc9388 --- /dev/null +++ b/web/src/lib/api/hooks/app/crm/taskTypes/useDeleteTaskType.ts @@ -0,0 +1,10 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import deleteTaskType from "@/lib/api/client/app/crm/taskTypes/deleteTaskType"; + +export default function useDeleteTaskType() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: (id: string) => deleteTaskType(id), + onSuccess: () => queryClient.invalidateQueries({ queryKey: ["crm", "task-types"] }), + }); +} diff --git a/web/src/lib/api/hooks/app/crm/taskTypes/useTaskTypes.ts b/web/src/lib/api/hooks/app/crm/taskTypes/useTaskTypes.ts new file mode 100644 index 00000000..99d4dd29 --- /dev/null +++ b/web/src/lib/api/hooks/app/crm/taskTypes/useTaskTypes.ts @@ -0,0 +1,10 @@ +import { useQuery } from "@tanstack/react-query"; +import listTaskTypes from "@/lib/api/client/app/crm/taskTypes/listTaskTypes"; + +export default function useTaskTypes() { + return useQuery({ + queryKey: ["crm", "task-types"], + queryFn: () => listTaskTypes(), + staleTime: 5 * 60 * 1000, + }); +} diff --git a/web/src/lib/api/hooks/app/crm/taskTypes/useUpdateTaskType.ts b/web/src/lib/api/hooks/app/crm/taskTypes/useUpdateTaskType.ts new file mode 100644 index 00000000..f116fe45 --- /dev/null +++ b/web/src/lib/api/hooks/app/crm/taskTypes/useUpdateTaskType.ts @@ -0,0 +1,11 @@ +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import updateTaskType from "@/lib/api/client/app/crm/taskTypes/updateTaskType"; + +export default function useUpdateTaskType() { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: ({ id, data }: { id: string; data: { name?: string; color?: string; position?: number } }) => + updateTaskType(id, data), + onSuccess: () => queryClient.invalidateQueries({ queryKey: ["crm", "task-types"] }), + }); +} diff --git a/web/src/lib/api/models/app/crm/TaskType.ts b/web/src/lib/api/models/app/crm/TaskType.ts new file mode 100644 index 00000000..8963e92f --- /dev/null +++ b/web/src/lib/api/models/app/crm/TaskType.ts @@ -0,0 +1,11 @@ +// A user-managed CRM task type (Call, Email, Meeting, or anything the user +// creates). Org-scoped. Tasks reference a type by its name string. +export default interface TaskType { + id: string; + organization_id: string; + name: string; + color: string; + position: number; + created_at: string; + updated_at: string; +}