@droppii-org/chat-sdk 0.6.55 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) 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/QuoteMessage.d.ts.map +1 -1
  215. package/dist/components/message/item/QuoteMessage.js +23 -2
  216. package/dist/components/message/item/RevokeMessage.js +1 -1
  217. package/dist/components/message/item/SessionEventMessage.d.ts.map +1 -1
  218. package/dist/components/message/item/SessionEventMessage.js +13 -1
  219. package/dist/components/message/item/SystemLogMessage.d.ts.map +1 -1
  220. package/dist/components/message/item/SystemLogMessage.js +7 -0
  221. package/dist/components/message/item/index.d.ts.map +1 -1
  222. package/dist/components/message/item/index.js +80 -18
  223. package/dist/components/message/item/otherSenders.d.ts +7 -0
  224. package/dist/components/message/item/otherSenders.d.ts.map +1 -0
  225. package/dist/components/message/item/otherSenders.js +29 -0
  226. package/dist/components/message/item/textStyle.d.ts +1 -1
  227. package/dist/components/message/item/textStyle.d.ts.map +1 -1
  228. package/dist/components/message/item/textStyle.js +2 -2
  229. package/dist/components/message/messageKeyboardNav.d.ts +8 -0
  230. package/dist/components/message/messageKeyboardNav.d.ts.map +1 -0
  231. package/dist/components/message/messageKeyboardNav.js +24 -0
  232. package/dist/components/message/reply/ReplyPreviewBar.d.ts.map +1 -1
  233. package/dist/components/message/reply/ReplyPreviewBar.js +11 -4
  234. package/dist/components/message/toolbox/MessageToolboxMenu.d.ts.map +1 -1
  235. package/dist/components/message/toolbox/MessageToolboxMenu.js +16 -1
  236. package/dist/components/search-conversation/SearchAll.d.ts.map +1 -1
  237. package/dist/components/search-conversation/SearchAll.js +12 -1
  238. package/dist/components/search-conversation/SearchDrawer.d.ts.map +1 -1
  239. package/dist/components/search-conversation/SearchDrawer.js +31 -15
  240. package/dist/components/search-conversation/SearchMessageOnCurrentConversation.d.ts.map +1 -1
  241. package/dist/components/search-conversation/SearchMessageOnCurrentConversation.js +5 -2
  242. package/dist/components/search-conversation/index.d.ts.map +1 -1
  243. package/dist/components/search-conversation/index.js +3 -1
  244. package/dist/components/search-conversation/item/SearchItemAsGroup.d.ts.map +1 -1
  245. package/dist/components/search-conversation/item/SearchItemAsGroup.js +14 -4
  246. package/dist/components/search-conversation/item/SearchItemAsMessage.d.ts.map +1 -1
  247. package/dist/components/search-conversation/item/SearchItemAsMessage.js +18 -7
  248. package/dist/components/search-conversation/item/SearchItemAsUser.d.ts.map +1 -1
  249. package/dist/components/search-conversation/item/SearchItemAsUser.js +23 -5
  250. package/dist/components/search-conversation/item/searchRowClass.d.ts +3 -0
  251. package/dist/components/search-conversation/item/searchRowClass.d.ts.map +1 -0
  252. package/dist/components/search-conversation/item/searchRowClass.js +5 -0
  253. package/dist/components/session/DeskAssignedSession.d.ts +5 -1
  254. package/dist/components/session/DeskAssignedSession.d.ts.map +1 -1
  255. package/dist/components/session/DeskAssignedSession.js +40 -12
  256. package/dist/components/session/DeskTeamInbox.d.ts.map +1 -1
  257. package/dist/components/session/DeskTeamInbox.js +15 -22
  258. package/dist/components/session/FolderRow.d.ts +21 -0
  259. package/dist/components/session/FolderRow.d.ts.map +1 -0
  260. package/dist/components/session/FolderRow.js +16 -0
  261. package/dist/components/session/SessionFolderList.d.ts +23 -0
  262. package/dist/components/session/SessionFolderList.d.ts.map +1 -0
  263. package/dist/components/session/SessionFolderList.js +27 -0
  264. package/dist/components/session/sessionFilters.d.ts +24 -0
  265. package/dist/components/session/sessionFilters.d.ts.map +1 -0
  266. package/dist/components/session/sessionFilters.js +80 -0
  267. package/dist/components/shortcut-help/ShortcutHelpModal.d.ts +8 -0
  268. package/dist/components/shortcut-help/ShortcutHelpModal.d.ts.map +1 -0
  269. package/dist/components/shortcut-help/ShortcutHelpModal.js +23 -0
  270. package/dist/components/thread/AssignConfirmModal.d.ts.map +1 -1
  271. package/dist/components/thread/AssignConfirmModal.js +4 -3
  272. package/dist/components/thread/EndSessionConfirm.d.ts +11 -0
  273. package/dist/components/thread/EndSessionConfirm.d.ts.map +1 -0
  274. package/dist/components/thread/EndSessionConfirm.js +31 -0
  275. package/dist/components/thread/EndSessionToast.d.ts +6 -0
  276. package/dist/components/thread/EndSessionToast.d.ts.map +1 -0
  277. package/dist/components/thread/EndSessionToast.js +18 -0
  278. package/dist/components/thread/GroupInfoBodyCrm.d.ts +46 -0
  279. package/dist/components/thread/GroupInfoBodyCrm.d.ts.map +1 -0
  280. package/dist/components/thread/GroupInfoBodyCrm.js +41 -0
  281. package/dist/components/thread/GroupInfoRows.d.ts +33 -0
  282. package/dist/components/thread/GroupInfoRows.d.ts.map +1 -0
  283. package/dist/components/thread/GroupInfoRows.js +18 -0
  284. package/dist/components/thread/GroupThreadInfo.d.ts.map +1 -1
  285. package/dist/components/thread/GroupThreadInfo.js +23 -6
  286. package/dist/components/thread/ManualAssignPopover.d.ts +3 -1
  287. package/dist/components/thread/ManualAssignPopover.d.ts.map +1 -1
  288. package/dist/components/thread/ManualAssignPopover.js +21 -9
  289. package/dist/components/thread/SessionDetailCard.d.ts +6 -0
  290. package/dist/components/thread/SessionDetailCard.d.ts.map +1 -0
  291. package/dist/components/thread/SessionDetailCard.js +103 -0
  292. package/dist/components/thread/SessionSection.d.ts +2 -4
  293. package/dist/components/thread/SessionSection.d.ts.map +1 -1
  294. package/dist/components/thread/SessionSection.js +19 -122
  295. package/dist/components/thread/SessionTagPicker.d.ts +11 -0
  296. package/dist/components/thread/SessionTagPicker.d.ts.map +1 -0
  297. package/dist/components/thread/SessionTagPicker.js +27 -0
  298. package/dist/components/thread/SingleThreadInfo.d.ts.map +1 -1
  299. package/dist/components/thread/SingleThreadInfo.js +16 -6
  300. package/dist/components/thread/SupportSessionPanel.d.ts +18 -0
  301. package/dist/components/thread/SupportSessionPanel.d.ts.map +1 -0
  302. package/dist/components/thread/SupportSessionPanel.js +46 -0
  303. package/dist/components/thread/ThreadInfo.d.ts +8 -1
  304. package/dist/components/thread/ThreadInfo.d.ts.map +1 -1
  305. package/dist/components/thread/ThreadInfo.js +27 -29
  306. package/dist/components/thread/ThreadInfoHeader.d.ts +13 -0
  307. package/dist/components/thread/ThreadInfoHeader.d.ts.map +1 -0
  308. package/dist/components/thread/ThreadInfoHeader.js +11 -0
  309. package/dist/components/thread/UserSection.d.ts.map +1 -1
  310. package/dist/components/thread/UserSection.js +35 -22
  311. package/dist/components/thread/sessionDateFormat.d.ts +3 -0
  312. package/dist/components/thread/sessionDateFormat.d.ts.map +1 -0
  313. package/dist/components/thread/sessionDateFormat.js +13 -0
  314. package/dist/components/thread/sessionDuration.d.ts +5 -0
  315. package/dist/components/thread/sessionDuration.d.ts.map +1 -0
  316. package/dist/components/thread/sessionDuration.js +24 -0
  317. package/dist/constants/index.d.ts +1 -0
  318. package/dist/constants/index.d.ts.map +1 -1
  319. package/dist/constants/index.js +2 -0
  320. package/dist/constants/layout.d.ts +24 -0
  321. package/dist/constants/layout.d.ts.map +1 -0
  322. package/dist/constants/layout.js +23 -0
  323. package/dist/context/ChatContext.d.ts.map +1 -1
  324. package/dist/context/ChatContext.js +27 -1
  325. package/dist/hooks/canned-response/useSearchCannedAcrossScopes.d.ts +7 -0
  326. package/dist/hooks/canned-response/useSearchCannedAcrossScopes.d.ts.map +1 -0
  327. package/dist/hooks/canned-response/useSearchCannedAcrossScopes.js +46 -0
  328. package/dist/hooks/common/useCloseOnSidePanelOpen.d.ts +3 -0
  329. package/dist/hooks/common/useCloseOnSidePanelOpen.d.ts.map +1 -0
  330. package/dist/hooks/common/useCloseOnSidePanelOpen.js +15 -0
  331. package/dist/hooks/common/useDeskShortcuts.d.ts +11 -0
  332. package/dist/hooks/common/useDeskShortcuts.d.ts.map +1 -0
  333. package/dist/hooks/common/useDeskShortcuts.js +94 -0
  334. package/dist/hooks/common/useEscapeLayer.d.ts +3 -0
  335. package/dist/hooks/common/useEscapeLayer.d.ts.map +1 -0
  336. package/dist/hooks/common/useEscapeLayer.js +18 -0
  337. package/dist/hooks/common/useMediaQuery.d.ts +3 -0
  338. package/dist/hooks/common/useMediaQuery.d.ts.map +1 -0
  339. package/dist/hooks/common/useMediaQuery.js +12 -0
  340. package/dist/hooks/common/useSidePanel.d.ts +12 -0
  341. package/dist/hooks/common/useSidePanel.d.ts.map +1 -0
  342. package/dist/hooks/common/useSidePanel.js +32 -0
  343. package/dist/hooks/group/useConversationGroups.d.ts.map +1 -1
  344. package/dist/hooks/group/useConversationGroups.js +3 -0
  345. package/dist/hooks/message/useNewMessageAnnouncement.d.ts +3 -0
  346. package/dist/hooks/message/useNewMessageAnnouncement.d.ts.map +1 -0
  347. package/dist/hooks/message/useNewMessageAnnouncement.js +30 -0
  348. package/dist/hooks/search/useSearchGroups.js +2 -1
  349. package/dist/hooks/search/useSearchMessage.d.ts +3 -1
  350. package/dist/hooks/search/useSearchMessage.d.ts.map +1 -1
  351. package/dist/hooks/search/useSearchMessage.js +2 -2
  352. package/dist/hooks/session/useBotSessionOwnerIdentity.d.ts +12 -0
  353. package/dist/hooks/session/useBotSessionOwnerIdentity.d.ts.map +1 -0
  354. package/dist/hooks/session/useBotSessionOwnerIdentity.js +22 -0
  355. package/dist/hooks/session/useCloseSession.d.ts +1 -0
  356. package/dist/hooks/session/useCloseSession.d.ts.map +1 -1
  357. package/dist/hooks/session/useCloseSession.js +9 -8
  358. package/dist/hooks/session/useEndSession.d.ts +11 -0
  359. package/dist/hooks/session/useEndSession.d.ts.map +1 -0
  360. package/dist/hooks/session/useEndSession.js +45 -0
  361. package/dist/hooks/session/useGetSession.d.ts.map +1 -1
  362. package/dist/hooks/session/useGetSession.js +27 -6
  363. package/dist/hooks/session/usePendingSessionClose.d.ts +5 -0
  364. package/dist/hooks/session/usePendingSessionClose.d.ts.map +1 -0
  365. package/dist/hooks/session/usePendingSessionClose.js +12 -0
  366. package/dist/hooks/session/useSessionCustomerName.d.ts +3 -0
  367. package/dist/hooks/session/useSessionCustomerName.d.ts.map +1 -0
  368. package/dist/hooks/session/useSessionCustomerName.js +19 -0
  369. package/dist/hooks/session/useSessionFieldAutosave.d.ts +19 -0
  370. package/dist/hooks/session/useSessionFieldAutosave.d.ts.map +1 -0
  371. package/dist/hooks/session/useSessionFieldAutosave.js +52 -0
  372. package/dist/hooks/user/useUserUsername.d.ts +3 -0
  373. package/dist/hooks/user/useUserUsername.d.ts.map +1 -0
  374. package/dist/hooks/user/useUserUsername.js +49 -0
  375. package/dist/index.d.ts +8 -2
  376. package/dist/index.d.ts.map +1 -1
  377. package/dist/index.js +5 -1
  378. package/dist/locales/vi/common.json +201 -21
  379. package/dist/locales/vi/conversation-inbox.json +21 -2
  380. package/dist/screens/desk-message/DeskWorkspace.d.ts +12 -0
  381. package/dist/screens/desk-message/DeskWorkspace.d.ts.map +1 -0
  382. package/dist/screens/desk-message/DeskWorkspace.js +57 -0
  383. package/dist/screens/desk-message/FolderOverlay.d.ts +4 -0
  384. package/dist/screens/desk-message/FolderOverlay.d.ts.map +1 -0
  385. package/dist/screens/desk-message/FolderOverlay.js +32 -0
  386. package/dist/screens/desk-message/SkipLinks.d.ts +4 -0
  387. package/dist/screens/desk-message/SkipLinks.d.ts.map +1 -0
  388. package/dist/screens/desk-message/SkipLinks.js +19 -0
  389. package/dist/screens/desk-message/ViewportNotice.d.ts +4 -0
  390. package/dist/screens/desk-message/ViewportNotice.d.ts.map +1 -0
  391. package/dist/screens/desk-message/ViewportNotice.js +9 -0
  392. package/dist/screens/desk-message/index.d.ts +3 -2
  393. package/dist/screens/desk-message/index.d.ts.map +1 -1
  394. package/dist/screens/desk-message/index.js +4 -12
  395. package/dist/store/deskPanelHost.d.ts +13 -0
  396. package/dist/store/deskPanelHost.d.ts.map +1 -0
  397. package/dist/store/deskPanelHost.js +9 -0
  398. package/dist/store/escapeLayers.d.ts +15 -0
  399. package/dist/store/escapeLayers.d.ts.map +1 -0
  400. package/dist/store/escapeLayers.js +15 -0
  401. package/dist/store/pendingSessionClose.d.ts +19 -0
  402. package/dist/store/pendingSessionClose.d.ts.map +1 -0
  403. package/dist/store/pendingSessionClose.js +74 -0
  404. package/dist/store/session.d.ts +2 -1
  405. package/dist/store/session.d.ts.map +1 -1
  406. package/dist/store/session.js +4 -1
  407. package/dist/store/sessionFolder.d.ts +15 -0
  408. package/dist/store/sessionFolder.d.ts.map +1 -0
  409. package/dist/store/sessionFolder.js +18 -0
  410. package/dist/store/shortcutPrefs.d.ts +9 -0
  411. package/dist/store/shortcutPrefs.d.ts.map +1 -0
  412. package/dist/store/shortcutPrefs.js +23 -0
  413. package/dist/store/sidePanel.d.ts +12 -0
  414. package/dist/store/sidePanel.d.ts.map +1 -0
  415. package/dist/store/sidePanel.js +9 -0
  416. package/dist/store/workspaceLayout.d.ts +12 -0
  417. package/dist/store/workspaceLayout.d.ts.map +1 -0
  418. package/dist/store/workspaceLayout.js +9 -0
  419. package/dist/styles/global.css +1 -1
  420. package/dist/types/chat.d.ts +18 -0
  421. package/dist/types/chat.d.ts.map +1 -1
  422. package/dist/types/dto.d.ts +2 -1
  423. package/dist/types/dto.d.ts.map +1 -1
  424. package/dist/utils/a11yClickable.d.ts +10 -0
  425. package/dist/utils/a11yClickable.d.ts.map +1 -0
  426. package/dist/utils/a11yClickable.js +15 -0
  427. package/dist/utils/events.d.ts +4 -0
  428. package/dist/utils/events.d.ts.map +1 -1
  429. package/dist/utils/headerMemberCount.d.ts +10 -0
  430. package/dist/utils/headerMemberCount.d.ts.map +1 -0
  431. package/dist/utils/headerMemberCount.js +3 -0
  432. package/dist/utils/memberEventRun.d.ts +16 -0
  433. package/dist/utils/memberEventRun.d.ts.map +1 -0
  434. package/dist/utils/memberEventRun.js +40 -0
  435. package/package.json +1 -1
  436. package/dist/components/session/SessionFilterMenu.d.ts +0 -15
  437. package/dist/components/session/SessionFilterMenu.d.ts.map +0 -1
  438. package/dist/components/session/SessionFilterMenu.js +0 -30
  439. package/dist/components/session/sessionMenuItems.d.ts +0 -28
  440. package/dist/components/session/sessionMenuItems.d.ts.map +0 -1
  441. package/dist/components/session/sessionMenuItems.js +0 -119
@@ -0,0 +1,27 @@
1
+ // The five tints of the approved mockups; text shades keep at least 4.5:1 contrast.
2
+ export const AVATAR_TINTS = [
3
+ "bg-secondary-25 text-secondary-600",
4
+ "bg-primary-25 text-primary-500",
5
+ "bg-success-25 text-success-900",
6
+ "bg-warning-25 text-warning-800",
7
+ "bg-[var(--dc-color-neutral-surface)] text-gray-900",
8
+ ];
9
+ const hashString = (value) => {
10
+ let hash = 5381;
11
+ for (let i = 0; i < value.length; i += 1) {
12
+ hash = ((hash << 5) + hash + value.charCodeAt(i)) >>> 0;
13
+ }
14
+ return hash;
15
+ };
16
+ /** Same name always gets the same tint, so a customer keeps their colour across lists. */
17
+ export const getAvatarTint = (name) => AVATAR_TINTS[hashString(name.trim().toLowerCase()) % AVATAR_TINTS.length];
18
+ /** Initials from the last two words that start with a letter ("Lê Quốc Bảo" -> "QB"). */
19
+ export const getInitials = (name) => {
20
+ const words = name
21
+ .split(/\s+/)
22
+ .map((word) => { var _a; return (_a = Array.from(word)[0]) !== null && _a !== void 0 ? _a : ""; })
23
+ .filter((char) => /\p{L}/u.test(char));
24
+ if (words.length === 0)
25
+ return "?";
26
+ return words.slice(-2).join("").toUpperCase();
27
+ };
@@ -0,0 +1,2 @@
1
+ export declare const getFolderEmptyKey: (filterKey: string) => string;
2
+ //# sourceMappingURL=folderEmptyState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folderEmptyState.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/folderEmptyState.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,iBAAiB,GAAI,WAAW,MAAM,KAAG,MACI,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { SessionStatus, SessionTag } from "../../types/chat";
2
+ import { ALL_GROUPS_KEY } from "../../components/session/sessionFilters";
3
+ /** i18n key of the empty-list sentence for each folder; never reuses the search screen's wording. */
4
+ const EMPTY_KEY_BY_FILTER = {
5
+ [SessionTag.SLOW_PROCESSING]: "folder_empty_slow_processing",
6
+ [SessionStatus.WAITING_PROCESS]: "folder_empty_waiting_process",
7
+ [SessionTag.AWAITING_REPLY]: "folder_empty_awaiting_reply",
8
+ [SessionStatus.IN_PROCESS]: "folder_empty_in_process",
9
+ [SessionTag.TEMPORARILY_PAUSED]: "folder_empty_temporarily_paused",
10
+ [SessionStatus.COMPLETED]: "folder_empty_completed",
11
+ [SessionStatus.UNASSIGNED]: "folder_empty_unassigned",
12
+ [ALL_GROUPS_KEY]: "folder_empty_all_groups",
13
+ };
14
+ export const getFolderEmptyKey = (filterKey) => { var _a; return (_a = EMPTY_KEY_BY_FILTER[filterKey]) !== null && _a !== void 0 ? _a : "folder_empty_default"; };
@@ -0,0 +1,6 @@
1
+ import type { TFunction } from "i18next";
2
+ import { parseLatestMessage } from "../../utils/common";
3
+ type PreviewConversation = Parameters<typeof parseLatestMessage>[3];
4
+ export declare const buildSessionPreview: (latestMsg: string, userId: string | undefined, t: TFunction, conversation: PreviewConversation) => string;
5
+ export {};
6
+ //# sourceMappingURL=internalNotePreview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internalNotePreview.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/internalNotePreview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAA2B,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAE7E,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;AAGpE,eAAO,MAAM,mBAAmB,GAC9B,WAAW,MAAM,EACjB,QAAQ,MAAM,GAAG,SAAS,EAC1B,GAAG,SAAS,EACZ,cAAc,mBAAmB,KAChC,MAQF,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { isInternalLatestMessage, parseLatestMessage } from "../../utils/common";
2
+ // Desk list only: an internal note reads "Tin nhắn nội bộ: …" instead of a sender name.
3
+ export const buildSessionPreview = (latestMsg, userId, t, conversation) => {
4
+ if (!isInternalLatestMessage(latestMsg)) {
5
+ return parseLatestMessage(latestMsg, userId, t, conversation);
6
+ }
7
+ const text = parseLatestMessage(latestMsg, userId, t, conversation, {
8
+ includeSenderPrefix: false,
9
+ });
10
+ return text ? `${t("internal_preview_prefix")}: ${text}` : "";
11
+ };
@@ -0,0 +1,19 @@
1
+ import type { ActiveFolder } from "../../store/sessionFolder";
2
+ import type { ISessionSummaryResponse, ITeamSessionSummaryItem } from "../../types/dto";
3
+ export interface ListHeading {
4
+ /** Small line above the title: "my messages" or the team name. */
5
+ contextKey?: string;
6
+ contextText?: string;
7
+ titleKey: string;
8
+ /** Count from the summary; hidden when 0 or unknown. */
9
+ count?: number;
10
+ }
11
+ interface HeadingInput {
12
+ folder: ActiveFolder;
13
+ mySummary?: ISessionSummaryResponse;
14
+ teams?: ITeamSessionSummaryItem[];
15
+ }
16
+ /** Heading text that always describes the folder the list is built from. */
17
+ export declare const getListHeading: ({ folder, mySummary, teams }: HeadingInput) => ListHeading;
18
+ export {};
19
+ //# sourceMappingURL=listHeading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listHeading.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/listHeading.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAMpF,MAAM,WAAW,WAAW;IAC1B,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,YAAY;IACpB,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC,KAAK,CAAC,EAAE,uBAAuB,EAAE,CAAC;CACnC;AAED,4EAA4E;AAC5E,eAAO,MAAM,cAAc,GAAI,8BAA8B,YAAY,KAAG,WAoB3E,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { getFilterConfig, getFilterCount, } from "../../components/session/sessionFilters";
2
+ /** Heading text that always describes the folder the list is built from. */
3
+ export const getListHeading = ({ folder, mySummary, teams }) => {
4
+ var _a;
5
+ if (folder.scope === "allGroups") {
6
+ return { contextKey: "my_messages", titleKey: "all_groups" };
7
+ }
8
+ const config = getFilterConfig(folder.filterKey);
9
+ const titleKey = (_a = config === null || config === void 0 ? void 0 : config.labelKey) !== null && _a !== void 0 ? _a : "active_sessions";
10
+ if (folder.scope === "team") {
11
+ const team = teams === null || teams === void 0 ? void 0 : teams.find((item) => item.teamId === folder.teamId);
12
+ return {
13
+ contextText: team === null || team === void 0 ? void 0 : team.teamName,
14
+ contextKey: team ? undefined : "team_messages",
15
+ titleKey,
16
+ count: config ? getFilterCount(config, team === null || team === void 0 ? void 0 : team.summary) : undefined,
17
+ };
18
+ }
19
+ return {
20
+ contextKey: "my_messages",
21
+ titleKey,
22
+ count: config ? getFilterCount(config, mySummary) : undefined,
23
+ };
24
+ };
@@ -0,0 +1,7 @@
1
+ /** Splits "Full Name (username)" so the list can show the name and keep the username for a tooltip. */
2
+ export declare const splitDisplayName: (displayName: string) => {
3
+ name: string;
4
+ username?: string;
5
+ };
6
+ export declare const joinDisplayName: (name: string, username?: string) => string;
7
+ //# sourceMappingURL=rowDisplayName.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rowDisplayName.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/rowDisplayName.ts"],"names":[],"mappings":"AAAA,uGAAuG;AACvG,eAAO,MAAM,gBAAgB,GAC3B,aAAa,MAAM,KAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAInC,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,EAAE,WAAW,MAAM,KAAG,MACvB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /** Splits "Full Name (username)" so the list can show the name and keep the username for a tooltip. */
2
+ export const splitDisplayName = (displayName) => {
3
+ const match = displayName.match(/^(.*?)\s*\(([^()]+)\)\s*$/);
4
+ if (!match || !match[1].trim())
5
+ return { name: displayName.trim() };
6
+ return { name: match[1].trim(), username: match[2].trim() };
7
+ };
8
+ export const joinDisplayName = (name, username) => username ? `${name} (${username})` : name;
@@ -0,0 +1,4 @@
1
+ import dayjs from "dayjs";
2
+ /** List row time: "HH:mm" today, "Hôm qua" yesterday, otherwise "DD/MM" (with the year when it differs). */
3
+ export declare const formatListRowTime: (timestamp: number, t: (key: string) => string, now?: dayjs.Dayjs) => string;
4
+ //# sourceMappingURL=rowTime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rowTime.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/rowTime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,4GAA4G;AAC5G,eAAO,MAAM,iBAAiB,GAC5B,WAAW,MAAM,EACjB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EAC1B,MAAK,KAAK,CAAC,KAAe,KACzB,MAKF,CAAC"}
@@ -0,0 +1,10 @@
1
+ import dayjs from "dayjs";
2
+ /** List row time: "HH:mm" today, "Hôm qua" yesterday, otherwise "DD/MM" (with the year when it differs). */
3
+ export const formatListRowTime = (timestamp, t, now = dayjs()) => {
4
+ const date = dayjs(timestamp);
5
+ if (date.isSame(now, "day"))
6
+ return date.format("HH:mm");
7
+ if (date.isSame(now.subtract(1, "day"), "day"))
8
+ return t("yesterday");
9
+ return date.format(date.isSame(now, "year") ? "DD/MM" : "DD/MM/YYYY");
10
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"PinLimitModal.d.ts","sourceRoot":"","sources":["../../../src/components/conversation-detail/PinLimitModal.tsx"],"names":[],"mappings":"AAGA,UAAU,kBAAkB;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,QAAA,MAAM,aAAa,GAAI,wBAAwB,kBAAkB,4CAmChE,CAAC;AAEF,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"PinLimitModal.d.ts","sourceRoot":"","sources":["../../../src/components/conversation-detail/PinLimitModal.tsx"],"names":[],"mappings":"AAIA,UAAU,kBAAkB;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,QAAA,MAAM,aAAa,GAAI,wBAAwB,kBAAkB,4CAqChE,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -1,8 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Modal, Button } from "antd";
3
3
  import { useTranslation } from "react-i18next";
4
+ import useAuthStore from "../../store/auth";
4
5
  const PinLimitModal = ({ open, max, onClose }) => {
5
6
  const { t } = useTranslation();
6
- return (_jsx(Modal, { open: open, onCancel: onClose, footer: null, centered: true, width: 400, "data-cp-name": "PinLimitModal", children: _jsxs("div", { className: "flex flex-col gap-2 pt-2", role: "alertdialog", "aria-label": t("pin_limit_modal_title"), children: [_jsx("p", { className: "text-lg font-semibold text-gray-900", children: t("pin_limit_modal_title") }), _jsx("p", { className: "text-base text-gray-600", children: t("pin_limit_modal_description", { max }) }), _jsx(Button, { type: "primary", size: "large", block: true, className: "mt-2 !border-[var(--dc-color-primary)] !bg-[var(--dc-color-primary)] !text-white hover:!border-[var(--dc-color-primary-hover)] hover:!bg-[var(--dc-color-primary-hover)]", onClick: onClose, children: t("pin_limit_modal_confirm") })] }) }));
7
+ const isCrm = useAuthStore((state) => state.isCrm);
8
+ return (_jsx(Modal, { open: open, onCancel: onClose, footer: null, centered: true, width: 400, destroyOnHidden: isCrm, "data-cp-name": "PinLimitModal", children: _jsxs("div", { className: "flex flex-col gap-2 pt-2", role: "alertdialog", "aria-label": t("pin_limit_modal_title"), children: [_jsx("p", { className: "text-lg font-semibold text-gray-900", children: t("pin_limit_modal_title") }), _jsx("p", { className: "text-base text-gray-600", children: t("pin_limit_modal_description", { max }) }), _jsx(Button, { type: "primary", size: "large", block: true, className: "mt-2 !border-[var(--dc-color-primary)] !bg-[var(--dc-color-primary)] !text-white hover:!border-[var(--dc-color-primary-hover)] hover:!bg-[var(--dc-color-primary-hover)]", onClick: onClose, children: t("pin_limit_modal_confirm") })] }) }));
7
9
  };
8
10
  export default PinLimitModal;
@@ -1 +1 @@
1
- {"version":3,"file":"AddMemberModal.d.ts","sourceRoot":"","sources":["../../../src/components/group/AddMemberModal.tsx"],"names":[],"mappings":"AAaA,UAAU,mBAAmB;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,QAAA,MAAM,cAAc,GAAI,6BAIrB,mBAAmB,4CA6LrB,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"AddMemberModal.d.ts","sourceRoot":"","sources":["../../../src/components/group/AddMemberModal.tsx"],"names":[],"mappings":"AAiBA,UAAU,mBAAmB;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,QAAA,MAAM,cAAc,GAAI,6BAIrB,mBAAmB,4CA8OrB,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { clickableProps, FOCUS_RING_CLASS } from "../../utils/a11yClickable";
3
4
  import { useDebounce } from "ahooks";
4
5
  import { Avatar, Button, Empty, Input, Modal, Spin, message } from "antd";
5
6
  import clsx from "clsx";
@@ -9,13 +10,18 @@ import { Icon } from "../../components/icon";
9
10
  import { useEligibleAccountsForGroup } from "../../hooks/group/useEligibleAccountsForGroup";
10
11
  import { useAddGroupMember } from "../../hooks/group/useAddGroupMember";
11
12
  import { formatMemberLabel } from "../../utils/common";
13
+ import useAuthStore from "../../store/auth";
14
+ import useConversationStore from "../../store/conversation";
15
+ import GroupMemberPicker from "./GroupMemberPicker";
12
16
  const AddMemberModal = ({ open, groupID, onClose, }) => {
13
17
  const { t } = useTranslation("conversation-inbox");
14
18
  const { t: tCommon } = useTranslation();
19
+ const isCrm = useAuthStore((state) => state.isCrm);
20
+ const groupName = useConversationStore((state) => { var _a; return (_a = state.currentGroupInfo.get(groupID)) === null || _a === void 0 ? void 0 : _a.groupName; });
15
21
  const [search, setSearch] = useState("");
16
22
  const [selectedMembers, setSelectedMembers] = useState([]);
17
23
  const debouncedSearch = useDebounce(search, { wait: 300 });
18
- const { accounts, isLoading, fetchNextPage, hasNextPage, isFetchingNextPage } = useEligibleAccountsForGroup(debouncedSearch, groupID, open);
24
+ const { accounts, isLoading, fetchNextPage, hasNextPage, isFetchingNextPage } = useEligibleAccountsForGroup(debouncedSearch, groupID, open && !isCrm);
19
25
  const { mutateAsync: addGroupMember, isPending: isSubmitting } = useAddGroupMember();
20
26
  const selectedIds = new Set(selectedMembers.map((member) => member.userID));
21
27
  const toggleMember = (account) => {
@@ -61,11 +67,16 @@ const AddMemberModal = ({ open, groupID, onClose, }) => {
61
67
  message.error(errorMessage);
62
68
  }
63
69
  };
64
- return (_jsx(Modal, { "data-cp-name": "AddMemberModal", centered: true, open: open, onCancel: handleClose, footer: null, title: t("add_member.title"), getContainer: false, forceRender: true, children: _jsxs("div", { className: "flex flex-col gap-3 pt-2", children: [_jsx(Input, { value: search, onChange: (event) => setSearch(event.target.value), placeholder: t("create_group.search_member_placeholder"), prefix: _jsx(Icon, { icon: "search-o", size: 16, className: "text-gray-400" }) }), _jsxs("div", { className: "flex items-center justify-between px-1", children: [_jsx("span", { className: "text-sm text-gray-500", children: t("create_group.selected_count", { count: selectedMembers.length }) }), selectedMembers.length > 0 && (_jsx("button", { type: "button", className: "text-sm text-[var(--dc-color-primary)] hover:text-[var(--dc-color-primary-hover)] hover:underline", onClick: handleClearAll, children: t("create_group.clear_all") }))] }), selectedMembers.length > 0 && (_jsx("div", { className: "flex flex-wrap gap-2", children: selectedMembers.map((member) => (_jsxs("span", { className: "flex items-center gap-1.5 rounded-full bg-gray-100 pl-1 pr-2 py-1", children: [_jsx(Avatar, { src: member.avatar, size: 20, className: "shrink-0", children: member.displayName.charAt(0) || "A" }), _jsx("span", { className: "max-w-[120px] truncate text-sm text-gray-900", children: formatMemberLabel(member.displayName, member.username) }), _jsx(Icon, { icon: "close-b", size: 12, className: "shrink-0 cursor-pointer text-gray-400", onClick: () => handleRemoveMember(member.userID) })] }, member.userID))) })), _jsx("div", { className: "max-h-72 overflow-y-auto", onScroll: handleListScroll, children: isLoading ? (_jsx("div", { className: "flex items-center justify-center py-6", children: _jsx(Spin, {}) })) : accounts.length === 0 ? (_jsx(Empty, { description: t("create_group.no_member_found") })) : (_jsxs(_Fragment, { children: [accounts.map((account) => {
70
+ if (isCrm) {
71
+ return (_jsx(Modal, { "data-cp-name": "AddMemberModal", centered: true, open: open, onCancel: handleClose, title: _jsxs("span", { className: "flex flex-col gap-0.5", children: [t("add_member.title_crm"), groupName && (_jsx("span", { className: "text-[13px] font-normal text-gray-600", children: groupName }))] }), width: 720, getContainer: false, destroyOnHidden: true, footer: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "flex-1 text-left text-[13px] text-gray-600", children: t("add_member.selected_footer", { count: selectedMembers.length }) }), _jsx(Button, { onClick: handleClose, children: t("create_group.cancel_crm") }), _jsx(Button, { type: "primary", disabled: selectedMembers.length === 0, loading: isSubmitting, onClick: handleSubmit, children: selectedMembers.length > 0
72
+ ? t("add_member.submit", { count: selectedMembers.length })
73
+ : t("add_member.submit_empty") })] }), children: _jsx(GroupMemberPicker, { groupID: groupID, selectedMembers: selectedMembers, onChangeSelectedMembers: setSelectedMembers }) }));
74
+ }
75
+ return (_jsx(Modal, { "data-cp-name": "AddMemberModal", centered: true, open: open, onCancel: handleClose, footer: null, title: t("add_member.title"), getContainer: false, destroyOnHidden: true, children: _jsxs("div", { className: "flex flex-col gap-3 pt-2", children: [_jsx(Input, { value: search, onChange: (event) => setSearch(event.target.value), placeholder: t("create_group.search_member_placeholder"), prefix: _jsx(Icon, { icon: "search-o", size: 16, className: "text-gray-400" }) }), _jsxs("div", { className: "flex items-center justify-between px-1", children: [_jsx("span", { className: "text-sm text-gray-500", children: t("create_group.selected_count", { count: selectedMembers.length }) }), selectedMembers.length > 0 && (_jsx("button", { type: "button", className: "text-sm text-[var(--dc-color-primary)] hover:text-[var(--dc-color-primary-hover)] hover:underline", onClick: handleClearAll, children: t("create_group.clear_all") }))] }), selectedMembers.length > 0 && (_jsx("div", { className: "flex flex-wrap gap-2", children: selectedMembers.map((member) => (_jsxs("span", { className: "flex items-center gap-1.5 rounded-full bg-gray-100 pl-1 pr-2 py-1", children: [_jsx(Avatar, { src: member.avatar, size: 20, className: "shrink-0", children: member.displayName.charAt(0) || "A" }), _jsx("span", { className: "max-w-[120px] truncate text-sm text-gray-900", children: formatMemberLabel(member.displayName, member.username) }), _jsx(Icon, { icon: "close-b", size: 12, className: "shrink-0 cursor-pointer text-gray-400", onClick: () => handleRemoveMember(member.userID) })] }, member.userID))) })), _jsx("div", { className: "max-h-72 overflow-y-auto", onScroll: handleListScroll, children: isLoading ? (_jsx("div", { className: "flex items-center justify-center py-6", children: _jsx(Spin, {}) })) : accounts.length === 0 ? (_jsx(Empty, { description: t("create_group.no_member_found") })) : (_jsxs(_Fragment, { children: [accounts.map((account) => {
65
76
  const isSelected = selectedIds.has(account.userID);
66
- return (_jsxs("div", { className: "flex cursor-pointer items-center gap-3 rounded-lg px-3 py-3 transition-colors duration-150 hover:bg-[#f5f5f5]", onClick: () => toggleMember(account), children: [_jsx(Avatar, { src: account.avatar, size: 40, className: "shrink-0", children: account.displayName.charAt(0) || "A" }), _jsx("span", { className: "flex-1 truncate text-base font-medium text-gray-900", children: formatMemberLabel(account.displayName, account.username) }), _jsx("span", { className: clsx("flex h-4 w-4 shrink-0 items-center justify-center rounded border", isSelected
77
+ return (_jsxs("div", Object.assign({ className: `flex cursor-pointer items-center gap-3 rounded-lg px-3 py-3 transition-colors duration-150 hover:bg-[#f5f5f5] ${FOCUS_RING_CLASS}` }, clickableProps(() => toggleMember(account)), { "aria-pressed": isSelected, children: [_jsx(Avatar, { src: account.avatar, size: 40, className: "shrink-0", children: account.displayName.charAt(0) || "A" }), _jsx("span", { className: "flex-1 truncate text-base font-medium text-gray-900", children: formatMemberLabel(account.displayName, account.username) }), _jsx("span", { className: clsx("flex h-4 w-4 shrink-0 items-center justify-center rounded border", isSelected
67
78
  ? "border-[var(--dc-color-primary)] bg-[var(--dc-color-primary)]"
68
- : "border-gray-300 bg-white"), children: isSelected && (_jsx(Icon, { icon: "check-b", size: 11, className: "text-white" })) })] }, account.userID));
79
+ : "border-gray-300 bg-white"), children: isSelected && (_jsx(Icon, { icon: "check-b", size: 11, className: "text-white" })) })] }), account.userID));
69
80
  }), isFetchingNextPage && (_jsx("div", { className: "flex items-center justify-center py-3", children: _jsx(Spin, { size: "small" }) }))] })) }), _jsxs("div", { className: "flex justify-end gap-2 pt-2", children: [_jsx(Button, { onClick: handleClose, children: tCommon("cancel") }), _jsx(Button, { type: "primary", disabled: selectedMembers.length === 0, loading: isSubmitting, onClick: handleSubmit, children: t("add_member.confirm") })] })] }) }));
70
81
  };
71
82
  export default AddMemberModal;
@@ -1,5 +1,6 @@
1
1
  interface AdminPermissionModalMember {
2
2
  userID: string;
3
+ nickname?: string;
3
4
  permissions: string[];
4
5
  }
5
6
  interface AdminPermissionModalProps {
@@ -1 +1 @@
1
- {"version":3,"file":"AdminPermissionModal.d.ts","sourceRoot":"","sources":["../../../src/components/group/AdminPermissionModal.tsx"],"names":[],"mappings":"AAqBA,UAAU,0BAA0B;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,UAAU,yBAAyB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IAIpB,MAAM,CAAC,EAAE,OAAO,CAAC;IAGjB,MAAM,CAAC,EAAE,0BAA0B,CAAC;IAKpC,wBAAwB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC5E;AAwCD,QAAA,MAAM,oBAAoB,GAAI,uEAO3B,yBAAyB,mDAgK3B,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"AdminPermissionModal.d.ts","sourceRoot":"","sources":["../../../src/components/group/AdminPermissionModal.tsx"],"names":[],"mappings":"AAwBA,UAAU,0BAA0B;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,UAAU,yBAAyB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IAIpB,MAAM,CAAC,EAAE,OAAO,CAAC;IAGjB,MAAM,CAAC,EAAE,0BAA0B,CAAC;IAKpC,wBAAwB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC5E;AAwCD,QAAA,MAAM,oBAAoB,GAAI,uEAO3B,yBAAyB,mDA+N3B,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useEffect, useState } from "react";
4
4
  import { ConfigProvider, Modal, Switch, message } from "antd";
5
5
  import { useTranslation } from "react-i18next";
@@ -7,6 +7,9 @@ import { GroupMemberRole } from "@droppii-org/wasm-client-sdk";
7
7
  import { useGroupMembers } from "../../hooks/group/useGroupMembers";
8
8
  import { useSetAdminRolePermissions, useSetGroupMemberPermissions, } from "../../hooks/group/useGroupMemberActions";
9
9
  import { Icon } from "../../components/icon";
10
+ import useAuthStore from "../../store/auth";
11
+ import PermissionPanelCrm, { PermissionRowList } from "./PermissionPanelCrm";
12
+ import DisableSendPermissionConfirm from "./DisableSendPermissionConfirm";
10
13
  import { ANTD_PRIMARY_COLOR_VAR } from "../../constants";
11
14
  import { GROUP_PERMISSION_KEY } from "../../constants/im";
12
15
  import { changedSwitches, commonSwitchStates, toRolePermissionChange, } from "../../utils/groupPermissionSwitches";
@@ -40,7 +43,9 @@ const AdminPermissionModal = ({ open, groupID, onClose, inline = false, member,
40
43
  const { members: groupMembers } = useGroupMembers(member ? undefined : groupID);
41
44
  const { mutateAsync: setMemberPermissions } = useSetGroupMemberPermissions();
42
45
  const { mutateAsync: setAdminRolePermissions } = useSetAdminRolePermissions();
46
+ const isCrm = useAuthStore((state) => state.isCrm);
43
47
  const [isSaving, setIsSaving] = useState(false);
48
+ const [isConfirmOpen, setIsConfirmOpen] = useState(false);
44
49
  const [edits, setEdits] = useState({});
45
50
  useEffect(() => {
46
51
  if (open)
@@ -52,10 +57,18 @@ const AdminPermissionModal = ({ open, groupID, onClose, inline = false, member,
52
57
  const changes = changedSwitches(baseline, pending);
53
58
  const hasChanges = Object.keys(changes).length > 0;
54
59
  const setSwitch = (name, checked) => setEdits((prev) => (Object.assign(Object.assign({}, prev), { [name]: checked })));
60
+ const requestSave = () => {
61
+ if (isCrm && changes.sendMessage === false) {
62
+ setIsConfirmOpen(true);
63
+ return;
64
+ }
65
+ void handleSave();
66
+ };
55
67
  const handleSave = async () => {
56
68
  var _a, _b;
57
69
  if (!groupID || !hasChanges)
58
70
  return;
71
+ setIsConfirmOpen(false);
59
72
  setIsSaving(true);
60
73
  try {
61
74
  if (member) {
@@ -80,12 +93,34 @@ const AdminPermissionModal = ({ open, groupID, onClose, inline = false, member,
80
93
  setIsSaving(false);
81
94
  }
82
95
  };
96
+ const crmRows = [
97
+ ["sendMessage", "permission_send_message", "permission_desc_send_message"],
98
+ ["pinMessage", "permission_pin_message", "permission_desc_pin_message"],
99
+ ["viewMemberInformation", "permission_view_member_info", "permission_desc_view_member_info"],
100
+ ["addMember", "permission_add_member", "permission_desc_add_member"],
101
+ ["removeMember", "permission_remove_member", "permission_desc_remove_member"],
102
+ ["updateGroupInfo", "permission_update_group_info", "permission_desc_update_group_info"],
103
+ ].map(([name, label, description]) => ({
104
+ key: name,
105
+ label: t(label),
106
+ description: t(description),
107
+ checked: pending[name],
108
+ onChange: (checked) => setSwitch(name, checked),
109
+ }));
83
110
  const rows = (_jsx(ConfigProvider, { theme: { token: { colorPrimary: ANTD_PRIMARY_COLOR_VAR } }, children: _jsxs("div", { className: "flex flex-col py-2", children: [_jsxs("div", { className: "flex items-center justify-between px-4 py-3", children: [_jsx("span", { className: "text-sm", children: t("permission_send_message") }), _jsx(Switch, { checked: pending.sendMessage, onChange: (checked) => setSwitch("sendMessage", checked) })] }), _jsxs("div", { className: "flex items-center justify-between px-4 py-3", children: [_jsx("span", { className: "text-sm", children: t("permission_pin_unpin_message") }), _jsx(Switch, { checked: pending.pinMessage, onChange: (checked) => setSwitch("pinMessage", checked) })] }), _jsxs("div", { className: "flex items-center justify-between px-4 py-3", children: [_jsx("span", { className: "text-sm", children: t("permission_view_member_info") }), _jsx(Switch, { checked: pending.viewMemberInformation, onChange: (checked) => setSwitch("viewMemberInformation", checked) })] }), _jsxs("div", { className: "flex items-center justify-between px-4 py-3", children: [_jsx("span", { className: "text-sm", children: t("permission_add_member") }), _jsx(Switch, { checked: pending.addMember, onChange: (checked) => setSwitch("addMember", checked) })] }), _jsxs("div", { className: "flex items-center justify-between px-4 py-3", children: [_jsx("span", { className: "text-sm", children: t("permission_remove_member") }), _jsx(Switch, { checked: pending.removeMember, onChange: (checked) => setSwitch("removeMember", checked) })] }), _jsxs("div", { className: "flex items-center justify-between px-4 py-3", children: [_jsx("span", { className: "text-sm", children: t("permission_update_group_info") }), _jsx(Switch, { checked: pending.updateGroupInfo, onChange: (checked) => setSwitch("updateGroupInfo", checked) })] })] }) }));
111
+ const confirm = (_jsx(DisableSendPermissionConfirm, { open: isConfirmOpen, title: member
112
+ ? t("disable_send_permission_title_member", { name: member.nickname })
113
+ : t("disable_send_permission_title_all_admins"), loading: isSaving, onConfirm: handleSave, onCancel: () => setIsConfirmOpen(false) }));
114
+ if (inline && isCrm) {
115
+ if (!open)
116
+ return null;
117
+ return (_jsxs(_Fragment, { children: [_jsx(PermissionPanelCrm, { title: t("admin_permission_row"), rows: crmRows, canSave: hasChanges, isSaving: isSaving, onBack: onClose, onSave: requestSave }), confirm] }));
118
+ }
84
119
  if (inline) {
85
120
  if (!open)
86
121
  return null;
87
- return (_jsxs("div", { className: "absolute inset-0 bg-white flex flex-col z-10", children: [_jsxs("div", { className: "flex w-full items-center border-b border-gray-100 p-2", children: [_jsx("button", { type: "button", className: "flex shrink-0 cursor-pointer items-center justify-center p-2 text-[var(--dc-color-nav-icon)]", onClick: onClose, children: _jsx(Icon, { icon: "arrow-left-o", size: 24 }) }), _jsx("p", { className: "min-w-0 flex-1 truncate px-2 text-[18px] font-bold leading-[1.6] text-gray-900", children: t("admin_permission_settings") })] }), _jsxs("div", { className: "flex-1 overflow-y-auto", children: [rows, _jsxs("div", { className: "flex items-center justify-end gap-2 px-4 py-3 border-t border-gray-100", children: [_jsx("button", { type: "button", className: "px-4 py-1.5 rounded-full border border-gray-300 text-gray-700 text-sm font-medium", onClick: onClose, children: t("cancel") }), _jsx("button", { type: "button", className: "px-4 py-1.5 rounded-full bg-[var(--dc-color-primary)] text-white text-sm font-medium disabled:bg-gray-200 disabled:text-gray-400", disabled: !hasChanges || isSaving, onClick: handleSave, children: t("save") })] })] })] }));
122
+ return (_jsxs("div", { className: "absolute inset-0 bg-white flex flex-col z-10", children: [_jsxs("div", { className: "flex w-full items-center border-b border-gray-100 p-2", children: [_jsx("button", { type: "button", className: "flex shrink-0 cursor-pointer items-center justify-center p-2 text-[var(--dc-color-nav-icon)]", onClick: onClose, children: _jsx(Icon, { icon: "arrow-left-o", size: 24 }) }), _jsx("p", { className: "min-w-0 flex-1 truncate px-2 text-[18px] font-bold leading-[1.6] text-gray-900", children: t("admin_permission_settings") })] }), _jsxs("div", { className: "flex-1 overflow-y-auto", children: [rows, _jsxs("div", { className: "flex items-center justify-end gap-2 px-4 py-3 border-t border-gray-100", children: [_jsx("button", { type: "button", className: "px-4 py-1.5 rounded-full border border-gray-300 text-gray-700 text-sm font-medium", onClick: onClose, children: t("cancel") }), _jsx("button", { type: "button", className: "px-4 py-1.5 rounded-full bg-[var(--dc-color-primary)] text-white text-sm font-medium disabled:bg-gray-200 disabled:text-gray-400", disabled: !hasChanges || isSaving, onClick: requestSave, children: t("save") })] })] }), confirm] }));
88
123
  }
89
- return (_jsx(Modal, { centered: true, open: open, onOk: handleSave, onCancel: onClose, title: t("admin_permission_settings"), okText: t("save"), cancelText: t("cancel"), confirmLoading: isSaving, okButtonProps: { disabled: !hasChanges }, getContainer: false, forceRender: true, children: _jsx("div", { className: "mt-2", children: rows }) }));
124
+ return (_jsxs(_Fragment, { children: [_jsx(Modal, { centered: true, destroyOnHidden: true, open: open, onOk: requestSave, onCancel: onClose, title: t("admin_permission_settings"), okText: t("save"), cancelText: t(isCrm ? "action_cancel" : "cancel"), confirmLoading: isSaving, okButtonProps: { disabled: !hasChanges }, getContainer: false, children: _jsx("div", { className: isCrm ? "-mx-6" : "mt-2", children: isCrm ? _jsx(PermissionRowList, { rows: crmRows }) : rows }) }), confirm] }));
90
125
  };
91
126
  export default AdminPermissionModal;
@@ -1,6 +1,8 @@
1
1
  interface CreateGroupFormProps {
2
2
  onDone: () => void;
3
+ /** CRM only: the modal footer the action bar renders into. */
4
+ footerEl?: HTMLElement | null;
3
5
  }
4
- declare const CreateGroupForm: ({ onDone }: CreateGroupFormProps) => import("react/jsx-runtime").JSX.Element;
6
+ declare const CreateGroupForm: ({ onDone, footerEl }: CreateGroupFormProps) => import("react/jsx-runtime").JSX.Element;
5
7
  export default CreateGroupForm;
6
8
  //# sourceMappingURL=CreateGroupForm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CreateGroupForm.d.ts","sourceRoot":"","sources":["../../../src/components/group/CreateGroupForm.tsx"],"names":[],"mappings":"AAeA,UAAU,oBAAoB;IAC5B,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,QAAA,MAAM,eAAe,GAAI,YAAY,oBAAoB,4CAqNxD,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"CreateGroupForm.d.ts","sourceRoot":"","sources":["../../../src/components/group/CreateGroupForm.tsx"],"names":[],"mappings":"AAiBA,UAAU,oBAAoB;IAC5B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAC/B;AAED,QAAA,MAAM,eAAe,GAAI,sBAA6B,oBAAoB,4CA4OzE,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -9,8 +9,11 @@ import { useCreateGroup } from "../../hooks/group/useCreateGroup";
9
9
  import { useUploadFile } from "../../hooks/common/useUploadFile";
10
10
  import { validateFile } from "../../utils/fileValidation";
11
11
  import GroupMemberPicker from "./GroupMemberPicker";
12
+ import CreateGroupFormCrmView from "./CreateGroupFormCrmView";
13
+ import useAuthStore from "../../store/auth";
12
14
  const GROUP_NAME_MAX_LENGTH = 255;
13
- const CreateGroupForm = ({ onDone }) => {
15
+ const CreateGroupForm = ({ onDone, footerEl = null }) => {
16
+ const isCrm = useAuthStore((state) => state.isCrm);
14
17
  const { t } = useTranslation("conversation-inbox");
15
18
  const { t: tCommon } = useTranslation("common");
16
19
  const { createGroup } = useCreateGroup();
@@ -97,6 +100,9 @@ const CreateGroupForm = ({ onDone }) => {
97
100
  description: t("create_group.privacy_public_desc"),
98
101
  },
99
102
  ], [t]);
103
+ if (isCrm) {
104
+ return (_jsx(CreateGroupFormCrmView, { groupName: groupName, maxNameLength: GROUP_NAME_MAX_LENGTH, onGroupNameChange: (value) => setGroupName(value.slice(0, GROUP_NAME_MAX_LENGTH)), isPublic: isPublic, onPublicChange: setIsPublic, avatarPreviewUrl: avatarPreviewUrl, isAvatarUploading: isAvatarUploading, onAvatarSelect: handleAvatarSelect, selectedMembers: selectedMembers, onChangeSelectedMembers: setSelectedMembers, canSubmit: canSubmit, isSubmitting: isSubmitting, onSubmit: handleSubmit, onCancel: onDone, footerEl: footerEl }));
105
+ }
100
106
  return (_jsxs("div", { className: "flex max-h-[70vh] flex-col", "data-cp-name": "CreateGroupForm", children: [_jsxs("div", { className: "flex flex-col overflow-y-auto pr-1", children: [_jsxs("div", { className: "flex items-center gap-4 py-6", children: [_jsx(Upload, { accept: "image/jpeg, image/png, image/jpg", showUploadList: false, beforeUpload: handleAvatarSelect, children: _jsxs("div", { className: "relative flex h-20 w-20 shrink-0 cursor-pointer items-center justify-center rounded-2xl bg-[var(--dc-color-primary-light)]", children: [avatarPreviewUrl ? (_jsx("img", { src: avatarPreviewUrl, alt: "", className: clsx("h-full w-full rounded-2xl object-cover", isAvatarUploading && "opacity-50") })) : (_jsx(Icon, { icon: "user-three-b", size: 32, className: "text-[var(--dc-color-primary)]" })), isAvatarUploading && (_jsx("span", { className: "absolute inset-0 flex items-center justify-center rounded-2xl bg-black/10", children: _jsx("span", { className: "h-5 w-5 animate-spin rounded-full border-2 border-white border-t-transparent" }) })), _jsx("span", { className: "absolute -bottom-1 -right-1 flex h-7 w-7 items-center justify-center rounded-full bg-gray-500", children: _jsx(Icon, { icon: "camera-b", size: 14, className: "text-white" }) })] }) }), _jsx(Input, { size: "large", value: groupName, onChange: (event) => setGroupName(event.target.value.slice(0, GROUP_NAME_MAX_LENGTH)), maxLength: GROUP_NAME_MAX_LENGTH, placeholder: t("create_group.name_placeholder"), className: "flex-1 text-base" })] }), _jsxs("div", { className: "flex flex-col gap-3 border-t border-gray-100 py-6", children: [_jsx("span", { className: "text-xs font-semibold uppercase tracking-wide text-gray-400", children: t("create_group.privacy_label") }), _jsx("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: privacyOptions.map((option) => (_jsxs("button", { type: "button", onClick: () => setIsPublic(option.value), className: clsx("rounded-xl border-2 p-4 text-left transition-colors", isPublic === option.value
101
107
  ? "border-[var(--dc-color-primary)] bg-[var(--dc-color-primary-light)]"
102
108
  : "border-gray-200 bg-white"), children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Icon, { icon: option.icon, size: 18, className: isPublic === option.value
@@ -0,0 +1,23 @@
1
+ import type { EligibleAccountItem } from "../../hooks/group/useEligibleAccounts";
2
+ interface CreateGroupFormCrmViewProps {
3
+ groupName: string;
4
+ maxNameLength: number;
5
+ onGroupNameChange: (value: string) => void;
6
+ isPublic: boolean;
7
+ onPublicChange: (value: boolean) => void;
8
+ avatarPreviewUrl: string;
9
+ isAvatarUploading: boolean;
10
+ onAvatarSelect: (file: File) => boolean;
11
+ selectedMembers: EligibleAccountItem[];
12
+ onChangeSelectedMembers: (members: EligibleAccountItem[]) => void;
13
+ canSubmit: boolean;
14
+ isSubmitting: boolean;
15
+ onSubmit: () => void;
16
+ onCancel: () => void;
17
+ /** Modal footer element the action bar renders into. */
18
+ footerEl: HTMLElement | null;
19
+ }
20
+ /** CRM layout of "Tạo nhóm chat": avatar + name, privacy radios, two-column picker, footer bar. */
21
+ declare const CreateGroupFormCrmView: (props: CreateGroupFormCrmViewProps) => import("react/jsx-runtime").JSX.Element;
22
+ export default CreateGroupFormCrmView;
23
+ //# sourceMappingURL=CreateGroupFormCrmView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateGroupFormCrmView.d.ts","sourceRoot":"","sources":["../../../src/components/group/CreateGroupFormCrmView.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAI7E,UAAU,2BAA2B;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;IACxC,eAAe,EAAE,mBAAmB,EAAE,CAAC;IACvC,uBAAuB,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,IAAI,CAAC;IAClE,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,wDAAwD;IACxD,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;CAC9B;AAED,mGAAmG;AACnG,QAAA,MAAM,sBAAsB,GAAI,OAAO,2BAA2B,4CAiGjE,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
@@ -0,0 +1,25 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { createPortal } from "react-dom";
4
+ import { Button, Input, Upload } from "antd";
5
+ import clsx from "clsx";
6
+ import { useTranslation } from "react-i18next";
7
+ import { StrokeIcon } from "../../components/icon/StrokeIcon";
8
+ import { FOCUS_RING_CLASS } from "../../utils/a11yClickable";
9
+ import GroupMemberPicker from "./GroupMemberPicker";
10
+ /** CRM layout of "Tạo nhóm chat": avatar + name, privacy radios, two-column picker, footer bar. */
11
+ const CreateGroupFormCrmView = (props) => {
12
+ const { t } = useTranslation("conversation-inbox");
13
+ const options = [
14
+ { value: false, icon: "lock", label: t("create_group.privacy_private"), hint: t("create_group.privacy_private_hint") },
15
+ { value: true, icon: "globe", label: t("create_group.privacy_public"), hint: t("create_group.privacy_public_hint") },
16
+ ];
17
+ return (_jsxs("div", { className: "flex flex-col gap-4", "data-cp-name": "CreateGroupForm", children: [_jsxs("div", { className: "flex items-end gap-4", children: [_jsx(Upload, { accept: "image/jpeg, image/png, image/jpg", showUploadList: false, beforeUpload: props.onAvatarSelect, children: _jsx("button", { type: "button", "aria-label": t("create_group.add_avatar"), title: t("create_group.add_avatar"), className: `flex h-16 w-16 shrink-0 items-center justify-center overflow-hidden rounded-full border border-dashed border-gray-200 bg-gray-5 text-gray-600 ${FOCUS_RING_CLASS}`, children: props.avatarPreviewUrl ? (
18
+ // eslint-disable-next-line @next/next/no-img-element
19
+ _jsx("img", { src: props.avatarPreviewUrl, alt: "", className: clsx("h-full w-full object-cover", props.isAvatarUploading && "opacity-50") })) : (_jsx(StrokeIcon, { name: "camera", size: 22 })) }) }), _jsxs("div", { className: "flex flex-1 flex-col gap-1.5", children: [_jsxs("label", { htmlFor: "create-group-name", className: "text-[13px] font-medium text-gray-900", children: [_jsx("span", { className: "text-danger-600", children: "* " }), t("create_group.name_label")] }), _jsx(Input, { id: "create-group-name", size: "large", value: props.groupName, onChange: (event) => props.onGroupNameChange(event.target.value), maxLength: props.maxNameLength, placeholder: t("create_group.name_placeholder") })] })] }), _jsxs("fieldset", { className: "m-0 flex flex-col gap-2 border-0 p-0", children: [_jsx("legend", { className: "mb-2 p-0 text-[13px] font-medium text-gray-900", children: t("create_group.privacy_label") }), _jsx("div", { className: "flex gap-3", children: options.map((option) => {
20
+ const checked = props.isPublic === option.value;
21
+ return (_jsxs("label", { className: clsx("flex flex-1 cursor-pointer items-start gap-2.5 rounded-xl border p-3 focus-within:outline focus-within:outline-2 focus-within:outline-primary-200", checked ? "border-primary-400 bg-primary-25 shadow-[0_0_0_1px_var(--dc-color-primary)]" : "border-gray-50 bg-white"), children: [_jsx("input", { type: "radio", name: "group-privacy", checked: checked, onChange: () => props.onPublicChange(option.value), className: "m-0 mt-0.5 h-4 w-4 shrink-0 accent-primary-400" }), _jsxs("span", { className: "flex flex-col gap-1", children: [_jsxs("span", { className: "flex items-center gap-1.5 text-sm font-semibold text-gray-900", children: [_jsx(StrokeIcon, { name: option.icon, size: 16 }), option.label] }), _jsx("span", { className: "text-[13px] leading-snug text-gray-600", children: option.hint })] })] }, String(option.value)));
22
+ }) })] }), _jsxs("fieldset", { className: "m-0 flex flex-col gap-2 border-0 p-0", children: [_jsxs("legend", { className: "mb-2 p-0 text-[13px] font-medium text-gray-900", children: [t("create_group.members_label"), " ", _jsx("span", { className: "font-normal text-gray-600", children: t("create_group.members_owner_note") })] }), _jsx(GroupMemberPicker, { selectedMembers: props.selectedMembers, onChangeSelectedMembers: props.onChangeSelectedMembers })] }), props.footerEl &&
23
+ createPortal(_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "flex-1 text-left text-[13px] text-gray-600", children: t("create_group.selected_footer", { count: props.selectedMembers.length }) }), _jsx(Button, { onClick: props.onCancel, children: t("create_group.cancel_crm") }), _jsx(Button, { type: "primary", disabled: !props.canSubmit, loading: props.isSubmitting, onClick: props.onSubmit, children: t("create_group.submit") })] }), props.footerEl)] }));
24
+ };
25
+ export default CreateGroupFormCrmView;
@@ -0,0 +1,11 @@
1
+ import { ReactNode } from "react";
2
+ interface DisableSendPermissionConfirmProps {
3
+ open: boolean;
4
+ title: ReactNode;
5
+ loading?: boolean;
6
+ onConfirm: () => void;
7
+ onCancel: () => void;
8
+ }
9
+ declare const DisableSendPermissionConfirm: ({ open, title, loading, onConfirm, onCancel, }: DisableSendPermissionConfirmProps) => import("react/jsx-runtime").JSX.Element;
10
+ export default DisableSendPermissionConfirm;
11
+ //# sourceMappingURL=DisableSendPermissionConfirm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DisableSendPermissionConfirm.d.ts","sourceRoot":"","sources":["../../../src/components/group/DisableSendPermissionConfirm.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIlC,UAAU,iCAAiC;IACzC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAGD,QAAA,MAAM,4BAA4B,GAAI,gDAMnC,iCAAiC,4CAiBnC,CAAC;AAEF,eAAe,4BAA4B,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useTranslation } from "react-i18next";
4
+ import ConfirmModal from "../../components/common/ConfirmModal";
5
+ // CRM only: turning off "gửi tin nhắn" silences people at once, so ask first.
6
+ const DisableSendPermissionConfirm = ({ open, title, loading, onConfirm, onCancel, }) => {
7
+ const { t } = useTranslation();
8
+ return (_jsx(ConfirmModal, { open: open, title: title, okText: t("disable_send_permission_ok"), cancelText: t("action_cancel"), onOk: onConfirm, onCancel: onCancel, okType: "danger", destructive: true, confirmLoading: loading, children: _jsx("p", { children: t("disable_send_permission_body") }) }));
9
+ };
10
+ export default DisableSendPermissionConfirm;
@@ -1 +1 @@
1
- {"version":3,"file":"GroupCompositeAvatar.d.ts","sourceRoot":"","sources":["../../../src/components/group/GroupCompositeAvatar.tsx"],"names":[],"mappings":"AAOA,UAAU,yBAAyB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAOD,QAAA,MAAM,oBAAoB,GAAI,gEAO3B,yBAAyB,4CA2E3B,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"GroupCompositeAvatar.d.ts","sourceRoot":"","sources":["../../../src/components/group/GroupCompositeAvatar.tsx"],"names":[],"mappings":"AASA,UAAU,yBAAyB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAOD,QAAA,MAAM,oBAAoB,GAAI,gEAO3B,yBAAyB,4CAiJ3B,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -4,6 +4,8 @@ import { Avatar } from "antd";
4
4
  import { GroupMemberRole } from "@droppii-org/wasm-client-sdk";
5
5
  import { useMemo } from "react";
6
6
  import { useGroupMembers } from "../../hooks/group/useGroupMembers";
7
+ import useAuthStore from "../../store/auth";
8
+ import TintedAvatar from "../../components/common/TintedAvatar";
7
9
  // AC-Default2 (DROPPII-29976): when a group is created without a picked
8
10
  // avatar, show two overlapping avatars (owner bottom-left, first-joined
9
11
  // non-owner member top-right) instead of a static placeholder image —
@@ -11,17 +13,20 @@ import { useGroupMembers } from "../../hooks/group/useGroupMembers";
11
13
  // no image compositing/upload needed.
12
14
  const GroupCompositeAvatar = ({ groupID, faceURL, ownerUserID, groupName, size = 56, className, }) => {
13
15
  var _a, _b;
16
+ const isCrm = useAuthStore((state) => state.isCrm);
14
17
  const shouldLoadMembers = !faceURL && Boolean(groupID);
15
18
  const { members } = useGroupMembers(shouldLoadMembers ? groupID : undefined);
16
- const { ownerFaceURL, ownerLetter, hasFirstMember, firstMemberFaceURL, firstMemberLetter } = useMemo(() => {
17
- var _a, _b, _c, _d, _e;
19
+ const { ownerFaceURL, ownerLetter, ownerName, hasFirstMember, firstMemberFaceURL, firstMemberLetter, firstMemberName, } = useMemo(() => {
20
+ var _a, _b, _c, _d, _e, _f, _g;
18
21
  if (!members.length) {
19
22
  return {
20
23
  ownerFaceURL: undefined,
21
24
  ownerLetter: undefined,
25
+ ownerName: "",
22
26
  hasFirstMember: false,
23
27
  firstMemberFaceURL: undefined,
24
28
  firstMemberLetter: undefined,
29
+ firstMemberName: "",
25
30
  };
26
31
  }
27
32
  // Prefer the explicit ownerUserID when the caller has it (e.g. GroupItem);
@@ -33,20 +38,50 @@ const GroupCompositeAvatar = ({ groupID, faceURL, ownerUserID, groupName, size =
33
38
  return {
34
39
  ownerFaceURL: owner === null || owner === void 0 ? void 0 : owner.faceURL,
35
40
  ownerLetter: (_c = (_b = owner === null || owner === void 0 ? void 0 : owner.nickname) === null || _b === void 0 ? void 0 : _b.charAt) === null || _c === void 0 ? void 0 : _c.call(_b, 0),
41
+ ownerName: (_d = owner === null || owner === void 0 ? void 0 : owner.nickname) !== null && _d !== void 0 ? _d : "",
36
42
  hasFirstMember: Boolean(firstMember),
37
43
  firstMemberFaceURL: firstMember === null || firstMember === void 0 ? void 0 : firstMember.faceURL,
38
- firstMemberLetter: (_e = (_d = firstMember === null || firstMember === void 0 ? void 0 : firstMember.nickname) === null || _d === void 0 ? void 0 : _d.charAt) === null || _e === void 0 ? void 0 : _e.call(_d, 0),
44
+ firstMemberLetter: (_f = (_e = firstMember === null || firstMember === void 0 ? void 0 : firstMember.nickname) === null || _e === void 0 ? void 0 : _e.charAt) === null || _f === void 0 ? void 0 : _f.call(_e, 0),
45
+ firstMemberName: (_g = firstMember === null || firstMember === void 0 ? void 0 : firstMember.nickname) !== null && _g !== void 0 ? _g : "",
39
46
  };
40
47
  }, [members, ownerUserID]);
41
48
  if (faceURL) {
49
+ if (isCrm) {
50
+ return (_jsx(TintedAvatar, { name: groupName !== null && groupName !== void 0 ? groupName : "", src: faceURL, size: size, className: className }));
51
+ }
42
52
  return (_jsx(Avatar, { src: faceURL, size: size, className: className, children: ((_a = groupName === null || groupName === void 0 ? void 0 : groupName.charAt) === null || _a === void 0 ? void 0 : _a.call(groupName, 0)) || "G" }));
43
53
  }
44
54
  // Not enough members yet to compose two avatars (still loading, or a
45
55
  // solo group with no other member) — fall back to a single placeholder.
46
56
  if (!shouldLoadMembers || !hasFirstMember) {
57
+ if (isCrm) {
58
+ return (_jsx(TintedAvatar, { name: ownerName || groupName || "", size: size, className: className }));
59
+ }
47
60
  return (_jsx(Avatar, { size: size, className: className, children: ownerLetter || ((_b = groupName === null || groupName === void 0 ? void 0 : groupName.charAt) === null || _b === void 0 ? void 0 : _b.call(groupName, 0)) || "G" }));
48
61
  }
49
62
  const subSize = Math.round(size * 0.62);
50
- return (_jsxs("div", { className: className, style: { position: "relative", width: size, height: size, flexShrink: 0 }, children: [_jsx(Avatar, { src: ownerFaceURL, size: subSize, style: { position: "absolute", left: 0, bottom: 0, border: "2px solid white" }, children: ownerLetter || "A" }), _jsx(Avatar, { src: firstMemberFaceURL, size: subSize, style: { position: "absolute", right: 0, top: 0, border: "2px solid white" }, children: firstMemberLetter || "A" })] }));
63
+ // CRM: larger circles with a white gap between them and a hairline ring so photos
64
+ // don't melt into the white header.
65
+ if (isCrm) {
66
+ const crmSubSize = Math.round(size * 0.72);
67
+ const ring = { boxShadow: "0 0 0 2px #FFFFFF, 0 0 0 3px #DDDEDF" };
68
+ return (_jsxs("div", { className: className, style: {
69
+ position: "relative",
70
+ width: size,
71
+ height: size,
72
+ flexShrink: 0,
73
+ }, children: [_jsx("span", { className: "absolute bottom-0 left-0 rounded-full", style: ring, children: _jsx(TintedAvatar, { name: ownerName, src: ownerFaceURL, size: crmSubSize }) }), _jsx("span", { className: "absolute right-0 top-0 rounded-full", style: ring, children: _jsx(TintedAvatar, { name: firstMemberName, src: firstMemberFaceURL, size: crmSubSize }) })] }));
74
+ }
75
+ return (_jsxs("div", { className: className, style: { position: "relative", width: size, height: size, flexShrink: 0 }, children: [_jsx(Avatar, { src: ownerFaceURL, size: subSize, style: {
76
+ position: "absolute",
77
+ left: 0,
78
+ bottom: 0,
79
+ border: "2px solid white",
80
+ }, children: ownerLetter || "A" }), _jsx(Avatar, { src: firstMemberFaceURL, size: subSize, style: {
81
+ position: "absolute",
82
+ right: 0,
83
+ top: 0,
84
+ border: "2px solid white",
85
+ }, children: firstMemberLetter || "A" })] }));
51
86
  };
52
87
  export default GroupCompositeAvatar;