@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.
- package/dist/api/client.d.ts +7 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +105 -0
- package/{src/api/index.ts → dist/api/index.d.ts} +1 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +1 -0
- package/dist/api/typings.d.ts +4 -0
- package/dist/api/typings.d.ts.map +1 -0
- package/dist/api/typings.js +1 -0
- package/dist/auth/hooks/useAuth.d.ts +51 -0
- package/dist/auth/hooks/useAuth.d.ts.map +1 -0
- package/dist/auth/hooks/useAuth.js +127 -0
- package/dist/auth/index.d.ts +4 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +1 -0
- package/dist/auth/types/auth.d.ts +51 -0
- package/dist/auth/types/auth.d.ts.map +1 -0
- package/dist/auth/types/auth.js +1 -0
- package/dist/auth/types/session.d.ts +12 -0
- package/dist/auth/types/session.d.ts.map +1 -0
- package/dist/auth/types/session.js +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +10 -0
- package/dist/health/hooks/useHealth.d.ts +17 -0
- package/dist/health/hooks/useHealth.d.ts.map +1 -0
- package/dist/health/hooks/useHealth.js +42 -0
- package/dist/health/index.d.ts +3 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/types/health.d.ts +10 -0
- package/dist/health/types/health.d.ts.map +1 -0
- package/dist/health/types/health.js +1 -0
- package/{src/index.ts → dist/index.d.ts} +1 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/live_chat/hooks/useLiveChat.d.ts +37 -0
- package/dist/live_chat/hooks/useLiveChat.d.ts.map +1 -0
- package/dist/live_chat/hooks/useLiveChat.js +91 -0
- package/dist/live_chat/hooks/useLiveChatWebSocket.d.ts +11 -0
- package/dist/live_chat/hooks/useLiveChatWebSocket.d.ts.map +1 -0
- package/dist/live_chat/hooks/useLiveChatWebSocket.js +68 -0
- package/dist/live_chat/index.d.ts +4 -0
- package/dist/live_chat/index.d.ts.map +1 -0
- package/dist/live_chat/index.js +2 -0
- package/dist/live_chat/types/live_chat.d.ts +45 -0
- package/dist/live_chat/types/live_chat.d.ts.map +1 -0
- package/dist/live_chat/types/live_chat.js +1 -0
- package/dist/permissions/hooks/usePermissions.d.ts +71 -0
- package/dist/permissions/hooks/usePermissions.d.ts.map +1 -0
- package/dist/permissions/hooks/usePermissions.js +147 -0
- package/dist/permissions/index.d.ts +3 -0
- package/dist/permissions/index.d.ts.map +1 -0
- package/dist/permissions/types/index.d.ts +2 -0
- package/dist/permissions/types/index.d.ts.map +1 -0
- package/dist/permissions/types/permission.d.ts +23 -0
- package/dist/permissions/types/permission.d.ts.map +1 -0
- package/dist/permissions/types/permission.js +1 -0
- package/dist/roles/hooks/useRoles.d.ts +62 -0
- package/dist/roles/hooks/useRoles.d.ts.map +1 -0
- package/dist/roles/hooks/useRoles.js +138 -0
- package/dist/roles/index.d.ts +3 -0
- package/dist/roles/index.d.ts.map +1 -0
- package/dist/roles/types/index.d.ts +2 -0
- package/dist/roles/types/index.d.ts.map +1 -0
- package/dist/roles/types/role.d.ts +23 -0
- package/dist/roles/types/role.d.ts.map +1 -0
- package/dist/roles/types/role.js +1 -0
- package/dist/ticket/hooks/useTickets.d.ts +27 -0
- package/dist/ticket/hooks/useTickets.d.ts.map +1 -0
- package/dist/ticket/hooks/useTickets.js +57 -0
- package/dist/ticket/index.d.ts +3 -0
- package/dist/ticket/index.d.ts.map +1 -0
- package/dist/ticket/types/ticket.d.ts +74 -0
- package/dist/ticket/types/ticket.d.ts.map +1 -0
- package/dist/ticket/types/ticket.js +1 -0
- package/dist/users/hooks/useUsers.d.ts +46 -0
- package/dist/users/hooks/useUsers.d.ts.map +1 -0
- package/dist/users/hooks/useUsers.js +105 -0
- package/dist/users/index.d.ts +3 -0
- package/dist/users/index.d.ts.map +1 -0
- package/dist/users/index.js +1 -0
- package/dist/users/types/user.d.ts +30 -0
- package/dist/users/types/user.d.ts.map +1 -0
- package/dist/users/types/user.js +1 -0
- package/package.json +10 -4
- package/.editorconfig +0 -53
- package/.github/workflows/notify-main.yml +0 -17
- package/CHANGELOG.md +0 -29
- package/src/api/client.ts +0 -135
- package/src/api/typings.ts +0 -3
- package/src/auth/hooks/useAuth.ts +0 -173
- package/src/auth/index.ts +0 -12
- package/src/auth/types/auth.ts +0 -61
- package/src/auth/types/session.ts +0 -12
- package/src/config.ts +0 -31
- package/src/health/hooks/useHealth.ts +0 -57
- package/src/health/types/health.ts +0 -10
- package/src/live_chat/hooks/useLiveChat.ts +0 -124
- package/src/live_chat/hooks/useLiveChatWebSocket.ts +0 -86
- package/src/live_chat/index.ts +0 -15
- package/src/live_chat/types/live_chat.ts +0 -48
- package/src/permissions/hooks/usePermissions.ts +0 -196
- package/src/permissions/types/permission.ts +0 -27
- package/src/roles/hooks/useRoles.ts +0 -167
- package/src/roles/types/role.ts +0 -28
- package/src/ticket/hooks/useTickets.ts +0 -89
- package/src/ticket/types/ticket.ts +0 -88
- package/src/users/hooks/useUsers.ts +0 -150
- package/src/users/index.ts +0 -16
- package/src/users/types/user.ts +0 -36
- package/tsconfig.json +0 -29
- package/tsup.config.ts +0 -12
- /package/{src/health/index.ts → dist/health/index.js} +0 -0
- /package/{src/permissions/index.ts → dist/permissions/index.js} +0 -0
- /package/{src/permissions/types/index.ts → dist/permissions/types/index.js} +0 -0
- /package/{src/roles/index.ts → dist/roles/index.js} +0 -0
- /package/{src/roles/types/index.ts → dist/roles/types/index.js} +0 -0
- /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
|
-
}
|
package/src/live_chat/index.ts
DELETED
|
@@ -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
|
-
}
|
package/src/roles/types/role.ts
DELETED
|
@@ -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
|
-
};
|