@droppii-org/chat-sdk 0.6.56 → 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 (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 +1 -1
  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,8 +1,11 @@
1
1
  import type { EligibleAccountItem } from "../../hooks/group/useEligibleAccounts";
2
- interface GroupMemberPickerProps {
2
+ export interface GroupMemberPickerProps {
3
3
  selectedMembers: EligibleAccountItem[];
4
4
  onChangeSelectedMembers: (members: EligibleAccountItem[]) => void;
5
+ /** Existing group: people already in it show as "Đã trong nhóm" and cannot be picked (CRM). */
6
+ groupID?: string;
5
7
  }
6
- declare const GroupMemberPicker: ({ selectedMembers, onChangeSelectedMembers, }: GroupMemberPickerProps) => import("react/jsx-runtime").JSX.Element;
8
+ /** Member picker shared by "Tạo nhóm chat" and "Thêm thành viên". */
9
+ declare const GroupMemberPicker: (props: GroupMemberPickerProps) => import("react/jsx-runtime").JSX.Element;
7
10
  export default GroupMemberPicker;
8
11
  //# sourceMappingURL=GroupMemberPicker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GroupMemberPicker.d.ts","sourceRoot":"","sources":["../../../src/components/group/GroupMemberPicker.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAG7E,UAAU,sBAAsB;IAC9B,eAAe,EAAE,mBAAmB,EAAE,CAAC;IACvC,uBAAuB,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,IAAI,CAAC;CACnE;AAED,QAAA,MAAM,iBAAiB,GAAI,+CAGxB,sBAAsB,4CAoJxB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"GroupMemberPicker.d.ts","sourceRoot":"","sources":["../../../src/components/group/GroupMemberPicker.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAI7E,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,mBAAmB,EAAE,CAAC;IACvC,uBAAuB,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,IAAI,CAAC;IAClE,+FAA+F;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qEAAqE;AACrE,QAAA,MAAM,iBAAiB,GAAI,OAAO,sBAAsB,4CAUvD,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -1,45 +1,11 @@
1
1
  "use client";
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useDebounce } from "ahooks";
4
- import { Avatar, Empty, Input, Spin } from "antd";
5
- import clsx from "clsx";
6
- import { useState } from "react";
7
- import { useTranslation } from "react-i18next";
8
- import { Icon } from "../../components/icon";
9
- import { useEligibleAccounts } from "../../hooks/group/useEligibleAccounts";
10
- import { formatMemberLabel } from "../../utils/common";
11
- const GroupMemberPicker = ({ selectedMembers, onChangeSelectedMembers, }) => {
12
- const { t } = useTranslation("conversation-inbox");
13
- const [search, setSearch] = useState("");
14
- const debouncedSearch = useDebounce(search, { wait: 300 });
15
- const { accounts, isLoading, fetchNextPage, hasNextPage, isFetchingNextPage } = useEligibleAccounts(debouncedSearch);
16
- const handleListScroll = (event) => {
17
- if (!hasNextPage || isFetchingNextPage)
18
- return;
19
- const { scrollTop, scrollHeight, clientHeight } = event.currentTarget;
20
- if (scrollHeight - scrollTop - clientHeight < 80) {
21
- void fetchNextPage();
22
- }
23
- };
24
- const selectedIds = new Set(selectedMembers.map((member) => member.userID));
25
- const toggleMember = (account) => {
26
- if (selectedIds.has(account.userID)) {
27
- onChangeSelectedMembers(selectedMembers.filter((member) => member.userID !== account.userID));
28
- return;
29
- }
30
- onChangeSelectedMembers([...selectedMembers, account]);
31
- };
32
- const handleRemoveMember = (userID) => {
33
- onChangeSelectedMembers(selectedMembers.filter((member) => member.userID !== userID));
34
- };
35
- const handleClearAll = () => {
36
- onChangeSelectedMembers([]);
37
- };
38
- return (_jsxs("div", { className: "grid grid-cols-2 gap-3", "data-cp-name": "GroupMemberPicker", children: [_jsxs("div", { className: "flex flex-col gap-2 rounded-xl border border-gray-200 p-3", 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" }) }), _jsx("div", { className: "max-h-64 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) => {
39
- const isSelected = selectedIds.has(account.userID);
40
- 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
41
- ? "border-[var(--dc-color-primary)] bg-[var(--dc-color-primary)]"
42
- : "border-gray-300 bg-white"), children: isSelected && (_jsx(Icon, { icon: "check-b", size: 11, className: "text-white" })) })] }, account.userID));
43
- }), isFetchingNextPage && (_jsx("div", { className: "flex items-center justify-center py-3", children: _jsx(Spin, { size: "small" }) }))] })) })] }), _jsxs("div", { className: "flex flex-col gap-2 rounded-xl border border-gray-200 p-3", children: [_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") }))] }), _jsx("div", { className: "max-h-64 overflow-y-auto", children: selectedMembers.length === 0 ? (_jsxs("div", { className: "flex h-full min-h-[200px] flex-col items-center justify-center gap-2 text-center", children: [_jsx(Icon, { icon: "user-three-b", size: 28, className: "text-gray-300" }), _jsx("span", { className: "text-sm text-gray-400", children: t("create_group.no_member_selected") })] })) : (selectedMembers.map((member) => (_jsxs("div", { className: "flex items-center gap-3 rounded-lg px-3 py-3", children: [_jsx(Avatar, { src: member.avatar, size: 40, className: "shrink-0", children: member.displayName.charAt(0) || "A" }), _jsx("span", { className: "flex-1 truncate text-base font-medium text-gray-900", children: formatMemberLabel(member.displayName, member.username) }), _jsx(Icon, { icon: "close-b", size: 14, className: "shrink-0 cursor-pointer text-gray-400", onClick: () => handleRemoveMember(member.userID) })] }, member.userID)))) })] })] }));
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import useAuthStore from "../../store/auth";
4
+ import GroupMemberPickerCrm from "./GroupMemberPickerCrm";
5
+ import GroupMemberPickerLegacy from "./GroupMemberPickerLegacy";
6
+ /** Member picker shared by "Tạo nhóm chat" and "Thêm thành viên". */
7
+ const GroupMemberPicker = (props) => {
8
+ const isCrm = useAuthStore((state) => state.isCrm);
9
+ return isCrm ? (_jsx(GroupMemberPickerCrm, Object.assign({}, props))) : (_jsx(GroupMemberPickerLegacy, { selectedMembers: props.selectedMembers, onChangeSelectedMembers: props.onChangeSelectedMembers }));
44
10
  };
45
11
  export default GroupMemberPicker;
@@ -0,0 +1,4 @@
1
+ import type { GroupMemberPickerProps } from "./GroupMemberPicker";
2
+ declare const GroupMemberPickerCrm: ({ selectedMembers, onChangeSelectedMembers, groupID, }: GroupMemberPickerProps) => import("react/jsx-runtime").JSX.Element;
3
+ export default GroupMemberPickerCrm;
4
+ //# sourceMappingURL=GroupMemberPickerCrm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupMemberPickerCrm.d.ts","sourceRoot":"","sources":["../../../src/components/group/GroupMemberPickerCrm.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAKlE,QAAA,MAAM,oBAAoB,GAAI,wDAI3B,sBAAsB,4CAqIxB,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,48 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { useDebounce } from "ahooks";
5
+ import { Empty, Spin } from "antd";
6
+ import clsx from "clsx";
7
+ import { useTranslation } from "react-i18next";
8
+ import { StrokeIcon } from "../../components/icon/StrokeIcon";
9
+ import { useEligibleAccounts } from "../../hooks/group/useEligibleAccounts";
10
+ import { useEligibleAccountsForGroup } from "../../hooks/group/useEligibleAccountsForGroup";
11
+ import { useGroupMembers } from "../../hooks/group/useGroupMembers";
12
+ import { FOCUS_RING_CLASS } from "../../utils/a11yClickable";
13
+ import PersonAvatar from "./PersonAvatar";
14
+ /** In a small group the existing members stay listed; in a big one only while searching. */
15
+ const MAX_LOCKED_WITHOUT_SEARCH = 6;
16
+ const GroupMemberPickerCrm = ({ selectedMembers, onChangeSelectedMembers, groupID, }) => {
17
+ const { t } = useTranslation("conversation-inbox");
18
+ const [search, setSearch] = useState("");
19
+ const debouncedSearch = useDebounce(search, { wait: 300 });
20
+ const forNewGroup = useEligibleAccounts(debouncedSearch, !groupID);
21
+ const forGroup = useEligibleAccountsForGroup(debouncedSearch, groupID !== null && groupID !== void 0 ? groupID : "", Boolean(groupID));
22
+ const { accounts, isLoading, fetchNextPage, hasNextPage, isFetchingNextPage } = groupID ? forGroup : forNewGroup;
23
+ const { members: groupMembers } = useGroupMembers(groupID);
24
+ const keyword = search.trim().toLowerCase();
25
+ const lockedAll = groupMembers.filter((member) => (member.nickname || member.userID).toLowerCase().includes(keyword));
26
+ const showLocked = keyword !== "" || groupMembers.length <= MAX_LOCKED_WITHOUT_SEARCH;
27
+ const locked = showLocked ? lockedAll : [];
28
+ const selectedIds = new Set(selectedMembers.map((member) => member.userID));
29
+ const toggle = (account) => onChangeSelectedMembers(selectedIds.has(account.userID)
30
+ ? selectedMembers.filter((member) => member.userID !== account.userID)
31
+ : [...selectedMembers, account]);
32
+ const handleScroll = (event) => {
33
+ if (!hasNextPage || isFetchingNextPage)
34
+ return;
35
+ const { scrollTop, scrollHeight, clientHeight } = event.currentTarget;
36
+ if (scrollHeight - scrollTop - clientHeight < 80)
37
+ void fetchNextPage();
38
+ };
39
+ const rowClass = "flex items-center gap-2.5 rounded-lg px-2 py-1.5";
40
+ return (_jsxs("div", { className: "grid grid-cols-[minmax(0,1.5fr)_minmax(0,1fr)] items-stretch gap-3", "data-cp-name": "GroupMemberPicker", children: [_jsxs("div", { className: "flex min-w-0 flex-col gap-1.5 rounded-xl border border-gray-25 p-2", children: [_jsxs("label", { className: "flex h-9 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("create_group.search_label") }), _jsx(StrokeIcon, { name: "search", size: 16 }), _jsx("input", { type: "search", value: search, onChange: (event) => setSearch(event.target.value), placeholder: t("create_group.search_by_name"), className: "min-w-0 flex-1 border-0 bg-transparent p-0 text-sm text-gray-900 outline-none placeholder:text-gray-600" })] }), _jsx("div", { className: "h-[300px] overflow-y-auto", onScroll: handleScroll, children: isLoading ? (_jsx("div", { className: "flex items-center justify-center py-6", children: _jsx(Spin, {}) })) : accounts.length === 0 && locked.length === 0 ? (_jsx(Empty, { description: t("create_group.no_member_found") })) : (_jsxs("ul", { className: "m-0 flex list-none flex-col gap-0.5 p-0", children: [locked.map((member) => {
41
+ const name = member.nickname || member.userID;
42
+ return (_jsx("li", { children: _jsxs("label", { className: clsx(rowClass, "cursor-not-allowed opacity-70"), children: [_jsx("input", { type: "checkbox", checked: true, disabled: true, className: "m-0 h-[18px] w-[18px] shrink-0 accent-primary-400" }), _jsx(PersonAvatar, { name: name, src: member.faceURL, size: 32 }), _jsx("span", { className: "min-w-0 flex-1 truncate text-sm text-gray-900", children: name }), _jsx("span", { className: "shrink-0 text-xs text-gray-600", children: t("create_group.already_in_group") })] }) }, `locked-${member.userID}`));
43
+ }), accounts.map((account) => {
44
+ const isSelected = selectedIds.has(account.userID);
45
+ return (_jsx("li", { children: _jsxs("label", { className: clsx(rowClass, "cursor-pointer focus-within:outline focus-within:outline-2 focus-within:outline-primary-200", isSelected ? "bg-primary-25" : "hover:bg-gray-10"), children: [_jsx("input", { type: "checkbox", checked: isSelected, onChange: () => toggle(account), className: "m-0 h-[18px] w-[18px] shrink-0 accent-primary-400" }), _jsx(PersonAvatar, { name: account.displayName, src: account.avatar, size: 32 }), _jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [_jsx("span", { className: "truncate text-sm leading-[18px] text-gray-900", children: account.displayName }), _jsx("span", { className: "truncate text-xs leading-4 text-gray-600", children: account.username })] })] }) }, account.userID));
46
+ }), isFetchingNextPage && (_jsx("li", { className: "flex justify-center py-3", children: _jsx(Spin, { size: "small" }) }))] })) })] }), _jsxs("div", { className: "flex min-w-0 flex-col gap-2 rounded-xl bg-gray-5 p-3", children: [_jsx("span", { className: "text-[13px] font-semibold text-gray-900", children: t("create_group.selected_title", { count: selectedMembers.length }) }), selectedMembers.length === 0 ? (_jsx("span", { className: "text-sm text-gray-600", children: t("create_group.no_member_selected") })) : (_jsx("ul", { className: "m-0 flex list-none flex-col gap-1 overflow-y-auto p-0", children: selectedMembers.map((member) => (_jsxs("li", { className: "flex items-center gap-2 rounded-lg bg-white py-1 pl-1.5 pr-1", children: [_jsx(PersonAvatar, { name: member.displayName, src: member.avatar, size: 24 }), _jsx("span", { className: "min-w-0 flex-1 truncate text-[13px] text-gray-900", children: member.displayName }), _jsx("button", { type: "button", "aria-label": t("create_group.remove_selected", { name: member.displayName }), title: t("create_group.remove_selected", { name: member.displayName }), onClick: () => toggle(member), className: `flex h-6 w-6 shrink-0 items-center justify-center rounded text-gray-600 hover:bg-gray-25 ${FOCUS_RING_CLASS}`, children: _jsx(StrokeIcon, { name: "x", size: 14 }) })] }, member.userID))) }))] })] }));
47
+ };
48
+ export default GroupMemberPickerCrm;
@@ -0,0 +1,8 @@
1
+ import type { EligibleAccountItem } from "../../hooks/group/useEligibleAccounts";
2
+ interface GroupMemberPickerProps {
3
+ selectedMembers: EligibleAccountItem[];
4
+ onChangeSelectedMembers: (members: EligibleAccountItem[]) => void;
5
+ }
6
+ declare const GroupMemberPickerLegacy: ({ selectedMembers, onChangeSelectedMembers, }: GroupMemberPickerProps) => import("react/jsx-runtime").JSX.Element;
7
+ export default GroupMemberPickerLegacy;
8
+ //# sourceMappingURL=GroupMemberPickerLegacy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupMemberPickerLegacy.d.ts","sourceRoot":"","sources":["../../../src/components/group/GroupMemberPickerLegacy.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAG7E,UAAU,sBAAsB;IAC9B,eAAe,EAAE,mBAAmB,EAAE,CAAC;IACvC,uBAAuB,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,IAAI,CAAC;CACnE;AAED,QAAA,MAAM,uBAAuB,GAAI,+CAG9B,sBAAsB,4CAqJxB,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
@@ -0,0 +1,46 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { clickableProps, FOCUS_RING_CLASS } from "../../utils/a11yClickable";
4
+ import { useDebounce } from "ahooks";
5
+ import { Avatar, Empty, Input, Spin } from "antd";
6
+ import clsx from "clsx";
7
+ import { useState } from "react";
8
+ import { useTranslation } from "react-i18next";
9
+ import { Icon } from "../../components/icon";
10
+ import { useEligibleAccounts } from "../../hooks/group/useEligibleAccounts";
11
+ import { formatMemberLabel } from "../../utils/common";
12
+ const GroupMemberPickerLegacy = ({ selectedMembers, onChangeSelectedMembers, }) => {
13
+ const { t } = useTranslation("conversation-inbox");
14
+ const [search, setSearch] = useState("");
15
+ const debouncedSearch = useDebounce(search, { wait: 300 });
16
+ const { accounts, isLoading, fetchNextPage, hasNextPage, isFetchingNextPage } = useEligibleAccounts(debouncedSearch);
17
+ const handleListScroll = (event) => {
18
+ if (!hasNextPage || isFetchingNextPage)
19
+ return;
20
+ const { scrollTop, scrollHeight, clientHeight } = event.currentTarget;
21
+ if (scrollHeight - scrollTop - clientHeight < 80) {
22
+ void fetchNextPage();
23
+ }
24
+ };
25
+ const selectedIds = new Set(selectedMembers.map((member) => member.userID));
26
+ const toggleMember = (account) => {
27
+ if (selectedIds.has(account.userID)) {
28
+ onChangeSelectedMembers(selectedMembers.filter((member) => member.userID !== account.userID));
29
+ return;
30
+ }
31
+ onChangeSelectedMembers([...selectedMembers, account]);
32
+ };
33
+ const handleRemoveMember = (userID) => {
34
+ onChangeSelectedMembers(selectedMembers.filter((member) => member.userID !== userID));
35
+ };
36
+ const handleClearAll = () => {
37
+ onChangeSelectedMembers([]);
38
+ };
39
+ return (_jsxs("div", { className: "grid grid-cols-2 gap-3", "data-cp-name": "GroupMemberPicker", children: [_jsxs("div", { className: "flex flex-col gap-2 rounded-xl border border-gray-200 p-3", 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" }) }), _jsx("div", { className: "max-h-64 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) => {
40
+ const isSelected = selectedIds.has(account.userID);
41
+ 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
42
+ ? "border-[var(--dc-color-primary)] bg-[var(--dc-color-primary)]"
43
+ : "border-gray-300 bg-white"), children: isSelected && (_jsx(Icon, { icon: "check-b", size: 11, className: "text-white" })) })] }), account.userID));
44
+ }), isFetchingNextPage && (_jsx("div", { className: "flex items-center justify-center py-3", children: _jsx(Spin, { size: "small" }) }))] })) })] }), _jsxs("div", { className: "flex flex-col gap-2 rounded-xl border border-gray-200 p-3", children: [_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") }))] }), _jsx("div", { className: "max-h-64 overflow-y-auto", children: selectedMembers.length === 0 ? (_jsxs("div", { className: "flex h-full min-h-[200px] flex-col items-center justify-center gap-2 text-center", children: [_jsx(Icon, { icon: "user-three-b", size: 28, className: "text-gray-300" }), _jsx("span", { className: "text-sm text-gray-400", children: t("create_group.no_member_selected") })] })) : (selectedMembers.map((member) => (_jsxs("div", { className: "flex items-center gap-3 rounded-lg px-3 py-3", children: [_jsx(Avatar, { src: member.avatar, size: 40, className: "shrink-0", children: member.displayName.charAt(0) || "A" }), _jsx("span", { className: "flex-1 truncate text-base font-medium text-gray-900", children: formatMemberLabel(member.displayName, member.username) }), _jsx(Icon, { icon: "close-b", size: 14, className: "shrink-0 cursor-pointer text-gray-400", onClick: () => handleRemoveMember(member.userID) })] }, member.userID)))) })] })] }));
45
+ };
46
+ export default GroupMemberPickerLegacy;
@@ -0,0 +1,10 @@
1
+ interface GroupPanelHeaderProps {
2
+ title: string;
3
+ onClose?: () => void;
4
+ onBack?: () => void;
5
+ backLabel?: string;
6
+ }
7
+ /** CRM side-panel header: 56px bar with an optional back button and a close button. */
8
+ declare const GroupPanelHeader: ({ title, onClose, onBack, backLabel, }: GroupPanelHeaderProps) => import("react/jsx-runtime").JSX.Element;
9
+ export default GroupPanelHeader;
10
+ //# sourceMappingURL=GroupPanelHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupPanelHeader.d.ts","sourceRoot":"","sources":["../../../src/components/group/GroupPanelHeader.tsx"],"names":[],"mappings":"AAIA,UAAU,qBAAqB;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,uFAAuF;AACvF,QAAA,MAAM,gBAAgB,GAAI,wCAKvB,qBAAqB,4CAmCvB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useTranslation } from "react-i18next";
4
+ import { CrmIcon as Icon } from "../../components/group/crmIcon";
5
+ const ICON_BUTTON = "flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-gray-600 hover:bg-gray-5 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary-200";
6
+ /** CRM side-panel header: 56px bar with an optional back button and a close button. */
7
+ const GroupPanelHeader = ({ title, onClose, onBack, backLabel, }) => {
8
+ const { t } = useTranslation();
9
+ return (_jsxs("div", { className: `flex h-14 shrink-0 items-center gap-1 border-b border-gray-25 pr-2 ${onBack ? "pl-2" : "pl-4"}`, children: [onBack && (_jsx("button", { type: "button", className: ICON_BUTTON, onClick: onBack, "aria-label": backLabel, title: backLabel, children: _jsx(Icon, { icon: "arrow-left-o", size: 20 }) })), _jsx("h2", { className: "m-0 min-w-0 flex-1 truncate text-base font-bold text-gray-900", children: title }), onClose && (_jsx("button", { type: "button", className: ICON_BUTTON, onClick: onClose, "aria-label": t("close"), title: t("close"), children: _jsx(Icon, { icon: "close-o", size: 20 }) }))] }));
10
+ };
11
+ export default GroupPanelHeader;
@@ -1 +1 @@
1
- {"version":3,"file":"MemberPermissionPanel.d.ts","sourceRoot":"","sources":["../../../src/components/group/MemberPermissionPanel.tsx"],"names":[],"mappings":"AAkBA,UAAU,0BAA0B;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAuBD,QAAA,MAAM,qBAAqB,GAAI,4BAA4B,0BAA0B,mDA2FpF,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"MemberPermissionPanel.d.ts","sourceRoot":"","sources":["../../../src/components/group/MemberPermissionPanel.tsx"],"names":[],"mappings":"AAqBA,UAAU,0BAA0B;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AA8BD,QAAA,MAAM,qBAAqB,GAAI,4BAA4B,0BAA0B,mDA0IpF,CAAC;AAEF,eAAe,qBAAqB,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, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useEffect, useState } from "react";
4
4
  import { ConfigProvider, 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 { useSetMemberRolePermissions } from "../../hooks/group/useGroupMemberActions";
9
9
  import { Icon } from "../../components/icon";
10
+ import useAuthStore from "../../store/auth";
11
+ import PermissionPanelCrm 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";
@@ -22,6 +25,12 @@ const SWITCH_LABELS = {
22
25
  pinMessage: "permission_pin_message",
23
26
  viewMemberInformation: "permission_view_member_info",
24
27
  };
28
+ const SWITCH_DESCRIPTIONS = {
29
+ sendMessage: "permission_desc_send_message",
30
+ addMember: "permission_desc_add_member",
31
+ pinMessage: "permission_desc_pin_message",
32
+ viewMemberInformation: "permission_desc_view_member_info",
33
+ };
25
34
  const SWITCHES = Object.keys(SWITCH_PERMISSION_KEYS);
26
35
  // "Configure Member Permissions", inline in the "Thông tin" sidebar. Switches
27
36
  // start from what every ordinary member already shares, and "Lưu" sends only
@@ -30,7 +39,9 @@ const MemberPermissionPanel = ({ open, groupID, onClose }) => {
30
39
  const { t } = useTranslation();
31
40
  const { members: groupMembers, isLoading } = useGroupMembers(open ? groupID : undefined);
32
41
  const { mutateAsync: setMemberRolePermissions } = useSetMemberRolePermissions();
42
+ const isCrm = useAuthStore((state) => state.isCrm);
33
43
  const [isSaving, setIsSaving] = useState(false);
44
+ const [isConfirmOpen, setIsConfirmOpen] = useState(false);
34
45
  const [edits, setEdits] = useState({});
35
46
  useEffect(() => {
36
47
  if (open)
@@ -41,9 +52,17 @@ const MemberPermissionPanel = ({ open, groupID, onClose }) => {
41
52
  const pending = Object.assign(Object.assign({}, baseline), edits);
42
53
  const changes = changedSwitches(baseline, pending);
43
54
  const hasChanges = Object.keys(changes).length > 0;
55
+ const requestSave = () => {
56
+ if (isCrm && changes.sendMessage === false) {
57
+ setIsConfirmOpen(true);
58
+ return;
59
+ }
60
+ void handleSave();
61
+ };
44
62
  const handleSave = async () => {
45
63
  if (!groupID || !hasChanges)
46
64
  return;
65
+ setIsConfirmOpen(false);
47
66
  setIsSaving(true);
48
67
  try {
49
68
  await setMemberRolePermissions(Object.assign({ groupID }, toRolePermissionChange(SWITCH_PERMISSION_KEYS, changes)));
@@ -60,6 +79,16 @@ const MemberPermissionPanel = ({ open, groupID, onClose }) => {
60
79
  };
61
80
  if (!open)
62
81
  return null;
63
- return (_jsxs("div", { className: "absolute inset-0 bg-white flex flex-col z-10", "data-cp-name": "MemberPermissionPanel", 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("member_permission_settings") })] }), _jsx("div", { className: "flex-1 overflow-y-auto", children: _jsx(ConfigProvider, { theme: { token: { colorPrimary: ANTD_PRIMARY_COLOR_VAR } }, children: _jsx("div", { className: "flex flex-col py-2", children: SWITCHES.map((name) => (_jsxs("div", { className: "flex items-center justify-between px-4 py-3", children: [_jsx("span", { className: "text-sm", children: t(SWITCH_LABELS[name]) }), _jsx(Switch, { checked: pending[name], disabled: isLoading, onChange: (checked) => setEdits((prev) => (Object.assign(Object.assign({}, prev), { [name]: checked }))) })] }, name))) }) }) }), _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 || isLoading, onClick: handleSave, children: t("save") })] })] }));
82
+ if (isCrm) {
83
+ return (_jsxs(_Fragment, { children: [_jsx(PermissionPanelCrm, { title: t("member_permission_row"), rows: SWITCHES.map((name) => ({
84
+ key: name,
85
+ label: t(SWITCH_LABELS[name]),
86
+ description: t(SWITCH_DESCRIPTIONS[name]),
87
+ checked: pending[name],
88
+ disabled: isLoading,
89
+ onChange: (checked) => setEdits((prev) => (Object.assign(Object.assign({}, prev), { [name]: checked }))),
90
+ })), canSave: hasChanges && !isLoading, isSaving: isSaving, onBack: onClose, onSave: requestSave }), _jsx(DisableSendPermissionConfirm, { open: isConfirmOpen, title: t("disable_send_permission_title_all_members"), loading: isSaving, onConfirm: handleSave, onCancel: () => setIsConfirmOpen(false) })] }));
91
+ }
92
+ return (_jsxs("div", { className: "absolute inset-0 bg-white flex flex-col z-10", "data-cp-name": "MemberPermissionPanel", 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("member_permission_settings") })] }), _jsx("div", { className: "flex-1 overflow-y-auto", children: _jsx(ConfigProvider, { theme: { token: { colorPrimary: ANTD_PRIMARY_COLOR_VAR } }, children: _jsx("div", { className: "flex flex-col py-2", children: SWITCHES.map((name) => (_jsxs("div", { className: "flex items-center justify-between px-4 py-3", children: [_jsx("span", { className: "text-sm", children: t(SWITCH_LABELS[name]) }), _jsx(Switch, { checked: pending[name], disabled: isLoading, onChange: (checked) => setEdits((prev) => (Object.assign(Object.assign({}, prev), { [name]: checked }))) })] }, name))) }) }) }), _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 || isLoading, onClick: requestSave, children: t("save") })] }), _jsx(DisableSendPermissionConfirm, { open: isConfirmOpen, title: t("disable_send_permission_title_all_members"), loading: isSaving, onConfirm: handleSave, onCancel: () => setIsConfirmOpen(false) })] }));
64
93
  };
65
94
  export default MemberPermissionPanel;
@@ -0,0 +1,24 @@
1
+ export interface PermissionRowDef {
2
+ key: string;
3
+ label: string;
4
+ description: string;
5
+ checked: boolean;
6
+ disabled?: boolean;
7
+ onChange: (checked: boolean) => void;
8
+ }
9
+ /** One permission per row: name, one-line description, switch. */
10
+ export declare const PermissionRowList: ({ rows }: {
11
+ rows: PermissionRowDef[];
12
+ }) => import("react/jsx-runtime").JSX.Element;
13
+ interface PermissionPanelCrmProps {
14
+ title: string;
15
+ rows: PermissionRowDef[];
16
+ canSave: boolean;
17
+ isSaving: boolean;
18
+ onBack: () => void;
19
+ onSave: () => void;
20
+ }
21
+ /** CRM sub-panel of Thông tin nhóm: back header, permission rows, footer pinned to the bottom. */
22
+ declare const PermissionPanelCrm: ({ title, rows, canSave, isSaving, onBack, onSave }: PermissionPanelCrmProps) => import("react/jsx-runtime").JSX.Element;
23
+ export default PermissionPanelCrm;
24
+ //# sourceMappingURL=PermissionPanelCrm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionPanelCrm.d.ts","sourceRoot":"","sources":["../../../src/components/group/PermissionPanelCrm.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC;AAED,kEAAkE;AAClE,eAAO,MAAM,iBAAiB,GAAI,UAAU;IAAE,IAAI,EAAE,gBAAgB,EAAE,CAAA;CAAE,4CAevE,CAAC;AAEF,UAAU,uBAAuB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,gBAAgB,EAAE,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,kGAAkG;AAClG,QAAA,MAAM,kBAAkB,GAAI,oDAAoD,uBAAuB,4CAgBtG,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Button, Switch } from "antd";
4
+ import { useTranslation } from "react-i18next";
5
+ import GroupPanelHeader from "./GroupPanelHeader";
6
+ /** One permission per row: name, one-line description, switch. */
7
+ export const PermissionRowList = ({ rows }) => (_jsx("ul", { className: "m-0 flex list-none flex-col p-0", children: rows.map((row) => {
8
+ const id = `permission-${row.key}`;
9
+ return (_jsxs("li", { className: "flex items-center gap-3 px-4 py-3", children: [_jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [_jsx("span", { id: id, className: "text-sm text-gray-900", children: row.label }), _jsx("span", { className: "text-xs leading-snug text-gray-600", children: row.description })] }), _jsx(Switch, { checked: row.checked, disabled: row.disabled, onChange: row.onChange, "aria-labelledby": id })] }, row.key));
10
+ }) }));
11
+ /** CRM sub-panel of Thông tin nhóm: back header, permission rows, footer pinned to the bottom. */
12
+ const PermissionPanelCrm = ({ title, rows, canSave, isSaving, onBack, onSave }) => {
13
+ const { t } = useTranslation();
14
+ return (_jsxs("div", { className: "absolute inset-0 z-10 flex flex-col bg-white", "data-cp-name": "PermissionPanelCrm", children: [_jsx(GroupPanelHeader, { title: title, onBack: onBack, backLabel: t("back") }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto py-1", children: _jsx(PermissionRowList, { rows: rows }) }), _jsxs("div", { className: "flex shrink-0 justify-end gap-2 border-t border-gray-25 bg-gray-10 px-4 py-3", children: [_jsx(Button, { onClick: onBack, children: t("action_cancel") }), _jsx(Button, { type: "primary", disabled: !canSave, loading: isSaving, onClick: onSave, children: t("save") })] })] }));
15
+ };
16
+ export default PermissionPanelCrm;
@@ -0,0 +1,11 @@
1
+ interface PersonAvatarProps {
2
+ name: string;
3
+ src?: string | null;
4
+ /** Pixel size of the round avatar. */
5
+ size: 24 | 32 | 36;
6
+ className?: string;
7
+ }
8
+ /** Photo when it loads, otherwise tinted initials. */
9
+ declare const PersonAvatar: ({ name, src, size, className }: PersonAvatarProps) => import("react/jsx-runtime").JSX.Element;
10
+ export default PersonAvatar;
11
+ //# sourceMappingURL=PersonAvatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PersonAvatar.d.ts","sourceRoot":"","sources":["../../../src/components/group/PersonAvatar.tsx"],"names":[],"mappings":"AAQA,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,sCAAsC;IACtC,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,sDAAsD;AACtD,QAAA,MAAM,YAAY,GAAI,gCAAgC,iBAAiB,4CA8BtE,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import clsx from "clsx";
5
+ import { getAvatarTint, getInitials, } from "../../components/conversation/avatarTint";
6
+ const SIZE_CLASS = {
7
+ 24: "h-6 w-6 text-[9px]",
8
+ 32: "h-8 w-8 text-xs",
9
+ 36: "h-9 w-9 text-[13px]",
10
+ };
11
+ /** Photo when it loads, otherwise tinted initials. */
12
+ const PersonAvatar = ({ name, src, size, className }) => {
13
+ const [failedSrc, setFailedSrc] = useState(null);
14
+ if (src && src !== failedSrc) {
15
+ return (
16
+ // eslint-disable-next-line @next/next/no-img-element
17
+ _jsx("img", { src: src, alt: "", className: clsx("shrink-0 rounded-full object-cover", SIZE_CLASS[size], className), onError: () => setFailedSrc(src) }));
18
+ }
19
+ return (_jsx("span", { "aria-hidden": "true", className: clsx("flex shrink-0 items-center justify-center rounded-full font-semibold", SIZE_CLASS[size], getAvatarTint(name), className), children: getInitials(name) }));
20
+ };
21
+ export default PersonAvatar;
@@ -0,0 +1,9 @@
1
+ interface CrmIconProps {
2
+ icon: string;
3
+ size?: number;
4
+ className?: string;
5
+ }
6
+ /** CRM-only icon: renders the mockup line icon for a legacy icon-font name. */
7
+ export declare const CrmIcon: ({ icon, size, className }: CrmIconProps) => import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=crmIcon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crmIcon.d.ts","sourceRoot":"","sources":["../../../src/components/group/crmIcon.tsx"],"names":[],"mappings":"AAmCA,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,+EAA+E;AAC/E,eAAO,MAAM,OAAO,GAAI,2BAAgC,YAAY,4CAEnE,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { StrokeIcon } from "../../components/icon/StrokeIcon";
3
+ // Droppii icon-font names used by shared group markup -> the mockups' line icons.
4
+ const MAP = {
5
+ "arrow-left-o": "chevron-left",
6
+ "close-o": "x",
7
+ "close-b": "x",
8
+ "angle-right-o": "chevron-right",
9
+ "bell-o": "bell",
10
+ "bell-off-o": "bell-off",
11
+ "chat-square-o": "message-circle",
12
+ "shield-o": "shield",
13
+ "shield-fail-o": "shield",
14
+ "link-alt-o": "link",
15
+ "trash-o": "trash",
16
+ "logout-o": "log-out",
17
+ "user-del-o": "x-circle",
18
+ "camera-o": "camera",
19
+ "edit-o": "edit",
20
+ "plus-o": "plus",
21
+ "globe-o": "globe",
22
+ "globe-b": "globe",
23
+ "lock-o": "lock",
24
+ "lock-b": "lock",
25
+ "user-two-o": "users",
26
+ "search-o": "search",
27
+ "user-add-o": "user-plus",
28
+ "more-horizontal-b": "more",
29
+ "key-o": "key",
30
+ "check-b": "check",
31
+ "camera-b": "camera",
32
+ "user-x": "user-x",
33
+ };
34
+ /** CRM-only icon: renders the mockup line icon for a legacy icon-font name. */
35
+ export const CrmIcon = ({ icon, size = 20, className }) => {
36
+ var _a;
37
+ return (_jsx(StrokeIcon, { name: (_a = MAP[icon]) !== null && _a !== void 0 ? _a : "info", size: size, className: className }));
38
+ };
@@ -0,0 +1,15 @@
1
+ import type { StrokeIconName } from "./strokeIconNodes";
2
+ interface AdaptiveIconProps {
3
+ /** Line icon shown in CRM. */
4
+ stroke: StrokeIconName;
5
+ /** Icon-font glyph every other host keeps. */
6
+ font: string;
7
+ size?: number;
8
+ /** Size of the line icon when it differs from the font glyph's. */
9
+ strokeSize?: number;
10
+ className?: string;
11
+ }
12
+ /** Mockup line icon in CRM, the icon-font glyph elsewhere. */
13
+ export declare const AdaptiveIcon: ({ stroke, font, size, strokeSize, className }: AdaptiveIconProps) => import("react/jsx-runtime").JSX.Element;
14
+ export {};
15
+ //# sourceMappingURL=AdaptiveIcon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdaptiveIcon.d.ts","sourceRoot":"","sources":["../../../src/components/icon/AdaptiveIcon.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,UAAU,iBAAiB;IACzB,8BAA8B;IAC9B,MAAM,EAAE,cAAc,CAAC;IACvB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,8DAA8D;AAC9D,eAAO,MAAM,YAAY,GAAI,+CAAoD,iBAAiB,4CAOjG,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import useAuthStore from "../../store/auth";
4
+ import { Icon } from "./index";
5
+ import { StrokeIcon } from "./StrokeIcon";
6
+ /** Mockup line icon in CRM, the icon-font glyph elsewhere. */
7
+ export const AdaptiveIcon = ({ stroke, font, size = 20, strokeSize, className }) => {
8
+ const isCrm = useAuthStore((state) => state.isCrm);
9
+ return isCrm ? (_jsx(StrokeIcon, { name: stroke, size: strokeSize !== null && strokeSize !== void 0 ? strokeSize : size, className: className })) : (_jsx(Icon, { icon: font, size: size, className: className }));
10
+ };
@@ -0,0 +1,14 @@
1
+ import { CSSProperties } from "react";
2
+ import { StrokeIconName } from "./strokeIconNodes";
3
+ export interface StrokeIconProps {
4
+ name: StrokeIconName;
5
+ size?: number;
6
+ strokeWidth?: number;
7
+ className?: string;
8
+ style?: CSSProperties;
9
+ /** Gives the icon an accessible name; without it the icon is decorative. */
10
+ title?: string;
11
+ }
12
+ /** Line icons from the approved CRM mockups. Colour follows `currentColor`. */
13
+ export declare const StrokeIcon: ({ name, size, strokeWidth, className, style, title, }: StrokeIconProps) => import("react/jsx-runtime").JSX.Element;
14
+ //# sourceMappingURL=StrokeIcon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StrokeIcon.d.ts","sourceRoot":"","sources":["../../../src/components/icon/StrokeIcon.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,aAAa,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAqB,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,+EAA+E;AAC/E,eAAO,MAAM,UAAU,GAAI,uDAOxB,eAAe,4CAqBjB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createElement } from "react";
3
+ import { STROKE_ICON_NODES } from "./strokeIconNodes";
4
+ /** Line icons from the approved CRM mockups. Colour follows `currentColor`. */
5
+ export const StrokeIcon = ({ name, size = 20, strokeWidth = 1.75, className, style, title, }) => (_jsx("svg", { "data-cp-name": "StrokeIcon", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: strokeWidth, strokeLinecap: "round", strokeLinejoin: "round", className: className, style: Object.assign({ flexShrink: 0, display: "block" }, style), role: title ? "img" : undefined, "aria-hidden": title ? undefined : true, "aria-label": title, children: STROKE_ICON_NODES[name].map(([tag, attrs], index) => createElement(tag, Object.assign({ key: index }, attrs))) }));