@droppii-org/chat-sdk 0.6.56 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (435) hide show
  1. package/dist/components/canned-response/CannedResponseBody.d.ts.map +1 -1
  2. package/dist/components/canned-response/CannedResponseBody.js +4 -3
  3. package/dist/components/canned-response/CannedResponsePanel.d.ts +9 -0
  4. package/dist/components/canned-response/CannedResponsePanel.d.ts.map +1 -0
  5. package/dist/components/canned-response/CannedResponsePanel.js +72 -0
  6. package/dist/components/canned-response/CannedResponseRow.d.ts +10 -0
  7. package/dist/components/canned-response/CannedResponseRow.d.ts.map +1 -0
  8. package/dist/components/canned-response/CannedResponseRow.js +6 -0
  9. package/dist/components/canned-response/CannedScopeChips.d.ts +10 -0
  10. package/dist/components/canned-response/CannedScopeChips.d.ts.map +1 -0
  11. package/dist/components/canned-response/CannedScopeChips.js +34 -0
  12. package/dist/components/canned-response/cannedScopes.d.ts +16 -0
  13. package/dist/components/canned-response/cannedScopes.d.ts.map +1 -0
  14. package/dist/components/canned-response/cannedScopes.js +39 -0
  15. package/dist/components/canned-response/index.d.ts.map +1 -1
  16. package/dist/components/canned-response/index.js +11 -10
  17. package/dist/components/canned-response/insertCannedContent.d.ts +7 -0
  18. package/dist/components/canned-response/insertCannedContent.d.ts.map +1 -0
  19. package/dist/components/canned-response/insertCannedContent.js +39 -0
  20. package/dist/components/canned-response/team/TeamItem.d.ts.map +1 -1
  21. package/dist/components/canned-response/team/TeamItem.js +5 -4
  22. package/dist/components/common/ConfirmModal.d.ts +13 -1
  23. package/dist/components/common/ConfirmModal.d.ts.map +1 -1
  24. package/dist/components/common/ConfirmModal.js +24 -6
  25. package/dist/components/common/DeskPanelDrawer.d.ts +17 -0
  26. package/dist/components/common/DeskPanelDrawer.d.ts.map +1 -0
  27. package/dist/components/common/DeskPanelDrawer.js +21 -0
  28. package/dist/components/common/DeskSidePanel.d.ts +17 -0
  29. package/dist/components/common/DeskSidePanel.d.ts.map +1 -0
  30. package/dist/components/common/DeskSidePanel.js +23 -0
  31. package/dist/components/common/TintedAvatar.d.ts +11 -0
  32. package/dist/components/common/TintedAvatar.d.ts.map +1 -0
  33. package/dist/components/common/TintedAvatar.js +17 -0
  34. package/dist/components/compose/ComposeNewMessageModal.d.ts.map +1 -1
  35. package/dist/components/compose/ComposeNewMessageModal.js +11 -1
  36. package/dist/components/conversation/ConversationByGroupItem.d.ts.map +1 -1
  37. package/dist/components/conversation/ConversationByGroupItem.js +10 -6
  38. package/dist/components/conversation/ConversationBySessionItem.d.ts +4 -1
  39. package/dist/components/conversation/ConversationBySessionItem.d.ts.map +1 -1
  40. package/dist/components/conversation/ConversationBySessionItem.js +36 -10
  41. package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
  42. package/dist/components/conversation/DeskConversationList.js +44 -29
  43. package/dist/components/conversation/DeskConversationRow.d.ts +19 -0
  44. package/dist/components/conversation/DeskConversationRow.d.ts.map +1 -0
  45. package/dist/components/conversation/DeskConversationRow.js +18 -0
  46. package/dist/components/conversation/DeskListEmptyState.d.ts +6 -0
  47. package/dist/components/conversation/DeskListEmptyState.d.ts.map +1 -0
  48. package/dist/components/conversation/DeskListEmptyState.js +11 -0
  49. package/dist/components/conversation/DeskListHeader.d.ts +14 -0
  50. package/dist/components/conversation/DeskListHeader.d.ts.map +1 -0
  51. package/dist/components/conversation/DeskListHeader.js +39 -0
  52. package/dist/components/conversation/DeskListSkeleton.d.ts +6 -0
  53. package/dist/components/conversation/DeskListSkeleton.d.ts.map +1 -0
  54. package/dist/components/conversation/DeskListSkeleton.js +9 -0
  55. package/dist/components/conversation/DeskRowAvatar.d.ts +8 -0
  56. package/dist/components/conversation/DeskRowAvatar.d.ts.map +1 -0
  57. package/dist/components/conversation/DeskRowAvatar.js +6 -0
  58. package/dist/components/conversation/RowChip.d.ts +14 -0
  59. package/dist/components/conversation/RowChip.d.ts.map +1 -0
  60. package/dist/components/conversation/RowChip.js +11 -0
  61. package/dist/components/conversation/avatarTint.d.ts +6 -0
  62. package/dist/components/conversation/avatarTint.d.ts.map +1 -0
  63. package/dist/components/conversation/avatarTint.js +27 -0
  64. package/dist/components/conversation/folderEmptyState.d.ts +2 -0
  65. package/dist/components/conversation/folderEmptyState.d.ts.map +1 -0
  66. package/dist/components/conversation/folderEmptyState.js +14 -0
  67. package/dist/components/conversation/internalNotePreview.d.ts +6 -0
  68. package/dist/components/conversation/internalNotePreview.d.ts.map +1 -0
  69. package/dist/components/conversation/internalNotePreview.js +11 -0
  70. package/dist/components/conversation/listHeading.d.ts +19 -0
  71. package/dist/components/conversation/listHeading.d.ts.map +1 -0
  72. package/dist/components/conversation/listHeading.js +24 -0
  73. package/dist/components/conversation/rowDisplayName.d.ts +7 -0
  74. package/dist/components/conversation/rowDisplayName.d.ts.map +1 -0
  75. package/dist/components/conversation/rowDisplayName.js +8 -0
  76. package/dist/components/conversation/rowTime.d.ts +4 -0
  77. package/dist/components/conversation/rowTime.d.ts.map +1 -0
  78. package/dist/components/conversation/rowTime.js +10 -0
  79. package/dist/components/conversation-detail/PinLimitModal.d.ts.map +1 -1
  80. package/dist/components/conversation-detail/PinLimitModal.js +3 -1
  81. package/dist/components/group/AddMemberModal.d.ts.map +1 -1
  82. package/dist/components/group/AddMemberModal.js +15 -4
  83. package/dist/components/group/AdminPermissionModal.d.ts +1 -0
  84. package/dist/components/group/AdminPermissionModal.d.ts.map +1 -1
  85. package/dist/components/group/AdminPermissionModal.js +38 -3
  86. package/dist/components/group/CreateGroupForm.d.ts +3 -1
  87. package/dist/components/group/CreateGroupForm.d.ts.map +1 -1
  88. package/dist/components/group/CreateGroupForm.js +7 -1
  89. package/dist/components/group/CreateGroupFormCrmView.d.ts +23 -0
  90. package/dist/components/group/CreateGroupFormCrmView.d.ts.map +1 -0
  91. package/dist/components/group/CreateGroupFormCrmView.js +25 -0
  92. package/dist/components/group/DisableSendPermissionConfirm.d.ts +11 -0
  93. package/dist/components/group/DisableSendPermissionConfirm.d.ts.map +1 -0
  94. package/dist/components/group/DisableSendPermissionConfirm.js +10 -0
  95. package/dist/components/group/GroupCompositeAvatar.d.ts.map +1 -1
  96. package/dist/components/group/GroupCompositeAvatar.js +39 -4
  97. package/dist/components/group/GroupMemberPicker.d.ts +5 -2
  98. package/dist/components/group/GroupMemberPicker.d.ts.map +1 -1
  99. package/dist/components/group/GroupMemberPicker.js +8 -42
  100. package/dist/components/group/GroupMemberPickerCrm.d.ts +4 -0
  101. package/dist/components/group/GroupMemberPickerCrm.d.ts.map +1 -0
  102. package/dist/components/group/GroupMemberPickerCrm.js +48 -0
  103. package/dist/components/group/GroupMemberPickerLegacy.d.ts +8 -0
  104. package/dist/components/group/GroupMemberPickerLegacy.d.ts.map +1 -0
  105. package/dist/components/group/GroupMemberPickerLegacy.js +46 -0
  106. package/dist/components/group/GroupPanelHeader.d.ts +10 -0
  107. package/dist/components/group/GroupPanelHeader.d.ts.map +1 -0
  108. package/dist/components/group/GroupPanelHeader.js +11 -0
  109. package/dist/components/group/MemberPermissionPanel.d.ts.map +1 -1
  110. package/dist/components/group/MemberPermissionPanel.js +31 -2
  111. package/dist/components/group/PermissionPanelCrm.d.ts +24 -0
  112. package/dist/components/group/PermissionPanelCrm.d.ts.map +1 -0
  113. package/dist/components/group/PermissionPanelCrm.js +16 -0
  114. package/dist/components/group/PersonAvatar.d.ts +11 -0
  115. package/dist/components/group/PersonAvatar.d.ts.map +1 -0
  116. package/dist/components/group/PersonAvatar.js +21 -0
  117. package/dist/components/group/crmIcon.d.ts +9 -0
  118. package/dist/components/group/crmIcon.d.ts.map +1 -0
  119. package/dist/components/group/crmIcon.js +38 -0
  120. package/dist/components/icon/AdaptiveIcon.d.ts +15 -0
  121. package/dist/components/icon/AdaptiveIcon.d.ts.map +1 -0
  122. package/dist/components/icon/AdaptiveIcon.js +10 -0
  123. package/dist/components/icon/StrokeIcon.d.ts +14 -0
  124. package/dist/components/icon/StrokeIcon.d.ts.map +1 -0
  125. package/dist/components/icon/StrokeIcon.js +5 -0
  126. package/dist/components/icon/strokeIconNodes.d.ts +431 -0
  127. package/dist/components/icon/strokeIconNodes.d.ts.map +1 -0
  128. package/dist/components/icon/strokeIconNodes.js +269 -0
  129. package/dist/components/media-collection/index.d.ts.map +1 -1
  130. package/dist/components/media-collection/index.js +21 -5
  131. package/dist/components/message/GroupMembersDrawer.d.ts.map +1 -1
  132. package/dist/components/message/GroupMembersDrawer.js +60 -13
  133. package/dist/components/message/GroupMembersPanelCrm.d.ts +23 -0
  134. package/dist/components/message/GroupMembersPanelCrm.d.ts.map +1 -0
  135. package/dist/components/message/GroupMembersPanelCrm.js +55 -0
  136. package/dist/components/message/MessageHeader.d.ts.map +1 -1
  137. package/dist/components/message/MessageHeader.js +76 -27
  138. package/dist/components/message/MessageInfiniteScroll.d.ts +4 -2
  139. package/dist/components/message/MessageInfiniteScroll.d.ts.map +1 -1
  140. package/dist/components/message/MessageInfiniteScroll.js +1 -1
  141. package/dist/components/message/MessageList.d.ts +2 -1
  142. package/dist/components/message/MessageList.d.ts.map +1 -1
  143. package/dist/components/message/MessageList.js +12 -1
  144. package/dist/components/message/SelectSession.d.ts +4 -1
  145. package/dist/components/message/SelectSession.d.ts.map +1 -1
  146. package/dist/components/message/SelectSession.js +13 -4
  147. package/dist/components/message/UnassignedSessionFooter.js +2 -2
  148. package/dist/components/message/footer/ActionBar.d.ts +5 -1
  149. package/dist/components/message/footer/ActionBar.d.ts.map +1 -1
  150. package/dist/components/message/footer/ActionBar.js +14 -1
  151. package/dist/components/message/footer/CannedResponsePlugin.d.ts.map +1 -1
  152. package/dist/components/message/footer/CannedResponsePlugin.js +18 -3
  153. package/dist/components/message/footer/ClosedSessionBanner.d.ts +9 -0
  154. package/dist/components/message/footer/ClosedSessionBanner.d.ts.map +1 -0
  155. package/dist/components/message/footer/ClosedSessionBanner.js +13 -0
  156. package/dist/components/message/footer/ComposerEditor.d.ts.map +1 -1
  157. package/dist/components/message/footer/ComposerEditor.js +9 -4
  158. package/dist/components/message/footer/ComposerTabs.d.ts +1 -2
  159. package/dist/components/message/footer/ComposerTabs.d.ts.map +1 -1
  160. package/dist/components/message/footer/ComposerTabs.js +14 -35
  161. package/dist/components/message/footer/CrmComposerCard.d.ts +11 -0
  162. package/dist/components/message/footer/CrmComposerCard.d.ts.map +1 -0
  163. package/dist/components/message/footer/CrmComposerCard.js +30 -0
  164. package/dist/components/message/footer/EnterHandler.d.ts.map +1 -1
  165. package/dist/components/message/footer/EnterHandler.js +3 -0
  166. package/dist/components/message/footer/FilePreview.js +2 -2
  167. package/dist/components/message/footer/LinkInputPreview.js +2 -2
  168. package/dist/components/message/footer/MediaActions.d.ts +2 -1
  169. package/dist/components/message/footer/MediaActions.d.ts.map +1 -1
  170. package/dist/components/message/footer/MediaActions.js +21 -4
  171. package/dist/components/message/footer/SessionClosedModal.d.ts +3 -1
  172. package/dist/components/message/footer/SessionClosedModal.d.ts.map +1 -1
  173. package/dist/components/message/footer/SessionClosedModal.js +6 -2
  174. package/dist/components/message/footer/ToolbarPlugin.d.ts +3 -1
  175. package/dist/components/message/footer/ToolbarPlugin.d.ts.map +1 -1
  176. package/dist/components/message/footer/ToolbarPlugin.js +2 -2
  177. package/dist/components/message/footer/clearComposerHistory.d.ts +3 -0
  178. package/dist/components/message/footer/clearComposerHistory.d.ts.map +1 -0
  179. package/dist/components/message/footer/clearComposerHistory.js +11 -0
  180. package/dist/components/message/footer/index.d.ts +2 -2
  181. package/dist/components/message/footer/index.d.ts.map +1 -1
  182. package/dist/components/message/footer/index.js +15 -5
  183. package/dist/components/message/footer/mention/MentionMenu.d.ts.map +1 -1
  184. package/dist/components/message/footer/mention/MentionMenu.js +4 -1
  185. package/dist/components/message/footer/useComposerFocusRequest.d.ts +10 -0
  186. package/dist/components/message/footer/useComposerFocusRequest.d.ts.map +1 -0
  187. package/dist/components/message/footer/useComposerFocusRequest.js +28 -0
  188. package/dist/components/message/groupMemberMenuCrm.d.ts +32 -0
  189. package/dist/components/message/groupMemberMenuCrm.d.ts.map +1 -0
  190. package/dist/components/message/groupMemberMenuCrm.js +83 -0
  191. package/dist/components/message/groupMemberTypes.d.ts +13 -0
  192. package/dist/components/message/groupMemberTypes.d.ts.map +1 -0
  193. package/dist/components/message/groupMemberTypes.js +1 -0
  194. package/dist/components/message/headerIconButton.d.ts +10 -0
  195. package/dist/components/message/headerIconButton.d.ts.map +1 -0
  196. package/dist/components/message/headerIconButton.js +9 -0
  197. package/dist/components/message/item/CrmSystemLine.d.ts +10 -0
  198. package/dist/components/message/item/CrmSystemLine.d.ts.map +1 -0
  199. package/dist/components/message/item/CrmSystemLine.js +6 -0
  200. package/dist/components/message/item/DateDivider.d.ts +5 -0
  201. package/dist/components/message/item/DateDivider.d.ts.map +1 -0
  202. package/dist/components/message/item/DateDivider.js +5 -0
  203. package/dist/components/message/item/GroupNotificationMessage.d.ts.map +1 -1
  204. package/dist/components/message/item/GroupNotificationMessage.js +9 -0
  205. package/dist/components/message/item/MemberEventSummary.d.ts +8 -0
  206. package/dist/components/message/item/MemberEventSummary.d.ts.map +1 -0
  207. package/dist/components/message/item/MemberEventSummary.js +18 -0
  208. package/dist/components/message/item/MessageBubble.d.ts +3 -1
  209. package/dist/components/message/item/MessageBubble.d.ts.map +1 -1
  210. package/dist/components/message/item/MessageBubble.js +27 -13
  211. package/dist/components/message/item/MessageMoreButton.d.ts +13 -0
  212. package/dist/components/message/item/MessageMoreButton.d.ts.map +1 -0
  213. package/dist/components/message/item/MessageMoreButton.js +42 -0
  214. package/dist/components/message/item/RevokeMessage.js +1 -1
  215. package/dist/components/message/item/SessionEventMessage.d.ts.map +1 -1
  216. package/dist/components/message/item/SessionEventMessage.js +13 -1
  217. package/dist/components/message/item/SystemLogMessage.d.ts.map +1 -1
  218. package/dist/components/message/item/SystemLogMessage.js +7 -0
  219. package/dist/components/message/item/index.d.ts.map +1 -1
  220. package/dist/components/message/item/index.js +64 -15
  221. package/dist/components/message/item/otherSenders.d.ts +7 -0
  222. package/dist/components/message/item/otherSenders.d.ts.map +1 -0
  223. package/dist/components/message/item/otherSenders.js +29 -0
  224. package/dist/components/message/item/textStyle.d.ts +1 -1
  225. package/dist/components/message/item/textStyle.d.ts.map +1 -1
  226. package/dist/components/message/item/textStyle.js +2 -2
  227. package/dist/components/message/messageKeyboardNav.d.ts +8 -0
  228. package/dist/components/message/messageKeyboardNav.d.ts.map +1 -0
  229. package/dist/components/message/messageKeyboardNav.js +24 -0
  230. package/dist/components/message/reply/ReplyPreviewBar.js +2 -2
  231. package/dist/components/message/toolbox/MessageToolboxMenu.d.ts.map +1 -1
  232. package/dist/components/message/toolbox/MessageToolboxMenu.js +16 -1
  233. package/dist/components/search-conversation/SearchAll.d.ts.map +1 -1
  234. package/dist/components/search-conversation/SearchAll.js +12 -1
  235. package/dist/components/search-conversation/SearchDrawer.d.ts.map +1 -1
  236. package/dist/components/search-conversation/SearchDrawer.js +31 -15
  237. package/dist/components/search-conversation/SearchMessageOnCurrentConversation.d.ts.map +1 -1
  238. package/dist/components/search-conversation/SearchMessageOnCurrentConversation.js +5 -2
  239. package/dist/components/search-conversation/index.d.ts.map +1 -1
  240. package/dist/components/search-conversation/index.js +3 -1
  241. package/dist/components/search-conversation/item/SearchItemAsGroup.d.ts.map +1 -1
  242. package/dist/components/search-conversation/item/SearchItemAsGroup.js +14 -4
  243. package/dist/components/search-conversation/item/SearchItemAsMessage.d.ts.map +1 -1
  244. package/dist/components/search-conversation/item/SearchItemAsMessage.js +18 -7
  245. package/dist/components/search-conversation/item/SearchItemAsUser.d.ts.map +1 -1
  246. package/dist/components/search-conversation/item/SearchItemAsUser.js +23 -5
  247. package/dist/components/search-conversation/item/searchRowClass.d.ts +3 -0
  248. package/dist/components/search-conversation/item/searchRowClass.d.ts.map +1 -0
  249. package/dist/components/search-conversation/item/searchRowClass.js +5 -0
  250. package/dist/components/session/DeskAssignedSession.d.ts +5 -1
  251. package/dist/components/session/DeskAssignedSession.d.ts.map +1 -1
  252. package/dist/components/session/DeskAssignedSession.js +40 -12
  253. package/dist/components/session/DeskTeamInbox.d.ts.map +1 -1
  254. package/dist/components/session/DeskTeamInbox.js +15 -22
  255. package/dist/components/session/FolderRow.d.ts +21 -0
  256. package/dist/components/session/FolderRow.d.ts.map +1 -0
  257. package/dist/components/session/FolderRow.js +16 -0
  258. package/dist/components/session/SessionFolderList.d.ts +23 -0
  259. package/dist/components/session/SessionFolderList.d.ts.map +1 -0
  260. package/dist/components/session/SessionFolderList.js +27 -0
  261. package/dist/components/session/sessionFilters.d.ts +24 -0
  262. package/dist/components/session/sessionFilters.d.ts.map +1 -0
  263. package/dist/components/session/sessionFilters.js +80 -0
  264. package/dist/components/shortcut-help/ShortcutHelpModal.d.ts +8 -0
  265. package/dist/components/shortcut-help/ShortcutHelpModal.d.ts.map +1 -0
  266. package/dist/components/shortcut-help/ShortcutHelpModal.js +23 -0
  267. package/dist/components/thread/AssignConfirmModal.d.ts.map +1 -1
  268. package/dist/components/thread/AssignConfirmModal.js +4 -3
  269. package/dist/components/thread/EndSessionConfirm.d.ts +11 -0
  270. package/dist/components/thread/EndSessionConfirm.d.ts.map +1 -0
  271. package/dist/components/thread/EndSessionConfirm.js +31 -0
  272. package/dist/components/thread/EndSessionToast.d.ts +6 -0
  273. package/dist/components/thread/EndSessionToast.d.ts.map +1 -0
  274. package/dist/components/thread/EndSessionToast.js +18 -0
  275. package/dist/components/thread/GroupInfoBodyCrm.d.ts +46 -0
  276. package/dist/components/thread/GroupInfoBodyCrm.d.ts.map +1 -0
  277. package/dist/components/thread/GroupInfoBodyCrm.js +41 -0
  278. package/dist/components/thread/GroupInfoRows.d.ts +33 -0
  279. package/dist/components/thread/GroupInfoRows.d.ts.map +1 -0
  280. package/dist/components/thread/GroupInfoRows.js +18 -0
  281. package/dist/components/thread/GroupThreadInfo.d.ts.map +1 -1
  282. package/dist/components/thread/GroupThreadInfo.js +23 -6
  283. package/dist/components/thread/ManualAssignPopover.d.ts +3 -1
  284. package/dist/components/thread/ManualAssignPopover.d.ts.map +1 -1
  285. package/dist/components/thread/ManualAssignPopover.js +21 -9
  286. package/dist/components/thread/SessionDetailCard.d.ts +6 -0
  287. package/dist/components/thread/SessionDetailCard.d.ts.map +1 -0
  288. package/dist/components/thread/SessionDetailCard.js +103 -0
  289. package/dist/components/thread/SessionSection.d.ts +2 -4
  290. package/dist/components/thread/SessionSection.d.ts.map +1 -1
  291. package/dist/components/thread/SessionSection.js +19 -122
  292. package/dist/components/thread/SessionTagPicker.d.ts +11 -0
  293. package/dist/components/thread/SessionTagPicker.d.ts.map +1 -0
  294. package/dist/components/thread/SessionTagPicker.js +27 -0
  295. package/dist/components/thread/SingleThreadInfo.d.ts.map +1 -1
  296. package/dist/components/thread/SingleThreadInfo.js +16 -6
  297. package/dist/components/thread/SupportSessionPanel.d.ts +18 -0
  298. package/dist/components/thread/SupportSessionPanel.d.ts.map +1 -0
  299. package/dist/components/thread/SupportSessionPanel.js +46 -0
  300. package/dist/components/thread/ThreadInfo.d.ts +8 -1
  301. package/dist/components/thread/ThreadInfo.d.ts.map +1 -1
  302. package/dist/components/thread/ThreadInfo.js +27 -29
  303. package/dist/components/thread/ThreadInfoHeader.d.ts +13 -0
  304. package/dist/components/thread/ThreadInfoHeader.d.ts.map +1 -0
  305. package/dist/components/thread/ThreadInfoHeader.js +11 -0
  306. package/dist/components/thread/UserSection.d.ts.map +1 -1
  307. package/dist/components/thread/UserSection.js +35 -22
  308. package/dist/components/thread/sessionDateFormat.d.ts +3 -0
  309. package/dist/components/thread/sessionDateFormat.d.ts.map +1 -0
  310. package/dist/components/thread/sessionDateFormat.js +13 -0
  311. package/dist/components/thread/sessionDuration.d.ts +5 -0
  312. package/dist/components/thread/sessionDuration.d.ts.map +1 -0
  313. package/dist/components/thread/sessionDuration.js +24 -0
  314. package/dist/constants/index.d.ts +1 -0
  315. package/dist/constants/index.d.ts.map +1 -1
  316. package/dist/constants/index.js +2 -0
  317. package/dist/constants/layout.d.ts +24 -0
  318. package/dist/constants/layout.d.ts.map +1 -0
  319. package/dist/constants/layout.js +23 -0
  320. package/dist/context/ChatContext.d.ts.map +1 -1
  321. package/dist/context/ChatContext.js +27 -1
  322. package/dist/hooks/canned-response/useSearchCannedAcrossScopes.d.ts +7 -0
  323. package/dist/hooks/canned-response/useSearchCannedAcrossScopes.d.ts.map +1 -0
  324. package/dist/hooks/canned-response/useSearchCannedAcrossScopes.js +46 -0
  325. package/dist/hooks/common/useCloseOnSidePanelOpen.d.ts +3 -0
  326. package/dist/hooks/common/useCloseOnSidePanelOpen.d.ts.map +1 -0
  327. package/dist/hooks/common/useCloseOnSidePanelOpen.js +15 -0
  328. package/dist/hooks/common/useDeskShortcuts.d.ts +11 -0
  329. package/dist/hooks/common/useDeskShortcuts.d.ts.map +1 -0
  330. package/dist/hooks/common/useDeskShortcuts.js +94 -0
  331. package/dist/hooks/common/useEscapeLayer.d.ts +3 -0
  332. package/dist/hooks/common/useEscapeLayer.d.ts.map +1 -0
  333. package/dist/hooks/common/useEscapeLayer.js +18 -0
  334. package/dist/hooks/common/useMediaQuery.d.ts +3 -0
  335. package/dist/hooks/common/useMediaQuery.d.ts.map +1 -0
  336. package/dist/hooks/common/useMediaQuery.js +12 -0
  337. package/dist/hooks/common/useSidePanel.d.ts +12 -0
  338. package/dist/hooks/common/useSidePanel.d.ts.map +1 -0
  339. package/dist/hooks/common/useSidePanel.js +32 -0
  340. package/dist/hooks/group/useConversationGroups.d.ts.map +1 -1
  341. package/dist/hooks/group/useConversationGroups.js +3 -0
  342. package/dist/hooks/message/useNewMessageAnnouncement.d.ts +3 -0
  343. package/dist/hooks/message/useNewMessageAnnouncement.d.ts.map +1 -0
  344. package/dist/hooks/message/useNewMessageAnnouncement.js +30 -0
  345. package/dist/hooks/search/useSearchGroups.js +2 -1
  346. package/dist/hooks/search/useSearchMessage.d.ts +3 -1
  347. package/dist/hooks/search/useSearchMessage.d.ts.map +1 -1
  348. package/dist/hooks/search/useSearchMessage.js +2 -2
  349. package/dist/hooks/session/useBotSessionOwnerIdentity.d.ts +12 -0
  350. package/dist/hooks/session/useBotSessionOwnerIdentity.d.ts.map +1 -0
  351. package/dist/hooks/session/useBotSessionOwnerIdentity.js +22 -0
  352. package/dist/hooks/session/useCloseSession.d.ts +1 -0
  353. package/dist/hooks/session/useCloseSession.d.ts.map +1 -1
  354. package/dist/hooks/session/useCloseSession.js +9 -8
  355. package/dist/hooks/session/useEndSession.d.ts +11 -0
  356. package/dist/hooks/session/useEndSession.d.ts.map +1 -0
  357. package/dist/hooks/session/useEndSession.js +45 -0
  358. package/dist/hooks/session/useGetSession.d.ts.map +1 -1
  359. package/dist/hooks/session/useGetSession.js +27 -6
  360. package/dist/hooks/session/usePendingSessionClose.d.ts +5 -0
  361. package/dist/hooks/session/usePendingSessionClose.d.ts.map +1 -0
  362. package/dist/hooks/session/usePendingSessionClose.js +12 -0
  363. package/dist/hooks/session/useSessionCustomerName.d.ts +3 -0
  364. package/dist/hooks/session/useSessionCustomerName.d.ts.map +1 -0
  365. package/dist/hooks/session/useSessionCustomerName.js +19 -0
  366. package/dist/hooks/session/useSessionFieldAutosave.d.ts +19 -0
  367. package/dist/hooks/session/useSessionFieldAutosave.d.ts.map +1 -0
  368. package/dist/hooks/session/useSessionFieldAutosave.js +52 -0
  369. package/dist/index.d.ts +8 -2
  370. package/dist/index.d.ts.map +1 -1
  371. package/dist/index.js +5 -1
  372. package/dist/locales/vi/common.json +201 -21
  373. package/dist/locales/vi/conversation-inbox.json +21 -2
  374. package/dist/screens/desk-message/DeskWorkspace.d.ts +12 -0
  375. package/dist/screens/desk-message/DeskWorkspace.d.ts.map +1 -0
  376. package/dist/screens/desk-message/DeskWorkspace.js +57 -0
  377. package/dist/screens/desk-message/FolderOverlay.d.ts +4 -0
  378. package/dist/screens/desk-message/FolderOverlay.d.ts.map +1 -0
  379. package/dist/screens/desk-message/FolderOverlay.js +32 -0
  380. package/dist/screens/desk-message/SkipLinks.d.ts +4 -0
  381. package/dist/screens/desk-message/SkipLinks.d.ts.map +1 -0
  382. package/dist/screens/desk-message/SkipLinks.js +19 -0
  383. package/dist/screens/desk-message/ViewportNotice.d.ts +4 -0
  384. package/dist/screens/desk-message/ViewportNotice.d.ts.map +1 -0
  385. package/dist/screens/desk-message/ViewportNotice.js +9 -0
  386. package/dist/screens/desk-message/index.d.ts +3 -2
  387. package/dist/screens/desk-message/index.d.ts.map +1 -1
  388. package/dist/screens/desk-message/index.js +4 -12
  389. package/dist/store/deskPanelHost.d.ts +13 -0
  390. package/dist/store/deskPanelHost.d.ts.map +1 -0
  391. package/dist/store/deskPanelHost.js +9 -0
  392. package/dist/store/escapeLayers.d.ts +15 -0
  393. package/dist/store/escapeLayers.d.ts.map +1 -0
  394. package/dist/store/escapeLayers.js +15 -0
  395. package/dist/store/pendingSessionClose.d.ts +19 -0
  396. package/dist/store/pendingSessionClose.d.ts.map +1 -0
  397. package/dist/store/pendingSessionClose.js +74 -0
  398. package/dist/store/session.d.ts +2 -1
  399. package/dist/store/session.d.ts.map +1 -1
  400. package/dist/store/session.js +4 -1
  401. package/dist/store/sessionFolder.d.ts +15 -0
  402. package/dist/store/sessionFolder.d.ts.map +1 -0
  403. package/dist/store/sessionFolder.js +18 -0
  404. package/dist/store/shortcutPrefs.d.ts +9 -0
  405. package/dist/store/shortcutPrefs.d.ts.map +1 -0
  406. package/dist/store/shortcutPrefs.js +23 -0
  407. package/dist/store/sidePanel.d.ts +12 -0
  408. package/dist/store/sidePanel.d.ts.map +1 -0
  409. package/dist/store/sidePanel.js +9 -0
  410. package/dist/store/workspaceLayout.d.ts +12 -0
  411. package/dist/store/workspaceLayout.d.ts.map +1 -0
  412. package/dist/store/workspaceLayout.js +9 -0
  413. package/dist/styles/global.css +1 -1
  414. package/dist/types/chat.d.ts +18 -0
  415. package/dist/types/chat.d.ts.map +1 -1
  416. package/dist/types/dto.d.ts +2 -1
  417. package/dist/types/dto.d.ts.map +1 -1
  418. package/dist/utils/a11yClickable.d.ts +10 -0
  419. package/dist/utils/a11yClickable.d.ts.map +1 -0
  420. package/dist/utils/a11yClickable.js +15 -0
  421. package/dist/utils/events.d.ts +4 -0
  422. package/dist/utils/events.d.ts.map +1 -1
  423. package/dist/utils/headerMemberCount.d.ts +10 -0
  424. package/dist/utils/headerMemberCount.d.ts.map +1 -0
  425. package/dist/utils/headerMemberCount.js +3 -0
  426. package/dist/utils/memberEventRun.d.ts +16 -0
  427. package/dist/utils/memberEventRun.d.ts.map +1 -0
  428. package/dist/utils/memberEventRun.js +40 -0
  429. package/package.json +2 -2
  430. package/dist/components/session/SessionFilterMenu.d.ts +0 -15
  431. package/dist/components/session/SessionFilterMenu.d.ts.map +0 -1
  432. package/dist/components/session/SessionFilterMenu.js +0 -30
  433. package/dist/components/session/sessionMenuItems.d.ts +0 -28
  434. package/dist/components/session/sessionMenuItems.d.ts.map +0 -1
  435. package/dist/components/session/sessionMenuItems.js +0 -119
@@ -1 +1 @@
1
- {"version":3,"file":"ComposeNewMessageModal.d.ts","sourceRoot":"","sources":["../../../src/components/compose/ComposeNewMessageModal.tsx"],"names":[],"mappings":"AAeA,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAID,QAAA,MAAM,sBAAsB,GAAI,oBAG7B,2BAA2B,4CAuI7B,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
1
+ {"version":3,"file":"ComposeNewMessageModal.d.ts","sourceRoot":"","sources":["../../../src/components/compose/ComposeNewMessageModal.tsx"],"names":[],"mappings":"AAmBA,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAID,QAAA,MAAM,sBAAsB,GAAI,oBAG7B,2BAA2B,4CAwO7B,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { clickableProps, FOCUS_RING_CLASS } from "../../utils/a11yClickable";
3
4
  import { useDebounce } from "ahooks";
4
5
  import { Avatar, Empty, Input, Modal, Spin } from "antd";
5
6
  import { useState } from "react";
@@ -10,10 +11,15 @@ import { useEligibleAccounts } from "../../hooks/group/useEligibleAccounts";
10
11
  import { DChatSDK } from "../../constants/sdk";
11
12
  import useConversationStore from "../../store/conversation";
12
13
  import CreateGroupForm from "../../components/group/CreateGroupForm";
14
+ import useAuthStore from "../../store/auth";
15
+ import { StrokeIcon } from "../../components/icon/StrokeIcon";
16
+ import TintedAvatar from "../../components/common/TintedAvatar";
13
17
  import { useChatNavigate } from "../../hooks/conversation/useChatNavigate";
14
18
  const ComposeNewMessageModal = ({ open, onClose, }) => {
15
19
  const { t } = useTranslation("conversation-inbox");
20
+ const isCrm = useAuthStore((state) => state.isCrm);
16
21
  const [step, setStep] = useState("compose");
22
+ const [footerEl, setFooterEl] = useState(null);
17
23
  const [search, setSearch] = useState("");
18
24
  const [openingUserID, setOpeningUserID] = useState(null);
19
25
  const debouncedSearch = useDebounce(search, { wait: 300 });
@@ -54,6 +60,10 @@ const ComposeNewMessageModal = ({ open, onClose, }) => {
54
60
  setOpeningUserID(null);
55
61
  }
56
62
  };
57
- return (_jsx(Modal, { "data-cp-name": "ComposeNewMessageModal", title: step === "create-group" ? t("create_group.title") : t("compose.title"), open: open, onCancel: handleClose, afterClose: handleAfterClose, footer: null, centered: true, forceRender: true, width: step === "create-group" ? 720 : undefined, getContainer: false, children: step === "compose" ? (_jsxs("div", { className: "flex flex-col gap-4", children: [_jsx(Input, { size: "large", value: search, onChange: (event) => setSearch(event.target.value), placeholder: t("compose.search_member_placeholder"), prefix: _jsx(Icon, { icon: "search-o", size: 18, className: "text-gray-400" }) }), _jsxs("button", { type: "button", className: "flex items-center gap-3 rounded-xl bg-[var(--dc-color-primary-light)] px-4 py-3.5 text-left transition-colors hover:bg-[var(--dc-color-primary-light)]", onClick: () => setStep("create-group"), children: [_jsx("span", { className: "flex h-11 w-11 shrink-0 items-center justify-center rounded-full bg-white", children: _jsx(Icon, { icon: "user-three-b", size: 22, className: "text-[var(--dc-color-primary)]" }) }), _jsx("span", { className: "flex-1 text-base font-semibold text-gray-900", children: t("compose.create_group") }), _jsx(Icon, { icon: "angle-right-o", size: 18, className: "text-gray-400" })] }), !debouncedSearch && (_jsxs("div", { className: "flex items-center gap-2 px-1", children: [_jsx("span", { className: "shrink-0 text-xs font-semibold uppercase tracking-wide text-gray-400", children: t("compose.recent_suggestions") }), _jsx("span", { className: "h-px flex-1 bg-gray-100" })] })), _jsx("div", { className: "max-h-80 overflow-y-auto", children: isLoading ? (_jsx("div", { className: "flex items-center justify-center py-6", children: _jsx(Spin, {}) })) : accounts.length === 0 ? (_jsx(Empty, { description: t("compose.no_member_found") })) : (accounts.map((account) => (_jsxs("div", { className: "flex cursor-pointer items-center gap-3 border-b border-gray-50 px-1 py-3 transition-colors last:border-b-0 hover:bg-[#f5f5f5]", onClick: () => handleOpenDirectMessage(account), children: [_jsx(Avatar, { src: account.avatar, size: 44, className: "shrink-0", children: account.displayName.charAt(0) || "A" }), _jsx("span", { className: "flex-1 truncate text-base font-medium text-gray-900", children: account.displayName }), openingUserID === account.userID && _jsx(Spin, { size: "small" })] }, account.userID)))) })] })) : (_jsx(CreateGroupForm, { onDone: handleClose })) }));
63
+ return (_jsx(Modal, { "data-cp-name": "ComposeNewMessageModal", title: step !== "create-group" ? (t("compose.title")) : isCrm ? (_jsxs("span", { className: "flex items-center gap-3", children: [_jsx("button", { type: "button", onClick: () => setStep("compose"), "aria-label": t("create_group.back_to_compose_label"), title: t("create_group.back_to_compose_label"), className: "-ml-1 flex h-8 w-8 items-center justify-center rounded-lg text-gray-600 hover:bg-gray-5 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary-200", children: _jsx(StrokeIcon, { name: "chevron-left", size: 20 }) }), t("create_group.title")] })) : (t("create_group.title")), open: open, onCancel: handleClose, afterClose: handleAfterClose, footer: isCrm && step === "create-group" ? _jsx("div", { ref: setFooterEl }) : null, centered: true, destroyOnHidden: true, width: step === "create-group" ? 720 : undefined, getContainer: false, children: step === "compose" ? (_jsxs("div", { className: "flex flex-col gap-4", children: [isCrm ? (_jsx(Input, { size: "large", variant: "borderless", value: search, onChange: (event) => setSearch(event.target.value), placeholder: t("compose.search_member_placeholder"), "aria-label": t("compose.search_member_placeholder"), className: "!bg-gray-5 !px-2.5 focus-within:!ring-2 focus-within:!ring-primary-200", prefix: _jsx(StrokeIcon, { name: "search", size: 18, className: "mr-1 text-gray-600" }) })) : (_jsx(Input, { size: "large", value: search, onChange: (event) => setSearch(event.target.value), placeholder: t("compose.search_member_placeholder"), prefix: _jsx(Icon, { icon: "search-o", size: 18, className: "text-gray-400" }) })), _jsxs("button", { type: "button", className: `flex items-center gap-3 rounded-xl px-4 py-3.5 text-left transition-colors ${isCrm
64
+ ? "bg-gray-5 hover:bg-gray-25"
65
+ : "bg-[var(--dc-color-primary-light)] hover:bg-[var(--dc-color-primary-light)]"}`, onClick: () => setStep("create-group"), children: [_jsx("span", { className: "flex h-11 w-11 shrink-0 items-center justify-center rounded-full bg-white", children: isCrm ? (_jsx(StrokeIcon, { name: "users", size: 22, className: "text-primary-400" })) : (_jsx(Icon, { icon: "user-three-b", size: 22, className: "text-[var(--dc-color-primary)]" })) }), _jsx("span", { className: "flex-1 text-base font-semibold text-gray-900", children: t("compose.create_group") }), isCrm ? (_jsx(StrokeIcon, { name: "chevron-right", size: 18, className: "text-gray-600" })) : (_jsx(Icon, { icon: "angle-right-o", size: 18, className: "text-gray-400" }))] }), !debouncedSearch && (_jsxs("div", { className: "flex items-center gap-2 px-1", children: [_jsx("span", { className: isCrm
66
+ ? "shrink-0 text-[13px] font-semibold text-gray-600"
67
+ : "shrink-0 text-xs font-semibold uppercase tracking-wide text-gray-400", children: t("compose.recent_suggestions") }), _jsx("span", { className: `h-px flex-1 ${isCrm ? "bg-gray-25" : "bg-gray-100"}` })] })), _jsx("div", { className: "max-h-80 overflow-y-auto", children: isLoading ? (_jsx("div", { className: "flex items-center justify-center py-6", children: _jsx(Spin, {}) })) : accounts.length === 0 ? (_jsx(Empty, { description: t("compose.no_member_found") })) : (accounts.map((account) => isCrm ? (_jsxs("div", Object.assign({ className: `flex cursor-pointer items-center gap-3 rounded-lg px-2 py-2 transition-colors hover:bg-gray-5 ${FOCUS_RING_CLASS}` }, clickableProps(() => handleOpenDirectMessage(account)), { children: [_jsx(TintedAvatar, { name: account.displayName, src: account.avatar, size: 40 }), _jsxs("span", { className: "flex min-w-0 flex-1 flex-col", children: [_jsx("span", { className: "truncate text-sm font-medium text-gray-900", children: account.displayName }), account.username && (_jsx("span", { className: "truncate text-xs text-gray-600", children: account.username }))] }), openingUserID === account.userID && _jsx(Spin, { size: "small" })] }), account.userID)) : (_jsxs("div", Object.assign({ className: `flex cursor-pointer items-center gap-3 border-b border-gray-50 px-1 py-3 transition-colors last:border-b-0 hover:bg-[#f5f5f5] ${FOCUS_RING_CLASS}` }, clickableProps(() => handleOpenDirectMessage(account)), { children: [_jsx(Avatar, { src: account.avatar, size: 44, className: "shrink-0", children: account.displayName.charAt(0) || "A" }), _jsx("span", { className: "flex-1 truncate text-base font-medium text-gray-900", children: account.displayName }), openingUserID === account.userID && _jsx(Spin, { size: "small" })] }), account.userID)))) })] })) : (_jsx(CreateGroupForm, { onDone: handleClose, footerEl: footerEl })) }));
58
68
  };
59
69
  export default ComposeNewMessageModal;
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationByGroupItem.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/ConversationByGroupItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qCAAqC,CAAC;AASxF,UAAU,4BAA4B;IACpC,KAAK,EAAE,4BAA4B,CAAC;IACpC,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,QAAA,MAAM,uBAAuB,GAAI,2BAG9B,4BAA4B,4CAgE9B,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
1
+ {"version":3,"file":"ConversationByGroupItem.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/ConversationByGroupItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qCAAqC,CAAC;AAaxF,UAAU,4BAA4B;IACpC,KAAK,EAAE,4BAA4B,CAAC;IACpC,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,QAAA,MAAM,uBAAuB,GAAI,2BAG9B,4BAA4B,4CAoE9B,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
@@ -1,12 +1,16 @@
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 { useTranslation } from "react-i18next";
4
4
  import useConversationStore from "../../store/conversation";
5
5
  import { useChatContext } from "../../context/ChatContext";
6
6
  import { useChatNavigate } from "../../hooks/conversation/useChatNavigate";
7
- import { formatTimestamp, parseLatestMessage } from "../../utils/common";
7
+ import { parseLatestMessage } from "../../utils/common";
8
8
  import GroupCompositeAvatar from "../../components/group/GroupCompositeAvatar";
9
- import ThreadCard from "./ThreadCard";
9
+ import DeskConversationRow from "./DeskConversationRow";
10
+ import { GroupVisibility } from "@droppii-org/wasm-client-sdk";
11
+ import { StrokeIcon } from "../../components/icon/StrokeIcon";
12
+ import RowChip from "./RowChip";
13
+ import { formatListRowTime } from "./rowTime";
10
14
  import MentionIndicatorIcon from "./MentionIndicatorIcon";
11
15
  const ConversationByGroupItem = ({ group, latestPreview, }) => {
12
16
  const { t } = useTranslation();
@@ -28,12 +32,12 @@ const ConversationByGroupItem = ({ group, latestPreview, }) => {
28
32
  };
29
33
  const latestMsg = (latestPreview === null || latestPreview === void 0 ? void 0 : latestPreview.latestMsg) || "";
30
34
  const latestMsgSendTime = (latestPreview === null || latestPreview === void 0 ? void 0 : latestPreview.latestMsgSendTime) || 0;
31
- return (_jsx(ThreadCard, { onClick: handleClick, isSelected: isSelected, unreadCount: conversation.unreadCount, preview: parseLatestMessage(latestMsg, user === null || user === void 0 ? void 0 : user.userID, t, {
35
+ return (_jsx(DeskConversationRow, { onClick: handleClick, isSelected: isSelected, unreadCount: conversation.unreadCount, preview: parseLatestMessage(latestMsg, user === null || user === void 0 ? void 0 : user.userID, t, {
32
36
  peerType: conversation.peerType,
33
37
  conversationType: conversation.conversationType,
34
38
  showName: conversation.showName,
35
39
  }), mentionIndicator: _jsx(MentionIndicatorIcon, { groupAtType: conversation.groupAtType }), time: latestMsgSendTime > 0
36
- ? formatTimestamp(latestMsgSendTime, { hasTime: true })
37
- : undefined, avatar: _jsx(GroupCompositeAvatar, { groupID: group.groupId, faceURL: conversation.faceURL, groupName: conversation.showName, size: 48 }), title: _jsx("h3", { className: "truncate text-sm font-semibold text-gray-900", children: conversation.showName }) }));
40
+ ? formatListRowTime(latestMsgSendTime, t)
41
+ : undefined, avatar: _jsx(GroupCompositeAvatar, { groupID: group.groupId, faceURL: conversation.faceURL, groupName: conversation.showName, size: 40 }), name: conversation.showName, meta: group.visibility === GroupVisibility.Private ? (_jsxs(RowChip, { tone: "primary", children: [_jsx(StrokeIcon, { name: "lock", size: 14 }), t("group_visibility_private")] })) : undefined }));
38
42
  };
39
43
  export default ConversationByGroupItem;
@@ -1,9 +1,12 @@
1
1
  import type { LatestPreview } from "../../hooks/session/useSessionLatestPreview";
2
2
  import { ISessionByStatus } from "../../store/type";
3
+ import { SessionTag } from "../../types/chat";
3
4
  interface ConversationBySessionItemProps {
4
5
  sessionItem: ISessionByStatus;
5
6
  latestPreview?: LatestPreview;
7
+ /** Tag the open folder already filters by; its chip would repeat the folder name. */
8
+ folderTag?: SessionTag;
6
9
  }
7
- declare const ConversationBySessionItem: ({ sessionItem, latestPreview, }: ConversationBySessionItemProps) => import("react/jsx-runtime").JSX.Element | null;
10
+ declare const ConversationBySessionItem: ({ sessionItem, latestPreview, folderTag, }: ConversationBySessionItemProps) => import("react/jsx-runtime").JSX.Element | null;
8
11
  export default ConversationBySessionItem;
9
12
  //# sourceMappingURL=ConversationBySessionItem.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationBySessionItem.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/ConversationBySessionItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAE7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAahD,UAAU,8BAA8B;IACtC,WAAW,EAAE,gBAAgB,CAAC;IAC9B,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,QAAA,MAAM,yBAAyB,GAAI,iCAGhC,8BAA8B,mDAyFhC,CAAC;AAEF,eAAe,yBAAyB,CAAC"}
1
+ {"version":3,"file":"ConversationBySessionItem.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/ConversationBySessionItem.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAE7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAQhD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAU1C,UAAU,8BAA8B;IACtC,WAAW,EAAE,gBAAgB,CAAC;IAC9B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,qFAAqF;IACrF,SAAS,CAAC,EAAE,UAAU,CAAC;CACxB;AAaD,QAAA,MAAM,yBAAyB,GAAI,4CAIhC,8BAA8B,mDAsGhC,CAAC;AAEF,eAAe,yBAAyB,CAAC"}
@@ -1,19 +1,32 @@
1
1
  "use client";
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { PeerType } from "../../types/conversation";
3
4
  import { useTranslation } from "react-i18next";
4
5
  import useConversationStore from "../../store/conversation";
5
- import { Avatar } from "antd";
6
6
  import { useChatContext } from "../../context/ChatContext";
7
7
  import { useChatNavigate } from "../../hooks/conversation/useChatNavigate";
8
8
  import { useConversationDisplayData } from "../../hooks/conversation/useConversation";
9
- import { formatTimestamp, parseLatestMessage } from "../../utils/common";
10
9
  import { isGroupSession } from "../../utils/imCommon";
11
10
  import { resolveBotSessionOwnerIdentity } from "../../utils/conversation";
11
+ import { SessionTag } from "../../types/chat";
12
12
  import GroupCompositeAvatar from "../../components/group/GroupCompositeAvatar";
13
- import ThreadCard from "./ThreadCard";
13
+ import DeskConversationRow from "./DeskConversationRow";
14
+ import { formatListRowTime } from "./rowTime";
15
+ import DeskRowAvatar from "./DeskRowAvatar";
16
+ import RowChip from "./RowChip";
17
+ import { buildSessionPreview } from "./internalNotePreview";
18
+ import { splitDisplayName } from "./rowDisplayName";
14
19
  import MentionIndicatorIcon from "./MentionIndicatorIcon";
15
- const ConversationBySessionItem = ({ sessionItem, latestPreview, }) => {
16
- var _a, _b;
20
+ const TAG_CHIPS = {
21
+ [SessionTag.AWAITING_REPLY]: { tone: "warning", labelKey: "awaiting_reply" },
22
+ [SessionTag.SLOW_PROCESSING]: { tone: "danger", labelKey: "slow_processing" },
23
+ [SessionTag.TEMPORARILY_PAUSED]: {
24
+ tone: "neutral",
25
+ labelKey: "temporarily_paused",
26
+ },
27
+ };
28
+ const ConversationBySessionItem = ({ sessionItem, latestPreview, folderTag, }) => {
29
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
17
30
  const { t } = useTranslation();
18
31
  const { user } = useChatContext();
19
32
  const onNavigate = useChatNavigate();
@@ -36,18 +49,31 @@ const ConversationBySessionItem = ({ sessionItem, latestPreview, }) => {
36
49
  setSelectedConversationId(conversation.conversationID);
37
50
  };
38
51
  const { avatar, displayName = "" } = useConversationDisplayData(conversation || null);
39
- const ownerIdentity = resolveBotSessionOwnerIdentity(conversation, sessionItem === null || sessionItem === void 0 ? void 0 : sessionItem.owner, user === null || user === void 0 ? void 0 : user.userID);
40
- const title = (_a = ownerIdentity === null || ownerIdentity === void 0 ? void 0 : ownerIdentity.displayName) !== null && _a !== void 0 ? _a : displayName;
52
+ // The session payload names the customer even while the conversation is a bare
53
+ // fallback (no peerType yet), so the row's name and avatar tint never jump.
54
+ const isBotSession = (conversation === null || conversation === void 0 ? void 0 : conversation.peerType) === PeerType.BOT || Boolean(sessionItem === null || sessionItem === void 0 ? void 0 : sessionItem.botId);
55
+ const owner = sessionItem === null || sessionItem === void 0 ? void 0 : sessionItem.owner;
56
+ const ownerIdentity = (_a = resolveBotSessionOwnerIdentity(conversation, owner, user === null || user === void 0 ? void 0 : user.userID)) !== null && _a !== void 0 ? _a : (isBotSession && (((_b = owner === null || owner === void 0 ? void 0 : owner.fullName) === null || _b === void 0 ? void 0 : _b.trim()) || ((_c = owner === null || owner === void 0 ? void 0 : owner.username) === null || _c === void 0 ? void 0 : _c.trim()))
57
+ ? {
58
+ displayName: ((_d = owner.fullName) === null || _d === void 0 ? void 0 : _d.trim()) && ((_e = owner.username) === null || _e === void 0 ? void 0 : _e.trim())
59
+ ? `${owner.fullName.trim()} (${owner.username.trim()})`
60
+ : (((_f = owner.fullName) === null || _f === void 0 ? void 0 : _f.trim()) || ((_g = owner.username) === null || _g === void 0 ? void 0 : _g.trim())),
61
+ avatarUrl: ((_h = owner.avatar) === null || _h === void 0 ? void 0 : _h.trim()) || undefined,
62
+ }
63
+ : null);
64
+ const fullTitle = (_j = ownerIdentity === null || ownerIdentity === void 0 ? void 0 : ownerIdentity.displayName) !== null && _j !== void 0 ? _j : displayName;
65
+ const { name } = splitDisplayName(fullTitle);
41
66
  const latestMsg = (latestPreview === null || latestPreview === void 0 ? void 0 : latestPreview.latestMsg) || "";
42
67
  const latestMsgSendTime = (latestPreview === null || latestPreview === void 0 ? void 0 : latestPreview.latestMsgSendTime) || 0;
43
68
  if (!conversation)
44
69
  return null;
45
- return (_jsx(ThreadCard, { onClick: () => handleConversationClick(conversation), isSelected: isSelected, unreadCount: conversation.unreadCount, preview: parseLatestMessage(latestMsg, user === null || user === void 0 ? void 0 : user.userID, t, {
70
+ const tagChip = sessionItem.tag !== folderTag ? TAG_CHIPS[sessionItem.tag] : undefined;
71
+ return (_jsx(DeskConversationRow, { onClick: () => handleConversationClick(conversation), isSelected: isSelected, unreadCount: conversation.unreadCount, preview: buildSessionPreview(latestMsg, user === null || user === void 0 ? void 0 : user.userID, t, {
46
72
  peerType: conversation.peerType,
47
73
  conversationType: conversation.conversationType,
48
74
  showName: conversation.showName,
49
75
  }), mentionIndicator: _jsx(MentionIndicatorIcon, { groupAtType: conversation.groupAtType }), time: latestMsgSendTime > 0
50
- ? formatTimestamp(latestMsgSendTime, { hasTime: true })
51
- : undefined, avatar: ownerIdentity ? (_jsx(Avatar, { size: 48, src: ownerIdentity.avatarUrl, children: title.charAt(0) })) : isGroupSession(conversation.conversationType) ? (_jsx(GroupCompositeAvatar, { groupID: conversation.groupID, faceURL: avatar, groupName: displayName, size: 48 })) : (_jsx(Avatar, { size: 48, src: avatar, children: ((_b = displayName === null || displayName === void 0 ? void 0 : displayName.charAt) === null || _b === void 0 ? void 0 : _b.call(displayName, 0)) || "A" })), title: _jsx("h3", { className: "truncate text-sm font-semibold text-gray-900", children: title }) }));
76
+ ? formatListRowTime(latestMsgSendTime, t)
77
+ : undefined, avatar: !ownerIdentity && isGroupSession(conversation.conversationType) ? (_jsx(GroupCompositeAvatar, { groupID: conversation.groupID, faceURL: avatar, groupName: displayName, size: 40 })) : (_jsx(DeskRowAvatar, { name: name, src: ownerIdentity ? ownerIdentity.avatarUrl : avatar })), name: name, nameTooltip: fullTitle, meta: tagChip ? (_jsx(RowChip, { tone: tagChip.tone, children: t(tagChip.labelKey) })) : undefined }));
52
78
  };
53
79
  export default ConversationBySessionItem;
@@ -1 +1 @@
1
- {"version":3,"file":"DeskConversationList.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/DeskConversationList.tsx"],"names":[],"mappings":"AA4BA,QAAA,MAAM,oBAAoB,+CAwVzB,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"DeskConversationList.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/DeskConversationList.tsx"],"names":[],"mappings":"AA+BA,QAAA,MAAM,oBAAoB,+CAgRzB,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
@@ -2,8 +2,7 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useState, useEffect, useRef } from "react";
4
4
  import { useSearchParams } from "next/navigation";
5
- import { Input, Empty, Drawer, Button, Spin } from "antd";
6
- import { Icon } from "../../components/icon";
5
+ import { Drawer } from "antd";
7
6
  import useConversationStore from "../../store/conversation";
8
7
  import { useTranslation } from "react-i18next";
9
8
  import { useBoolean, useDebounce } from "ahooks";
@@ -19,10 +18,16 @@ import { useGetTeamSessionSummary } from "../../hooks/session/useGetTeamSessionS
19
18
  import { useConversationGroups } from "../../hooks/group/useConversationGroups";
20
19
  import { DChatSDK } from "../../constants/sdk";
21
20
  import emitter from "../../utils/events";
22
- import { ALL_GROUPS_KEY, getFilterConfig, } from "../../components/session/sessionMenuItems";
21
+ import { useGetSessionSummary } from "../../hooks/session/useGetSessionSummary";
22
+ import { getActiveFolder } from "../../store/sessionFolder";
23
+ import { ALL_GROUPS_KEY } from "../../components/session/sessionFilters";
24
+ import DeskListHeader from "./DeskListHeader";
25
+ import DeskListEmptyState from "./DeskListEmptyState";
26
+ import DeskListSkeleton from "./DeskListSkeleton";
27
+ import { getListHeading } from "./listHeading";
23
28
  import ComposeNewMessageModal from "../../components/compose/ComposeNewMessageModal";
29
+ import { useCloseOnSidePanelOpen } from "../../hooks/common/useCloseOnSidePanelOpen";
24
30
  const DeskConversationList = () => {
25
- var _a, _b;
26
31
  const searchInputRef = useRef(null);
27
32
  const { t } = useTranslation();
28
33
  const [search, setSearch] = useState("");
@@ -36,7 +41,7 @@ const DeskConversationList = () => {
36
41
  const viewMode = useSessionStore((state) => state.viewMode);
37
42
  const isAllGroupsView = viewMode === "allGroups";
38
43
  const { data: teamSummaries } = useGetTeamSessionSummary();
39
- const { dataFlatten: rawSessions, hasNextPage, fetchNextPage, refetch, isSyncing, } = useGetSession({
44
+ const { dataFlatten: rawSessions, hasNextPage, fetchNextPage, refetch, isSyncing, isLoading: isSessionsLoading, } = useGetSession({
40
45
  filter: filterSummary,
41
46
  options: { isEnabled: !isAllGroupsView },
42
47
  });
@@ -44,22 +49,34 @@ const DeskConversationList = () => {
44
49
  const latestPreviewMap = useSessionLatestPreview(rawSessions);
45
50
  const sessions = useSortedSessions(rawSessions, latestPreviewMap);
46
51
  const groupLatestPreviewMap = useSessionLatestPreview(conversationGroups);
47
- const currentFilterKey = isAllGroupsView
48
- ? ALL_GROUPS_KEY
49
- : filterSummary.status || filterSummary.tag || "";
50
- const filterConfig = getFilterConfig(currentFilterKey);
51
- const pathName = filterSummary.teamId
52
- ? ((_a = teamSummaries === null || teamSummaries === void 0 ? void 0 : teamSummaries.find((team) => team.teamId === filterSummary.teamId)) === null || _a === void 0 ? void 0 : _a.teamName) || ""
53
- : t("my_messages");
52
+ const { data: mySummary } = useGetSessionSummary();
53
+ const folder = getActiveFolder(filterSummary, viewMode);
54
+ const heading = getListHeading({ folder, mySummary, teams: teamSummaries });
55
+ const emptyFilterKey = isAllGroupsView ? ALL_GROUPS_KEY : folder.filterKey;
56
+ const isListLoading = isAllGroupsView
57
+ ? isConversationGroupsLoading
58
+ : isSessionsLoading || isSyncing;
54
59
  const debouncedSearch = useDebounce(search, { wait: 500 });
60
+ // Closing hands focus back to the field (drawer focus restore, Esc); that focus
61
+ // must not reopen the search it just closed.
62
+ const searchClosedAtRef = useRef(0);
55
63
  const onCloseSearch = () => {
64
+ var _a;
65
+ searchClosedAtRef.current = Date.now();
56
66
  setSearch("");
57
67
  setShowSearchFalse();
58
- setTimeout(() => {
59
- var _a;
60
- (_a = searchInputRef.current) === null || _a === void 0 ? void 0 : _a.blur();
61
- }, 500);
68
+ (_a = searchInputRef.current) === null || _a === void 0 ? void 0 : _a.blur();
62
69
  };
70
+ const onSearchFocus = () => {
71
+ if (Date.now() - searchClosedAtRef.current < 600)
72
+ return;
73
+ setShowSearchTrue();
74
+ };
75
+ // Opening a side panel (members, info, media…) closes the conversation search.
76
+ useCloseOnSidePanelOpen(() => {
77
+ if (showSearch)
78
+ onCloseSearch();
79
+ });
63
80
  useEffect(() => {
64
81
  if (showSearch) {
65
82
  setTimeout(() => {
@@ -129,23 +146,21 @@ const DeskConversationList = () => {
129
146
  emitter.off("UPDATE_SESSION", handler);
130
147
  };
131
148
  }, [filterSummary, refetch]);
132
- return (_jsxs("div", { className: "flex flex-col h-full bg-white border-r border-gray-200 w-[320px]", "data-cp-name": "DeskConversationList", children: [_jsxs("div", { className: "p-3 border-b border-gray-100", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Input, { ref: searchInputRef, placeholder: t("search"), prefix: _jsx(Icon, { icon: "search-o", size: 18, className: "text-gray-400" }), onChange: (e) => {
133
- if (!showSearch && e.target.value) {
134
- setShowSearchTrue();
135
- }
136
- setSearch(e.target.value);
137
- }, className: "rounded-lg text-sm flex-1 h-[36px]", size: "large", allowClear: true, onClick: setShowSearchTrue, value: search, autoFocus: false, onClear: onCloseSearch }), showSearch ? (_jsx(Button, { onClick: onCloseSearch, variant: "outlined", className: "p-0 w-[36px] h-[36px] text-gray-500", children: _jsx(Icon, { icon: "close-b", size: 22 }) })) : (_jsx(Button, { "data-testid": "conversation-list-compose-icon", onClick: () => setIsComposeOpen(true), variant: "outlined", className: "p-0 w-[36px] h-[36px] shrink-0 text-gray-500", children: _jsx(Icon, { icon: "edit-b", size: 20 }) }))] }), _jsxs("div", { className: "flex items-center justify-between mt-2", children: [_jsx("span", { className: "text-sm font-semibold text-blue-500 truncate", children: pathName }), isAllGroupsView ? (_jsxs("span", { className: "flex items-center gap-1.5 shrink-0", children: [_jsx(Icon, { icon: "user-three-o", size: 16, className: "text-gray-500" }), _jsx("span", { className: "text-sm font-semibold text-gray-800", children: t("all_groups") })] })) : (filterConfig && (_jsxs("span", { className: "flex items-center gap-1.5 shrink-0", children: [_jsx(Icon, { icon: filterConfig.iconName, size: 16, className: "text-gray-500" }), _jsx("span", { className: "text-sm font-semibold text-gray-800", children: t(filterConfig.labelKey) })] })))] })] }), _jsxs("div", { className: "relative flex-1 min-h-0", children: [_jsx("div", { id: "scrollableConversationsDiv", style: {
149
+ return (_jsxs("section", { "aria-label": t("conversation_list_label"), className: "flex flex-col h-full w-full bg-white", "data-cp-name": "DeskConversationList", children: [_jsx(DeskListHeader, { ref: searchInputRef, heading: heading, search: search, isSearching: showSearch, onSearchChange: (value) => {
150
+ if (!showSearch && value)
151
+ setShowSearchTrue();
152
+ setSearch(value);
153
+ }, onSearchFocus: onSearchFocus, onCloseSearch: onCloseSearch, onCompose: () => setIsComposeOpen(true) }), _jsxs("div", { className: "relative flex-1 min-h-0", children: [_jsx("div", { id: "scrollableConversationsDiv", "aria-busy": isListLoading, style: {
138
154
  height: "100%",
139
155
  overflow: showSearch ? "hidden" : "auto",
140
- }, children: isAllGroupsView ? (isConversationGroupsLoading ? (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx(Spin, {}) })) : !(conversationGroups === null || conversationGroups === void 0 ? void 0 : conversationGroups.length) ? (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx(Empty, { image: _jsx(Icon, { icon: "chat-square-b", size: 80, className: "text-gray-300" }), description: t("no_conversation") }) })) : (_jsx(InfiniteScroll, { dataLength: conversationGroups.length, next: fetchNextGroupsPage, hasMore: !!hasNextGroupsPage, loader: _jsx("div", { className: "flex items-center justify-center py-2", children: _jsx(Spin, {}) }), scrollableTarget: "scrollableConversationsDiv", children: conversationGroups.map((group) => (_jsx(ConversationByGroupItem, { group: group, latestPreview: groupLatestPreviewMap.get(group.conversationId) }, group.groupId))) }))) : (_jsx(InfiniteScroll, { dataLength: (sessions === null || sessions === void 0 ? void 0 : sessions.length) || 0, next: fetchNextPage, hasMore: hasNextPage, loader: _jsx("div", { className: "flex items-center justify-center py-2", children: _jsx(Spin, {}) }), scrollableTarget: "scrollableConversationsDiv", children: isSyncing ? (
141
- // conversationList (the client cache dataFlatten joins
142
- // against) hasn't caught up with this filter's BE response
143
- // yet — showing the list now would flash a wrong, too-low
144
- // count that corrects itself a moment later.
145
- _jsx("div", { className: "flex items-center justify-center py-12", children: _jsx(Spin, {}) })) : (sessions === null || sessions === void 0 ? void 0 : sessions.length) === 0 ? (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx(Empty, { image: _jsx(Icon, { icon: "chat-square-b", size: 80, className: "text-gray-300" }), description: t("no_conversation") }) })) : ((_b = sessions === null || sessions === void 0 ? void 0 : sessions.map) === null || _b === void 0 ? void 0 : _b.call(sessions, (session) => (_jsx(ConversationBySessionItem, { sessionItem: session, latestPreview: latestPreviewMap.get(session.conversationId) }, session.conversationId)))) })) }), _jsx(Drawer, { open: showSearch, mask: false, closeIcon: false, styles: {
156
+ }, children: isAllGroupsView ? (isConversationGroupsLoading ? (_jsx(DeskListSkeleton, { rows: 8 })) : !(conversationGroups === null || conversationGroups === void 0 ? void 0 : conversationGroups.length) ? (_jsx(DeskListEmptyState, { filterKey: emptyFilterKey })) : (_jsx(InfiniteScroll, { dataLength: conversationGroups.length, next: fetchNextGroupsPage, hasMore: !!hasNextGroupsPage, loader: _jsx(DeskListSkeleton, { rows: 2 }), scrollableTarget: "scrollableConversationsDiv", children: _jsx("div", { className: "flex flex-col gap-0.5 px-1 pb-2", children: conversationGroups.map((group) => (_jsx(ConversationByGroupItem, { group: group, latestPreview: groupLatestPreviewMap.get(group.conversationId) }, group.groupId))) }) }))) : isSessionsLoading || (isSyncing && !(sessions === null || sessions === void 0 ? void 0 : sessions.length)) ? (
157
+ // First load, or the client cache has not caught up with any row yet.
158
+ _jsx(DeskListSkeleton, { rows: 8 })) : !(sessions === null || sessions === void 0 ? void 0 : sessions.length) ? (_jsx(DeskListEmptyState, { filterKey: emptyFilterKey })) : (_jsx(InfiniteScroll, { dataLength: sessions.length, next: fetchNextPage, hasMore: hasNextPage, loader: _jsx(DeskListSkeleton, { rows: 2 }), scrollableTarget: "scrollableConversationsDiv", children: _jsx("div", { className: "flex flex-col gap-0.5 px-1 pb-2", children: sessions.map((session) => (_jsx(ConversationBySessionItem, { sessionItem: session, latestPreview: latestPreviewMap.get(session.conversationId), folderTag: filterSummary.tag }, session.conversationId))) }) })) }), _jsx(Drawer, { open: showSearch, "aria-label": t("search"), mask: false, closeIcon: false, styles: {
146
159
  body: {
147
160
  padding: 0,
148
161
  },
149
- }, getContainer: false, forceRender: true, width: "100%", children: _jsx(SearchConversation, { searchTerm: debouncedSearch }) })] }), _jsx(ComposeNewMessageModal, { open: isComposeOpen, onClose: () => setIsComposeOpen(false) })] }));
162
+ }, getContainer: false,
163
+ // Focus stays in the search field; the drawer must not take or restore it.
164
+ autoFocus: false, destroyOnHidden: true, width: "100%", children: _jsx(SearchConversation, { searchTerm: debouncedSearch }) })] }), _jsx(ComposeNewMessageModal, { open: isComposeOpen, onClose: () => setIsComposeOpen(false) })] }));
150
165
  };
151
166
  export default DeskConversationList;
@@ -0,0 +1,19 @@
1
+ import type { ReactNode } from "react";
2
+ export interface DeskConversationRowProps {
3
+ avatar: ReactNode;
4
+ name: string;
5
+ /** Full name with username, shown on hover when the row only shows the name. */
6
+ nameTooltip?: string;
7
+ preview: string;
8
+ time?: string;
9
+ unreadCount?: number;
10
+ mentionIndicator?: ReactNode;
11
+ /** Chips under the preview. */
12
+ meta?: ReactNode;
13
+ isSelected?: boolean;
14
+ onClick: () => void;
15
+ }
16
+ /** CRM desk list row; the chip line only exists when the row has chips. */
17
+ declare const DeskConversationRow: ({ avatar, name, nameTooltip, preview, time, unreadCount, mentionIndicator, meta, isSelected, onClick, }: DeskConversationRowProps) => import("react/jsx-runtime").JSX.Element;
18
+ export default DeskConversationRow;
19
+ //# sourceMappingURL=DeskConversationRow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeskConversationRow.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/DeskConversationRow.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOvC,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,+BAA+B;IAC/B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,2EAA2E;AAC3E,QAAA,MAAM,mBAAmB,GAAI,yGAW1B,wBAAwB,4CA2D1B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import clsx from "clsx";
4
+ import { Tooltip } from "antd";
5
+ import { useTranslation } from "react-i18next";
6
+ const formatUnread = (count) => (count > 99 ? "99+" : String(count));
7
+ /** CRM desk list row; the chip line only exists when the row has chips. */
8
+ const DeskConversationRow = ({ avatar, name, nameTooltip, preview, time, unreadCount = 0, mentionIndicator, meta, isSelected = false, onClick, }) => {
9
+ const { t } = useTranslation();
10
+ const hasUnread = unreadCount > 0;
11
+ const hasPreview = preview.trim() !== "";
12
+ return (_jsxs("button", { type: "button", onClick: onClick, "data-cp-name": "DeskConversationRow", "aria-current": isSelected ? "true" : undefined, className: clsx("relative flex w-full shrink-0 items-start gap-3 rounded-lg px-3 py-2.5 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400",
13
+ // Active row: left accent bar, and primary chips turn white so they stay visible.
14
+ isSelected
15
+ ? "bg-primary-25 before:absolute before:inset-y-2 before:left-0 before:w-[3px] before:rounded-r-full before:bg-primary-400 [&_[data-tone=primary]]:!bg-white"
16
+ : "hover:bg-gray-5"), children: [avatar, _jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [_jsxs("span", { className: "flex items-baseline gap-2", children: [_jsx(Tooltip, { title: nameTooltip && nameTooltip !== name ? nameTooltip : undefined, children: _jsx("span", { className: clsx("min-w-0 flex-1 truncate text-sm text-gray-900", hasUnread || isSelected ? "font-semibold" : "font-medium"), children: name }) }), time && _jsx("span", { className: "shrink-0 text-xs text-gray-600", children: time })] }), _jsxs("span", { className: "flex min-h-4 items-center gap-2", children: [_jsx("span", { className: clsx("min-w-0 flex-1 truncate text-[13px]", hasUnread && hasPreview ? "font-semibold text-gray-900" : "text-gray-600"), children: hasPreview ? preview : t("no_message_yet") }), mentionIndicator, hasUnread && (_jsx("span", { "data-cp-name": "UnreadBadge", className: "inline-flex h-5 min-w-5 shrink-0 items-center justify-center rounded-full bg-primary-400 px-1.5 text-xs font-semibold tabular-nums text-white", children: formatUnread(unreadCount) }))] }), meta && (_jsx("span", { className: "flex h-5 items-center gap-1 overflow-hidden", children: meta }))] })] }));
17
+ };
18
+ export default DeskConversationRow;
@@ -0,0 +1,6 @@
1
+ /** Shown when the selected folder has no conversations; the sentence names the folder. */
2
+ declare const DeskListEmptyState: ({ filterKey }: {
3
+ filterKey: string;
4
+ }) => import("react/jsx-runtime").JSX.Element;
5
+ export default DeskListEmptyState;
6
+ //# sourceMappingURL=DeskListEmptyState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeskListEmptyState.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/DeskListEmptyState.tsx"],"names":[],"mappings":"AAKA,0FAA0F;AAC1F,QAAA,MAAM,kBAAkB,GAAI,eAAe;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,4CAW/D,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useTranslation } from "react-i18next";
4
+ import { StrokeIcon } from "../../components/icon/StrokeIcon";
5
+ import { getFolderEmptyKey } from "./folderEmptyState";
6
+ /** Shown when the selected folder has no conversations; the sentence names the folder. */
7
+ const DeskListEmptyState = ({ filterKey }) => {
8
+ const { t } = useTranslation();
9
+ return (_jsxs("div", { className: "flex flex-col items-center gap-3 px-6 py-12 text-center", "data-cp-name": "DeskListEmptyState", children: [_jsx(StrokeIcon, { name: "message-circle", size: 56, strokeWidth: 1.25, className: "text-gray-100" }), _jsx("p", { className: "text-sm text-gray-600", children: t(getFolderEmptyKey(filterKey)) })] }));
10
+ };
11
+ export default DeskListEmptyState;
@@ -0,0 +1,14 @@
1
+ import type { ListHeading } from "./listHeading";
2
+ interface DeskListHeaderProps {
3
+ heading: ListHeading;
4
+ search: string;
5
+ isSearching: boolean;
6
+ onSearchChange: (value: string) => void;
7
+ onSearchFocus: () => void;
8
+ onCloseSearch: () => void;
9
+ onCompose: () => void;
10
+ }
11
+ /** Search row plus a title that names the folder the list below is built from. */
12
+ declare const DeskListHeader: import("react").ForwardRefExoticComponent<DeskListHeaderProps & import("react").RefAttributes<HTMLInputElement>>;
13
+ export default DeskListHeader;
14
+ //# sourceMappingURL=DeskListHeader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeskListHeader.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/DeskListHeader.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,UAAU,mBAAmB;IAC3B,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,kFAAkF;AAClF,QAAA,MAAM,cAAc,kHAkJnB,CAAC;AAGF,eAAe,cAAc,CAAC"}
@@ -0,0 +1,39 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { forwardRef, useState } from "react";
4
+ import { Button, Tooltip } from "antd";
5
+ import { useTranslation } from "react-i18next";
6
+ import { StrokeIcon } from "../../components/icon/StrokeIcon";
7
+ import { useMediaQuery } from "../../hooks/common/useMediaQuery";
8
+ import useWorkspaceLayoutStore from "../../store/workspaceLayout";
9
+ import useShortcutPrefsStore from "../../store/shortcutPrefs";
10
+ import { LAYOUT_BREAKPOINTS } from "../../constants/layout";
11
+ /** Search row plus a title that names the folder the list below is built from. */
12
+ const DeskListHeader = forwardRef(({ heading, search, isSearching, onSearchChange, onSearchFocus, onCloseSearch, onCompose, }, inputRef) => {
13
+ var _a, _b;
14
+ const { t } = useTranslation();
15
+ const [isFocused, setIsFocused] = useState(false);
16
+ const isFolderInline = useMediaQuery(`(min-width: ${LAYOUT_BREAKPOINTS.folderInline}px)`);
17
+ const setFolderOverlayOpen = useWorkspaceLayoutStore((state) => state.setFolderOverlayOpen);
18
+ const singleKeyEnabled = useShortcutPrefsStore((s) => s.singleKeyEnabled);
19
+ const context = (_a = heading.contextText) !== null && _a !== void 0 ? _a : t((_b = heading.contextKey) !== null && _b !== void 0 ? _b : "my_messages");
20
+ const showSlashHint = singleKeyEnabled && !isFocused && !search && !isSearching;
21
+ return (_jsxs("div", { "data-cp-name": "DeskListHeader", children: [_jsxs("div", { className: "flex items-center gap-2 p-3", children: [!isFolderInline && (_jsx(Tooltip, { title: t("folder_panel_open"), children: _jsx(Button, { onClick: () => setFolderOverlayOpen(true), className: "flex h-9 w-9 shrink-0 items-center justify-center border-0 bg-gray-5 p-0 text-gray-900", "aria-label": t("folder_panel_open"), children: _jsx(StrokeIcon, { name: "panel-left", size: 20 }) }) })), _jsx("label", { htmlFor: "desk-list-search", className: "sr-only", children: t("search_conversation_label") }), _jsxs("div", { className: "flex h-9 min-w-0 flex-1 items-center gap-2 rounded-lg bg-gray-5 pl-2.5 pr-2 text-gray-600 focus-within:ring-2 focus-within:ring-primary-200", children: [_jsx(StrokeIcon, { name: "search", size: 18 }), _jsx("input", { id: "desk-list-search", ref: inputRef, type: "text", "data-desk-search": true, autoComplete: "off",
22
+ // The narrow list (folder toggle shown) has no room for the long hint.
23
+ placeholder: t(isFolderInline ? "desk_search_placeholder" : "search_conversation_label"), value: search, onChange: (e) => onSearchChange(e.target.value), onFocus: () => {
24
+ setIsFocused(true);
25
+ onSearchFocus();
26
+ }, onBlur: () => setIsFocused(false),
27
+ // Focus can already sit in the field after a close, so a click opens too.
28
+ onClick: () => {
29
+ if (!isSearching)
30
+ onSearchFocus();
31
+ }, onKeyDown: (e) => {
32
+ if (e.key === "Escape" && (isSearching || search)) {
33
+ e.stopPropagation();
34
+ onCloseSearch();
35
+ }
36
+ }, className: "min-w-0 flex-1 border-0 bg-transparent p-0 text-sm text-gray-900 outline-none placeholder:text-gray-600" }), search && (_jsx("button", { type: "button", "aria-label": t("clear"), onClick: onCloseSearch, className: "flex h-5 w-5 shrink-0 items-center justify-center rounded-full text-gray-600 hover:text-gray-900 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary-200", children: _jsx(StrokeIcon, { name: "x", size: 14 }) })), showSlashHint && (_jsx("kbd", { "aria-hidden": "true", 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: "/" }))] }), isSearching ? (_jsx(Tooltip, { title: t("close"), children: _jsx(Button, { onClick: onCloseSearch, "aria-label": t("close"), className: "h-9 w-9 shrink-0 p-0 text-gray-600", children: _jsx(StrokeIcon, { name: "x", size: 20 }) }) })) : (_jsx(Tooltip, { title: t("compose_new_message"), children: _jsx(Button, { "data-testid": "conversation-list-compose-icon", onClick: onCompose, "aria-label": t("compose_new_message"), className: "flex !h-8 !w-8 shrink-0 items-center justify-center rounded-lg border-0 bg-primary-25 p-0 text-primary-500", children: _jsx(StrokeIcon, { name: "edit", size: 18 }) }) }))] }), !isSearching && (_jsxs("div", { className: "flex flex-col gap-0.5 border-b border-gray-25 px-4 pb-3 pt-1", children: [isFolderInline ? (_jsx("span", { className: "truncate text-xs font-medium text-gray-600", children: context })) : (_jsxs("button", { type: "button", "aria-label": `${t("folder_panel_open")}: ${context}`, onClick: () => setFolderOverlayOpen(true), className: "flex min-w-0 items-center gap-1 self-start rounded border-0 bg-transparent p-0 text-xs font-medium leading-[1.4] text-gray-600 hover:text-gray-900 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary-200", children: [_jsx("span", { className: "truncate", children: context }), _jsx(StrokeIcon, { name: "chevron-down", size: 14 })] })), _jsxs("h2", { className: "m-0 flex min-w-0 items-center gap-2 text-lg font-bold text-gray-900", children: [_jsx("span", { className: "truncate", children: t(heading.titleKey) }), " ", !!heading.count && (_jsx("span", { className: "inline-flex h-6 shrink-0 items-center rounded-full bg-primary-25 px-2 text-sm font-semibold tabular-nums text-primary-500", children: heading.count }))] })] }))] }));
37
+ });
38
+ DeskListHeader.displayName = "DeskListHeader";
39
+ export default DeskListHeader;
@@ -0,0 +1,6 @@
1
+ /** Placeholder rows shaped like DeskConversationRow, shown while the desk list loads. */
2
+ declare const DeskListSkeleton: ({ rows }: {
3
+ rows: number;
4
+ }) => import("react/jsx-runtime").JSX.Element;
5
+ export default DeskListSkeleton;
6
+ //# sourceMappingURL=DeskListSkeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeskListSkeleton.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/DeskListSkeleton.tsx"],"names":[],"mappings":"AAGA,yFAAyF;AACzF,QAAA,MAAM,gBAAgB,GAAI,UAAU;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,4CAwBnD,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useTranslation } from "react-i18next";
4
+ /** Placeholder rows shaped like DeskConversationRow, shown while the desk list loads. */
5
+ const DeskListSkeleton = ({ rows }) => {
6
+ const { t } = useTranslation();
7
+ return (_jsxs("div", { role: "status", className: "flex flex-col gap-0.5 px-1 pb-2", "data-testid": "desk-list-skeleton", children: [_jsx("span", { className: "sr-only", children: t("desk_list_loading") }), Array.from({ length: rows }, (_, index) => (_jsxs("div", { "aria-hidden": "true", className: "flex items-start gap-3 px-3 py-2.5 motion-safe:animate-pulse", children: [_jsx("span", { className: "h-10 w-10 shrink-0 rounded-full bg-gray-25" }), _jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-2 pt-0.5", children: [_jsxs("span", { className: "flex items-center gap-2", children: [_jsx("span", { className: "h-3.5 w-2/5 rounded bg-gray-25" }), _jsx("span", { className: "ml-auto h-3 w-9 rounded bg-gray-25" })] }), _jsx("span", { className: "h-3 w-4/5 rounded bg-gray-25" }), index % 2 === 0 && _jsx("span", { className: "h-4 w-16 rounded-full bg-gray-25" })] })] }, index)))] }));
8
+ };
9
+ export default DeskListSkeleton;
@@ -0,0 +1,8 @@
1
+ interface DeskRowAvatarProps {
2
+ name: string;
3
+ src?: string | null;
4
+ }
5
+ /** 40px list avatar; the white ring keeps it visible on the active row's tint. */
6
+ declare const DeskRowAvatar: ({ name, src }: DeskRowAvatarProps) => import("react/jsx-runtime").JSX.Element;
7
+ export default DeskRowAvatar;
8
+ //# sourceMappingURL=DeskRowAvatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeskRowAvatar.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/DeskRowAvatar.tsx"],"names":[],"mappings":"AAGA,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,kFAAkF;AAClF,QAAA,MAAM,aAAa,GAAI,eAAe,kBAAkB,4CAQvD,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import TintedAvatar from "../../components/common/TintedAvatar";
4
+ /** 40px list avatar; the white ring keeps it visible on the active row's tint. */
5
+ const DeskRowAvatar = ({ name, src }) => (_jsx(TintedAvatar, { name: name, src: src, size: 40, className: "ring-2 ring-white", testId: "row-avatar-initials" }));
6
+ export default DeskRowAvatar;
@@ -0,0 +1,14 @@
1
+ import type { ReactNode } from "react";
2
+ declare const TONES: {
3
+ readonly primary: "bg-primary-25 text-primary-500";
4
+ readonly warning: "bg-warning-25 text-warning-800";
5
+ readonly danger: "bg-danger-25 text-danger-800";
6
+ readonly neutral: "bg-[var(--dc-color-neutral-surface)] text-gray-900";
7
+ };
8
+ /** Small pill on the list row's meta line. */
9
+ declare const RowChip: ({ tone, children, }: {
10
+ tone: keyof typeof TONES;
11
+ children: ReactNode;
12
+ }) => import("react/jsx-runtime").JSX.Element;
13
+ export default RowChip;
14
+ //# sourceMappingURL=RowChip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RowChip.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/RowChip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,QAAA,MAAM,KAAK;;;;;CAKD,CAAC;AAEX,8CAA8C;AAC9C,QAAA,MAAM,OAAO,GAAI,qBAGd;IACD,IAAI,EAAE,MAAM,OAAO,KAAK,CAAC;IACzB,QAAQ,EAAE,SAAS,CAAC;CACrB,4CAUA,CAAC;AAEF,eAAe,OAAO,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import clsx from "clsx";
3
+ const TONES = {
4
+ primary: "bg-primary-25 text-primary-500",
5
+ warning: "bg-warning-25 text-warning-800",
6
+ danger: "bg-danger-25 text-danger-800",
7
+ neutral: "bg-[var(--dc-color-neutral-surface)] text-gray-900",
8
+ };
9
+ /** Small pill on the list row's meta line. */
10
+ const RowChip = ({ tone, children, }) => (_jsx("span", { "data-tone": tone, className: clsx("inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-full px-2 text-xs font-medium", TONES[tone]), children: children }));
11
+ export default RowChip;
@@ -0,0 +1,6 @@
1
+ export declare const AVATAR_TINTS: readonly ["bg-secondary-25 text-secondary-600", "bg-primary-25 text-primary-500", "bg-success-25 text-success-900", "bg-warning-25 text-warning-800", "bg-[var(--dc-color-neutral-surface)] text-gray-900"];
2
+ /** Same name always gets the same tint, so a customer keeps their colour across lists. */
3
+ export declare const getAvatarTint: (name: string) => string;
4
+ /** Initials from the last two words that start with a letter ("Lê Quốc Bảo" -> "QB"). */
5
+ export declare const getInitials: (name: string) => string;
6
+ //# sourceMappingURL=avatarTint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatarTint.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/avatarTint.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,YAAY,6MAMf,CAAC;AAUX,0FAA0F;AAC1F,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAC8B,CAAC;AAE5E,yFAAyF;AACzF,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,MAO1C,CAAC"}