@droppii-org/chat-sdk 0.6.56 → 0.7.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 (435) hide show
  1. package/dist/components/canned-response/CannedResponseBody.d.ts.map +1 -1
  2. package/dist/components/canned-response/CannedResponseBody.js +4 -3
  3. package/dist/components/canned-response/CannedResponsePanel.d.ts +9 -0
  4. package/dist/components/canned-response/CannedResponsePanel.d.ts.map +1 -0
  5. package/dist/components/canned-response/CannedResponsePanel.js +72 -0
  6. package/dist/components/canned-response/CannedResponseRow.d.ts +10 -0
  7. package/dist/components/canned-response/CannedResponseRow.d.ts.map +1 -0
  8. package/dist/components/canned-response/CannedResponseRow.js +6 -0
  9. package/dist/components/canned-response/CannedScopeChips.d.ts +10 -0
  10. package/dist/components/canned-response/CannedScopeChips.d.ts.map +1 -0
  11. package/dist/components/canned-response/CannedScopeChips.js +34 -0
  12. package/dist/components/canned-response/cannedScopes.d.ts +16 -0
  13. package/dist/components/canned-response/cannedScopes.d.ts.map +1 -0
  14. package/dist/components/canned-response/cannedScopes.js +39 -0
  15. package/dist/components/canned-response/index.d.ts.map +1 -1
  16. package/dist/components/canned-response/index.js +11 -10
  17. package/dist/components/canned-response/insertCannedContent.d.ts +7 -0
  18. package/dist/components/canned-response/insertCannedContent.d.ts.map +1 -0
  19. package/dist/components/canned-response/insertCannedContent.js +39 -0
  20. package/dist/components/canned-response/team/TeamItem.d.ts.map +1 -1
  21. package/dist/components/canned-response/team/TeamItem.js +5 -4
  22. package/dist/components/common/ConfirmModal.d.ts +13 -1
  23. package/dist/components/common/ConfirmModal.d.ts.map +1 -1
  24. package/dist/components/common/ConfirmModal.js +24 -6
  25. package/dist/components/common/DeskPanelDrawer.d.ts +17 -0
  26. package/dist/components/common/DeskPanelDrawer.d.ts.map +1 -0
  27. package/dist/components/common/DeskPanelDrawer.js +21 -0
  28. package/dist/components/common/DeskSidePanel.d.ts +17 -0
  29. package/dist/components/common/DeskSidePanel.d.ts.map +1 -0
  30. package/dist/components/common/DeskSidePanel.js +23 -0
  31. package/dist/components/common/TintedAvatar.d.ts +11 -0
  32. package/dist/components/common/TintedAvatar.d.ts.map +1 -0
  33. package/dist/components/common/TintedAvatar.js +17 -0
  34. package/dist/components/compose/ComposeNewMessageModal.d.ts.map +1 -1
  35. package/dist/components/compose/ComposeNewMessageModal.js +11 -1
  36. package/dist/components/conversation/ConversationByGroupItem.d.ts.map +1 -1
  37. package/dist/components/conversation/ConversationByGroupItem.js +10 -6
  38. package/dist/components/conversation/ConversationBySessionItem.d.ts +4 -1
  39. package/dist/components/conversation/ConversationBySessionItem.d.ts.map +1 -1
  40. package/dist/components/conversation/ConversationBySessionItem.js +36 -10
  41. package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
  42. package/dist/components/conversation/DeskConversationList.js +44 -29
  43. package/dist/components/conversation/DeskConversationRow.d.ts +19 -0
  44. package/dist/components/conversation/DeskConversationRow.d.ts.map +1 -0
  45. package/dist/components/conversation/DeskConversationRow.js +18 -0
  46. package/dist/components/conversation/DeskListEmptyState.d.ts +6 -0
  47. package/dist/components/conversation/DeskListEmptyState.d.ts.map +1 -0
  48. package/dist/components/conversation/DeskListEmptyState.js +11 -0
  49. package/dist/components/conversation/DeskListHeader.d.ts +14 -0
  50. package/dist/components/conversation/DeskListHeader.d.ts.map +1 -0
  51. package/dist/components/conversation/DeskListHeader.js +39 -0
  52. package/dist/components/conversation/DeskListSkeleton.d.ts +6 -0
  53. package/dist/components/conversation/DeskListSkeleton.d.ts.map +1 -0
  54. package/dist/components/conversation/DeskListSkeleton.js +9 -0
  55. package/dist/components/conversation/DeskRowAvatar.d.ts +8 -0
  56. package/dist/components/conversation/DeskRowAvatar.d.ts.map +1 -0
  57. package/dist/components/conversation/DeskRowAvatar.js +6 -0
  58. package/dist/components/conversation/RowChip.d.ts +14 -0
  59. package/dist/components/conversation/RowChip.d.ts.map +1 -0
  60. package/dist/components/conversation/RowChip.js +11 -0
  61. package/dist/components/conversation/avatarTint.d.ts +6 -0
  62. package/dist/components/conversation/avatarTint.d.ts.map +1 -0
  63. package/dist/components/conversation/avatarTint.js +27 -0
  64. package/dist/components/conversation/folderEmptyState.d.ts +2 -0
  65. package/dist/components/conversation/folderEmptyState.d.ts.map +1 -0
  66. package/dist/components/conversation/folderEmptyState.js +14 -0
  67. package/dist/components/conversation/internalNotePreview.d.ts +6 -0
  68. package/dist/components/conversation/internalNotePreview.d.ts.map +1 -0
  69. package/dist/components/conversation/internalNotePreview.js +11 -0
  70. package/dist/components/conversation/listHeading.d.ts +19 -0
  71. package/dist/components/conversation/listHeading.d.ts.map +1 -0
  72. package/dist/components/conversation/listHeading.js +24 -0
  73. package/dist/components/conversation/rowDisplayName.d.ts +7 -0
  74. package/dist/components/conversation/rowDisplayName.d.ts.map +1 -0
  75. package/dist/components/conversation/rowDisplayName.js +8 -0
  76. package/dist/components/conversation/rowTime.d.ts +4 -0
  77. package/dist/components/conversation/rowTime.d.ts.map +1 -0
  78. package/dist/components/conversation/rowTime.js +10 -0
  79. package/dist/components/conversation-detail/PinLimitModal.d.ts.map +1 -1
  80. package/dist/components/conversation-detail/PinLimitModal.js +3 -1
  81. package/dist/components/group/AddMemberModal.d.ts.map +1 -1
  82. package/dist/components/group/AddMemberModal.js +15 -4
  83. package/dist/components/group/AdminPermissionModal.d.ts +1 -0
  84. package/dist/components/group/AdminPermissionModal.d.ts.map +1 -1
  85. package/dist/components/group/AdminPermissionModal.js +38 -3
  86. package/dist/components/group/CreateGroupForm.d.ts +3 -1
  87. package/dist/components/group/CreateGroupForm.d.ts.map +1 -1
  88. package/dist/components/group/CreateGroupForm.js +7 -1
  89. package/dist/components/group/CreateGroupFormCrmView.d.ts +23 -0
  90. package/dist/components/group/CreateGroupFormCrmView.d.ts.map +1 -0
  91. package/dist/components/group/CreateGroupFormCrmView.js +25 -0
  92. package/dist/components/group/DisableSendPermissionConfirm.d.ts +11 -0
  93. package/dist/components/group/DisableSendPermissionConfirm.d.ts.map +1 -0
  94. package/dist/components/group/DisableSendPermissionConfirm.js +10 -0
  95. package/dist/components/group/GroupCompositeAvatar.d.ts.map +1 -1
  96. package/dist/components/group/GroupCompositeAvatar.js +39 -4
  97. package/dist/components/group/GroupMemberPicker.d.ts +5 -2
  98. package/dist/components/group/GroupMemberPicker.d.ts.map +1 -1
  99. package/dist/components/group/GroupMemberPicker.js +8 -42
  100. package/dist/components/group/GroupMemberPickerCrm.d.ts +4 -0
  101. package/dist/components/group/GroupMemberPickerCrm.d.ts.map +1 -0
  102. package/dist/components/group/GroupMemberPickerCrm.js +48 -0
  103. package/dist/components/group/GroupMemberPickerLegacy.d.ts +8 -0
  104. package/dist/components/group/GroupMemberPickerLegacy.d.ts.map +1 -0
  105. package/dist/components/group/GroupMemberPickerLegacy.js +46 -0
  106. package/dist/components/group/GroupPanelHeader.d.ts +10 -0
  107. package/dist/components/group/GroupPanelHeader.d.ts.map +1 -0
  108. package/dist/components/group/GroupPanelHeader.js +11 -0
  109. package/dist/components/group/MemberPermissionPanel.d.ts.map +1 -1
  110. package/dist/components/group/MemberPermissionPanel.js +31 -2
  111. package/dist/components/group/PermissionPanelCrm.d.ts +24 -0
  112. package/dist/components/group/PermissionPanelCrm.d.ts.map +1 -0
  113. package/dist/components/group/PermissionPanelCrm.js +16 -0
  114. package/dist/components/group/PersonAvatar.d.ts +11 -0
  115. package/dist/components/group/PersonAvatar.d.ts.map +1 -0
  116. package/dist/components/group/PersonAvatar.js +21 -0
  117. package/dist/components/group/crmIcon.d.ts +9 -0
  118. package/dist/components/group/crmIcon.d.ts.map +1 -0
  119. package/dist/components/group/crmIcon.js +38 -0
  120. package/dist/components/icon/AdaptiveIcon.d.ts +15 -0
  121. package/dist/components/icon/AdaptiveIcon.d.ts.map +1 -0
  122. package/dist/components/icon/AdaptiveIcon.js +10 -0
  123. package/dist/components/icon/StrokeIcon.d.ts +14 -0
  124. package/dist/components/icon/StrokeIcon.d.ts.map +1 -0
  125. package/dist/components/icon/StrokeIcon.js +5 -0
  126. package/dist/components/icon/strokeIconNodes.d.ts +431 -0
  127. package/dist/components/icon/strokeIconNodes.d.ts.map +1 -0
  128. package/dist/components/icon/strokeIconNodes.js +269 -0
  129. package/dist/components/media-collection/index.d.ts.map +1 -1
  130. package/dist/components/media-collection/index.js +21 -5
  131. package/dist/components/message/GroupMembersDrawer.d.ts.map +1 -1
  132. package/dist/components/message/GroupMembersDrawer.js +60 -13
  133. package/dist/components/message/GroupMembersPanelCrm.d.ts +23 -0
  134. package/dist/components/message/GroupMembersPanelCrm.d.ts.map +1 -0
  135. package/dist/components/message/GroupMembersPanelCrm.js +55 -0
  136. package/dist/components/message/MessageHeader.d.ts.map +1 -1
  137. package/dist/components/message/MessageHeader.js +76 -27
  138. package/dist/components/message/MessageInfiniteScroll.d.ts +4 -2
  139. package/dist/components/message/MessageInfiniteScroll.d.ts.map +1 -1
  140. package/dist/components/message/MessageInfiniteScroll.js +1 -1
  141. package/dist/components/message/MessageList.d.ts +2 -1
  142. package/dist/components/message/MessageList.d.ts.map +1 -1
  143. package/dist/components/message/MessageList.js +12 -1
  144. package/dist/components/message/SelectSession.d.ts +4 -1
  145. package/dist/components/message/SelectSession.d.ts.map +1 -1
  146. package/dist/components/message/SelectSession.js +13 -4
  147. package/dist/components/message/UnassignedSessionFooter.js +2 -2
  148. package/dist/components/message/footer/ActionBar.d.ts +5 -1
  149. package/dist/components/message/footer/ActionBar.d.ts.map +1 -1
  150. package/dist/components/message/footer/ActionBar.js +14 -1
  151. package/dist/components/message/footer/CannedResponsePlugin.d.ts.map +1 -1
  152. package/dist/components/message/footer/CannedResponsePlugin.js +18 -3
  153. package/dist/components/message/footer/ClosedSessionBanner.d.ts +9 -0
  154. package/dist/components/message/footer/ClosedSessionBanner.d.ts.map +1 -0
  155. package/dist/components/message/footer/ClosedSessionBanner.js +13 -0
  156. package/dist/components/message/footer/ComposerEditor.d.ts.map +1 -1
  157. package/dist/components/message/footer/ComposerEditor.js +9 -4
  158. package/dist/components/message/footer/ComposerTabs.d.ts +1 -2
  159. package/dist/components/message/footer/ComposerTabs.d.ts.map +1 -1
  160. package/dist/components/message/footer/ComposerTabs.js +14 -35
  161. package/dist/components/message/footer/CrmComposerCard.d.ts +11 -0
  162. package/dist/components/message/footer/CrmComposerCard.d.ts.map +1 -0
  163. package/dist/components/message/footer/CrmComposerCard.js +30 -0
  164. package/dist/components/message/footer/EnterHandler.d.ts.map +1 -1
  165. package/dist/components/message/footer/EnterHandler.js +3 -0
  166. package/dist/components/message/footer/FilePreview.js +2 -2
  167. package/dist/components/message/footer/LinkInputPreview.js +2 -2
  168. package/dist/components/message/footer/MediaActions.d.ts +2 -1
  169. package/dist/components/message/footer/MediaActions.d.ts.map +1 -1
  170. package/dist/components/message/footer/MediaActions.js +21 -4
  171. package/dist/components/message/footer/SessionClosedModal.d.ts +3 -1
  172. package/dist/components/message/footer/SessionClosedModal.d.ts.map +1 -1
  173. package/dist/components/message/footer/SessionClosedModal.js +6 -2
  174. package/dist/components/message/footer/ToolbarPlugin.d.ts +3 -1
  175. package/dist/components/message/footer/ToolbarPlugin.d.ts.map +1 -1
  176. package/dist/components/message/footer/ToolbarPlugin.js +2 -2
  177. package/dist/components/message/footer/clearComposerHistory.d.ts +3 -0
  178. package/dist/components/message/footer/clearComposerHistory.d.ts.map +1 -0
  179. package/dist/components/message/footer/clearComposerHistory.js +11 -0
  180. package/dist/components/message/footer/index.d.ts +2 -2
  181. package/dist/components/message/footer/index.d.ts.map +1 -1
  182. package/dist/components/message/footer/index.js +15 -5
  183. package/dist/components/message/footer/mention/MentionMenu.d.ts.map +1 -1
  184. package/dist/components/message/footer/mention/MentionMenu.js +4 -1
  185. package/dist/components/message/footer/useComposerFocusRequest.d.ts +10 -0
  186. package/dist/components/message/footer/useComposerFocusRequest.d.ts.map +1 -0
  187. package/dist/components/message/footer/useComposerFocusRequest.js +28 -0
  188. package/dist/components/message/groupMemberMenuCrm.d.ts +32 -0
  189. package/dist/components/message/groupMemberMenuCrm.d.ts.map +1 -0
  190. package/dist/components/message/groupMemberMenuCrm.js +83 -0
  191. package/dist/components/message/groupMemberTypes.d.ts +13 -0
  192. package/dist/components/message/groupMemberTypes.d.ts.map +1 -0
  193. package/dist/components/message/groupMemberTypes.js +1 -0
  194. package/dist/components/message/headerIconButton.d.ts +10 -0
  195. package/dist/components/message/headerIconButton.d.ts.map +1 -0
  196. package/dist/components/message/headerIconButton.js +9 -0
  197. package/dist/components/message/item/CrmSystemLine.d.ts +10 -0
  198. package/dist/components/message/item/CrmSystemLine.d.ts.map +1 -0
  199. package/dist/components/message/item/CrmSystemLine.js +6 -0
  200. package/dist/components/message/item/DateDivider.d.ts +5 -0
  201. package/dist/components/message/item/DateDivider.d.ts.map +1 -0
  202. package/dist/components/message/item/DateDivider.js +5 -0
  203. package/dist/components/message/item/GroupNotificationMessage.d.ts.map +1 -1
  204. package/dist/components/message/item/GroupNotificationMessage.js +9 -0
  205. package/dist/components/message/item/MemberEventSummary.d.ts +8 -0
  206. package/dist/components/message/item/MemberEventSummary.d.ts.map +1 -0
  207. package/dist/components/message/item/MemberEventSummary.js +18 -0
  208. package/dist/components/message/item/MessageBubble.d.ts +3 -1
  209. package/dist/components/message/item/MessageBubble.d.ts.map +1 -1
  210. package/dist/components/message/item/MessageBubble.js +27 -13
  211. package/dist/components/message/item/MessageMoreButton.d.ts +13 -0
  212. package/dist/components/message/item/MessageMoreButton.d.ts.map +1 -0
  213. package/dist/components/message/item/MessageMoreButton.js +42 -0
  214. package/dist/components/message/item/RevokeMessage.js +1 -1
  215. package/dist/components/message/item/SessionEventMessage.d.ts.map +1 -1
  216. package/dist/components/message/item/SessionEventMessage.js +13 -1
  217. package/dist/components/message/item/SystemLogMessage.d.ts.map +1 -1
  218. package/dist/components/message/item/SystemLogMessage.js +7 -0
  219. package/dist/components/message/item/index.d.ts.map +1 -1
  220. package/dist/components/message/item/index.js +64 -15
  221. package/dist/components/message/item/otherSenders.d.ts +7 -0
  222. package/dist/components/message/item/otherSenders.d.ts.map +1 -0
  223. package/dist/components/message/item/otherSenders.js +29 -0
  224. package/dist/components/message/item/textStyle.d.ts +1 -1
  225. package/dist/components/message/item/textStyle.d.ts.map +1 -1
  226. package/dist/components/message/item/textStyle.js +2 -2
  227. package/dist/components/message/messageKeyboardNav.d.ts +8 -0
  228. package/dist/components/message/messageKeyboardNav.d.ts.map +1 -0
  229. package/dist/components/message/messageKeyboardNav.js +24 -0
  230. package/dist/components/message/reply/ReplyPreviewBar.js +2 -2
  231. package/dist/components/message/toolbox/MessageToolboxMenu.d.ts.map +1 -1
  232. package/dist/components/message/toolbox/MessageToolboxMenu.js +16 -1
  233. package/dist/components/search-conversation/SearchAll.d.ts.map +1 -1
  234. package/dist/components/search-conversation/SearchAll.js +12 -1
  235. package/dist/components/search-conversation/SearchDrawer.d.ts.map +1 -1
  236. package/dist/components/search-conversation/SearchDrawer.js +31 -15
  237. package/dist/components/search-conversation/SearchMessageOnCurrentConversation.d.ts.map +1 -1
  238. package/dist/components/search-conversation/SearchMessageOnCurrentConversation.js +5 -2
  239. package/dist/components/search-conversation/index.d.ts.map +1 -1
  240. package/dist/components/search-conversation/index.js +3 -1
  241. package/dist/components/search-conversation/item/SearchItemAsGroup.d.ts.map +1 -1
  242. package/dist/components/search-conversation/item/SearchItemAsGroup.js +14 -4
  243. package/dist/components/search-conversation/item/SearchItemAsMessage.d.ts.map +1 -1
  244. package/dist/components/search-conversation/item/SearchItemAsMessage.js +18 -7
  245. package/dist/components/search-conversation/item/SearchItemAsUser.d.ts.map +1 -1
  246. package/dist/components/search-conversation/item/SearchItemAsUser.js +23 -5
  247. package/dist/components/search-conversation/item/searchRowClass.d.ts +3 -0
  248. package/dist/components/search-conversation/item/searchRowClass.d.ts.map +1 -0
  249. package/dist/components/search-conversation/item/searchRowClass.js +5 -0
  250. package/dist/components/session/DeskAssignedSession.d.ts +5 -1
  251. package/dist/components/session/DeskAssignedSession.d.ts.map +1 -1
  252. package/dist/components/session/DeskAssignedSession.js +40 -12
  253. package/dist/components/session/DeskTeamInbox.d.ts.map +1 -1
  254. package/dist/components/session/DeskTeamInbox.js +15 -22
  255. package/dist/components/session/FolderRow.d.ts +21 -0
  256. package/dist/components/session/FolderRow.d.ts.map +1 -0
  257. package/dist/components/session/FolderRow.js +16 -0
  258. package/dist/components/session/SessionFolderList.d.ts +23 -0
  259. package/dist/components/session/SessionFolderList.d.ts.map +1 -0
  260. package/dist/components/session/SessionFolderList.js +27 -0
  261. package/dist/components/session/sessionFilters.d.ts +24 -0
  262. package/dist/components/session/sessionFilters.d.ts.map +1 -0
  263. package/dist/components/session/sessionFilters.js +80 -0
  264. package/dist/components/shortcut-help/ShortcutHelpModal.d.ts +8 -0
  265. package/dist/components/shortcut-help/ShortcutHelpModal.d.ts.map +1 -0
  266. package/dist/components/shortcut-help/ShortcutHelpModal.js +23 -0
  267. package/dist/components/thread/AssignConfirmModal.d.ts.map +1 -1
  268. package/dist/components/thread/AssignConfirmModal.js +4 -3
  269. package/dist/components/thread/EndSessionConfirm.d.ts +11 -0
  270. package/dist/components/thread/EndSessionConfirm.d.ts.map +1 -0
  271. package/dist/components/thread/EndSessionConfirm.js +31 -0
  272. package/dist/components/thread/EndSessionToast.d.ts +6 -0
  273. package/dist/components/thread/EndSessionToast.d.ts.map +1 -0
  274. package/dist/components/thread/EndSessionToast.js +18 -0
  275. package/dist/components/thread/GroupInfoBodyCrm.d.ts +46 -0
  276. package/dist/components/thread/GroupInfoBodyCrm.d.ts.map +1 -0
  277. package/dist/components/thread/GroupInfoBodyCrm.js +41 -0
  278. package/dist/components/thread/GroupInfoRows.d.ts +33 -0
  279. package/dist/components/thread/GroupInfoRows.d.ts.map +1 -0
  280. package/dist/components/thread/GroupInfoRows.js +18 -0
  281. package/dist/components/thread/GroupThreadInfo.d.ts.map +1 -1
  282. package/dist/components/thread/GroupThreadInfo.js +23 -6
  283. package/dist/components/thread/ManualAssignPopover.d.ts +3 -1
  284. package/dist/components/thread/ManualAssignPopover.d.ts.map +1 -1
  285. package/dist/components/thread/ManualAssignPopover.js +21 -9
  286. package/dist/components/thread/SessionDetailCard.d.ts +6 -0
  287. package/dist/components/thread/SessionDetailCard.d.ts.map +1 -0
  288. package/dist/components/thread/SessionDetailCard.js +103 -0
  289. package/dist/components/thread/SessionSection.d.ts +2 -4
  290. package/dist/components/thread/SessionSection.d.ts.map +1 -1
  291. package/dist/components/thread/SessionSection.js +19 -122
  292. package/dist/components/thread/SessionTagPicker.d.ts +11 -0
  293. package/dist/components/thread/SessionTagPicker.d.ts.map +1 -0
  294. package/dist/components/thread/SessionTagPicker.js +27 -0
  295. package/dist/components/thread/SingleThreadInfo.d.ts.map +1 -1
  296. package/dist/components/thread/SingleThreadInfo.js +16 -6
  297. package/dist/components/thread/SupportSessionPanel.d.ts +18 -0
  298. package/dist/components/thread/SupportSessionPanel.d.ts.map +1 -0
  299. package/dist/components/thread/SupportSessionPanel.js +46 -0
  300. package/dist/components/thread/ThreadInfo.d.ts +8 -1
  301. package/dist/components/thread/ThreadInfo.d.ts.map +1 -1
  302. package/dist/components/thread/ThreadInfo.js +27 -29
  303. package/dist/components/thread/ThreadInfoHeader.d.ts +13 -0
  304. package/dist/components/thread/ThreadInfoHeader.d.ts.map +1 -0
  305. package/dist/components/thread/ThreadInfoHeader.js +11 -0
  306. package/dist/components/thread/UserSection.d.ts.map +1 -1
  307. package/dist/components/thread/UserSection.js +35 -22
  308. package/dist/components/thread/sessionDateFormat.d.ts +3 -0
  309. package/dist/components/thread/sessionDateFormat.d.ts.map +1 -0
  310. package/dist/components/thread/sessionDateFormat.js +13 -0
  311. package/dist/components/thread/sessionDuration.d.ts +5 -0
  312. package/dist/components/thread/sessionDuration.d.ts.map +1 -0
  313. package/dist/components/thread/sessionDuration.js +24 -0
  314. package/dist/constants/index.d.ts +1 -0
  315. package/dist/constants/index.d.ts.map +1 -1
  316. package/dist/constants/index.js +2 -0
  317. package/dist/constants/layout.d.ts +24 -0
  318. package/dist/constants/layout.d.ts.map +1 -0
  319. package/dist/constants/layout.js +23 -0
  320. package/dist/context/ChatContext.d.ts.map +1 -1
  321. package/dist/context/ChatContext.js +27 -1
  322. package/dist/hooks/canned-response/useSearchCannedAcrossScopes.d.ts +7 -0
  323. package/dist/hooks/canned-response/useSearchCannedAcrossScopes.d.ts.map +1 -0
  324. package/dist/hooks/canned-response/useSearchCannedAcrossScopes.js +46 -0
  325. package/dist/hooks/common/useCloseOnSidePanelOpen.d.ts +3 -0
  326. package/dist/hooks/common/useCloseOnSidePanelOpen.d.ts.map +1 -0
  327. package/dist/hooks/common/useCloseOnSidePanelOpen.js +15 -0
  328. package/dist/hooks/common/useDeskShortcuts.d.ts +11 -0
  329. package/dist/hooks/common/useDeskShortcuts.d.ts.map +1 -0
  330. package/dist/hooks/common/useDeskShortcuts.js +94 -0
  331. package/dist/hooks/common/useEscapeLayer.d.ts +3 -0
  332. package/dist/hooks/common/useEscapeLayer.d.ts.map +1 -0
  333. package/dist/hooks/common/useEscapeLayer.js +18 -0
  334. package/dist/hooks/common/useMediaQuery.d.ts +3 -0
  335. package/dist/hooks/common/useMediaQuery.d.ts.map +1 -0
  336. package/dist/hooks/common/useMediaQuery.js +12 -0
  337. package/dist/hooks/common/useSidePanel.d.ts +12 -0
  338. package/dist/hooks/common/useSidePanel.d.ts.map +1 -0
  339. package/dist/hooks/common/useSidePanel.js +32 -0
  340. package/dist/hooks/group/useConversationGroups.d.ts.map +1 -1
  341. package/dist/hooks/group/useConversationGroups.js +3 -0
  342. package/dist/hooks/message/useNewMessageAnnouncement.d.ts +3 -0
  343. package/dist/hooks/message/useNewMessageAnnouncement.d.ts.map +1 -0
  344. package/dist/hooks/message/useNewMessageAnnouncement.js +30 -0
  345. package/dist/hooks/search/useSearchGroups.js +2 -1
  346. package/dist/hooks/search/useSearchMessage.d.ts +3 -1
  347. package/dist/hooks/search/useSearchMessage.d.ts.map +1 -1
  348. package/dist/hooks/search/useSearchMessage.js +2 -2
  349. package/dist/hooks/session/useBotSessionOwnerIdentity.d.ts +12 -0
  350. package/dist/hooks/session/useBotSessionOwnerIdentity.d.ts.map +1 -0
  351. package/dist/hooks/session/useBotSessionOwnerIdentity.js +22 -0
  352. package/dist/hooks/session/useCloseSession.d.ts +1 -0
  353. package/dist/hooks/session/useCloseSession.d.ts.map +1 -1
  354. package/dist/hooks/session/useCloseSession.js +9 -8
  355. package/dist/hooks/session/useEndSession.d.ts +11 -0
  356. package/dist/hooks/session/useEndSession.d.ts.map +1 -0
  357. package/dist/hooks/session/useEndSession.js +45 -0
  358. package/dist/hooks/session/useGetSession.d.ts.map +1 -1
  359. package/dist/hooks/session/useGetSession.js +27 -6
  360. package/dist/hooks/session/usePendingSessionClose.d.ts +5 -0
  361. package/dist/hooks/session/usePendingSessionClose.d.ts.map +1 -0
  362. package/dist/hooks/session/usePendingSessionClose.js +12 -0
  363. package/dist/hooks/session/useSessionCustomerName.d.ts +3 -0
  364. package/dist/hooks/session/useSessionCustomerName.d.ts.map +1 -0
  365. package/dist/hooks/session/useSessionCustomerName.js +19 -0
  366. package/dist/hooks/session/useSessionFieldAutosave.d.ts +19 -0
  367. package/dist/hooks/session/useSessionFieldAutosave.d.ts.map +1 -0
  368. package/dist/hooks/session/useSessionFieldAutosave.js +52 -0
  369. package/dist/index.d.ts +8 -2
  370. package/dist/index.d.ts.map +1 -1
  371. package/dist/index.js +5 -1
  372. package/dist/locales/vi/common.json +201 -21
  373. package/dist/locales/vi/conversation-inbox.json +21 -2
  374. package/dist/screens/desk-message/DeskWorkspace.d.ts +12 -0
  375. package/dist/screens/desk-message/DeskWorkspace.d.ts.map +1 -0
  376. package/dist/screens/desk-message/DeskWorkspace.js +57 -0
  377. package/dist/screens/desk-message/FolderOverlay.d.ts +4 -0
  378. package/dist/screens/desk-message/FolderOverlay.d.ts.map +1 -0
  379. package/dist/screens/desk-message/FolderOverlay.js +32 -0
  380. package/dist/screens/desk-message/SkipLinks.d.ts +4 -0
  381. package/dist/screens/desk-message/SkipLinks.d.ts.map +1 -0
  382. package/dist/screens/desk-message/SkipLinks.js +19 -0
  383. package/dist/screens/desk-message/ViewportNotice.d.ts +4 -0
  384. package/dist/screens/desk-message/ViewportNotice.d.ts.map +1 -0
  385. package/dist/screens/desk-message/ViewportNotice.js +9 -0
  386. package/dist/screens/desk-message/index.d.ts +3 -2
  387. package/dist/screens/desk-message/index.d.ts.map +1 -1
  388. package/dist/screens/desk-message/index.js +4 -12
  389. package/dist/store/deskPanelHost.d.ts +13 -0
  390. package/dist/store/deskPanelHost.d.ts.map +1 -0
  391. package/dist/store/deskPanelHost.js +9 -0
  392. package/dist/store/escapeLayers.d.ts +15 -0
  393. package/dist/store/escapeLayers.d.ts.map +1 -0
  394. package/dist/store/escapeLayers.js +15 -0
  395. package/dist/store/pendingSessionClose.d.ts +19 -0
  396. package/dist/store/pendingSessionClose.d.ts.map +1 -0
  397. package/dist/store/pendingSessionClose.js +74 -0
  398. package/dist/store/session.d.ts +2 -1
  399. package/dist/store/session.d.ts.map +1 -1
  400. package/dist/store/session.js +4 -1
  401. package/dist/store/sessionFolder.d.ts +15 -0
  402. package/dist/store/sessionFolder.d.ts.map +1 -0
  403. package/dist/store/sessionFolder.js +18 -0
  404. package/dist/store/shortcutPrefs.d.ts +9 -0
  405. package/dist/store/shortcutPrefs.d.ts.map +1 -0
  406. package/dist/store/shortcutPrefs.js +23 -0
  407. package/dist/store/sidePanel.d.ts +12 -0
  408. package/dist/store/sidePanel.d.ts.map +1 -0
  409. package/dist/store/sidePanel.js +9 -0
  410. package/dist/store/workspaceLayout.d.ts +12 -0
  411. package/dist/store/workspaceLayout.d.ts.map +1 -0
  412. package/dist/store/workspaceLayout.js +9 -0
  413. package/dist/styles/global.css +1 -1
  414. package/dist/types/chat.d.ts +18 -0
  415. package/dist/types/chat.d.ts.map +1 -1
  416. package/dist/types/dto.d.ts +2 -1
  417. package/dist/types/dto.d.ts.map +1 -1
  418. package/dist/utils/a11yClickable.d.ts +10 -0
  419. package/dist/utils/a11yClickable.d.ts.map +1 -0
  420. package/dist/utils/a11yClickable.js +15 -0
  421. package/dist/utils/events.d.ts +4 -0
  422. package/dist/utils/events.d.ts.map +1 -1
  423. package/dist/utils/headerMemberCount.d.ts +10 -0
  424. package/dist/utils/headerMemberCount.d.ts.map +1 -0
  425. package/dist/utils/headerMemberCount.js +3 -0
  426. package/dist/utils/memberEventRun.d.ts +16 -0
  427. package/dist/utils/memberEventRun.d.ts.map +1 -0
  428. package/dist/utils/memberEventRun.js +40 -0
  429. package/package.json +2 -2
  430. package/dist/components/session/SessionFilterMenu.d.ts +0 -15
  431. package/dist/components/session/SessionFilterMenu.d.ts.map +0 -1
  432. package/dist/components/session/SessionFilterMenu.js +0 -30
  433. package/dist/components/session/sessionMenuItems.d.ts +0 -28
  434. package/dist/components/session/sessionMenuItems.d.ts.map +0 -1
  435. package/dist/components/session/sessionMenuItems.js +0 -119
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/media-collection/index.tsx"],"names":[],"mappings":"AAaA,oBAAY,qBAAqB;IAC/B,KAAK,UAAU;IACf,KAAK,UAAU;IACf,IAAI,SAAS;IACb,IAAI,SAAS;CACd;AAED,QAAA,MAAM,eAAe,+CA+EpB,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/media-collection/index.tsx"],"names":[],"mappings":"AAkBA,oBAAY,qBAAqB;IAC/B,KAAK,UAAU;IACf,KAAK,UAAU;IACf,IAAI,SAAS;IACb,IAAI,SAAS;CACd;AAED,QAAA,MAAM,eAAe,+CAuGpB,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -1,15 +1,20 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useBoolean } from "ahooks";
3
+ import { headerIconButtonClass, HeaderIcon } from "../../components/message/headerIconButton";
4
+ import useAuthStore from "../../store/auth";
5
+ import { useSidePanel } from "../../hooks/common/useSidePanel";
4
6
  import { Button, Drawer, Tabs } from "antd";
5
7
  import { Icon } from "../../components/icon";
6
8
  import { useTranslation } from "react-i18next";
7
9
  import ImageCollection from "./ImageCollection";
8
10
  import VideoCollection from "./VideoCollection";
9
11
  import { useIsMobile } from "../../hooks/common/useIsMobile";
10
- import { useMemo } from "react";
12
+ import { useMemo, useRef } from "react";
11
13
  import FileCollection from "./FileCollection";
12
14
  import LinkCollection from "./LinkCollection";
15
+ import useDeskPanelHostStore from "../../store/deskPanelHost";
16
+ import DeskSidePanel from "../../components/common/DeskSidePanel";
17
+ import GroupPanelHeader from "../../components/group/GroupPanelHeader";
13
18
  export var MediaCollectionTabKey;
14
19
  (function (MediaCollectionTabKey) {
15
20
  MediaCollectionTabKey["Image"] = "image";
@@ -19,8 +24,18 @@ export var MediaCollectionTabKey;
19
24
  })(MediaCollectionTabKey || (MediaCollectionTabKey = {}));
20
25
  const MediaCollection = () => {
21
26
  const { t } = useTranslation();
22
- const [isOpen, { toggle }] = useBoolean(false);
27
+ const { isOpen, toggle } = useSidePanel("media");
28
+ const isCrm = useAuthStore((state) => state.isCrm);
23
29
  const isMobile = useIsMobile();
30
+ const triggerRef = useRef(null);
31
+ // CRM desk: opens like the members panel, inline or as a drawer over the workspace.
32
+ const hasDeskHost = useDeskPanelHostStore((state) => !!(state.workspace || state.slot));
33
+ // Drawer renders in-place, so focus is handed back to the trigger explicitly.
34
+ const handleClose = () => {
35
+ var _a;
36
+ toggle();
37
+ (_a = triggerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
38
+ };
24
39
  const items = useMemo(() => {
25
40
  if (!isOpen)
26
41
  return [];
@@ -47,11 +62,12 @@ const MediaCollection = () => {
47
62
  },
48
63
  ];
49
64
  }, [isOpen, t]);
50
- return (_jsxs("div", { "data-cp-name": "MediaCollection", className: "inline-flex shrink-0", children: [_jsx(Button, { type: "text", shape: "default", className: "text-[var(--dc-color-header-icon)] w-8 h-8 p-0", onClick: toggle, children: _jsx(Icon, { icon: "folder-o", size: 22 }) }), _jsx(Drawer, { open: isOpen, onClose: toggle, mask: false, closeIcon: false, styles: {
65
+ const tabs = (_jsx(Tabs, { defaultActiveKey: MediaCollectionTabKey.Image, items: items, className: "h-full" }));
66
+ return (_jsxs("div", { "data-cp-name": "MediaCollection", className: "inline-flex shrink-0", children: [_jsx(Button, { ref: triggerRef, type: "text", shape: "default", className: headerIconButtonClass(isCrm, isOpen), onClick: toggle, "aria-label": t("media_library_open"), title: t("media_library_open"), children: _jsx(HeaderIcon, { isCrm: isCrm, stroke: "folder", font: "folder-o" }) }), isCrm && hasDeskHost ? (_jsx(DeskSidePanel, { open: isOpen, label: t("media_library_open"), onClose: handleClose, children: () => (_jsxs("div", { className: "flex h-full flex-col bg-white", "data-cp-name": "MediaLibraryPanel", children: [_jsx(GroupPanelHeader, { title: t("library"), onClose: handleClose }), _jsx("div", { className: "flex-1 overflow-hidden", children: tabs })] })) })) : (_jsx(Drawer, { "aria-label": t("media_library_open"), open: isOpen, onClose: handleClose, mask: false, closeIcon: false, styles: {
51
67
  body: {
52
68
  padding: 0,
53
69
  height: "100%",
54
70
  },
55
- }, getContainer: false, forceRender: true, width: isMobile ? "100%" : 360, children: _jsxs("div", { className: "flex flex-col h-full", children: [_jsxs("div", { className: "flex items-center justify-between p-3", children: [_jsx("span", { className: "text-lg font-medium", children: t("library") }), _jsx(Button, { type: "text", shape: "default", className: "text-gray-500 w-8 h-8 p-0", onClick: toggle, children: _jsx(Icon, { icon: "close-b", size: 22 }) })] }), _jsx("div", { className: "flex-1 overflow-hidden", children: _jsx(Tabs, { defaultActiveKey: MediaCollectionTabKey.Image, items: items, className: "h-full" }) })] }) })] }));
71
+ }, getContainer: false, destroyOnHidden: true, width: isMobile ? "100%" : 360, children: _jsxs("div", { className: "flex flex-col h-full", children: [_jsxs("div", { className: "flex items-center justify-between p-3", children: [_jsx("span", { className: "text-lg font-medium", children: t("library") }), _jsx(Button, { type: "text", shape: "default", className: "text-gray-500 w-8 h-8 p-0", onClick: handleClose, "aria-label": t("close"), children: _jsx(Icon, { icon: "close-b", size: 22 }) })] }), _jsx("div", { className: "flex-1 overflow-hidden", children: tabs })] }) }))] }));
56
72
  };
57
73
  export default MediaCollection;
@@ -1 +1 @@
1
- {"version":3,"file":"GroupMembersDrawer.d.ts","sourceRoot":"","sources":["../../../src/components/message/GroupMembersDrawer.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAiB/C,UAAU,uBAAuB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA0CD,QAAA,MAAM,kBAAkB,GAAI,wDAKzB,uBAAuB,4CAwjBzB,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"GroupMembersDrawer.d.ts","sourceRoot":"","sources":["../../../src/components/message/GroupMembersDrawer.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAwB/C,UAAU,uBAAuB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA6BD,QAAA,MAAM,kBAAkB,GAAI,wDAKzB,uBAAuB,4CA4oBzB,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -2,7 +2,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { GroupMemberRole } from "@droppii-org/wasm-client-sdk";
3
3
  import { Avatar, Button, Drawer, Dropdown, Empty, Input, message, Spin } from "antd";
4
4
  import ConfirmModal from "../../components/common/ConfirmModal";
5
- import { useEffect, useMemo, useState } from "react";
5
+ import DisableSendPermissionConfirm from "../../components/group/DisableSendPermissionConfirm";
6
+ import { useEffect, useMemo, useRef, useState } from "react";
6
7
  import { useDebounce } from "ahooks";
7
8
  import { useTranslation } from "react-i18next";
8
9
  import { useChatNavigate } from "../../hooks/conversation/useChatNavigate";
@@ -18,6 +19,12 @@ import { Icon } from "../../components/icon";
18
19
  import AddMemberModal from "../../components/group/AddMemberModal";
19
20
  import AdminPermissionModal from "../../components/group/AdminPermissionModal";
20
21
  import { isGroupConversation } from "../../utils/imCommon";
22
+ import { useSidePanel } from "../../hooks/common/useSidePanel";
23
+ import { headerIconButtonClass, HeaderIcon } from "./headerIconButton";
24
+ import useDeskPanelHostStore from "../../store/deskPanelHost";
25
+ import DeskSidePanel from "../../components/common/DeskSidePanel";
26
+ import GroupMembersPanelCrm from "./GroupMembersPanelCrm";
27
+ import { buildCrmMemberMenu } from "./groupMemberMenuCrm";
21
28
  const getMemberDisplayName = (member) => {
22
29
  return member.nickname || member.userID || "";
23
30
  };
@@ -35,7 +42,10 @@ const GroupMembersDrawer = ({ groupID, conversationId, currentSession, disabled
35
42
  var _a, _b;
36
43
  const { t } = useTranslation();
37
44
  const onNavigate = useChatNavigate();
38
- const [isOpen, setIsOpen] = useState(false);
45
+ const { isOpen, open: openPanel, close: closePanel } = useSidePanel("members");
46
+ const triggerRef = useRef(null);
47
+ const isCrm = useAuthStore((state) => state.isCrm);
48
+ const host = useDeskPanelHostStore();
39
49
  const [showLeaveConfirm, setShowLeaveConfirm] = useState(false);
40
50
  const [showAddMember, setShowAddMember] = useState(false);
41
51
  const [adminPermissionMember, setAdminPermissionMember] = useState(null);
@@ -122,17 +132,23 @@ const GroupMembersDrawer = ({ groupID, conversationId, currentSession, disabled
122
132
  if (!groupID || disabled) {
123
133
  return;
124
134
  }
125
- setIsOpen(true);
135
+ openPanel();
126
136
  void refetch();
127
137
  };
138
+ // Drawer renders in-place, so focus is handed back to the trigger explicitly.
128
139
  const handleCloseDrawer = () => {
129
- setIsOpen(false);
140
+ var _a;
141
+ closePanel();
142
+ (_a = triggerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
130
143
  };
131
144
  const isCurrentUserAssigneeOfActiveSession = useMemo(() => {
132
145
  if (!currentSession || currentSession.isClosed)
133
146
  return false;
134
147
  return currentSession.supporterId === authUserID;
135
148
  }, [currentSession, authUserID]);
149
+ const leaveBlockedReason = isCurrentUserAssigneeOfActiveSession
150
+ ? t("leave_group_assignee_reason")
151
+ : undefined;
136
152
  const handleLeaveGroup = () => {
137
153
  if (isCurrentUserAssigneeOfActiveSession) {
138
154
  message.error(t("leave_group_assignee_error"));
@@ -163,6 +179,13 @@ const GroupMembersDrawer = ({ groupID, conversationId, currentSession, disabled
163
179
  message.error(((_b = (_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.message) || t("update_group_info_failed"));
164
180
  }
165
181
  };
182
+ const handleConfirmMuteMember = async () => {
183
+ if ((confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.type) !== "mute-member")
184
+ return;
185
+ const { member } = confirmMemberAction;
186
+ setConfirmMemberAction(null);
187
+ await handleToggleMemberSendMessage(member);
188
+ };
166
189
  const handleConfirmRemoveMember = async () => {
167
190
  var _a, _b;
168
191
  if (!groupID || (confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.type) !== "remove")
@@ -246,7 +269,7 @@ const GroupMembersDrawer = ({ groupID, conversationId, currentSession, disabled
246
269
  message.success(t("leave_group_success"));
247
270
  onNavigate(window.location.pathname);
248
271
  setShowLeaveConfirm(false);
249
- setIsOpen(false);
272
+ closePanel();
250
273
  }
251
274
  catch (error) {
252
275
  const errorMessage = ((_b = (_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.message) || t("leave_group_failed");
@@ -254,8 +277,27 @@ const GroupMembersDrawer = ({ groupID, conversationId, currentSession, disabled
254
277
  }
255
278
  };
256
279
  useEffect(() => {
257
- setIsOpen(false);
280
+ closePanel();
258
281
  }, [groupID]);
282
+ const renderCrmPanel = (closeOnEscape) => (_jsx(GroupMembersPanelCrm, { totalCount: members.length, members: sortedMembers.map((member) => isRealGroup ? member : Object.assign(Object.assign({}, member), { roleLabel: "" })), isRealGroup: isRealGroup, isLoading: isLoading || (isSearchActive && isSearching), error: error, isSearchActive: isSearchActive, search: search, onSearchChange: setSearch, canAddMember: canAddMember, onAddMember: () => setShowAddMember(true), onClose: handleCloseDrawer, closeOnEscape: closeOnEscape, buildMenu: (member) => buildCrmMemberMenu({
283
+ member,
284
+ isRealGroup,
285
+ permissions,
286
+ actingIsOwner,
287
+ leaveBlockedReason,
288
+ t,
289
+ handlers: {
290
+ onToggleMute: (m) => void handleToggleMemberSendMessage(m),
291
+ onAskMute: (m) => setConfirmMemberAction({ type: "mute-member", member: m }),
292
+ onAskTransfer: (m) => setConfirmMemberAction({ type: "transfer-owner", member: m }),
293
+ onConfigureAdmin: setAdminPermissionMember,
294
+ onRemoveAdmin: (m) => void handleToggleAdminRole(m),
295
+ onAskAssignAdmin: (m) => setConfirmMemberAction({ type: "assign-admin", member: m }),
296
+ onAskRemove: (m) => setConfirmMemberAction({ type: "remove", member: m }),
297
+ onLeave: handleLeaveGroup,
298
+ },
299
+ }) }));
300
+ const renderCrmHost = () => (_jsx(DeskSidePanel, { open: isOpen, label: t("members"), onClose: handleCloseDrawer, children: renderCrmPanel }));
259
301
  const renderContent = () => {
260
302
  if (isLoading || (isSearchActive && isSearching)) {
261
303
  return (_jsx("div", { className: "flex items-center justify-center h-full min-h-40", children: _jsx(Spin, {}) }));
@@ -302,7 +344,9 @@ const GroupMembersDrawer = ({ groupID, conversationId, currentSession, disabled
302
344
  : t("mute_member"),
303
345
  icon: _jsx(Icon, { icon: "bell-off-o", size: 16 }),
304
346
  disabled: !permissions.removeMember,
305
- onClick: () => void handleToggleMemberSendMessage(member),
347
+ onClick: () => member.isSendMessageDisabled
348
+ ? void handleToggleMemberSendMessage(member)
349
+ : setConfirmMemberAction({ type: "mute-member", member }),
306
350
  },
307
351
  {
308
352
  key: "transfer-owner",
@@ -357,24 +401,27 @@ const GroupMembersDrawer = ({ groupID, conversationId, currentSession, disabled
357
401
  disabled: true,
358
402
  },
359
403
  ];
360
- return (_jsxs("div", { className: "flex items-center gap-3 px-4 py-2", children: [_jsx(Avatar, { src: member.faceURL, size: 40, className: "shrink-0", children: member.nickname.charAt(0) || "A" }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [_jsx("p", { className: "text-sm font-semibold text-gray-900 truncate", children: member.nickname }), member.isCurrentUser && (_jsx("span", { className: "text-xs text-blue-500 shrink-0", children: t("current_account") }))] }), member.roleLabel && (_jsx("p", { className: "text-sm text-gray-500 truncate", children: member.roleLabel }))] }), (isRealGroup || member.isCurrentUser) && (_jsx(Dropdown, { menu: { items: menuItems }, trigger: ["click"], placement: "bottomRight", children: _jsx("button", { type: "button", className: "flex items-center justify-center w-8 h-8 rounded-full text-gray-500 hover:bg-gray-100", onClick: (event) => event.stopPropagation(), children: _jsx(Icon, { icon: "more-horizontal-b", size: 18 }) }) }))] }, member.userID));
404
+ return (_jsxs("div", { className: "flex items-center gap-3 px-4 py-2", children: [_jsx(Avatar, { src: member.faceURL, size: 40, className: "shrink-0", children: member.nickname.charAt(0) || "A" }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [_jsx("p", { className: "text-sm font-semibold text-gray-900 truncate", children: member.nickname }), member.isCurrentUser && (_jsx("span", { className: "text-xs text-blue-500 shrink-0", children: t("current_account") }))] }), member.roleLabel && (_jsx("p", { className: "text-sm text-gray-500 truncate", children: member.roleLabel }))] }), (isRealGroup || member.isCurrentUser) && (_jsx(Dropdown, { menu: { items: menuItems }, trigger: ["click"], placement: "bottomRight", children: _jsx("button", { type: "button", "aria-label": t("member_actions"), title: t("member_actions"), className: "flex items-center justify-center w-8 h-8 rounded-full text-gray-500 hover:bg-gray-100", onClick: (event) => event.stopPropagation(), children: _jsx(Icon, { icon: "more-horizontal-b", size: 18 }) }) }))] }, member.userID));
361
405
  }) }));
362
406
  };
363
- return (_jsxs("div", { className: "inline-flex shrink-0", "data-cp-name": "GroupMembersDrawer", children: [_jsx(Button, { type: "text", shape: "default", className: "text-[var(--dc-color-header-icon)] w-8 h-8 p-0", onClick: handleOpenDrawer, disabled: disabled || !groupID, children: _jsx(Icon, { icon: "user-two-check-o", size: 22 }) }), _jsx(Drawer, { open: isOpen, onClose: handleCloseDrawer, mask: false, closeIcon: false, styles: {
407
+ return (_jsxs("div", { className: "inline-flex shrink-0", "data-cp-name": "GroupMembersDrawer", children: [_jsx(Button, { ref: triggerRef, type: "text", shape: "default", className: headerIconButtonClass(isCrm, isOpen), onClick: handleOpenDrawer, disabled: disabled || !groupID, "aria-label": t("members"), title: t("members"), children: _jsx(HeaderIcon, { isCrm: isCrm, stroke: "users", font: "user-two-check-o" }) }), isCrm && (host.workspace || host.slot) ? (renderCrmHost()) : (_jsx(Drawer, { open: isOpen, "aria-label": t("members"), onClose: handleCloseDrawer, mask: false, closeIcon: false, styles: {
364
408
  body: {
365
409
  padding: 0,
366
410
  height: "100%",
367
411
  },
368
- }, getContainer: false, forceRender: true, width: 360, children: _jsxs("div", { className: "flex flex-col h-full bg-white", children: [_jsxs("div", { className: "flex items-center justify-between px-4 py-4 border-b border-gray-100", children: [_jsx("span", { className: "text-lg font-medium", children: t("members") }), _jsx(Button, { type: "text", shape: "default", className: "text-gray-500 w-8 h-8 p-0", onClick: handleCloseDrawer, children: _jsx(Icon, { icon: "close-b", size: 22 }) })] }), _jsxs("div", { className: "flex items-center gap-2 px-4 py-3", children: [_jsx(Input, { value: search, onChange: (event) => setSearch(event.target.value), placeholder: t("search_member_placeholder"), prefix: _jsx(Icon, { icon: "search-o", size: 16, className: "text-gray-400" }), className: "h-10" }), canAddMember && (_jsx(Button, { type: "primary", shape: "default", className: "w-10 h-10 p-0 shrink-0 flex items-center justify-center rounded-lg", onClick: () => setShowAddMember(true), children: _jsx(Icon, { icon: "user-add-b", size: 18 }) }))] }), _jsx("div", { className: "flex-1 overflow-y-auto", children: renderContent() })] }) }), groupID && (_jsx(AddMemberModal, { open: showAddMember, groupID: groupID, onClose: () => setShowAddMember(false) })), groupID && (_jsx(AdminPermissionModal, { open: Boolean(adminPermissionMember), groupID: groupID, onClose: () => setAdminPermissionMember(null), member: adminPermissionMember
412
+ }, getContainer: false, destroyOnHidden: true, width: 360, children: _jsxs("div", { className: "flex flex-col h-full bg-white", children: [_jsxs("div", { className: "flex items-center justify-between px-4 py-4 border-b border-gray-100", children: [_jsx("span", { className: "text-lg font-medium", children: t("members") }), _jsx(Button, { type: "text", shape: "default", className: "text-gray-500 w-8 h-8 p-0", onClick: handleCloseDrawer, "aria-label": t("close"), children: _jsx(Icon, { icon: "close-b", size: 22 }) })] }), _jsxs("div", { className: "flex items-center gap-2 px-4 py-3", children: [_jsx(Input, { value: search, onChange: (event) => setSearch(event.target.value), placeholder: t("search_member_placeholder"), prefix: _jsx(Icon, { icon: "search-o", size: 16, className: "text-gray-400" }), className: "h-10" }), canAddMember && (_jsx(Button, { type: "primary", shape: "default", className: "w-10 h-10 p-0 shrink-0 flex items-center justify-center rounded-lg", onClick: () => setShowAddMember(true), children: _jsx(Icon, { icon: "user-add-b", size: 18 }) }))] }), _jsx("div", { className: "flex-1 overflow-y-auto", children: renderContent() })] }) })), groupID && (_jsx(AddMemberModal, { open: showAddMember, groupID: groupID, onClose: () => setShowAddMember(false) })), groupID && (_jsx(AdminPermissionModal, { open: Boolean(adminPermissionMember), groupID: groupID, onClose: () => setAdminPermissionMember(null), member: adminPermissionMember
369
413
  ? {
370
414
  userID: adminPermissionMember.userID,
415
+ nickname: adminPermissionMember.nickname,
371
416
  permissions: adminPermissionMember.permissions,
372
417
  }
373
- : undefined, onMemberPermissionsSaved: patchMemberPermissions })), _jsx(ConfirmModal, { open: showLeaveConfirm, onOk: handleConfirmLeave, onCancel: () => setShowLeaveConfirm(false), title: t("leave_group_confirm_title"), okText: t("leave_group"), cancelText: t("cancel"), okType: "danger", confirmLoading: isLeaving, children: _jsx("p", { children: t("leave_group_confirm_message") }) }), _jsx(ConfirmModal, { open: (confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.type) === "remove", onOk: handleConfirmRemoveMember, onCancel: () => setConfirmMemberAction(null), title: t("remove_member_confirm_title"), okText: t("agree"), cancelText: t("cancel"), okType: "danger", children: _jsx("p", { children: t("remove_member_confirm_message", {
418
+ : undefined, onMemberPermissionsSaved: patchMemberPermissions })), _jsx(ConfirmModal, { open: showLeaveConfirm, onOk: handleConfirmLeave, onCancel: () => setShowLeaveConfirm(false), title: t("leave_group_confirm_title"), okText: t("leave_group"), cancelText: t(isCrm ? "action_cancel" : "cancel"), okType: "danger", confirmLoading: isLeaving, children: _jsx("p", { children: t("leave_group_confirm_message") }) }), _jsx(DisableSendPermissionConfirm, { open: (confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.type) === "mute-member", title: t("disable_send_permission_title_member", {
419
+ name: confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.member.nickname,
420
+ }), onConfirm: handleConfirmMuteMember, onCancel: () => setConfirmMemberAction(null) }), _jsx(ConfirmModal, { open: (confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.type) === "remove", onOk: handleConfirmRemoveMember, onCancel: () => setConfirmMemberAction(null), title: t("remove_member_confirm_title"), okText: t("agree"), cancelText: t(isCrm ? "action_cancel" : "cancel"), okType: "danger", children: _jsx("p", { children: t("remove_member_confirm_message", {
374
421
  name: confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.member.nickname,
375
- }) }) }), _jsx(ConfirmModal, { open: (confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.type) === "transfer-owner", onOk: handleConfirmTransferOwner, onCancel: () => setConfirmMemberAction(null), title: t("transfer_owner_confirm_title"), okText: t("transfer_owner"), cancelText: t("cancel"), okType: "danger", children: _jsx("p", { children: t("transfer_owner_confirm_message", {
422
+ }) }) }), _jsx(ConfirmModal, { open: (confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.type) === "transfer-owner", onOk: handleConfirmTransferOwner, onCancel: () => setConfirmMemberAction(null), title: t("transfer_owner_confirm_title"), okText: t("transfer_owner"), cancelText: t(isCrm ? "action_cancel" : "cancel"), okType: "danger", children: _jsx("p", { children: t("transfer_owner_confirm_message", {
376
423
  name: confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.member.nickname,
377
- }) }) }), _jsx(ConfirmModal, { open: (confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.type) === "assign-admin", onOk: handleConfirmAssignAdmin, onCancel: () => setConfirmMemberAction(null), title: t("assign_admin_confirm_title"), okText: t("agree"), cancelText: t("cancel"), children: _jsx("p", { children: t("assign_admin_confirm_message", {
424
+ }) }) }), _jsx(ConfirmModal, { open: (confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.type) === "assign-admin", onOk: handleConfirmAssignAdmin, onCancel: () => setConfirmMemberAction(null), title: t("assign_admin_confirm_title"), okText: t("agree"), cancelText: t(isCrm ? "action_cancel" : "cancel"), children: _jsx("p", { children: t("assign_admin_confirm_message", {
378
425
  name: confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.member.nickname,
379
426
  }) }) })] }));
380
427
  };
@@ -0,0 +1,23 @@
1
+ import type { MenuProps } from "antd";
2
+ import type { MemberDisplayItem } from "./groupMemberTypes";
3
+ interface GroupMembersPanelCrmProps {
4
+ totalCount: number;
5
+ members: MemberDisplayItem[];
6
+ /** Real groups split owners/admins from members; support threads show one list. */
7
+ isRealGroup: boolean;
8
+ isLoading: boolean;
9
+ error?: string;
10
+ isSearchActive: boolean;
11
+ search: string;
12
+ onSearchChange: (value: string) => void;
13
+ canAddMember: boolean;
14
+ onAddMember: () => void;
15
+ onClose: () => void;
16
+ /** Esc closes the panel when it is not inside an overlay drawer. */
17
+ closeOnEscape: boolean;
18
+ buildMenu: (member: MemberDisplayItem) => MenuProps["items"];
19
+ }
20
+ /** CRM members panel: search + add, owners/admins and members lists, per-member action menu. */
21
+ declare const GroupMembersPanelCrm: ({ totalCount, members, isRealGroup, isLoading, error, isSearchActive, search, onSearchChange, canAddMember, onAddMember, onClose, closeOnEscape, buildMenu, }: GroupMembersPanelCrmProps) => import("react/jsx-runtime").JSX.Element;
22
+ export default GroupMembersPanelCrm;
23
+ //# sourceMappingURL=GroupMembersPanelCrm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupMembersPanelCrm.d.ts","sourceRoot":"","sources":["../../../src/components/message/GroupMembersPanelCrm.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAMtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,UAAU,yBAAyB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,mFAAmF;IACnF,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,oEAAoE;IACpE,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC;CAC9D;AAQD,gGAAgG;AAChG,QAAA,MAAM,oBAAoB,GAAI,+JAc3B,yBAAyB,4CA0H3B,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,55 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useEffect, useRef } from "react";
4
+ import { Button, Dropdown, Empty, Spin } from "antd";
5
+ import { useTranslation } from "react-i18next";
6
+ import { CrmIcon as Icon } from "../../components/group/crmIcon";
7
+ import GroupPanelHeader from "../../components/group/GroupPanelHeader";
8
+ import PersonAvatar from "../../components/group/PersonAvatar";
9
+ import { FOCUS_RING_CLASS } from "../../utils/a11yClickable";
10
+ const CHIP = "inline-flex h-[22px] shrink-0 items-center gap-1 whitespace-nowrap rounded-full px-2 text-xs font-medium";
11
+ const SectionTitle = ({ children }) => (_jsx("h3", { className: "m-0 px-2 pb-1 pt-3 text-xs font-medium text-gray-600", children: children }));
12
+ /** CRM members panel: search + add, owners/admins and members lists, per-member action menu. */
13
+ const GroupMembersPanelCrm = ({ totalCount, members, isRealGroup, isLoading, error, isSearchActive, search, onSearchChange, canAddMember, onAddMember, onClose, closeOnEscape, buildMenu, }) => {
14
+ const { t } = useTranslation();
15
+ const rootRef = useRef(null);
16
+ useEffect(() => {
17
+ var _a;
18
+ if (closeOnEscape)
19
+ (_a = rootRef.current) === null || _a === void 0 ? void 0 : _a.focus();
20
+ }, [closeOnEscape]);
21
+ const handleKeyDown = (event) => {
22
+ if (closeOnEscape && event.key === "Escape" && !event.defaultPrevented) {
23
+ event.stopPropagation();
24
+ onClose();
25
+ }
26
+ };
27
+ const privileged = isRealGroup ? members.filter((m) => m.isOwner || m.isAdmin) : [];
28
+ const regular = isRealGroup ? members.filter((m) => !m.isOwner && !m.isAdmin) : members;
29
+ const renderRow = (member) => {
30
+ const items = isRealGroup || member.isCurrentUser ? buildMenu(member) : undefined;
31
+ const roleChip = !isRealGroup && member.isOwner
32
+ ? null
33
+ : member.isOwner
34
+ ? _jsx("span", { className: `${CHIP} bg-primary-25 text-primary-500`, children: t("group_owner_chip") })
35
+ : member.isAdmin
36
+ ? _jsx("span", { className: `${CHIP} bg-gray-25 text-gray-900`, children: t("group_admin") })
37
+ : null;
38
+ return (_jsxs("li", { className: "flex items-center gap-2.5 rounded-lg p-2", children: [_jsx(PersonAvatar, { name: member.nickname, src: member.faceURL, size: 36 }), _jsxs("span", { className: "flex min-w-0 flex-1 items-baseline gap-1 text-sm font-medium text-gray-900", children: [_jsx("span", { className: "truncate", title: member.nickname, children: member.nickname }), member.isCurrentUser && (_jsxs("span", { className: "shrink-0 text-xs font-normal text-gray-600", children: ["(", t("you"), ")"] }))] }), roleChip, member.isSendMessageDisabled && !member.isOwner && (_jsxs("span", { className: `${CHIP} bg-warning-25 text-warning-800`, children: [_jsx(Icon, { icon: "bell-off-o", size: 12 }), t("send_disabled_chip")] })), items && items.length > 0 && (_jsx(Dropdown, { menu: { items, style: { width: 260 } }, trigger: ["click"], placement: "bottomRight", children: _jsx("button", { type: "button", "aria-label": t("member_actions_for", { name: member.nickname }), title: t("member_actions_for", { name: member.nickname }), className: `flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-gray-600 hover:bg-gray-5 aria-expanded:bg-gray-25 aria-expanded:text-gray-900 ${FOCUS_RING_CLASS}`, children: _jsx(Icon, { icon: "more-horizontal-b", size: 18 }) }) }))] }, member.userID));
39
+ };
40
+ const renderList = (list) => (_jsx("ul", { className: "m-0 flex list-none flex-col gap-0.5 p-0", children: list.map(renderRow) }));
41
+ const renderBody = () => {
42
+ if (isLoading) {
43
+ return _jsx("div", { className: "flex min-h-40 items-center justify-center", children: _jsx(Spin, {}) });
44
+ }
45
+ if (error) {
46
+ return _jsx("div", { className: "flex min-h-40 items-center justify-center px-6 text-center text-sm text-gray-600", children: t(error) });
47
+ }
48
+ if (!members.length) {
49
+ return _jsx(Empty, { description: isSearchActive ? t("no_member_found") : t("no_group_members") });
50
+ }
51
+ return (_jsxs(_Fragment, { children: [privileged.length > 0 && (_jsxs(_Fragment, { children: [_jsx(SectionTitle, { children: t("members_owner_admin_section") }), renderList(privileged)] })), regular.length > 0 && (_jsxs(_Fragment, { children: [_jsx(SectionTitle, { children: t("members_regular_section", { count: regular.length }) }), renderList(regular)] }))] }));
52
+ };
53
+ return (_jsxs("div", { ref: rootRef, tabIndex: -1, onKeyDown: handleKeyDown, "aria-label": t("members"), className: "flex h-full flex-col bg-white outline-none", "data-cp-name": "GroupMembersPanelCrm", children: [_jsx(GroupPanelHeader, { title: t("members_panel_title", { count: totalCount }), onClose: onClose }), _jsxs("div", { className: "flex gap-2 px-4 pb-1 pt-3", children: [_jsxs("label", { className: "flex h-9 min-w-0 flex-1 items-center gap-2 rounded-lg bg-gray-5 px-2.5 text-gray-600 focus-within:outline focus-within:outline-2 focus-within:outline-primary-200", children: [_jsx("span", { className: "sr-only", children: t("members_search_label") }), _jsx(Icon, { icon: "search-o", size: 16, className: "shrink-0" }), _jsx("input", { type: "search", value: search, onChange: (event) => onSearchChange(event.target.value), placeholder: t("members_search_label"), className: "min-w-0 flex-1 border-0 bg-transparent p-0 text-sm text-gray-900 outline-none placeholder:text-gray-600" })] }), canAddMember && (_jsx(Button, { type: "primary", className: "h-9 shrink-0 px-3", icon: _jsx(Icon, { icon: "user-add-o", size: 16 }), onClick: onAddMember, children: t("members_add") }))] }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto px-2 pb-2", children: renderBody() })] }));
54
+ };
55
+ export default GroupMembersPanelCrm;
@@ -1 +1 @@
1
- {"version":3,"file":"MessageHeader.d.ts","sourceRoot":"","sources":["../../../src/components/message/MessageHeader.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAGzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAgB/C,UAAU,kBAAkB;IAC1B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED,KAAK,sBAAsB,GAAG,aAAa,GAAG,UAAU,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,sBAAsB,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,QAAA,MAAM,aAAa,GAAI,0DAKpB,kBAAkB,4CA+QpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"MessageHeader.d.ts","sourceRoot":"","sources":["../../../src/components/message/MessageHeader.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AASzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAgB/C,UAAU,kBAAkB;IAC1B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED,KAAK,sBAAsB,GAAG,aAAa,GAAG,UAAU,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,sBAAsB,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,QAAA,MAAM,aAAa,GAAI,0DAKpB,kBAAkB,4CAuZpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -5,41 +5,46 @@ import { Icon } from "../../components/icon";
5
5
  import { useConversationDisplayData } from "../../hooks/conversation/useConversation";
6
6
  import useConversationStore from "../../store/conversation";
7
7
  import MediaCollection from "../../components/media-collection";
8
- import { useEffect, useMemo, useState } from "react";
8
+ import { Fragment, useEffect, useMemo, useState } from "react";
9
9
  import { useTranslation } from "react-i18next";
10
10
  import { SessionStatus, SessionTag } from "../../types/chat";
11
11
  import SelectSession from "./SelectSession";
12
12
  import { useUpdateSession } from "../../hooks/session/useUpdateSession";
13
+ import { useEndSession } from "../../hooks/session/useEndSession";
14
+ import { useFlushPendingCloseOnLeave, useIsSessionClosePending, } from "../../hooks/session/usePendingSessionClose";
15
+ import EndSessionConfirm from "../../components/thread/EndSessionConfirm";
13
16
  import useAuthStore from "../../store/auth";
17
+ import { headerIconButtonClass, HeaderIcon } from "./headerIconButton";
18
+ import { useSidePanel } from "../../hooks/common/useSidePanel";
14
19
  import SearchDrawer from "../../components/search-conversation/SearchDrawer";
15
20
  import { isGroupSession, isGroupConversation } from "../../utils/imCommon";
16
21
  import { useGroupPermission } from "../../hooks/group/useGroupPermission";
17
22
  import GroupCompositeAvatar from "../../components/group/GroupCompositeAvatar";
18
23
  import GroupMembersDrawer from "./GroupMembersDrawer";
19
24
  import { useGroupMembers } from "../../hooks/group/useGroupMembers";
20
- import { useGetUserSideInfo } from "../../hooks/session/useGetUserSideInfo";
25
+ import { useBotSessionOwnerIdentity } from "../../hooks/session/useBotSessionOwnerIdentity";
21
26
  import { PeerType } from "../../types/conversation";
22
- import { isSupportSessionAgentView, resolveBotSessionOwnerIdentity, resolveSupportSessionOwnerId, } from "../../utils/conversation";
27
+ import { shouldShowHeaderMemberCount } from "../../utils/headerMemberCount";
28
+ import TintedAvatar from "../../components/common/TintedAvatar";
29
+ import { splitDisplayName } from "../../components/conversation/rowDisplayName";
23
30
  const MessageHeader = ({ onClose, currentSession, isJoined, onOpenThreadInfo, }) => {
24
- var _a, _b, _c, _d, _e;
31
+ var _a, _b, _c, _d;
25
32
  const { t } = useTranslation();
26
33
  const isCx = useAuthStore((state) => state.isCx);
27
34
  const isCrm = useAuthStore((state) => state.isCrm);
28
- const selfUserID = useAuthStore((state) => state.userID);
35
+ const { isOpen: isInfoOpenState } = useSidePanel("info");
36
+ const isInfoPanelOpen = isInfoOpenState;
37
+ const handleInfoToggle = () => onOpenThreadInfo === null || onOpenThreadInfo === void 0 ? void 0 : onOpenThreadInfo();
29
38
  const conversationData = useConversationStore((state) => state.conversationData);
30
39
  const groupID = conversationData === null || conversationData === void 0 ? void 0 : conversationData.groupID;
31
40
  const currentGroupInfo = useConversationStore((state) => groupID ? state.currentGroupInfo.get(groupID) : undefined);
32
41
  const { mutate: updateSession } = useUpdateSession();
33
42
  const permissions = useGroupPermission(conversationData === null || conversationData === void 0 ? void 0 : conversationData.groupID);
34
43
  const { avatar, displayName } = useConversationDisplayData(conversationData);
35
- // Same chat-service user record as the desk list's session owner.
36
- const botSessionOwnerId = (conversationData === null || conversationData === void 0 ? void 0 : conversationData.peerType) === PeerType.BOT &&
37
- isSupportSessionAgentView(conversationData, selfUserID)
38
- ? resolveSupportSessionOwnerId(conversationData)
39
- : "";
40
- const { data: botSessionOwner } = useGetUserSideInfo((_a = conversationData === null || conversationData === void 0 ? void 0 : conversationData.conversationID) !== null && _a !== void 0 ? _a : "", botSessionOwnerId);
41
- const ownerIdentity = resolveBotSessionOwnerIdentity(conversationData, botSessionOwner, selfUserID);
42
- const headerName = (_b = ownerIdentity === null || ownerIdentity === void 0 ? void 0 : ownerIdentity.displayName) !== null && _b !== void 0 ? _b : displayName;
44
+ const { identity: ownerIdentity, owner: botSessionOwner, isLoading: isOwnerLoading, } = useBotSessionOwnerIdentity(conversationData);
45
+ // Avoids flashing the bot group's avatar and name before the customer arrives.
46
+ const showOwnerPlaceholder = isCrm && isOwnerLoading;
47
+ const headerName = (_a = ownerIdentity === null || ownerIdentity === void 0 ? void 0 : ownerIdentity.displayName) !== null && _a !== void 0 ? _a : displayName;
43
48
  const shouldShowMemberCount = isGroupSession(conversationData === null || conversationData === void 0 ? void 0 : conversationData.conversationType);
44
49
  // A "real" group (peerType GROUP) vs a CX support thread that happens to
45
50
  // use a Group/WorkingGroup session under the hood (e.g. a multi-agent
@@ -51,17 +56,41 @@ const MessageHeader = ({ onClose, currentSession, isJoined, onOpenThreadInfo, })
51
56
  // may view the member list, so it's bypassed there. The member list
52
57
  // button itself still shows for both (shouldShowMemberCount).
53
58
  const isRealGroup = isGroupConversation(conversationData !== null && conversationData !== void 0 ? conversationData : undefined);
59
+ // CRM shows a customer's name alone; the username sits in the sub-line. Group names stay whole.
60
+ const { name: headerShortName, username: headerUsername } = isRealGroup
61
+ ? { name: headerName !== null && headerName !== void 0 ? headerName : "", username: undefined }
62
+ : splitDisplayName(headerName !== null && headerName !== void 0 ? headerName : "");
54
63
  // Group info is only fetched for peerType GROUP; other threads count the
55
64
  // same member list the drawer shows, so the two never disagree.
56
65
  const usesGroupInfoCount = (conversationData === null || conversationData === void 0 ? void 0 : conversationData.peerType) === PeerType.GROUP;
57
- const { members: threadMembers } = useGroupMembers(shouldShowMemberCount && !usesGroupInfoCount ? groupID : undefined);
66
+ const showMemberCountLine = shouldShowHeaderMemberCount({
67
+ isCrm,
68
+ isGroupSession: shouldShowMemberCount,
69
+ isRealGroup,
70
+ });
71
+ const { members: threadMembers } = useGroupMembers(showMemberCountLine && !usesGroupInfoCount ? groupID : undefined);
58
72
  const memberCount = usesGroupInfoCount
59
- ? ((_c = currentGroupInfo === null || currentGroupInfo === void 0 ? void 0 : currentGroupInfo.memberCount) !== null && _c !== void 0 ? _c : 0)
73
+ ? (_b = currentGroupInfo === null || currentGroupInfo === void 0 ? void 0 : currentGroupInfo.memberCount) !== null && _b !== void 0 ? _b : 0
60
74
  : threadMembers.length;
61
75
  const canViewMemberList = shouldShowMemberCount &&
62
76
  isJoined === true &&
63
77
  isCrm &&
64
78
  (!isRealGroup || permissions.viewMemberInformation);
79
+ // 1-1 and support threads show "username · Phiên N" instead of a head-count.
80
+ const metaParts = [];
81
+ if (!showMemberCountLine) {
82
+ const username = (botSessionOwner === null || botSessionOwner === void 0 ? void 0 : botSessionOwner.username) || headerUsername;
83
+ if (username) {
84
+ metaParts.push(_jsx("span", { className: "min-w-[48px] truncate", title: username, children: username }));
85
+ }
86
+ if (currentSession === null || currentSession === void 0 ? void 0 : currentSession.order) {
87
+ metaParts.push(_jsx("span", { className: "shrink-0 whitespace-nowrap", children: t("session_label", { order: currentSession.order }) }));
88
+ }
89
+ }
90
+ const endSession = useEndSession();
91
+ const isEnding = useIsSessionClosePending(currentSession === null || currentSession === void 0 ? void 0 : currentSession.id);
92
+ const [isEndConfirmOpen, setIsEndConfirmOpen] = useState(false);
93
+ useFlushPendingCloseOnLeave(conversationData === null || conversationData === void 0 ? void 0 : conversationData.conversationID, isCrm);
65
94
  const [currentSessionStatus, setCurrentSessionStatus] = useState(SessionStatus.UNASSIGNED);
66
95
  const [currentSessionTag, setCurrentSessionTag] = useState(SessionTag.NONE);
67
96
  const statusOptions = useMemo(() => {
@@ -70,65 +99,73 @@ const MessageHeader = ({ onClose, currentSession, isJoined, onOpenThreadInfo, })
70
99
  label: t("unassigned"),
71
100
  value: SessionStatus.UNASSIGNED,
72
101
  tintColorClassname: "!text-amber-500",
73
- tintColorClassnameBg: "!bg-amber-500",
102
+ tintColorClassnameBg: isCrm ? "!bg-warning-400" : "!bg-amber-500",
74
103
  bgTintColorClassname: "!bg-amber-100",
75
104
  },
76
105
  {
77
106
  label: t("waiting_process"),
78
107
  value: SessionStatus.WAITING_PROCESS,
79
108
  tintColorClassname: "!text-orange-500",
80
- tintColorClassnameBg: "!bg-orange-500",
109
+ tintColorClassnameBg: isCrm ? "!bg-warning-400" : "!bg-orange-500",
81
110
  bgTintColorClassname: "!bg-orange-100",
82
111
  },
83
112
  {
84
113
  label: t("in_process"),
85
114
  value: SessionStatus.IN_PROCESS,
86
115
  tintColorClassname: "!text-blue-500",
87
- tintColorClassnameBg: "!bg-blue-500",
116
+ tintColorClassnameBg: isCrm ? "!bg-primary-400" : "!bg-blue-500",
88
117
  bgTintColorClassname: "!bg-blue-100",
89
118
  },
90
119
  {
91
120
  label: t("completed"),
92
121
  value: SessionStatus.COMPLETED,
93
122
  tintColorClassname: "!text-green-500",
94
- tintColorClassnameBg: "!bg-green-500",
123
+ tintColorClassnameBg: isCrm ? "!bg-success-400" : "!bg-green-500",
95
124
  bgTintColorClassname: "!bg-green-100",
96
125
  },
97
126
  ];
98
- }, [t]);
127
+ }, [t, isCrm]);
99
128
  const tagOptions = useMemo(() => {
100
129
  return [
101
130
  {
102
- label: t("select_tag"),
131
+ label: t(isCrm ? "reply_status_placeholder" : "select_tag"),
103
132
  value: SessionTag.NONE,
104
133
  tintColorClassname: "!text-gray-500",
105
- tintColorClassnameBg: "!bg-gray-500",
134
+ tintColorClassnameBg: isCrm ? "!bg-gray-400" : "!bg-gray-500",
106
135
  bgTintColorClassname: "!bg-gray-100",
107
136
  },
108
137
  {
109
138
  label: t("awaiting_reply"),
110
139
  value: SessionTag.AWAITING_REPLY,
111
140
  tintColorClassname: "!text-purple-500",
112
- tintColorClassnameBg: "!bg-purple-500",
141
+ tintColorClassnameBg: isCrm ? "!bg-secondary-400" : "!bg-purple-500",
113
142
  bgTintColorClassname: "!bg-purple-100",
114
143
  },
115
144
  {
116
145
  label: t("slow_processing"),
117
146
  value: SessionTag.SLOW_PROCESSING,
118
147
  tintColorClassname: "!text-red-500",
119
- tintColorClassnameBg: "!bg-red-500",
148
+ tintColorClassnameBg: isCrm ? "!bg-danger-600" : "!bg-red-500",
120
149
  bgTintColorClassname: "!bg-red-100",
121
150
  },
122
151
  {
123
152
  label: t("temporarily_paused"),
124
153
  value: SessionTag.TEMPORARILY_PAUSED,
125
154
  tintColorClassname: "!text-gray-500",
126
- tintColorClassnameBg: "!bg-gray-500",
155
+ tintColorClassnameBg: isCrm ? "!bg-gray-400" : "!bg-gray-500",
127
156
  bgTintColorClassname: "!bg-gray-100",
128
157
  },
129
158
  ];
130
- }, [t]);
159
+ }, [t, isCrm]);
131
160
  const handleUpdateSession = (value, type, isSameValue) => {
161
+ // CRM: completing an in-process session is an end-session action with undo.
162
+ if (isCrm &&
163
+ type === "status" &&
164
+ value === SessionStatus.COMPLETED &&
165
+ (currentSession === null || currentSession === void 0 ? void 0 : currentSession.status) === SessionStatus.IN_PROCESS) {
166
+ setIsEndConfirmOpen(true);
167
+ return;
168
+ }
132
169
  let newValue = value;
133
170
  if (type === "tag" &&
134
171
  value === SessionTag.TEMPORARILY_PAUSED &&
@@ -165,6 +202,18 @@ const MessageHeader = ({ onClose, currentSession, isJoined, onOpenThreadInfo, })
165
202
  setCurrentSessionStatus(currentSession.status);
166
203
  }
167
204
  }, [currentSession]);
168
- return (_jsxs("div", { className: "px-4 py-3 flex items-center border-b gap-3 bg-white flex-wrap", "data-cp-name": "MessageHeader", children: [ownerIdentity ? (_jsx(Avatar, { src: ownerIdentity.avatarUrl, size: "large", className: "min-w-10 min-h-10", children: ((_d = headerName === null || headerName === void 0 ? void 0 : headerName.charAt) === null || _d === void 0 ? void 0 : _d.call(headerName, 0)) || "A" })) : shouldShowMemberCount ? (_jsx(GroupCompositeAvatar, { groupID: conversationData === null || conversationData === void 0 ? void 0 : conversationData.groupID, faceURL: avatar, ownerUserID: currentGroupInfo === null || currentGroupInfo === void 0 ? void 0 : currentGroupInfo.ownerUserID, groupName: displayName, size: 40, className: "min-w-10 min-h-10" })) : (_jsx(Avatar, { src: avatar, size: "large", className: "min-w-10 min-h-10", children: ((_e = displayName === null || displayName === void 0 ? void 0 : displayName.charAt) === null || _e === void 0 ? void 0 : _e.call(displayName, 0)) || "A" })), _jsxs("div", { className: "flex flex-col overflow-hidden flex-1", children: [_jsx("p", { className: "text-base truncate", children: headerName || "" }), shouldShowMemberCount && (_jsx("p", { className: "text-xs text-gray-500 truncate", children: t("member_count", { count: memberCount }) }))] }), _jsxs("div", { className: "flex items-center gap-2 justify-end overflow-hidden", children: [isCx && !isRealGroup && (_jsx(SelectSession, { placeholder: t("select_tag"), options: tagOptions, value: currentSessionTag, onChange: (value) => handleUpdateSession(value, "tag", value === currentSessionTag), excludeOptions: [SessionTag.SLOW_PROCESSING, SessionTag.NONE] })), isCx && !isRealGroup && (_jsx(SelectSession, { placeholder: t("select_status"), options: statusOptions, value: currentSessionStatus, onChange: (value) => handleUpdateSession(value, "status", value === currentSessionStatus) })), _jsx(SearchDrawer, {}), canViewMemberList && (_jsx(GroupMembersDrawer, { groupID: conversationData === null || conversationData === void 0 ? void 0 : conversationData.groupID, conversationId: conversationData === null || conversationData === void 0 ? void 0 : conversationData.conversationID, currentSession: currentSession })), _jsx(MediaCollection, {}), _jsx(Button, { type: "text", shape: "default", className: "text-[var(--dc-color-header-icon)] w-8 h-8 p-0", onClick: onOpenThreadInfo, children: _jsx(Icon, { icon: "align-justify-o", size: 22 }) }), !!onClose && (_jsx(Button, { type: "text", shape: "default", className: "text-[var(--dc-color-header-icon)] w-8 h-8 p-0", onClick: onClose, children: _jsx(Icon, { icon: "close-b", size: 22 }) }))] })] }));
205
+ return (_jsxs("div", { className: `px-4 py-3 flex items-center border-b gap-3 bg-white ${isCrm
206
+ ? "flex-nowrap border-gray-25 [container-type:inline-size]"
207
+ : "flex-wrap"}`, "data-cp-name": "MessageHeader", children: [showOwnerPlaceholder ? (_jsx("span", { "aria-hidden": true, className: "h-10 w-10 shrink-0 animate-pulse rounded-full bg-gray-25" })) : ownerIdentity ? (isCrm ? (_jsx(TintedAvatar, { name: headerShortName, src: ownerIdentity.avatarUrl, size: 40 })) : (_jsx(Avatar, { src: ownerIdentity.avatarUrl, size: "large", alt: "", className: "min-w-10 min-h-10", children: ((_c = headerName === null || headerName === void 0 ? void 0 : headerName.charAt) === null || _c === void 0 ? void 0 : _c.call(headerName, 0)) || "A" }))) : shouldShowMemberCount ? (_jsx(GroupCompositeAvatar, { groupID: conversationData === null || conversationData === void 0 ? void 0 : conversationData.groupID, faceURL: avatar, ownerUserID: currentGroupInfo === null || currentGroupInfo === void 0 ? void 0 : currentGroupInfo.ownerUserID, groupName: displayName, size: 40, className: "min-w-10 min-h-10" })) : isCrm ? (_jsx(TintedAvatar, { name: headerShortName, src: avatar, size: 40 })) : (_jsx(Avatar, { src: avatar, size: "large", alt: "", className: "min-w-10 min-h-10", children: ((_d = displayName === null || displayName === void 0 ? void 0 : displayName.charAt) === null || _d === void 0 ? void 0 : _d.call(displayName, 0)) || "A" })), _jsxs("div", { className: `flex flex-col overflow-hidden flex-1 ${isCrm ? "min-w-[96px]" : ""}`, children: [showOwnerPlaceholder ? (_jsxs("span", { "aria-hidden": true, className: "flex flex-col gap-1.5 py-0.5", children: [_jsx("span", { className: "h-4 w-36 animate-pulse rounded bg-gray-25" }), _jsx("span", { className: "h-3 w-24 animate-pulse rounded bg-gray-25" })] })) : (_jsx("p", { className: `text-base truncate ${isCrm ? "m-0 font-semibold leading-[normal] text-gray-900" : ""}`, title: headerName || undefined, children: (isCrm ? headerShortName : headerName) || "" })), showMemberCountLine && (_jsx("p", { className: "text-xs text-gray-500 truncate", children: t("member_count", { count: memberCount }) })), isCrm && !showOwnerPlaceholder && metaParts.length > 0 && (_jsx("p", { className: "m-0 flex min-w-0 items-center gap-1 overflow-hidden whitespace-nowrap text-xs text-gray-600 [container-type:inline-size]", "data-testid": "header-meta-line", children: metaParts.map((part, index) => (_jsxs(Fragment, { children: [index > 0 && (_jsx("span", { "aria-hidden": true, className: "h-[3px] w-[3px] shrink-0 rounded-full bg-gray-200" })), part] }, index))) }))] }), _jsxs("div", { className: `flex items-center justify-end ${isCrm
208
+ ? "shrink-0 gap-3 [@container(max-width:699px)]:gap-2"
209
+ : "gap-2 overflow-hidden"}`, children: [_jsxs("div", { className: isCrm ? "flex items-center gap-2" : "contents", children: [isCx && !isRealGroup && (_jsx(SelectSession, { placeholder: t(isCrm ? "reply_status_placeholder" : "select_tag"), options: tagOptions, value: currentSessionTag, onChange: (value) => handleUpdateSession(value, "tag", value === currentSessionTag), excludeOptions: [SessionTag.SLOW_PROCESSING, SessionTag.NONE] })), isCx && !isRealGroup && (_jsx(SelectSession, { placeholder: t("select_status"), options: statusOptions, value: isEnding ? SessionStatus.COMPLETED : currentSessionStatus, disabled: isEnding, onChange: (value) => handleUpdateSession(value, "status", value === currentSessionStatus) }))] }), _jsxs("div", { className: isCrm
210
+ ? "flex items-center gap-1 [@container(max-width:699px)]:gap-0.5"
211
+ : "contents", children: [_jsx(SearchDrawer, {}), canViewMemberList && (_jsx(GroupMembersDrawer, { groupID: conversationData === null || conversationData === void 0 ? void 0 : conversationData.groupID, conversationId: conversationData === null || conversationData === void 0 ? void 0 : conversationData.conversationID, currentSession: currentSession })), _jsx(MediaCollection, {}), _jsx(Button, { type: "text", shape: "default", className: headerIconButtonClass(isCrm, isInfoPanelOpen), onClick: handleInfoToggle, "aria-label": t("thread_info_open"), title: t("thread_info_open"), children: _jsx(HeaderIcon, { isCrm: isCrm, stroke: "panel-right", font: "align-justify-o" }) }), !!onClose && (_jsx(Button, { type: "text", shape: "default", className: "text-[var(--dc-color-header-icon)] w-8 h-8 p-0", onClick: onClose, "aria-label": t("close"), children: _jsx(Icon, { icon: "close-b", size: 22 }) }))] })] }), isCrm && currentSession && (_jsx(EndSessionConfirm, { open: isEndConfirmOpen, session: currentSession, customerName: headerName || "", onConfirm: () => {
212
+ setIsEndConfirmOpen(false);
213
+ endSession({
214
+ sessionId: currentSession.id,
215
+ conversationId: currentSession.conversationId,
216
+ });
217
+ }, onCancel: () => setIsEndConfirmOpen(false) }))] }));
169
218
  };
170
219
  export default MessageHeader;
@@ -1,4 +1,4 @@
1
- import { ReactNode, Ref } from "react";
1
+ import { HTMLAttributes, ReactNode, Ref } from "react";
2
2
  import type { MessageListLoadState } from "../../hooks/message/useMessageListScroll";
3
3
  export interface MessageInfiniteScrollProps {
4
4
  scrollRef: Ref<HTMLDivElement>;
@@ -10,7 +10,9 @@ export interface MessageInfiniteScrollProps {
10
10
  children: ReactNode;
11
11
  empty?: ReactNode;
12
12
  containerClassName?: string;
13
+ /** Extra attributes for the scroll container (CRM keyboard access). */
14
+ containerProps?: HTMLAttributes<HTMLDivElement>;
13
15
  }
14
- declare const MessageInfiniteScroll: ({ scrollRef, scrollableTargetId, loadState, moreOldLoading, onLoadMoreOld, onScroll, children, empty, containerClassName, }: MessageInfiniteScrollProps) => import("react/jsx-runtime").JSX.Element;
16
+ declare const MessageInfiniteScroll: ({ scrollRef, scrollableTargetId, loadState, moreOldLoading, onLoadMoreOld, onScroll, children, empty, containerClassName, containerProps, }: MessageInfiniteScrollProps) => import("react/jsx-runtime").JSX.Element;
15
17
  export default MessageInfiniteScroll;
16
18
  //# sourceMappingURL=MessageInfiniteScroll.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageInfiniteScroll.d.ts","sourceRoot":"","sources":["../../../src/components/message/MessageInfiniteScroll.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAIvC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAEjF,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,oBAAoB,CAAC;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACrD,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,QAAA,MAAM,qBAAqB,GAAI,6HAU5B,0BAA0B,4CAqC5B,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"MessageInfiniteScroll.d.ts","sourceRoot":"","sources":["../../../src/components/message/MessageInfiniteScroll.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAIvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAEjF,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,oBAAoB,CAAC;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACrD,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,cAAc,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;CACjD;AAED,QAAA,MAAM,qBAAqB,GAAI,6IAW5B,0BAA0B,4CAsC5B,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -3,5 +3,5 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { Spin } from "antd";
4
4
  import clsx from "clsx";
5
5
  import InfiniteScroll from "react-infinite-scroll-component";
6
- const MessageInfiniteScroll = ({ scrollRef, scrollableTargetId, loadState, moreOldLoading = false, onLoadMoreOld, onScroll, children, empty, containerClassName, }) => (_jsx("div", { id: scrollableTargetId, ref: scrollRef, className: clsx("flex h-full flex-col-reverse overflow-x-hidden overflow-y-auto pb-3", containerClassName), "data-cp-name": "MessageInfiniteScroll", children: empty && loadState.messageList.length === 0 ? (empty) : (_jsx(InfiniteScroll, { dataLength: loadState.messageList.length, next: onLoadMoreOld, className: "flex w-full min-w-0 flex-col-reverse", inverse: true, hasMore: loadState.hasMoreOld, loader: moreOldLoading ? (_jsx("div", { className: "flex w-full items-center justify-center py-2", children: _jsx(Spin, { size: "small" }) })) : (_jsx("span", { className: "sr-only" })), scrollableTarget: scrollableTargetId, onScroll: (e) => onScroll(e), children: children })) }));
6
+ const MessageInfiniteScroll = ({ scrollRef, scrollableTargetId, loadState, moreOldLoading = false, onLoadMoreOld, onScroll, children, empty, containerClassName, containerProps, }) => (_jsx("div", Object.assign({ id: scrollableTargetId, ref: scrollRef, className: clsx("flex h-full flex-col-reverse overflow-x-hidden overflow-y-auto pb-3", containerClassName), "data-cp-name": "MessageInfiniteScroll" }, containerProps, { children: empty && loadState.messageList.length === 0 ? (empty) : (_jsx(InfiniteScroll, { dataLength: loadState.messageList.length, next: onLoadMoreOld, className: "flex w-full min-w-0 flex-col-reverse", inverse: true, hasMore: loadState.hasMoreOld, loader: moreOldLoading ? (_jsx("div", { className: "flex w-full items-center justify-center py-2", children: _jsx(Spin, { size: "small" }) })) : (_jsx("span", { className: "sr-only" })), scrollableTarget: scrollableTargetId, onScroll: (e) => onScroll(e), children: children })) })));
7
7
  export default MessageInfiniteScroll;