@droppii-org/chat-sdk 0.3.8 → 0.4.1

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 (290) hide show
  1. package/dist/components/canned-response/CannedResponseBody.js +1 -1
  2. package/dist/components/canned-response/CannedResponseFooter.js +1 -1
  3. package/dist/components/canned-response/CannedResponseHeader.js +1 -1
  4. package/dist/components/canned-response/index.js +1 -1
  5. package/dist/components/canned-response/team/TeamItem.js +1 -1
  6. package/dist/components/common/ConfirmModal.d.ts.map +1 -1
  7. package/dist/components/common/ConfirmModal.js +1 -1
  8. package/dist/components/common/InfoModal.d.ts.map +1 -1
  9. package/dist/components/common/InfoModal.js +1 -1
  10. package/dist/components/compose/ComposeNewMessageModal.d.ts.map +1 -1
  11. package/dist/components/compose/ComposeNewMessageModal.js +1 -1
  12. package/dist/components/conversation/ConversationByGroupItem.d.ts.map +1 -1
  13. package/dist/components/conversation/ConversationByGroupItem.js +2 -1
  14. package/dist/components/conversation/ConversationBySessionItem.d.ts.map +1 -1
  15. package/dist/components/conversation/ConversationBySessionItem.js +2 -1
  16. package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
  17. package/dist/components/conversation/DeskConversationList.js +1 -1
  18. package/dist/components/conversation/MentionIndicatorIcon.d.ts +7 -0
  19. package/dist/components/conversation/MentionIndicatorIcon.d.ts.map +1 -0
  20. package/dist/components/conversation/MentionIndicatorIcon.js +17 -0
  21. package/dist/components/conversation/SwipeActionButton.d.ts.map +1 -1
  22. package/dist/components/conversation/SwipeActionButton.js +1 -1
  23. package/dist/components/conversation/SwipeableRow.d.ts.map +1 -1
  24. package/dist/components/conversation/SwipeableRow.js +1 -1
  25. package/dist/components/conversation/ThreadCard.d.ts +2 -1
  26. package/dist/components/conversation/ThreadCard.d.ts.map +1 -1
  27. package/dist/components/conversation/ThreadCard.js +4 -4
  28. package/dist/components/conversation-detail/ConversationDetailHeader.d.ts.map +1 -1
  29. package/dist/components/conversation-detail/ConversationDetailHeader.js +2 -2
  30. package/dist/components/conversation-detail/ConversationDetailInput.d.ts.map +1 -1
  31. package/dist/components/conversation-detail/ConversationDetailInput.js +5 -1
  32. package/dist/components/conversation-detail/ConversationMessageList.d.ts.map +1 -1
  33. package/dist/components/conversation-detail/ConversationMessageList.js +1 -1
  34. package/dist/components/conversation-detail/ConversationMoreOptionItem.d.ts.map +1 -1
  35. package/dist/components/conversation-detail/ConversationMoreOptionItem.js +1 -1
  36. package/dist/components/conversation-detail/ConversationMoreOptionPanel.d.ts.map +1 -1
  37. package/dist/components/conversation-detail/ConversationMoreOptionPanel.js +1 -1
  38. package/dist/components/conversation-detail/LeaveGroupBlockedModal.d.ts +12 -0
  39. package/dist/components/conversation-detail/LeaveGroupBlockedModal.d.ts.map +1 -0
  40. package/dist/components/conversation-detail/LeaveGroupBlockedModal.js +18 -0
  41. package/dist/components/conversation-detail/LeaveGroupConfirmModal.d.ts +16 -0
  42. package/dist/components/conversation-detail/LeaveGroupConfirmModal.d.ts.map +1 -0
  43. package/dist/components/conversation-detail/LeaveGroupConfirmModal.js +21 -0
  44. package/dist/components/conversation-detail/PinLimitModal.d.ts.map +1 -1
  45. package/dist/components/conversation-detail/PinLimitModal.js +1 -1
  46. package/dist/components/conversation-detail/PinnedMessageBar.d.ts.map +1 -1
  47. package/dist/components/conversation-detail/PinnedMessageBar.js +8 -4
  48. package/dist/components/conversation-detail/PinnedMessageItem.d.ts.map +1 -1
  49. package/dist/components/conversation-detail/PinnedMessageItem.js +1 -1
  50. package/dist/components/conversation-detail/PinnedMessagesPanel.d.ts.map +1 -1
  51. package/dist/components/conversation-detail/PinnedMessagesPanel.js +1 -1
  52. package/dist/components/conversation-detail/ThreadProfilePanel.d.ts.map +1 -1
  53. package/dist/components/conversation-detail/ThreadProfilePanel.js +12 -2
  54. package/dist/components/conversation-detail/bot/BotButtonMessage.d.ts.map +1 -1
  55. package/dist/components/conversation-detail/bot/BotButtonMessage.js +1 -1
  56. package/dist/components/conversation-detail/bot/BotInactiveNotice.d.ts.map +1 -1
  57. package/dist/components/conversation-detail/bot/BotInactiveNotice.js +1 -1
  58. package/dist/components/conversation-detail/bot/BotMenuSheet.d.ts.map +1 -1
  59. package/dist/components/conversation-detail/bot/BotMenuSheet.js +1 -1
  60. package/dist/components/conversation-detail/bot/BotStartButton.d.ts.map +1 -1
  61. package/dist/components/conversation-detail/bot/BotStartButton.js +1 -1
  62. package/dist/components/conversation-detail/bot/BotSuggest.d.ts.map +1 -1
  63. package/dist/components/conversation-detail/bot/BotSuggest.js +2 -2
  64. package/dist/components/conversation-detail/bot/CsSessionConfirmModal.d.ts.map +1 -1
  65. package/dist/components/conversation-detail/bot/CsSessionConfirmModal.js +1 -1
  66. package/dist/components/conversation-detail/index.d.ts +4 -0
  67. package/dist/components/conversation-detail/index.d.ts.map +1 -1
  68. package/dist/components/conversation-detail/index.js +2 -0
  69. package/dist/components/conversation-inbox/ConversationInboxHeader.d.ts.map +1 -1
  70. package/dist/components/conversation-inbox/ConversationInboxHeader.js +1 -1
  71. package/dist/components/conversation-inbox/ConversationInboxItem.d.ts.map +1 -1
  72. package/dist/components/conversation-inbox/ConversationInboxItem.js +2 -1
  73. package/dist/components/conversation-inbox/ConversationInboxList.d.ts.map +1 -1
  74. package/dist/components/conversation-inbox/ConversationInboxList.js +1 -1
  75. package/dist/components/conversation-inbox/ConversationInboxTitle.d.ts.map +1 -1
  76. package/dist/components/conversation-inbox/ConversationInboxTitle.js +1 -1
  77. package/dist/components/conversation-inbox/ConversationPeerAvatar.d.ts.map +1 -1
  78. package/dist/components/conversation-inbox/ConversationPeerAvatar.js +1 -1
  79. package/dist/components/conversation-inbox/MuteConversationConfirmModal.d.ts.map +1 -1
  80. package/dist/components/conversation-inbox/MuteConversationConfirmModal.js +1 -1
  81. package/dist/components/group/AddMemberModal.d.ts.map +1 -1
  82. package/dist/components/group/AddMemberModal.js +1 -1
  83. package/dist/components/group/CreateGroupForm.d.ts.map +1 -1
  84. package/dist/components/group/CreateGroupForm.js +1 -3
  85. package/dist/components/group/GroupMemberPicker.js +1 -1
  86. package/dist/components/group/MemberPermissionPanel.js +1 -1
  87. package/dist/components/icon/index.d.ts.map +1 -1
  88. package/dist/components/icon/index.js +1 -1
  89. package/dist/components/media-collection/FileCollection.d.ts.map +1 -1
  90. package/dist/components/media-collection/FileCollection.js +1 -1
  91. package/dist/components/media-collection/ImageCollection.d.ts.map +1 -1
  92. package/dist/components/media-collection/ImageCollection.js +1 -1
  93. package/dist/components/media-collection/LinkCollection.d.ts.map +1 -1
  94. package/dist/components/media-collection/LinkCollection.js +2 -2
  95. package/dist/components/media-collection/VideoCollection.d.ts.map +1 -1
  96. package/dist/components/media-collection/VideoCollection.js +1 -1
  97. package/dist/components/media-collection/index.js +1 -1
  98. package/dist/components/media-resources/FileResourceList.d.ts.map +1 -1
  99. package/dist/components/media-resources/FileResourceList.js +1 -1
  100. package/dist/components/media-resources/ImageResourceGrid.d.ts.map +1 -1
  101. package/dist/components/media-resources/ImageResourceGrid.js +1 -1
  102. package/dist/components/media-resources/LinkResourceItem.d.ts.map +1 -1
  103. package/dist/components/media-resources/LinkResourceItem.js +1 -1
  104. package/dist/components/media-resources/LinkResourceList.d.ts.map +1 -1
  105. package/dist/components/media-resources/LinkResourceList.js +1 -1
  106. package/dist/components/media-resources/MediaEntryCard.d.ts.map +1 -1
  107. package/dist/components/media-resources/MediaEntryCard.js +1 -1
  108. package/dist/components/media-resources/MediaResourcePanel.d.ts.map +1 -1
  109. package/dist/components/media-resources/MediaResourcePanel.js +1 -1
  110. package/dist/components/media-resources/MediaResourceTabBar.d.ts.map +1 -1
  111. package/dist/components/media-resources/MediaResourceTabBar.js +1 -1
  112. package/dist/components/media-resources/MediaResourceTabs.js +1 -1
  113. package/dist/components/media-resources/ResourceEmptyState.d.ts.map +1 -1
  114. package/dist/components/media-resources/ResourceEmptyState.js +1 -1
  115. package/dist/components/media-resources/ResourceScrollContainer.d.ts.map +1 -1
  116. package/dist/components/media-resources/ResourceScrollContainer.js +1 -1
  117. package/dist/components/media-resources/VideoResourceGrid.d.ts.map +1 -1
  118. package/dist/components/media-resources/VideoResourceGrid.js +1 -1
  119. package/dist/components/message/GroupMembersDrawer.js +1 -1
  120. package/dist/components/message/MessageHeader.d.ts.map +1 -1
  121. package/dist/components/message/MessageHeader.js +3 -2
  122. package/dist/components/message/MessageInfiniteScroll.d.ts.map +1 -1
  123. package/dist/components/message/MessageInfiniteScroll.js +1 -1
  124. package/dist/components/message/MessageList.d.ts.map +1 -1
  125. package/dist/components/message/MessageList.js +22 -12
  126. package/dist/components/message/SelectSession.js +1 -1
  127. package/dist/components/message/UnassignedSessionFooter.d.ts.map +1 -1
  128. package/dist/components/message/UnassignedSessionFooter.js +1 -1
  129. package/dist/components/message/footer/ActionBar.d.ts.map +1 -1
  130. package/dist/components/message/footer/ActionBar.js +4 -1
  131. package/dist/components/message/footer/ComposerEditor.js +1 -1
  132. package/dist/components/message/footer/ComposerTabs.d.ts.map +1 -1
  133. package/dist/components/message/footer/ComposerTabs.js +1 -1
  134. package/dist/components/message/footer/EmojiPicker.js +1 -1
  135. package/dist/components/message/footer/EnterHandler.d.ts.map +1 -1
  136. package/dist/components/message/footer/EnterHandler.js +10 -1
  137. package/dist/components/message/footer/FilePreview.d.ts.map +1 -1
  138. package/dist/components/message/footer/FilePreview.js +4 -4
  139. package/dist/components/message/footer/LinkInputPreview.d.ts.map +1 -1
  140. package/dist/components/message/footer/LinkInputPreview.js +1 -1
  141. package/dist/components/message/footer/MediaActions.js +1 -1
  142. package/dist/components/message/footer/SessionClosedModal.d.ts.map +1 -1
  143. package/dist/components/message/footer/SessionClosedModal.js +1 -1
  144. package/dist/components/message/footer/ToolbarPlugin.js +1 -1
  145. package/dist/components/message/footer/editorConfig.d.ts +2 -1
  146. package/dist/components/message/footer/editorConfig.d.ts.map +1 -1
  147. package/dist/components/message/footer/editorConfig.js +2 -0
  148. package/dist/components/message/footer/index.d.ts.map +1 -1
  149. package/dist/components/message/footer/index.js +16 -2
  150. package/dist/components/message/footer/mention/MentionMenu.d.ts +6 -0
  151. package/dist/components/message/footer/mention/MentionMenu.d.ts.map +1 -0
  152. package/dist/components/message/footer/mention/MentionMenu.js +51 -0
  153. package/dist/components/message/footer/mention/MentionNode.d.ts +20 -0
  154. package/dist/components/message/footer/mention/MentionNode.d.ts.map +1 -0
  155. package/dist/components/message/footer/mention/MentionNode.js +39 -0
  156. package/dist/components/message/footer/mention/extractMentions.d.ts +6 -0
  157. package/dist/components/message/footer/mention/extractMentions.d.ts.map +1 -0
  158. package/dist/components/message/footer/mention/extractMentions.js +66 -0
  159. package/dist/components/message/footer/mention/useMentionOptions.d.ts +8 -0
  160. package/dist/components/message/footer/mention/useMentionOptions.d.ts.map +1 -0
  161. package/dist/components/message/footer/mention/useMentionOptions.js +45 -0
  162. package/dist/components/message/item/AtTextMessage.d.ts +16 -0
  163. package/dist/components/message/item/AtTextMessage.d.ts.map +1 -0
  164. package/dist/components/message/item/AtTextMessage.js +112 -0
  165. package/dist/components/message/item/FileMessage.js +1 -1
  166. package/dist/components/message/item/GroupNotificationMessage.d.ts.map +1 -1
  167. package/dist/components/message/item/GroupNotificationMessage.js +2 -2
  168. package/dist/components/message/item/ImageMessage.js +1 -1
  169. package/dist/components/message/item/LinkCard.d.ts.map +1 -1
  170. package/dist/components/message/item/LinkCard.js +1 -1
  171. package/dist/components/message/item/LinkText.d.ts.map +1 -1
  172. package/dist/components/message/item/LinkText.js +1 -1
  173. package/dist/components/message/item/MergeImageMessage.js +1 -1
  174. package/dist/components/message/item/MessageBubble.d.ts.map +1 -1
  175. package/dist/components/message/item/MessageBubble.js +2 -2
  176. package/dist/components/message/item/QuoteMessage.d.ts.map +1 -1
  177. package/dist/components/message/item/QuoteMessage.js +1 -1
  178. package/dist/components/message/item/RevokeMessage.d.ts.map +1 -1
  179. package/dist/components/message/item/RevokeMessage.js +1 -1
  180. package/dist/components/message/item/VideoMessage.js +1 -1
  181. package/dist/components/message/item/index.d.ts.map +1 -1
  182. package/dist/components/message/item/index.js +3 -3
  183. package/dist/components/message/item/renderMessageContent.d.ts.map +1 -1
  184. package/dist/components/message/item/renderMessageContent.js +3 -0
  185. package/dist/components/message/reply/ReplyPreviewBar.d.ts.map +1 -1
  186. package/dist/components/message/reply/ReplyPreviewBar.js +1 -1
  187. package/dist/components/message/reply/ReplyQuoteContent.d.ts.map +1 -1
  188. package/dist/components/message/reply/ReplyQuoteContent.js +7 -5
  189. package/dist/components/message/toolbox/MessageToolboxMenu.js +1 -1
  190. package/dist/components/message/toolbox/getCopyableMessageText.d.ts.map +1 -1
  191. package/dist/components/message/toolbox/getCopyableMessageText.js +5 -3
  192. package/dist/components/message/toolbox/isPinnableMessageType.d.ts.map +1 -1
  193. package/dist/components/message/toolbox/isPinnableMessageType.js +1 -0
  194. package/dist/components/search-conversation/SearchAll.d.ts.map +1 -1
  195. package/dist/components/search-conversation/SearchAll.js +9 -3
  196. package/dist/components/search-conversation/SearchConversationAsGroups.d.ts +6 -0
  197. package/dist/components/search-conversation/SearchConversationAsGroups.d.ts.map +1 -0
  198. package/dist/components/search-conversation/SearchConversationAsGroups.js +20 -0
  199. package/dist/components/search-conversation/SearchConversationAsMessages.d.ts.map +1 -1
  200. package/dist/components/search-conversation/SearchConversationAsMessages.js +1 -1
  201. package/dist/components/search-conversation/SearchConversationAsUsers.d.ts.map +1 -1
  202. package/dist/components/search-conversation/SearchConversationAsUsers.js +1 -1
  203. package/dist/components/search-conversation/SearchConversationMyInbox.js +1 -1
  204. package/dist/components/search-conversation/SearchDrawer.js +1 -1
  205. package/dist/components/search-conversation/SearchMessageOnCurrentConversation.d.ts.map +1 -1
  206. package/dist/components/search-conversation/SearchMessageOnCurrentConversation.js +1 -1
  207. package/dist/components/search-conversation/index.d.ts +2 -1
  208. package/dist/components/search-conversation/index.d.ts.map +1 -1
  209. package/dist/components/search-conversation/index.js +8 -1
  210. package/dist/components/search-conversation/item/SearchItemAsGroup.d.ts +8 -0
  211. package/dist/components/search-conversation/item/SearchItemAsGroup.d.ts.map +1 -0
  212. package/dist/components/search-conversation/item/SearchItemAsGroup.js +34 -0
  213. package/dist/components/search-conversation/item/SearchItemAsMessage.d.ts.map +1 -1
  214. package/dist/components/search-conversation/item/SearchItemAsMessage.js +1 -1
  215. package/dist/components/search-conversation/item/SearchItemAsUser.d.ts.map +1 -1
  216. package/dist/components/search-conversation/item/SearchItemAsUser.js +1 -1
  217. package/dist/components/session/DeskTeamInbox.d.ts.map +1 -1
  218. package/dist/components/session/DeskTeamInbox.js +3 -2
  219. package/dist/components/session/SessionFilterMenu.d.ts.map +1 -1
  220. package/dist/components/session/SessionFilterMenu.js +1 -1
  221. package/dist/components/thread/AssignConfirmModal.d.ts.map +1 -1
  222. package/dist/components/thread/AssignConfirmModal.js +1 -1
  223. package/dist/components/thread/GroupThreadInfo.d.ts.map +1 -1
  224. package/dist/components/thread/GroupThreadInfo.js +7 -4
  225. package/dist/components/thread/ManualAssignPopover.d.ts.map +1 -1
  226. package/dist/components/thread/ManualAssignPopover.js +1 -1
  227. package/dist/components/thread/SessionSection.d.ts.map +1 -1
  228. package/dist/components/thread/SessionSection.js +2 -2
  229. package/dist/components/thread/SingleThreadInfo.d.ts.map +1 -1
  230. package/dist/components/thread/SingleThreadInfo.js +1 -1
  231. package/dist/components/thread/ThreadInfo.js +1 -1
  232. package/dist/components/thread/UserSection.d.ts.map +1 -1
  233. package/dist/components/thread/UserSection.js +1 -1
  234. package/dist/components/video-player/VideoPlayerModal.d.ts.map +1 -1
  235. package/dist/components/video-player/VideoPlayerModal.js +1 -1
  236. package/dist/context/ChatContext.d.ts +1 -1
  237. package/dist/context/ChatContext.d.ts.map +1 -1
  238. package/dist/context/ChatContext.js +2 -1
  239. package/dist/hooks/global/useGlobalEvent.d.ts.map +1 -1
  240. package/dist/hooks/global/useGlobalEvent.js +125 -25
  241. package/dist/hooks/group/useConversationGroups.d.ts +5 -1
  242. package/dist/hooks/group/useConversationGroups.d.ts.map +1 -1
  243. package/dist/hooks/group/useConversationGroups.js +3 -3
  244. package/dist/hooks/group/useGroupPermission.d.ts +1 -1
  245. package/dist/hooks/group/useGroupPermission.d.ts.map +1 -1
  246. package/dist/hooks/group/useGroupPermission.js +2 -2
  247. package/dist/hooks/group/useLeaveGroupAction.d.ts +24 -0
  248. package/dist/hooks/group/useLeaveGroupAction.d.ts.map +1 -0
  249. package/dist/hooks/group/useLeaveGroupAction.js +79 -0
  250. package/dist/hooks/group/useQuitGroup.d.ts +6 -0
  251. package/dist/hooks/group/useQuitGroup.d.ts.map +1 -0
  252. package/dist/hooks/group/useQuitGroup.js +62 -0
  253. package/dist/hooks/message/useMessage.d.ts +4 -1
  254. package/dist/hooks/message/useMessage.d.ts.map +1 -1
  255. package/dist/hooks/message/useMessage.js +9 -2
  256. package/dist/hooks/message/useSendMessage.d.ts +8 -4
  257. package/dist/hooks/message/useSendMessage.d.ts.map +1 -1
  258. package/dist/hooks/message/useSendMessage.js +46 -12
  259. package/dist/hooks/search/useSearchGroups.d.ts +16 -0
  260. package/dist/hooks/search/useSearchGroups.d.ts.map +1 -0
  261. package/dist/hooks/search/useSearchGroups.js +65 -0
  262. package/dist/hooks/session/useConversationSessionState.d.ts +2 -1
  263. package/dist/hooks/session/useConversationSessionState.d.ts.map +1 -1
  264. package/dist/hooks/session/useConversationSessionState.js +5 -5
  265. package/dist/layout/index.d.ts.map +1 -1
  266. package/dist/layout/index.js +10 -1
  267. package/dist/locales/vi/common.json +12 -0
  268. package/dist/locales/vi/conversation-inbox.json +18 -1
  269. package/dist/services/query.d.ts +1 -0
  270. package/dist/services/query.d.ts.map +1 -1
  271. package/dist/services/query.js +1 -0
  272. package/dist/services/routes.d.ts +1 -0
  273. package/dist/services/routes.d.ts.map +1 -1
  274. package/dist/services/routes.js +1 -0
  275. package/dist/store/auth.js +1 -1
  276. package/dist/store/conversation.d.ts.map +1 -1
  277. package/dist/store/conversation.js +96 -51
  278. package/dist/store/type.d.ts +8 -2
  279. package/dist/store/type.d.ts.map +1 -1
  280. package/dist/styles/global.css +1 -1
  281. package/dist/types/chat.d.ts +28 -2
  282. package/dist/types/chat.d.ts.map +1 -1
  283. package/dist/types/dto.d.ts +3 -1
  284. package/dist/types/dto.d.ts.map +1 -1
  285. package/dist/utils/common.d.ts.map +1 -1
  286. package/dist/utils/common.js +19 -9
  287. package/dist/utils/messageLog.d.ts +2 -2
  288. package/dist/utils/messageLog.d.ts.map +1 -1
  289. package/dist/utils/messageLog.js +33 -3
  290. package/package.json +17 -3
@@ -56,8 +56,8 @@ export const permissionListToGroupPermissions = (permissionList, roleLevel) => {
56
56
  permissionList.includes(permissionString),
57
57
  ]));
58
58
  };
59
- export const useGroupPermission = (_groupID) => {
60
- const currentMemberInGroup = useConversationStore((state) => state.currentMemberInGroup);
59
+ export const useGroupPermission = (groupID) => {
60
+ const currentMemberInGroup = useConversationStore((state) => groupID ? state.currentMemberInGroup.get(groupID) : undefined);
61
61
  return useMemo(() => {
62
62
  var _a;
63
63
  const roleLevel = (_a = currentMemberInGroup === null || currentMemberInGroup === void 0 ? void 0 : currentMemberInGroup.roleLevel) !== null && _a !== void 0 ? _a : GroupMemberRole.Normal;
@@ -0,0 +1,24 @@
1
+ interface UseLeaveGroupActionParams {
2
+ groupID?: string;
3
+ conversationID?: string;
4
+ isGroupThread: boolean;
5
+ onLeft?: () => void;
6
+ }
7
+ /**
8
+ * Owns the "Rời nhóm" flow: who may leave, which modal opens, and the
9
+ * quitGroup call itself. Kept out of the panel so the panel stays
10
+ * presentational as more group-info rows land from sibling tickets.
11
+ */
12
+ export declare const useLeaveGroupAction: ({ groupID, conversationID, isGroupThread, onLeft, }: UseLeaveGroupActionParams) => {
13
+ canLeaveGroup: boolean;
14
+ isPublicGroup: boolean;
15
+ isLeaving: boolean;
16
+ isConfirmOpen: boolean;
17
+ isBlockedOpen: boolean;
18
+ openLeaveGroup: () => void;
19
+ confirmLeaveGroup: () => Promise<void>;
20
+ closeConfirm: () => void;
21
+ closeBlocked: () => void;
22
+ };
23
+ export {};
24
+ //# sourceMappingURL=useLeaveGroupAction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLeaveGroupAction.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useLeaveGroupAction.ts"],"names":[],"mappings":"AAUA,UAAU,yBAAyB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,qDAKjC,yBAAyB;;;;;;;;;;CA+E3B,CAAC"}
@@ -0,0 +1,79 @@
1
+ "use client";
2
+ import { useState } from "react";
3
+ import { message } from "antd";
4
+ import { useTranslation } from "react-i18next";
5
+ import { GroupMemberRole, GroupVisibility } from "@droppii-org/wasm-client-sdk";
6
+ import useConversationStore from "../../store/conversation";
7
+ import useAuthStore from "../../store/auth";
8
+ import { useQuitGroup } from "./useQuitGroup";
9
+ /**
10
+ * Owns the "Rời nhóm" flow: who may leave, which modal opens, and the
11
+ * quitGroup call itself. Kept out of the panel so the panel stays
12
+ * presentational as more group-info rows land from sibling tickets.
13
+ */
14
+ export const useLeaveGroupAction = ({ groupID, conversationID, isGroupThread, onLeft, }) => {
15
+ const { t } = useTranslation("conversation-inbox");
16
+ const currentGroupInfo = useConversationStore((state) => groupID ? state.currentGroupInfo.get(groupID) : undefined);
17
+ const currentMemberInGroup = useConversationStore((state) => groupID ? state.currentMemberInGroup.get(groupID) : undefined);
18
+ const isViewOnlyMember = useConversationStore((state) => state.isViewOnlyMember);
19
+ // useAuthStore.userID is the canonical self ID here (ChatContext populates
20
+ // it on init). useUserStore.selfInfo is never filled in this host, so its
21
+ // `id` is undefined — which is also why roleLevel below stays undefined.
22
+ const selfUserID = useAuthStore((state) => state.userID);
23
+ const { mutateAsync: quitGroup, isPending: isLeaving } = useQuitGroup();
24
+ const [isConfirmOpen, setIsConfirmOpen] = useState(false);
25
+ const [isBlockedOpen, setIsBlockedOpen] = useState(false);
26
+ // Only a current member of a group thread can leave it. A view-only member
27
+ // of a public group already left / was removed, so the row stays hidden.
28
+ // currentGroupInfo is required too: without it we can classify neither the
29
+ // owner (who must be blocked) nor the visibility (which picks the copy), and
30
+ // guessing either way is worse than waiting for the fetch.
31
+ const canLeaveGroup = isGroupThread &&
32
+ !!groupID &&
33
+ !!currentMemberInGroup &&
34
+ !!currentGroupInfo &&
35
+ !isViewOnlyMember;
36
+ // ownerUserID is the reliable source. roleLevel is not: it comes only from
37
+ // getCurrentMemberInGroupByReq, which queries by useUserStore.selfInfo.id —
38
+ // undefined in this host — so the member entry is written by
39
+ // getSelfGroupPermissionByReq instead and carries no roleLevel at all.
40
+ // Kept as a fallback for hosts that do populate selfInfo.
41
+ const isGroupOwner = (currentGroupInfo === null || currentGroupInfo === void 0 ? void 0 : currentGroupInfo.ownerUserID) && selfUserID
42
+ ? currentGroupInfo.ownerUserID === selfUserID
43
+ : (currentMemberInGroup === null || currentMemberInGroup === void 0 ? void 0 : currentMemberInGroup.roleLevel) === GroupMemberRole.Owner;
44
+ const isPublicGroup = (currentGroupInfo === null || currentGroupInfo === void 0 ? void 0 : currentGroupInfo.visibility) === GroupVisibility.Public;
45
+ // The owner must transfer ownership first (BR-002) — they get the blocking
46
+ // modal instead of the confirmation one, and nothing changes.
47
+ const openLeaveGroup = () => {
48
+ if (isGroupOwner) {
49
+ setIsBlockedOpen(true);
50
+ return;
51
+ }
52
+ setIsConfirmOpen(true);
53
+ };
54
+ const confirmLeaveGroup = async () => {
55
+ if (!groupID) {
56
+ return;
57
+ }
58
+ try {
59
+ await quitGroup({ groupID, conversationID, isPublicGroup });
60
+ setIsConfirmOpen(false);
61
+ onLeft === null || onLeft === void 0 ? void 0 : onLeft();
62
+ message.success(t("thread_detail.leave_group.success"));
63
+ }
64
+ catch (_error) {
65
+ message.error(t("thread_detail.leave_group.failed"));
66
+ }
67
+ };
68
+ return {
69
+ canLeaveGroup,
70
+ isPublicGroup,
71
+ isLeaving,
72
+ isConfirmOpen,
73
+ isBlockedOpen,
74
+ openLeaveGroup,
75
+ confirmLeaveGroup,
76
+ closeConfirm: () => setIsConfirmOpen(false),
77
+ closeBlocked: () => setIsBlockedOpen(false),
78
+ };
79
+ };
@@ -0,0 +1,6 @@
1
+ export declare const useQuitGroup: () => import("@tanstack/react-query").UseMutationResult<unknown, Error, {
2
+ groupID: string;
3
+ conversationID?: string;
4
+ isPublicGroup?: boolean;
5
+ }, unknown>;
6
+ //# sourceMappingURL=useQuitGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQuitGroup.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useQuitGroup.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,YAAY;aASV,MAAM;qBACE,MAAM;oBACP,OAAO;WA6D5B,CAAC"}
@@ -0,0 +1,62 @@
1
+ "use client";
2
+ import { useMutation } from "@tanstack/react-query";
3
+ import { DChatSDK } from "../../constants/sdk";
4
+ import useConversationStore from "../../store/conversation";
5
+ import emitter from "../../utils/events";
6
+ import { useChatContext } from "../../context/ChatContext";
7
+ export const useQuitGroup = () => {
8
+ const { onNavigate } = useChatContext();
9
+ return useMutation({
10
+ mutationFn: async ({ groupID, conversationID, isPublicGroup, }) => {
11
+ // Set before the request — OnJoinedGroupDeleted also fires on our own
12
+ // client, with no ordering guarantee vs. this promise resolving. Without
13
+ // the flag leftGroupHandler would show the "removed from group" modal.
14
+ useConversationStore.getState().setSelfLeftGroupID(groupID);
15
+ const { data } = await DChatSDK.quitGroup(groupID);
16
+ // A public group stays in My Inbox after leaving — the user keeps
17
+ // view-only access to it, same as leftGroupHandler's staysViewOnly path.
18
+ //
19
+ // A private one must disappear, and that needs an explicit local
20
+ // cleanup: the server drops the membership but the wasm SDK keeps the
21
+ // row in its local DB, and My Inbox reads from there
22
+ // (getConversationListSplit), so the group returns on the next reload.
23
+ // hideConversation is the only SDK call that drops the row from that
24
+ // list — deleteConversationAndDeleteAllMsg just wipes the messages and
25
+ // leaves the conversation behind. Best-effort: the leave already
26
+ // succeeded server-side, and OnJoinedGroupDeleted may have cleaned up
27
+ // first, which makes this reject with RecordNotFound.
28
+ if (conversationID && !isPublicGroup) {
29
+ try {
30
+ await DChatSDK.hideConversation(conversationID);
31
+ }
32
+ catch (error) {
33
+ console.error("Failed to hide the local conversation after leaving the group:", error);
34
+ }
35
+ }
36
+ emitter.emit("GROUP_MEMBERS_CHANGED");
37
+ return data;
38
+ },
39
+ onSuccess: (_data, variables) => {
40
+ useConversationStore.getState().clearSelectedConversation();
41
+ // Same rule as above: only a private group leaves the inbox.
42
+ if (!variables.isPublicGroup) {
43
+ useConversationStore.setState((state) => ({
44
+ conversationList: state.conversationList.filter((conversation) => conversation.groupID !== variables.groupID),
45
+ }));
46
+ }
47
+ // Clearing the store alone won't navigate away — URL threadId must
48
+ // also clear, or DeskConversationList re-selects it (see PR #226).
49
+ const newSearchParams = new URLSearchParams(window.location.search);
50
+ newSearchParams.delete("threadId");
51
+ newSearchParams.delete("userId");
52
+ newSearchParams.delete("groupId");
53
+ newSearchParams.delete("botId");
54
+ const query = newSearchParams.toString();
55
+ const pathname = window.location.pathname;
56
+ onNavigate === null || onNavigate === void 0 ? void 0 : onNavigate(query ? `${pathname}?${query}` : pathname);
57
+ },
58
+ onError: () => {
59
+ useConversationStore.getState().setSelfLeftGroupID(null);
60
+ },
61
+ });
62
+ };
@@ -1,6 +1,9 @@
1
1
  import { MessageItem, MessageType } from "@droppii-org/wasm-client-sdk";
2
2
  export declare const visibleTypeMessage: MessageType[];
3
- export declare const isMessageHiddenForViewer: (message: MessageItem, isCrm: boolean) => boolean;
3
+ export declare const isMessageHiddenForViewer: (message: MessageItem, isCrm: boolean, conversation?: {
4
+ peerType?: string;
5
+ conversationType?: number;
6
+ }) => boolean;
4
7
  export declare const useMessage: (conversationId?: string, searchClientMsgID?: string, enabled?: boolean, useAppHistory?: boolean) => {
5
8
  loadState: {
6
9
  initLoading: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"useMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useMessage.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,WAAW,EACX,WAAW,EAEZ,MAAM,8BAA8B,CAAC;AAYtC,eAAO,MAAM,kBAAkB,eAkB9B,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,SAAS,WAAW,EACpB,OAAO,OAAO,KACb,OAWF,CAAC;AAEF,eAAO,MAAM,UAAU,GACrB,iBAAiB,MAAM,EACvB,oBAAoB,MAAM,EAC1B,iBAAc,EACd,uBAAqB;;;;;qBAeA,WAAW,EAAE;;;;;;qBAAb,WAAW,EAAE;;;;;;CAsSnC,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,SAAS,WAAW,SACpB,CAAC;AAChC,eAAO,MAAM,gBAAgB,GAAI,SAAS,WAAW,SACpB,CAAC;AAClC,eAAO,MAAM,gBAAgB,GAAI,aAAa,MAAM,SACf,CAAC;AAEtC,eAAO,MAAM,kBAAkB,GAC7B,aAAa,WAAW,EAAE,EAC1B,SAAS,WAAW,EACpB,WAAW,MAAM,GAAG,MAAM,KACzB,WAAW,GAAG,SAkBhB,CAAC"}
1
+ {"version":3,"file":"useMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useMessage.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,WAAW,EACX,WAAW,EAEZ,MAAM,8BAA8B,CAAC;AAatC,eAAO,MAAM,kBAAkB,eAkB9B,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,SAAS,WAAW,EACpB,OAAO,OAAO,EACd,eAAe;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,KAC9D,OAqBF,CAAC;AAEF,eAAO,MAAM,UAAU,GACrB,iBAAiB,MAAM,EACvB,oBAAoB,MAAM,EAC1B,iBAAc,EACd,uBAAqB;;;;;qBAeA,WAAW,EAAE;;;;;;qBAAb,WAAW,EAAE;;;;;;CAsSnC,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,SAAS,WAAW,SACpB,CAAC;AAChC,eAAO,MAAM,gBAAgB,GAAI,SAAS,WAAW,SACpB,CAAC;AAClC,eAAO,MAAM,gBAAgB,GAAI,aAAa,MAAM,SACf,CAAC;AAEtC,eAAO,MAAM,kBAAkB,GAC7B,aAAa,WAAW,EAAE,EAC1B,SAAS,WAAW,EACpB,WAAW,MAAM,GAAG,MAAM,KACzB,WAAW,GAAG,SAkBhB,CAAC"}
@@ -8,8 +8,9 @@ import isEmpty from "lodash/isEmpty";
8
8
  import { useChatContext } from "../../context/ChatContext";
9
9
  import useAuthStore from "../../store/auth";
10
10
  import { ConnectStatus, SyncStatus } from "../../types/chat";
11
- import { GROUP_NOTIFICATION_MESSAGE_TYPES, isSystemLogMessageType } from "../../utils/messageLog";
11
+ import { GROUP_NOTIFICATION_MESSAGE_TYPES, isGroupNotificationMessageType, isSystemLogMessageType } from "../../utils/messageLog";
12
12
  import { isRenderableCustomMessage } from "../../utils/customMessage";
13
+ import { isGroupConversation } from "../../utils/imCommon";
13
14
  export const visibleTypeMessage = [
14
15
  MessageType.TextMessage,
15
16
  MessageType.PictureMessage,
@@ -29,9 +30,15 @@ export const visibleTypeMessage = [
29
30
  MessageType.LogTextMessage,
30
31
  ...GROUP_NOTIFICATION_MESSAGE_TYPES,
31
32
  ];
32
- export const isMessageHiddenForViewer = (message, isCrm) => {
33
+ export const isMessageHiddenForViewer = (message, isCrm, conversation) => {
33
34
  if (!visibleTypeMessage.includes(message === null || message === void 0 ? void 0 : message.contentType))
34
35
  return true;
36
+ // Group notification messages stay hidden in a CX support session even
37
+ // for CRM — the isCrm early-return below only applies past this check.
38
+ if (isGroupNotificationMessageType(message === null || message === void 0 ? void 0 : message.contentType) &&
39
+ !isGroupConversation(conversation)) {
40
+ return true;
41
+ }
35
42
  if (isCrm)
36
43
  return false;
37
44
  const isCustomMessage = MessageType.CustomMessage === (message === null || message === void 0 ? void 0 : message.contentType);
@@ -1,6 +1,6 @@
1
- import { CustomMsgParams, MergerMsgParams, MessageItem } from "@droppii-org/wasm-client-sdk";
1
+ import { AtMsgParams, CustomMsgParams, MergerMsgParams, MessageItem } from "@droppii-org/wasm-client-sdk";
2
2
  import { type CustomMessagePayload } from "../../types/customMessage";
3
- import { BotFlowMeta, ExtendMessageInfo, FileMsgParamsByFile, ImageMsgParamsByFile, UrlMetadataInfo, VideoMsgParamsByFile } from "../../types/chat";
3
+ import { BotFlowMeta, ExtendMessageInfo, FileMsgParamsByFile, ImageMsgParamsByFile, MentionOffset, MentionSendPayload, UrlMetadataInfo, VideoMsgParamsByFile } from "../../types/chat";
4
4
  import { UploadFile } from "antd";
5
5
  import { ISessionResponse } from "../../types/dto";
6
6
  export declare const isMediaResendable: (message: {
@@ -12,6 +12,8 @@ export declare const createImageMessageByFile: (file: ImageMsgParamsByFile) => P
12
12
  export declare const createMergerMessage: (mergerMsgParams: MergerMsgParams) => Promise<MessageItem | null>;
13
13
  export declare const createVideoMessageByFile: (file: VideoMsgParamsByFile) => Promise<MessageItem | null>;
14
14
  export declare const createFileMessageByFile: (file: FileMsgParamsByFile) => Promise<MessageItem | null>;
15
+ export declare const AT_ALL_TAG = "AtAllTag";
16
+ export declare const createAtTextMessage: (params: AtMsgParams) => Promise<MessageItem | null>;
15
17
  export declare const createUrlTextMessage: (text: string, urls: string[]) => Promise<MessageItem | null>;
16
18
  export declare const createCustomMessageByParams: (params: CustomMsgParams) => Promise<MessageItem | null>;
17
19
  export declare const createCustomMessage: (payload: CustomMessagePayload) => Promise<MessageItem | null>;
@@ -21,7 +23,7 @@ export interface UseSendMessageOptions {
21
23
  scrollEvent?: SendMessageScrollEvent;
22
24
  }
23
25
  export declare const useSendMessage: (options?: UseSendMessageOptions) => {
24
- sendMergeMessage: ({ richText, plainText, files, currentSession, isInternal, urlMetadata, flow, customMessage, }: {
26
+ sendMergeMessage: ({ richText, plainText, files, currentSession, isInternal, urlMetadata, flow, customMessage, mentions, }: {
25
27
  richText: string;
26
28
  plainText: string;
27
29
  files?: UploadFile[];
@@ -30,16 +32,18 @@ export declare const useSendMessage: (options?: UseSendMessageOptions) => {
30
32
  urlMetadata?: UrlMetadataInfo;
31
33
  flow?: BotFlowMeta;
32
34
  customMessage?: CustomMessagePayload;
35
+ mentions?: MentionSendPayload;
33
36
  }) => Promise<boolean>;
34
37
  sendCustomMessage: (payload: CustomMessagePayload, sendOptions?: {
35
38
  currentSession?: ISessionResponse;
36
39
  }) => Promise<boolean>;
37
40
  resendMessage: (failedMessage: MessageItem) => Promise<void>;
38
41
  };
39
- export declare const generateExtendMessageInfo: ({ richText, urlMetadata, currentSession, flow, }: {
42
+ export declare const generateExtendMessageInfo: ({ richText, urlMetadata, currentSession, flow, mentionOffsets, }: {
40
43
  richText?: string;
41
44
  urlMetadata?: UrlMetadataInfo;
42
45
  currentSession?: ISessionResponse;
43
46
  flow?: BotFlowMeta;
47
+ mentionOffsets?: MentionOffset[];
44
48
  }) => ExtendMessageInfo;
45
49
  //# sourceMappingURL=useSendMessage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSendMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useSendMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,eAAe,EACf,WAAW,EAIZ,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACrB,MAAM,cAAc,CAAC;AAWtB,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAQlC,OAAO,EAAgB,gBAAgB,EAAyB,MAAM,aAAa,CAAC;AAmBpF,eAAO,MAAM,iBAAiB,GAAI,SAAS;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,YAE0C,CAAC;AAE5C,eAAO,MAAM,iBAAiB,GAAU,MAAM,MAAM,gCAanD,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,MAAM,oBAAoB,gCAaxE,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,iBAAiB,eAAe,gCAazE,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,MAAM,oBAAoB,gCAaxE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,MAAM,mBAAmB,gCAatE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAU,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,gCActE,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,QAAQ,eAAe,gCAcxB,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,SAAS,oBAAoB,gCAOtE,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,MAAM,MAAM,EACZ,eAAe,WAAW,gCAc3B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAC9B,4BAA4B,GAC5B,iDAAiD,CAAC;AAEtD,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,sBAAsB,CAAC;CACtC;AAED,eAAO,MAAM,cAAc,GAAI,UAAU,qBAAqB;sHAsSvD;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;QACrB,cAAc,CAAC,EAAE,gBAAgB,CAAC;QAClC,UAAU,EAAE,OAAO,CAAC;QACpB,WAAW,CAAC,EAAE,eAAe,CAAC;QAC9B,IAAI,CAAC,EAAE,WAAW,CAAC;QACnB,aAAa,CAAC,EAAE,oBAAoB,CAAC;KACtC,KAAG,OAAO,CAAC,OAAO,CAAC;iCA3CT,oBAAoB,gBACf;QAAE,cAAc,CAAC,EAAE,gBAAgB,CAAA;KAAE,KAClD,OAAO,CAAC,OAAO,CAAC;mCAnHG,WAAW;CAyVpC,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,kDAKvC;IACD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB,sBA8BA,CAAC"}
1
+ {"version":3,"file":"useSendMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useSendMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,eAAe,EACf,eAAe,EACf,WAAW,EAIZ,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACrB,MAAM,cAAc,CAAC;AAWtB,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAQlC,OAAO,EAAgB,gBAAgB,EAAyB,MAAM,aAAa,CAAC;AAmBpF,eAAO,MAAM,iBAAiB,GAAI,SAAS;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,YAE0C,CAAC;AAE5C,eAAO,MAAM,iBAAiB,GAAU,MAAM,MAAM,gCAanD,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,MAAM,oBAAoB,gCAaxE,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,iBAAiB,eAAe,gCAazE,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,MAAM,oBAAoB,gCAaxE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,MAAM,mBAAmB,gCAatE,CAAC;AAGF,eAAO,MAAM,UAAU,aAAa,CAAC;AAErC,eAAO,MAAM,mBAAmB,GAAU,QAAQ,WAAW,gCAa5D,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAU,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,gCActE,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,QAAQ,eAAe,gCAcxB,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,SAAS,oBAAoB,gCAOtE,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,MAAM,MAAM,EACZ,eAAe,WAAW,gCAc3B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAC9B,4BAA4B,GAC5B,iDAAiD,CAAC;AAEtD,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,sBAAsB,CAAC;CACtC;AAED,eAAO,MAAM,cAAc,GAAI,UAAU,qBAAqB;gIAuSvD;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;QACrB,cAAc,CAAC,EAAE,gBAAgB,CAAC;QAClC,UAAU,EAAE,OAAO,CAAC;QACpB,WAAW,CAAC,EAAE,eAAe,CAAC;QAC9B,IAAI,CAAC,EAAE,WAAW,CAAC;QACnB,aAAa,CAAC,EAAE,oBAAoB,CAAC;QACrC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;KAC/B,KAAG,OAAO,CAAC,OAAO,CAAC;iCA7CT,oBAAoB,gBACf;QAAE,cAAc,CAAC,EAAE,gBAAgB,CAAA;KAAE,KAClD,OAAO,CAAC,OAAO,CAAC;mCAnHG,WAAW;CA+WpC,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,kEAMvC;IACD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;CAClC,sBAkCA,CAAC"}
@@ -26,7 +26,7 @@ const MEDIA_CONTENT_TYPES = new Set([
26
26
  export const isMediaResendable = (message) => !MEDIA_CONTENT_TYPES.has(message.contentType) ||
27
27
  messageFileStore.has(message.clientMsgID);
28
28
  export const createTextMessage = async (text) => {
29
- let textMessage = await DChatSDK.createTextMessage(text, new Date().getTime().toString())
29
+ const textMessage = await DChatSDK.createTextMessage(text, new Date().getTime().toString())
30
30
  .then(({ data }) => {
31
31
  return data;
32
32
  })
@@ -37,7 +37,7 @@ export const createTextMessage = async (text) => {
37
37
  return textMessage;
38
38
  };
39
39
  export const createImageMessageByFile = async (file) => {
40
- let imageMessage = await DChatSDK.createImageMessageByFile(file, new Date().getTime().toString())
40
+ const imageMessage = await DChatSDK.createImageMessageByFile(file, new Date().getTime().toString())
41
41
  .then(({ data }) => {
42
42
  return data;
43
43
  })
@@ -48,7 +48,7 @@ export const createImageMessageByFile = async (file) => {
48
48
  return imageMessage;
49
49
  };
50
50
  export const createMergerMessage = async (mergerMsgParams) => {
51
- let mergerMessage = await DChatSDK.createMergerMessage(mergerMsgParams, new Date().getTime().toString())
51
+ const mergerMessage = await DChatSDK.createMergerMessage(mergerMsgParams, new Date().getTime().toString())
52
52
  .then(({ data }) => {
53
53
  return data;
54
54
  })
@@ -59,7 +59,7 @@ export const createMergerMessage = async (mergerMsgParams) => {
59
59
  return mergerMessage;
60
60
  };
61
61
  export const createVideoMessageByFile = async (file) => {
62
- let videoMessage = await DChatSDK.createVideoMessageByFile(file, new Date().getTime().toString())
62
+ const videoMessage = await DChatSDK.createVideoMessageByFile(file, new Date().getTime().toString())
63
63
  .then(({ data }) => {
64
64
  return data;
65
65
  })
@@ -70,7 +70,7 @@ export const createVideoMessageByFile = async (file) => {
70
70
  return videoMessage;
71
71
  };
72
72
  export const createFileMessageByFile = async (file) => {
73
- let fileMessage = await DChatSDK.createFileMessageByFile(file, new Date().getTime().toString())
73
+ const fileMessage = await DChatSDK.createFileMessageByFile(file, new Date().getTime().toString())
74
74
  .then(({ data }) => {
75
75
  return data;
76
76
  })
@@ -80,8 +80,21 @@ export const createFileMessageByFile = async (file) => {
80
80
  });
81
81
  return fileMessage;
82
82
  };
83
+ // OpenIM SDK convention for "tag all members" in AtMsgParams.atUserIDList.
84
+ export const AT_ALL_TAG = "AtAllTag";
85
+ export const createAtTextMessage = async (params) => {
86
+ const atTextMessage = await DChatSDK.createTextAtMessage(params, new Date().getTime().toString())
87
+ .then(({ data }) => {
88
+ return data;
89
+ })
90
+ .catch(({ errCode, errMsg }) => {
91
+ console.error("createTextAtMessage", errCode, errMsg);
92
+ return null;
93
+ });
94
+ return atTextMessage;
95
+ };
83
96
  export const createUrlTextMessage = async (text, urls) => {
84
- let textMessage = await DChatSDK.createUrlTextMessage(text, JSON.stringify(urls), new Date().getTime().toString())
97
+ const textMessage = await DChatSDK.createUrlTextMessage(text, JSON.stringify(urls), new Date().getTime().toString())
85
98
  .then(({ data }) => {
86
99
  return data;
87
100
  })
@@ -92,7 +105,7 @@ export const createUrlTextMessage = async (text, urls) => {
92
105
  return textMessage;
93
106
  };
94
107
  export const createCustomMessageByParams = async (params) => {
95
- let customMessage = await DChatSDK.createCustomMessage(params, new Date().getTime().toString())
108
+ const customMessage = await DChatSDK.createCustomMessage(params, new Date().getTime().toString())
96
109
  .then(({ data }) => {
97
110
  return data;
98
111
  })
@@ -110,7 +123,7 @@ export const createCustomMessage = async (payload) => {
110
123
  });
111
124
  };
112
125
  export const createQuoteMessage = async (text, quotedMessage) => {
113
- let textMessage = await DChatSDK.createQuoteMessage({
126
+ const textMessage = await DChatSDK.createQuoteMessage({
114
127
  text,
115
128
  message: JSON.stringify(quotedMessage),
116
129
  })
@@ -326,7 +339,7 @@ export const useSendMessage = (options) => {
326
339
  });
327
340
  return sendMessage(Object.assign(Object.assign({}, customMessage), { ex: JSON.stringify(extendMessageInfo) || "{}", isInternal: false }), sendOptions === null || sendOptions === void 0 ? void 0 : sendOptions.currentSession);
328
341
  }, [conversationData, recvID, groupID, sendMessage]);
329
- const sendMergeMessage = useCallback(async ({ richText, plainText, files = [], currentSession, isInternal, urlMetadata, flow, customMessage, }) => {
342
+ const sendMergeMessage = useCallback(async ({ richText, plainText, files = [], currentSession, isInternal, urlMetadata, flow, customMessage, mentions, }) => {
330
343
  if (!conversationData || (!recvID && !groupID))
331
344
  return false;
332
345
  const messageList = [];
@@ -449,10 +462,24 @@ export const useSendMessage = (options) => {
449
462
  console.error("Lỗi xử lý tin nhắn:", err);
450
463
  }
451
464
  }
465
+ const hasMentions = !!mentions && (mentions.atUserIDList.length > 0 || mentions.isAtAll);
452
466
  if (!!plainText && plainText.trim() !== "") {
453
467
  const urls = extractLinkUrls(plainText);
454
468
  let textMessage = null;
455
- if (quotedMessage === null || quotedMessage === void 0 ? void 0 : quotedMessage.clientMsgID) {
469
+ if (hasMentions && mentions) {
470
+ // OpenIM SDK convention: "tag all" is signaled by the sentinel
471
+ // "AtAllTag" inside atUserIDList, not a separate flag/param.
472
+ textMessage = await createAtTextMessage({
473
+ text: plainText,
474
+ atUserIDList: mentions.isAtAll
475
+ ? [AT_ALL_TAG, ...mentions.atUserIDList]
476
+ : mentions.atUserIDList,
477
+ atUsersInfo: mentions.atUsersInfo,
478
+ message: (quotedMessage === null || quotedMessage === void 0 ? void 0 : quotedMessage.clientMsgID) ? quotedMessage : undefined,
479
+ });
480
+ setQuotedMessage(null);
481
+ }
482
+ else if (quotedMessage === null || quotedMessage === void 0 ? void 0 : quotedMessage.clientMsgID) {
456
483
  textMessage = await createQuoteMessage(plainText, quotedMessage);
457
484
  setQuotedMessage(null);
458
485
  }
@@ -475,7 +502,8 @@ export const useSendMessage = (options) => {
475
502
  for (const message of messageList) {
476
503
  const isTextLikeMessage = (message === null || message === void 0 ? void 0 : message.contentType) === MessageType.TextMessage ||
477
504
  (message === null || message === void 0 ? void 0 : message.contentType) === MessageType.UrlTextMessage ||
478
- (message === null || message === void 0 ? void 0 : message.contentType) === MessageType.QuoteMessage;
505
+ (message === null || message === void 0 ? void 0 : message.contentType) === MessageType.QuoteMessage ||
506
+ (message === null || message === void 0 ? void 0 : message.contentType) === MessageType.AtTextMessage;
479
507
  const extendMessageInfo = generateExtendMessageInfo({
480
508
  richText: isTextLikeMessage ? richText : "",
481
509
  urlMetadata: (message === null || message === void 0 ? void 0 : message.contentType) === MessageType.UrlTextMessage
@@ -483,6 +511,9 @@ export const useSendMessage = (options) => {
483
511
  : undefined,
484
512
  currentSession,
485
513
  flow: isTextLikeMessage ? flow : undefined,
514
+ mentionOffsets: (message === null || message === void 0 ? void 0 : message.contentType) === MessageType.AtTextMessage
515
+ ? mentions === null || mentions === void 0 ? void 0 : mentions.mentionOffsets
516
+ : undefined,
486
517
  });
487
518
  const mMessage = Object.assign(Object.assign({}, message), { ex: JSON.stringify(extendMessageInfo) || "{}", isInternal });
488
519
  await sendMessage(mMessage, currentSession);
@@ -502,7 +533,7 @@ export const useSendMessage = (options) => {
502
533
  resendMessage,
503
534
  };
504
535
  };
505
- export const generateExtendMessageInfo = ({ richText, urlMetadata, currentSession, flow, }) => {
536
+ export const generateExtendMessageInfo = ({ richText, urlMetadata, currentSession, flow, mentionOffsets, }) => {
506
537
  const extendMessageInfo = {
507
538
  sessionId: (currentSession === null || currentSession === void 0 ? void 0 : currentSession.id) || "",
508
539
  applicationType: useAuthStore.getState().applicationType,
@@ -510,6 +541,9 @@ export const generateExtendMessageInfo = ({ richText, urlMetadata, currentSessio
510
541
  if (flow) {
511
542
  extendMessageInfo.flow = flow;
512
543
  }
544
+ if (mentionOffsets && mentionOffsets.length > 0) {
545
+ extendMessageInfo.mentions = { offsets: mentionOffsets };
546
+ }
513
547
  const trimmedRichText = richText === null || richText === void 0 ? void 0 : richText.trim();
514
548
  if (trimmedRichText) {
515
549
  extendMessageInfo.messageInfo = {
@@ -0,0 +1,16 @@
1
+ import { BaseResponse, IConversationGroupItem } from "../../types/dto";
2
+ import { type ConversationGroupDisplayItem } from "../../hooks/group/useConversationGroups";
3
+ interface UseSearchGroupsParams {
4
+ searchTerm: string;
5
+ enabled?: boolean;
6
+ pageSize?: number;
7
+ }
8
+ export declare const useSearchGroups: ({ searchTerm, enabled, pageSize, }: UseSearchGroupsParams) => {
9
+ groups: ConversationGroupDisplayItem[];
10
+ fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<BaseResponse<IConversationGroupItem[]>, unknown>, Error>>;
11
+ hasNextPage: boolean;
12
+ isFetchingNextPage: boolean;
13
+ isLoading: boolean;
14
+ };
15
+ export {};
16
+ //# sourceMappingURL=useSearchGroups.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSearchGroups.d.ts","sourceRoot":"","sources":["../../../src/hooks/search/useSearchGroups.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAGnE,OAAO,EAGL,KAAK,4BAA4B,EAClC,MAAM,qCAAqC,CAAC;AAE7C,UAAU,qBAAqB;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,eAAe,GAAI,oCAI7B,qBAAqB;;;;;;CAmEvB,CAAC"}
@@ -0,0 +1,65 @@
1
+ "use client";
2
+ import { useMemo } from "react";
3
+ import { useInfiniteQuery } from "@tanstack/react-query";
4
+ import { apiInstance } from "../../services/api";
5
+ import { ENDPOINTS } from "../../services/routes";
6
+ import { QUERY_KEYS } from "../../services/query";
7
+ import { PAGE_SIZE } from "../../constants";
8
+ import useAuthStore from "../../store/auth";
9
+ import useConversationStore from "../../store/conversation";
10
+ import { buildFallbackConversation, syncGroupConversationsToStore, } from "../../hooks/group/useConversationGroups";
11
+ export const useSearchGroups = ({ searchTerm, enabled = true, pageSize = PAGE_SIZE.medium, }) => {
12
+ const trimmedSearchTerm = searchTerm.trim();
13
+ const conversationList = useConversationStore((state) => state.conversationList);
14
+ const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading } = useInfiniteQuery({
15
+ initialPageParam: 1,
16
+ queryKey: [QUERY_KEYS.SEARCH_CONVERSATION_GROUPS, trimmedSearchTerm, pageSize],
17
+ queryFn: async ({ pageParam = 1 }) => {
18
+ var _a, _b;
19
+ const applicationType = useAuthStore.getState().applicationType;
20
+ const res = await apiInstance.get(ENDPOINTS.chatService.searchConversationGroups, {
21
+ params: {
22
+ page: pageParam,
23
+ pageSize,
24
+ applicationType,
25
+ searchTerm: trimmedSearchTerm,
26
+ },
27
+ });
28
+ if ((_b = (_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.length) {
29
+ void syncGroupConversationsToStore(res.data.data).catch((error) => {
30
+ console.error("syncGroupConversationsToStore", error);
31
+ });
32
+ }
33
+ return res.data;
34
+ },
35
+ getNextPageParam: (lastPage) => {
36
+ var _a, _b;
37
+ const dataLength = ((_a = lastPage === null || lastPage === void 0 ? void 0 : lastPage.data) === null || _a === void 0 ? void 0 : _a.length) || 0;
38
+ const currentPage = ((_b = lastPage === null || lastPage === void 0 ? void 0 : lastPage.pageable) === null || _b === void 0 ? void 0 : _b.pageNumber) || 1;
39
+ return dataLength < pageSize ? undefined : currentPage + 1;
40
+ },
41
+ enabled: enabled && trimmedSearchTerm !== "",
42
+ });
43
+ const groups = useMemo(() => {
44
+ if (!data)
45
+ return [];
46
+ const allItems = data.pages.flatMap((page) => page.data);
47
+ return allItems.map((group) => {
48
+ const syncedConversation = conversationList === null || conversationList === void 0 ? void 0 : conversationList.find((conversation) => conversation.conversationID === group.conversationId);
49
+ return {
50
+ groupId: group.groupId,
51
+ conversationId: group.conversationId,
52
+ conversation: syncedConversation !== null && syncedConversation !== void 0 ? syncedConversation : buildFallbackConversation(group),
53
+ visibility: group.visibility,
54
+ memberCount: group.memberCount,
55
+ };
56
+ });
57
+ }, [data, conversationList]);
58
+ return {
59
+ groups,
60
+ fetchNextPage,
61
+ hasNextPage,
62
+ isFetchingNextPage,
63
+ isLoading,
64
+ };
65
+ };
@@ -2,9 +2,10 @@ import { SessionType } from "@droppii-org/wasm-client-sdk";
2
2
  interface UseConversationSessionStateParams {
3
3
  conversationId: string;
4
4
  conversationType?: SessionType;
5
+ peerType?: string;
5
6
  groupId?: string;
6
7
  }
7
- export declare const useConversationSessionState: ({ conversationId, conversationType, groupId, }: UseConversationSessionStateParams) => {
8
+ export declare const useConversationSessionState: ({ conversationId, conversationType, peerType, groupId, }: UseConversationSessionStateParams) => {
8
9
  groupId: string | undefined;
9
10
  latestConversationSession: import("../../types/dto").ISessionResponse | undefined;
10
11
  customerUserID: string;
@@ -1 +1 @@
1
- {"version":3,"file":"useConversationSessionState.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useConversationSessionState.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAI3D,UAAU,iCAAiC;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,2BAA2B,GAAI,gDAIzC,iCAAiC;;;;;CAoBnC,CAAC"}
1
+ {"version":3,"file":"useConversationSessionState.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useConversationSessionState.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAI3D,UAAU,iCAAiC;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,2BAA2B,GAAI,0DAKzC,iCAAiC;;;;;CAoBnC,CAAC"}
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
  import { useGetListSessionByConversation } from "./useGetListSessionByConversation";
3
- import { isGroupSession } from "../../utils/imCommon";
4
- export const useConversationSessionState = ({ conversationId, conversationType, groupId, }) => {
3
+ import { isGroupConversation } from "../../utils/imCommon";
4
+ export const useConversationSessionState = ({ conversationId, conversationType, peerType, groupId, }) => {
5
5
  var _a;
6
- const isGroupConversation = isGroupSession(conversationType);
7
- const currentGroupId = isGroupConversation ? groupId : undefined;
6
+ const isGroupChat = isGroupConversation({ peerType, conversationType });
7
+ const currentGroupId = isGroupChat ? groupId : undefined;
8
8
  const { data: conversationSessions, refetch: refetchConversationSessions, } = useGetListSessionByConversation({
9
9
  conversationId,
10
- enabled: !isGroupConversation,
10
+ enabled: !isGroupChat,
11
11
  });
12
12
  const latestConversationSession = conversationSessions === null || conversationSessions === void 0 ? void 0 : conversationSessions[0];
13
13
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/layout/index.tsx"],"names":[],"mappings":"AAKA,OAAO,iBAAiB,CAAC;AAYzB,UAAU,eAAe;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AACD,QAAA,MAAM,UAAU,GAAI,cAAc,eAAe,4CAyBhD,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/layout/index.tsx"],"names":[],"mappings":"AAKA,OAAO,iBAAiB,CAAC;AAazB,UAAU,eAAe;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AACD,QAAA,MAAM,UAAU,GAAI,cAAc,eAAe,4CAsChD,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -9,6 +9,7 @@ import timezone from "dayjs/plugin/timezone";
9
9
  import { useSyncUsersInfo } from "../hooks/user/useUsersInfo";
10
10
  import useConversationStore from "../store/conversation";
11
11
  import InfoModal from "../components/common/InfoModal";
12
+ import { useChatContext } from "../context/ChatContext";
12
13
  dayjs.extend(utc);
13
14
  dayjs.extend(timezone);
14
15
  dayjs.tz.setDefault("Asia/Ho_Chi_Minh");
@@ -17,8 +18,16 @@ const MainLayout = ({ children }) => {
17
18
  const { t } = useTranslation();
18
19
  useGlobalEvent();
19
20
  useSyncUsersInfo();
21
+ const { renderGroupAccessModal } = useChatContext();
20
22
  const removedFromGroupModalOpen = useConversationStore((state) => state.removedFromGroupModalOpen);
21
23
  const hideRemovedFromGroupModal = useConversationStore((state) => state.hideRemovedFromGroupModal);
22
- return (_jsxs(_Fragment, { children: [children, _jsx(InfoModal, { open: removedFromGroupModalOpen, onOk: hideRemovedFromGroupModal, title: t("removed_from_group_modal_title"), okText: t("removed_from_group_modal_ok"), children: _jsx("p", { children: t("removed_from_group_modal_message") }) })] }));
24
+ const modalProps = {
25
+ open: removedFromGroupModalOpen,
26
+ onOk: hideRemovedFromGroupModal,
27
+ title: t("removed_from_group_modal_title"),
28
+ okText: t("removed_from_group_modal_ok"),
29
+ message: t("removed_from_group_modal_message"),
30
+ };
31
+ return (_jsxs(_Fragment, { children: [children, renderGroupAccessModal ? (renderGroupAccessModal(modalProps)) : (_jsx(InfoModal, { open: modalProps.open, onOk: modalProps.onOk, title: modalProps.title, okText: modalProps.okText, children: _jsx("p", { children: modalProps.message }) }))] }));
23
32
  };
24
33
  export default MainLayout;