@droppii-org/chat-sdk 0.6.55 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/canned-response/CannedResponseBody.d.ts.map +1 -1
- package/dist/components/canned-response/CannedResponseBody.js +4 -3
- package/dist/components/canned-response/CannedResponsePanel.d.ts +9 -0
- package/dist/components/canned-response/CannedResponsePanel.d.ts.map +1 -0
- package/dist/components/canned-response/CannedResponsePanel.js +72 -0
- package/dist/components/canned-response/CannedResponseRow.d.ts +10 -0
- package/dist/components/canned-response/CannedResponseRow.d.ts.map +1 -0
- package/dist/components/canned-response/CannedResponseRow.js +6 -0
- package/dist/components/canned-response/CannedScopeChips.d.ts +10 -0
- package/dist/components/canned-response/CannedScopeChips.d.ts.map +1 -0
- package/dist/components/canned-response/CannedScopeChips.js +34 -0
- package/dist/components/canned-response/cannedScopes.d.ts +16 -0
- package/dist/components/canned-response/cannedScopes.d.ts.map +1 -0
- package/dist/components/canned-response/cannedScopes.js +39 -0
- package/dist/components/canned-response/index.d.ts.map +1 -1
- package/dist/components/canned-response/index.js +11 -10
- package/dist/components/canned-response/insertCannedContent.d.ts +7 -0
- package/dist/components/canned-response/insertCannedContent.d.ts.map +1 -0
- package/dist/components/canned-response/insertCannedContent.js +39 -0
- package/dist/components/canned-response/team/TeamItem.d.ts.map +1 -1
- package/dist/components/canned-response/team/TeamItem.js +5 -4
- package/dist/components/common/ConfirmModal.d.ts +13 -1
- package/dist/components/common/ConfirmModal.d.ts.map +1 -1
- package/dist/components/common/ConfirmModal.js +24 -6
- package/dist/components/common/DeskPanelDrawer.d.ts +17 -0
- package/dist/components/common/DeskPanelDrawer.d.ts.map +1 -0
- package/dist/components/common/DeskPanelDrawer.js +21 -0
- package/dist/components/common/DeskSidePanel.d.ts +17 -0
- package/dist/components/common/DeskSidePanel.d.ts.map +1 -0
- package/dist/components/common/DeskSidePanel.js +23 -0
- package/dist/components/common/TintedAvatar.d.ts +11 -0
- package/dist/components/common/TintedAvatar.d.ts.map +1 -0
- package/dist/components/common/TintedAvatar.js +17 -0
- package/dist/components/compose/ComposeNewMessageModal.d.ts.map +1 -1
- package/dist/components/compose/ComposeNewMessageModal.js +11 -1
- package/dist/components/conversation/ConversationByGroupItem.d.ts.map +1 -1
- package/dist/components/conversation/ConversationByGroupItem.js +10 -6
- package/dist/components/conversation/ConversationBySessionItem.d.ts +4 -1
- package/dist/components/conversation/ConversationBySessionItem.d.ts.map +1 -1
- package/dist/components/conversation/ConversationBySessionItem.js +36 -10
- package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
- package/dist/components/conversation/DeskConversationList.js +44 -29
- package/dist/components/conversation/DeskConversationRow.d.ts +19 -0
- package/dist/components/conversation/DeskConversationRow.d.ts.map +1 -0
- package/dist/components/conversation/DeskConversationRow.js +18 -0
- package/dist/components/conversation/DeskListEmptyState.d.ts +6 -0
- package/dist/components/conversation/DeskListEmptyState.d.ts.map +1 -0
- package/dist/components/conversation/DeskListEmptyState.js +11 -0
- package/dist/components/conversation/DeskListHeader.d.ts +14 -0
- package/dist/components/conversation/DeskListHeader.d.ts.map +1 -0
- package/dist/components/conversation/DeskListHeader.js +39 -0
- package/dist/components/conversation/DeskListSkeleton.d.ts +6 -0
- package/dist/components/conversation/DeskListSkeleton.d.ts.map +1 -0
- package/dist/components/conversation/DeskListSkeleton.js +9 -0
- package/dist/components/conversation/DeskRowAvatar.d.ts +8 -0
- package/dist/components/conversation/DeskRowAvatar.d.ts.map +1 -0
- package/dist/components/conversation/DeskRowAvatar.js +6 -0
- package/dist/components/conversation/RowChip.d.ts +14 -0
- package/dist/components/conversation/RowChip.d.ts.map +1 -0
- package/dist/components/conversation/RowChip.js +11 -0
- package/dist/components/conversation/avatarTint.d.ts +6 -0
- package/dist/components/conversation/avatarTint.d.ts.map +1 -0
- package/dist/components/conversation/avatarTint.js +27 -0
- package/dist/components/conversation/folderEmptyState.d.ts +2 -0
- package/dist/components/conversation/folderEmptyState.d.ts.map +1 -0
- package/dist/components/conversation/folderEmptyState.js +14 -0
- package/dist/components/conversation/internalNotePreview.d.ts +6 -0
- package/dist/components/conversation/internalNotePreview.d.ts.map +1 -0
- package/dist/components/conversation/internalNotePreview.js +11 -0
- package/dist/components/conversation/listHeading.d.ts +19 -0
- package/dist/components/conversation/listHeading.d.ts.map +1 -0
- package/dist/components/conversation/listHeading.js +24 -0
- package/dist/components/conversation/rowDisplayName.d.ts +7 -0
- package/dist/components/conversation/rowDisplayName.d.ts.map +1 -0
- package/dist/components/conversation/rowDisplayName.js +8 -0
- package/dist/components/conversation/rowTime.d.ts +4 -0
- package/dist/components/conversation/rowTime.d.ts.map +1 -0
- package/dist/components/conversation/rowTime.js +10 -0
- package/dist/components/conversation-detail/PinLimitModal.d.ts.map +1 -1
- package/dist/components/conversation-detail/PinLimitModal.js +3 -1
- package/dist/components/group/AddMemberModal.d.ts.map +1 -1
- package/dist/components/group/AddMemberModal.js +15 -4
- package/dist/components/group/AdminPermissionModal.d.ts +1 -0
- package/dist/components/group/AdminPermissionModal.d.ts.map +1 -1
- package/dist/components/group/AdminPermissionModal.js +38 -3
- package/dist/components/group/CreateGroupForm.d.ts +3 -1
- package/dist/components/group/CreateGroupForm.d.ts.map +1 -1
- package/dist/components/group/CreateGroupForm.js +7 -1
- package/dist/components/group/CreateGroupFormCrmView.d.ts +23 -0
- package/dist/components/group/CreateGroupFormCrmView.d.ts.map +1 -0
- package/dist/components/group/CreateGroupFormCrmView.js +25 -0
- package/dist/components/group/DisableSendPermissionConfirm.d.ts +11 -0
- package/dist/components/group/DisableSendPermissionConfirm.d.ts.map +1 -0
- package/dist/components/group/DisableSendPermissionConfirm.js +10 -0
- package/dist/components/group/GroupCompositeAvatar.d.ts.map +1 -1
- package/dist/components/group/GroupCompositeAvatar.js +39 -4
- package/dist/components/group/GroupMemberPicker.d.ts +5 -2
- package/dist/components/group/GroupMemberPicker.d.ts.map +1 -1
- package/dist/components/group/GroupMemberPicker.js +8 -42
- package/dist/components/group/GroupMemberPickerCrm.d.ts +4 -0
- package/dist/components/group/GroupMemberPickerCrm.d.ts.map +1 -0
- package/dist/components/group/GroupMemberPickerCrm.js +48 -0
- package/dist/components/group/GroupMemberPickerLegacy.d.ts +8 -0
- package/dist/components/group/GroupMemberPickerLegacy.d.ts.map +1 -0
- package/dist/components/group/GroupMemberPickerLegacy.js +46 -0
- package/dist/components/group/GroupPanelHeader.d.ts +10 -0
- package/dist/components/group/GroupPanelHeader.d.ts.map +1 -0
- package/dist/components/group/GroupPanelHeader.js +11 -0
- package/dist/components/group/MemberPermissionPanel.d.ts.map +1 -1
- package/dist/components/group/MemberPermissionPanel.js +31 -2
- package/dist/components/group/PermissionPanelCrm.d.ts +24 -0
- package/dist/components/group/PermissionPanelCrm.d.ts.map +1 -0
- package/dist/components/group/PermissionPanelCrm.js +16 -0
- package/dist/components/group/PersonAvatar.d.ts +11 -0
- package/dist/components/group/PersonAvatar.d.ts.map +1 -0
- package/dist/components/group/PersonAvatar.js +21 -0
- package/dist/components/group/crmIcon.d.ts +9 -0
- package/dist/components/group/crmIcon.d.ts.map +1 -0
- package/dist/components/group/crmIcon.js +38 -0
- package/dist/components/icon/AdaptiveIcon.d.ts +15 -0
- package/dist/components/icon/AdaptiveIcon.d.ts.map +1 -0
- package/dist/components/icon/AdaptiveIcon.js +10 -0
- package/dist/components/icon/StrokeIcon.d.ts +14 -0
- package/dist/components/icon/StrokeIcon.d.ts.map +1 -0
- package/dist/components/icon/StrokeIcon.js +5 -0
- package/dist/components/icon/strokeIconNodes.d.ts +431 -0
- package/dist/components/icon/strokeIconNodes.d.ts.map +1 -0
- package/dist/components/icon/strokeIconNodes.js +269 -0
- package/dist/components/media-collection/index.d.ts.map +1 -1
- package/dist/components/media-collection/index.js +21 -5
- package/dist/components/message/GroupMembersDrawer.d.ts.map +1 -1
- package/dist/components/message/GroupMembersDrawer.js +60 -13
- package/dist/components/message/GroupMembersPanelCrm.d.ts +23 -0
- package/dist/components/message/GroupMembersPanelCrm.d.ts.map +1 -0
- package/dist/components/message/GroupMembersPanelCrm.js +55 -0
- package/dist/components/message/MessageHeader.d.ts.map +1 -1
- package/dist/components/message/MessageHeader.js +76 -27
- package/dist/components/message/MessageInfiniteScroll.d.ts +4 -2
- package/dist/components/message/MessageInfiniteScroll.d.ts.map +1 -1
- package/dist/components/message/MessageInfiniteScroll.js +1 -1
- package/dist/components/message/MessageList.d.ts +2 -1
- package/dist/components/message/MessageList.d.ts.map +1 -1
- package/dist/components/message/MessageList.js +12 -1
- package/dist/components/message/SelectSession.d.ts +4 -1
- package/dist/components/message/SelectSession.d.ts.map +1 -1
- package/dist/components/message/SelectSession.js +13 -4
- package/dist/components/message/UnassignedSessionFooter.js +2 -2
- package/dist/components/message/footer/ActionBar.d.ts +5 -1
- package/dist/components/message/footer/ActionBar.d.ts.map +1 -1
- package/dist/components/message/footer/ActionBar.js +14 -1
- package/dist/components/message/footer/CannedResponsePlugin.d.ts.map +1 -1
- package/dist/components/message/footer/CannedResponsePlugin.js +18 -3
- package/dist/components/message/footer/ClosedSessionBanner.d.ts +9 -0
- package/dist/components/message/footer/ClosedSessionBanner.d.ts.map +1 -0
- package/dist/components/message/footer/ClosedSessionBanner.js +13 -0
- package/dist/components/message/footer/ComposerEditor.d.ts.map +1 -1
- package/dist/components/message/footer/ComposerEditor.js +9 -4
- package/dist/components/message/footer/ComposerTabs.d.ts +1 -2
- package/dist/components/message/footer/ComposerTabs.d.ts.map +1 -1
- package/dist/components/message/footer/ComposerTabs.js +14 -35
- package/dist/components/message/footer/CrmComposerCard.d.ts +11 -0
- package/dist/components/message/footer/CrmComposerCard.d.ts.map +1 -0
- package/dist/components/message/footer/CrmComposerCard.js +30 -0
- package/dist/components/message/footer/EnterHandler.d.ts.map +1 -1
- package/dist/components/message/footer/EnterHandler.js +3 -0
- package/dist/components/message/footer/FilePreview.js +2 -2
- package/dist/components/message/footer/LinkInputPreview.js +2 -2
- package/dist/components/message/footer/MediaActions.d.ts +2 -1
- package/dist/components/message/footer/MediaActions.d.ts.map +1 -1
- package/dist/components/message/footer/MediaActions.js +21 -4
- package/dist/components/message/footer/SessionClosedModal.d.ts +3 -1
- package/dist/components/message/footer/SessionClosedModal.d.ts.map +1 -1
- package/dist/components/message/footer/SessionClosedModal.js +6 -2
- package/dist/components/message/footer/ToolbarPlugin.d.ts +3 -1
- package/dist/components/message/footer/ToolbarPlugin.d.ts.map +1 -1
- package/dist/components/message/footer/ToolbarPlugin.js +2 -2
- package/dist/components/message/footer/clearComposerHistory.d.ts +3 -0
- package/dist/components/message/footer/clearComposerHistory.d.ts.map +1 -0
- package/dist/components/message/footer/clearComposerHistory.js +11 -0
- package/dist/components/message/footer/index.d.ts +2 -2
- package/dist/components/message/footer/index.d.ts.map +1 -1
- package/dist/components/message/footer/index.js +15 -5
- package/dist/components/message/footer/mention/MentionMenu.d.ts.map +1 -1
- package/dist/components/message/footer/mention/MentionMenu.js +4 -1
- package/dist/components/message/footer/useComposerFocusRequest.d.ts +10 -0
- package/dist/components/message/footer/useComposerFocusRequest.d.ts.map +1 -0
- package/dist/components/message/footer/useComposerFocusRequest.js +28 -0
- package/dist/components/message/groupMemberMenuCrm.d.ts +32 -0
- package/dist/components/message/groupMemberMenuCrm.d.ts.map +1 -0
- package/dist/components/message/groupMemberMenuCrm.js +83 -0
- package/dist/components/message/groupMemberTypes.d.ts +13 -0
- package/dist/components/message/groupMemberTypes.d.ts.map +1 -0
- package/dist/components/message/groupMemberTypes.js +1 -0
- package/dist/components/message/headerIconButton.d.ts +10 -0
- package/dist/components/message/headerIconButton.d.ts.map +1 -0
- package/dist/components/message/headerIconButton.js +9 -0
- package/dist/components/message/item/CrmSystemLine.d.ts +10 -0
- package/dist/components/message/item/CrmSystemLine.d.ts.map +1 -0
- package/dist/components/message/item/CrmSystemLine.js +6 -0
- package/dist/components/message/item/DateDivider.d.ts +5 -0
- package/dist/components/message/item/DateDivider.d.ts.map +1 -0
- package/dist/components/message/item/DateDivider.js +5 -0
- package/dist/components/message/item/GroupNotificationMessage.d.ts.map +1 -1
- package/dist/components/message/item/GroupNotificationMessage.js +9 -0
- package/dist/components/message/item/MemberEventSummary.d.ts +8 -0
- package/dist/components/message/item/MemberEventSummary.d.ts.map +1 -0
- package/dist/components/message/item/MemberEventSummary.js +18 -0
- package/dist/components/message/item/MessageBubble.d.ts +3 -1
- package/dist/components/message/item/MessageBubble.d.ts.map +1 -1
- package/dist/components/message/item/MessageBubble.js +27 -13
- package/dist/components/message/item/MessageMoreButton.d.ts +13 -0
- package/dist/components/message/item/MessageMoreButton.d.ts.map +1 -0
- package/dist/components/message/item/MessageMoreButton.js +42 -0
- package/dist/components/message/item/QuoteMessage.d.ts.map +1 -1
- package/dist/components/message/item/QuoteMessage.js +23 -2
- package/dist/components/message/item/RevokeMessage.js +1 -1
- package/dist/components/message/item/SessionEventMessage.d.ts.map +1 -1
- package/dist/components/message/item/SessionEventMessage.js +13 -1
- package/dist/components/message/item/SystemLogMessage.d.ts.map +1 -1
- package/dist/components/message/item/SystemLogMessage.js +7 -0
- package/dist/components/message/item/index.d.ts.map +1 -1
- package/dist/components/message/item/index.js +80 -18
- package/dist/components/message/item/otherSenders.d.ts +7 -0
- package/dist/components/message/item/otherSenders.d.ts.map +1 -0
- package/dist/components/message/item/otherSenders.js +29 -0
- package/dist/components/message/item/textStyle.d.ts +1 -1
- package/dist/components/message/item/textStyle.d.ts.map +1 -1
- package/dist/components/message/item/textStyle.js +2 -2
- package/dist/components/message/messageKeyboardNav.d.ts +8 -0
- package/dist/components/message/messageKeyboardNav.d.ts.map +1 -0
- package/dist/components/message/messageKeyboardNav.js +24 -0
- package/dist/components/message/reply/ReplyPreviewBar.d.ts.map +1 -1
- package/dist/components/message/reply/ReplyPreviewBar.js +11 -4
- package/dist/components/message/toolbox/MessageToolboxMenu.d.ts.map +1 -1
- package/dist/components/message/toolbox/MessageToolboxMenu.js +16 -1
- package/dist/components/search-conversation/SearchAll.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchAll.js +12 -1
- package/dist/components/search-conversation/SearchDrawer.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchDrawer.js +31 -15
- package/dist/components/search-conversation/SearchMessageOnCurrentConversation.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchMessageOnCurrentConversation.js +5 -2
- package/dist/components/search-conversation/index.d.ts.map +1 -1
- package/dist/components/search-conversation/index.js +3 -1
- package/dist/components/search-conversation/item/SearchItemAsGroup.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsGroup.js +14 -4
- package/dist/components/search-conversation/item/SearchItemAsMessage.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsMessage.js +18 -7
- package/dist/components/search-conversation/item/SearchItemAsUser.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsUser.js +23 -5
- package/dist/components/search-conversation/item/searchRowClass.d.ts +3 -0
- package/dist/components/search-conversation/item/searchRowClass.d.ts.map +1 -0
- package/dist/components/search-conversation/item/searchRowClass.js +5 -0
- package/dist/components/session/DeskAssignedSession.d.ts +5 -1
- package/dist/components/session/DeskAssignedSession.d.ts.map +1 -1
- package/dist/components/session/DeskAssignedSession.js +40 -12
- package/dist/components/session/DeskTeamInbox.d.ts.map +1 -1
- package/dist/components/session/DeskTeamInbox.js +15 -22
- package/dist/components/session/FolderRow.d.ts +21 -0
- package/dist/components/session/FolderRow.d.ts.map +1 -0
- package/dist/components/session/FolderRow.js +16 -0
- package/dist/components/session/SessionFolderList.d.ts +23 -0
- package/dist/components/session/SessionFolderList.d.ts.map +1 -0
- package/dist/components/session/SessionFolderList.js +27 -0
- package/dist/components/session/sessionFilters.d.ts +24 -0
- package/dist/components/session/sessionFilters.d.ts.map +1 -0
- package/dist/components/session/sessionFilters.js +80 -0
- package/dist/components/shortcut-help/ShortcutHelpModal.d.ts +8 -0
- package/dist/components/shortcut-help/ShortcutHelpModal.d.ts.map +1 -0
- package/dist/components/shortcut-help/ShortcutHelpModal.js +23 -0
- package/dist/components/thread/AssignConfirmModal.d.ts.map +1 -1
- package/dist/components/thread/AssignConfirmModal.js +4 -3
- package/dist/components/thread/EndSessionConfirm.d.ts +11 -0
- package/dist/components/thread/EndSessionConfirm.d.ts.map +1 -0
- package/dist/components/thread/EndSessionConfirm.js +31 -0
- package/dist/components/thread/EndSessionToast.d.ts +6 -0
- package/dist/components/thread/EndSessionToast.d.ts.map +1 -0
- package/dist/components/thread/EndSessionToast.js +18 -0
- package/dist/components/thread/GroupInfoBodyCrm.d.ts +46 -0
- package/dist/components/thread/GroupInfoBodyCrm.d.ts.map +1 -0
- package/dist/components/thread/GroupInfoBodyCrm.js +41 -0
- package/dist/components/thread/GroupInfoRows.d.ts +33 -0
- package/dist/components/thread/GroupInfoRows.d.ts.map +1 -0
- package/dist/components/thread/GroupInfoRows.js +18 -0
- package/dist/components/thread/GroupThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/GroupThreadInfo.js +23 -6
- package/dist/components/thread/ManualAssignPopover.d.ts +3 -1
- package/dist/components/thread/ManualAssignPopover.d.ts.map +1 -1
- package/dist/components/thread/ManualAssignPopover.js +21 -9
- package/dist/components/thread/SessionDetailCard.d.ts +6 -0
- package/dist/components/thread/SessionDetailCard.d.ts.map +1 -0
- package/dist/components/thread/SessionDetailCard.js +103 -0
- package/dist/components/thread/SessionSection.d.ts +2 -4
- package/dist/components/thread/SessionSection.d.ts.map +1 -1
- package/dist/components/thread/SessionSection.js +19 -122
- package/dist/components/thread/SessionTagPicker.d.ts +11 -0
- package/dist/components/thread/SessionTagPicker.d.ts.map +1 -0
- package/dist/components/thread/SessionTagPicker.js +27 -0
- package/dist/components/thread/SingleThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/SingleThreadInfo.js +16 -6
- package/dist/components/thread/SupportSessionPanel.d.ts +18 -0
- package/dist/components/thread/SupportSessionPanel.d.ts.map +1 -0
- package/dist/components/thread/SupportSessionPanel.js +46 -0
- package/dist/components/thread/ThreadInfo.d.ts +8 -1
- package/dist/components/thread/ThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/ThreadInfo.js +27 -29
- package/dist/components/thread/ThreadInfoHeader.d.ts +13 -0
- package/dist/components/thread/ThreadInfoHeader.d.ts.map +1 -0
- package/dist/components/thread/ThreadInfoHeader.js +11 -0
- package/dist/components/thread/UserSection.d.ts.map +1 -1
- package/dist/components/thread/UserSection.js +35 -22
- package/dist/components/thread/sessionDateFormat.d.ts +3 -0
- package/dist/components/thread/sessionDateFormat.d.ts.map +1 -0
- package/dist/components/thread/sessionDateFormat.js +13 -0
- package/dist/components/thread/sessionDuration.d.ts +5 -0
- package/dist/components/thread/sessionDuration.d.ts.map +1 -0
- package/dist/components/thread/sessionDuration.js +24 -0
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +2 -0
- package/dist/constants/layout.d.ts +24 -0
- package/dist/constants/layout.d.ts.map +1 -0
- package/dist/constants/layout.js +23 -0
- package/dist/context/ChatContext.d.ts.map +1 -1
- package/dist/context/ChatContext.js +27 -1
- package/dist/hooks/canned-response/useSearchCannedAcrossScopes.d.ts +7 -0
- package/dist/hooks/canned-response/useSearchCannedAcrossScopes.d.ts.map +1 -0
- package/dist/hooks/canned-response/useSearchCannedAcrossScopes.js +46 -0
- package/dist/hooks/common/useCloseOnSidePanelOpen.d.ts +3 -0
- package/dist/hooks/common/useCloseOnSidePanelOpen.d.ts.map +1 -0
- package/dist/hooks/common/useCloseOnSidePanelOpen.js +15 -0
- package/dist/hooks/common/useDeskShortcuts.d.ts +11 -0
- package/dist/hooks/common/useDeskShortcuts.d.ts.map +1 -0
- package/dist/hooks/common/useDeskShortcuts.js +94 -0
- package/dist/hooks/common/useEscapeLayer.d.ts +3 -0
- package/dist/hooks/common/useEscapeLayer.d.ts.map +1 -0
- package/dist/hooks/common/useEscapeLayer.js +18 -0
- package/dist/hooks/common/useMediaQuery.d.ts +3 -0
- package/dist/hooks/common/useMediaQuery.d.ts.map +1 -0
- package/dist/hooks/common/useMediaQuery.js +12 -0
- package/dist/hooks/common/useSidePanel.d.ts +12 -0
- package/dist/hooks/common/useSidePanel.d.ts.map +1 -0
- package/dist/hooks/common/useSidePanel.js +32 -0
- package/dist/hooks/group/useConversationGroups.d.ts.map +1 -1
- package/dist/hooks/group/useConversationGroups.js +3 -0
- package/dist/hooks/message/useNewMessageAnnouncement.d.ts +3 -0
- package/dist/hooks/message/useNewMessageAnnouncement.d.ts.map +1 -0
- package/dist/hooks/message/useNewMessageAnnouncement.js +30 -0
- package/dist/hooks/search/useSearchGroups.js +2 -1
- package/dist/hooks/search/useSearchMessage.d.ts +3 -1
- package/dist/hooks/search/useSearchMessage.d.ts.map +1 -1
- package/dist/hooks/search/useSearchMessage.js +2 -2
- package/dist/hooks/session/useBotSessionOwnerIdentity.d.ts +12 -0
- package/dist/hooks/session/useBotSessionOwnerIdentity.d.ts.map +1 -0
- package/dist/hooks/session/useBotSessionOwnerIdentity.js +22 -0
- package/dist/hooks/session/useCloseSession.d.ts +1 -0
- package/dist/hooks/session/useCloseSession.d.ts.map +1 -1
- package/dist/hooks/session/useCloseSession.js +9 -8
- package/dist/hooks/session/useEndSession.d.ts +11 -0
- package/dist/hooks/session/useEndSession.d.ts.map +1 -0
- package/dist/hooks/session/useEndSession.js +45 -0
- package/dist/hooks/session/useGetSession.d.ts.map +1 -1
- package/dist/hooks/session/useGetSession.js +27 -6
- package/dist/hooks/session/usePendingSessionClose.d.ts +5 -0
- package/dist/hooks/session/usePendingSessionClose.d.ts.map +1 -0
- package/dist/hooks/session/usePendingSessionClose.js +12 -0
- package/dist/hooks/session/useSessionCustomerName.d.ts +3 -0
- package/dist/hooks/session/useSessionCustomerName.d.ts.map +1 -0
- package/dist/hooks/session/useSessionCustomerName.js +19 -0
- package/dist/hooks/session/useSessionFieldAutosave.d.ts +19 -0
- package/dist/hooks/session/useSessionFieldAutosave.d.ts.map +1 -0
- package/dist/hooks/session/useSessionFieldAutosave.js +52 -0
- package/dist/hooks/user/useUserUsername.d.ts +3 -0
- package/dist/hooks/user/useUserUsername.d.ts.map +1 -0
- package/dist/hooks/user/useUserUsername.js +49 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/locales/vi/common.json +201 -21
- package/dist/locales/vi/conversation-inbox.json +21 -2
- package/dist/screens/desk-message/DeskWorkspace.d.ts +12 -0
- package/dist/screens/desk-message/DeskWorkspace.d.ts.map +1 -0
- package/dist/screens/desk-message/DeskWorkspace.js +57 -0
- package/dist/screens/desk-message/FolderOverlay.d.ts +4 -0
- package/dist/screens/desk-message/FolderOverlay.d.ts.map +1 -0
- package/dist/screens/desk-message/FolderOverlay.js +32 -0
- package/dist/screens/desk-message/SkipLinks.d.ts +4 -0
- package/dist/screens/desk-message/SkipLinks.d.ts.map +1 -0
- package/dist/screens/desk-message/SkipLinks.js +19 -0
- package/dist/screens/desk-message/ViewportNotice.d.ts +4 -0
- package/dist/screens/desk-message/ViewportNotice.d.ts.map +1 -0
- package/dist/screens/desk-message/ViewportNotice.js +9 -0
- package/dist/screens/desk-message/index.d.ts +3 -2
- package/dist/screens/desk-message/index.d.ts.map +1 -1
- package/dist/screens/desk-message/index.js +4 -12
- package/dist/store/deskPanelHost.d.ts +13 -0
- package/dist/store/deskPanelHost.d.ts.map +1 -0
- package/dist/store/deskPanelHost.js +9 -0
- package/dist/store/escapeLayers.d.ts +15 -0
- package/dist/store/escapeLayers.d.ts.map +1 -0
- package/dist/store/escapeLayers.js +15 -0
- package/dist/store/pendingSessionClose.d.ts +19 -0
- package/dist/store/pendingSessionClose.d.ts.map +1 -0
- package/dist/store/pendingSessionClose.js +74 -0
- package/dist/store/session.d.ts +2 -1
- package/dist/store/session.d.ts.map +1 -1
- package/dist/store/session.js +4 -1
- package/dist/store/sessionFolder.d.ts +15 -0
- package/dist/store/sessionFolder.d.ts.map +1 -0
- package/dist/store/sessionFolder.js +18 -0
- package/dist/store/shortcutPrefs.d.ts +9 -0
- package/dist/store/shortcutPrefs.d.ts.map +1 -0
- package/dist/store/shortcutPrefs.js +23 -0
- package/dist/store/sidePanel.d.ts +12 -0
- package/dist/store/sidePanel.d.ts.map +1 -0
- package/dist/store/sidePanel.js +9 -0
- package/dist/store/workspaceLayout.d.ts +12 -0
- package/dist/store/workspaceLayout.d.ts.map +1 -0
- package/dist/store/workspaceLayout.js +9 -0
- package/dist/styles/global.css +1 -1
- package/dist/types/chat.d.ts +18 -0
- package/dist/types/chat.d.ts.map +1 -1
- package/dist/types/dto.d.ts +2 -1
- package/dist/types/dto.d.ts.map +1 -1
- package/dist/utils/a11yClickable.d.ts +10 -0
- package/dist/utils/a11yClickable.d.ts.map +1 -0
- package/dist/utils/a11yClickable.js +15 -0
- package/dist/utils/events.d.ts +4 -0
- package/dist/utils/events.d.ts.map +1 -1
- package/dist/utils/headerMemberCount.d.ts +10 -0
- package/dist/utils/headerMemberCount.d.ts.map +1 -0
- package/dist/utils/headerMemberCount.js +3 -0
- package/dist/utils/memberEventRun.d.ts +16 -0
- package/dist/utils/memberEventRun.d.ts.map +1 -0
- package/dist/utils/memberEventRun.js +40 -0
- package/package.json +1 -1
- package/dist/components/session/SessionFilterMenu.d.ts +0 -15
- package/dist/components/session/SessionFilterMenu.d.ts.map +0 -1
- package/dist/components/session/SessionFilterMenu.js +0 -30
- package/dist/components/session/sessionMenuItems.d.ts +0 -28
- package/dist/components/session/sessionMenuItems.d.ts.map +0 -1
- package/dist/components/session/sessionMenuItems.js +0 -119
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { StrokeIcon } from "../../../components/icon/StrokeIcon";
|
|
5
|
+
import { useTranslation } from "react-i18next";
|
|
6
|
+
import { getGroupNotificationText } from "../../../utils/messageLog";
|
|
7
|
+
const toggleClass = "border-0 bg-transparent p-0 text-xs font-medium text-primary-500 hover:underline";
|
|
8
|
+
// CRM only: a run of member changes shows as one quiet line, expandable in place.
|
|
9
|
+
const MemberEventSummary = ({ messages }) => {
|
|
10
|
+
const { t } = useTranslation();
|
|
11
|
+
const [expanded, setExpanded] = useState(false);
|
|
12
|
+
return (_jsx("div", { className: "flex justify-center", "data-testid": "member-event-summary", children: _jsxs("div", { className: "flex flex-col items-center gap-1 rounded-xl bg-gray-50 px-3 py-1 text-xs text-gray-600", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(StrokeIcon, { name: "users", size: 14 }), _jsx("span", { children: t("member_events_collapsed", { count: messages.length }) }), _jsx("button", { type: "button", className: toggleClass, "aria-expanded": expanded, onClick: () => setExpanded((prev) => !prev), children: t(expanded ? "member_events_hide" : "member_events_show") })] }), expanded &&
|
|
13
|
+
messages.map((message) => {
|
|
14
|
+
var _a;
|
|
15
|
+
return (_jsx("p", { className: "text-center", children: getGroupNotificationText(message.contentType, (_a = message.notificationElem) === null || _a === void 0 ? void 0 : _a.detail, t, message.senderNickname) }, message.clientMsgID));
|
|
16
|
+
})] }) }));
|
|
17
|
+
};
|
|
18
|
+
export default MemberEventSummary;
|
|
@@ -6,6 +6,8 @@ export interface MessageBubbleProps {
|
|
|
6
6
|
showSenderName?: boolean;
|
|
7
7
|
showTip?: boolean;
|
|
8
8
|
isInternal?: boolean;
|
|
9
|
+
/** CRM support thread, not the customer or the viewer: another agent, or the bot. */
|
|
10
|
+
supportSender?: "agent" | "bot";
|
|
9
11
|
id?: string;
|
|
10
12
|
isTransparent?: boolean;
|
|
11
13
|
timeLabel?: string;
|
|
@@ -14,6 +16,6 @@ export interface MessageBubbleProps {
|
|
|
14
16
|
/** Called on bubble tap to toggle this message as the single revealed one. */
|
|
15
17
|
onToggleTimeReveal?: () => void;
|
|
16
18
|
}
|
|
17
|
-
declare const MessageBubble: ({ isMine, content, senderName, showSenderName, showTip, isInternal, id, isTransparent, timeLabel, timeRevealed, onToggleTimeReveal, }: MessageBubbleProps) => import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
declare const MessageBubble: ({ isMine, content, senderName, showSenderName, showTip, isInternal, supportSender, id, isTransparent, timeLabel, timeRevealed, onToggleTimeReveal, }: MessageBubbleProps) => import("react/jsx-runtime").JSX.Element;
|
|
18
20
|
export default MessageBubble;
|
|
19
21
|
//# sourceMappingURL=MessageBubble.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageBubble.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/MessageBubble.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"MessageBubble.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/MessageBubble.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,SAAS,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qFAAqF;IACrF,aAAa,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAChC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,8EAA8E;IAC9E,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AA6CD,QAAA,MAAM,aAAa,GAAI,sJAapB,kBAAkB,4CA8FpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import clsx from "clsx";
|
|
4
|
+
import { StrokeIcon } from "../../../components/icon/StrokeIcon";
|
|
5
|
+
import { useTranslation } from "react-i18next";
|
|
6
|
+
import useAuthStore from "../../../store/auth";
|
|
4
7
|
const INCOMING_TAIL_PATH = "M1.3798 18H4V0C3.51762 4.5 3.34269 10.5 0.966518 14C-0.568384 16.2608 -0.159364 18 1.3798 18Z";
|
|
5
8
|
const OUTGOING_TAIL_PATH = "M2.6202 18H0V0C0.482375 4.5 0.657308 10.5 3.03348 14C4.56838 16.2608 4.15936 18 2.6202 18Z";
|
|
6
9
|
const MessageBubbleTail = ({ isMine, isInternal, }) => (_jsx("div", { className: clsx("flex shrink-0 items-center justify-center", isInternal
|
|
@@ -8,23 +11,34 @@ const MessageBubbleTail = ({ isMine, isInternal, }) => (_jsx("div", { className:
|
|
|
8
11
|
: isMine
|
|
9
12
|
? "text-chat-bubble-mine"
|
|
10
13
|
: "text-chat-bubble-neutral"), "data-cp-name": "MessageBubbleTail", children: _jsx("div", { className: "flex-none", children: _jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "4", height: "18", viewBox: "0 0 4 18", fill: "none", "aria-hidden": true, children: _jsx("path", { d: isMine ? OUTGOING_TAIL_PATH : INCOMING_TAIL_PATH, fill: "currentColor", fillOpacity: "0.1" }) }) }) }));
|
|
11
|
-
const MessageBubble = ({ isMine, content, senderName, showSenderName, showTip = true, isInternal = false, id, isTransparent = false, timeLabel, timeRevealed = false, onToggleTimeReveal, }) => {
|
|
12
|
-
const
|
|
14
|
+
const MessageBubble = ({ isMine, content, senderName, showSenderName, showTip = true, isInternal = false, supportSender, id, isTransparent = false, timeLabel, timeRevealed = false, onToggleTimeReveal, }) => {
|
|
15
|
+
const { t } = useTranslation();
|
|
16
|
+
const isCrm = useAuthStore((state) => state.isCrm);
|
|
17
|
+
const showInternalLabel = isCrm && isInternal && !isTransparent;
|
|
18
|
+
// CRM bubbles are flat rounded boxes; the tail only exists outside CRM.
|
|
19
|
+
const showTail = showTip && !isTransparent && !isCrm;
|
|
13
20
|
const showTimeLabel = Boolean(timeLabel) && timeRevealed;
|
|
21
|
+
const bubbleFill = isInternal
|
|
22
|
+
? isCrm
|
|
23
|
+
? "border border-warning-400/50 bg-warning-25"
|
|
24
|
+
: "bg-chat-internal/10"
|
|
25
|
+
: isMine || (isCrm && supportSender === "agent")
|
|
26
|
+
? "bg-[var(--dc-color-bubble-mine,rgba(0,81,255,0.1))] text-[color:var(--dc-color-bubble-mine-text,inherit)]"
|
|
27
|
+
: isCrm && supportSender === "bot"
|
|
28
|
+
? "bg-success-25 text-gray-900"
|
|
29
|
+
: "bg-[var(--dc-color-bubble-other,rgba(131,137,157,0.1))] text-[color:var(--dc-color-bubble-other-text,inherit)]";
|
|
14
30
|
const bubbleClass = clsx("relative min-w-0 max-w-full", isTransparent
|
|
15
31
|
? "bg-transparent p-0"
|
|
16
|
-
: clsx("p-2",
|
|
17
|
-
?
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
: "bg-chat-bubble-neutral/10"));
|
|
25
|
-
return (_jsxs("div", { className: "flex min-w-0 max-w-full flex-col gap-1", children: [showSenderName && senderName && (_jsx("span", { "data-testid": "message-sender-name", className: "px-1 text-[12px] font-medium leading-[160%] tracking-[0.12px] text-gray-400", children: senderName })), _jsxs("div", { className: "relative flex min-w-0 max-w-full items-end", "data-testid": "message-bubble", "data-cp-name": "MessageBubble", onClick: () => {
|
|
32
|
+
: clsx("p-2", isCrm
|
|
33
|
+
? "rounded-xl"
|
|
34
|
+
: showTip
|
|
35
|
+
? isMine
|
|
36
|
+
? "rounded-[20px] rounded-br-none"
|
|
37
|
+
: "rounded-[20px] rounded-bl-none"
|
|
38
|
+
: "rounded-[20px]", bubbleFill));
|
|
39
|
+
return (_jsxs("div", { className: "flex min-w-0 max-w-full flex-col gap-1", children: [showSenderName && senderName && (_jsx("span", { "data-testid": "message-sender-name", className: clsx("px-1 text-[12px] font-medium leading-[160%] tracking-[0.12px]", isCrm ? "text-gray-600" : "text-gray-400"), children: senderName })), _jsxs("div", { className: "relative flex min-w-0 max-w-full items-end", "data-testid": "message-bubble", "data-cp-name": "MessageBubble", onClick: () => {
|
|
26
40
|
if (timeLabel)
|
|
27
41
|
onToggleTimeReveal === null || onToggleTimeReveal === void 0 ? void 0 : onToggleTimeReveal();
|
|
28
|
-
}, children: [!isMine && showTail && (_jsx(MessageBubbleTail, { isMine: isMine, isInternal: isInternal })), _jsx("div", { className: bubbleClass, id: id, children:
|
|
42
|
+
}, children: [!isMine && showTail && (_jsx(MessageBubbleTail, { isMine: isMine, isInternal: isInternal })), _jsx("div", { className: bubbleClass, id: id, children: _jsxs("div", { className: clsx("flex flex-col", showInternalLabel ? "gap-1" : "gap-2", !isTransparent && "px-1"), children: [showInternalLabel && (_jsxs("span", { "data-testid": "message-internal-label", className: "flex items-center gap-1 text-xs font-semibold text-warning-800", children: [_jsx(StrokeIcon, { name: "lock", size: 14 }), t("internal_label")] })), content] }) }), isMine && showTail && (_jsx(MessageBubbleTail, { isMine: isMine, isInternal: isInternal })), showTimeLabel && (_jsx("span", { "data-testid": "message-time-label", className: clsx("absolute -bottom-2 flex h-[19px] w-[30px] items-center justify-center rounded-full bg-white text-[10px] text-gray-400 shadow-sm", isMine ? "right-1" : "left-1"), children: timeLabel }))] })] }));
|
|
29
43
|
};
|
|
30
44
|
export default MessageBubble;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MenuProps } from "antd";
|
|
2
|
+
interface MessageMoreButtonProps {
|
|
3
|
+
items: NonNullable<MenuProps["items"]>;
|
|
4
|
+
open: boolean;
|
|
5
|
+
onOpenChange: (open: boolean) => void;
|
|
6
|
+
isMine: boolean;
|
|
7
|
+
/** True while the message holds focus, so Tab can reach the button. */
|
|
8
|
+
reachable: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** CRM only: "…" beside the bubble that opens the same text menu as right-click. */
|
|
11
|
+
declare const MessageMoreButton: ({ items, open, onOpenChange, isMine, reachable, }: MessageMoreButtonProps) => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export default MessageMoreButton;
|
|
13
|
+
//# sourceMappingURL=MessageMoreButton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageMoreButton.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/MessageMoreButton.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAwBtC,UAAU,sBAAsB;IAC9B,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,oFAAoF;AACpF,QAAA,MAAM,iBAAiB,GAAI,mDAMxB,sBAAsB,4CAyDxB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useRef } from "react";
|
|
4
|
+
import { Dropdown } from "antd";
|
|
5
|
+
import clsx from "clsx";
|
|
6
|
+
import { StrokeIcon } from "../../../components/icon/StrokeIcon";
|
|
7
|
+
import { useTranslation } from "react-i18next";
|
|
8
|
+
import { useEscapeLayer } from "../../../hooks/common/useEscapeLayer";
|
|
9
|
+
// Compact text menu from the design: 260px, 36px rows, 14px text, 18px icons.
|
|
10
|
+
const MORE_MENU_CLASSNAME = clsx("[&_.ant-dropdown-menu]:!w-[260px]", "[&_.ant-dropdown-menu]:!rounded-xl", "[&_.ant-dropdown-menu]:!p-1", "[&_.ant-dropdown-menu-item]:!h-9", "[&_.ant-dropdown-menu-item]:!rounded-lg", "[&_.ant-dropdown-menu-item]:!px-3", "[&_.ant-dropdown-menu-item]:!py-0", "[&_.ant-dropdown-menu-item]:flex", "[&_.ant-dropdown-menu-item]:items-center", "[&_[data-cp-name=ToolboxMenuRow]]:gap-2.5", "[&_[data-cp-name=ToolboxMenuRow]_span]:!text-sm", "[&_[data-cp-name=ToolboxMenuRow]_span]:!font-normal", "[&_[data-cp-name=ToolboxMenuRow]_svg]:!h-[18px]", "[&_[data-cp-name=ToolboxMenuRow]_svg]:!w-[18px]");
|
|
11
|
+
/** CRM only: "…" beside the bubble that opens the same text menu as right-click. */
|
|
12
|
+
const MessageMoreButton = ({ items, open, onOpenChange, isMine, reachable, }) => {
|
|
13
|
+
const { t } = useTranslation();
|
|
14
|
+
const buttonRef = useRef(null);
|
|
15
|
+
useEscapeLayer(open, () => onOpenChange(false));
|
|
16
|
+
// Opened from the keyboard: move into the menu; closing returns focus to the button.
|
|
17
|
+
const openedByKeyboardRef = useRef(false);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
var _a, _b;
|
|
20
|
+
if (open) {
|
|
21
|
+
const active = document.activeElement;
|
|
22
|
+
openedByKeyboardRef.current = !!((_a = active === null || active === void 0 ? void 0 : active.matches) === null || _a === void 0 ? void 0 : _a.call(active, ":focus-visible"));
|
|
23
|
+
if (!openedByKeyboardRef.current)
|
|
24
|
+
return;
|
|
25
|
+
// The popup mounts a frame or two after `open`; retry briefly.
|
|
26
|
+
let tries = 0;
|
|
27
|
+
const id = window.setInterval(() => {
|
|
28
|
+
const item = document.querySelector(".ant-dropdown:not(.ant-dropdown-hidden) [role=menuitem]");
|
|
29
|
+
item === null || item === void 0 ? void 0 : item.focus();
|
|
30
|
+
if (item || ++tries > 20)
|
|
31
|
+
window.clearInterval(id);
|
|
32
|
+
}, 50);
|
|
33
|
+
return () => window.clearInterval(id);
|
|
34
|
+
}
|
|
35
|
+
if (openedByKeyboardRef.current) {
|
|
36
|
+
openedByKeyboardRef.current = false;
|
|
37
|
+
(_b = buttonRef.current) === null || _b === void 0 ? void 0 : _b.focus();
|
|
38
|
+
}
|
|
39
|
+
}, [open]);
|
|
40
|
+
return (_jsx(Dropdown, { menu: { items }, trigger: ["click"], open: open, onOpenChange: onOpenChange, placement: isMine ? "bottomRight" : "bottomLeft", overlayClassName: MORE_MENU_CLASSNAME, children: _jsx("button", { ref: buttonRef, type: "button", "data-testid": "message-more-button", "aria-label": t("message_actions"), title: t("message_actions"), "aria-haspopup": "menu", "aria-expanded": open, tabIndex: reachable || open ? 0 : -1, className: clsx("absolute top-1/2 z-[1] flex h-8 w-8 -translate-y-1/2 items-center justify-center rounded-lg border-0 bg-gray-5 p-0 text-gray-900 opacity-0 transition-opacity hover:bg-gray-25 focus-visible:opacity-100 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary-200 group-hover/msg:opacity-100 group-focus-within/msg:opacity-100", open && "opacity-100", isMine ? "right-full mr-1" : "left-full ml-1"), children: _jsx(StrokeIcon, { name: "more", size: 18 }) }) }));
|
|
41
|
+
};
|
|
42
|
+
export default MessageMoreButton;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuoteMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/QuoteMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"QuoteMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/QuoteMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAS3D,UAAU,qBAAqB;IAC7B,OAAO,EAAE,WAAW,CAAC;IACrB,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD;AAED,QAAA,MAAM,gBAAgB,GAAI,mCAGvB,qBAAqB,mDA0EvB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -4,6 +4,8 @@ import { useCallback, useMemo } from "react";
|
|
|
4
4
|
import useAuthStore from "../../../store/auth";
|
|
5
5
|
import useConversationStore from "../../../store/conversation";
|
|
6
6
|
import ReplyQuoteContent from "../../../components/message/reply/ReplyQuoteContent";
|
|
7
|
+
import { useUserUsername } from "../../../hooks/user/useUserUsername";
|
|
8
|
+
import { isSupportSessionAgentView } from "../../../utils/conversation";
|
|
7
9
|
const QuoteMessageItem = ({ message, onPressQuoteMessage, }) => {
|
|
8
10
|
var _a, _b;
|
|
9
11
|
const userID = useAuthStore((state) => state.userID);
|
|
@@ -19,7 +21,19 @@ const QuoteMessageItem = ({ message, onPressQuoteMessage, }) => {
|
|
|
19
21
|
return false;
|
|
20
22
|
}
|
|
21
23
|
}, [conversationData === null || conversationData === void 0 ? void 0 : conversationData.ex]);
|
|
24
|
+
const quoteMessage = ((_a = message === null || message === void 0 ? void 0 : message.quoteElem) === null || _a === void 0 ? void 0 : _a.quoteMessage) || ((_b = message === null || message === void 0 ? void 0 : message.atTextElem) === null || _b === void 0 ? void 0 : _b.quoteMessage);
|
|
25
|
+
// Outside CRM, an agent identifies quoted senders by username; the session
|
|
26
|
+
// owner keeps seeing the thread's own name.
|
|
27
|
+
const isAgentView = !isCrm && isSupportSessionAgentView(conversationData, userID);
|
|
28
|
+
const quotedUsername = useUserUsername(isAgentView && (quoteMessage === null || quoteMessage === void 0 ? void 0 : quoteMessage.sendID) !== userID
|
|
29
|
+
? quoteMessage === null || quoteMessage === void 0 ? void 0 : quoteMessage.sendID
|
|
30
|
+
: undefined);
|
|
22
31
|
const getDisplayName = useCallback(({ name, id }) => {
|
|
32
|
+
if (isAgentView) {
|
|
33
|
+
if (id === userID)
|
|
34
|
+
return t("you");
|
|
35
|
+
return quotedUsername || name || "";
|
|
36
|
+
}
|
|
23
37
|
if (!name)
|
|
24
38
|
return "";
|
|
25
39
|
if (!isCrm && isChatSupport) {
|
|
@@ -28,8 +42,15 @@ const QuoteMessageItem = ({ message, onPressQuoteMessage, }) => {
|
|
|
28
42
|
if (id === userID)
|
|
29
43
|
return t("you");
|
|
30
44
|
return name;
|
|
31
|
-
}, [
|
|
32
|
-
|
|
45
|
+
}, [
|
|
46
|
+
isAgentView,
|
|
47
|
+
quotedUsername,
|
|
48
|
+
isCrm,
|
|
49
|
+
isChatSupport,
|
|
50
|
+
conversationData === null || conversationData === void 0 ? void 0 : conversationData.showName,
|
|
51
|
+
userID,
|
|
52
|
+
t,
|
|
53
|
+
]);
|
|
33
54
|
if (!quoteMessage)
|
|
34
55
|
return null;
|
|
35
56
|
const title = getDisplayName({
|
|
@@ -3,6 +3,6 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
3
3
|
import { useTranslation } from "react-i18next";
|
|
4
4
|
const RevokeMessageItem = (_) => {
|
|
5
5
|
const { t } = useTranslation();
|
|
6
|
-
return (_jsx("span", { className: "whitespace-pre-wrap text-[16px] leading-[160%] italic text-gray-500", "data-cp-name": "RevokeMessageItem", children: t("revoked") }));
|
|
6
|
+
return (_jsx("span", { className: "whitespace-pre-wrap text-[length:var(--dc-message-font-size,16px)] leading-[var(--dc-message-line-height,160%)] italic text-gray-500", "data-cp-name": "RevokeMessageItem", children: t("revoked") }));
|
|
7
7
|
};
|
|
8
8
|
export default RevokeMessageItem;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionEventMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/SessionEventMessage.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionEventMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/SessionEventMessage.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAQ3D,UAAU,4BAA4B;IACpC,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,QAAA,MAAM,uBAAuB,GAAI,aAAa,4BAA4B,mDA2BzE,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
|
|
@@ -1,12 +1,24 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
import { useTranslation } from "react-i18next";
|
|
4
|
-
import
|
|
4
|
+
import useAuthStore from "../../../store/auth";
|
|
5
|
+
import useConversationStore from "../../../store/conversation";
|
|
6
|
+
import { PeerType } from "../../../types/conversation";
|
|
7
|
+
import { getSessionEventText, SESSION_END_MARKER } from "../../../utils/messageLog";
|
|
8
|
+
import CrmSystemLine from "./CrmSystemLine";
|
|
5
9
|
const SessionEventMessageItem = ({ message }) => {
|
|
10
|
+
var _a;
|
|
11
|
+
const isCrm = useAuthStore((state) => state.isCrm);
|
|
6
12
|
const { t } = useTranslation();
|
|
13
|
+
const isBotThread = useConversationStore((state) => { var _a; return ((_a = state.conversationData) === null || _a === void 0 ? void 0 : _a.peerType) === PeerType.BOT; });
|
|
7
14
|
const text = getSessionEventText(message, t);
|
|
8
15
|
if (!text)
|
|
9
16
|
return null;
|
|
17
|
+
if (isCrm) {
|
|
18
|
+
const isEnd = ((_a = message.customElem) === null || _a === void 0 ? void 0 : _a.data) === SESSION_END_MARKER;
|
|
19
|
+
const icon = isEnd ? "check-circle" : isBotThread ? "bot" : "message-circle";
|
|
20
|
+
return _jsx(CrmSystemLine, { icon: icon, children: text });
|
|
21
|
+
}
|
|
10
22
|
return (_jsx("div", { className: "flex justify-center", children: _jsx("span", { className: "rounded-full bg-gray-200 px-3 py-1.5 text-center text-[13px] font-normal text-gray-900", children: text }) }));
|
|
11
23
|
};
|
|
12
24
|
export default SessionEventMessageItem;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SystemLogMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/SystemLogMessage.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"SystemLogMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/SystemLogMessage.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAS3D,UAAU,yBAAyB;IACjC,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,QAAA,MAAM,oBAAoB,GAAI,aAAa,yBAAyB,mDA0CnE,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -2,12 +2,19 @@
|
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
import { getSystemLogMessageHtml, getSystemLogMessageText, } from "../../../utils/messageLog";
|
|
4
4
|
import { sanitizeHtml } from "../../../utils/common";
|
|
5
|
+
import useAuthStore from "../../../store/auth";
|
|
6
|
+
import CrmSystemLine from "./CrmSystemLine";
|
|
5
7
|
const SystemLogMessageItem = ({ message }) => {
|
|
8
|
+
const isCrm = useAuthStore((state) => state.isCrm);
|
|
6
9
|
const html = getSystemLogMessageHtml(message);
|
|
7
10
|
const text = getSystemLogMessageText(message);
|
|
8
11
|
if (!html && !text) {
|
|
9
12
|
return null;
|
|
10
13
|
}
|
|
14
|
+
if (isCrm) {
|
|
15
|
+
// BE html carries its own pill style and a bold name; CRM keeps plain text next to an icon.
|
|
16
|
+
return (_jsx(CrmSystemLine, { icon: "user", children: html ? (_jsx("span", { dangerouslySetInnerHTML: { __html: sanitizeHtml(html) }, className: "[&_b]:font-normal [&_span]:!rounded-none [&_span]:!bg-transparent [&_span]:!p-0 [&_span]:!text-xs [&_span]:!font-normal [&_span]:!text-gray-600 [&_strong]:font-normal" })) : (text) }));
|
|
17
|
+
}
|
|
11
18
|
if (html) {
|
|
12
19
|
return (_jsx("div", { className: "flex justify-center", children: _jsx("div", { dangerouslySetInnerHTML: { __html: sanitizeHtml(html) } }) }));
|
|
13
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,WAAW,IAAI,eAAe,EAG/B,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,WAAW,IAAI,eAAe,EAG/B,MAAM,8BAA8B,CAAC;AA0DtC,UAAU,gBAAgB;IACxB,OAAO,EAAE,eAAe,CAAC;IACzB,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uBAAuB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;IACpD,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;IAClD,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;IACpD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,2EAA2E;IAC3E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,iBAAiB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;CAClC;AAiDD,QAAA,MAAM,WAAW,GAAI,kSAkBlB,gBAAgB,mDA0elB,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -7,25 +7,33 @@ import { MessageStatus, MessageType, } from "@droppii-org/wasm-client-sdk";
|
|
|
7
7
|
import MessageBubble from "./MessageBubble";
|
|
8
8
|
import { renderBubbleContent } from "./renderMessageContent";
|
|
9
9
|
import { getImmediateNeighbor, getVisibleNeighbor, isMessageHiddenForViewer, } from "../../../hooks/message/useMessage";
|
|
10
|
-
import { MSG_ITEM_BUBBLE_GROUP_PREFIX, MSG_ITEM_CONTENT_PREFIX, MSG_ITEM_PREFIX, } from "../../../constants";
|
|
10
|
+
import { MSG_ITEM_BUBBLE_GROUP_PREFIX, MSG_ITEM_CONTENT_PREFIX, MSG_ITEM_PREFIX, SUPPORT_SYSTEM_SENDER_ID, } from "../../../constants";
|
|
11
11
|
import { formatDividerTimestamp } from "../../../utils/common";
|
|
12
12
|
import { CustomMessageType } from "../../../types/customMessage";
|
|
13
13
|
import useAuthStore from "../../../store/auth";
|
|
14
14
|
import useConversationStore from "../../../store/conversation";
|
|
15
|
-
import { useMemo, useRef } from "react";
|
|
15
|
+
import { useMemo, useRef, useState } from "react";
|
|
16
16
|
import { useLongPress } from "ahooks";
|
|
17
17
|
import { Trans, useTranslation } from "react-i18next";
|
|
18
18
|
import MessageStatusIndicator from "./MessageStatusIndicator";
|
|
19
19
|
import { useSendMessage, isMediaResendable, } from "../../../hooks/message/useSendMessage";
|
|
20
|
-
import {
|
|
20
|
+
import { AdaptiveIcon } from "../../../components/icon/AdaptiveIcon";
|
|
21
|
+
import TintedAvatar from "../../../components/common/TintedAvatar";
|
|
22
|
+
import { hasMultipleOtherSenders } from "./otherSenders";
|
|
21
23
|
import SystemLogMessageItem from "./SystemLogMessage";
|
|
22
24
|
import GroupNotificationMessageItem from "./GroupNotificationMessage";
|
|
23
25
|
import SessionEventMessageItem from "./SessionEventMessage";
|
|
26
|
+
import MemberEventSummary from "./MemberEventSummary";
|
|
27
|
+
import MessageMoreButton from "./MessageMoreButton";
|
|
28
|
+
import { MESSAGE_FOCUSABLE_ATTR } from "../messageKeyboardNav";
|
|
29
|
+
import DateDivider from "./DateDivider";
|
|
30
|
+
import { getMemberEventRun } from "../../../utils/memberEventRun";
|
|
24
31
|
import UnreadMessageDivider from "../../../components/message/UnreadMessageDivider";
|
|
25
32
|
import { isGroupNotificationMessageType, isSessionEventMessage, isSystemLogMessageType, } from "../../../utils/messageLog";
|
|
26
|
-
import { isSupportSessionAgentView } from "../../../utils/conversation";
|
|
33
|
+
import { isSupportSessionAgentView, resolveSupportSessionOwnerId, } from "../../../utils/conversation";
|
|
27
34
|
import { buildMessageToolboxMenuItems, getCopyableMessageText, isCopyableMessageType, isPinnableMessageType, MessageToolboxActionKey, MESSAGE_TOOLBOX_OVERLAY_CLASSNAME, useMessageToolboxVisibility, } from "../../../components/message/toolbox";
|
|
28
35
|
const MESSAGE_AVATAR_SIZE = 24;
|
|
36
|
+
const CRM_MESSAGE_AVATAR_SIZE = 28;
|
|
29
37
|
const DIVIDER_GAP_MINUTES = 30;
|
|
30
38
|
const DIVIDER_GAP_MS = DIVIDER_GAP_MINUTES * 60 * 1000;
|
|
31
39
|
const GROUPING_GAP_MINUTES = 5;
|
|
@@ -35,9 +43,9 @@ const isOrderMessage = (message) => { var _a; return ((_a = message === null ||
|
|
|
35
43
|
// break) so both features agree on the same calendar-day boundary — a group
|
|
36
44
|
// must never span a divider, regardless of how small the time gap is.
|
|
37
45
|
const isSameCalendarDay = (sendTimeA, sendTimeB) => dayjs(sendTimeA).isSame(sendTimeB, "day");
|
|
38
|
-
const MessageAvatar = ({ avatarUrl, senderNickname, }) => {
|
|
46
|
+
const MessageAvatar = ({ avatarUrl, senderNickname, raised = false, isCrm = false, }) => {
|
|
39
47
|
var _a;
|
|
40
|
-
return (_jsx(Avatar, { size: MESSAGE_AVATAR_SIZE, src: avatarUrl, className: "shrink-0 self-end", "data-cp-name": "MessageAvatar", children: ((_a = senderNickname === null || senderNickname === void 0 ? void 0 : senderNickname.charAt) === null || _a === void 0 ? void 0 : _a.call(senderNickname, 0)) || "A" }));
|
|
48
|
+
return isCrm ? (_jsx(TintedAvatar, { name: senderNickname || "A", src: avatarUrl, size: CRM_MESSAGE_AVATAR_SIZE, className: clsx("self-end", raised && "mb-[22px]") })) : (_jsx(Avatar, { size: MESSAGE_AVATAR_SIZE, src: avatarUrl, alt: "", className: clsx("shrink-0 self-end", raised && "mb-5"), "data-cp-name": "MessageAvatar", children: ((_a = senderNickname === null || senderNickname === void 0 ? void 0 : senderNickname.charAt) === null || _a === void 0 ? void 0 : _a.call(senderNickname, 0)) || "A" }));
|
|
41
49
|
};
|
|
42
50
|
const MessageItem = ({ message, allMessages, isGroupChat = false, forceHideTip = false, contextMenuOpen, onContextMenuOpenChange, onRevokeMessage, onQuoteMessage, onPressQuoteMessage, onPinMessage, onUnpinMessage, enableLongPress = false, timeRevealed = false, onToggleTimeReveal, onCopyMessageLink, showUnreadDivider = false, onUnreadDividerSeen, }) => {
|
|
43
51
|
var _a;
|
|
@@ -46,6 +54,9 @@ const MessageItem = ({ message, allMessages, isGroupChat = false, forceHideTip =
|
|
|
46
54
|
const userID = useAuthStore((state) => state.userID);
|
|
47
55
|
const isCrm = useAuthStore((state) => state.isCrm);
|
|
48
56
|
const conversationData = useConversationStore((state) => state.conversationData);
|
|
57
|
+
// CRM only: the "…" menu and whether the message holds focus (so Tab reaches it).
|
|
58
|
+
const [moreOpen, setMoreOpen] = useState(false);
|
|
59
|
+
const [hasFocus, setHasFocus] = useState(false);
|
|
49
60
|
const { isDeliveredForUi, isRevocable, isMine, isMessageLinkCopyable } = useMessageToolboxVisibility(message, userID);
|
|
50
61
|
const contextMenuItems = useMemo(() => {
|
|
51
62
|
if ((message === null || message === void 0 ? void 0 : message.contentType) === MessageType.RevokeMessage ||
|
|
@@ -135,22 +146,42 @@ const MessageItem = ({ message, allMessages, isGroupChat = false, forceHideTip =
|
|
|
135
146
|
]);
|
|
136
147
|
const bubbleWrapperRef = useRef(null);
|
|
137
148
|
useLongPress(() => onContextMenuOpenChange === null || onContextMenuOpenChange === void 0 ? void 0 : onContextMenuOpenChange(true), enableLongPress ? bubbleWrapperRef : undefined, { delay: 500 });
|
|
149
|
+
// Agents outside CRM (e.g. PDP CS) also need to tell the owner apart from
|
|
150
|
+
// other supporters; only the session owner keeps the anonymous bot view.
|
|
151
|
+
const isSessionAgentView = isSupportSessionAgentView(conversationData, userID);
|
|
138
152
|
const showSenderInfo = useMemo(() => {
|
|
139
153
|
var _a, _b, _c;
|
|
154
|
+
if ((message === null || message === void 0 ? void 0 : message.sendID) === userID)
|
|
155
|
+
return false;
|
|
156
|
+
if (isSessionAgentView)
|
|
157
|
+
return true;
|
|
140
158
|
try {
|
|
141
159
|
const isChatSupport = (_c = (_b = (_a = JSON.parse((conversationData === null || conversationData === void 0 ? void 0 : conversationData.ex) || "{}")) === null || _a === void 0 ? void 0 : _a.sessionInfo) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.botId;
|
|
142
|
-
return Boolean(isChatSupport && isCrm
|
|
160
|
+
return Boolean(isChatSupport && isCrm);
|
|
143
161
|
}
|
|
144
162
|
catch (_d) {
|
|
145
163
|
console.log("Failed to parse conversationData.ex");
|
|
146
164
|
return false;
|
|
147
165
|
}
|
|
148
|
-
}, [
|
|
166
|
+
}, [
|
|
167
|
+
conversationData === null || conversationData === void 0 ? void 0 : conversationData.ex,
|
|
168
|
+
isCrm,
|
|
169
|
+
isSessionAgentView,
|
|
170
|
+
message === null || message === void 0 ? void 0 : message.sendID,
|
|
171
|
+
userID,
|
|
172
|
+
]);
|
|
149
173
|
const isInternalMessage = Boolean(message === null || message === void 0 ? void 0 : message.isInternal);
|
|
174
|
+
// CRM support thread: other agents share the viewer's colour, the bot gets its own.
|
|
175
|
+
const sessionOwnerId = resolveSupportSessionOwnerId(conversationData);
|
|
176
|
+
const supportSender = isCrm && !isMine && !!sessionOwnerId && (message === null || message === void 0 ? void 0 : message.sendID) !== sessionOwnerId
|
|
177
|
+
? (message === null || message === void 0 ? void 0 : message.sendID) === SUPPORT_SYSTEM_SENDER_ID
|
|
178
|
+
? "bot"
|
|
179
|
+
: "agent"
|
|
180
|
+
: undefined;
|
|
150
181
|
const isSystemLogMessage = isSystemLogMessageType(message === null || message === void 0 ? void 0 : message.contentType);
|
|
151
182
|
const isGroupNotificationMessage = isGroupNotificationMessageType(message === null || message === void 0 ? void 0 : message.contentType);
|
|
152
183
|
const isSessionEvent = isSessionEventMessage(message);
|
|
153
|
-
const showsSessionEvents = isCrm ||
|
|
184
|
+
const showsSessionEvents = isCrm || isSessionAgentView;
|
|
154
185
|
const isStickerMessage = (message === null || message === void 0 ? void 0 : message.contentType) === MessageType.StickerMessage;
|
|
155
186
|
const hasContextMenu = contextMenuItems.length > 0;
|
|
156
187
|
const isLatestMine = ((_a = allMessages.find((m) => m.sendID === userID)) === null || _a === void 0 ? void 0 : _a.clientMsgID) ===
|
|
@@ -190,10 +221,17 @@ const MessageItem = ({ message, allMessages, isGroupChat = false, forceHideTip =
|
|
|
190
221
|
Math.abs(dayjs(message.sendTime).diff(previousMessage.sendTime, "millisecond")) > DIVIDER_GAP_MS;
|
|
191
222
|
const showPeerInfo = isGroupChat || showSenderInfo;
|
|
192
223
|
const showAvatar = showPeerInfo && !isMine && !nextSameUser;
|
|
193
|
-
|
|
224
|
+
// CRM drops the label unless two different people besides the viewer are talking.
|
|
225
|
+
const showSenderName = showPeerInfo &&
|
|
226
|
+
!isMine &&
|
|
227
|
+
!prevSameUser &&
|
|
228
|
+
(!isCrm || hasMultipleOtherSenders(allMessages, userID));
|
|
194
229
|
const showTip = forceHideTip ? false : !nextSameUser;
|
|
230
|
+
// CRM: 4px inside a sender group, 16px between groups; others keep py-1.
|
|
195
231
|
const messageContainerProps = {
|
|
196
|
-
className:
|
|
232
|
+
className: isCrm
|
|
233
|
+
? clsx("group/msg flex min-w-0 flex-col gap-2 px-3 sm:px-4 rounded-lg focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary-200", prevSameUser ? "pt-1" : "pt-4")
|
|
234
|
+
: "flex flex-col gap-2 py-1 px-3 sm:px-4 min-w-0",
|
|
197
235
|
id: `${MSG_ITEM_PREFIX}${message === null || message === void 0 ? void 0 : message.clientMsgID}`,
|
|
198
236
|
};
|
|
199
237
|
const unreadDividerNode = showUnreadDivider ? (_jsx(UnreadMessageDivider, { onSeen: onUnreadDividerSeen })) : null;
|
|
@@ -203,7 +241,7 @@ const MessageItem = ({ message, allMessages, isGroupChat = false, forceHideTip =
|
|
|
203
241
|
if (isMessageHiddenForViewer(message, isCrm, conversationData !== null && conversationData !== void 0 ? conversationData : undefined, userID)) {
|
|
204
242
|
return hiddenMessageNode;
|
|
205
243
|
}
|
|
206
|
-
const timeBreakNode = showTimeBreak ? (_jsx("div", { className: "flex justify-center", children: _jsx("span", { className: "rounded-full bg-neutral-100 px-2 py-1 text-center text-xs text-gray-600", children: formatDividerTimestamp(message.sendTime) }) })) : null;
|
|
244
|
+
const timeBreakNode = showTimeBreak ? (isCrm ? (_jsx(DateDivider, { label: formatDividerTimestamp(message.sendTime) })) : (_jsx("div", { className: "flex justify-center", children: _jsx("span", { className: "rounded-full bg-neutral-100 px-2 py-1 text-center text-xs text-gray-600", children: formatDividerTimestamp(message.sendTime) }) }))) : null;
|
|
207
245
|
if (isSystemLogMessage) {
|
|
208
246
|
return (_createElement("div", Object.assign({}, messageContainerProps, { key: message === null || message === void 0 ? void 0 : message.clientMsgID }),
|
|
209
247
|
unreadDividerNode,
|
|
@@ -211,10 +249,13 @@ const MessageItem = ({ message, allMessages, isGroupChat = false, forceHideTip =
|
|
|
211
249
|
_jsx(SystemLogMessageItem, { message: message })));
|
|
212
250
|
}
|
|
213
251
|
if (isGroupNotificationMessage) {
|
|
252
|
+
const memberRun = isCrm ? getMemberEventRun(allMessages, message) : null;
|
|
253
|
+
if (memberRun && !memberRun.isHead)
|
|
254
|
+
return hiddenMessageNode;
|
|
214
255
|
return (_createElement("div", Object.assign({}, messageContainerProps, { key: message === null || message === void 0 ? void 0 : message.clientMsgID }),
|
|
215
256
|
unreadDividerNode,
|
|
216
257
|
timeBreakNode,
|
|
217
|
-
_jsx(GroupNotificationMessageItem, { message: message })));
|
|
258
|
+
memberRun ? (_jsx(MemberEventSummary, { messages: memberRun.messages })) : (_jsx(GroupNotificationMessageItem, { message: message }))));
|
|
218
259
|
}
|
|
219
260
|
if (isSessionEvent) {
|
|
220
261
|
// Owners in consumer apps don't see session dividers; CRM and agents do.
|
|
@@ -225,17 +266,38 @@ const MessageItem = ({ message, allMessages, isGroupChat = false, forceHideTip =
|
|
|
225
266
|
timeBreakNode,
|
|
226
267
|
_jsx(SessionEventMessageItem, { message: message })));
|
|
227
268
|
}
|
|
228
|
-
const bubbleNode = (_jsx(MessageBubble, { isMine: isMine, isInternal: isInternalMessage, senderName: message === null || message === void 0 ? void 0 : message.senderNickname, showSenderName: showSenderName, showTip: showTip, id: `${MSG_ITEM_CONTENT_PREFIX}${message === null || message === void 0 ? void 0 : message.clientMsgID}`, content: renderBubbleContent(message, onPressQuoteMessage), isTransparent: isStickerMessage, timeLabel: dayjs.tz(message.sendTime).format("HH:mm"), timeRevealed: timeRevealed, onToggleTimeReveal: () => onToggleTimeReveal === null || onToggleTimeReveal === void 0 ? void 0 : onToggleTimeReveal(message.clientMsgID) }));
|
|
269
|
+
const bubbleNode = (_jsx(MessageBubble, { isMine: isMine, isInternal: isInternalMessage, supportSender: supportSender, senderName: message === null || message === void 0 ? void 0 : message.senderNickname, showSenderName: showSenderName, showTip: showTip, id: `${MSG_ITEM_CONTENT_PREFIX}${message === null || message === void 0 ? void 0 : message.clientMsgID}`, content: renderBubbleContent(message, onPressQuoteMessage), isTransparent: isStickerMessage, timeLabel: isCrm ? undefined : dayjs.tz(message.sendTime).format("HH:mm"), timeRevealed: timeRevealed, onToggleTimeReveal: () => onToggleTimeReveal === null || onToggleTimeReveal === void 0 ? void 0 : onToggleTimeReveal(message.clientMsgID) }));
|
|
229
270
|
const showPinnedBadge = Boolean(message === null || message === void 0 ? void 0 : message.isPinned);
|
|
230
|
-
const
|
|
271
|
+
const showGroupTime = isCrm && !nextSameUser;
|
|
272
|
+
const pinnedBadgeNode = showPinnedBadge ? (_jsx("span", { "data-testid": "message-pinned-badge", className: clsx("absolute -top-2.5 z-[1] flex h-[22px] w-[26px] items-center justify-center rounded-full border border-white bg-gray-25", isMine ? "left-0" : "right-0"), children: _jsx(AdaptiveIcon, { stroke: "pin", font: "thumbtack-b", size: 12, className: "text-[var(--dc-color-primary)]" }) })) : null;
|
|
231
273
|
const bubbleGroupId = `${MSG_ITEM_BUBBLE_GROUP_PREFIX}${message === null || message === void 0 ? void 0 : message.clientMsgID}`;
|
|
232
274
|
const wrappedBubble = hasContextMenu ? (_jsx(Dropdown, { menu: { items: contextMenuItems }, trigger: ["contextMenu"], open: contextMenuOpen, onOpenChange: onContextMenuOpenChange, overlayClassName: MESSAGE_TOOLBOX_OVERLAY_CLASSNAME, children: _jsxs("div", { ref: bubbleWrapperRef, id: bubbleGroupId, className: "relative min-w-0 max-w-full", children: [bubbleNode, pinnedBadgeNode] }) })) : (_jsxs("div", { id: bubbleGroupId, className: "relative min-w-0 max-w-full", children: [bubbleNode, pinnedBadgeNode] }));
|
|
233
|
-
|
|
275
|
+
const moreButtonNode = isCrm && hasContextMenu ? (_jsx(MessageMoreButton, { items: contextMenuItems, open: moreOpen, onOpenChange: setMoreOpen, isMine: isMine, reachable: hasFocus })) : null;
|
|
276
|
+
const crmFocusProps = isCrm
|
|
277
|
+
? {
|
|
278
|
+
tabIndex: -1,
|
|
279
|
+
[MESSAGE_FOCUSABLE_ATTR]: "",
|
|
280
|
+
onFocus: () => setHasFocus(true),
|
|
281
|
+
onBlur: (e) => {
|
|
282
|
+
if (!e.currentTarget.contains(e.relatedTarget))
|
|
283
|
+
setHasFocus(false);
|
|
284
|
+
},
|
|
285
|
+
onKeyDown: (e) => {
|
|
286
|
+
if (e.key === "Enter" && e.target === e.currentTarget && hasContextMenu) {
|
|
287
|
+
e.preventDefault();
|
|
288
|
+
setMoreOpen(true);
|
|
289
|
+
}
|
|
290
|
+
},
|
|
291
|
+
}
|
|
292
|
+
: {};
|
|
293
|
+
return (_createElement("div", Object.assign({}, messageContainerProps, crmFocusProps, { key: message === null || message === void 0 ? void 0 : message.clientMsgID, "data-cp-name": "MessageItem" }),
|
|
234
294
|
unreadDividerNode,
|
|
235
295
|
timeBreakNode,
|
|
236
|
-
_jsxs("div", { className: clsx("flex min-w-0 items-end gap-1", isMine ? "justify-end pl-12 pr-3" : "justify-start pl-3 pr-12"), children: [!isMine &&
|
|
296
|
+
_jsxs("div", { className: clsx("flex min-w-0 items-end", isCrm ? "gap-2" : "gap-1", isMine ? "justify-end pl-12 pr-3" : "justify-start pl-3 pr-12"), children: [!isMine &&
|
|
237
297
|
showPeerInfo &&
|
|
238
|
-
(showAvatar ? (_jsx(MessageAvatar, { avatarUrl: message === null || message === void 0 ? void 0 : message.senderFaceUrl, senderNickname: message === null || message === void 0 ? void 0 : message.senderNickname })) : (_jsx("div", { className: "h-6 w-6 shrink-0 self-end" }))), _jsxs("div", { className: clsx("flex min-w-0 flex-col gap-1", isMine ? "items-end" : "items-start"), children: [_jsxs("div", { className: clsx("flex min-w-0 max-w-full items-end gap-1.5", showPinnedBadge && "mt-1.5"), children: [isMine && (_jsx(MessageStatusIndicator, { message: message, isLatest: isLatestMine })), wrappedBubble
|
|
298
|
+
(showAvatar ? (_jsx(MessageAvatar, { avatarUrl: message === null || message === void 0 ? void 0 : message.senderFaceUrl, senderNickname: message === null || message === void 0 ? void 0 : message.senderNickname, raised: showGroupTime, isCrm: isCrm })) : (_jsx("div", { className: isCrm ? "h-7 w-7 shrink-0 self-end" : "h-6 w-6 shrink-0 self-end" }))), _jsxs("div", { className: clsx("flex min-w-0 flex-col gap-1", isCrm && "max-w-[76%]", isMine ? "items-end" : "items-start"), children: [_jsxs("div", { className: clsx("relative flex min-w-0 max-w-full items-end gap-1.5", showPinnedBadge && "mt-1.5"), children: [isMine && moreButtonNode, isMine && (_jsx(MessageStatusIndicator, { message: message, isLatest: isLatestMine })), wrappedBubble, !isMine && moreButtonNode] }), showGroupTime && (_jsxs("span", { "data-testid": "message-group-time", className: "px-1 text-xs text-gray-600", children: [isMine && (message === null || message === void 0 ? void 0 : message.senderNickname)
|
|
299
|
+
? `${message.senderNickname} · `
|
|
300
|
+
: "", dayjs.tz(message.sendTime).format("HH:mm")] })), isMine && message.status === MessageStatus.Failed && (_jsx("span", { className: "mt-1 text-xs text-red-500", children: isMediaResendable(message) ? (_jsx(Trans, { i18nKey: "message_send_failed", components: {
|
|
239
301
|
bold: (_jsx("strong", { className: "cursor-pointer", onClick: () => resendMessage(message) })),
|
|
240
302
|
} })) : (t("message_send_failed_no_retry")) }))] })] })));
|
|
241
303
|
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { MessageItem } from "@droppii-org/wasm-client-sdk";
|
|
2
|
+
/**
|
|
3
|
+
* True when at least two different people other than the viewer have spoken (bot and
|
|
4
|
+
* customer, or several members). Only then does an incoming group need a sender label.
|
|
5
|
+
*/
|
|
6
|
+
export declare const hasMultipleOtherSenders: (messages: MessageItem[], viewerId: string) => boolean;
|
|
7
|
+
//# sourceMappingURL=otherSenders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otherSenders.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/otherSenders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAgBhE;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAClC,UAAU,WAAW,EAAE,EACvB,UAAU,MAAM,KACf,OAeF,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { MessageType } from "@droppii-org/wasm-client-sdk";
|
|
2
|
+
import { isGroupNotificationMessageType, isSessionEventMessage, isSystemLogMessageType, } from "../../../utils/messageLog";
|
|
3
|
+
const cache = new WeakMap();
|
|
4
|
+
const isChatMessage = (message) => message.contentType !== MessageType.RevokeMessage &&
|
|
5
|
+
!isSystemLogMessageType(message.contentType) &&
|
|
6
|
+
!isGroupNotificationMessageType(message.contentType) &&
|
|
7
|
+
!isSessionEventMessage(message);
|
|
8
|
+
/**
|
|
9
|
+
* True when at least two different people other than the viewer have spoken (bot and
|
|
10
|
+
* customer, or several members). Only then does an incoming group need a sender label.
|
|
11
|
+
*/
|
|
12
|
+
export const hasMultipleOtherSenders = (messages, viewerId) => {
|
|
13
|
+
let byViewer = cache.get(messages);
|
|
14
|
+
if (!byViewer) {
|
|
15
|
+
byViewer = new Map();
|
|
16
|
+
cache.set(messages, byViewer);
|
|
17
|
+
}
|
|
18
|
+
const known = byViewer.get(viewerId);
|
|
19
|
+
if (known !== undefined)
|
|
20
|
+
return known;
|
|
21
|
+
const others = new Set();
|
|
22
|
+
for (const message of messages) {
|
|
23
|
+
if (message.sendID !== viewerId && isChatMessage(message))
|
|
24
|
+
others.add(message.sendID);
|
|
25
|
+
}
|
|
26
|
+
const result = others.size > 1;
|
|
27
|
+
byViewer.set(viewerId, result);
|
|
28
|
+
return result;
|
|
29
|
+
};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export declare const MESSAGE_TEXT_CLASS = "text-[16px] leading-[160%] tracking-[0.16px] text-gray-900 [&_code]:font-[inherit] [&_pre]:font-[inherit] [&_kbd]:font-[inherit] [&_samp]:font-[inherit]";
|
|
1
|
+
export declare const MESSAGE_TEXT_CLASS = "text-[length:var(--dc-message-font-size,16px)] leading-[var(--dc-message-line-height,160%)] tracking-[0.16px] text-gray-900 [&_code]:font-[inherit] [&_pre]:font-[inherit] [&_kbd]:font-[inherit] [&_samp]:font-[inherit]";
|
|
2
2
|
export declare const MESSAGE_LINE_HEIGHT_PX = 25.6;
|
|
3
3
|
//# sourceMappingURL=textStyle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"textStyle.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/textStyle.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"textStyle.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/textStyle.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,8NAC8L,CAAC;AAG9N,eAAO,MAAM,sBAAsB,OAAO,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export const MESSAGE_TEXT_CLASS = "text-[16px] leading-[160%] tracking-[0.16px] text-gray-900 [&_code]:font-[inherit] [&_pre]:font-[inherit] [&_kbd]:font-[inherit] [&_samp]:font-[inherit]";
|
|
2
|
-
// 16px ×
|
|
1
|
+
export const MESSAGE_TEXT_CLASS = "text-[length:var(--dc-message-font-size,16px)] leading-[var(--dc-message-line-height,160%)] tracking-[0.16px] text-gray-900 [&_code]:font-[inherit] [&_pre]:font-[inherit] [&_kbd]:font-[inherit] [&_samp]:font-[inherit]";
|
|
2
|
+
// One line at the default 16px × 160%; CRM sets a smaller size but never clamps text.
|
|
3
3
|
export const MESSAGE_LINE_HEIGHT_PX = 25.6;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { KeyboardEvent } from "react";
|
|
2
|
+
export declare const MESSAGE_FOCUSABLE_ATTR = "data-msg-focusable";
|
|
3
|
+
/**
|
|
4
|
+
* Up/Down on the message log moves focus between messages. The log renders
|
|
5
|
+
* newest first in a column-reverse flex, so the next DOM node is the older message.
|
|
6
|
+
*/
|
|
7
|
+
export declare const handleMessageLogKeyDown: (event: KeyboardEvent<HTMLElement>) => void;
|
|
8
|
+
//# sourceMappingURL=messageKeyboardNav.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messageKeyboardNav.d.ts","sourceRoot":"","sources":["../../../src/components/message/messageKeyboardNav.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,eAAO,MAAM,sBAAsB,uBAAuB,CAAC;AAE3D;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,OAAO,aAAa,CAAC,WAAW,CAAC,SAmBxE,CAAC"}
|