@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
@@ -1 +1 @@
1
- {"version":3,"file":"CannedResponseBody.d.ts","sourceRoot":"","sources":["../../../src/components/canned-response/CannedResponseBody.tsx"],"names":[],"mappings":"AAiBA,UAAU,wBAAwB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AASD,QAAA,MAAM,kBAAkB,GAAI,OAAO,wBAAwB,4CA8M1D,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"CannedResponseBody.d.ts","sourceRoot":"","sources":["../../../src/components/canned-response/CannedResponseBody.tsx"],"names":[],"mappings":"AAkBA,UAAU,wBAAwB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AASD,QAAA,MAAM,kBAAkB,GAAI,OAAO,wBAAwB,4CAiN1D,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { clickableProps, FOCUS_RING_CLASS } from "../../utils/a11yClickable";
2
3
  import { Empty, Segmented, Spin } from "antd";
3
4
  import { useFetchMyTeams } from "../../hooks/team/useFetchMyTeam";
4
5
  import { useTranslation } from "react-i18next";
@@ -97,13 +98,13 @@ const CannedResponseBody = (props) => {
97
98
  const htmlContent = (canned === null || canned === void 0 ? void 0 : canned.content) || "";
98
99
  // 🔒 Sanitize HTML to prevent XSS attacks
99
100
  const sanitizedContent = sanitizeHtml(htmlContent);
100
- return (_jsxs("div", { ref: (el) => {
101
+ return (_jsxs("div", Object.assign({ ref: (el) => {
101
102
  itemRefs.current[index] = el;
102
- }, className: clsx("flex flex-col flex-1 px-3 py-2 cursor-pointer hover:bg-blue-100 w-full border-b border-gray-200", isActive && "bg-blue-100"), onClick: () => onSelectCannedResponse === null || onSelectCannedResponse === void 0 ? void 0 : onSelectCannedResponse(sanitizedContent), children: [_jsxs("span", { className: "text-xs truncate text-gray-500", children: [`${((_a = canned === null || canned === void 0 ? void 0 : canned.category) === null || _a === void 0 ? void 0 : _a.name)
103
+ }, className: clsx("flex flex-col flex-1 px-3 py-2 cursor-pointer hover:bg-blue-100 w-full border-b border-gray-200", FOCUS_RING_CLASS, isActive && "bg-blue-100") }, clickableProps(() => onSelectCannedResponse === null || onSelectCannedResponse === void 0 ? void 0 : onSelectCannedResponse(sanitizedContent)), { children: [_jsxs("span", { className: "text-xs truncate text-gray-500", children: [`${((_a = canned === null || canned === void 0 ? void 0 : canned.category) === null || _a === void 0 ? void 0 : _a.name)
103
104
  ? `${(_b = canned === null || canned === void 0 ? void 0 : canned.category) === null || _b === void 0 ? void 0 : _b.name} / `
104
105
  : ""}`, _jsx("span", { className: "text-black", children: `${(canned === null || canned === void 0 ? void 0 : canned.name) || ""} ` }), _jsx("span", { children: "/" }), _jsx("span", { className: "text-blue-500", children: ` #${(canned === null || canned === void 0 ? void 0 : canned.shortcut) || ""}` })] }), _jsx("div", { dangerouslySetInnerHTML: {
105
106
  __html: sanitizedContent,
106
- }, className: "text-sm mt-1" })] }, canned === null || canned === void 0 ? void 0 : canned.id));
107
+ }, className: "text-sm mt-1" })] }), canned === null || canned === void 0 ? void 0 : canned.id));
107
108
  })) })] })] }));
108
109
  };
109
110
  export default CannedResponseBody;
@@ -0,0 +1,9 @@
1
+ import { CannedCreateRequest } from "../../types/chat";
2
+ interface CannedResponsePanelProps {
3
+ query: string;
4
+ viewedTeamId?: string;
5
+ onCreate?: (request: CannedCreateRequest) => void;
6
+ }
7
+ declare const CannedResponsePanel: ({ query, viewedTeamId, onCreate, }: CannedResponsePanelProps) => import("react/jsx-runtime").JSX.Element;
8
+ export default CannedResponsePanel;
9
+ //# sourceMappingURL=CannedResponsePanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CannedResponsePanel.d.ts","sourceRoot":"","sources":["../../../src/components/canned-response/CannedResponsePanel.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAE,mBAAmB,EAA8B,MAAM,cAAc,CAAC;AAQ/E,UAAU,wBAAwB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACnD;AAaD,QAAA,MAAM,mBAAmB,GAAI,oCAI1B,wBAAwB,4CAiJ1B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,72 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
+ import { Spin } from "antd";
5
+ import { StrokeIcon } from "../../components/icon/StrokeIcon";
6
+ import { useDebounce } from "ahooks";
7
+ import { useTranslation } from "react-i18next";
8
+ import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
9
+ import { useFetchMyTeams } from "../../hooks/team/useFetchMyTeam";
10
+ import { useSearchCannedAcrossScopes } from "../../hooks/canned-response/useSearchCannedAcrossScopes";
11
+ import { useMessageFooterContext } from "../../components/message/footer";
12
+ import { CannedResponseVisibleScope } from "../../types/chat";
13
+ import { sanitizeHtml } from "../../utils/common";
14
+ import emitter from "../../utils/events";
15
+ import { insertCannedContent } from "./insertCannedContent";
16
+ import { buildCannedScopes } from "./cannedScopes";
17
+ import CannedScopeChips, { ALL_SCOPES_KEY } from "./CannedScopeChips";
18
+ import CannedResponseRow from "./CannedResponseRow";
19
+ const Kbd = ({ children }) => (_jsx("kbd", { className: "inline-flex h-6 min-w-[24px] items-center justify-center rounded border border-b-2 border-gray-50 bg-white px-1.5 font-sans text-xs font-semibold text-gray-900", children: children }));
20
+ const toPreview = (html) => {
21
+ var _a;
22
+ return (_a = new DOMParser().parseFromString(sanitizeHtml(html), "text/html").body
23
+ .textContent) !== null && _a !== void 0 ? _a : "";
24
+ };
25
+ // CRM only: lists matches for the "#shortcut" being typed; focus stays in the composer.
26
+ const CannedResponsePanel = ({ query, viewedTeamId, onCreate, }) => {
27
+ const { t } = useTranslation();
28
+ const [editor] = useLexicalComposerContext();
29
+ const { activeCannedIndex, setActiveCannedIndex, setMaxActiveCannedIndex } = useMessageFooterContext();
30
+ const { data: myTeams } = useFetchMyTeams();
31
+ const [filter, setFilter] = useState(ALL_SCOPES_KEY);
32
+ const debouncedQuery = useDebounce(query, { wait: 200 });
33
+ const itemRefs = useRef([]);
34
+ const scopes = useMemo(() => buildCannedScopes(myTeams !== null && myTeams !== void 0 ? myTeams : [], t("personal"), viewedTeamId), [myTeams, t, viewedTeamId]);
35
+ const activeScopes = useMemo(() => (filter === ALL_SCOPES_KEY ? scopes : scopes.filter((s) => s.key === filter)), [scopes, filter]);
36
+ const { rows, isLoading, isError } = useSearchCannedAcrossScopes(activeScopes, debouncedQuery);
37
+ const settling = query !== debouncedQuery;
38
+ const insertRow = useCallback((row) => insertCannedContent(editor, sanitizeHtml(row.content || "")), [editor]);
39
+ useEffect(() => {
40
+ const onSelect = (index) => {
41
+ const row = index === null ? undefined : rows[Math.min(index, rows.length - 1)];
42
+ if (row)
43
+ insertRow(row);
44
+ };
45
+ emitter.on("CANNED_RESPONSE_SELECT", onSelect);
46
+ return () => emitter.off("CANNED_RESPONSE_SELECT", onSelect);
47
+ }, [rows, insertRow]);
48
+ useEffect(() => setActiveCannedIndex(0), [debouncedQuery, filter, setActiveCannedIndex]);
49
+ useEffect(() => setMaxActiveCannedIndex(Math.max(rows.length - 1, 0)), [rows.length, setMaxActiveCannedIndex]);
50
+ useEffect(() => {
51
+ var _a, _b;
52
+ if (activeCannedIndex !== null) {
53
+ (_b = (_a = itemRefs.current[activeCannedIndex]) === null || _a === void 0 ? void 0 : _a.scrollIntoView) === null || _b === void 0 ? void 0 : _b.call(_a, { block: "nearest" });
54
+ }
55
+ }, [activeCannedIndex]);
56
+ const create = () => {
57
+ var _a;
58
+ const scope = scopes.find((s) => s.key === filter);
59
+ const isPersonal = (scope === null || scope === void 0 ? void 0 : scope.visibilityScope) === CannedResponseVisibleScope.PRIVATE;
60
+ onCreate === null || onCreate === void 0 ? void 0 : onCreate({
61
+ visibilityScope: isPersonal ? "PRIVATE" : "TEAM",
62
+ teamId: isPersonal ? undefined : (_a = scope === null || scope === void 0 ? void 0 : scope.teamId) !== null && _a !== void 0 ? _a : viewedTeamId,
63
+ onCreated: (content) => editor.focus(() => insertCannedContent(editor, sanitizeHtml(content))),
64
+ });
65
+ };
66
+ const noQuery = query.length === 0;
67
+ const empty = !noQuery && !settling && !isLoading && rows.length === 0;
68
+ return (_jsxs("div", { "data-cp-name": "CannedResponsePanel", role: "region", "aria-label": t("composer_quick_reply"), className: "absolute inset-x-4 bottom-full z-20 mb-2 overflow-hidden rounded-xl bg-white shadow-[0_16px_16px_-8px_rgba(27,63,228,0.2),0_0_0_1px_rgba(57,62,64,0.06)]", children: [_jsxs("div", { className: "flex items-center gap-2 border-b border-gray-25 px-3 py-2.5", children: [_jsx("span", { className: "shrink-0 text-[13px] font-semibold text-gray-900", children: t("composer_quick_reply") }), _jsx("span", { className: "flex-1" }), _jsx(CannedScopeChips, { scopes: scopes, value: filter, onChange: setFilter })] }), _jsxs("div", { className: "max-h-[260px] min-h-[96px] overflow-y-auto p-1", children: [noQuery && (_jsx("p", { className: "px-3 py-6 text-center text-sm text-gray-600", children: t("canned_search_prompt") })), !noQuery && (settling || isLoading) && (_jsx("div", { className: "flex justify-center py-6", children: _jsx(Spin, { size: "small" }) })), isError && !settling && (_jsx("p", { role: "alert", className: "px-3 py-6 text-center text-sm text-danger-600", children: t("canned_loading_failed") })), empty && !isError && (_jsxs("div", { className: "flex flex-col items-center gap-3 px-3 py-5", children: [_jsx("p", { className: "text-center text-sm text-gray-600", children: t("canned_search_empty", { query }) }), _jsxs("button", { type: "button", tabIndex: -1, onMouseDown: (e) => e.preventDefault(), onClick: create, className: "flex h-8 items-center gap-1.5 rounded-lg border border-gray-50 bg-white px-3.5 text-sm font-medium text-gray-900 hover:bg-gray-5", children: [_jsx(StrokeIcon, { name: "plus", size: 16 }), t("canned_create_new")] })] })), !settling && rows.length > 0 && (_jsx("ul", { className: "m-0 flex list-none flex-col gap-0.5 p-0", children: rows.map((row, index) => (_jsx(CannedResponseRow, { ref: (el) => {
69
+ itemRefs.current[index] = el;
70
+ }, row: row, preview: toPreview(row.content || ""), active: index === activeCannedIndex, onSelect: () => insertRow(row) }, row.id))) }))] }), _jsxs("div", { className: "flex items-center gap-2 border-t border-gray-25 px-3 py-2 text-xs text-gray-600", children: [_jsx(Kbd, { children: "\u2191" }), _jsx(Kbd, { children: "\u2193" }), " ", t("canned_hint_select"), " \u00B7 ", _jsx(Kbd, { children: "Enter" }), " ", t("canned_hint_insert"), " \u00B7", " ", _jsx(Kbd, { children: "Esc" }), " ", t("canned_hint_close"), _jsx("span", { className: "flex-1" }), _jsxs("button", { type: "button", tabIndex: -1, onMouseDown: (e) => e.preventDefault(), onClick: create, className: "flex h-7 items-center gap-1.5 rounded-lg px-2 text-[13px] font-medium text-primary-500 hover:bg-primary-25", children: [_jsx(StrokeIcon, { name: "plus", size: 16 }), t("canned_create_quick")] })] })] }));
71
+ };
72
+ export default CannedResponsePanel;
@@ -0,0 +1,10 @@
1
+ import { CannedRow } from "./cannedScopes";
2
+ interface CannedResponseRowProps {
3
+ row: CannedRow;
4
+ preview: string;
5
+ active: boolean;
6
+ onSelect: () => void;
7
+ }
8
+ declare const CannedResponseRow: import("react").ForwardRefExoticComponent<CannedResponseRowProps & import("react").RefAttributes<HTMLLIElement>>;
9
+ export default CannedResponseRow;
10
+ //# sourceMappingURL=CannedResponseRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CannedResponseRow.d.ts","sourceRoot":"","sources":["../../../src/components/canned-response/CannedResponseRow.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,UAAU,sBAAsB;IAC9B,GAAG,EAAE,SAAS,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,QAAA,MAAM,iBAAiB,kHA2BtB,CAAC;AAGF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import clsx from "clsx";
3
+ import { forwardRef } from "react";
4
+ const CannedResponseRow = forwardRef(({ row, preview, active, onSelect }, ref) => (_jsx("li", { ref: ref, children: _jsxs("button", { type: "button", tabIndex: -1, "aria-current": active, onMouseDown: (e) => e.preventDefault(), onClick: onSelect, className: clsx("flex w-full items-center gap-3 rounded-lg px-3 py-2 text-left", active ? "bg-primary-25" : "hover:bg-gray-5"), children: [_jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [_jsxs("span", { className: "flex items-baseline gap-2 text-[13px]", children: [_jsx("span", { className: "font-semibold text-primary-500", children: `#${row.shortcut}` }), _jsx("span", { className: "truncate font-medium text-gray-900", children: row.name })] }), _jsx("span", { className: "truncate text-[13px] text-gray-600", children: preview })] }), _jsx("span", { className: "inline-flex h-[22px] max-w-[140px] shrink-0 items-center truncate rounded-full bg-[var(--dc-color-neutral-surface)] px-2 text-xs font-medium text-gray-900", children: row.scopeLabel })] }) })));
5
+ CannedResponseRow.displayName = "CannedResponseRow";
6
+ export default CannedResponseRow;
@@ -0,0 +1,10 @@
1
+ import { CannedScope } from "./cannedScopes";
2
+ export declare const ALL_SCOPES_KEY = "ALL";
3
+ interface CannedScopeChipsProps {
4
+ scopes: CannedScope[];
5
+ value: string;
6
+ onChange: (key: string) => void;
7
+ }
8
+ declare const CannedScopeChips: ({ scopes, value, onChange }: CannedScopeChipsProps) => import("react/jsx-runtime").JSX.Element;
9
+ export default CannedScopeChips;
10
+ //# sourceMappingURL=CannedScopeChips.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CannedScopeChips.d.ts","sourceRoot":"","sources":["../../../src/components/canned-response/CannedScopeChips.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,eAAO,MAAM,cAAc,QAAQ,CAAC;AAEpC,UAAU,qBAAqB;IAC7B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAGD,QAAA,MAAM,gBAAgB,GAAI,6BAA6B,qBAAqB,4CAsD3E,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useRef, useState } from "react";
3
+ import clsx from "clsx";
4
+ import { useTranslation } from "react-i18next";
5
+ export const ALL_SCOPES_KEY = "ALL";
6
+ // Chips never take focus: the agent keeps typing in the composer while filtering.
7
+ const CannedScopeChips = ({ scopes, value, onChange }) => {
8
+ const { t } = useTranslation();
9
+ const chips = [{ key: ALL_SCOPES_KEY, label: t("all") }, ...scopes];
10
+ const ref = useRef(null);
11
+ const [hasMoreRight, setHasMoreRight] = useState(false);
12
+ // With many teams the row scrolls sideways; a fade on the right edge shows there is more.
13
+ const measure = useCallback(() => {
14
+ const el = ref.current;
15
+ if (el)
16
+ setHasMoreRight(el.scrollLeft + el.clientWidth < el.scrollWidth - 1);
17
+ }, []);
18
+ useEffect(() => {
19
+ measure();
20
+ const el = ref.current;
21
+ if (!el || typeof ResizeObserver === "undefined")
22
+ return;
23
+ const observer = new ResizeObserver(measure);
24
+ observer.observe(el);
25
+ return () => observer.disconnect();
26
+ }, [measure, chips.length]);
27
+ return (_jsx("div", { ref: ref, role: "group", "aria-label": t("canned_scope_filter"), onScroll: measure, className: clsx("flex min-w-0 gap-1.5 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden", hasMoreRight && "[mask-image:linear-gradient(to_right,#000_calc(100%-32px),transparent)]"), children: chips.map((chip) => {
28
+ const selected = chip.key === value;
29
+ return (_jsx("button", { type: "button", tabIndex: -1, "aria-pressed": selected, onMouseDown: (e) => e.preventDefault(), onClick: () => onChange(chip.key), className: clsx("h-7 shrink-0 whitespace-nowrap rounded-full border px-2.5 text-xs font-medium", selected
30
+ ? "border-primary-25 bg-primary-25 text-primary-500"
31
+ : "border-gray-50 bg-white text-gray-900 hover:bg-gray-5"), children: chip.label }, chip.key));
32
+ }) }));
33
+ };
34
+ export default CannedScopeChips;
@@ -0,0 +1,16 @@
1
+ import { CannedResponseVisibleScope } from "../../types/chat";
2
+ import { ICannedResponseItem, IMyTeamResponse } from "../../types/dto";
3
+ export declare const PERSONAL_SCOPE_KEY = "PRIVATE";
4
+ export interface CannedScope {
5
+ key: string;
6
+ visibilityScope: CannedResponseVisibleScope;
7
+ teamId?: string;
8
+ label: string;
9
+ }
10
+ export interface CannedRow extends ICannedResponseItem {
11
+ scopeKey: string;
12
+ scopeLabel: string;
13
+ }
14
+ export declare const buildCannedScopes: (teams: IMyTeamResponse[], personalLabel: string, viewedTeamId?: string) => CannedScope[];
15
+ export declare const mergeCannedResults: (scopes: CannedScope[], results: ICannedResponseItem[][]) => CannedRow[];
16
+ //# sourceMappingURL=cannedScopes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cannedScopes.d.ts","sourceRoot":"","sources":["../../../src/components/canned-response/cannedScopes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnE,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,0BAA0B,CAAC;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAU,SAAQ,mBAAmB;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,eAAO,MAAM,iBAAiB,GAC5B,OAAO,eAAe,EAAE,EACxB,eAAe,MAAM,EACrB,eAAe,MAAM,KACpB,WAAW,EAmBb,CAAC;AAGF,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,WAAW,EAAE,EACrB,SAAS,mBAAmB,EAAE,EAAE,KAC/B,SAAS,EAWX,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { CannedResponseVisibleScope } from "../../types/chat";
2
+ export const PERSONAL_SCOPE_KEY = "PRIVATE";
3
+ // The search endpoint takes one scope per call, so the picker queries each scope.
4
+ // Order is the display order: personal first, then the team being viewed, then the rest.
5
+ export const buildCannedScopes = (teams, personalLabel, viewedTeamId) => {
6
+ const teamScopes = teams.map((team) => ({
7
+ key: team.teamId,
8
+ visibilityScope: CannedResponseVisibleScope.TEAM,
9
+ teamId: team.teamId,
10
+ label: team.name,
11
+ }));
12
+ const viewedIndex = teamScopes.findIndex((scope) => scope.key === viewedTeamId);
13
+ if (viewedIndex > 0) {
14
+ teamScopes.unshift(...teamScopes.splice(viewedIndex, 1));
15
+ }
16
+ return [
17
+ {
18
+ key: PERSONAL_SCOPE_KEY,
19
+ visibilityScope: CannedResponseVisibleScope.PRIVATE,
20
+ label: personalLabel,
21
+ },
22
+ ...teamScopes,
23
+ ];
24
+ };
25
+ // Concatenates per-scope results in scope order and drops repeated ids.
26
+ export const mergeCannedResults = (scopes, results) => {
27
+ const seen = new Set();
28
+ const rows = [];
29
+ scopes.forEach((scope, index) => {
30
+ var _a;
31
+ ((_a = results[index]) !== null && _a !== void 0 ? _a : []).forEach((item) => {
32
+ if (seen.has(item.id))
33
+ return;
34
+ seen.add(item.id);
35
+ rows.push(Object.assign(Object.assign({}, item), { scopeKey: scope.key, scopeLabel: scope.label }));
36
+ });
37
+ });
38
+ return rows;
39
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/canned-response/index.tsx"],"names":[],"mappings":"AASA,UAAU,oBAAoB;IAC5B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,QAAA,MAAM,cAAc,GAAI,kDAIrB,oBAAoB,4CAgDtB,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/canned-response/index.tsx"],"names":[],"mappings":"AAWA,UAAU,oBAAoB;IAC5B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,QAAA,MAAM,cAAc,GAAI,kDAIrB,oBAAoB,4CA0CtB,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -7,28 +7,29 @@ import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext
7
7
  import { $getRoot } from "lexical";
8
8
  import { $generateNodesFromDOM } from "@lexical/html";
9
9
  import CannedResponseFooter from "./CannedResponseFooter";
10
+ import useAuthStore from "../../store/auth";
11
+ import { insertCannedContent } from "./insertCannedContent";
10
12
  const CannedResponse = ({ onClose, openCreateCannedModal, cannedQuery = "", }) => {
11
13
  const [editor] = useLexicalComposerContext();
14
+ const isCrm = useAuthStore((state) => state.isCrm);
12
15
  const [search, setSearch] = useState("");
13
16
  const debouncedSearch = useDebounce(search, {
14
17
  wait: 300,
15
18
  });
16
19
  const onSelectCannedResponse = useCallback((content) => {
20
+ // The composer is shared with BIZ/PDP/Mall, which keep replacing the draft.
21
+ if (isCrm) {
22
+ insertCannedContent(editor, content);
23
+ return;
24
+ }
17
25
  editor.update(() => {
18
26
  const root = $getRoot();
19
- // 1. Clear content cũ
20
27
  root.clear();
21
- // 2. Parse HTML -> DOM
22
- const parser = new DOMParser();
23
- const dom = parser.parseFromString(content, "text/html");
24
- // 3. Convert DOM -> Lexical nodes
25
- const nodes = $generateNodesFromDOM(editor, dom);
26
- // 4. Append vào editor
27
- root.append(...nodes);
28
- // 5. Move cursor về cuối (optional nhưng nên có)
28
+ const dom = new DOMParser().parseFromString(content, "text/html");
29
+ root.append(...$generateNodesFromDOM(editor, dom));
29
30
  root.selectEnd();
30
31
  });
31
- }, [editor]);
32
+ }, [editor, isCrm]);
32
33
  return (_jsxs("div", { className: "w-[600px]", "data-cp-name": "CannedResponse", children: [_jsx(CannedResponseHeader, { onClose: onClose, search: search, setSearch: setSearch }), _jsx(CannedResponseBody, { search: debouncedSearch, onSelectCannedResponse: onSelectCannedResponse, cannedQuery: cannedQuery }), _jsx(CannedResponseFooter, { openCreateCannedModal: openCreateCannedModal })] }));
33
34
  };
34
35
  export default CannedResponse;
@@ -0,0 +1,7 @@
1
+ import { type LexicalEditor } from "lexical";
2
+ /**
3
+ * Inserts a canned reply at the cursor, keeping the draft. The insert is its own
4
+ * undo step so Cmd+Z returns to the draft.
5
+ */
6
+ export declare const insertCannedContent: (editor: LexicalEditor, content: string) => void;
7
+ //# sourceMappingURL=insertCannedContent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insertCannedContent.d.ts","sourceRoot":"","sources":["../../../src/components/canned-response/insertCannedContent.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,SAAS,CAAC;AAkBjB;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,aAAa,EAAE,SAAS,MAAM,SAqBzE,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { $createParagraphNode, $getRoot, $getSelection, $isRangeSelection, $isTextNode, } from "lexical";
2
+ import { $generateNodesFromDOM } from "@lexical/html";
3
+ const TRIGGER_BEFORE_CURSOR = /(^|\s)#\w*$/;
4
+ // Drops the "#shortcut" the agent typed to open the picker, so only the reply stays.
5
+ const $removeTriggerBeforeCursor = () => {
6
+ const selection = $getSelection();
7
+ if (!$isRangeSelection(selection) || !selection.isCollapsed())
8
+ return;
9
+ const { anchor } = selection;
10
+ const node = anchor.getNode();
11
+ if (!$isTextNode(node))
12
+ return;
13
+ const match = node.getTextContent().slice(0, anchor.offset).match(TRIGGER_BEFORE_CURSOR);
14
+ if (!match)
15
+ return;
16
+ const triggerStart = anchor.offset - match[0].replace(/^\s/, "").length;
17
+ node.spliceText(triggerStart, anchor.offset - triggerStart, "", true);
18
+ };
19
+ /**
20
+ * Inserts a canned reply at the cursor, keeping the draft. The insert is its own
21
+ * undo step so Cmd+Z returns to the draft.
22
+ */
23
+ export const insertCannedContent = (editor, content) => {
24
+ editor.update(() => {
25
+ const root = $getRoot();
26
+ const nodes = $generateNodesFromDOM(editor, new DOMParser().parseFromString(content, "text/html"));
27
+ if (!$isRangeSelection($getSelection())) {
28
+ if (root.getTextContentSize() === 0) {
29
+ root.clear();
30
+ root.append($createParagraphNode());
31
+ }
32
+ root.selectEnd();
33
+ }
34
+ $removeTriggerBeforeCursor();
35
+ const selection = $getSelection();
36
+ if ($isRangeSelection(selection))
37
+ selection.insertNodes(nodes);
38
+ }, { tag: "history-push" });
39
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"TeamItem.d.ts","sourceRoot":"","sources":["../../../../src/components/canned-response/team/TeamItem.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAQ9C,UAAU,aAAa;IACrB,IAAI,EAAE,eAAe,CAAC;IACtB,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,QAAA,MAAM,QAAQ,GAAI,8EAMf,aAAa,4CAiFf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"TeamItem.d.ts","sourceRoot":"","sources":["../../../../src/components/canned-response/team/TeamItem.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAQ9C,UAAU,aAAa;IACrB,IAAI,EAAE,eAAe,CAAC;IACtB,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,QAAA,MAAM,QAAQ,GAAI,8EAMf,aAAa,4CAsFf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { clickableProps, FOCUS_RING_CLASS } from "../../../utils/a11yClickable";
2
3
  import { useFetchCannedCategories } from "../../../hooks/canned-response/useFetchCannedCategories";
3
4
  import { useBoolean } from "ahooks";
4
5
  import { Icon } from "../../../components/icon";
@@ -15,17 +16,17 @@ const TeamItem = ({ team, onSelectCategory, selectedTeamId, selectedCategoryId,
15
16
  }
16
17
  toggle();
17
18
  }, [toggle, isOpen, onSelectCategory, team === null || team === void 0 ? void 0 : team.teamId, selectedTeamId]);
18
- return (_jsxs("div", { className: "border-b border-gray-200", "data-cp-name": "TeamItem", children: [_jsxs("div", { className: "flex items-center justify-between py-2 cursor-pointer", onClick: onToggle, children: [_jsx("span", { className: "text-sm font-medium truncate flex-1", children: (team === null || team === void 0 ? void 0 : team.name) || "" }), _jsx(Icon, { icon: isOpen ? "angle-up-b" : "angle-down-b", size: 16, className: clsx(!isOpen && "text-gray-500") })] }), isOpen && (_jsxs("div", { className: "mb-2", children: [_jsx("div", { className: clsx("px-3 py-1 cursor-pointer hover:bg-gray-100 rounded-md", selectedTeamId &&
19
+ return (_jsxs("div", { className: "border-b border-gray-200", "data-cp-name": "TeamItem", children: [_jsxs("div", Object.assign({ className: `flex items-center justify-between py-2 cursor-pointer ${FOCUS_RING_CLASS}` }, clickableProps(onToggle), { "aria-expanded": isOpen, children: [_jsx("span", { className: "text-sm font-medium truncate flex-1", children: (team === null || team === void 0 ? void 0 : team.name) || "" }), _jsx(Icon, { icon: isOpen ? "angle-up-b" : "angle-down-b", size: 16, className: clsx(!isOpen && "text-gray-500") })] })), isOpen && (_jsxs("div", { className: "mb-2", children: [_jsx("div", Object.assign({ className: clsx("px-3 py-1 cursor-pointer hover:bg-gray-100 rounded-md", FOCUS_RING_CLASS, selectedTeamId &&
19
20
  selectedTeamId === (team === null || team === void 0 ? void 0 : team.teamId) &&
20
21
  !selectedCategoryId &&
21
- "bg-gray-100"), onClick: () => onSelectCategory === null || onSelectCategory === void 0 ? void 0 : onSelectCategory(team === null || team === void 0 ? void 0 : team.teamId, undefined), children: _jsx("span", { className: clsx("text-sm truncate", selectedTeamId === (team === null || team === void 0 ? void 0 : team.teamId) && !selectedCategoryId
22
+ "bg-gray-100") }, clickableProps(() => onSelectCategory === null || onSelectCategory === void 0 ? void 0 : onSelectCategory(team === null || team === void 0 ? void 0 : team.teamId, undefined)), { children: _jsx("span", { className: clsx("text-sm truncate", selectedTeamId === (team === null || team === void 0 ? void 0 : team.teamId) && !selectedCategoryId
22
23
  ? "font-medium text-blue-500"
23
- : "text-gray-500"), children: t("all") }) }, `${team.teamId}-all`), categories === null || categories === void 0 ? void 0 : categories.map((category) => {
24
+ : "text-gray-500"), children: t("all") }) }), `${team.teamId}-all`), categories === null || categories === void 0 ? void 0 : categories.map((category) => {
24
25
  const isSelected = selectedTeamId &&
25
26
  selectedCategoryId &&
26
27
  selectedTeamId === (category === null || category === void 0 ? void 0 : category.teamId) &&
27
28
  selectedCategoryId === (category === null || category === void 0 ? void 0 : category.id);
28
- return (_jsx("div", { className: clsx("px-3 py-1 cursor-pointer hover:bg-gray-100 rounded-md", isSelected && "bg-gray-100"), onClick: () => onSelectCategory === null || onSelectCategory === void 0 ? void 0 : onSelectCategory(team === null || team === void 0 ? void 0 : team.teamId, category === null || category === void 0 ? void 0 : category.id), children: _jsx("span", { className: clsx("text-sm truncate", isSelected ? "font-medium text-blue-500" : "text-gray-500"), children: category === null || category === void 0 ? void 0 : category.name }) }, `${team.teamId}-${category.id}`));
29
+ return (_jsx("div", Object.assign({ className: clsx("px-3 py-1 cursor-pointer hover:bg-gray-100 rounded-md", FOCUS_RING_CLASS, isSelected && "bg-gray-100") }, clickableProps(() => onSelectCategory === null || onSelectCategory === void 0 ? void 0 : onSelectCategory(team === null || team === void 0 ? void 0 : team.teamId, category === null || category === void 0 ? void 0 : category.id)), { children: _jsx("span", { className: clsx("text-sm truncate", isSelected ? "font-medium text-blue-500" : "text-gray-500"), children: category === null || category === void 0 ? void 0 : category.name }) }), `${team.teamId}-${category.id}`));
29
30
  })] }))] }));
30
31
  };
31
32
  export default TeamItem;
@@ -1,4 +1,6 @@
1
+ import type { ModalProps } from "antd";
1
2
  import type { ReactNode } from "react";
3
+ import type { StrokeIconName } from "../../components/icon/strokeIconNodes";
2
4
  export interface ConfirmModalProps {
3
5
  open: boolean;
4
6
  title: ReactNode;
@@ -11,8 +13,18 @@ export interface ConfirmModalProps {
11
13
  okButtonProps?: {
12
14
  disabled?: boolean;
13
15
  };
16
+ /** CRM only: danger icon beside the title and a solid danger OK button. */
17
+ destructive?: boolean;
18
+ /** CRM only: line under the body, e.g. "Không thể hoàn tác.". */
19
+ warning?: ReactNode;
20
+ /** CRM only: line icon before the OK label. */
21
+ okIcon?: StrokeIconName;
22
+ /** CRM only: muted text at the left of the footer, before the buttons. */
23
+ footerNote?: ReactNode;
24
+ /** Where the modal mounts; defaults to inline (`false`). */
25
+ getContainer?: ModalProps["getContainer"];
14
26
  children: ReactNode;
15
27
  }
16
- declare const ConfirmModal: ({ open, title, okText, cancelText, onOk, onCancel, okType, confirmLoading, okButtonProps, children, }: ConfirmModalProps) => import("react/jsx-runtime").JSX.Element;
28
+ declare const ConfirmModal: ({ open, title, okText, cancelText, onOk, onCancel, okType, confirmLoading, okButtonProps, destructive, okIcon, warning, footerNote, getContainer, children, }: ConfirmModalProps) => import("react/jsx-runtime").JSX.Element;
17
29
  export default ConfirmModal;
18
30
  //# sourceMappingURL=ConfirmModal.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConfirmModal.d.ts","sourceRoot":"","sources":["../../../src/components/common/ConfirmModal.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,SAAS,CAAC;IACtB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACvC,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,QAAA,MAAM,YAAY,GAAI,uGAWnB,iBAAiB,4CAkCnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"ConfirmModal.d.ts","sourceRoot":"","sources":["../../../src/components/common/ConfirmModal.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,SAAS,CAAC;IACtB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACvC,2EAA2E;IAC3E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iEAAiE;IACjE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;IAC1C,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,QAAA,MAAM,YAAY,GAAI,+JAgBnB,iBAAiB,4CAoFnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -1,15 +1,33 @@
1
1
  "use client";
2
- import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { Modal } from "antd";
4
- const ConfirmModal = ({ open, title, okText, cancelText, onOk, onCancel, okType = "primary", confirmLoading, okButtonProps, children, }) => {
5
- return (_jsx(Modal, { "data-cp-name": "ConfirmModal", centered: true, open: open, onOk: onOk, onCancel: onCancel, okText: okText, cancelText: cancelText, confirmLoading: confirmLoading, okButtonProps: Object.assign(Object.assign({}, okButtonProps), { className: okType === "danger"
4
+ import useAuthStore from "../../store/auth";
5
+ import { StrokeIcon } from "../../components/icon/StrokeIcon";
6
+ const ConfirmModal = ({ open, title, okText, cancelText, onOk, onCancel, okType = "primary", confirmLoading, okButtonProps, destructive = false, okIcon, warning, footerNote, getContainer = false, children, }) => {
7
+ // CRM takes header/body/footer and button styling from its antd theme;
8
+ // other hosts keep this component's own look.
9
+ const isCrm = useAuthStore((state) => state.isCrm);
10
+ const isDanger = destructive || okType === "danger";
11
+ const crmTitle = destructive ? (_jsxs("span", { className: "flex items-center gap-3", children: [_jsx("span", { "aria-hidden": "true", className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-danger-25 text-danger-600", children: _jsx(StrokeIcon, { name: "alert-triangle", size: 20 }) }), title] })) : (title);
12
+ const crmFooter = footerNote
13
+ ? (_, { OkBtn, CancelBtn }) => (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "min-w-0 flex-1 text-left text-[13px] text-gray-600", children: footerNote }), _jsx(CancelBtn, {}), _jsx(OkBtn, {})] }))
14
+ : undefined;
15
+ const lookProps = isCrm
16
+ ? Object.assign({ okType: isDanger ? "primary" : okType, okButtonProps: Object.assign(Object.assign(Object.assign({}, okButtonProps), (isDanger && { danger: true })), (okIcon && { icon: _jsx(StrokeIcon, { name: okIcon, size: 18 }) })), title: crmTitle }, (crmFooter ? { footer: crmFooter } : {})) : {
17
+ okButtonProps: Object.assign(Object.assign({}, okButtonProps), { className: okType === "danger"
6
18
  ? "!h-10 !rounded-lg !border-danger-400 !bg-danger-400 !text-white hover:!border-danger-300 hover:!bg-danger-300"
7
- : "!h-10 !rounded-lg !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)]" }), cancelButtonProps: {
19
+ : "!h-10 !rounded-lg !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)]" }),
20
+ cancelButtonProps: {
8
21
  className: "!h-10 !rounded-lg !border-gray-25 !bg-gray-25 !text-gray-900",
9
- }, styles: {
22
+ },
23
+ styles: {
10
24
  header: { textAlign: "center", marginBottom: 0 },
11
25
  footer: { marginTop: 16 },
12
26
  body: { paddingTop: 4 },
13
- }, classNames: { footer: "border-t border-gray-25 pt-4" }, title: _jsx("span", { className: "text-[18px] font-bold text-gray-900", children: title }), getContainer: false, forceRender: true, children: children }));
27
+ },
28
+ classNames: { footer: "border-t border-gray-25 pt-4" },
29
+ title: _jsx("span", { className: "text-[18px] font-bold text-gray-900", children: title }),
30
+ };
31
+ return (_jsxs(Modal, Object.assign({ "data-cp-name": "ConfirmModal", centered: true, open: open, onOk: onOk, onCancel: onCancel, okText: okText, cancelText: cancelText, confirmLoading: confirmLoading, getContainer: getContainer, forceRender: !isCrm, destroyOnHidden: isCrm }, lookProps, { children: [children, isCrm && warning && (_jsxs("p", { className: "mt-4 flex items-center gap-1.5 text-[13px] font-medium text-danger-600", children: [_jsx(StrokeIcon, { name: "alert-circle", size: 16 }), warning] }))] })));
14
32
  };
15
33
  export default ConfirmModal;
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from "react";
2
+ interface DeskPanelDrawerProps {
3
+ open: boolean;
4
+ label: string;
5
+ onClose: () => void;
6
+ /** Positioned element the drawer and its scrim mount into; in place when missing. */
7
+ container?: HTMLElement | null;
8
+ /** Off when the panel focuses its own field on open. */
9
+ autoFocus?: boolean;
10
+ /** Off while a layer inside the drawer should take Esc first. */
11
+ keyboard?: boolean;
12
+ children: ReactNode;
13
+ }
14
+ /** Overlay drawer for a desk side panel (inset 8px, rounded, light scrim). Sits below modals opened from it. */
15
+ declare const DeskPanelDrawer: ({ open, label, onClose, container, autoFocus, keyboard, children, }: DeskPanelDrawerProps) => import("react/jsx-runtime").JSX.Element;
16
+ export default DeskPanelDrawer;
17
+ //# sourceMappingURL=DeskPanelDrawer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeskPanelDrawer.d.ts","sourceRoot":"","sources":["../../../src/components/common/DeskPanelDrawer.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,UAAU,oBAAoB;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,qFAAqF;IACrF,SAAS,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC/B,wDAAwD;IACxD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,gHAAgH;AAChH,QAAA,MAAM,eAAe,GAAI,qEAQtB,oBAAoB,4CA+BtB,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { Drawer } from "antd";
4
+ import { LAYOUT_WIDTHS } from "../../constants/layout";
5
+ /** Overlay drawer for a desk side panel (inset 8px, rounded, light scrim). Sits below modals opened from it. */
6
+ const DeskPanelDrawer = ({ open, label, onClose, container, autoFocus = true, keyboard = true, children, }) => (_jsx(Drawer, { open: open, "aria-label": label, onClose: onClose, autoFocus: autoFocus, keyboard: keyboard,
7
+ // antd slides a drawer 180px aside when one opens inside it; panels here stack in place.
8
+ push: false, destroyOnHidden: true, closeIcon: false, getContainer: container !== null && container !== void 0 ? container : false, rootStyle: { position: "absolute" }, zIndex: 900, width: LAYOUT_WIDTHS.infoDrawer, styles: {
9
+ mask: { background: "rgba(57, 62, 64, 0.16)" },
10
+ wrapper: {
11
+ top: 8,
12
+ right: 8,
13
+ bottom: 8,
14
+ height: "auto",
15
+ borderRadius: 12,
16
+ overflow: "hidden",
17
+ boxShadow: "0 8px 24px rgba(57, 62, 64, 0.16)",
18
+ },
19
+ body: { padding: 0, background: "transparent" },
20
+ }, children: children }));
21
+ export default DeskPanelDrawer;
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from "react";
2
+ interface DeskSidePanelProps {
3
+ open: boolean;
4
+ label: string;
5
+ onClose: () => void;
6
+ /** Off when the panel focuses its own field on open. */
7
+ autoFocus?: boolean;
8
+ /** Receives `true` when the panel sits inline in the workspace row. */
9
+ children: (isInline: boolean) => ReactNode;
10
+ }
11
+ /**
12
+ * CRM desk side panel opened from the chat header (members, search, library, info):
13
+ * an inline column where the workspace has room, otherwise an inset drawer over it.
14
+ */
15
+ declare const DeskSidePanel: ({ open, label, onClose, autoFocus, children, }: DeskSidePanelProps) => import("react/jsx-runtime").JSX.Element | null;
16
+ export default DeskSidePanel;
17
+ //# sourceMappingURL=DeskSidePanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeskSidePanel.d.ts","sourceRoot":"","sources":["../../../src/components/common/DeskSidePanel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,UAAU,kBAAkB;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,wDAAwD;IACxD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uEAAuE;IACvE,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,SAAS,CAAC;CAC5C;AAED;;;GAGG;AACH,QAAA,MAAM,aAAa,GAAI,gDAMpB,kBAAkB,mDAiCpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,23 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createPortal } from "react-dom";
4
+ import useDeskPanelHostStore from "../../store/deskPanelHost";
5
+ import { LAYOUT_WIDTHS } from "../../constants/layout";
6
+ import DeskPanelDrawer from "./DeskPanelDrawer";
7
+ /**
8
+ * CRM desk side panel opened from the chat header (members, search, library, info):
9
+ * an inline column where the workspace has room, otherwise an inset drawer over it.
10
+ */
11
+ const DeskSidePanel = ({ open, label, onClose, autoFocus, children, }) => {
12
+ const host = useDeskPanelHostStore();
13
+ if (host.isInline && host.slot) {
14
+ return open
15
+ ? createPortal(_jsx("aside", { "aria-label": label, className: "h-full shrink-0 overflow-hidden rounded-xl bg-white shadow-sm", style: { width: LAYOUT_WIDTHS.infoInline }, children: children(true) }), host.slot)
16
+ : null;
17
+ }
18
+ if (host.workspace) {
19
+ return (_jsx(DeskPanelDrawer, { open: open, label: label, onClose: onClose, container: host.workspace, autoFocus: autoFocus, children: _jsx("div", { className: "h-full overflow-hidden rounded-xl bg-white", children: children(false) }) }));
20
+ }
21
+ return null;
22
+ };
23
+ export default DeskSidePanel;
@@ -0,0 +1,11 @@
1
+ interface TintedAvatarProps {
2
+ name: string;
3
+ src?: string | null;
4
+ size: number;
5
+ className?: string;
6
+ testId?: string;
7
+ }
8
+ /** CRM avatar: the photo when it loads, otherwise initials on one of the five mockup tints. */
9
+ declare const TintedAvatar: ({ name, src, size, className, testId, }: TintedAvatarProps) => import("react/jsx-runtime").JSX.Element;
10
+ export default TintedAvatar;
11
+ //# sourceMappingURL=TintedAvatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TintedAvatar.d.ts","sourceRoot":"","sources":["../../../src/components/common/TintedAvatar.tsx"],"names":[],"mappings":"AAKA,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,+FAA+F;AAC/F,QAAA,MAAM,YAAY,GAAI,yCAMnB,iBAAiB,4CA6BnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,17 @@
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
+ /** CRM avatar: the photo when it loads, otherwise initials on one of the five mockup tints. */
7
+ const TintedAvatar = ({ name, src, size, className, testId = "tinted-avatar-initials", }) => {
8
+ const [failedSrc, setFailedSrc] = useState(null);
9
+ const dimension = { width: size, height: size };
10
+ if (src && src !== failedSrc) {
11
+ return (
12
+ // eslint-disable-next-line @next/next/no-img-element
13
+ _jsx("img", { src: src, alt: "", style: dimension, className: clsx("shrink-0 rounded-full object-cover", className), onError: () => setFailedSrc(src) }));
14
+ }
15
+ return (_jsx("span", { "aria-hidden": "true", "data-testid": testId, style: Object.assign(Object.assign({}, dimension), { fontSize: Math.round(size * 0.35) }), className: clsx("flex shrink-0 items-center justify-center rounded-full font-semibold", getAvatarTint(name), className), children: getInitials(name) }));
16
+ };
17
+ export default TintedAvatar;