@titus-system/syncdesk 0.4.0 → 0.5.0

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/CHANGELOG.md CHANGED
@@ -19,3 +19,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
19
19
  ### Security
20
20
 
21
21
  ### Dev Notes
22
+
23
+ ---
24
+
25
+ # 0.5.0 - 2026-04-04
26
+
27
+ ### Added
28
+
29
+ - Get a specific client's conversations.
package/README.md CHANGED
@@ -27,6 +27,36 @@ It creates a compressed tarball file in your folder. You can install it in your
27
27
  npm install /path/to/your/library-1.0.0.tgz
28
28
  ```
29
29
 
30
+ ### Configure your project to use the library
31
+
32
+ This lib requires some configuration to work properly, such as the API base URL.
33
+ To do so, you should call the `configLibrary` function in your project, passing the necessary configuration options. For example:
34
+
35
+ ```ts
36
+ import { configLibrary } from "@titus-system/syncdesk";
37
+ configureLibrary({
38
+ baseURL: 'http://localhost:8000/api', // should not be hardcoded, but in a .env file or similar
39
+
40
+ getAccessToken: () => localStorage.getItem('access_token'),
41
+ getRefreshToken: () => localStorage.getItem('refresh_token'),
42
+
43
+ onTokensRefreshed: (newAccess: string, newRefresh: string) => {
44
+ localStorage.setItem('access_token', newAccess)
45
+ localStorage.setItem('refresh_token', newRefresh)
46
+ },
47
+
48
+ onUnauthorized: () => {
49
+ localStorage.removeItem('access_token')
50
+ localStorage.removeItem('refresh_token')
51
+ window.location.href = '/login'
52
+
53
+ // // Mobile-specific logic to clear secure storage and navigate
54
+ // await SecureStore.deleteItemAsync('access_token')
55
+ // router.replace('/login')
56
+ }
57
+ })
58
+ ```
59
+
30
60
  ## Publish new version to npm registry
31
61
 
32
62
  ```sh
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@titus-system/syncdesk",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "author": "",
@@ -18,6 +18,7 @@ const PATH = "auth";
18
18
 
19
19
  /**
20
20
  * Get the currently authenticated user's profile.
21
+ * @returns {UseQueryResult<UserWithRoles, Error>} The query result.
21
22
  */
22
23
  export const useGetMe = () => {
23
24
  return useQuery({
@@ -38,6 +39,8 @@ export const useGetMe = () => {
38
39
  * Log in a user.
39
40
  *
40
41
  * Refresh tokens are handled automatically using Interceptors.
42
+ * @param {UserLoginRequest} credentials The user login credentials.
43
+ * @returns {UseMutationResult<LoginResponse, Error, UserLoginRequest>} The mutation result.
41
44
  */
42
45
  export const useLogin = () => {
43
46
  const queryClient = useQueryClient();
@@ -61,6 +64,8 @@ export const useLogin = () => {
61
64
 
62
65
  /**
63
66
  * Register a new user.
67
+ * @param {RegisterUserRequest} userData The user registration details.
68
+ * @returns {UseMutationResult<UserCreatedResponse, Error, RegisterUserRequest>} The mutation result.
64
69
  */
65
70
  export const useRegister = () => {
66
71
  const queryClient = useQueryClient();
@@ -84,6 +89,7 @@ export const useRegister = () => {
84
89
 
85
90
  /**
86
91
  * Log out the current user.
92
+ * @returns {UseMutationResult<void, Error, void>} The mutation result.
87
93
  */
88
94
  export const useLogout = () => {
89
95
  const queryClient = useQueryClient();
@@ -102,6 +108,8 @@ export const useLogout = () => {
102
108
 
103
109
  /**
104
110
  * Register a new user as admin.
111
+ * @param {AdminRegisterUserRequest} userData The admin user registration details.
112
+ * @returns {UseMutationResult<User, Error, AdminRegisterUserRequest>} The mutation result.
105
113
  */
106
114
  export const useAdminRegister = () => {
107
115
  const queryClient = useQueryClient();
@@ -121,7 +129,9 @@ export const useAdminRegister = () => {
121
129
  };
122
130
 
123
131
  /**
124
- * Change the password of the current user.
132
+ * Change the current user's password.
133
+ * @param {ChangePasswordRequest} data The password change request details.
134
+ * @returns {UseMutationResult<void, Error, ChangePasswordRequest>} The mutation result.
125
135
  */
126
136
  export const useChangePassword = () => {
127
137
  return useMutation({
@@ -132,7 +142,9 @@ export const useChangePassword = () => {
132
142
  };
133
143
 
134
144
  /**
135
- * Request a password reset email.
145
+ * Request a password reset.
146
+ * @param {ForgotPasswordRequest} data The forgot password request details.
147
+ * @returns {UseMutationResult<ForgotPasswordResponse, Error, ForgotPasswordRequest>} The mutation result.
136
148
  */
137
149
  export const useForgotPassword = () => {
138
150
  return useMutation({
@@ -148,7 +160,9 @@ export const useForgotPassword = () => {
148
160
  };
149
161
 
150
162
  /**
151
- * Reset a user's password using a valid reset token.
163
+ * Reset the current user's password using a valid reset token.
164
+ * @param {ResetPasswordRequest} data The reset password request details.
165
+ * @returns {UseMutationResult<void, Error, ResetPasswordRequest>} The mutation result.
152
166
  */
153
167
  export const useResetPassword = () => {
154
168
  return useMutation({
@@ -10,6 +10,7 @@ const PATH = "";
10
10
 
11
11
  /**
12
12
  * Ping the server to check for basic connectivity.
13
+ * @returns {UseQueryResult<PingResponse, Error>} The result.
13
14
  */
14
15
  export const usePing = () => {
15
16
  return useQuery({
@@ -25,6 +26,7 @@ export const usePing = () => {
25
26
 
26
27
  /**
27
28
  * Check the detailed health of the server and its dependencies (e.g. databases).
29
+ * @returns {UseQueryResult<HealthResponse, Error>} The result.
28
30
  */
29
31
  export const useHealth = () => {
30
32
  return useQuery({
@@ -40,6 +42,7 @@ export const useHealth = () => {
40
42
 
41
43
  /**
42
44
  * Check if the server is ready to accept traffic.
45
+ * @returns {UseQueryResult<ReadyResponse, Error>} The result.
43
46
  */
44
47
  export const useReady = () => {
45
48
  return useQuery({
@@ -9,8 +9,9 @@ import {
9
9
  const PATH = "/conversations";
10
10
 
11
11
  /**
12
- * Get all conversations recursively mapping to a ticket.
13
- * @param ticket_id
12
+ * Get all conversations of a ticket.
13
+ * @param {string} ticket_id ticket_id parameter.
14
+ * @returns {UseQueryResult<Conversation[]>} The query result.
14
15
  */
15
16
  export const useGetConversations = (ticket_id: string) => {
16
17
  return useQuery({
@@ -26,10 +27,29 @@ export const useGetConversations = (ticket_id: string) => {
26
27
  };
27
28
 
28
29
  /**
29
- * Get paginated messages for a ticket.
30
- * @param ticket_id
31
- * @param page
32
- * @param limit
30
+ * Get a specific client's conversations.
31
+ * @param {string} client_id client_id parameter.
32
+ * @returns {UseQueryResult<Conversation[]>} The query result.
33
+ */
34
+ export const useGetClientConversations = (client_id: string) => {
35
+ return useQuery({
36
+ queryKey: ["conversations", "client", client_id],
37
+ queryFn: async (): Promise<Conversation[]> => {
38
+ const response = await apiClient.get<ApiResponse<Conversation[]>>(
39
+ `${PATH}/client/${client_id}`,
40
+ );
41
+ return response.data.data;
42
+ },
43
+ enabled: !!client_id,
44
+ });
45
+ };
46
+
47
+ /**
48
+ * Get ticket messages with pagination.
49
+ * @param {string} ticket_id ticket_id parameter.
50
+ * @param {number} page page parameter.
51
+ * @param {number} limit limit parameter.
52
+ * @returns {UseQueryResult<PaginatedMessages>} The query result.
33
53
  */
34
54
  export const useGetPaginatedMessages = (
35
55
  ticket_id: string,
@@ -56,7 +76,9 @@ export const useGetPaginatedMessages = (
56
76
  };
57
77
 
58
78
  /**
59
- * Create a new conversation mapping to a ticket.
79
+ * Create a new conversation.
80
+ * @param {CreateConversationDTO} dto The conversation creation details.
81
+ * @returns {UseMutationResult<Conversation, Error, CreateConversationDTO>} The mutation result.
60
82
  */
61
83
  export const useCreateConversation = () => {
62
84
  const queryClient = useQueryClient();
@@ -79,6 +101,8 @@ export const useCreateConversation = () => {
79
101
 
80
102
  /**
81
103
  * Assign an agent to a conversation.
104
+ * @param {{ chat_id: string; agent_id: string }} params The chat ID and agent ID payload.
105
+ * @returns {UseMutationResult<void, Error, { chat_id: string; agent_id: string }>} The mutation result.
82
106
  */
83
107
  export const useSetConversationAgent = () => {
84
108
  const queryClient = useQueryClient();
@@ -93,9 +117,6 @@ export const useSetConversationAgent = () => {
93
117
  }): Promise<void> => {
94
118
  await apiClient.patch(`${PATH}/${chat_id}/set-agent/${agent_id}`);
95
119
  },
96
- // We invalidate the ticket conversations here.
97
- // To do so effectively, you may need the ticket_id, but the mutation only receives the chat_id.
98
- // If ticket list invalidation is required, invalidate the whole 'conversations' key.
99
120
  onSuccess: () => {
100
121
  queryClient.invalidateQueries({ queryKey: ["conversations"] });
101
122
  },
@@ -11,6 +11,10 @@ import type {
11
11
 
12
12
  const PATH = "/permissions";
13
13
 
14
+ /**
15
+ * List all permissions.
16
+ * @returns {UseQueryResult<Permission[]>} The query result.
17
+ */
14
18
  export function usePermissions() {
15
19
  return useQuery<Permission[]>({
16
20
  queryKey: ["permissions"],
@@ -23,6 +27,11 @@ export function usePermissions() {
23
27
  });
24
28
  }
25
29
 
30
+ /**
31
+ * Get a permission by ID.
32
+ * @param {number} id id parameter.
33
+ * @returns {UseQueryResult<Permission>} The query result.
34
+ */
26
35
  export function usePermission(id: number) {
27
36
  return useQuery<Permission>({
28
37
  queryKey: ["permissions", id],
@@ -36,6 +45,11 @@ export function usePermission(id: number) {
36
45
  });
37
46
  }
38
47
 
48
+ /**
49
+ * Create a new permission.
50
+ * @param {CreatePermissionDTO} dto DTO containing details.
51
+ * @returns {UseMutationResult<Permission, Error, CreatePermissionDTO>} The mutation result.
52
+ */
39
53
  export function useCreatePermission() {
40
54
  const queryClient = useQueryClient();
41
55
  return useMutation<Permission, Error, CreatePermissionDTO>({
@@ -52,6 +66,14 @@ export function useCreatePermission() {
52
66
  });
53
67
  }
54
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
+ */
55
77
  export function useReplacePermission() {
56
78
  const queryClient = useQueryClient();
57
79
  return useMutation<
@@ -73,6 +95,14 @@ export function useReplacePermission() {
73
95
  });
74
96
  }
75
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
+ */
76
106
  export function useUpdatePermission() {
77
107
  const queryClient = useQueryClient();
78
108
  return useMutation<
@@ -94,6 +124,11 @@ export function useUpdatePermission() {
94
124
  });
95
125
  }
96
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
+ */
97
132
  export function useDeletePermission() {
98
133
  const queryClient = useQueryClient();
99
134
  return useMutation<Permission, Error, number>({
@@ -110,6 +145,15 @@ export function useDeletePermission() {
110
145
  });
111
146
  }
112
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
+ */
113
157
  export function usePermissionRoles(id: number) {
114
158
  return useQuery<Permission>({
115
159
  queryKey: ["permissions", id, "roles"],
@@ -123,6 +167,14 @@ export function usePermissionRoles(id: number) {
123
167
  });
124
168
  }
125
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
+ */
126
178
  export function useAddPermissionRoles() {
127
179
  const queryClient = useQueryClient();
128
180
  return useMutation<
@@ -10,6 +10,10 @@ import type {
10
10
 
11
11
  const PATH = "/roles";
12
12
 
13
+ /**
14
+ * List all roles.
15
+ * @returns {UseQueryResult<Role[]>} The query result.
16
+ */
13
17
  export function useRoles() {
14
18
  return useQuery<Role[]>({
15
19
  queryKey: ["roles"],
@@ -20,6 +24,11 @@ export function useRoles() {
20
24
  });
21
25
  }
22
26
 
27
+ /**
28
+ * Get a role by ID.
29
+ * @param {number} id id parameter.
30
+ * @returns {UseQueryResult<Role>} The query result.
31
+ */
23
32
  export function useRole(id: number) {
24
33
  return useQuery<Role>({
25
34
  queryKey: ["roles", id],
@@ -31,6 +40,11 @@ export function useRole(id: number) {
31
40
  });
32
41
  }
33
42
 
43
+ /**
44
+ * Create a new role.
45
+ * @param {CreateRoleDTO} dto DTO containing details.
46
+ * @returns {UseMutationResult<Role, Error, CreateRoleDTO>} The mutation result.
47
+ */
34
48
  export function useCreateRole() {
35
49
  const queryClient = useQueryClient();
36
50
  return useMutation<Role, Error, CreateRoleDTO>({
@@ -44,6 +58,12 @@ export function useCreateRole() {
44
58
  });
45
59
  }
46
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
+ */
47
67
  export function useReplaceRole() {
48
68
  const queryClient = useQueryClient();
49
69
  return useMutation<Role, Error, { id: number; dto: ReplaceRoleDTO }>({
@@ -61,6 +81,12 @@ export function useReplaceRole() {
61
81
  });
62
82
  }
63
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
+ */
64
90
  export function useUpdateRole() {
65
91
  const queryClient = useQueryClient();
66
92
  return useMutation<Role, Error, { id: number; dto: UpdateRoleDTO }>({
@@ -78,6 +104,11 @@ export function useUpdateRole() {
78
104
  });
79
105
  }
80
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
+ */
81
112
  export function useDeleteRole() {
82
113
  const queryClient = useQueryClient();
83
114
  return useMutation<Role, Error, number>({
@@ -94,6 +125,11 @@ export function useDeleteRole() {
94
125
  });
95
126
  }
96
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
+ */
97
133
  export function useRolePermissions(id: number) {
98
134
  return useQuery<Role>({
99
135
  queryKey: ["roles", id, "permissions"],
@@ -107,6 +143,13 @@ export function useRolePermissions(id: number) {
107
143
  });
108
144
  }
109
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
+ */
110
153
  export function useAddRolePermissions() {
111
154
  const queryClient = useQueryClient();
112
155
  return useMutation<Role, Error, { id: number; dto: AddRolePermissionsDTO }>({
@@ -18,7 +18,11 @@ export const TICKET_KEYS = {
18
18
  [...TICKET_KEYS.all, "list", filters] as const,
19
19
  };
20
20
 
21
- /** Get all tickets. */
21
+ /**
22
+ * Get all tickets.
23
+ * @param {TicketSearchFilters} filters filters parameter.
24
+ * @returns {UseQueryResult<TicketResponse[]>} The query result.
25
+ */
22
26
  export const useTickets = (filters: TicketSearchFilters = {}) => {
23
27
  return useQuery({
24
28
  queryKey: TICKET_KEYS.list(filters),
@@ -32,7 +36,11 @@ export const useTickets = (filters: TicketSearchFilters = {}) => {
32
36
  });
33
37
  };
34
38
 
35
- /** Create a new ticket. */
39
+ /**
40
+ * Create a new ticket.
41
+ * @param {CreateTicketRequest} payload The ticket creation details.
42
+ * @returns {UseMutationResult<CreateTicketResponse, Error, CreateTicketRequest>} The mutation result.
43
+ */
36
44
  export const useCreateTicket = () => {
37
45
  const queryClient = useQueryClient();
38
46
 
@@ -53,7 +61,11 @@ export const useCreateTicket = () => {
53
61
  });
54
62
  };
55
63
 
56
- /** Update a ticket's status. */
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
+ */
57
69
  export const useUpdateTicketStatus = () => {
58
70
  const queryClient = useQueryClient();
59
71
 
@@ -12,7 +12,7 @@ const PATH = "/users";
12
12
 
13
13
  /**
14
14
  * Get all users.
15
- * @returns
15
+ * @returns {UseQueryResult<User[]>} The query result.
16
16
  */
17
17
  export const useGetUsers = () => {
18
18
  return useQuery({
@@ -28,8 +28,8 @@ export const useGetUsers = () => {
28
28
 
29
29
  /**
30
30
  * Get one user.
31
- * @param id
32
- * @returns
31
+ * @param {string} id id parameter.
32
+ * @returns {UseQueryResult<User>} The query result.
33
33
  */
34
34
  export const useGetUser = (id: string) => {
35
35
  return useQuery({
@@ -44,7 +44,8 @@ export const useGetUser = (id: string) => {
44
44
 
45
45
  /**
46
46
  * Create a user.
47
- * @returns
47
+ * @param {CreateUserDTO} user The user creation details.
48
+ * @returns {UseMutationResult<User, Error, CreateUserDTO>} The mutation result.
48
49
  */
49
50
  export const useCreateUser = () => {
50
51
  const queryClient = useQueryClient();
@@ -63,7 +64,8 @@ export const useCreateUser = () => {
63
64
 
64
65
  /**
65
66
  * Replace an entire user.
66
- * @returns
67
+ * @param {{ id: string; data: ReplaceUserDTO }} params The ID and user replacement data.
68
+ * @returns {UseMutationResult<User, Error, { id: string; data: ReplaceUserDTO }>} The mutation result.
67
69
  */
68
70
  export const useUpdateUser = () => {
69
71
  const queryClient = useQueryClient();
@@ -91,7 +93,8 @@ export const useUpdateUser = () => {
91
93
 
92
94
  /**
93
95
  * Update specific fields of a user.
94
- * @returns
96
+ * @param {{ id: string; data: UpdateUserDTO }} params The ID and user update data.
97
+ * @returns {UseMutationResult<User, Error, { id: string; data: UpdateUserDTO }>} The mutation result.
95
98
  */
96
99
  export const usePatchUser = () => {
97
100
  const queryClient = useQueryClient();
@@ -119,7 +122,8 @@ export const usePatchUser = () => {
119
122
 
120
123
  /**
121
124
  * Add roles to a user.
122
- * @returns
125
+ * @param {{ id: string; data: AddUserRolesDTO }} params The ID and user roles data.
126
+ * @returns {UseMutationResult<User, Error, { id: string; data: AddUserRolesDTO }>} The mutation result.
123
127
  */
124
128
  export const useAddUserRoles = () => {
125
129
  const queryClient = useQueryClient();
@@ -14,9 +14,3 @@ export type {
14
14
  ReplaceUserDTO,
15
15
  AddUserRolesDTO,
16
16
  } from "./types/user";
17
-
18
- // # syncdesk-api/app/api/api_router
19
- // - /auth/ -- /app/domains/auth/routers/auth_router
20
- // | `/api/users/` | User management (CRUD) |
21
- // | `/api/roles/` | Role management (CRUD) |
22
- // | `/api/permissions/` | Permission management (CRUD) |