@droppii-org/chat-sdk 0.1.1 → 0.1.3

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 (107) hide show
  1. package/dist/assets/sdk/sql-wasm.wasm +0 -0
  2. package/dist/components/conversation/ConversationBySessionItem.d.ts.map +1 -1
  3. package/dist/components/conversation/ConversationBySessionItem.js +6 -2
  4. package/dist/components/mediaCollection/LinkCollection.js +1 -1
  5. package/dist/components/message/MediaPreviewIcon.d.ts +7 -0
  6. package/dist/components/message/MediaPreviewIcon.d.ts.map +1 -0
  7. package/dist/components/message/MediaPreviewIcon.js +24 -0
  8. package/dist/components/message/MessageHeader.js +1 -1
  9. package/dist/components/message/MessageList.d.ts.map +1 -1
  10. package/dist/components/message/MessageList.js +48 -5
  11. package/dist/components/message/footer/ActionBar.d.ts.map +1 -1
  12. package/dist/components/message/footer/ActionBar.js +15 -86
  13. package/dist/components/message/footer/EmojiPicker.d.ts.map +1 -1
  14. package/dist/components/message/footer/EmojiPicker.js +9 -5
  15. package/dist/components/message/footer/EnterHandler.d.ts.map +1 -1
  16. package/dist/components/message/footer/EnterHandler.js +16 -5
  17. package/dist/components/message/footer/FilePreview.d.ts +5 -0
  18. package/dist/components/message/footer/FilePreview.d.ts.map +1 -1
  19. package/dist/components/message/footer/FilePreview.js +15 -12
  20. package/dist/components/message/footer/MediaActions.d.ts +10 -0
  21. package/dist/components/message/footer/MediaActions.d.ts.map +1 -0
  22. package/dist/components/message/footer/MediaActions.js +78 -0
  23. package/dist/components/message/footer/QuotedMessage.d.ts +2 -0
  24. package/dist/components/message/footer/QuotedMessage.d.ts.map +1 -0
  25. package/dist/components/message/footer/QuotedMessage.js +24 -0
  26. package/dist/components/message/footer/editorConfig.d.ts +24 -0
  27. package/dist/components/message/footer/editorConfig.d.ts.map +1 -0
  28. package/dist/components/message/footer/editorConfig.js +33 -0
  29. package/dist/components/message/footer/index.d.ts.map +1 -1
  30. package/dist/components/message/footer/index.js +6 -27
  31. package/dist/components/message/item/MessageStatusIndicator.d.ts +8 -0
  32. package/dist/components/message/item/MessageStatusIndicator.d.ts.map +1 -0
  33. package/dist/components/message/item/MessageStatusIndicator.js +16 -0
  34. package/dist/components/message/item/QuoteMessage.d.ts +9 -0
  35. package/dist/components/message/item/QuoteMessage.d.ts.map +1 -0
  36. package/dist/components/message/item/QuoteMessage.js +22 -0
  37. package/dist/components/message/item/RevokeMessage.d.ts +5 -0
  38. package/dist/components/message/item/RevokeMessage.d.ts.map +1 -0
  39. package/dist/components/message/item/RevokeMessage.js +8 -0
  40. package/dist/components/message/item/TextMessage.js +1 -1
  41. package/dist/components/message/item/UrlTextMessage.d.ts.map +1 -1
  42. package/dist/components/message/item/UrlTextMessage.js +3 -3
  43. package/dist/components/message/item/index.d.ts +6 -1
  44. package/dist/components/message/item/index.d.ts.map +1 -1
  45. package/dist/components/message/item/index.js +88 -25
  46. package/dist/components/richTextEditor/RichTextEditor.d.ts +12 -0
  47. package/dist/components/richTextEditor/RichTextEditor.d.ts.map +1 -0
  48. package/dist/components/richTextEditor/RichTextEditor.js +62 -0
  49. package/dist/components/searchConversation/SearchDrawer.js +1 -1
  50. package/dist/components/searchConversation/item/SearchItemAsMessage.d.ts +3 -1
  51. package/dist/components/searchConversation/item/SearchItemAsMessage.d.ts.map +1 -1
  52. package/dist/components/searchConversation/item/SearchItemAsMessage.js +5 -2
  53. package/dist/components/thread/AssignConfirmModal.d.ts +12 -0
  54. package/dist/components/thread/AssignConfirmModal.d.ts.map +1 -0
  55. package/dist/components/thread/AssignConfirmModal.js +11 -0
  56. package/dist/components/thread/ManualAssignPopover.d.ts +14 -0
  57. package/dist/components/thread/ManualAssignPopover.d.ts.map +1 -0
  58. package/dist/components/thread/ManualAssignPopover.js +83 -0
  59. package/dist/components/thread/SessionSection.d.ts.map +1 -1
  60. package/dist/components/thread/SessionSection.js +11 -6
  61. package/dist/components/thread/UserSection.js +1 -1
  62. package/dist/hooks/message/useMessage.d.ts +1 -0
  63. package/dist/hooks/message/useMessage.d.ts.map +1 -1
  64. package/dist/hooks/message/useMessage.js +7 -0
  65. package/dist/hooks/message/useRevokeMessage.d.ts +5 -0
  66. package/dist/hooks/message/useRevokeMessage.d.ts.map +1 -0
  67. package/dist/hooks/message/useRevokeMessage.js +16 -0
  68. package/dist/hooks/message/useSendMessage.d.ts +6 -0
  69. package/dist/hooks/message/useSendMessage.d.ts.map +1 -1
  70. package/dist/hooks/message/useSendMessage.js +170 -32
  71. package/dist/hooks/session/useAssignSession.d.ts +8 -0
  72. package/dist/hooks/session/useAssignSession.d.ts.map +1 -0
  73. package/dist/hooks/session/useAssignSession.js +15 -0
  74. package/dist/hooks/session/useCreateNote.d.ts.map +1 -1
  75. package/dist/hooks/session/useCreateNote.js +2 -1
  76. package/dist/hooks/session/useGetTeamSupporters.d.ts +8 -0
  77. package/dist/hooks/session/useGetTeamSupporters.d.ts.map +1 -0
  78. package/dist/hooks/session/useGetTeamSupporters.js +20 -0
  79. package/dist/index.d.ts +1 -0
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +1 -0
  82. package/dist/locales/vi/common.json +49 -37
  83. package/dist/services/query.d.ts +2 -0
  84. package/dist/services/query.d.ts.map +1 -1
  85. package/dist/services/query.js +2 -0
  86. package/dist/services/routes.d.ts +2 -0
  87. package/dist/services/routes.d.ts.map +1 -1
  88. package/dist/services/routes.js +2 -0
  89. package/dist/store/conversation.d.ts.map +1 -1
  90. package/dist/store/conversation.js +7 -1
  91. package/dist/styles/global.css +1 -1
  92. package/dist/tsconfig.tsbuildinfo +1 -1
  93. package/dist/types/chat.d.ts +1 -1
  94. package/dist/types/chat.d.ts.map +1 -1
  95. package/dist/types/dto.d.ts +26 -0
  96. package/dist/types/dto.d.ts.map +1 -1
  97. package/dist/utils/common.d.ts +3 -2
  98. package/dist/utils/common.d.ts.map +1 -1
  99. package/dist/utils/common.js +43 -19
  100. package/dist/utils/events.d.ts +1 -0
  101. package/dist/utils/events.d.ts.map +1 -1
  102. package/dist/utils/fileValidation.d.ts.map +1 -1
  103. package/dist/utils/fileValidation.js +2 -8
  104. package/dist/utils/queryHelpers.d.ts +3 -0
  105. package/dist/utils/queryHelpers.d.ts.map +1 -0
  106. package/dist/utils/queryHelpers.js +11 -0
  107. package/package.json +11 -10
@@ -1,13 +1,22 @@
1
- import { MessageStatus, } from "@openim/wasm-client-sdk";
1
+ import { MessageStatus, MessageType, } from "@openim/wasm-client-sdk";
2
2
  import { DChatSDK } from "../../constants/sdk";
3
3
  import { v4 as uuidv4 } from "uuid";
4
4
  import { useChatContext } from "../../context/ChatContext";
5
5
  import { useCallback } from "react";
6
- import { pushNewMessage, updateOneMessage } from "./useMessage";
6
+ import { useTranslation } from "react-i18next";
7
+ import { pushNewMessage, removeOneMessage, updateOneMessage, } from "./useMessage";
7
8
  import { emit } from "../../utils/events";
8
9
  import useConversationStore from "../../store/conversation";
9
10
  import useAuthStore from "../../store/auth";
10
11
  import { extractLinks, generateContentBasedOnMessageType, } from "../../utils/common";
12
+ const messageFileStore = new Map();
13
+ const MEDIA_CONTENT_TYPES = new Set([
14
+ MessageType.PictureMessage,
15
+ MessageType.VideoMessage,
16
+ MessageType.FileMessage,
17
+ ]);
18
+ export const isMediaResendable = (message) => !MEDIA_CONTENT_TYPES.has(message.contentType) ||
19
+ messageFileStore.has(message.clientMsgID);
11
20
  export const createTextMessage = async (text) => {
12
21
  let textMessage = await DChatSDK.createTextMessage(text, new Date().getTime().toString())
13
22
  .then(({ data }) => {
@@ -74,45 +83,152 @@ export const createUrlTextMessage = async (text, urls) => {
74
83
  });
75
84
  return textMessage;
76
85
  };
86
+ export const createQuoteMessage = async (text, quotedMessage) => {
87
+ let textMessage = await DChatSDK.createQuoteMessage({
88
+ text,
89
+ message: JSON.stringify(quotedMessage),
90
+ })
91
+ .then(({ data }) => {
92
+ return data;
93
+ })
94
+ .catch(({ errCode, errMsg }) => {
95
+ console.error("createQuoteMessage", errCode, errMsg);
96
+ return null;
97
+ });
98
+ return textMessage;
99
+ };
77
100
  export const useSendMessage = () => {
78
101
  const { user } = useChatContext();
102
+ const { t } = useTranslation("common");
79
103
  const conversationData = useConversationStore((state) => state.conversationData);
104
+ const quotedMessage = useConversationStore((state) => state.quotedMessage);
105
+ const setQuotedMessage = useConversationStore((state) => state.setQuotedMessage);
80
106
  const { userID: recvID, groupID } = conversationData || {};
107
+ const dispatchMessage = useCallback(async (message) => {
108
+ var _a;
109
+ const desc = generateContentBasedOnMessageType(message.contentType, ((_a = message === null || message === void 0 ? void 0 : message.textElem) === null || _a === void 0 ? void 0 : _a.content) || "") || t("new_message");
110
+ const { data: successMessage } = await DChatSDK.sendMessage({
111
+ recvID: recvID || "",
112
+ groupID: groupID || "",
113
+ message,
114
+ offlinePushInfo: {
115
+ title: (conversationData === null || conversationData === void 0 ? void 0 : conversationData.showName) || "Droppii Chat",
116
+ desc,
117
+ ex: JSON.stringify({
118
+ icon: (conversationData === null || conversationData === void 0 ? void 0 : conversationData.faceURL) || "",
119
+ conversationId: (conversationData === null || conversationData === void 0 ? void 0 : conversationData.conversationID) || "",
120
+ title: (conversationData === null || conversationData === void 0 ? void 0 : conversationData.showName) || "Droppii Chat",
121
+ desc,
122
+ }),
123
+ iOSPushSound: "default",
124
+ iOSBadgeCount: true,
125
+ },
126
+ });
127
+ updateOneMessage(successMessage);
128
+ messageFileStore.delete(message.clientMsgID);
129
+ }, [recvID, groupID]);
81
130
  const sendMessage = useCallback(async (message) => {
82
- var _a, _b;
131
+ pushNewMessage(message);
132
+ emit("CHAT_LIST_SCROLL_TO_BOTTOM");
83
133
  try {
84
- pushNewMessage(message);
85
- emit("CHAT_LIST_SCROLL_TO_BOTTOM");
86
- const { data: successMessage } = await DChatSDK.sendMessage({
87
- recvID: recvID || "",
88
- groupID: groupID || "",
89
- message: message,
90
- offlinePushInfo: {
91
- title: (conversationData === null || conversationData === void 0 ? void 0 : conversationData.showName) || "Droppii Chat",
92
- desc: `${generateContentBasedOnMessageType(message.contentType, ((_a = message === null || message === void 0 ? void 0 : message.textElem) === null || _a === void 0 ? void 0 : _a.content) || "")}` || "Bạn có tin nhắn mới",
93
- ex: JSON.stringify({
94
- icon: (conversationData === null || conversationData === void 0 ? void 0 : conversationData.faceURL) || "",
95
- conversationId: (conversationData === null || conversationData === void 0 ? void 0 : conversationData.conversationID) || "",
96
- title: (conversationData === null || conversationData === void 0 ? void 0 : conversationData.showName) || "Droppii Chat",
97
- desc: `${generateContentBasedOnMessageType(message.contentType, ((_b = message === null || message === void 0 ? void 0 : message.textElem) === null || _b === void 0 ? void 0 : _b.content) || "")}` || "Bạn có tin nhắn mới",
98
- }),
99
- iOSPushSound: "default",
100
- iOSBadgeCount: true,
101
- },
102
- });
103
- updateOneMessage(successMessage);
134
+ await dispatchMessage(message);
104
135
  }
105
- catch (error) {
136
+ catch (_a) {
106
137
  updateOneMessage(Object.assign(Object.assign({}, message), { status: MessageStatus.Failed }));
107
138
  }
108
- }, [recvID, groupID]);
139
+ }, [dispatchMessage]);
140
+ const resendMessage = useCallback(async (failedMessage) => {
141
+ var _a;
142
+ const storedFiles = messageFileStore.get(failedMessage.clientMsgID);
143
+ if (!storedFiles) {
144
+ let newTextPayload = null;
145
+ const textContent = ((_a = failedMessage.textElem) === null || _a === void 0 ? void 0 : _a.content) || failedMessage.content || "";
146
+ if (failedMessage.contentType === MessageType.UrlTextMessage &&
147
+ failedMessage.urlTextElem) {
148
+ newTextPayload = await createUrlTextMessage(textContent, failedMessage.urlTextElem.urls);
149
+ }
150
+ else {
151
+ newTextPayload = await createTextMessage(textContent);
152
+ }
153
+ if (!newTextPayload) {
154
+ updateOneMessage(Object.assign(Object.assign({}, failedMessage), { status: MessageStatus.Failed }));
155
+ return;
156
+ }
157
+ const conversationID = (conversationData === null || conversationData === void 0 ? void 0 : conversationData.conversationID) || "";
158
+ await DChatSDK.deleteMessageFromLocalStorage({
159
+ conversationID,
160
+ clientMsgID: failedMessage.clientMsgID,
161
+ });
162
+ removeOneMessage(failedMessage.clientMsgID);
163
+ await sendMessage(Object.assign(Object.assign({}, newTextPayload), { ex: failedMessage.ex }));
164
+ return;
165
+ }
166
+ let newPayload = null;
167
+ if (storedFiles.type === "image" && failedMessage.pictureElem) {
168
+ const { sourcePicture, bigPicture, snapshotPicture, sourcePath } = failedMessage.pictureElem;
169
+ newPayload = await createImageMessageByFile({
170
+ sourcePicture,
171
+ bigPicture,
172
+ snapshotPicture,
173
+ sourcePath,
174
+ file: storedFiles.file,
175
+ });
176
+ }
177
+ else if (storedFiles.type === "video" && failedMessage.videoElem) {
178
+ const elem = failedMessage.videoElem;
179
+ newPayload = await createVideoMessageByFile({
180
+ videoPath: elem.videoPath,
181
+ duration: elem.duration,
182
+ videoType: elem.videoType,
183
+ snapshotPath: elem.snapshotPath,
184
+ videoUUID: elem.videoUUID,
185
+ videoUrl: elem.videoUrl,
186
+ videoSize: elem.videoSize,
187
+ snapshotUUID: elem.snapshotUUID,
188
+ snapshotSize: elem.snapshotSize,
189
+ snapshotUrl: elem.snapshotUrl,
190
+ snapshotWidth: elem.snapshotWidth,
191
+ snapshotHeight: elem.snapshotHeight,
192
+ videoFile: storedFiles.videoFile,
193
+ snapshotFile: storedFiles.snapshotFile,
194
+ });
195
+ }
196
+ else if (storedFiles.type === "file" && failedMessage.fileElem) {
197
+ const elem = failedMessage.fileElem;
198
+ newPayload = await createFileMessageByFile({
199
+ filePath: elem.filePath,
200
+ fileName: elem.fileName,
201
+ uuid: elem.uuid,
202
+ sourceUrl: elem.sourceUrl,
203
+ fileSize: elem.fileSize,
204
+ file: storedFiles.file,
205
+ });
206
+ }
207
+ if (!newPayload) {
208
+ updateOneMessage(Object.assign(Object.assign({}, failedMessage), { status: MessageStatus.Failed }));
209
+ return;
210
+ }
211
+ messageFileStore.delete(failedMessage.clientMsgID);
212
+ messageFileStore.set(newPayload.clientMsgID, storedFiles);
213
+ const conversationID = (conversationData === null || conversationData === void 0 ? void 0 : conversationData.conversationID) || "";
214
+ await DChatSDK.deleteMessageFromLocalStorage({
215
+ conversationID,
216
+ clientMsgID: failedMessage.clientMsgID,
217
+ });
218
+ removeOneMessage(failedMessage.clientMsgID);
219
+ await sendMessage(Object.assign(Object.assign({}, newPayload), { ex: failedMessage.ex }));
220
+ }, [sendMessage]);
109
221
  const sendTextMessage = useCallback(async ({ plainText, richText, currentSession, }) => {
110
222
  if (!recvID && !groupID)
111
223
  return;
112
224
  const urls = extractLinks(plainText);
113
225
  const isUrlMessage = urls.length > 0;
114
226
  let message = null;
115
- if (isUrlMessage) {
227
+ if (!!(quotedMessage === null || quotedMessage === void 0 ? void 0 : quotedMessage.clientMsgID)) {
228
+ message = await createQuoteMessage(plainText, quotedMessage);
229
+ setQuotedMessage(null);
230
+ }
231
+ else if (isUrlMessage) {
116
232
  message = await createUrlTextMessage(plainText, urls);
117
233
  }
118
234
  else {
@@ -126,7 +242,7 @@ export const useSendMessage = () => {
126
242
  });
127
243
  let messageItem = Object.assign(Object.assign({}, message), { ex: JSON.stringify(extendMessageInfo) || "{}" });
128
244
  sendMessage(messageItem);
129
- }, [recvID, groupID, user, sendMessage]);
245
+ }, [recvID, groupID, user, sendMessage, quotedMessage, setQuotedMessage]);
130
246
  const sendMergeMessage = useCallback(async ({ richText, plainText, files, currentSession, }) => {
131
247
  if (!recvID && !groupID)
132
248
  return;
@@ -159,6 +275,10 @@ export const useSendMessage = () => {
159
275
  const imageMessage = await createImageMessageByFile(parsedImage);
160
276
  if (!imageMessage)
161
277
  continue;
278
+ messageFileStore.set(imageMessage.clientMsgID, {
279
+ type: "image",
280
+ file: file,
281
+ });
162
282
  messageList.push(imageMessage);
163
283
  }
164
284
  else if (isVideo) {
@@ -185,10 +305,15 @@ export const useSendMessage = () => {
185
305
  });
186
306
  if (!videoMessage)
187
307
  continue;
308
+ messageFileStore.set(videoMessage.clientMsgID, {
309
+ type: "video",
310
+ videoFile: file,
311
+ snapshotFile: thumbFile,
312
+ });
188
313
  messageList.push(videoMessage);
189
314
  }
190
315
  else if (isDocument) {
191
- const fileMessage = await createFileMessageByFile({
316
+ const fileParams = {
192
317
  filePath: "",
193
318
  fileName: file.name,
194
319
  uuid: uuidv4(),
@@ -196,9 +321,14 @@ export const useSendMessage = () => {
196
321
  fileSize: file.size,
197
322
  fileType: file.type,
198
323
  file: file,
199
- });
324
+ };
325
+ const fileMessage = await createFileMessageByFile(fileParams);
200
326
  if (!fileMessage)
201
327
  continue;
328
+ messageFileStore.set(fileMessage.clientMsgID, {
329
+ type: "file",
330
+ file: file,
331
+ });
202
332
  messageList.push(fileMessage);
203
333
  }
204
334
  }
@@ -207,23 +337,31 @@ export const useSendMessage = () => {
207
337
  }
208
338
  }
209
339
  if (!!plainText && plainText.trim() !== "") {
210
- const textMessage = await createTextMessage(plainText);
340
+ let textMessage = null;
341
+ if (quotedMessage) {
342
+ textMessage = await createQuoteMessage(plainText, quotedMessage);
343
+ setQuotedMessage(null);
344
+ }
345
+ else {
346
+ textMessage = await createTextMessage(plainText);
347
+ }
211
348
  if (!textMessage)
212
349
  return;
213
350
  messageList.push(textMessage);
214
351
  }
215
352
  for (const message of messageList) {
216
353
  const extendMessageInfo = generateExtendMessageInfo({
217
- richText,
354
+ richText: (message === null || message === void 0 ? void 0 : message.contentType) === MessageType.TextMessage ? richText : "",
218
355
  currentSession,
219
356
  });
220
357
  const mMessage = Object.assign(Object.assign({}, message), { ex: JSON.stringify(extendMessageInfo) || "{}" });
221
358
  await sendMessage(mMessage);
222
359
  }
223
- }, [recvID, groupID, sendMessage]);
360
+ }, [recvID, groupID, sendMessage, quotedMessage, setQuotedMessage]);
224
361
  return {
225
362
  sendTextMessage,
226
363
  sendMergeMessage,
364
+ resendMessage,
227
365
  };
228
366
  };
229
367
  export const generateExtendMessageInfo = ({ richText, currentSession, }) => {
@@ -0,0 +1,8 @@
1
+ import { BaseResponse } from "../../types/dto";
2
+ interface AssignSessionParams {
3
+ sessionId: string;
4
+ supporterId: string;
5
+ }
6
+ export declare const useAssignSession: () => import("@tanstack/react-query").UseMutationResult<BaseResponse<boolean>, Error, AssignSessionParams, unknown>;
7
+ export {};
8
+ //# sourceMappingURL=useAssignSession.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAssignSession.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useAssignSession.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,gBAAgB,qHAazB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { useMutation } from "@tanstack/react-query";
2
+ import { QUERY_KEYS } from "../../services/query";
3
+ import { apiInstance } from "../../services/api";
4
+ import { ENDPOINTS } from "../../services/routes";
5
+ import useAuthStore from "../../store/auth";
6
+ export const useAssignSession = () => useMutation({
7
+ mutationKey: [QUERY_KEYS.ASSIGN_SESSION],
8
+ mutationFn: async ({ sessionId, supporterId }) => {
9
+ const res = await apiInstance.post(ENDPOINTS.chatService.assignSession(sessionId), {
10
+ applicationType: useAuthStore.getState().applicationType,
11
+ supporterId,
12
+ });
13
+ return res === null || res === void 0 ? void 0 : res.data;
14
+ },
15
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"useCreateNote.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useCreateNote.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,eAAO,MAAM,aAAa;oBAQJ,MAAM;aACb,MAAM;cACL,MAAM;WAgBlB,CAAC"}
1
+ {"version":3,"file":"useCreateNote.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useCreateNote.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,eAAO,MAAM,aAAa;oBAQJ,MAAM;aACb,MAAM;cACL,MAAM;WAgBlB,CAAC"}
@@ -2,6 +2,7 @@ import { useMutation } from "@tanstack/react-query";
2
2
  import { QUERY_KEYS } from "../../services/query";
3
3
  import { apiInstance } from "../../services/api";
4
4
  import { ENDPOINTS } from "../../services/routes";
5
+ import { DChatApplicationType } from "../../types/chat";
5
6
  export const useCreateNote = () => useMutation({
6
7
  mutationKey: [QUERY_KEYS.CREATE_NOTE],
7
8
  mutationFn: async ({ conversationId, content, targetId, }) => {
@@ -11,7 +12,7 @@ export const useCreateNote = () => useMutation({
11
12
  targetId,
12
13
  targetType: "USER",
13
14
  }, {
14
- params: { applicationType: "OBEFE" },
15
+ params: { applicationType: DChatApplicationType.OBEFE },
15
16
  });
16
17
  return res === null || res === void 0 ? void 0 : res.data;
17
18
  },
@@ -0,0 +1,8 @@
1
+ import { ISupporterResponse } from "../../types/dto";
2
+ interface UseGetTeamSupportersParams {
3
+ teamId: string;
4
+ search?: string;
5
+ }
6
+ export declare const useGetTeamSupporters: ({ teamId, search, }: UseGetTeamSupportersParams) => import("@tanstack/react-query").UseQueryResult<ISupporterResponse[], Error>;
7
+ export {};
8
+ //# sourceMappingURL=useGetTeamSupporters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGetTeamSupporters.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useGetTeamSupporters.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGnE,UAAU,0BAA0B;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,oBAAoB,GAAI,qBAGlC,0BAA0B,gFAiBzB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { useQuery, keepPreviousData } from "@tanstack/react-query";
2
+ import { QUERY_KEYS } from "../../services/query";
3
+ import { apiInstance } from "../../services/api";
4
+ import { ENDPOINTS } from "../../services/routes";
5
+ import useAuthStore from "../../store/auth";
6
+ export const useGetTeamSupporters = ({ teamId, search, }) => useQuery({
7
+ queryKey: [QUERY_KEYS.GET_TEAM_SUPPORTERS, teamId, search],
8
+ queryFn: async () => {
9
+ var _a;
10
+ const res = await apiInstance.get(ENDPOINTS.chatService.getTeamSupporters(teamId), {
11
+ params: {
12
+ applicationType: useAuthStore.getState().applicationType,
13
+ search: search || null,
14
+ },
15
+ });
16
+ return (_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.data;
17
+ },
18
+ enabled: !!teamId,
19
+ placeholderData: keepPreviousData,
20
+ });
package/dist/index.d.ts CHANGED
@@ -12,6 +12,7 @@ export { default as qs } from "query-string";
12
12
  export * from "antd/es/table";
13
13
  export { ChatProvider, useChatContext } from "./context/ChatContext";
14
14
  export { DChatDeskMessage, DChatBubble, Icon };
15
+ export { default as RichTextEditor } from "./components/richTextEditor/RichTextEditor";
15
16
  export { useDChatAuth } from "./hooks/user/useAuth";
16
17
  export { useUpdateFcmToken } from "./hooks/user/useUpdateFcmToken";
17
18
  export { useUserStore, DChatApplicationType, useAuthStore };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AAExB,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;AACrD,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,MAAM,cAAc,CAAC;AAC7C,cAAc,eAAe,CAAC;AAG9B,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGrE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAG/C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,CAAC;AAI5D,OAAO,EACL,QAAQ,IAAI,aAAa,EACzB,QAAQ,IAAI,aAAa,EACzB,WAAW,IAAI,gBAAgB,GAChC,CAAC;AAEF,YAAY,EAAE,uBAAuB,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AAExB,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;AACrD,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,MAAM,cAAc,CAAC;AAC7C,cAAc,eAAe,CAAC;AAG9B,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGrE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAGvF,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAGnE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,CAAC;AAI5D,OAAO,EACL,QAAQ,IAAI,aAAa,EACzB,QAAQ,IAAI,aAAa,EACzB,WAAW,IAAI,gBAAgB,GAChC,CAAC;AAEF,YAAY,EAAE,uBAAuB,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -14,6 +14,7 @@ export * from "antd/es/table";
14
14
  export { ChatProvider, useChatContext } from "./context/ChatContext";
15
15
  //Components
16
16
  export { DChatDeskMessage, DChatBubble, Icon };
17
+ export { default as RichTextEditor } from "./components/richTextEditor/RichTextEditor";
17
18
  //Hooks
18
19
  export { useDChatAuth } from "./hooks/user/useAuth";
19
20
  export { useUpdateFcmToken } from "./hooks/user/useUpdateFcmToken";
@@ -42,41 +42,53 @@
42
42
  "create_note_failed": "Thêm ghi chú thất bại",
43
43
  "update_note_failed": "Cập nhật ghi chú thất bại",
44
44
  "copied_to_clipboard": "Đã sao chép",
45
- "save_success": "Lưu thành công!",
46
- "save_failed": "Lưu thất bại!",
47
- "cs_team_management": "Quản lý nhóm",
48
- "default_message": "Tin nhắn mặc định",
49
- "default_start_message_description": " Hiển thị tin nhắn này khi người dùng bắt đầu một phiên chat với nhân viên CS",
50
- "default_close_message_description": " Hiển thị tin nhắn này khi kết thúc phiên chat với nhân viên CS.",
51
- "cancel_changes": "Huỷ thay đổi",
52
- "cancel_changes_confirmation": "Rời trang huỷ thay đổi",
53
- "continue_editing": "Tiếp tục chỉnh sửa",
54
- "unsaved_changes_warning": " Các dữ liệu đang chỉnh sửa sẽ bị mất khi bạn rời trang. Bạn chắc chắn muốn huỷ thay đổi?",
55
- "group_deleted": "Xóa nhóm thành công!",
56
- "group_deleted_failed": "Xóa nhóm thất bại!",
57
- "create_group": "Tạo nhóm",
58
- "group_name": "Tên nhóm",
59
- "group_code": " nhóm",
60
- "group_members": "Thành viên",
61
- "group_description": " tả",
62
- "group_actions": "Thao tác",
63
- "edit": "Chỉnh sửa",
64
- "delete": "Xoá",
65
- "group_search": "Tìm theo tên nhóm",
66
- "group_delete": "Xoá CS Team",
67
- "group_delete_confirmation": "Các dữ liệu về team {{name}} sẽ mất hoàn toàn sau khi xoá. Bạn có chắc chắn muốn xoá?",
68
- "group_create_success": "Tạo nhóm thành công!",
69
- "group_create": "Tạo nhóm CS mới",
70
- "create": "Tạo",
71
- "add_member": "Thêm thành viên",
72
- "search_and_select_member": "Tìm kiếm chọn thành viên",
73
- "save": "Lưu",
74
- "create_new_group": "Tạo nhóm CS mới",
75
- "open_session": "Mở phiên",
76
- "close_session": "Đóng phiên",
77
- "validation": {
78
- "default_message": "Nhập nội dung tin nhắn mặc định",
79
- "group_name": "Thiếu tên nhóm",
80
- "group_name_length": "Số tự tối đa của tên nhóm là 200"
81
- }
45
+ "message_send_failed": "Gửi tin nhắn thất bại, bạn vui lòng <bold>nhấn để gửi lại</bold>",
46
+ "message_send_failed_no_retry": "Gửi tin nhắn thất bại",
47
+ "context_menu_reply": "Trả lời",
48
+ "context_menu_revoke": "Thu hồi",
49
+ "revoke_message_confirm_title": "Thu hồi tin nhắn?",
50
+ "revoke_message_confirm_message": "Bạn chắc chắn muốn thu hồi tin nhắn này?",
51
+ "revoke": "Thu hồi",
52
+ "revoked": "Đã thu hồi tin nhắn",
53
+ "manual_assign_search_placeholder": "Tìm kiếm",
54
+ "manual_assign_no_results": "Không kết quả phù hợp",
55
+ "manual_assign_confirm_question": "Phân công lại cho <bold>{{name}}</bold>?",
56
+ "manual_assign_button_reassign": "Phân công lại",
57
+ "manual_assign_success": "Phân công thành công",
58
+ "manual_assign_failed": "Phân công thất bại",
59
+ "manual_assign_current": "Đang xử lý",
60
+ "video_limit_exceeded": "Chỉ được phép tải lên 1 video duy nhất",
61
+ "select_status": "Chọn trạng thái",
62
+ "invalid_file_format": "{{fileName}} không đúng định dạng JPG, JPEG, PNG hoặc VIDEO",
63
+ "file_size_exceeded": "{{fileName}} có kích thước tập tin vượt quá {{maxSize}}MB",
64
+ "file_processing_error": "Đã xảy ra lỗi khi xử lý tệp",
65
+ "invalid_document_format": "{{fileName}} không đúng định dạng (chỉ hỗ trợ PDF, DOC, DOCX)",
66
+ "view_message": "Xem tin nhắn",
67
+ "search_message_title": "Tìm kiếm tin nhắn",
68
+ "msg_type_image": "[Hình ảnh]",
69
+ "msg_type_voice": "[Tin nhắn thoại]",
70
+ "msg_type_file": "[File đính kèm]",
71
+ "msg_type_link": "[Liên kết]",
72
+ "msg_type_unsupported": "Tin nhắn không khả dụng",
73
+ "session_started": "Phiên chat đã bắt đầu",
74
+ "session_ended": "Phiên chat đã kết thúc",
75
+ "new_message": "Bạn có tin nhắn mới",
76
+ "close_session_success": "Đóng phiên chat thành công",
77
+ "close_session_failed": "Đóng phiên chat thất bại",
78
+ "session_active": "Đang hoạt động",
79
+ "session_add_tag_placeholder": "Thêm thẻ...",
80
+ "session_issue_detail_placeholder": "Vấn đề cụ thể...",
81
+ "session_note_placeholder": "Ghi chú...",
82
+ "session_close_button": "Đóng",
83
+ "member_count": "{{count}} thành viên",
84
+ "choose_emoji": "Chọn biểu tượng cảm xúc",
85
+ "emoji_smileys": "Mặt cười",
86
+ "emoji_nature": "Động vật",
87
+ "emoji_food": "Đồ ăn",
88
+ "emoji_activities": "Hoạt động",
89
+ "session_label": "Phiên {{order}}",
90
+ "sessions_heading": "PHIÊN HỖ TRỢ",
91
+ "reply_to": "Đang trả lời {{name}}",
92
+ "your_self": "chính mình",
93
+ "replied_to": "{{from}} đã trả lời {{to}}"
82
94
  }
@@ -12,5 +12,7 @@ export declare const QUERY_KEYS: {
12
12
  UPDATE_SESSION_INFO: string;
13
13
  CLOSE_SESSION: string;
14
14
  GET_LABEL_SESSION: string;
15
+ GET_TEAM_SUPPORTERS: string;
16
+ ASSIGN_SESSION: string;
15
17
  };
16
18
  //# sourceMappingURL=query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/services/query.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;CActB,CAAC"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/services/query.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;CAgBtB,CAAC"}
@@ -12,4 +12,6 @@ export const QUERY_KEYS = {
12
12
  UPDATE_SESSION_INFO: "UPDATE_SESSION_INFO",
13
13
  CLOSE_SESSION: "CLOSE_SESSION",
14
14
  GET_LABEL_SESSION: "GET_LABEL_SESSION",
15
+ GET_TEAM_SUPPORTERS: "GET_TEAM_SUPPORTERS",
16
+ ASSIGN_SESSION: "ASSIGN_SESSION",
15
17
  };
@@ -13,6 +13,8 @@ export declare const ENDPOINTS: {
13
13
  updateSessionInfo: (sessionId: string) => string;
14
14
  closeSession: (sessionId: string) => string;
15
15
  getLabelSession: string;
16
+ getTeamSupporters: (teamId: string) => string;
17
+ assignSession: (sessionId: string) => string;
16
18
  };
17
19
  identityService: {
18
20
  getToken: string;
@@ -1 +1 @@
1
- {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/services/routes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;;;;mCAMS,MAAM;;0CAGC,MAAM,UAAU,MAAM;6BAEnC,MAAM;;oDAEiB,MAAM;uCAEnB,MAAM;kCAEX,MAAM;;;;;;;;;CAUnC,CAAC"}
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/services/routes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;;;;mCAMS,MAAM;;0CAGC,MAAM,UAAU,MAAM;6BAEnC,MAAM;;oDAEiB,MAAM;uCAEnB,MAAM;kCAEX,MAAM;;oCAGJ,MAAM;mCAEP,MAAM;;;;;;;;CASpC,CAAC"}
@@ -13,6 +13,8 @@ export const ENDPOINTS = {
13
13
  updateSessionInfo: (sessionId) => `chat-service/v1/crm/sessions/${sessionId}`,
14
14
  closeSession: (sessionId) => `chat-service/v1/crm/sessions/${sessionId}/close`,
15
15
  getLabelSession: "chat-service/v1/labels",
16
+ getTeamSupporters: (teamId) => `chat-service/v1/crm/teams/${teamId}/supporters`,
17
+ assignSession: (sessionId) => `chat-service/v1/crm/sessions/${sessionId}/assign`,
16
18
  },
17
19
  identityService: {
18
20
  getToken: "/identity-service/v1/identity/get-token",
@@ -1 +1 @@
1
- {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/store/conversation.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAO3C,QAAA,MAAM,oBAAoB,gFAwJvB,CAAC;AAEJ,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/store/conversation.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAO3C,QAAA,MAAM,oBAAoB,gFA8JvB,CAAC;AAEJ,eAAe,oBAAoB,CAAC"}
@@ -15,7 +15,7 @@ const useConversationStore = create((set, get) => ({
15
15
  searchClientMsgID: dataSearchClientMsgID,
16
16
  }),
17
17
  selectedConversationId: "",
18
- setSelectedConversationId: (threadId) => set({ selectedConversationId: threadId }),
18
+ setSelectedConversationId: (threadId) => set({ selectedConversationId: threadId, quotedMessage: null }),
19
19
  selectedSourceId: "",
20
20
  // conversation
21
21
  conversationList: [],
@@ -120,6 +120,7 @@ const useConversationStore = create((set, get) => ({
120
120
  unreadCount: 0,
121
121
  currentGroupInfo: undefined,
122
122
  currentMemberInGroup: undefined,
123
+ quotedMessage: null,
123
124
  });
124
125
  },
125
126
  //search
@@ -127,5 +128,10 @@ const useConversationStore = create((set, get) => ({
127
128
  setSearchClientMsgID: (clientMsgID) => {
128
129
  set({ searchClientMsgID: clientMsgID });
129
130
  },
131
+ //quoted message
132
+ quotedMessage: null,
133
+ setQuotedMessage: (message) => {
134
+ set({ quotedMessage: message });
135
+ },
130
136
  }));
131
137
  export default useConversationStore;