@droppii-org/chat-sdk 0.6.56 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (435) hide show
  1. package/dist/components/canned-response/CannedResponseBody.d.ts.map +1 -1
  2. package/dist/components/canned-response/CannedResponseBody.js +4 -3
  3. package/dist/components/canned-response/CannedResponsePanel.d.ts +9 -0
  4. package/dist/components/canned-response/CannedResponsePanel.d.ts.map +1 -0
  5. package/dist/components/canned-response/CannedResponsePanel.js +72 -0
  6. package/dist/components/canned-response/CannedResponseRow.d.ts +10 -0
  7. package/dist/components/canned-response/CannedResponseRow.d.ts.map +1 -0
  8. package/dist/components/canned-response/CannedResponseRow.js +6 -0
  9. package/dist/components/canned-response/CannedScopeChips.d.ts +10 -0
  10. package/dist/components/canned-response/CannedScopeChips.d.ts.map +1 -0
  11. package/dist/components/canned-response/CannedScopeChips.js +34 -0
  12. package/dist/components/canned-response/cannedScopes.d.ts +16 -0
  13. package/dist/components/canned-response/cannedScopes.d.ts.map +1 -0
  14. package/dist/components/canned-response/cannedScopes.js +39 -0
  15. package/dist/components/canned-response/index.d.ts.map +1 -1
  16. package/dist/components/canned-response/index.js +11 -10
  17. package/dist/components/canned-response/insertCannedContent.d.ts +7 -0
  18. package/dist/components/canned-response/insertCannedContent.d.ts.map +1 -0
  19. package/dist/components/canned-response/insertCannedContent.js +39 -0
  20. package/dist/components/canned-response/team/TeamItem.d.ts.map +1 -1
  21. package/dist/components/canned-response/team/TeamItem.js +5 -4
  22. package/dist/components/common/ConfirmModal.d.ts +13 -1
  23. package/dist/components/common/ConfirmModal.d.ts.map +1 -1
  24. package/dist/components/common/ConfirmModal.js +24 -6
  25. package/dist/components/common/DeskPanelDrawer.d.ts +17 -0
  26. package/dist/components/common/DeskPanelDrawer.d.ts.map +1 -0
  27. package/dist/components/common/DeskPanelDrawer.js +21 -0
  28. package/dist/components/common/DeskSidePanel.d.ts +17 -0
  29. package/dist/components/common/DeskSidePanel.d.ts.map +1 -0
  30. package/dist/components/common/DeskSidePanel.js +23 -0
  31. package/dist/components/common/TintedAvatar.d.ts +11 -0
  32. package/dist/components/common/TintedAvatar.d.ts.map +1 -0
  33. package/dist/components/common/TintedAvatar.js +17 -0
  34. package/dist/components/compose/ComposeNewMessageModal.d.ts.map +1 -1
  35. package/dist/components/compose/ComposeNewMessageModal.js +11 -1
  36. package/dist/components/conversation/ConversationByGroupItem.d.ts.map +1 -1
  37. package/dist/components/conversation/ConversationByGroupItem.js +10 -6
  38. package/dist/components/conversation/ConversationBySessionItem.d.ts +4 -1
  39. package/dist/components/conversation/ConversationBySessionItem.d.ts.map +1 -1
  40. package/dist/components/conversation/ConversationBySessionItem.js +36 -10
  41. package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
  42. package/dist/components/conversation/DeskConversationList.js +44 -29
  43. package/dist/components/conversation/DeskConversationRow.d.ts +19 -0
  44. package/dist/components/conversation/DeskConversationRow.d.ts.map +1 -0
  45. package/dist/components/conversation/DeskConversationRow.js +18 -0
  46. package/dist/components/conversation/DeskListEmptyState.d.ts +6 -0
  47. package/dist/components/conversation/DeskListEmptyState.d.ts.map +1 -0
  48. package/dist/components/conversation/DeskListEmptyState.js +11 -0
  49. package/dist/components/conversation/DeskListHeader.d.ts +14 -0
  50. package/dist/components/conversation/DeskListHeader.d.ts.map +1 -0
  51. package/dist/components/conversation/DeskListHeader.js +39 -0
  52. package/dist/components/conversation/DeskListSkeleton.d.ts +6 -0
  53. package/dist/components/conversation/DeskListSkeleton.d.ts.map +1 -0
  54. package/dist/components/conversation/DeskListSkeleton.js +9 -0
  55. package/dist/components/conversation/DeskRowAvatar.d.ts +8 -0
  56. package/dist/components/conversation/DeskRowAvatar.d.ts.map +1 -0
  57. package/dist/components/conversation/DeskRowAvatar.js +6 -0
  58. package/dist/components/conversation/RowChip.d.ts +14 -0
  59. package/dist/components/conversation/RowChip.d.ts.map +1 -0
  60. package/dist/components/conversation/RowChip.js +11 -0
  61. package/dist/components/conversation/avatarTint.d.ts +6 -0
  62. package/dist/components/conversation/avatarTint.d.ts.map +1 -0
  63. package/dist/components/conversation/avatarTint.js +27 -0
  64. package/dist/components/conversation/folderEmptyState.d.ts +2 -0
  65. package/dist/components/conversation/folderEmptyState.d.ts.map +1 -0
  66. package/dist/components/conversation/folderEmptyState.js +14 -0
  67. package/dist/components/conversation/internalNotePreview.d.ts +6 -0
  68. package/dist/components/conversation/internalNotePreview.d.ts.map +1 -0
  69. package/dist/components/conversation/internalNotePreview.js +11 -0
  70. package/dist/components/conversation/listHeading.d.ts +19 -0
  71. package/dist/components/conversation/listHeading.d.ts.map +1 -0
  72. package/dist/components/conversation/listHeading.js +24 -0
  73. package/dist/components/conversation/rowDisplayName.d.ts +7 -0
  74. package/dist/components/conversation/rowDisplayName.d.ts.map +1 -0
  75. package/dist/components/conversation/rowDisplayName.js +8 -0
  76. package/dist/components/conversation/rowTime.d.ts +4 -0
  77. package/dist/components/conversation/rowTime.d.ts.map +1 -0
  78. package/dist/components/conversation/rowTime.js +10 -0
  79. package/dist/components/conversation-detail/PinLimitModal.d.ts.map +1 -1
  80. package/dist/components/conversation-detail/PinLimitModal.js +3 -1
  81. package/dist/components/group/AddMemberModal.d.ts.map +1 -1
  82. package/dist/components/group/AddMemberModal.js +15 -4
  83. package/dist/components/group/AdminPermissionModal.d.ts +1 -0
  84. package/dist/components/group/AdminPermissionModal.d.ts.map +1 -1
  85. package/dist/components/group/AdminPermissionModal.js +38 -3
  86. package/dist/components/group/CreateGroupForm.d.ts +3 -1
  87. package/dist/components/group/CreateGroupForm.d.ts.map +1 -1
  88. package/dist/components/group/CreateGroupForm.js +7 -1
  89. package/dist/components/group/CreateGroupFormCrmView.d.ts +23 -0
  90. package/dist/components/group/CreateGroupFormCrmView.d.ts.map +1 -0
  91. package/dist/components/group/CreateGroupFormCrmView.js +25 -0
  92. package/dist/components/group/DisableSendPermissionConfirm.d.ts +11 -0
  93. package/dist/components/group/DisableSendPermissionConfirm.d.ts.map +1 -0
  94. package/dist/components/group/DisableSendPermissionConfirm.js +10 -0
  95. package/dist/components/group/GroupCompositeAvatar.d.ts.map +1 -1
  96. package/dist/components/group/GroupCompositeAvatar.js +39 -4
  97. package/dist/components/group/GroupMemberPicker.d.ts +5 -2
  98. package/dist/components/group/GroupMemberPicker.d.ts.map +1 -1
  99. package/dist/components/group/GroupMemberPicker.js +8 -42
  100. package/dist/components/group/GroupMemberPickerCrm.d.ts +4 -0
  101. package/dist/components/group/GroupMemberPickerCrm.d.ts.map +1 -0
  102. package/dist/components/group/GroupMemberPickerCrm.js +48 -0
  103. package/dist/components/group/GroupMemberPickerLegacy.d.ts +8 -0
  104. package/dist/components/group/GroupMemberPickerLegacy.d.ts.map +1 -0
  105. package/dist/components/group/GroupMemberPickerLegacy.js +46 -0
  106. package/dist/components/group/GroupPanelHeader.d.ts +10 -0
  107. package/dist/components/group/GroupPanelHeader.d.ts.map +1 -0
  108. package/dist/components/group/GroupPanelHeader.js +11 -0
  109. package/dist/components/group/MemberPermissionPanel.d.ts.map +1 -1
  110. package/dist/components/group/MemberPermissionPanel.js +31 -2
  111. package/dist/components/group/PermissionPanelCrm.d.ts +24 -0
  112. package/dist/components/group/PermissionPanelCrm.d.ts.map +1 -0
  113. package/dist/components/group/PermissionPanelCrm.js +16 -0
  114. package/dist/components/group/PersonAvatar.d.ts +11 -0
  115. package/dist/components/group/PersonAvatar.d.ts.map +1 -0
  116. package/dist/components/group/PersonAvatar.js +21 -0
  117. package/dist/components/group/crmIcon.d.ts +9 -0
  118. package/dist/components/group/crmIcon.d.ts.map +1 -0
  119. package/dist/components/group/crmIcon.js +38 -0
  120. package/dist/components/icon/AdaptiveIcon.d.ts +15 -0
  121. package/dist/components/icon/AdaptiveIcon.d.ts.map +1 -0
  122. package/dist/components/icon/AdaptiveIcon.js +10 -0
  123. package/dist/components/icon/StrokeIcon.d.ts +14 -0
  124. package/dist/components/icon/StrokeIcon.d.ts.map +1 -0
  125. package/dist/components/icon/StrokeIcon.js +5 -0
  126. package/dist/components/icon/strokeIconNodes.d.ts +431 -0
  127. package/dist/components/icon/strokeIconNodes.d.ts.map +1 -0
  128. package/dist/components/icon/strokeIconNodes.js +269 -0
  129. package/dist/components/media-collection/index.d.ts.map +1 -1
  130. package/dist/components/media-collection/index.js +21 -5
  131. package/dist/components/message/GroupMembersDrawer.d.ts.map +1 -1
  132. package/dist/components/message/GroupMembersDrawer.js +60 -13
  133. package/dist/components/message/GroupMembersPanelCrm.d.ts +23 -0
  134. package/dist/components/message/GroupMembersPanelCrm.d.ts.map +1 -0
  135. package/dist/components/message/GroupMembersPanelCrm.js +55 -0
  136. package/dist/components/message/MessageHeader.d.ts.map +1 -1
  137. package/dist/components/message/MessageHeader.js +76 -27
  138. package/dist/components/message/MessageInfiniteScroll.d.ts +4 -2
  139. package/dist/components/message/MessageInfiniteScroll.d.ts.map +1 -1
  140. package/dist/components/message/MessageInfiniteScroll.js +1 -1
  141. package/dist/components/message/MessageList.d.ts +2 -1
  142. package/dist/components/message/MessageList.d.ts.map +1 -1
  143. package/dist/components/message/MessageList.js +12 -1
  144. package/dist/components/message/SelectSession.d.ts +4 -1
  145. package/dist/components/message/SelectSession.d.ts.map +1 -1
  146. package/dist/components/message/SelectSession.js +13 -4
  147. package/dist/components/message/UnassignedSessionFooter.js +2 -2
  148. package/dist/components/message/footer/ActionBar.d.ts +5 -1
  149. package/dist/components/message/footer/ActionBar.d.ts.map +1 -1
  150. package/dist/components/message/footer/ActionBar.js +14 -1
  151. package/dist/components/message/footer/CannedResponsePlugin.d.ts.map +1 -1
  152. package/dist/components/message/footer/CannedResponsePlugin.js +18 -3
  153. package/dist/components/message/footer/ClosedSessionBanner.d.ts +9 -0
  154. package/dist/components/message/footer/ClosedSessionBanner.d.ts.map +1 -0
  155. package/dist/components/message/footer/ClosedSessionBanner.js +13 -0
  156. package/dist/components/message/footer/ComposerEditor.d.ts.map +1 -1
  157. package/dist/components/message/footer/ComposerEditor.js +9 -4
  158. package/dist/components/message/footer/ComposerTabs.d.ts +1 -2
  159. package/dist/components/message/footer/ComposerTabs.d.ts.map +1 -1
  160. package/dist/components/message/footer/ComposerTabs.js +14 -35
  161. package/dist/components/message/footer/CrmComposerCard.d.ts +11 -0
  162. package/dist/components/message/footer/CrmComposerCard.d.ts.map +1 -0
  163. package/dist/components/message/footer/CrmComposerCard.js +30 -0
  164. package/dist/components/message/footer/EnterHandler.d.ts.map +1 -1
  165. package/dist/components/message/footer/EnterHandler.js +3 -0
  166. package/dist/components/message/footer/FilePreview.js +2 -2
  167. package/dist/components/message/footer/LinkInputPreview.js +2 -2
  168. package/dist/components/message/footer/MediaActions.d.ts +2 -1
  169. package/dist/components/message/footer/MediaActions.d.ts.map +1 -1
  170. package/dist/components/message/footer/MediaActions.js +21 -4
  171. package/dist/components/message/footer/SessionClosedModal.d.ts +3 -1
  172. package/dist/components/message/footer/SessionClosedModal.d.ts.map +1 -1
  173. package/dist/components/message/footer/SessionClosedModal.js +6 -2
  174. package/dist/components/message/footer/ToolbarPlugin.d.ts +3 -1
  175. package/dist/components/message/footer/ToolbarPlugin.d.ts.map +1 -1
  176. package/dist/components/message/footer/ToolbarPlugin.js +2 -2
  177. package/dist/components/message/footer/clearComposerHistory.d.ts +3 -0
  178. package/dist/components/message/footer/clearComposerHistory.d.ts.map +1 -0
  179. package/dist/components/message/footer/clearComposerHistory.js +11 -0
  180. package/dist/components/message/footer/index.d.ts +2 -2
  181. package/dist/components/message/footer/index.d.ts.map +1 -1
  182. package/dist/components/message/footer/index.js +15 -5
  183. package/dist/components/message/footer/mention/MentionMenu.d.ts.map +1 -1
  184. package/dist/components/message/footer/mention/MentionMenu.js +4 -1
  185. package/dist/components/message/footer/useComposerFocusRequest.d.ts +10 -0
  186. package/dist/components/message/footer/useComposerFocusRequest.d.ts.map +1 -0
  187. package/dist/components/message/footer/useComposerFocusRequest.js +28 -0
  188. package/dist/components/message/groupMemberMenuCrm.d.ts +32 -0
  189. package/dist/components/message/groupMemberMenuCrm.d.ts.map +1 -0
  190. package/dist/components/message/groupMemberMenuCrm.js +83 -0
  191. package/dist/components/message/groupMemberTypes.d.ts +13 -0
  192. package/dist/components/message/groupMemberTypes.d.ts.map +1 -0
  193. package/dist/components/message/groupMemberTypes.js +1 -0
  194. package/dist/components/message/headerIconButton.d.ts +10 -0
  195. package/dist/components/message/headerIconButton.d.ts.map +1 -0
  196. package/dist/components/message/headerIconButton.js +9 -0
  197. package/dist/components/message/item/CrmSystemLine.d.ts +10 -0
  198. package/dist/components/message/item/CrmSystemLine.d.ts.map +1 -0
  199. package/dist/components/message/item/CrmSystemLine.js +6 -0
  200. package/dist/components/message/item/DateDivider.d.ts +5 -0
  201. package/dist/components/message/item/DateDivider.d.ts.map +1 -0
  202. package/dist/components/message/item/DateDivider.js +5 -0
  203. package/dist/components/message/item/GroupNotificationMessage.d.ts.map +1 -1
  204. package/dist/components/message/item/GroupNotificationMessage.js +9 -0
  205. package/dist/components/message/item/MemberEventSummary.d.ts +8 -0
  206. package/dist/components/message/item/MemberEventSummary.d.ts.map +1 -0
  207. package/dist/components/message/item/MemberEventSummary.js +18 -0
  208. package/dist/components/message/item/MessageBubble.d.ts +3 -1
  209. package/dist/components/message/item/MessageBubble.d.ts.map +1 -1
  210. package/dist/components/message/item/MessageBubble.js +27 -13
  211. package/dist/components/message/item/MessageMoreButton.d.ts +13 -0
  212. package/dist/components/message/item/MessageMoreButton.d.ts.map +1 -0
  213. package/dist/components/message/item/MessageMoreButton.js +42 -0
  214. package/dist/components/message/item/RevokeMessage.js +1 -1
  215. package/dist/components/message/item/SessionEventMessage.d.ts.map +1 -1
  216. package/dist/components/message/item/SessionEventMessage.js +13 -1
  217. package/dist/components/message/item/SystemLogMessage.d.ts.map +1 -1
  218. package/dist/components/message/item/SystemLogMessage.js +7 -0
  219. package/dist/components/message/item/index.d.ts.map +1 -1
  220. package/dist/components/message/item/index.js +64 -15
  221. package/dist/components/message/item/otherSenders.d.ts +7 -0
  222. package/dist/components/message/item/otherSenders.d.ts.map +1 -0
  223. package/dist/components/message/item/otherSenders.js +29 -0
  224. package/dist/components/message/item/textStyle.d.ts +1 -1
  225. package/dist/components/message/item/textStyle.d.ts.map +1 -1
  226. package/dist/components/message/item/textStyle.js +2 -2
  227. package/dist/components/message/messageKeyboardNav.d.ts +8 -0
  228. package/dist/components/message/messageKeyboardNav.d.ts.map +1 -0
  229. package/dist/components/message/messageKeyboardNav.js +24 -0
  230. package/dist/components/message/reply/ReplyPreviewBar.js +2 -2
  231. package/dist/components/message/toolbox/MessageToolboxMenu.d.ts.map +1 -1
  232. package/dist/components/message/toolbox/MessageToolboxMenu.js +16 -1
  233. package/dist/components/search-conversation/SearchAll.d.ts.map +1 -1
  234. package/dist/components/search-conversation/SearchAll.js +12 -1
  235. package/dist/components/search-conversation/SearchDrawer.d.ts.map +1 -1
  236. package/dist/components/search-conversation/SearchDrawer.js +31 -15
  237. package/dist/components/search-conversation/SearchMessageOnCurrentConversation.d.ts.map +1 -1
  238. package/dist/components/search-conversation/SearchMessageOnCurrentConversation.js +5 -2
  239. package/dist/components/search-conversation/index.d.ts.map +1 -1
  240. package/dist/components/search-conversation/index.js +3 -1
  241. package/dist/components/search-conversation/item/SearchItemAsGroup.d.ts.map +1 -1
  242. package/dist/components/search-conversation/item/SearchItemAsGroup.js +14 -4
  243. package/dist/components/search-conversation/item/SearchItemAsMessage.d.ts.map +1 -1
  244. package/dist/components/search-conversation/item/SearchItemAsMessage.js +18 -7
  245. package/dist/components/search-conversation/item/SearchItemAsUser.d.ts.map +1 -1
  246. package/dist/components/search-conversation/item/SearchItemAsUser.js +23 -5
  247. package/dist/components/search-conversation/item/searchRowClass.d.ts +3 -0
  248. package/dist/components/search-conversation/item/searchRowClass.d.ts.map +1 -0
  249. package/dist/components/search-conversation/item/searchRowClass.js +5 -0
  250. package/dist/components/session/DeskAssignedSession.d.ts +5 -1
  251. package/dist/components/session/DeskAssignedSession.d.ts.map +1 -1
  252. package/dist/components/session/DeskAssignedSession.js +40 -12
  253. package/dist/components/session/DeskTeamInbox.d.ts.map +1 -1
  254. package/dist/components/session/DeskTeamInbox.js +15 -22
  255. package/dist/components/session/FolderRow.d.ts +21 -0
  256. package/dist/components/session/FolderRow.d.ts.map +1 -0
  257. package/dist/components/session/FolderRow.js +16 -0
  258. package/dist/components/session/SessionFolderList.d.ts +23 -0
  259. package/dist/components/session/SessionFolderList.d.ts.map +1 -0
  260. package/dist/components/session/SessionFolderList.js +27 -0
  261. package/dist/components/session/sessionFilters.d.ts +24 -0
  262. package/dist/components/session/sessionFilters.d.ts.map +1 -0
  263. package/dist/components/session/sessionFilters.js +80 -0
  264. package/dist/components/shortcut-help/ShortcutHelpModal.d.ts +8 -0
  265. package/dist/components/shortcut-help/ShortcutHelpModal.d.ts.map +1 -0
  266. package/dist/components/shortcut-help/ShortcutHelpModal.js +23 -0
  267. package/dist/components/thread/AssignConfirmModal.d.ts.map +1 -1
  268. package/dist/components/thread/AssignConfirmModal.js +4 -3
  269. package/dist/components/thread/EndSessionConfirm.d.ts +11 -0
  270. package/dist/components/thread/EndSessionConfirm.d.ts.map +1 -0
  271. package/dist/components/thread/EndSessionConfirm.js +31 -0
  272. package/dist/components/thread/EndSessionToast.d.ts +6 -0
  273. package/dist/components/thread/EndSessionToast.d.ts.map +1 -0
  274. package/dist/components/thread/EndSessionToast.js +18 -0
  275. package/dist/components/thread/GroupInfoBodyCrm.d.ts +46 -0
  276. package/dist/components/thread/GroupInfoBodyCrm.d.ts.map +1 -0
  277. package/dist/components/thread/GroupInfoBodyCrm.js +41 -0
  278. package/dist/components/thread/GroupInfoRows.d.ts +33 -0
  279. package/dist/components/thread/GroupInfoRows.d.ts.map +1 -0
  280. package/dist/components/thread/GroupInfoRows.js +18 -0
  281. package/dist/components/thread/GroupThreadInfo.d.ts.map +1 -1
  282. package/dist/components/thread/GroupThreadInfo.js +23 -6
  283. package/dist/components/thread/ManualAssignPopover.d.ts +3 -1
  284. package/dist/components/thread/ManualAssignPopover.d.ts.map +1 -1
  285. package/dist/components/thread/ManualAssignPopover.js +21 -9
  286. package/dist/components/thread/SessionDetailCard.d.ts +6 -0
  287. package/dist/components/thread/SessionDetailCard.d.ts.map +1 -0
  288. package/dist/components/thread/SessionDetailCard.js +103 -0
  289. package/dist/components/thread/SessionSection.d.ts +2 -4
  290. package/dist/components/thread/SessionSection.d.ts.map +1 -1
  291. package/dist/components/thread/SessionSection.js +19 -122
  292. package/dist/components/thread/SessionTagPicker.d.ts +11 -0
  293. package/dist/components/thread/SessionTagPicker.d.ts.map +1 -0
  294. package/dist/components/thread/SessionTagPicker.js +27 -0
  295. package/dist/components/thread/SingleThreadInfo.d.ts.map +1 -1
  296. package/dist/components/thread/SingleThreadInfo.js +16 -6
  297. package/dist/components/thread/SupportSessionPanel.d.ts +18 -0
  298. package/dist/components/thread/SupportSessionPanel.d.ts.map +1 -0
  299. package/dist/components/thread/SupportSessionPanel.js +46 -0
  300. package/dist/components/thread/ThreadInfo.d.ts +8 -1
  301. package/dist/components/thread/ThreadInfo.d.ts.map +1 -1
  302. package/dist/components/thread/ThreadInfo.js +27 -29
  303. package/dist/components/thread/ThreadInfoHeader.d.ts +13 -0
  304. package/dist/components/thread/ThreadInfoHeader.d.ts.map +1 -0
  305. package/dist/components/thread/ThreadInfoHeader.js +11 -0
  306. package/dist/components/thread/UserSection.d.ts.map +1 -1
  307. package/dist/components/thread/UserSection.js +35 -22
  308. package/dist/components/thread/sessionDateFormat.d.ts +3 -0
  309. package/dist/components/thread/sessionDateFormat.d.ts.map +1 -0
  310. package/dist/components/thread/sessionDateFormat.js +13 -0
  311. package/dist/components/thread/sessionDuration.d.ts +5 -0
  312. package/dist/components/thread/sessionDuration.d.ts.map +1 -0
  313. package/dist/components/thread/sessionDuration.js +24 -0
  314. package/dist/constants/index.d.ts +1 -0
  315. package/dist/constants/index.d.ts.map +1 -1
  316. package/dist/constants/index.js +2 -0
  317. package/dist/constants/layout.d.ts +24 -0
  318. package/dist/constants/layout.d.ts.map +1 -0
  319. package/dist/constants/layout.js +23 -0
  320. package/dist/context/ChatContext.d.ts.map +1 -1
  321. package/dist/context/ChatContext.js +27 -1
  322. package/dist/hooks/canned-response/useSearchCannedAcrossScopes.d.ts +7 -0
  323. package/dist/hooks/canned-response/useSearchCannedAcrossScopes.d.ts.map +1 -0
  324. package/dist/hooks/canned-response/useSearchCannedAcrossScopes.js +46 -0
  325. package/dist/hooks/common/useCloseOnSidePanelOpen.d.ts +3 -0
  326. package/dist/hooks/common/useCloseOnSidePanelOpen.d.ts.map +1 -0
  327. package/dist/hooks/common/useCloseOnSidePanelOpen.js +15 -0
  328. package/dist/hooks/common/useDeskShortcuts.d.ts +11 -0
  329. package/dist/hooks/common/useDeskShortcuts.d.ts.map +1 -0
  330. package/dist/hooks/common/useDeskShortcuts.js +94 -0
  331. package/dist/hooks/common/useEscapeLayer.d.ts +3 -0
  332. package/dist/hooks/common/useEscapeLayer.d.ts.map +1 -0
  333. package/dist/hooks/common/useEscapeLayer.js +18 -0
  334. package/dist/hooks/common/useMediaQuery.d.ts +3 -0
  335. package/dist/hooks/common/useMediaQuery.d.ts.map +1 -0
  336. package/dist/hooks/common/useMediaQuery.js +12 -0
  337. package/dist/hooks/common/useSidePanel.d.ts +12 -0
  338. package/dist/hooks/common/useSidePanel.d.ts.map +1 -0
  339. package/dist/hooks/common/useSidePanel.js +32 -0
  340. package/dist/hooks/group/useConversationGroups.d.ts.map +1 -1
  341. package/dist/hooks/group/useConversationGroups.js +3 -0
  342. package/dist/hooks/message/useNewMessageAnnouncement.d.ts +3 -0
  343. package/dist/hooks/message/useNewMessageAnnouncement.d.ts.map +1 -0
  344. package/dist/hooks/message/useNewMessageAnnouncement.js +30 -0
  345. package/dist/hooks/search/useSearchGroups.js +2 -1
  346. package/dist/hooks/search/useSearchMessage.d.ts +3 -1
  347. package/dist/hooks/search/useSearchMessage.d.ts.map +1 -1
  348. package/dist/hooks/search/useSearchMessage.js +2 -2
  349. package/dist/hooks/session/useBotSessionOwnerIdentity.d.ts +12 -0
  350. package/dist/hooks/session/useBotSessionOwnerIdentity.d.ts.map +1 -0
  351. package/dist/hooks/session/useBotSessionOwnerIdentity.js +22 -0
  352. package/dist/hooks/session/useCloseSession.d.ts +1 -0
  353. package/dist/hooks/session/useCloseSession.d.ts.map +1 -1
  354. package/dist/hooks/session/useCloseSession.js +9 -8
  355. package/dist/hooks/session/useEndSession.d.ts +11 -0
  356. package/dist/hooks/session/useEndSession.d.ts.map +1 -0
  357. package/dist/hooks/session/useEndSession.js +45 -0
  358. package/dist/hooks/session/useGetSession.d.ts.map +1 -1
  359. package/dist/hooks/session/useGetSession.js +27 -6
  360. package/dist/hooks/session/usePendingSessionClose.d.ts +5 -0
  361. package/dist/hooks/session/usePendingSessionClose.d.ts.map +1 -0
  362. package/dist/hooks/session/usePendingSessionClose.js +12 -0
  363. package/dist/hooks/session/useSessionCustomerName.d.ts +3 -0
  364. package/dist/hooks/session/useSessionCustomerName.d.ts.map +1 -0
  365. package/dist/hooks/session/useSessionCustomerName.js +19 -0
  366. package/dist/hooks/session/useSessionFieldAutosave.d.ts +19 -0
  367. package/dist/hooks/session/useSessionFieldAutosave.d.ts.map +1 -0
  368. package/dist/hooks/session/useSessionFieldAutosave.js +52 -0
  369. package/dist/index.d.ts +8 -2
  370. package/dist/index.d.ts.map +1 -1
  371. package/dist/index.js +5 -1
  372. package/dist/locales/vi/common.json +201 -21
  373. package/dist/locales/vi/conversation-inbox.json +21 -2
  374. package/dist/screens/desk-message/DeskWorkspace.d.ts +12 -0
  375. package/dist/screens/desk-message/DeskWorkspace.d.ts.map +1 -0
  376. package/dist/screens/desk-message/DeskWorkspace.js +57 -0
  377. package/dist/screens/desk-message/FolderOverlay.d.ts +4 -0
  378. package/dist/screens/desk-message/FolderOverlay.d.ts.map +1 -0
  379. package/dist/screens/desk-message/FolderOverlay.js +32 -0
  380. package/dist/screens/desk-message/SkipLinks.d.ts +4 -0
  381. package/dist/screens/desk-message/SkipLinks.d.ts.map +1 -0
  382. package/dist/screens/desk-message/SkipLinks.js +19 -0
  383. package/dist/screens/desk-message/ViewportNotice.d.ts +4 -0
  384. package/dist/screens/desk-message/ViewportNotice.d.ts.map +1 -0
  385. package/dist/screens/desk-message/ViewportNotice.js +9 -0
  386. package/dist/screens/desk-message/index.d.ts +3 -2
  387. package/dist/screens/desk-message/index.d.ts.map +1 -1
  388. package/dist/screens/desk-message/index.js +4 -12
  389. package/dist/store/deskPanelHost.d.ts +13 -0
  390. package/dist/store/deskPanelHost.d.ts.map +1 -0
  391. package/dist/store/deskPanelHost.js +9 -0
  392. package/dist/store/escapeLayers.d.ts +15 -0
  393. package/dist/store/escapeLayers.d.ts.map +1 -0
  394. package/dist/store/escapeLayers.js +15 -0
  395. package/dist/store/pendingSessionClose.d.ts +19 -0
  396. package/dist/store/pendingSessionClose.d.ts.map +1 -0
  397. package/dist/store/pendingSessionClose.js +74 -0
  398. package/dist/store/session.d.ts +2 -1
  399. package/dist/store/session.d.ts.map +1 -1
  400. package/dist/store/session.js +4 -1
  401. package/dist/store/sessionFolder.d.ts +15 -0
  402. package/dist/store/sessionFolder.d.ts.map +1 -0
  403. package/dist/store/sessionFolder.js +18 -0
  404. package/dist/store/shortcutPrefs.d.ts +9 -0
  405. package/dist/store/shortcutPrefs.d.ts.map +1 -0
  406. package/dist/store/shortcutPrefs.js +23 -0
  407. package/dist/store/sidePanel.d.ts +12 -0
  408. package/dist/store/sidePanel.d.ts.map +1 -0
  409. package/dist/store/sidePanel.js +9 -0
  410. package/dist/store/workspaceLayout.d.ts +12 -0
  411. package/dist/store/workspaceLayout.d.ts.map +1 -0
  412. package/dist/store/workspaceLayout.js +9 -0
  413. package/dist/styles/global.css +1 -1
  414. package/dist/types/chat.d.ts +18 -0
  415. package/dist/types/chat.d.ts.map +1 -1
  416. package/dist/types/dto.d.ts +2 -1
  417. package/dist/types/dto.d.ts.map +1 -1
  418. package/dist/utils/a11yClickable.d.ts +10 -0
  419. package/dist/utils/a11yClickable.d.ts.map +1 -0
  420. package/dist/utils/a11yClickable.js +15 -0
  421. package/dist/utils/events.d.ts +4 -0
  422. package/dist/utils/events.d.ts.map +1 -1
  423. package/dist/utils/headerMemberCount.d.ts +10 -0
  424. package/dist/utils/headerMemberCount.d.ts.map +1 -0
  425. package/dist/utils/headerMemberCount.js +3 -0
  426. package/dist/utils/memberEventRun.d.ts +16 -0
  427. package/dist/utils/memberEventRun.d.ts.map +1 -0
  428. package/dist/utils/memberEventRun.js +40 -0
  429. package/package.json +2 -2
  430. package/dist/components/session/SessionFilterMenu.d.ts +0 -15
  431. package/dist/components/session/SessionFilterMenu.d.ts.map +0 -1
  432. package/dist/components/session/SessionFilterMenu.js +0 -30
  433. package/dist/components/session/sessionMenuItems.d.ts +0 -28
  434. package/dist/components/session/sessionMenuItems.d.ts.map +0 -1
  435. package/dist/components/session/sessionMenuItems.js +0 -119
@@ -1,9 +1,10 @@
1
+ import type { CannedCreateRequest } from "../../types/chat";
1
2
  interface MessageListProps {
2
3
  conversationId: string;
3
4
  searchClientMsgID?: string;
4
5
  className?: string;
5
6
  onClose?: () => void;
6
- openCreateCannedModal?: () => void;
7
+ openCreateCannedModal?: (request?: CannedCreateRequest) => void;
7
8
  onOpenThreadInfo?: () => void;
8
9
  onCopyMessageLink?: (conversationId: string, clientMsgID: string) => void;
9
10
  /** Called instead of the SDK's default toast when a jumped-to message turns out to be revoked. */
@@ -1 +1 @@
1
- {"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../../src/components/message/MessageList.tsx"],"names":[],"mappings":"AAqCA,UAAU,gBAAgB;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,iBAAiB,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,kGAAkG;IAClG,sBAAsB,CAAC,EAAE,MAAM,IAAI,CAAC;IACpC,uEAAuE;IACvE,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,QAAA,MAAM,WAAW,GAAI,OAAO,gBAAgB,4CA2Z3C,CAAC;AAEF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../../src/components/message/MessageList.tsx"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAIxD,UAAU,gBAAgB;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,qBAAqB,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAChE,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC9B,iBAAiB,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,kGAAkG;IAClG,sBAAsB,CAAC,EAAE,MAAM,IAAI,CAAC;IACpC,uEAAuE;IACvE,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,QAAA,MAAM,WAAW,GAAI,OAAO,gBAAgB,4CAua3C,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -15,6 +15,8 @@ import MessageFooter from "./footer";
15
15
  import UnassignedSessionFooter from "./UnassignedSessionFooter";
16
16
  import { useTranslation } from "react-i18next";
17
17
  import useConversationStore from "../../store/conversation";
18
+ import useAuthStore from "../../store/auth";
19
+ import { handleMessageLogKeyDown } from "./messageKeyboardNav";
18
20
  import { useBoolean } from "ahooks";
19
21
  import { useMessageListScroll } from "../../hooks/message/useMessageListScroll";
20
22
  import { useUnreadMessageIndicator } from "../../hooks/message/useUnreadMessageIndicator";
@@ -36,6 +38,7 @@ const MessageList = (props) => {
36
38
  const { t } = useTranslation();
37
39
  const { user, connectStatus, allowPinMessageWithoutPermission } = useChatContext();
38
40
  const { onClose, conversationId, searchClientMsgID, openCreateCannedModal, onOpenThreadInfo, onCopyMessageLink, onSearchMessageRevoked, showPinnedMessageBar = false, } = props;
41
+ const isCrm = useAuthStore((state) => state.isCrm);
39
42
  const conversationData = useConversationStore((state) => state.conversationData);
40
43
  const permissions = useGroupPermission(conversationData === null || conversationData === void 0 ? void 0 : conversationData.groupID);
41
44
  const isGroupChat = isGroupConversation(conversationData !== null && conversationData !== void 0 ? conversationData : undefined);
@@ -212,7 +215,15 @@ const MessageList = (props) => {
212
215
  if (!conversationData) {
213
216
  return (_jsx("div", { className: "flex flex-1 items-center justify-center h-full", children: connectStatus !== ConnectStatus.Connected ? (_jsx(Spin, {})) : (_jsx(Empty, { description: t("no_conversation_data") })) }));
214
217
  }
215
- return (_jsxs("div", { className: "flex flex-col flex-1 relative h-full min-w-0 overflow-hidden bg-white", "data-cp-name": "MessageList", children: [_jsx(MessageHeader, { onClose: onClose, currentSession: latestConversationSession, isJoined: isJoined, onOpenThreadInfo: onOpenThreadInfo }), showPinnedMessageBar && (_jsx(PinnedMessageBar, { genericSubtitle: true, canUnpin: canPinMessage })), _jsxs("div", { className: "relative flex min-h-0 flex-1 flex-col", children: [!loadState.initLoading && showJumpButton && (_jsx(UnreadMessageJumpButton, { className: "absolute right-0 top-4 z-10", onClick: handleJumpToFirstUnread })), _jsx(MessageInfiniteScroll, { scrollRef: scrollRef, scrollableTargetId: "scrollableMessagesDiv", loadState: loadState, moreOldLoading: moreOldLoading, onLoadMoreOld: loadMoreOldMessage, onScroll: handleInfiniteScroll, children: loadState.messageList.map((message, _, array) => (_jsx(MessageItem, { message: message, allMessages: array, isGroupChat: isGroupChat, contextMenuOpen: openMenuId === message.clientMsgID, onContextMenuOpenChange: (open) => setOpenMenuId(open ? message.clientMsgID : null), onRevokeMessage: handleOpenRevoke, onQuoteMessage: setQuotedMessage, onPressQuoteMessage: onPressQuoteMessage, onPinMessage: canPinMessage ? handlePinMessage : undefined, onUnpinMessage: canPinMessage ? handleUnpinMessage : undefined, timeRevealed: revealedTimeMsgId === message.clientMsgID, onToggleTimeReveal: handleToggleTimeReveal, onCopyMessageLink: handleCopyMessageLink, showUnreadDivider: !!unreadDividerMessageId &&
218
+ return (_jsxs("div", { className: "flex flex-col flex-1 relative h-full min-w-0 overflow-hidden bg-white", "data-cp-name": "MessageList", children: [_jsx(MessageHeader, { onClose: onClose, currentSession: latestConversationSession, isJoined: isJoined, onOpenThreadInfo: onOpenThreadInfo }), showPinnedMessageBar && (_jsx(PinnedMessageBar, { genericSubtitle: true, canUnpin: canPinMessage })), _jsxs("div", { className: "relative flex min-h-0 flex-1 flex-col", children: [!loadState.initLoading && showJumpButton && (_jsx(UnreadMessageJumpButton, { className: "absolute right-0 top-4 z-10", onClick: handleJumpToFirstUnread })), _jsx(MessageInfiniteScroll, { scrollRef: scrollRef, scrollableTargetId: "scrollableMessagesDiv", loadState: loadState, moreOldLoading: moreOldLoading, onLoadMoreOld: loadMoreOldMessage, onScroll: handleInfiniteScroll, containerProps: isCrm
219
+ ? {
220
+ role: "log",
221
+ "aria-live": "off",
222
+ "aria-label": t("message_log_label"),
223
+ tabIndex: 0,
224
+ onKeyDown: handleMessageLogKeyDown,
225
+ }
226
+ : undefined, children: loadState.messageList.map((message, _, array) => (_jsx(MessageItem, { message: message, allMessages: array, isGroupChat: isGroupChat, contextMenuOpen: openMenuId === message.clientMsgID, onContextMenuOpenChange: (open) => setOpenMenuId(open ? message.clientMsgID : null), onRevokeMessage: handleOpenRevoke, onQuoteMessage: setQuotedMessage, onPressQuoteMessage: onPressQuoteMessage, onPinMessage: canPinMessage ? handlePinMessage : undefined, onUnpinMessage: canPinMessage ? handleUnpinMessage : undefined, timeRevealed: revealedTimeMsgId === message.clientMsgID, onToggleTimeReveal: handleToggleTimeReveal, onCopyMessageLink: handleCopyMessageLink, showUnreadDivider: !!unreadDividerMessageId &&
216
227
  message.clientMsgID === unreadDividerMessageId, onUnreadDividerSeen: markDividerSeen }, message.clientMsgID))) })] }), moreNewLoading && (_jsx("div", { className: "flex items-center justify-center py-2", children: _jsx(Spin, {}) })), (Boolean(rawGroupId) && isCheckingMembership) || !isGroupStateFresh ? (_jsx("div", { className: "border-t bg-white py-4 flex items-center justify-center", children: _jsx(Spin, {}) })) : (latestConversationSession === null || latestConversationSession === void 0 ? void 0 : latestConversationSession.status) === SessionStatus.UNASSIGNED ? (_jsx(UnassignedSessionFooter, { sessionId: latestConversationSession.id, teamId: latestConversationSession.teamId })) : !isConfirmedGroup && shouldRestrictToLastSession ? (_jsxs("div", { className: "border-t bg-white py-4 flex flex-col items-center gap-2", "data-cp-name": "JoinGroupRequired", children: [_jsx("p", { className: "text-sm text-gray-500", children: t("join_group_required") }), _jsx(Button, { type: "primary", onClick: joinGroup, loading: isJoining, children: t("join_group") })] })) : isViewOnlyMember ? (
217
228
  // Brief fallback while isJoined catches up after the kick event.
218
229
  _jsx(MessageFooter, { currentSession: latestConversationSession, openCreateCannedModal: openCreateCannedModal })) : !canSendMessage ? (_jsx("div", { className: "border-t bg-[#f5f5f5] py-3 flex items-center justify-center", children: _jsx("p", { className: "text-sm text-gray-500", children: t(isRestrictedByGroupMute
@@ -5,7 +5,10 @@ interface SelectSessionProps {
5
5
  onChange: (value: SelectSessionOption["value"]) => void;
6
6
  excludeOptions?: SelectSessionOption["value"][];
7
7
  placeholder?: string;
8
+ disabled?: boolean;
9
+ /** CRM only: extra classes for the select, e.g. a max width for a long placeholder. */
10
+ crmClassName?: string;
8
11
  }
9
- declare const SelectSession: ({ options, value, onChange, excludeOptions, placeholder, }: SelectSessionProps) => import("react/jsx-runtime").JSX.Element;
12
+ declare const SelectSession: ({ options, value, onChange, excludeOptions, placeholder, disabled, crmClassName, }: SelectSessionProps) => import("react/jsx-runtime").JSX.Element;
10
13
  export default SelectSession;
11
14
  //# sourceMappingURL=SelectSession.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SelectSession.d.ts","sourceRoot":"","sources":["../../../src/components/message/SelectSession.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,UAAU,kBAAkB;IAC1B,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACxD,cAAc,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,QAAA,MAAM,aAAa,GAAI,4DAMpB,kBAAkB,4CAmEpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"SelectSession.d.ts","sourceRoot":"","sources":["../../../src/components/message/SelectSession.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG3D,UAAU,kBAAkB;IAC1B,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACxD,cAAc,CAAC,EAAE,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uFAAuF;IACvF,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,QAAA,MAAM,aAAa,GAAI,oFAQpB,kBAAkB,4CAwFpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -2,10 +2,13 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { Select } from "antd";
4
4
  import { Icon } from "../../components/icon";
5
+ import { StrokeIcon } from "../../components/icon/StrokeIcon";
5
6
  import clsx from "clsx";
6
- const SelectSession = ({ options, value, onChange, excludeOptions, placeholder, }) => {
7
+ import useAuthStore from "../../store/auth";
8
+ const SelectSession = ({ options, value, onChange, excludeOptions, placeholder, disabled, crmClassName, }) => {
9
+ const isCrm = useAuthStore((state) => state.isCrm);
7
10
  const selectedOption = options.find((option) => option.value === value);
8
- const renderOptionLabel = (option, truncateLabel = false) => (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: clsx("w-2 h-2 rounded-full shrink-0", option.tintColorClassnameBg) }), _jsx("span", { className: clsx("text-xs whitespace-nowrap", truncateLabel && "truncate", option.tintColorClassname), children: option.label })] }));
11
+ const renderOptionLabel = (option, truncateLabel = false) => (_jsxs("div", { className: clsx("flex items-center", isCrm ? "gap-1.5" : "gap-2"), children: [_jsx("div", { className: clsx("w-2 h-2 rounded-full shrink-0", option.tintColorClassnameBg) }), _jsx("span", { className: clsx("whitespace-nowrap", isCrm ? "text-[13px] font-medium" : "text-xs", truncateLabel && "truncate", isCrm ? "text-gray-900" : option.tintColorClassname), children: option.label })] }));
9
12
  const filteredOptions = options.filter((option) => option.value === value || !(excludeOptions === null || excludeOptions === void 0 ? void 0 : excludeOptions.includes(option.value)));
10
13
  const selectOptions = filteredOptions.map((option) => ({
11
14
  label: renderOptionLabel(option),
@@ -14,8 +17,14 @@ const SelectSession = ({ options, value, onChange, excludeOptions, placeholder,
14
17
  const handleSelect = (val) => {
15
18
  onChange(val);
16
19
  };
17
- return (_jsx("div", { className: "relative shrink-0", "data-cp-name": "SelectSession", children: _jsx(Select, { className: `${selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.bgTintColorClassname} custom-select min-w-[100px]`, placement: "bottomLeft", placeholder: placeholder, options: selectOptions, value: selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.value, onSelect: handleSelect, popupMatchSelectWidth: false, suffixIcon: _jsx(Icon, { icon: "angle-down-o", className: `${selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.tintColorClassname} mt-[2px]`, size: 14 }), menuItemSelectedIcon: null, labelRender: () => ["NONE", ""].includes(selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.value)
18
- ? placeholder
20
+ return (_jsx("div", { className: "relative shrink-0", "data-cp-name": "SelectSession", children: _jsx(Select, { className: isCrm
21
+ ? `!h-8 ${crmClassName !== null && crmClassName !== void 0 ? crmClassName : ""} [&_.ant-select-selection-item]:!pe-0 [&_.ant-select-selector]:!h-8 [&_.ant-select-selector]:!pl-[10px] [&_.ant-select-selector]:!pr-[26px] [&_.ant-select-selection-item]:!text-[13px] [&_.ant-select-selection-item]:!font-medium [&_.ant-select-selection-placeholder]:!text-[13px] [&_.ant-select-arrow]:!end-[6px]`
22
+ : `${selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.bgTintColorClassname} custom-select min-w-[100px]`, popupClassName: isCrm
23
+ ? "[&_.ant-select-item-option-selected]:!bg-primary-25 [&_.ant-select-item-option-selected]:!font-normal"
24
+ : undefined, placement: "bottomLeft", placeholder: placeholder, "aria-label": placeholder, options: selectOptions, value: selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.value, onSelect: handleSelect, disabled: disabled, popupMatchSelectWidth: false, suffixIcon: isCrm ? (_jsx(StrokeIcon, { name: "chevron-down", size: 16, className: "text-gray-600" })) : (_jsx(Icon, { icon: "angle-down-o", className: `${isCrm ? "text-gray-600" : selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.tintColorClassname} mt-[2px]`, size: 14 })), menuItemSelectedIcon: null, labelRender: () => ["NONE", ""].includes(selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.value)
25
+ ? isCrm
26
+ ? _jsx("span", { className: "block truncate text-[13px] text-gray-600", children: placeholder })
27
+ : placeholder
19
28
  : selectedOption
20
29
  ? renderOptionLabel(selectedOption, true)
21
30
  : undefined }) }));
@@ -5,7 +5,7 @@ import { useTranslation } from "react-i18next";
5
5
  import { useAssignSession } from "../../hooks/session/useAssignSession";
6
6
  import useAuthStore from "../../store/auth";
7
7
  import ManualAssignPopover from "../../components/thread/ManualAssignPopover";
8
- import { Icon } from "../../components/icon";
8
+ import { AdaptiveIcon } from "../../components/icon/AdaptiveIcon";
9
9
  const UnassignedSessionFooter = ({ sessionId, teamId, }) => {
10
10
  const { t } = useTranslation();
11
11
  const userID = useAuthStore((state) => state.userID);
@@ -21,6 +21,6 @@ const UnassignedSessionFooter = ({ sessionId, teamId, }) => {
21
21
  antdMessage.error(t("manual_assign_failed"));
22
22
  }
23
23
  };
24
- return (_jsxs("div", { className: "border-t bg-white py-4 flex flex-col items-center gap-2", "data-cp-name": "UnassignedSessionFooter", children: [_jsxs("div", { className: "flex items-center gap-1.5 text-amber-500", children: [_jsx(Icon, { icon: "user-del-o", size: 16 }), _jsx("p", { className: "text-sm text-gray-500", children: t("unassigned_thread_notice") })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { type: "primary", onClick: handleAssignToMe, loading: isAssigning, disabled: isAssigning, children: t("assign_to_me") }), _jsx(ManualAssignPopover, { sessionId: sessionId, teamId: teamId, excludeCurrentUser: true, children: _jsx(Button, { disabled: isAssigning, children: t("assign_to_others") }) })] })] }));
24
+ return (_jsxs("div", { className: "border-t bg-white py-4 flex flex-col items-center gap-2", "data-cp-name": "UnassignedSessionFooter", children: [_jsxs("div", { className: "flex items-center gap-1.5 text-amber-500", children: [_jsx(AdaptiveIcon, { stroke: "user-x", font: "user-del-o", size: 16 }), _jsx("p", { className: "text-sm text-gray-500", children: t("unassigned_thread_notice") })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Button, { type: "primary", onClick: handleAssignToMe, loading: isAssigning, disabled: isAssigning, children: t("assign_to_me") }), _jsx(ManualAssignPopover, { sessionId: sessionId, teamId: teamId, excludeCurrentUser: true, children: _jsx(Button, { disabled: isAssigning, children: t("assign_to_others") }) })] })] }));
25
25
  };
26
26
  export default UnassignedSessionFooter;
@@ -1,3 +1,7 @@
1
- declare const ActionBar: () => import("react/jsx-runtime").JSX.Element;
1
+ interface ActionBarProps {
2
+ formatOpen?: boolean;
3
+ onToggleFormat?: () => void;
4
+ }
5
+ declare const ActionBar: ({ formatOpen, onToggleFormat }: ActionBarProps) => import("react/jsx-runtime").JSX.Element;
2
6
  export default ActionBar;
3
7
  //# sourceMappingURL=ActionBar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ActionBar.d.ts","sourceRoot":"","sources":["../../../../src/components/message/footer/ActionBar.tsx"],"names":[],"mappings":"AAuBA,QAAA,MAAM,SAAS,+CAiHd,CAAC;AAEF,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"ActionBar.d.ts","sourceRoot":"","sources":["../../../../src/components/message/footer/ActionBar.tsx"],"names":[],"mappings":"AA4BA,UAAU,cAAc;IAEtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,QAAA,MAAM,SAAS,GAAI,gCAAwC,cAAc,4CA+JxE,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -2,7 +2,11 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useCallback, useEffect, useMemo, useState } from "react";
4
4
  import { Button } from "antd";
5
+ import clsx from "clsx";
6
+ import { StrokeIcon } from "../../../components/icon/StrokeIcon";
7
+ import { useTranslation } from "react-i18next";
5
8
  import { Icon } from "../../../components/icon";
9
+ import useAuthStore from "../../../store/auth";
6
10
  import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
7
11
  import { $createParagraphNode, $getRoot, $getSelection, $isRangeSelection, } from "lexical";
8
12
  import { $generateHtmlFromNodes } from "@lexical/html";
@@ -10,9 +14,12 @@ import { $isListNode, INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND
10
14
  import { $isQuoteNode } from "@lexical/rich-text";
11
15
  import { useMessageFooterContext } from ".";
12
16
  import MediaActions from "./MediaActions";
17
+ import { clearComposerHistoryAfterUpdate } from "./clearComposerHistory";
13
18
  import useConversationStore from "../../../store/conversation";
14
19
  import { extractMentions } from "./mention/extractMentions";
15
- const ActionBar = () => {
20
+ const ActionBar = ({ formatOpen = false, onToggleFormat }) => {
21
+ const { t } = useTranslation();
22
+ const isCrm = useAuthStore((state) => state.isCrm);
16
23
  const [editor] = useLexicalComposerContext();
17
24
  const { onSendMessage, isInternal, listUploadFiles, setListUploadFiles } = useMessageFooterContext();
18
25
  const quotedMessage = useConversationStore((state) => state.quotedMessage);
@@ -43,6 +50,7 @@ const ActionBar = () => {
43
50
  return;
44
51
  }
45
52
  }
53
+ clearComposerHistoryAfterUpdate(editor);
46
54
  editor.update(() => {
47
55
  const root = $getRoot();
48
56
  root.clear();
@@ -88,6 +96,11 @@ const ActionBar = () => {
88
96
  });
89
97
  });
90
98
  }, [editor]);
99
+ if (isCrm) {
100
+ return (_jsxs("div", { "data-cp-name": "ActionBar", className: "flex items-center gap-0.5", children: [_jsx(Button, { type: "text", shape: "default", "aria-label": t("composer_format"), title: t("composer_format"), "aria-pressed": formatOpen, onClick: onToggleFormat, className: clsx("!flex !h-8 !w-8 items-center justify-center rounded-lg p-0 hover:!bg-gray-5 hover:!text-gray-900", formatOpen ? "!bg-primary-25 !text-primary-500" : "text-gray-600"), children: _jsx(StrokeIcon, { name: "type", size: 18 }) }), _jsx(MediaActions, { crmComposer: true, listUploadFiles: listUploadFiles, onFilesChange: setListUploadFiles }), _jsx("span", { className: "flex-1" }), _jsxs("button", { type: "button", onClick: handleSend, disabled: !canSend, className: clsx("flex h-8 items-center gap-1.5 whitespace-nowrap rounded-lg border px-3.5 text-sm font-medium text-white focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-400", isInternal
101
+ ? "border-warning-800 bg-warning-800 hover:bg-warning-900"
102
+ : "border-primary-400 bg-primary-400 hover:bg-primary-500", !canSend && "cursor-not-allowed opacity-40"), children: [_jsx(StrokeIcon, { name: "send", size: 18 }), isInternal ? t("composer_send_note") : t("composer_send")] })] }));
103
+ }
91
104
  return (_jsxs("div", { "data-cp-name": "ActionBar", className: "flex items-center justify-between px-4", children: [_jsx(MediaActions, { listUploadFiles: listUploadFiles, onFilesChange: setListUploadFiles, buttonClassName: "text-gray-500 w-8 h-8 p-0" }), _jsx(Button, { type: "text", shape: "default", className: "text-gray-500 w-8 h-8 p-0", onClick: handleSend, disabled: !canSend, children: _jsx(Icon, { icon: "send-b", size: 28, className: `${canSend ? "text-[var(--dc-color-primary)]" : "text-gray-400"}` }) })] }));
92
105
  };
93
106
  export default ActionBar;
@@ -1 +1 @@
1
- {"version":3,"file":"CannedResponsePlugin.d.ts","sourceRoot":"","sources":["../../../../src/components/message/footer/CannedResponsePlugin.tsx"],"names":[],"mappings":"AAWA,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,QAsFrE"}
1
+ {"version":3,"file":"CannedResponsePlugin.d.ts","sourceRoot":"","sources":["../../../../src/components/message/footer/CannedResponsePlugin.tsx"],"names":[],"mappings":"AAYA,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,QAwGrE"}
@@ -1,10 +1,13 @@
1
- import { useEffect } from "react";
1
+ import { useEffect, useRef } from "react";
2
2
  import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
3
- import { $getSelection, $isRangeSelection, COMMAND_PRIORITY_LOW, KEY_ARROW_DOWN_COMMAND, KEY_ARROW_UP_COMMAND, } from "lexical";
3
+ import { $getSelection, $isRangeSelection, COMMAND_PRIORITY_LOW, KEY_ARROW_DOWN_COMMAND, KEY_ARROW_UP_COMMAND, KEY_ESCAPE_COMMAND, } from "lexical";
4
4
  import { useMessageFooterContext } from ".";
5
5
  export function CannedResponseTriggerPlugin({ onOpen, onClose }) {
6
6
  const [editor] = useLexicalComposerContext();
7
7
  const { activeCannedIndex, setActiveCannedIndex, isOpenCanned, maxActiveCannedIndex, } = useMessageFooterContext();
8
+ // Text before the cursor when the agent pressed Esc: the picker stays shut until it changes.
9
+ const dismissedRef = useRef(null);
10
+ const lastBeforeRef = useRef("");
8
11
  useEffect(() => {
9
12
  return editor.registerUpdateListener(({ editorState }) => {
10
13
  editorState.read(() => {
@@ -20,10 +23,13 @@ export function CannedResponseTriggerPlugin({ onOpen, onClose }) {
20
23
  const before = text.slice(0, offset);
21
24
  // match #abc (KHÔNG có space phía sau)
22
25
  const match = before.match(/(^|\s)#(\w*)$/);
23
- if (match) {
26
+ lastBeforeRef.current = before;
27
+ if (match && dismissedRef.current !== before) {
24
28
  onOpen(match[2] || "");
25
29
  }
26
30
  else {
31
+ if (!match)
32
+ dismissedRef.current = null;
27
33
  onClose();
28
34
  }
29
35
  });
@@ -52,9 +58,17 @@ export function CannedResponseTriggerPlugin({ onOpen, onClose }) {
52
58
  : activeCannedIndex + 1);
53
59
  return true;
54
60
  }, COMMAND_PRIORITY_LOW);
61
+ const unregisterEscape = editor.registerCommand(KEY_ESCAPE_COMMAND, () => {
62
+ if (!isOpenCanned)
63
+ return false;
64
+ dismissedRef.current = lastBeforeRef.current;
65
+ onClose();
66
+ return true;
67
+ }, COMMAND_PRIORITY_LOW);
55
68
  return () => {
56
69
  unregisterUp();
57
70
  unregisterDown();
71
+ unregisterEscape();
58
72
  };
59
73
  }, [
60
74
  editor,
@@ -62,6 +76,7 @@ export function CannedResponseTriggerPlugin({ onOpen, onClose }) {
62
76
  activeCannedIndex,
63
77
  setActiveCannedIndex,
64
78
  maxActiveCannedIndex,
79
+ onClose,
65
80
  ]);
66
81
  return null;
67
82
  }
@@ -0,0 +1,9 @@
1
+ interface ClosedSessionBannerProps {
2
+ closedDate?: string | null;
3
+ loading: boolean;
4
+ onReopen: () => void;
5
+ onCreateNew: () => void;
6
+ }
7
+ declare const ClosedSessionBanner: ({ closedDate, loading, onReopen, onCreateNew, }: ClosedSessionBannerProps) => import("react/jsx-runtime").JSX.Element;
8
+ export default ClosedSessionBanner;
9
+ //# sourceMappingURL=ClosedSessionBanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClosedSessionBanner.d.ts","sourceRoot":"","sources":["../../../../src/components/message/footer/ClosedSessionBanner.tsx"],"names":[],"mappings":"AAMA,UAAU,wBAAwB;IAChC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAGD,QAAA,MAAM,mBAAmB,GAAI,iDAK1B,wBAAwB,4CAoC1B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { StrokeIcon } from "../../../components/icon/StrokeIcon";
4
+ import { useTranslation } from "react-i18next";
5
+ import { formatSessionTime } from "../../../components/thread/sessionDateFormat";
6
+ // CRM only: tells the agent the session ended before they type, not after they press send.
7
+ const ClosedSessionBanner = ({ closedDate, loading, onReopen, onCreateNew, }) => {
8
+ const { t } = useTranslation();
9
+ const time = formatSessionTime(closedDate);
10
+ const focusRing = "focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-400 disabled:cursor-not-allowed disabled:opacity-50";
11
+ return (_jsxs("div", { role: "status", "data-cp-name": "ClosedSessionBanner", className: "flex items-center gap-3 rounded-xl bg-primary-25 px-3 py-2.5 text-[13px] text-gray-900", children: [_jsx(StrokeIcon, { name: "check-circle", size: 18, className: "text-primary-500" }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("strong", { className: "font-semibold", children: t("session_ended_banner_title") }), time ? ` ${t("session_ended_banner_at", { time })}` : null] }), _jsx("button", { type: "button", onClick: onCreateNew, disabled: loading, className: `h-8 shrink-0 whitespace-nowrap rounded-lg px-2 text-sm font-medium text-primary-500 hover:bg-white/60 ${focusRing}`, children: t("session_banner_create") }), _jsx("button", { type: "button", onClick: onReopen, disabled: loading, "aria-busy": loading, className: `h-8 shrink-0 whitespace-nowrap rounded-lg border border-gray-50 bg-white px-3.5 text-sm font-medium text-gray-900 hover:bg-gray-5 ${focusRing}`, children: t("session_banner_reopen") })] }));
12
+ };
13
+ export default ClosedSessionBanner;
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerEditor.d.ts","sourceRoot":"","sources":["../../../../src/components/message/footer/ComposerEditor.tsx"],"names":[],"mappings":"AAOA,UAAU,mBAAmB;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,QAAA,MAAM,cAAc,GAAI,kCAGrB,mBAAmB,4CAwBrB,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"ComposerEditor.d.ts","sourceRoot":"","sources":["../../../../src/components/message/footer/ComposerEditor.tsx"],"names":[],"mappings":"AAQA,UAAU,mBAAmB;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,QAAA,MAAM,cAAc,GAAI,kCAGrB,mBAAmB,4CAyCrB,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -4,10 +4,15 @@ import { RichTextPlugin } from "@lexical/react/LexicalRichTextPlugin";
4
4
  import { ContentEditable } from "@lexical/react/LexicalContentEditable";
5
5
  import { LexicalErrorBoundary } from "@lexical/react/LexicalErrorBoundary";
6
6
  import clsx from "clsx";
7
+ import useAuthStore from "../../../store/auth";
7
8
  const ComposerEditor = ({ isInternal, placeholderText, }) => {
8
- const editorClasses = clsx("min-h-[64px] max-h-[140px] overflow-y-auto rounded-md border px-3 py-2 text-sm", isInternal
9
- ? "border-orange-300 bg-orange-50"
10
- : "border-indigo-500 bg-blue-100");
11
- return (_jsx("div", { "data-cp-name": "ComposerEditor", className: "px-4", children: _jsx("div", { className: "relative", children: _jsx(RichTextPlugin, { contentEditable: _jsx(ContentEditable, { className: editorClasses }), ErrorBoundary: LexicalErrorBoundary, "aria-placeholder": placeholderText, placeholder: _jsx("div", { className: "absolute left-3 top-2 pointer-events-none", children: _jsx("p", { className: "text-gray-500 text-sm", children: placeholderText }) }) }) }) }));
9
+ const isCrm = useAuthStore((state) => state.isCrm);
10
+ // CRM: the surrounding card owns the border, so the field is borderless.
11
+ const editorClasses = isCrm
12
+ ? "min-h-[44px] max-h-[140px] overflow-y-auto px-1 pt-1 text-sm leading-6 text-gray-900 outline-none"
13
+ : clsx("min-h-[64px] max-h-[140px] overflow-y-auto rounded-md border px-3 py-2 text-sm", isInternal
14
+ ? "border-orange-300 bg-orange-50"
15
+ : "border-[color:var(--dc-composer-border)] bg-[var(--dc-composer-bg)] focus:border-[color:var(--dc-composer-border-focus)]");
16
+ return (_jsx("div", { "data-cp-name": "ComposerEditor", className: isCrm ? "" : "px-4", children: _jsx("div", { className: "relative", children: _jsx(RichTextPlugin, { contentEditable: _jsx(ContentEditable, { className: editorClasses, "aria-label": placeholderText }), ErrorBoundary: LexicalErrorBoundary, "aria-placeholder": placeholderText, placeholder: _jsx("div", { className: clsx("absolute pointer-events-none", isCrm ? "left-1 top-1" : "left-3 top-2"), children: _jsx("p", { className: clsx("text-sm", isCrm ? "leading-6 text-gray-600" : "text-gray-500"), children: placeholderText }) }) }) }) }));
12
17
  };
13
18
  export default ComposerEditor;
@@ -1,10 +1,9 @@
1
1
  interface ComposerTabsProps {
2
2
  canUseInternal: boolean;
3
- hintText: string;
4
3
  isInternal: boolean;
5
4
  lockToInternal: boolean;
6
5
  setIsInternal: (isInternal: boolean) => void;
7
6
  }
8
- declare const ComposerTabs: ({ canUseInternal, hintText, isInternal, lockToInternal, setIsInternal, }: ComposerTabsProps) => import("react/jsx-runtime").JSX.Element | null;
7
+ declare const ComposerTabs: ({ canUseInternal, isInternal, lockToInternal, setIsInternal, }: ComposerTabsProps) => import("react/jsx-runtime").JSX.Element | null;
9
8
  export default ComposerTabs;
10
9
  //# sourceMappingURL=ComposerTabs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerTabs.d.ts","sourceRoot":"","sources":["../../../../src/components/message/footer/ComposerTabs.tsx"],"names":[],"mappings":"AAOA,UAAU,iBAAiB;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;CAC9C;AAeD,QAAA,MAAM,YAAY,GAAI,0EAMnB,iBAAiB,mDAqDnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"ComposerTabs.d.ts","sourceRoot":"","sources":["../../../../src/components/message/footer/ComposerTabs.tsx"],"names":[],"mappings":"AAOA,UAAU,iBAAiB;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;CAC9C;AAQD,QAAA,MAAM,YAAY,GAAI,gEAKnB,iBAAiB,mDA0CnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -1,45 +1,24 @@
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 clsx from "clsx";
4
- import { Tabs } from "antd";
5
- import { useMemo } from "react";
4
+ import { StrokeIcon } from "../../../components/icon/StrokeIcon";
6
5
  import { useTranslation } from "react-i18next";
7
- const COMPOSER_TABS = [
8
- {
9
- isInternal: false,
10
- activeClassName: "text-indigo-600",
11
- labelKey: "reply",
12
- },
13
- {
14
- isInternal: true,
15
- activeClassName: "text-orange-600",
16
- labelKey: "internal",
17
- },
6
+ const MODES = [
7
+ { isInternal: false, labelKey: "reply", icon: "reply" },
8
+ { isInternal: true, labelKey: "internal", icon: "lock" },
18
9
  ];
19
- const ComposerTabs = ({ canUseInternal, hintText, isInternal, lockToInternal, setIsInternal, }) => {
10
+ // Segmented reply / internal-note switch. Only rendered in the CRM composer card.
11
+ const ComposerTabs = ({ canUseInternal, isInternal, lockToInternal, setIsInternal, }) => {
20
12
  const { t } = useTranslation();
21
- const items = useMemo(() => COMPOSER_TABS.map((tab) => ({
22
- key: String(tab.isInternal),
23
- disabled: lockToInternal && !tab.isInternal,
24
- label: (_jsx("span", { className: clsx("text-sm font-semibold", isInternal === tab.isInternal
25
- ? tab.activeClassName
26
- : lockToInternal && !tab.isInternal
27
- ? "text-gray-300"
28
- : "text-gray-500"), children: t(tab.labelKey) })),
29
- children: null,
30
- })), [isInternal, lockToInternal, t]);
31
13
  if (!canUseInternal) {
32
14
  return null;
33
15
  }
34
- return (_jsx(Tabs, { "data-cp-name": "ComposerTabs", activeKey: String(isInternal), items: items, onChange: (value) => {
35
- if (lockToInternal && value !== "true") {
36
- return;
37
- }
38
- setIsInternal(value === "true");
39
- }, tabBarExtraContent: {
40
- left: _jsx("p", { className: "pr-4 text-sm text-gray-500", children: hintText }),
41
- }, className: clsx("[&_.ant-tabs-content-holder]:hidden [&_.ant-tabs-ink-bar]:hidden [&_.ant-tabs-nav]:mb-0 [&_.ant-tabs-nav]:px-4 [&_.ant-tabs-nav]:pt-0 [&_.ant-tabs-nav]:before:border-b-0 [&_.ant-tabs-nav-wrap]:justify-end [&_.ant-tabs-extra-content]:flex [&_.ant-tabs-extra-content]:items-center [&_.ant-tabs-extra-content]:overflow-hidden [&_.ant-tabs-extra-content]:text-ellipsis [&_.ant-tabs-tab]:mb-0 [&_.ant-tabs-tab]:rounded-t-[16px] [&_.ant-tabs-tab]:border [&_.ant-tabs-tab]:border-b-0 [&_.ant-tabs-tab]:border-transparent [&_.ant-tabs-tab]:px-3 [&_.ant-tabs-tab]:py-1.5 [&_.ant-tabs-tab]:leading-5 [&_.ant-tabs-tab-btn]:leading-5", isInternal
42
- ? "[&_.ant-tabs-tab-active]:border-orange-200 [&_.ant-tabs-tab-active]:bg-orange-50"
43
- : "[&_.ant-tabs-tab-active]:border-indigo-200 [&_.ant-tabs-tab-active]:bg-indigo-50") }));
16
+ return (_jsx("div", { role: "group", "aria-label": t("composer_mode_label"), "data-cp-name": "ComposerTabs", className: "flex shrink-0 gap-0.5 rounded-lg bg-[var(--dc-color-neutral-surface)] p-1", children: MODES.map(({ isInternal: modeIsInternal, labelKey, icon }) => {
17
+ const selected = isInternal === modeIsInternal;
18
+ const disabled = lockToInternal && !modeIsInternal;
19
+ return (_jsxs("button", { type: "button", "aria-pressed": selected, disabled: disabled, onClick: () => setIsInternal(modeIsInternal), className: clsx("flex h-7 items-center gap-1.5 whitespace-nowrap rounded px-2.5 text-[13px] focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary-400", selected
20
+ ? clsx("bg-white font-semibold shadow-[0_1px_2px_rgba(57,62,64,0.12)]", modeIsInternal ? "text-warning-800" : "text-gray-900")
21
+ : "font-medium text-gray-600 hover:text-gray-900", disabled && "cursor-not-allowed opacity-50"), children: [_jsx(StrokeIcon, { name: icon, size: 16 }), t(labelKey)] }, labelKey));
22
+ }) }));
44
23
  };
45
24
  export default ComposerTabs;
@@ -0,0 +1,11 @@
1
+ interface CrmComposerCardProps {
2
+ canUseInternal: boolean;
3
+ isInternal: boolean;
4
+ lockToInternal: boolean;
5
+ setIsInternal: (isInternal: boolean) => void;
6
+ /** Reply mode of an ended session: dimmed and read-only until the session reopens. */
7
+ replyLocked?: boolean;
8
+ }
9
+ declare const CrmComposerCard: ({ canUseInternal, isInternal, lockToInternal, setIsInternal, replyLocked, }: CrmComposerCardProps) => import("react/jsx-runtime").JSX.Element;
10
+ export default CrmComposerCard;
11
+ //# sourceMappingURL=CrmComposerCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CrmComposerCard.d.ts","sourceRoot":"","sources":["../../../../src/components/message/footer/CrmComposerCard.tsx"],"names":[],"mappings":"AAWA,UAAU,oBAAoB;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,sFAAsF;IACtF,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AASD,QAAA,MAAM,eAAe,GAAI,6EAMtB,oBAAoB,4CAsEtB,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -0,0 +1,30 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEffect, useRef, useState } from "react";
4
+ import clsx from "clsx";
5
+ import { StrokeIcon } from "../../../components/icon/StrokeIcon";
6
+ import { useTranslation } from "react-i18next";
7
+ import ActionBar from "./ActionBar";
8
+ import ComposerEditor from "./ComposerEditor";
9
+ import ComposerTabs from "./ComposerTabs";
10
+ import { ToolbarPlugin } from "./ToolbarPlugin";
11
+ 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 }));
12
+ // CRM only: one card with mode switch, field, and a single action row.
13
+ const CrmComposerCard = ({ canUseInternal, isInternal, lockToInternal, setIsInternal, replyLocked = false, }) => {
14
+ const { t } = useTranslation();
15
+ const [formatOpen, setFormatOpen] = useState(false);
16
+ const fieldRef = useRef(null);
17
+ // Set as a DOM property: React 18 does not know the `inert` attribute.
18
+ useEffect(() => {
19
+ if (fieldRef.current)
20
+ fieldRef.current.inert = replyLocked;
21
+ }, [replyLocked]);
22
+ return (_jsxs("div", { "data-cp-name": "CrmComposerCard", "data-internal": isInternal, className: clsx("flex flex-col gap-1.5 rounded-xl border p-2", isInternal
23
+ ? "border-warning-400/60 bg-warning-25"
24
+ : "border-[color:var(--dc-composer-border)] bg-[var(--dc-composer-bg)] focus-within:border-[color:var(--dc-composer-border-focus)] focus-within:shadow-[0_0_0_3px_var(--dc-color-primary-light)]", replyLocked && "opacity-50"), children: [_jsxs("div", { className: "flex items-center justify-between gap-2 [container-type:inline-size]", children: [_jsx(ComposerTabs, { canUseInternal: canUseInternal, isInternal: isInternal, lockToInternal: lockToInternal, setIsInternal: setIsInternal }), isInternal ? (_jsxs("span", { role: "note", title: t("composer_internal_notice"), className: "flex min-w-0 items-center gap-1 whitespace-nowrap text-xs font-medium text-warning-800", children: [_jsx(StrokeIcon, { name: "lock", size: 14 }), _jsx("span", { className: "truncate [@container(max-width:419px)]:sr-only", children: t("composer_internal_notice") })] })) : (_jsxs("span", { className: "ml-auto flex min-w-0 items-center gap-1 overflow-hidden whitespace-nowrap text-xs text-gray-600 [@container(max-width:309px)]:!hidden", children: [_jsx(Kbd, { children: "Enter" }), " ", t("composer_hint_enter"), _jsxs("span", { className: "flex items-center gap-1 [@container(max-width:499px)]:!hidden", children: ["\u00B7 ", _jsx(Kbd, { children: "Shift" }), " + ", _jsx(Kbd, { children: "Enter" }), " ", t("composer_hint_newline")] })] }))] }), _jsxs("div", { ref: fieldRef, className: "contents", children: [_jsx(ComposerEditor, { isInternal: isInternal, placeholderText: isInternal
25
+ ? t("composer_internal_placeholder")
26
+ : replyLocked
27
+ ? t("composer_closed_placeholder")
28
+ : t("composer_placeholder_crm") }), formatOpen && _jsx(ToolbarPlugin, { compact: true }), _jsx(ActionBar, { formatOpen: formatOpen, onToggleFormat: () => setFormatOpen((open) => !open) })] })] }));
29
+ };
30
+ export default CrmComposerCard;
@@ -1 +1 @@
1
- {"version":3,"file":"EnterHandler.d.ts","sourceRoot":"","sources":["../../../../src/components/message/footer/EnterHandler.tsx"],"names":[],"mappings":"AAwBA,MAAM,CAAC,OAAO,UAAU,YAAY,SAgJnC"}
1
+ {"version":3,"file":"EnterHandler.d.ts","sourceRoot":"","sources":["../../../../src/components/message/footer/EnterHandler.tsx"],"names":[],"mappings":"AAyBA,MAAM,CAAC,OAAO,UAAU,YAAY,SAmJnC"}
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
3
3
  import { KEY_ENTER_COMMAND, COMMAND_PRIORITY_NORMAL, $getSelection, $isRangeSelection, $createParagraphNode, $getRoot, } from "lexical";
4
+ import { clearComposerHistoryAfterUpdate } from "./clearComposerHistory";
4
5
  import { useEffect, useRef } from "react";
5
6
  import { $generateHtmlFromNodes } from "@lexical/html";
6
7
  import { $isListNode, INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND, } from "@lexical/list";
@@ -53,6 +54,7 @@ export default function EnterHandler() {
53
54
  return true;
54
55
  }
55
56
  }
57
+ clearComposerHistoryAfterUpdate(editor);
56
58
  editor.update(() => {
57
59
  const root = $getRoot();
58
60
  root.clear();
@@ -109,6 +111,7 @@ export default function EnterHandler() {
109
111
  ]);
110
112
  useEffect(() => {
111
113
  const clearEditor = () => {
114
+ clearComposerHistoryAfterUpdate(editor);
112
115
  editor.update(() => {
113
116
  const root = $getRoot();
114
117
  root.clear();
@@ -2,7 +2,7 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useEffect, useState } from "react";
4
4
  import { useMessageFooterContext } from ".";
5
- import { Icon } from "../../../components/icon";
5
+ import { AdaptiveIcon } from "../../../components/icon/AdaptiveIcon";
6
6
  import { documentIcon } from "../../../assets/svg";
7
7
  import { DOCUMENT_MIME_TYPES } from "../../../utils/fileValidation";
8
8
  import { formatDuration, shortenFileName } from "../../../utils/common";
@@ -25,7 +25,7 @@ const getFileType = (file) => {
25
25
  return "video";
26
26
  return "image";
27
27
  };
28
- const RemoveButton = ({ file, onRemove }) => (_jsx("button", { type: "button", "data-cp-name": "RemoveButton", onClick: () => onRemove(file), className: "absolute -right-1 -top-1 flex h-5 w-5 items-center justify-center rounded-full bg-gray-900", "aria-label": "X\u00F3a", children: _jsx(Icon, { icon: "close-o", size: 12, className: "text-white" }) }));
28
+ const RemoveButton = ({ file, onRemove }) => (_jsx("button", { type: "button", "data-cp-name": "RemoveButton", onClick: () => onRemove(file), className: "absolute -right-1 -top-1 flex h-5 w-5 items-center justify-center rounded-full bg-gray-900", "aria-label": "X\u00F3a", children: _jsx(AdaptiveIcon, { stroke: "x", font: "close-o", size: 12, className: "text-white" }) }));
29
29
  const MediaThumb = ({ file, onRemove, onVideoReady }) => {
30
30
  var _a;
31
31
  const [src, setSrc] = useState("");
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { Icon } from "../../../components/icon";
3
+ import { AdaptiveIcon } from "../../../components/icon/AdaptiveIcon";
4
4
  import { useFetchUrlMetadata } from "../../../hooks/common/useFetchUrlMetadata";
5
5
  import { getHostLabel } from "../../../utils/link";
6
6
  import { openLink } from "../../../utils/openLink";
@@ -11,6 +11,6 @@ const LinkInputPreview = ({ url, onRemove }) => {
11
11
  const handleOpen = () => {
12
12
  openLink(url, t);
13
13
  };
14
- return (_jsxs("div", { "data-testid": "link-input-preview", "data-cp-name": "LinkInputPreview", className: "flex w-full shrink-0 items-center gap-2 overflow-hidden bg-blue-25 pr-2", children: [_jsxs("button", { type: "button", onClick: handleOpen, className: "flex min-w-0 flex-1 items-center gap-2 py-0 pl-0 text-left", children: [_jsx("div", { className: "flex h-[51px] w-[51px] shrink-0 items-center justify-center overflow-hidden bg-blue-25", children: isLoading ? (_jsx("div", { className: "h-5 w-5 animate-spin rounded-full border-2 border-[var(--dc-color-primary)] border-t-transparent" })) : (data === null || data === void 0 ? void 0 : data.image) ? (_jsx("img", { src: data.image, alt: "", className: "h-full w-full object-cover" })) : (_jsx(Icon, { icon: "link-alt-b", size: 24, className: "text-[var(--dc-color-primary)]" })) }), _jsxs("div", { className: "min-w-0 flex-1", children: [isLoading ? (_jsx("p", { className: "truncate text-[14px] font-medium leading-[1.6] text-gray-900", children: t("link_preview.loading") })) : (_jsxs(_Fragment, { children: [_jsx("p", { className: "truncate text-[14px] font-medium leading-[1.6] text-gray-900", children: (data === null || data === void 0 ? void 0 : data.title) || getHostLabel(url) }), ((data === null || data === void 0 ? void 0 : data.description) || !(data === null || data === void 0 ? void 0 : data.title)) && (_jsx("p", { className: "truncate text-[13px] leading-[1.6] text-gray-400", children: (data === null || data === void 0 ? void 0 : data.description) || getHostLabel(url) }))] })), isError && !isLoading && (_jsx("p", { className: "truncate text-[13px] leading-[1.6] text-gray-400", children: getHostLabel(url) }))] })] }), _jsx("button", { type: "button", onClick: onRemove, "data-testid": "link-input-preview-remove", className: "flex h-4 w-4 shrink-0 items-center justify-center", "aria-label": t("link_preview.remove"), children: _jsx(Icon, { icon: "close-b", size: 16, className: "text-gray-900" }) })] }));
14
+ return (_jsxs("div", { "data-testid": "link-input-preview", "data-cp-name": "LinkInputPreview", className: "flex w-full shrink-0 items-center gap-2 overflow-hidden bg-blue-25 pr-2", children: [_jsxs("button", { type: "button", onClick: handleOpen, className: "flex min-w-0 flex-1 items-center gap-2 py-0 pl-0 text-left", children: [_jsx("div", { className: "flex h-[51px] w-[51px] shrink-0 items-center justify-center overflow-hidden bg-blue-25", children: isLoading ? (_jsx("div", { className: "h-5 w-5 animate-spin rounded-full border-2 border-[var(--dc-color-primary)] border-t-transparent" })) : (data === null || data === void 0 ? void 0 : data.image) ? (_jsx("img", { src: data.image, alt: "", className: "h-full w-full object-cover" })) : (_jsx(AdaptiveIcon, { stroke: "link", font: "link-alt-b", size: 24, className: "text-[var(--dc-color-primary)]" })) }), _jsxs("div", { className: "min-w-0 flex-1", children: [isLoading ? (_jsx("p", { className: "truncate text-[14px] font-medium leading-[1.6] text-gray-900", children: t("link_preview.loading") })) : (_jsxs(_Fragment, { children: [_jsx("p", { className: "truncate text-[14px] font-medium leading-[1.6] text-gray-900", children: (data === null || data === void 0 ? void 0 : data.title) || getHostLabel(url) }), ((data === null || data === void 0 ? void 0 : data.description) || !(data === null || data === void 0 ? void 0 : data.title)) && (_jsx("p", { className: "truncate text-[13px] leading-[1.6] text-gray-400", children: (data === null || data === void 0 ? void 0 : data.description) || getHostLabel(url) }))] })), isError && !isLoading && (_jsx("p", { className: "truncate text-[13px] leading-[1.6] text-gray-400", children: getHostLabel(url) }))] })] }), _jsx("button", { type: "button", onClick: onRemove, "data-testid": "link-input-preview-remove", className: "flex h-4 w-4 shrink-0 items-center justify-center", "aria-label": t("link_preview.remove"), children: _jsx(AdaptiveIcon, { stroke: "x", font: "close-b", size: 16, className: "text-gray-900" }) })] }));
15
15
  };
16
16
  export default LinkInputPreview;
@@ -4,7 +4,8 @@ interface MediaActionsProps {
4
4
  onFilesChange: (files: UploadFile[]) => void;
5
5
  buttonClassName?: string;
6
6
  showMediaUpload?: boolean;
7
+ crmComposer?: boolean;
7
8
  }
8
- export default function MediaActions({ listUploadFiles, onFilesChange, buttonClassName, showMediaUpload, }: MediaActionsProps): import("react/jsx-runtime").JSX.Element;
9
+ export default function MediaActions({ listUploadFiles, onFilesChange, buttonClassName, showMediaUpload, crmComposer, }: MediaActionsProps): import("react/jsx-runtime").JSX.Element;
9
10
  export {};
10
11
  //# sourceMappingURL=MediaActions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MediaActions.d.ts","sourceRoot":"","sources":["../../../../src/components/message/footer/MediaActions.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAkB,UAAU,EAA0B,MAAM,MAAM,CAAC;AAoD1E,UAAU,iBAAiB;IACzB,eAAe,EAAE,UAAU,EAAE,CAAC;IAC9B,aAAa,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,eAAe,EACf,aAAa,EACb,eAAe,EACf,eAAsB,GACvB,EAAE,iBAAiB,2CA8JnB"}
1
+ {"version":3,"file":"MediaActions.d.ts","sourceRoot":"","sources":["../../../../src/components/message/footer/MediaActions.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAkB,UAAU,EAA0B,MAAM,MAAM,CAAC;AAuD1E,UAAU,iBAAiB;IACzB,eAAe,EAAE,UAAU,EAAE,CAAC;IAC9B,aAAa,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,eAAe,EACf,aAAa,EACb,eAAe,EACf,eAAsB,EACtB,WAAmB,GACpB,EAAE,iBAAiB,2CA6LnB"}