@titus-system/syncdesk 0.5.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/dist/api/client.d.ts +7 -0
  2. package/dist/api/client.d.ts.map +1 -0
  3. package/dist/api/client.js +105 -0
  4. package/{src/api/index.ts → dist/api/index.d.ts} +1 -0
  5. package/dist/api/index.d.ts.map +1 -0
  6. package/dist/api/index.js +1 -0
  7. package/dist/api/typings.d.ts +4 -0
  8. package/dist/api/typings.d.ts.map +1 -0
  9. package/dist/api/typings.js +1 -0
  10. package/dist/auth/hooks/useAuth.d.ts +51 -0
  11. package/dist/auth/hooks/useAuth.d.ts.map +1 -0
  12. package/dist/auth/hooks/useAuth.js +127 -0
  13. package/dist/auth/index.d.ts +4 -0
  14. package/dist/auth/index.d.ts.map +1 -0
  15. package/dist/auth/index.js +1 -0
  16. package/dist/auth/types/auth.d.ts +51 -0
  17. package/dist/auth/types/auth.d.ts.map +1 -0
  18. package/dist/auth/types/auth.js +1 -0
  19. package/dist/auth/types/session.d.ts +12 -0
  20. package/dist/auth/types/session.d.ts.map +1 -0
  21. package/dist/auth/types/session.js +1 -0
  22. package/dist/config.d.ts +14 -0
  23. package/dist/config.d.ts.map +1 -0
  24. package/dist/config.js +10 -0
  25. package/dist/health/hooks/useHealth.d.ts +17 -0
  26. package/dist/health/hooks/useHealth.d.ts.map +1 -0
  27. package/dist/health/hooks/useHealth.js +42 -0
  28. package/dist/health/index.d.ts +3 -0
  29. package/dist/health/index.d.ts.map +1 -0
  30. package/dist/health/types/health.d.ts +10 -0
  31. package/dist/health/types/health.d.ts.map +1 -0
  32. package/dist/health/types/health.js +1 -0
  33. package/{src/index.ts → dist/index.d.ts} +1 -1
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +9 -0
  36. package/dist/live_chat/hooks/useLiveChat.d.ts +37 -0
  37. package/dist/live_chat/hooks/useLiveChat.d.ts.map +1 -0
  38. package/dist/live_chat/hooks/useLiveChat.js +91 -0
  39. package/dist/live_chat/hooks/useLiveChatWebSocket.d.ts +11 -0
  40. package/dist/live_chat/hooks/useLiveChatWebSocket.d.ts.map +1 -0
  41. package/dist/live_chat/hooks/useLiveChatWebSocket.js +68 -0
  42. package/dist/live_chat/index.d.ts +4 -0
  43. package/dist/live_chat/index.d.ts.map +1 -0
  44. package/dist/live_chat/index.js +2 -0
  45. package/dist/live_chat/types/live_chat.d.ts +45 -0
  46. package/dist/live_chat/types/live_chat.d.ts.map +1 -0
  47. package/dist/live_chat/types/live_chat.js +1 -0
  48. package/dist/permissions/hooks/usePermissions.d.ts +71 -0
  49. package/dist/permissions/hooks/usePermissions.d.ts.map +1 -0
  50. package/dist/permissions/hooks/usePermissions.js +147 -0
  51. package/dist/permissions/index.d.ts +3 -0
  52. package/dist/permissions/index.d.ts.map +1 -0
  53. package/dist/permissions/types/index.d.ts +2 -0
  54. package/dist/permissions/types/index.d.ts.map +1 -0
  55. package/dist/permissions/types/permission.d.ts +23 -0
  56. package/dist/permissions/types/permission.d.ts.map +1 -0
  57. package/dist/permissions/types/permission.js +1 -0
  58. package/dist/roles/hooks/useRoles.d.ts +62 -0
  59. package/dist/roles/hooks/useRoles.d.ts.map +1 -0
  60. package/dist/roles/hooks/useRoles.js +138 -0
  61. package/dist/roles/index.d.ts +3 -0
  62. package/dist/roles/index.d.ts.map +1 -0
  63. package/dist/roles/types/index.d.ts +2 -0
  64. package/dist/roles/types/index.d.ts.map +1 -0
  65. package/dist/roles/types/role.d.ts +23 -0
  66. package/dist/roles/types/role.d.ts.map +1 -0
  67. package/dist/roles/types/role.js +1 -0
  68. package/dist/ticket/hooks/useTickets.d.ts +27 -0
  69. package/dist/ticket/hooks/useTickets.d.ts.map +1 -0
  70. package/dist/ticket/hooks/useTickets.js +57 -0
  71. package/dist/ticket/index.d.ts +3 -0
  72. package/dist/ticket/index.d.ts.map +1 -0
  73. package/dist/ticket/types/ticket.d.ts +74 -0
  74. package/dist/ticket/types/ticket.d.ts.map +1 -0
  75. package/dist/ticket/types/ticket.js +1 -0
  76. package/dist/users/hooks/useUsers.d.ts +46 -0
  77. package/dist/users/hooks/useUsers.d.ts.map +1 -0
  78. package/dist/users/hooks/useUsers.js +105 -0
  79. package/dist/users/index.d.ts +3 -0
  80. package/dist/users/index.d.ts.map +1 -0
  81. package/dist/users/index.js +1 -0
  82. package/dist/users/types/user.d.ts +30 -0
  83. package/dist/users/types/user.d.ts.map +1 -0
  84. package/dist/users/types/user.js +1 -0
  85. package/package.json +10 -4
  86. package/.editorconfig +0 -53
  87. package/.github/workflows/notify-main.yml +0 -17
  88. package/CHANGELOG.md +0 -29
  89. package/src/api/client.ts +0 -135
  90. package/src/api/typings.ts +0 -3
  91. package/src/auth/hooks/useAuth.ts +0 -173
  92. package/src/auth/index.ts +0 -12
  93. package/src/auth/types/auth.ts +0 -61
  94. package/src/auth/types/session.ts +0 -12
  95. package/src/config.ts +0 -31
  96. package/src/health/hooks/useHealth.ts +0 -57
  97. package/src/health/types/health.ts +0 -10
  98. package/src/live_chat/hooks/useLiveChat.ts +0 -124
  99. package/src/live_chat/hooks/useLiveChatWebSocket.ts +0 -86
  100. package/src/live_chat/index.ts +0 -15
  101. package/src/live_chat/types/live_chat.ts +0 -48
  102. package/src/permissions/hooks/usePermissions.ts +0 -196
  103. package/src/permissions/types/permission.ts +0 -27
  104. package/src/roles/hooks/useRoles.ts +0 -167
  105. package/src/roles/types/role.ts +0 -28
  106. package/src/ticket/hooks/useTickets.ts +0 -89
  107. package/src/ticket/types/ticket.ts +0 -88
  108. package/src/users/hooks/useUsers.ts +0 -150
  109. package/src/users/index.ts +0 -16
  110. package/src/users/types/user.ts +0 -36
  111. package/tsconfig.json +0 -29
  112. package/tsup.config.ts +0 -12
  113. /package/{src/health/index.ts → dist/health/index.js} +0 -0
  114. /package/{src/permissions/index.ts → dist/permissions/index.js} +0 -0
  115. /package/{src/permissions/types/index.ts → dist/permissions/types/index.js} +0 -0
  116. /package/{src/roles/index.ts → dist/roles/index.js} +0 -0
  117. /package/{src/roles/types/index.ts → dist/roles/types/index.js} +0 -0
  118. /package/{src/ticket/index.ts → dist/ticket/index.js} +0 -0
@@ -1,86 +0,0 @@
1
- import { useEffect, useState, useCallback } from "react";
2
- import useWebSocket, { ReadyState } from "react-use-websocket";
3
- import { config } from "../../config";
4
- import type { ChatMessage, SendMessagePayload } from "../types/live_chat";
5
- import type { ApiResponse } from "../../api";
6
-
7
- export function useLiveChatWebSocket(chatId: string | null | undefined) {
8
- const [token, setToken] = useState<string | null>(null);
9
-
10
- // We need the token resolved before connecting to WebSocket
11
- useEffect(() => {
12
- if (!chatId) return;
13
-
14
- const fetchToken = async () => {
15
- const t = await config.getAccessToken();
16
- setToken(t);
17
- };
18
- fetchToken();
19
- }, [chatId]);
20
-
21
- // Construct WebSocket URL from the configured baseURL
22
- const wsUrl = () => {
23
- if (!config.baseURL || !chatId || !token) return null;
24
- try {
25
- const url = new URL(config.baseURL);
26
- url.protocol = url.protocol === "https:" ? "wss:" : "ws:";
27
- url.pathname = `${url.pathname.replace(/\/$/, "")}/live_chat/room/${chatId}`;
28
- return url.toString();
29
- } catch {
30
- // If baseURL is relative (e.g. "/api"), use window location
31
- const protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
32
- const host = window.location.host;
33
- return `${protocol}//${host}${config.baseURL.replace(/\/$/, "")}/live_chat/room/${chatId}`;
34
- }
35
- };
36
-
37
- const finalUrl = wsUrl();
38
-
39
- const { sendMessage, lastJsonMessage, readyState } = useWebSocket<
40
- ApiResponse<ChatMessage>
41
- >(
42
- finalUrl,
43
- {
44
- // Using token as a subprotocol to pass it due to WebSocket standard not allowing custom headers in browsers.
45
- // E.g. Sec-WebSocket-Protocol: access_token, <token>
46
- protocols: token ? ["access_token", token] : [],
47
- shouldReconnect: (closeEvent) => {
48
- // Do not reconnect on unauthorized or permission denied errors
49
- if (
50
- closeEvent.code === 1008 ||
51
- closeEvent.code === 403 ||
52
- closeEvent.code === 1011
53
- )
54
- return false;
55
- return true;
56
- },
57
- reconnectAttempts: 10,
58
- reconnectInterval: 3000,
59
- },
60
- // Only connect if we have a valid URL (meaning chat id and token exist)
61
- !!finalUrl,
62
- );
63
-
64
- const connectionStatus = {
65
- [ReadyState.CONNECTING]: "Connecting",
66
- [ReadyState.OPEN]: "Open",
67
- [ReadyState.CLOSING]: "Closing",
68
- [ReadyState.CLOSED]: "Closed",
69
- [ReadyState.UNINSTANTIATED]: "Uninstantiated",
70
- }[readyState];
71
-
72
- const sendPayload = useCallback(
73
- (payload: SendMessagePayload) => {
74
- sendMessage(JSON.stringify(payload));
75
- },
76
- [sendMessage],
77
- );
78
-
79
- return {
80
- sendMessage: sendPayload,
81
- lastMessage: lastJsonMessage?.data || null,
82
- rawLastMessage: lastJsonMessage,
83
- connectionStatus,
84
- readyState,
85
- };
86
- }
@@ -1,15 +0,0 @@
1
- export {
2
- useGetConversations,
3
- useGetPaginatedMessages,
4
- useCreateConversation,
5
- useSetConversationAgent,
6
- } from "./hooks/useLiveChat";
7
-
8
- export { useLiveChatWebSocket } from "./hooks/useLiveChatWebSocket";
9
-
10
- export type {
11
- ChatMessage,
12
- Conversation,
13
- CreateConversationDTO,
14
- PaginatedMessages,
15
- } from "./types/live_chat";
@@ -1,48 +0,0 @@
1
- export interface SendMessagePayload {
2
- type: "text" | "file";
3
- content: string;
4
- mime_type?: string | null;
5
- filename?: string | null;
6
- responding_to?: string | null;
7
- }
8
-
9
- export interface ChatMessage {
10
- id: string;
11
- conversation_id: string;
12
- sender_id: string | "System";
13
- timestamp: string;
14
- type: "text" | "file";
15
- content: string;
16
- mime_type?: string | null;
17
- filename?: string | null;
18
- responding_to?: string | null;
19
- }
20
-
21
- export interface Conversation {
22
- _id: string;
23
- ticket_id: string;
24
- agent_id?: string | null;
25
- client_id: string;
26
- sequential_index: number;
27
- parent_id?: string | null;
28
- children_ids: string[];
29
- started_at: string;
30
- finished_at?: string | null;
31
- messages: ChatMessage[];
32
- }
33
-
34
- export interface CreateConversationDTO {
35
- ticket_id: string;
36
- agent_id?: string | null;
37
- client_id: string;
38
- sequential_index?: number;
39
- parent_id?: string | null;
40
- }
41
-
42
- export interface PaginatedMessages {
43
- messages: ChatMessage[];
44
- total: number;
45
- page: number;
46
- limit: number;
47
- has_next: boolean;
48
- }
@@ -1,196 +0,0 @@
1
- import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
2
- import { apiClient } from "../../api";
3
- import type { ApiResponse } from "../../api";
4
- import type {
5
- Permission,
6
- CreatePermissionDTO,
7
- ReplacePermissionDTO,
8
- UpdatePermissionDTO,
9
- AddPermissionRolesDTO,
10
- } from "../types/permission";
11
-
12
- const PATH = "/permissions";
13
-
14
- /**
15
- * List all permissions.
16
- * @returns {UseQueryResult<Permission[]>} The query result.
17
- */
18
- export function usePermissions() {
19
- return useQuery<Permission[]>({
20
- queryKey: ["permissions"],
21
- queryFn: async () => {
22
- const response = await apiClient.get<ApiResponse<Permission[]>>(
23
- `${PATH}/`,
24
- );
25
- return response.data.data;
26
- },
27
- });
28
- }
29
-
30
- /**
31
- * Get a permission by ID.
32
- * @param {number} id id parameter.
33
- * @returns {UseQueryResult<Permission>} The query result.
34
- */
35
- export function usePermission(id: number) {
36
- return useQuery<Permission>({
37
- queryKey: ["permissions", id],
38
- queryFn: async () => {
39
- const response = await apiClient.get<ApiResponse<Permission>>(
40
- `${PATH}/${id}`,
41
- );
42
- return response.data.data;
43
- },
44
- enabled: !!id,
45
- });
46
- }
47
-
48
- /**
49
- * Create a new permission.
50
- * @param {CreatePermissionDTO} dto DTO containing details.
51
- * @returns {UseMutationResult<Permission, Error, CreatePermissionDTO>} The mutation result.
52
- */
53
- export function useCreatePermission() {
54
- const queryClient = useQueryClient();
55
- return useMutation<Permission, Error, CreatePermissionDTO>({
56
- mutationFn: async (dto) => {
57
- const response = await apiClient.post<ApiResponse<Permission>>(
58
- `${PATH}/`,
59
- dto,
60
- );
61
- return response.data.data;
62
- },
63
- onSuccess: () => {
64
- queryClient.invalidateQueries({ queryKey: ["permissions"] });
65
- },
66
- });
67
- }
68
-
69
- /**
70
- * Replace a permission by ID.
71
- * @param {number} id ID.
72
- * @param {ReplacePermissionDTO} dto DTO containing details.
73
- * @returns {UseMutationResult<Permission,
74
- Error,
75
- { id: number; dto: ReplacePermissionDTO }>} The mutation result.
76
- */
77
- export function useReplacePermission() {
78
- const queryClient = useQueryClient();
79
- return useMutation<
80
- Permission,
81
- Error,
82
- { id: number; dto: ReplacePermissionDTO }
83
- >({
84
- mutationFn: async ({ id, dto }) => {
85
- const response = await apiClient.put<ApiResponse<Permission>>(
86
- `${PATH}/${id}`,
87
- dto,
88
- );
89
- return response.data.data;
90
- },
91
- onSuccess: (_, { id }) => {
92
- queryClient.invalidateQueries({ queryKey: ["permissions"] });
93
- queryClient.invalidateQueries({ queryKey: ["permissions", id] });
94
- },
95
- });
96
- }
97
-
98
- /**
99
- * Update a permission by ID.
100
- * @param {number} id ID.
101
- * @param {UpdatePermissionDTO} dto DTO containing details.
102
- * @returns {UseMutationResult<Permission,
103
- Error,
104
- { id: number; dto: UpdatePermissionDTO }>} The mutation result.
105
- */
106
- export function useUpdatePermission() {
107
- const queryClient = useQueryClient();
108
- return useMutation<
109
- Permission,
110
- Error,
111
- { id: number; dto: UpdatePermissionDTO }
112
- >({
113
- mutationFn: async ({ id, dto }) => {
114
- const response = await apiClient.patch<ApiResponse<Permission>>(
115
- `${PATH}/${id}`,
116
- dto,
117
- );
118
- return response.data.data;
119
- },
120
- onSuccess: (_, { id }) => {
121
- queryClient.invalidateQueries({ queryKey: ["permissions"] });
122
- queryClient.invalidateQueries({ queryKey: ["permissions", id] });
123
- },
124
- });
125
- }
126
-
127
- /**
128
- * Delete a permission by ID.
129
- * @param {number} dto DTO containing details.
130
- * @returns {UseMutationResult<Permission, Error, number>} The mutation result.
131
- */
132
- export function useDeletePermission() {
133
- const queryClient = useQueryClient();
134
- return useMutation<Permission, Error, number>({
135
- mutationFn: async (id) => {
136
- const response = await apiClient.delete<ApiResponse<Permission>>(
137
- `${PATH}/${id}`,
138
- );
139
- return response.data.data;
140
- },
141
- onSuccess: (_, id) => {
142
- queryClient.invalidateQueries({ queryKey: ["permissions"] });
143
- queryClient.invalidateQueries({ queryKey: ["permissions", id] });
144
- },
145
- });
146
- }
147
-
148
- /**
149
- * Get permission with associated roles.
150
- *
151
- * All roles that have this permission will be included in the
152
- * response under a `roles` field.
153
- *
154
- * @param {number} id id parameter.
155
- * @returns {UseQueryResult<Permission>} The query result.
156
- */
157
- export function usePermissionRoles(id: number) {
158
- return useQuery<Permission>({
159
- queryKey: ["permissions", id, "roles"],
160
- queryFn: async () => {
161
- const response = await apiClient.get<ApiResponse<Permission>>(
162
- `${PATH}/${id}/roles`,
163
- );
164
- return response.data.data;
165
- },
166
- enabled: !!id,
167
- });
168
- }
169
-
170
- /**
171
- * Add a permission to a list of roles.
172
- * @param {number} id ID.
173
- * @param {AddPermissionRolesDTO} dto DTO containing details.
174
- * @returns {UseMutationResult<Permission,
175
- Error,
176
- { id: number; dto: AddPermissionRolesDTO }>} The mutation result.
177
- */
178
- export function useAddPermissionRoles() {
179
- const queryClient = useQueryClient();
180
- return useMutation<
181
- Permission,
182
- Error,
183
- { id: number; dto: AddPermissionRolesDTO }
184
- >({
185
- mutationFn: async ({ id, dto }) => {
186
- const response = await apiClient.post<ApiResponse<Permission>>(
187
- `${PATH}/${id}/roles`,
188
- dto,
189
- );
190
- return response.data.data;
191
- },
192
- onSuccess: (_, { id }) => {
193
- queryClient.invalidateQueries({ queryKey: ["permissions", id, "roles"] });
194
- },
195
- });
196
- }
@@ -1,27 +0,0 @@
1
- import type { Role } from "../../roles/types/role";
2
-
3
- export interface Permission {
4
- id: number;
5
- name: string;
6
- description?: string | null;
7
- roles?: Role[];
8
- }
9
-
10
- export interface CreatePermissionDTO {
11
- name: string;
12
- description?: string | null;
13
- }
14
-
15
- export interface ReplacePermissionDTO {
16
- name: string;
17
- description?: string | null;
18
- }
19
-
20
- export interface UpdatePermissionDTO {
21
- name?: string | null;
22
- description?: string | null;
23
- }
24
-
25
- export interface AddPermissionRolesDTO {
26
- ids: number[];
27
- }
@@ -1,167 +0,0 @@
1
- import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
2
- import { apiClient, ApiResponse } from "../../api";
3
- import type {
4
- Role,
5
- CreateRoleDTO,
6
- ReplaceRoleDTO,
7
- UpdateRoleDTO,
8
- AddRolePermissionsDTO,
9
- } from "../types/role";
10
-
11
- const PATH = "/roles";
12
-
13
- /**
14
- * List all roles.
15
- * @returns {UseQueryResult<Role[]>} The query result.
16
- */
17
- export function useRoles() {
18
- return useQuery<Role[]>({
19
- queryKey: ["roles"],
20
- queryFn: async () => {
21
- const response = await apiClient.get<ApiResponse<Role[]>>(`${PATH}/`);
22
- return response.data.data;
23
- },
24
- });
25
- }
26
-
27
- /**
28
- * Get a role by ID.
29
- * @param {number} id id parameter.
30
- * @returns {UseQueryResult<Role>} The query result.
31
- */
32
- export function useRole(id: number) {
33
- return useQuery<Role>({
34
- queryKey: ["roles", id],
35
- queryFn: async () => {
36
- const response = await apiClient.get<ApiResponse<Role>>(`${PATH}/${id}`);
37
- return response.data.data;
38
- },
39
- enabled: !!id,
40
- });
41
- }
42
-
43
- /**
44
- * Create a new role.
45
- * @param {CreateRoleDTO} dto DTO containing details.
46
- * @returns {UseMutationResult<Role, Error, CreateRoleDTO>} The mutation result.
47
- */
48
- export function useCreateRole() {
49
- const queryClient = useQueryClient();
50
- return useMutation<Role, Error, CreateRoleDTO>({
51
- mutationFn: async (dto) => {
52
- const response = await apiClient.post<ApiResponse<Role>>(`${PATH}/`, dto);
53
- return response.data.data;
54
- },
55
- onSuccess: () => {
56
- queryClient.invalidateQueries({ queryKey: ["roles"] });
57
- },
58
- });
59
- }
60
-
61
- /**
62
- * Replace a role by ID.
63
- * @param {number} id ID.
64
- * @param {ReplaceRoleDTO} dto DTO containing details.
65
- * @returns {UseMutationResult<Role, Error, { id: number; dto: ReplaceRoleDTO }>} The mutation result.
66
- */
67
- export function useReplaceRole() {
68
- const queryClient = useQueryClient();
69
- return useMutation<Role, Error, { id: number; dto: ReplaceRoleDTO }>({
70
- mutationFn: async ({ id, dto }) => {
71
- const response = await apiClient.put<ApiResponse<Role>>(
72
- `${PATH}/${id}`,
73
- dto,
74
- );
75
- return response.data.data;
76
- },
77
- onSuccess: (_, { id }) => {
78
- queryClient.invalidateQueries({ queryKey: ["roles"] });
79
- queryClient.invalidateQueries({ queryKey: ["roles", id] });
80
- },
81
- });
82
- }
83
-
84
- /**
85
- * Update a role by ID.
86
- * @param {number} id ID.
87
- * @param {UpdateRoleDTO} dto DTO containing details.
88
- * @returns {UseMutationResult<Role, Error, { id: number; dto: UpdateRoleDTO }>} The mutation result.
89
- */
90
- export function useUpdateRole() {
91
- const queryClient = useQueryClient();
92
- return useMutation<Role, Error, { id: number; dto: UpdateRoleDTO }>({
93
- mutationFn: async ({ id, dto }) => {
94
- const response = await apiClient.patch<ApiResponse<Role>>(
95
- `${PATH}/${id}`,
96
- dto,
97
- );
98
- return response.data.data;
99
- },
100
- onSuccess: (_, { id }) => {
101
- queryClient.invalidateQueries({ queryKey: ["roles"] });
102
- queryClient.invalidateQueries({ queryKey: ["roles", id] });
103
- },
104
- });
105
- }
106
-
107
- /**
108
- * Delete a role by ID.
109
- * @param {number} dto DTO containing details.
110
- * @returns {UseMutationResult<Role, Error, number>} The mutation result.
111
- */
112
- export function useDeleteRole() {
113
- const queryClient = useQueryClient();
114
- return useMutation<Role, Error, number>({
115
- mutationFn: async (id) => {
116
- const response = await apiClient.delete<ApiResponse<Role>>(
117
- `${PATH}/${id}`,
118
- );
119
- return response.data.data;
120
- },
121
- onSuccess: (_, id) => {
122
- queryClient.invalidateQueries({ queryKey: ["roles"] });
123
- queryClient.invalidateQueries({ queryKey: ["roles", id] });
124
- },
125
- });
126
- }
127
-
128
- /**
129
- * Get the permissions for a role by ID.
130
- * @param {number} id id parameter.
131
- * @returns {UseQueryResult<Role>} The query result.
132
- */
133
- export function useRolePermissions(id: number) {
134
- return useQuery<Role>({
135
- queryKey: ["roles", id, "permissions"],
136
- queryFn: async () => {
137
- const response = await apiClient.get<ApiResponse<Role>>(
138
- `${PATH}/${id}/permissions`,
139
- );
140
- return response.data.data;
141
- },
142
- enabled: !!id,
143
- });
144
- }
145
-
146
- /**
147
- * Add permissions to a role.
148
- *
149
- * @param {number} id ID.
150
- * @param {AddRolePermissionsDTO} dto DTO containing details.
151
- * @returns {UseMutationResult<Role, Error, { id: number; dto: AddRolePermissionsDTO }>} The mutation result.
152
- */
153
- export function useAddRolePermissions() {
154
- const queryClient = useQueryClient();
155
- return useMutation<Role, Error, { id: number; dto: AddRolePermissionsDTO }>({
156
- mutationFn: async ({ id, dto }) => {
157
- const response = await apiClient.post<ApiResponse<Role>>(
158
- `${PATH}/${id}/permissions`,
159
- dto,
160
- );
161
- return response.data.data;
162
- },
163
- onSuccess: (_, { id }) => {
164
- queryClient.invalidateQueries({ queryKey: ["roles", id, "permissions"] });
165
- },
166
- });
167
- }
@@ -1,28 +0,0 @@
1
- export interface Role {
2
- id: number;
3
- name: string;
4
- description?: string | null;
5
- permissions?: Permission[];
6
- }
7
-
8
- export interface CreateRoleDTO {
9
- name: string;
10
- description?: string | null;
11
- }
12
-
13
- export interface ReplaceRoleDTO {
14
- name: string;
15
- description?: string | null;
16
- }
17
-
18
- export interface UpdateRoleDTO {
19
- name?: string | null;
20
- description?: string | null;
21
- }
22
-
23
- export interface AddRolePermissionsDTO {
24
- ids: number[];
25
- }
26
-
27
- // Importing Permission here to avoid circular dependency issues, or we can just redefine it as any or import it.
28
- import type { Permission } from "../../permissions/types/permission";
@@ -1,89 +0,0 @@
1
- import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
2
- import { apiClient, ApiResponse } from "../../api";
3
- import {
4
- CreateTicketRequest,
5
- CreateTicketResponse,
6
- TicketResponse,
7
- TicketSearchFilters,
8
- UpdateTicketStatusRequest,
9
- UpdateTicketStatusResponse,
10
- } from "../types/ticket";
11
-
12
- const PATH = "/tickets";
13
-
14
- // Query keys
15
- export const TICKET_KEYS = {
16
- all: ["tickets"] as const,
17
- list: (filters: TicketSearchFilters) =>
18
- [...TICKET_KEYS.all, "list", filters] as const,
19
- };
20
-
21
- /**
22
- * Get all tickets.
23
- * @param {TicketSearchFilters} filters filters parameter.
24
- * @returns {UseQueryResult<TicketResponse[]>} The query result.
25
- */
26
- export const useTickets = (filters: TicketSearchFilters = {}) => {
27
- return useQuery({
28
- queryKey: TICKET_KEYS.list(filters),
29
- queryFn: async (): Promise<TicketResponse[]> => {
30
- const response = await apiClient.get<ApiResponse<TicketResponse[]>>(
31
- `${PATH}/`,
32
- { params: filters },
33
- );
34
- return response.data.data;
35
- },
36
- });
37
- };
38
-
39
- /**
40
- * Create a new ticket.
41
- * @param {CreateTicketRequest} payload The ticket creation details.
42
- * @returns {UseMutationResult<CreateTicketResponse, Error, CreateTicketRequest>} The mutation result.
43
- */
44
- export const useCreateTicket = () => {
45
- const queryClient = useQueryClient();
46
-
47
- return useMutation({
48
- mutationFn: async (
49
- payload: CreateTicketRequest,
50
- ): Promise<CreateTicketResponse> => {
51
- const response = await apiClient.post<ApiResponse<CreateTicketResponse>>(
52
- `${PATH}/`,
53
- payload,
54
- );
55
- return response.data.data;
56
- },
57
- onSuccess: () => {
58
- // Invalidate tickets list queries on success
59
- queryClient.invalidateQueries({ queryKey: TICKET_KEYS.all });
60
- },
61
- });
62
- };
63
-
64
- /**
65
- * Update a ticket's status.
66
- * @param {{ ticketId: string; payload: UpdateTicketStatusRequest }} params The ticket ID and status update payload.
67
- * @returns {UseMutationResult<UpdateTicketStatusResponse, Error, { ticketId: string; payload: UpdateTicketStatusRequest }>} The mutation result.
68
- */
69
- export const useUpdateTicketStatus = () => {
70
- const queryClient = useQueryClient();
71
-
72
- return useMutation({
73
- mutationFn: async ({
74
- ticketId,
75
- payload,
76
- }: {
77
- ticketId: string;
78
- payload: UpdateTicketStatusRequest;
79
- }): Promise<UpdateTicketStatusResponse> => {
80
- const response = await apiClient.patch<
81
- ApiResponse<UpdateTicketStatusResponse>
82
- >(`${PATH}/${ticketId}/status`, payload);
83
- return response.data.data;
84
- },
85
- onSuccess: () => {
86
- queryClient.invalidateQueries({ queryKey: TICKET_KEYS.all });
87
- },
88
- });
89
- };