@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.
- 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/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 +64 -15
- 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.js +2 -2
- 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/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 +2 -2
- 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;
|
|
@@ -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 ||
|
|
@@ -160,6 +171,13 @@ const MessageItem = ({ message, allMessages, isGroupChat = false, forceHideTip =
|
|
|
160
171
|
userID,
|
|
161
172
|
]);
|
|
162
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;
|
|
163
181
|
const isSystemLogMessage = isSystemLogMessageType(message === null || message === void 0 ? void 0 : message.contentType);
|
|
164
182
|
const isGroupNotificationMessage = isGroupNotificationMessageType(message === null || message === void 0 ? void 0 : message.contentType);
|
|
165
183
|
const isSessionEvent = isSessionEventMessage(message);
|
|
@@ -203,10 +221,17 @@ const MessageItem = ({ message, allMessages, isGroupChat = false, forceHideTip =
|
|
|
203
221
|
Math.abs(dayjs(message.sendTime).diff(previousMessage.sendTime, "millisecond")) > DIVIDER_GAP_MS;
|
|
204
222
|
const showPeerInfo = isGroupChat || showSenderInfo;
|
|
205
223
|
const showAvatar = showPeerInfo && !isMine && !nextSameUser;
|
|
206
|
-
|
|
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));
|
|
207
229
|
const showTip = forceHideTip ? false : !nextSameUser;
|
|
230
|
+
// CRM: 4px inside a sender group, 16px between groups; others keep py-1.
|
|
208
231
|
const messageContainerProps = {
|
|
209
|
-
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",
|
|
210
235
|
id: `${MSG_ITEM_PREFIX}${message === null || message === void 0 ? void 0 : message.clientMsgID}`,
|
|
211
236
|
};
|
|
212
237
|
const unreadDividerNode = showUnreadDivider ? (_jsx(UnreadMessageDivider, { onSeen: onUnreadDividerSeen })) : null;
|
|
@@ -216,7 +241,7 @@ const MessageItem = ({ message, allMessages, isGroupChat = false, forceHideTip =
|
|
|
216
241
|
if (isMessageHiddenForViewer(message, isCrm, conversationData !== null && conversationData !== void 0 ? conversationData : undefined, userID)) {
|
|
217
242
|
return hiddenMessageNode;
|
|
218
243
|
}
|
|
219
|
-
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;
|
|
220
245
|
if (isSystemLogMessage) {
|
|
221
246
|
return (_createElement("div", Object.assign({}, messageContainerProps, { key: message === null || message === void 0 ? void 0 : message.clientMsgID }),
|
|
222
247
|
unreadDividerNode,
|
|
@@ -224,10 +249,13 @@ const MessageItem = ({ message, allMessages, isGroupChat = false, forceHideTip =
|
|
|
224
249
|
_jsx(SystemLogMessageItem, { message: message })));
|
|
225
250
|
}
|
|
226
251
|
if (isGroupNotificationMessage) {
|
|
252
|
+
const memberRun = isCrm ? getMemberEventRun(allMessages, message) : null;
|
|
253
|
+
if (memberRun && !memberRun.isHead)
|
|
254
|
+
return hiddenMessageNode;
|
|
227
255
|
return (_createElement("div", Object.assign({}, messageContainerProps, { key: message === null || message === void 0 ? void 0 : message.clientMsgID }),
|
|
228
256
|
unreadDividerNode,
|
|
229
257
|
timeBreakNode,
|
|
230
|
-
_jsx(GroupNotificationMessageItem, { message: message })));
|
|
258
|
+
memberRun ? (_jsx(MemberEventSummary, { messages: memberRun.messages })) : (_jsx(GroupNotificationMessageItem, { message: message }))));
|
|
231
259
|
}
|
|
232
260
|
if (isSessionEvent) {
|
|
233
261
|
// Owners in consumer apps don't see session dividers; CRM and agents do.
|
|
@@ -238,17 +266,38 @@ const MessageItem = ({ message, allMessages, isGroupChat = false, forceHideTip =
|
|
|
238
266
|
timeBreakNode,
|
|
239
267
|
_jsx(SessionEventMessageItem, { message: message })));
|
|
240
268
|
}
|
|
241
|
-
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) }));
|
|
242
270
|
const showPinnedBadge = Boolean(message === null || message === void 0 ? void 0 : message.isPinned);
|
|
243
|
-
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;
|
|
244
273
|
const bubbleGroupId = `${MSG_ITEM_BUBBLE_GROUP_PREFIX}${message === null || message === void 0 ? void 0 : message.clientMsgID}`;
|
|
245
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] }));
|
|
246
|
-
|
|
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" }),
|
|
247
294
|
unreadDividerNode,
|
|
248
295
|
timeBreakNode,
|
|
249
|
-
_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 &&
|
|
250
297
|
showPeerInfo &&
|
|
251
|
-
(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: {
|
|
252
301
|
bold: (_jsx("strong", { className: "cursor-pointer", onClick: () => resendMessage(message) })),
|
|
253
302
|
} })) : (t("message_send_failed_no_retry")) }))] })] })));
|
|
254
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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export const MESSAGE_FOCUSABLE_ATTR = "data-msg-focusable";
|
|
2
|
+
/**
|
|
3
|
+
* Up/Down on the message log moves focus between messages. The log renders
|
|
4
|
+
* newest first in a column-reverse flex, so the next DOM node is the older message.
|
|
5
|
+
*/
|
|
6
|
+
export const handleMessageLogKeyDown = (event) => {
|
|
7
|
+
if (event.key !== "ArrowUp" && event.key !== "ArrowDown")
|
|
8
|
+
return;
|
|
9
|
+
const container = event.currentTarget;
|
|
10
|
+
const target = event.target;
|
|
11
|
+
const isMessage = target.hasAttribute(MESSAGE_FOCUSABLE_ATTR);
|
|
12
|
+
if (target !== container && !isMessage)
|
|
13
|
+
return;
|
|
14
|
+
const items = Array.from(container.querySelectorAll(`[${MESSAGE_FOCUSABLE_ATTR}]`));
|
|
15
|
+
if (!items.length)
|
|
16
|
+
return;
|
|
17
|
+
const current = items.indexOf(target);
|
|
18
|
+
const older = event.key === "ArrowUp";
|
|
19
|
+
const next = current === -1
|
|
20
|
+
? 0
|
|
21
|
+
: Math.min(items.length - 1, Math.max(0, current + (older ? 1 : -1)));
|
|
22
|
+
event.preventDefault();
|
|
23
|
+
items[next].focus();
|
|
24
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useTranslation } from "react-i18next";
|
|
3
|
-
import {
|
|
3
|
+
import { AdaptiveIcon } from "../../../components/icon/AdaptiveIcon";
|
|
4
4
|
import useAuthStore from "../../../store/auth";
|
|
5
5
|
import useConversationStore from "../../../store/conversation";
|
|
6
6
|
import { useUserUsername } from "../../../hooks/user/useUserUsername";
|
|
@@ -25,6 +25,6 @@ export const ReplyPreviewBar = () => {
|
|
|
25
25
|
const senderName = isMe
|
|
26
26
|
? t("your_self")
|
|
27
27
|
: quotedUsername || quotedMessage.senderNickname || "";
|
|
28
|
-
return (_jsxs("div", { "data-testid": "reply-preview-bar", "data-cp-name": "ReplyPreviewBar", className: "flex h-[59px] w-full shrink-0 items-center bg-gray-200/10 px-2 py-1", children: [_jsx(ReplyQuoteContent, { message: quotedMessage, title: t("reply_to", { name: senderName }) }), _jsx("button", { type: "button", onClick: handleClearQuotedMessage, "aria-label": t("cancel"), "data-testid": "reply-preview-bar-close", className: "flex h-4 w-4 shrink-0 items-center justify-center", children: _jsx(
|
|
28
|
+
return (_jsxs("div", { "data-testid": "reply-preview-bar", "data-cp-name": "ReplyPreviewBar", className: "flex h-[59px] w-full shrink-0 items-center bg-gray-200/10 px-2 py-1", children: [_jsx(ReplyQuoteContent, { message: quotedMessage, title: t("reply_to", { name: senderName }) }), _jsx("button", { type: "button", onClick: handleClearQuotedMessage, "aria-label": t("cancel"), "data-testid": "reply-preview-bar-close", className: "flex h-4 w-4 shrink-0 items-center justify-center", children: _jsx(AdaptiveIcon, { stroke: "x", font: "close-o", size: 16, className: "text-gray-600" }) })] }));
|
|
29
29
|
};
|
|
30
30
|
export default ReplyPreviewBar;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageToolboxMenu.d.ts","sourceRoot":"","sources":["../../../../src/components/message/toolbox/MessageToolboxMenu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"MessageToolboxMenu.d.ts","sourceRoot":"","sources":["../../../../src/components/message/toolbox/MessageToolboxMenu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAKtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE/C,eAAO,MAAM,iCAAiC,QAS7C,CAAC;AAgDF,eAAO,MAAM,4BAA4B,GACvC,SAAS,oBAAoB,EAAE,KAC9B,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAO5B,CAAC"}
|
|
@@ -1,8 +1,23 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import clsx from "clsx";
|
|
3
3
|
import { Icon } from "../../../components/icon";
|
|
4
|
+
import { StrokeIcon } from "../../../components/icon/StrokeIcon";
|
|
5
|
+
import useAuthStore from "../../../store/auth";
|
|
4
6
|
export const MESSAGE_TOOLBOX_OVERLAY_CLASSNAME = clsx("[&_.ant-dropdown-menu]:min-w-[200px]", "[&_.ant-dropdown-menu]:rounded-2xl", "[&_.ant-dropdown-menu]:p-0", "[&_.ant-dropdown-menu]:py-2", "[&_.ant-dropdown-menu]:shadow-message-toolbox", "[&_.ant-dropdown-menu-item]:rounded-none", "[&_.ant-dropdown-menu-item]:!px-4", "[&_.ant-dropdown-menu-item]:!py-1.5");
|
|
5
|
-
|
|
7
|
+
// Icon-font names of the toolbox actions and their line-icon twins in CRM.
|
|
8
|
+
const CRM_ICONS = {
|
|
9
|
+
"arrow-reply-o": "reply",
|
|
10
|
+
"thumbtack-o": "pin",
|
|
11
|
+
"thumbtack-off-o": "pin",
|
|
12
|
+
"copy-o": "copy",
|
|
13
|
+
"link-o": "link",
|
|
14
|
+
"trash-o": "undo",
|
|
15
|
+
};
|
|
16
|
+
const ToolboxMenuRow = ({ icon, label, danger = false }) => {
|
|
17
|
+
const isCrm = useAuthStore((state) => state.isCrm);
|
|
18
|
+
const crmIcon = isCrm ? CRM_ICONS[icon] : undefined;
|
|
19
|
+
return (_jsxs("div", { "data-cp-name": "ToolboxMenuRow", className: "flex items-center gap-3", children: [crmIcon ? (_jsx(StrokeIcon, { name: crmIcon, size: 18, className: danger ? "text-danger-600" : "text-gray-600" })) : (_jsx(Icon, { icon: icon, size: 24, className: danger ? "text-danger-400" : "text-gray-900" })), _jsx("span", { className: clsx("text-base font-medium", danger ? "text-danger-400" : "text-gray-900"), children: label })] }));
|
|
20
|
+
};
|
|
6
21
|
export const buildMessageToolboxMenuItems = (actions) => actions.map((action) => ({
|
|
7
22
|
key: action.key,
|
|
8
23
|
label: (_jsx(ToolboxMenuRow, { icon: action.icon, label: action.label, danger: action.danger })),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchAll.d.ts","sourceRoot":"","sources":["../../../src/components/search-conversation/SearchAll.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SearchAll.d.ts","sourceRoot":"","sources":["../../../src/components/search-conversation/SearchAll.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,wBAAwB,EAAE,MAAM,GAAG,CAAC;AAI7C,UAAU,0BAA0B;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,CAAC,GAAG,EAAE,wBAAwB,KAAK,IAAI,CAAC;CACvD;AA+CD,QAAA,MAAM,qBAAqB,GAAI,+BAG5B,0BAA0B,4CA4G5B,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
|