@droppii-org/chat-sdk 0.6.56 → 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/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 +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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/media-collection/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/media-collection/index.tsx"],"names":[],"mappings":"AAkBA,oBAAY,qBAAqB;IAC/B,KAAK,UAAU;IACf,KAAK,UAAU;IACf,IAAI,SAAS;IACb,IAAI,SAAS;CACd;AAED,QAAA,MAAM,eAAe,+CAuGpB,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
3
|
+
import { headerIconButtonClass, HeaderIcon } from "../../components/message/headerIconButton";
|
|
4
|
+
import useAuthStore from "../../store/auth";
|
|
5
|
+
import { useSidePanel } from "../../hooks/common/useSidePanel";
|
|
4
6
|
import { Button, Drawer, Tabs } from "antd";
|
|
5
7
|
import { Icon } from "../../components/icon";
|
|
6
8
|
import { useTranslation } from "react-i18next";
|
|
7
9
|
import ImageCollection from "./ImageCollection";
|
|
8
10
|
import VideoCollection from "./VideoCollection";
|
|
9
11
|
import { useIsMobile } from "../../hooks/common/useIsMobile";
|
|
10
|
-
import { useMemo } from "react";
|
|
12
|
+
import { useMemo, useRef } from "react";
|
|
11
13
|
import FileCollection from "./FileCollection";
|
|
12
14
|
import LinkCollection from "./LinkCollection";
|
|
15
|
+
import useDeskPanelHostStore from "../../store/deskPanelHost";
|
|
16
|
+
import DeskSidePanel from "../../components/common/DeskSidePanel";
|
|
17
|
+
import GroupPanelHeader from "../../components/group/GroupPanelHeader";
|
|
13
18
|
export var MediaCollectionTabKey;
|
|
14
19
|
(function (MediaCollectionTabKey) {
|
|
15
20
|
MediaCollectionTabKey["Image"] = "image";
|
|
@@ -19,8 +24,18 @@ export var MediaCollectionTabKey;
|
|
|
19
24
|
})(MediaCollectionTabKey || (MediaCollectionTabKey = {}));
|
|
20
25
|
const MediaCollection = () => {
|
|
21
26
|
const { t } = useTranslation();
|
|
22
|
-
const
|
|
27
|
+
const { isOpen, toggle } = useSidePanel("media");
|
|
28
|
+
const isCrm = useAuthStore((state) => state.isCrm);
|
|
23
29
|
const isMobile = useIsMobile();
|
|
30
|
+
const triggerRef = useRef(null);
|
|
31
|
+
// CRM desk: opens like the members panel, inline or as a drawer over the workspace.
|
|
32
|
+
const hasDeskHost = useDeskPanelHostStore((state) => !!(state.workspace || state.slot));
|
|
33
|
+
// Drawer renders in-place, so focus is handed back to the trigger explicitly.
|
|
34
|
+
const handleClose = () => {
|
|
35
|
+
var _a;
|
|
36
|
+
toggle();
|
|
37
|
+
(_a = triggerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
38
|
+
};
|
|
24
39
|
const items = useMemo(() => {
|
|
25
40
|
if (!isOpen)
|
|
26
41
|
return [];
|
|
@@ -47,11 +62,12 @@ const MediaCollection = () => {
|
|
|
47
62
|
},
|
|
48
63
|
];
|
|
49
64
|
}, [isOpen, t]);
|
|
50
|
-
|
|
65
|
+
const tabs = (_jsx(Tabs, { defaultActiveKey: MediaCollectionTabKey.Image, items: items, className: "h-full" }));
|
|
66
|
+
return (_jsxs("div", { "data-cp-name": "MediaCollection", className: "inline-flex shrink-0", children: [_jsx(Button, { ref: triggerRef, type: "text", shape: "default", className: headerIconButtonClass(isCrm, isOpen), onClick: toggle, "aria-label": t("media_library_open"), title: t("media_library_open"), children: _jsx(HeaderIcon, { isCrm: isCrm, stroke: "folder", font: "folder-o" }) }), isCrm && hasDeskHost ? (_jsx(DeskSidePanel, { open: isOpen, label: t("media_library_open"), onClose: handleClose, children: () => (_jsxs("div", { className: "flex h-full flex-col bg-white", "data-cp-name": "MediaLibraryPanel", children: [_jsx(GroupPanelHeader, { title: t("library"), onClose: handleClose }), _jsx("div", { className: "flex-1 overflow-hidden", children: tabs })] })) })) : (_jsx(Drawer, { "aria-label": t("media_library_open"), open: isOpen, onClose: handleClose, mask: false, closeIcon: false, styles: {
|
|
51
67
|
body: {
|
|
52
68
|
padding: 0,
|
|
53
69
|
height: "100%",
|
|
54
70
|
},
|
|
55
|
-
}, getContainer: false,
|
|
71
|
+
}, getContainer: false, destroyOnHidden: true, width: isMobile ? "100%" : 360, children: _jsxs("div", { className: "flex flex-col h-full", children: [_jsxs("div", { className: "flex items-center justify-between p-3", children: [_jsx("span", { className: "text-lg font-medium", children: t("library") }), _jsx(Button, { type: "text", shape: "default", className: "text-gray-500 w-8 h-8 p-0", onClick: handleClose, "aria-label": t("close"), children: _jsx(Icon, { icon: "close-b", size: 22 }) })] }), _jsx("div", { className: "flex-1 overflow-hidden", children: tabs })] }) }))] }));
|
|
56
72
|
};
|
|
57
73
|
export default MediaCollection;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroupMembersDrawer.d.ts","sourceRoot":"","sources":["../../../src/components/message/GroupMembersDrawer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GroupMembersDrawer.d.ts","sourceRoot":"","sources":["../../../src/components/message/GroupMembersDrawer.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAwB/C,UAAU,uBAAuB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA6BD,QAAA,MAAM,kBAAkB,GAAI,wDAKzB,uBAAuB,4CA4oBzB,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -2,7 +2,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import { GroupMemberRole } from "@droppii-org/wasm-client-sdk";
|
|
3
3
|
import { Avatar, Button, Drawer, Dropdown, Empty, Input, message, Spin } from "antd";
|
|
4
4
|
import ConfirmModal from "../../components/common/ConfirmModal";
|
|
5
|
-
import
|
|
5
|
+
import DisableSendPermissionConfirm from "../../components/group/DisableSendPermissionConfirm";
|
|
6
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
6
7
|
import { useDebounce } from "ahooks";
|
|
7
8
|
import { useTranslation } from "react-i18next";
|
|
8
9
|
import { useChatNavigate } from "../../hooks/conversation/useChatNavigate";
|
|
@@ -18,6 +19,12 @@ import { Icon } from "../../components/icon";
|
|
|
18
19
|
import AddMemberModal from "../../components/group/AddMemberModal";
|
|
19
20
|
import AdminPermissionModal from "../../components/group/AdminPermissionModal";
|
|
20
21
|
import { isGroupConversation } from "../../utils/imCommon";
|
|
22
|
+
import { useSidePanel } from "../../hooks/common/useSidePanel";
|
|
23
|
+
import { headerIconButtonClass, HeaderIcon } from "./headerIconButton";
|
|
24
|
+
import useDeskPanelHostStore from "../../store/deskPanelHost";
|
|
25
|
+
import DeskSidePanel from "../../components/common/DeskSidePanel";
|
|
26
|
+
import GroupMembersPanelCrm from "./GroupMembersPanelCrm";
|
|
27
|
+
import { buildCrmMemberMenu } from "./groupMemberMenuCrm";
|
|
21
28
|
const getMemberDisplayName = (member) => {
|
|
22
29
|
return member.nickname || member.userID || "";
|
|
23
30
|
};
|
|
@@ -35,7 +42,10 @@ const GroupMembersDrawer = ({ groupID, conversationId, currentSession, disabled
|
|
|
35
42
|
var _a, _b;
|
|
36
43
|
const { t } = useTranslation();
|
|
37
44
|
const onNavigate = useChatNavigate();
|
|
38
|
-
const
|
|
45
|
+
const { isOpen, open: openPanel, close: closePanel } = useSidePanel("members");
|
|
46
|
+
const triggerRef = useRef(null);
|
|
47
|
+
const isCrm = useAuthStore((state) => state.isCrm);
|
|
48
|
+
const host = useDeskPanelHostStore();
|
|
39
49
|
const [showLeaveConfirm, setShowLeaveConfirm] = useState(false);
|
|
40
50
|
const [showAddMember, setShowAddMember] = useState(false);
|
|
41
51
|
const [adminPermissionMember, setAdminPermissionMember] = useState(null);
|
|
@@ -122,17 +132,23 @@ const GroupMembersDrawer = ({ groupID, conversationId, currentSession, disabled
|
|
|
122
132
|
if (!groupID || disabled) {
|
|
123
133
|
return;
|
|
124
134
|
}
|
|
125
|
-
|
|
135
|
+
openPanel();
|
|
126
136
|
void refetch();
|
|
127
137
|
};
|
|
138
|
+
// Drawer renders in-place, so focus is handed back to the trigger explicitly.
|
|
128
139
|
const handleCloseDrawer = () => {
|
|
129
|
-
|
|
140
|
+
var _a;
|
|
141
|
+
closePanel();
|
|
142
|
+
(_a = triggerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
130
143
|
};
|
|
131
144
|
const isCurrentUserAssigneeOfActiveSession = useMemo(() => {
|
|
132
145
|
if (!currentSession || currentSession.isClosed)
|
|
133
146
|
return false;
|
|
134
147
|
return currentSession.supporterId === authUserID;
|
|
135
148
|
}, [currentSession, authUserID]);
|
|
149
|
+
const leaveBlockedReason = isCurrentUserAssigneeOfActiveSession
|
|
150
|
+
? t("leave_group_assignee_reason")
|
|
151
|
+
: undefined;
|
|
136
152
|
const handleLeaveGroup = () => {
|
|
137
153
|
if (isCurrentUserAssigneeOfActiveSession) {
|
|
138
154
|
message.error(t("leave_group_assignee_error"));
|
|
@@ -163,6 +179,13 @@ const GroupMembersDrawer = ({ groupID, conversationId, currentSession, disabled
|
|
|
163
179
|
message.error(((_b = (_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.message) || t("update_group_info_failed"));
|
|
164
180
|
}
|
|
165
181
|
};
|
|
182
|
+
const handleConfirmMuteMember = async () => {
|
|
183
|
+
if ((confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.type) !== "mute-member")
|
|
184
|
+
return;
|
|
185
|
+
const { member } = confirmMemberAction;
|
|
186
|
+
setConfirmMemberAction(null);
|
|
187
|
+
await handleToggleMemberSendMessage(member);
|
|
188
|
+
};
|
|
166
189
|
const handleConfirmRemoveMember = async () => {
|
|
167
190
|
var _a, _b;
|
|
168
191
|
if (!groupID || (confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.type) !== "remove")
|
|
@@ -246,7 +269,7 @@ const GroupMembersDrawer = ({ groupID, conversationId, currentSession, disabled
|
|
|
246
269
|
message.success(t("leave_group_success"));
|
|
247
270
|
onNavigate(window.location.pathname);
|
|
248
271
|
setShowLeaveConfirm(false);
|
|
249
|
-
|
|
272
|
+
closePanel();
|
|
250
273
|
}
|
|
251
274
|
catch (error) {
|
|
252
275
|
const errorMessage = ((_b = (_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.message) || t("leave_group_failed");
|
|
@@ -254,8 +277,27 @@ const GroupMembersDrawer = ({ groupID, conversationId, currentSession, disabled
|
|
|
254
277
|
}
|
|
255
278
|
};
|
|
256
279
|
useEffect(() => {
|
|
257
|
-
|
|
280
|
+
closePanel();
|
|
258
281
|
}, [groupID]);
|
|
282
|
+
const renderCrmPanel = (closeOnEscape) => (_jsx(GroupMembersPanelCrm, { totalCount: members.length, members: sortedMembers.map((member) => isRealGroup ? member : Object.assign(Object.assign({}, member), { roleLabel: "" })), isRealGroup: isRealGroup, isLoading: isLoading || (isSearchActive && isSearching), error: error, isSearchActive: isSearchActive, search: search, onSearchChange: setSearch, canAddMember: canAddMember, onAddMember: () => setShowAddMember(true), onClose: handleCloseDrawer, closeOnEscape: closeOnEscape, buildMenu: (member) => buildCrmMemberMenu({
|
|
283
|
+
member,
|
|
284
|
+
isRealGroup,
|
|
285
|
+
permissions,
|
|
286
|
+
actingIsOwner,
|
|
287
|
+
leaveBlockedReason,
|
|
288
|
+
t,
|
|
289
|
+
handlers: {
|
|
290
|
+
onToggleMute: (m) => void handleToggleMemberSendMessage(m),
|
|
291
|
+
onAskMute: (m) => setConfirmMemberAction({ type: "mute-member", member: m }),
|
|
292
|
+
onAskTransfer: (m) => setConfirmMemberAction({ type: "transfer-owner", member: m }),
|
|
293
|
+
onConfigureAdmin: setAdminPermissionMember,
|
|
294
|
+
onRemoveAdmin: (m) => void handleToggleAdminRole(m),
|
|
295
|
+
onAskAssignAdmin: (m) => setConfirmMemberAction({ type: "assign-admin", member: m }),
|
|
296
|
+
onAskRemove: (m) => setConfirmMemberAction({ type: "remove", member: m }),
|
|
297
|
+
onLeave: handleLeaveGroup,
|
|
298
|
+
},
|
|
299
|
+
}) }));
|
|
300
|
+
const renderCrmHost = () => (_jsx(DeskSidePanel, { open: isOpen, label: t("members"), onClose: handleCloseDrawer, children: renderCrmPanel }));
|
|
259
301
|
const renderContent = () => {
|
|
260
302
|
if (isLoading || (isSearchActive && isSearching)) {
|
|
261
303
|
return (_jsx("div", { className: "flex items-center justify-center h-full min-h-40", children: _jsx(Spin, {}) }));
|
|
@@ -302,7 +344,9 @@ const GroupMembersDrawer = ({ groupID, conversationId, currentSession, disabled
|
|
|
302
344
|
: t("mute_member"),
|
|
303
345
|
icon: _jsx(Icon, { icon: "bell-off-o", size: 16 }),
|
|
304
346
|
disabled: !permissions.removeMember,
|
|
305
|
-
onClick: () =>
|
|
347
|
+
onClick: () => member.isSendMessageDisabled
|
|
348
|
+
? void handleToggleMemberSendMessage(member)
|
|
349
|
+
: setConfirmMemberAction({ type: "mute-member", member }),
|
|
306
350
|
},
|
|
307
351
|
{
|
|
308
352
|
key: "transfer-owner",
|
|
@@ -357,24 +401,27 @@ const GroupMembersDrawer = ({ groupID, conversationId, currentSession, disabled
|
|
|
357
401
|
disabled: true,
|
|
358
402
|
},
|
|
359
403
|
];
|
|
360
|
-
return (_jsxs("div", { className: "flex items-center gap-3 px-4 py-2", children: [_jsx(Avatar, { src: member.faceURL, size: 40, className: "shrink-0", children: member.nickname.charAt(0) || "A" }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [_jsx("p", { className: "text-sm font-semibold text-gray-900 truncate", children: member.nickname }), member.isCurrentUser && (_jsx("span", { className: "text-xs text-blue-500 shrink-0", children: t("current_account") }))] }), member.roleLabel && (_jsx("p", { className: "text-sm text-gray-500 truncate", children: member.roleLabel }))] }), (isRealGroup || member.isCurrentUser) && (_jsx(Dropdown, { menu: { items: menuItems }, trigger: ["click"], placement: "bottomRight", children: _jsx("button", { type: "button", className: "flex items-center justify-center w-8 h-8 rounded-full text-gray-500 hover:bg-gray-100", onClick: (event) => event.stopPropagation(), children: _jsx(Icon, { icon: "more-horizontal-b", size: 18 }) }) }))] }, member.userID));
|
|
404
|
+
return (_jsxs("div", { className: "flex items-center gap-3 px-4 py-2", children: [_jsx(Avatar, { src: member.faceURL, size: 40, className: "shrink-0", children: member.nickname.charAt(0) || "A" }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [_jsx("p", { className: "text-sm font-semibold text-gray-900 truncate", children: member.nickname }), member.isCurrentUser && (_jsx("span", { className: "text-xs text-blue-500 shrink-0", children: t("current_account") }))] }), member.roleLabel && (_jsx("p", { className: "text-sm text-gray-500 truncate", children: member.roleLabel }))] }), (isRealGroup || member.isCurrentUser) && (_jsx(Dropdown, { menu: { items: menuItems }, trigger: ["click"], placement: "bottomRight", children: _jsx("button", { type: "button", "aria-label": t("member_actions"), title: t("member_actions"), className: "flex items-center justify-center w-8 h-8 rounded-full text-gray-500 hover:bg-gray-100", onClick: (event) => event.stopPropagation(), children: _jsx(Icon, { icon: "more-horizontal-b", size: 18 }) }) }))] }, member.userID));
|
|
361
405
|
}) }));
|
|
362
406
|
};
|
|
363
|
-
return (_jsxs("div", { className: "inline-flex shrink-0", "data-cp-name": "GroupMembersDrawer", children: [_jsx(Button, { type: "text", shape: "default", className:
|
|
407
|
+
return (_jsxs("div", { className: "inline-flex shrink-0", "data-cp-name": "GroupMembersDrawer", children: [_jsx(Button, { ref: triggerRef, type: "text", shape: "default", className: headerIconButtonClass(isCrm, isOpen), onClick: handleOpenDrawer, disabled: disabled || !groupID, "aria-label": t("members"), title: t("members"), children: _jsx(HeaderIcon, { isCrm: isCrm, stroke: "users", font: "user-two-check-o" }) }), isCrm && (host.workspace || host.slot) ? (renderCrmHost()) : (_jsx(Drawer, { open: isOpen, "aria-label": t("members"), onClose: handleCloseDrawer, mask: false, closeIcon: false, styles: {
|
|
364
408
|
body: {
|
|
365
409
|
padding: 0,
|
|
366
410
|
height: "100%",
|
|
367
411
|
},
|
|
368
|
-
}, getContainer: false,
|
|
412
|
+
}, getContainer: false, destroyOnHidden: true, width: 360, children: _jsxs("div", { className: "flex flex-col h-full bg-white", children: [_jsxs("div", { className: "flex items-center justify-between px-4 py-4 border-b border-gray-100", children: [_jsx("span", { className: "text-lg font-medium", children: t("members") }), _jsx(Button, { type: "text", shape: "default", className: "text-gray-500 w-8 h-8 p-0", onClick: handleCloseDrawer, "aria-label": t("close"), children: _jsx(Icon, { icon: "close-b", size: 22 }) })] }), _jsxs("div", { className: "flex items-center gap-2 px-4 py-3", children: [_jsx(Input, { value: search, onChange: (event) => setSearch(event.target.value), placeholder: t("search_member_placeholder"), prefix: _jsx(Icon, { icon: "search-o", size: 16, className: "text-gray-400" }), className: "h-10" }), canAddMember && (_jsx(Button, { type: "primary", shape: "default", className: "w-10 h-10 p-0 shrink-0 flex items-center justify-center rounded-lg", onClick: () => setShowAddMember(true), children: _jsx(Icon, { icon: "user-add-b", size: 18 }) }))] }), _jsx("div", { className: "flex-1 overflow-y-auto", children: renderContent() })] }) })), groupID && (_jsx(AddMemberModal, { open: showAddMember, groupID: groupID, onClose: () => setShowAddMember(false) })), groupID && (_jsx(AdminPermissionModal, { open: Boolean(adminPermissionMember), groupID: groupID, onClose: () => setAdminPermissionMember(null), member: adminPermissionMember
|
|
369
413
|
? {
|
|
370
414
|
userID: adminPermissionMember.userID,
|
|
415
|
+
nickname: adminPermissionMember.nickname,
|
|
371
416
|
permissions: adminPermissionMember.permissions,
|
|
372
417
|
}
|
|
373
|
-
: undefined, onMemberPermissionsSaved: patchMemberPermissions })), _jsx(ConfirmModal, { open: showLeaveConfirm, onOk: handleConfirmLeave, onCancel: () => setShowLeaveConfirm(false), title: t("leave_group_confirm_title"), okText: t("leave_group"), cancelText: t("cancel"), okType: "danger", confirmLoading: isLeaving, children: _jsx("p", { children: t("leave_group_confirm_message") }) }), _jsx(
|
|
418
|
+
: undefined, onMemberPermissionsSaved: patchMemberPermissions })), _jsx(ConfirmModal, { open: showLeaveConfirm, onOk: handleConfirmLeave, onCancel: () => setShowLeaveConfirm(false), title: t("leave_group_confirm_title"), okText: t("leave_group"), cancelText: t(isCrm ? "action_cancel" : "cancel"), okType: "danger", confirmLoading: isLeaving, children: _jsx("p", { children: t("leave_group_confirm_message") }) }), _jsx(DisableSendPermissionConfirm, { open: (confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.type) === "mute-member", title: t("disable_send_permission_title_member", {
|
|
419
|
+
name: confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.member.nickname,
|
|
420
|
+
}), onConfirm: handleConfirmMuteMember, onCancel: () => setConfirmMemberAction(null) }), _jsx(ConfirmModal, { open: (confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.type) === "remove", onOk: handleConfirmRemoveMember, onCancel: () => setConfirmMemberAction(null), title: t("remove_member_confirm_title"), okText: t("agree"), cancelText: t(isCrm ? "action_cancel" : "cancel"), okType: "danger", children: _jsx("p", { children: t("remove_member_confirm_message", {
|
|
374
421
|
name: confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.member.nickname,
|
|
375
|
-
}) }) }), _jsx(ConfirmModal, { open: (confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.type) === "transfer-owner", onOk: handleConfirmTransferOwner, onCancel: () => setConfirmMemberAction(null), title: t("transfer_owner_confirm_title"), okText: t("transfer_owner"), cancelText: t("cancel"), okType: "danger", children: _jsx("p", { children: t("transfer_owner_confirm_message", {
|
|
422
|
+
}) }) }), _jsx(ConfirmModal, { open: (confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.type) === "transfer-owner", onOk: handleConfirmTransferOwner, onCancel: () => setConfirmMemberAction(null), title: t("transfer_owner_confirm_title"), okText: t("transfer_owner"), cancelText: t(isCrm ? "action_cancel" : "cancel"), okType: "danger", children: _jsx("p", { children: t("transfer_owner_confirm_message", {
|
|
376
423
|
name: confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.member.nickname,
|
|
377
|
-
}) }) }), _jsx(ConfirmModal, { open: (confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.type) === "assign-admin", onOk: handleConfirmAssignAdmin, onCancel: () => setConfirmMemberAction(null), title: t("assign_admin_confirm_title"), okText: t("agree"), cancelText: t("cancel"), children: _jsx("p", { children: t("assign_admin_confirm_message", {
|
|
424
|
+
}) }) }), _jsx(ConfirmModal, { open: (confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.type) === "assign-admin", onOk: handleConfirmAssignAdmin, onCancel: () => setConfirmMemberAction(null), title: t("assign_admin_confirm_title"), okText: t("agree"), cancelText: t(isCrm ? "action_cancel" : "cancel"), children: _jsx("p", { children: t("assign_admin_confirm_message", {
|
|
378
425
|
name: confirmMemberAction === null || confirmMemberAction === void 0 ? void 0 : confirmMemberAction.member.nickname,
|
|
379
426
|
}) }) })] }));
|
|
380
427
|
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { MenuProps } from "antd";
|
|
2
|
+
import type { MemberDisplayItem } from "./groupMemberTypes";
|
|
3
|
+
interface GroupMembersPanelCrmProps {
|
|
4
|
+
totalCount: number;
|
|
5
|
+
members: MemberDisplayItem[];
|
|
6
|
+
/** Real groups split owners/admins from members; support threads show one list. */
|
|
7
|
+
isRealGroup: boolean;
|
|
8
|
+
isLoading: boolean;
|
|
9
|
+
error?: string;
|
|
10
|
+
isSearchActive: boolean;
|
|
11
|
+
search: string;
|
|
12
|
+
onSearchChange: (value: string) => void;
|
|
13
|
+
canAddMember: boolean;
|
|
14
|
+
onAddMember: () => void;
|
|
15
|
+
onClose: () => void;
|
|
16
|
+
/** Esc closes the panel when it is not inside an overlay drawer. */
|
|
17
|
+
closeOnEscape: boolean;
|
|
18
|
+
buildMenu: (member: MemberDisplayItem) => MenuProps["items"];
|
|
19
|
+
}
|
|
20
|
+
/** CRM members panel: search + add, owners/admins and members lists, per-member action menu. */
|
|
21
|
+
declare const GroupMembersPanelCrm: ({ totalCount, members, isRealGroup, isLoading, error, isSearchActive, search, onSearchChange, canAddMember, onAddMember, onClose, closeOnEscape, buildMenu, }: GroupMembersPanelCrmProps) => import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export default GroupMembersPanelCrm;
|
|
23
|
+
//# sourceMappingURL=GroupMembersPanelCrm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupMembersPanelCrm.d.ts","sourceRoot":"","sources":["../../../src/components/message/GroupMembersPanelCrm.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAMtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,UAAU,yBAAyB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,mFAAmF;IACnF,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,oEAAoE;IACpE,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC;CAC9D;AAQD,gGAAgG;AAChG,QAAA,MAAM,oBAAoB,GAAI,+JAc3B,yBAAyB,4CA0H3B,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useRef } from "react";
|
|
4
|
+
import { Button, Dropdown, Empty, Spin } from "antd";
|
|
5
|
+
import { useTranslation } from "react-i18next";
|
|
6
|
+
import { CrmIcon as Icon } from "../../components/group/crmIcon";
|
|
7
|
+
import GroupPanelHeader from "../../components/group/GroupPanelHeader";
|
|
8
|
+
import PersonAvatar from "../../components/group/PersonAvatar";
|
|
9
|
+
import { FOCUS_RING_CLASS } from "../../utils/a11yClickable";
|
|
10
|
+
const CHIP = "inline-flex h-[22px] shrink-0 items-center gap-1 whitespace-nowrap rounded-full px-2 text-xs font-medium";
|
|
11
|
+
const SectionTitle = ({ children }) => (_jsx("h3", { className: "m-0 px-2 pb-1 pt-3 text-xs font-medium text-gray-600", children: children }));
|
|
12
|
+
/** CRM members panel: search + add, owners/admins and members lists, per-member action menu. */
|
|
13
|
+
const GroupMembersPanelCrm = ({ totalCount, members, isRealGroup, isLoading, error, isSearchActive, search, onSearchChange, canAddMember, onAddMember, onClose, closeOnEscape, buildMenu, }) => {
|
|
14
|
+
const { t } = useTranslation();
|
|
15
|
+
const rootRef = useRef(null);
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
var _a;
|
|
18
|
+
if (closeOnEscape)
|
|
19
|
+
(_a = rootRef.current) === null || _a === void 0 ? void 0 : _a.focus();
|
|
20
|
+
}, [closeOnEscape]);
|
|
21
|
+
const handleKeyDown = (event) => {
|
|
22
|
+
if (closeOnEscape && event.key === "Escape" && !event.defaultPrevented) {
|
|
23
|
+
event.stopPropagation();
|
|
24
|
+
onClose();
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
const privileged = isRealGroup ? members.filter((m) => m.isOwner || m.isAdmin) : [];
|
|
28
|
+
const regular = isRealGroup ? members.filter((m) => !m.isOwner && !m.isAdmin) : members;
|
|
29
|
+
const renderRow = (member) => {
|
|
30
|
+
const items = isRealGroup || member.isCurrentUser ? buildMenu(member) : undefined;
|
|
31
|
+
const roleChip = !isRealGroup && member.isOwner
|
|
32
|
+
? null
|
|
33
|
+
: member.isOwner
|
|
34
|
+
? _jsx("span", { className: `${CHIP} bg-primary-25 text-primary-500`, children: t("group_owner_chip") })
|
|
35
|
+
: member.isAdmin
|
|
36
|
+
? _jsx("span", { className: `${CHIP} bg-gray-25 text-gray-900`, children: t("group_admin") })
|
|
37
|
+
: null;
|
|
38
|
+
return (_jsxs("li", { className: "flex items-center gap-2.5 rounded-lg p-2", children: [_jsx(PersonAvatar, { name: member.nickname, src: member.faceURL, size: 36 }), _jsxs("span", { className: "flex min-w-0 flex-1 items-baseline gap-1 text-sm font-medium text-gray-900", children: [_jsx("span", { className: "truncate", title: member.nickname, children: member.nickname }), member.isCurrentUser && (_jsxs("span", { className: "shrink-0 text-xs font-normal text-gray-600", children: ["(", t("you"), ")"] }))] }), roleChip, member.isSendMessageDisabled && !member.isOwner && (_jsxs("span", { className: `${CHIP} bg-warning-25 text-warning-800`, children: [_jsx(Icon, { icon: "bell-off-o", size: 12 }), t("send_disabled_chip")] })), items && items.length > 0 && (_jsx(Dropdown, { menu: { items, style: { width: 260 } }, trigger: ["click"], placement: "bottomRight", children: _jsx("button", { type: "button", "aria-label": t("member_actions_for", { name: member.nickname }), title: t("member_actions_for", { name: member.nickname }), className: `flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-gray-600 hover:bg-gray-5 aria-expanded:bg-gray-25 aria-expanded:text-gray-900 ${FOCUS_RING_CLASS}`, children: _jsx(Icon, { icon: "more-horizontal-b", size: 18 }) }) }))] }, member.userID));
|
|
39
|
+
};
|
|
40
|
+
const renderList = (list) => (_jsx("ul", { className: "m-0 flex list-none flex-col gap-0.5 p-0", children: list.map(renderRow) }));
|
|
41
|
+
const renderBody = () => {
|
|
42
|
+
if (isLoading) {
|
|
43
|
+
return _jsx("div", { className: "flex min-h-40 items-center justify-center", children: _jsx(Spin, {}) });
|
|
44
|
+
}
|
|
45
|
+
if (error) {
|
|
46
|
+
return _jsx("div", { className: "flex min-h-40 items-center justify-center px-6 text-center text-sm text-gray-600", children: t(error) });
|
|
47
|
+
}
|
|
48
|
+
if (!members.length) {
|
|
49
|
+
return _jsx(Empty, { description: isSearchActive ? t("no_member_found") : t("no_group_members") });
|
|
50
|
+
}
|
|
51
|
+
return (_jsxs(_Fragment, { children: [privileged.length > 0 && (_jsxs(_Fragment, { children: [_jsx(SectionTitle, { children: t("members_owner_admin_section") }), renderList(privileged)] })), regular.length > 0 && (_jsxs(_Fragment, { children: [_jsx(SectionTitle, { children: t("members_regular_section", { count: regular.length }) }), renderList(regular)] }))] }));
|
|
52
|
+
};
|
|
53
|
+
return (_jsxs("div", { ref: rootRef, tabIndex: -1, onKeyDown: handleKeyDown, "aria-label": t("members"), className: "flex h-full flex-col bg-white outline-none", "data-cp-name": "GroupMembersPanelCrm", children: [_jsx(GroupPanelHeader, { title: t("members_panel_title", { count: totalCount }), onClose: onClose }), _jsxs("div", { className: "flex gap-2 px-4 pb-1 pt-3", children: [_jsxs("label", { className: "flex h-9 min-w-0 flex-1 items-center gap-2 rounded-lg bg-gray-5 px-2.5 text-gray-600 focus-within:outline focus-within:outline-2 focus-within:outline-primary-200", children: [_jsx("span", { className: "sr-only", children: t("members_search_label") }), _jsx(Icon, { icon: "search-o", size: 16, className: "shrink-0" }), _jsx("input", { type: "search", value: search, onChange: (event) => onSearchChange(event.target.value), placeholder: t("members_search_label"), className: "min-w-0 flex-1 border-0 bg-transparent p-0 text-sm text-gray-900 outline-none placeholder:text-gray-600" })] }), canAddMember && (_jsx(Button, { type: "primary", className: "h-9 shrink-0 px-3", icon: _jsx(Icon, { icon: "user-add-o", size: 16 }), onClick: onAddMember, children: t("members_add") }))] }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto px-2 pb-2", children: renderBody() })] }));
|
|
54
|
+
};
|
|
55
|
+
export default GroupMembersPanelCrm;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageHeader.d.ts","sourceRoot":"","sources":["../../../src/components/message/MessageHeader.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"MessageHeader.d.ts","sourceRoot":"","sources":["../../../src/components/message/MessageHeader.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AASzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAgB/C,UAAU,kBAAkB;IAC1B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,IAAI,CAAC;CAC/B;AAED,KAAK,sBAAsB,GAAG,aAAa,GAAG,UAAU,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,sBAAsB,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,QAAA,MAAM,aAAa,GAAI,0DAKpB,kBAAkB,4CAuZpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -5,41 +5,46 @@ import { Icon } from "../../components/icon";
|
|
|
5
5
|
import { useConversationDisplayData } from "../../hooks/conversation/useConversation";
|
|
6
6
|
import useConversationStore from "../../store/conversation";
|
|
7
7
|
import MediaCollection from "../../components/media-collection";
|
|
8
|
-
import { useEffect, useMemo, useState } from "react";
|
|
8
|
+
import { Fragment, useEffect, useMemo, useState } from "react";
|
|
9
9
|
import { useTranslation } from "react-i18next";
|
|
10
10
|
import { SessionStatus, SessionTag } from "../../types/chat";
|
|
11
11
|
import SelectSession from "./SelectSession";
|
|
12
12
|
import { useUpdateSession } from "../../hooks/session/useUpdateSession";
|
|
13
|
+
import { useEndSession } from "../../hooks/session/useEndSession";
|
|
14
|
+
import { useFlushPendingCloseOnLeave, useIsSessionClosePending, } from "../../hooks/session/usePendingSessionClose";
|
|
15
|
+
import EndSessionConfirm from "../../components/thread/EndSessionConfirm";
|
|
13
16
|
import useAuthStore from "../../store/auth";
|
|
17
|
+
import { headerIconButtonClass, HeaderIcon } from "./headerIconButton";
|
|
18
|
+
import { useSidePanel } from "../../hooks/common/useSidePanel";
|
|
14
19
|
import SearchDrawer from "../../components/search-conversation/SearchDrawer";
|
|
15
20
|
import { isGroupSession, isGroupConversation } from "../../utils/imCommon";
|
|
16
21
|
import { useGroupPermission } from "../../hooks/group/useGroupPermission";
|
|
17
22
|
import GroupCompositeAvatar from "../../components/group/GroupCompositeAvatar";
|
|
18
23
|
import GroupMembersDrawer from "./GroupMembersDrawer";
|
|
19
24
|
import { useGroupMembers } from "../../hooks/group/useGroupMembers";
|
|
20
|
-
import {
|
|
25
|
+
import { useBotSessionOwnerIdentity } from "../../hooks/session/useBotSessionOwnerIdentity";
|
|
21
26
|
import { PeerType } from "../../types/conversation";
|
|
22
|
-
import {
|
|
27
|
+
import { shouldShowHeaderMemberCount } from "../../utils/headerMemberCount";
|
|
28
|
+
import TintedAvatar from "../../components/common/TintedAvatar";
|
|
29
|
+
import { splitDisplayName } from "../../components/conversation/rowDisplayName";
|
|
23
30
|
const MessageHeader = ({ onClose, currentSession, isJoined, onOpenThreadInfo, }) => {
|
|
24
|
-
var _a, _b, _c, _d
|
|
31
|
+
var _a, _b, _c, _d;
|
|
25
32
|
const { t } = useTranslation();
|
|
26
33
|
const isCx = useAuthStore((state) => state.isCx);
|
|
27
34
|
const isCrm = useAuthStore((state) => state.isCrm);
|
|
28
|
-
const
|
|
35
|
+
const { isOpen: isInfoOpenState } = useSidePanel("info");
|
|
36
|
+
const isInfoPanelOpen = isInfoOpenState;
|
|
37
|
+
const handleInfoToggle = () => onOpenThreadInfo === null || onOpenThreadInfo === void 0 ? void 0 : onOpenThreadInfo();
|
|
29
38
|
const conversationData = useConversationStore((state) => state.conversationData);
|
|
30
39
|
const groupID = conversationData === null || conversationData === void 0 ? void 0 : conversationData.groupID;
|
|
31
40
|
const currentGroupInfo = useConversationStore((state) => groupID ? state.currentGroupInfo.get(groupID) : undefined);
|
|
32
41
|
const { mutate: updateSession } = useUpdateSession();
|
|
33
42
|
const permissions = useGroupPermission(conversationData === null || conversationData === void 0 ? void 0 : conversationData.groupID);
|
|
34
43
|
const { avatar, displayName } = useConversationDisplayData(conversationData);
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
: "";
|
|
40
|
-
const { data: botSessionOwner } = useGetUserSideInfo((_a = conversationData === null || conversationData === void 0 ? void 0 : conversationData.conversationID) !== null && _a !== void 0 ? _a : "", botSessionOwnerId);
|
|
41
|
-
const ownerIdentity = resolveBotSessionOwnerIdentity(conversationData, botSessionOwner, selfUserID);
|
|
42
|
-
const headerName = (_b = ownerIdentity === null || ownerIdentity === void 0 ? void 0 : ownerIdentity.displayName) !== null && _b !== void 0 ? _b : displayName;
|
|
44
|
+
const { identity: ownerIdentity, owner: botSessionOwner, isLoading: isOwnerLoading, } = useBotSessionOwnerIdentity(conversationData);
|
|
45
|
+
// Avoids flashing the bot group's avatar and name before the customer arrives.
|
|
46
|
+
const showOwnerPlaceholder = isCrm && isOwnerLoading;
|
|
47
|
+
const headerName = (_a = ownerIdentity === null || ownerIdentity === void 0 ? void 0 : ownerIdentity.displayName) !== null && _a !== void 0 ? _a : displayName;
|
|
43
48
|
const shouldShowMemberCount = isGroupSession(conversationData === null || conversationData === void 0 ? void 0 : conversationData.conversationType);
|
|
44
49
|
// A "real" group (peerType GROUP) vs a CX support thread that happens to
|
|
45
50
|
// use a Group/WorkingGroup session under the hood (e.g. a multi-agent
|
|
@@ -51,17 +56,41 @@ const MessageHeader = ({ onClose, currentSession, isJoined, onOpenThreadInfo, })
|
|
|
51
56
|
// may view the member list, so it's bypassed there. The member list
|
|
52
57
|
// button itself still shows for both (shouldShowMemberCount).
|
|
53
58
|
const isRealGroup = isGroupConversation(conversationData !== null && conversationData !== void 0 ? conversationData : undefined);
|
|
59
|
+
// CRM shows a customer's name alone; the username sits in the sub-line. Group names stay whole.
|
|
60
|
+
const { name: headerShortName, username: headerUsername } = isRealGroup
|
|
61
|
+
? { name: headerName !== null && headerName !== void 0 ? headerName : "", username: undefined }
|
|
62
|
+
: splitDisplayName(headerName !== null && headerName !== void 0 ? headerName : "");
|
|
54
63
|
// Group info is only fetched for peerType GROUP; other threads count the
|
|
55
64
|
// same member list the drawer shows, so the two never disagree.
|
|
56
65
|
const usesGroupInfoCount = (conversationData === null || conversationData === void 0 ? void 0 : conversationData.peerType) === PeerType.GROUP;
|
|
57
|
-
const
|
|
66
|
+
const showMemberCountLine = shouldShowHeaderMemberCount({
|
|
67
|
+
isCrm,
|
|
68
|
+
isGroupSession: shouldShowMemberCount,
|
|
69
|
+
isRealGroup,
|
|
70
|
+
});
|
|
71
|
+
const { members: threadMembers } = useGroupMembers(showMemberCountLine && !usesGroupInfoCount ? groupID : undefined);
|
|
58
72
|
const memberCount = usesGroupInfoCount
|
|
59
|
-
? (
|
|
73
|
+
? (_b = currentGroupInfo === null || currentGroupInfo === void 0 ? void 0 : currentGroupInfo.memberCount) !== null && _b !== void 0 ? _b : 0
|
|
60
74
|
: threadMembers.length;
|
|
61
75
|
const canViewMemberList = shouldShowMemberCount &&
|
|
62
76
|
isJoined === true &&
|
|
63
77
|
isCrm &&
|
|
64
78
|
(!isRealGroup || permissions.viewMemberInformation);
|
|
79
|
+
// 1-1 and support threads show "username · Phiên N" instead of a head-count.
|
|
80
|
+
const metaParts = [];
|
|
81
|
+
if (!showMemberCountLine) {
|
|
82
|
+
const username = (botSessionOwner === null || botSessionOwner === void 0 ? void 0 : botSessionOwner.username) || headerUsername;
|
|
83
|
+
if (username) {
|
|
84
|
+
metaParts.push(_jsx("span", { className: "min-w-[48px] truncate", title: username, children: username }));
|
|
85
|
+
}
|
|
86
|
+
if (currentSession === null || currentSession === void 0 ? void 0 : currentSession.order) {
|
|
87
|
+
metaParts.push(_jsx("span", { className: "shrink-0 whitespace-nowrap", children: t("session_label", { order: currentSession.order }) }));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
const endSession = useEndSession();
|
|
91
|
+
const isEnding = useIsSessionClosePending(currentSession === null || currentSession === void 0 ? void 0 : currentSession.id);
|
|
92
|
+
const [isEndConfirmOpen, setIsEndConfirmOpen] = useState(false);
|
|
93
|
+
useFlushPendingCloseOnLeave(conversationData === null || conversationData === void 0 ? void 0 : conversationData.conversationID, isCrm);
|
|
65
94
|
const [currentSessionStatus, setCurrentSessionStatus] = useState(SessionStatus.UNASSIGNED);
|
|
66
95
|
const [currentSessionTag, setCurrentSessionTag] = useState(SessionTag.NONE);
|
|
67
96
|
const statusOptions = useMemo(() => {
|
|
@@ -70,65 +99,73 @@ const MessageHeader = ({ onClose, currentSession, isJoined, onOpenThreadInfo, })
|
|
|
70
99
|
label: t("unassigned"),
|
|
71
100
|
value: SessionStatus.UNASSIGNED,
|
|
72
101
|
tintColorClassname: "!text-amber-500",
|
|
73
|
-
tintColorClassnameBg: "!bg-amber-500",
|
|
102
|
+
tintColorClassnameBg: isCrm ? "!bg-warning-400" : "!bg-amber-500",
|
|
74
103
|
bgTintColorClassname: "!bg-amber-100",
|
|
75
104
|
},
|
|
76
105
|
{
|
|
77
106
|
label: t("waiting_process"),
|
|
78
107
|
value: SessionStatus.WAITING_PROCESS,
|
|
79
108
|
tintColorClassname: "!text-orange-500",
|
|
80
|
-
tintColorClassnameBg: "!bg-orange-500",
|
|
109
|
+
tintColorClassnameBg: isCrm ? "!bg-warning-400" : "!bg-orange-500",
|
|
81
110
|
bgTintColorClassname: "!bg-orange-100",
|
|
82
111
|
},
|
|
83
112
|
{
|
|
84
113
|
label: t("in_process"),
|
|
85
114
|
value: SessionStatus.IN_PROCESS,
|
|
86
115
|
tintColorClassname: "!text-blue-500",
|
|
87
|
-
tintColorClassnameBg: "!bg-blue-500",
|
|
116
|
+
tintColorClassnameBg: isCrm ? "!bg-primary-400" : "!bg-blue-500",
|
|
88
117
|
bgTintColorClassname: "!bg-blue-100",
|
|
89
118
|
},
|
|
90
119
|
{
|
|
91
120
|
label: t("completed"),
|
|
92
121
|
value: SessionStatus.COMPLETED,
|
|
93
122
|
tintColorClassname: "!text-green-500",
|
|
94
|
-
tintColorClassnameBg: "!bg-green-500",
|
|
123
|
+
tintColorClassnameBg: isCrm ? "!bg-success-400" : "!bg-green-500",
|
|
95
124
|
bgTintColorClassname: "!bg-green-100",
|
|
96
125
|
},
|
|
97
126
|
];
|
|
98
|
-
}, [t]);
|
|
127
|
+
}, [t, isCrm]);
|
|
99
128
|
const tagOptions = useMemo(() => {
|
|
100
129
|
return [
|
|
101
130
|
{
|
|
102
|
-
label: t("select_tag"),
|
|
131
|
+
label: t(isCrm ? "reply_status_placeholder" : "select_tag"),
|
|
103
132
|
value: SessionTag.NONE,
|
|
104
133
|
tintColorClassname: "!text-gray-500",
|
|
105
|
-
tintColorClassnameBg: "!bg-gray-500",
|
|
134
|
+
tintColorClassnameBg: isCrm ? "!bg-gray-400" : "!bg-gray-500",
|
|
106
135
|
bgTintColorClassname: "!bg-gray-100",
|
|
107
136
|
},
|
|
108
137
|
{
|
|
109
138
|
label: t("awaiting_reply"),
|
|
110
139
|
value: SessionTag.AWAITING_REPLY,
|
|
111
140
|
tintColorClassname: "!text-purple-500",
|
|
112
|
-
tintColorClassnameBg: "!bg-purple-500",
|
|
141
|
+
tintColorClassnameBg: isCrm ? "!bg-secondary-400" : "!bg-purple-500",
|
|
113
142
|
bgTintColorClassname: "!bg-purple-100",
|
|
114
143
|
},
|
|
115
144
|
{
|
|
116
145
|
label: t("slow_processing"),
|
|
117
146
|
value: SessionTag.SLOW_PROCESSING,
|
|
118
147
|
tintColorClassname: "!text-red-500",
|
|
119
|
-
tintColorClassnameBg: "!bg-red-500",
|
|
148
|
+
tintColorClassnameBg: isCrm ? "!bg-danger-600" : "!bg-red-500",
|
|
120
149
|
bgTintColorClassname: "!bg-red-100",
|
|
121
150
|
},
|
|
122
151
|
{
|
|
123
152
|
label: t("temporarily_paused"),
|
|
124
153
|
value: SessionTag.TEMPORARILY_PAUSED,
|
|
125
154
|
tintColorClassname: "!text-gray-500",
|
|
126
|
-
tintColorClassnameBg: "!bg-gray-500",
|
|
155
|
+
tintColorClassnameBg: isCrm ? "!bg-gray-400" : "!bg-gray-500",
|
|
127
156
|
bgTintColorClassname: "!bg-gray-100",
|
|
128
157
|
},
|
|
129
158
|
];
|
|
130
|
-
}, [t]);
|
|
159
|
+
}, [t, isCrm]);
|
|
131
160
|
const handleUpdateSession = (value, type, isSameValue) => {
|
|
161
|
+
// CRM: completing an in-process session is an end-session action with undo.
|
|
162
|
+
if (isCrm &&
|
|
163
|
+
type === "status" &&
|
|
164
|
+
value === SessionStatus.COMPLETED &&
|
|
165
|
+
(currentSession === null || currentSession === void 0 ? void 0 : currentSession.status) === SessionStatus.IN_PROCESS) {
|
|
166
|
+
setIsEndConfirmOpen(true);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
132
169
|
let newValue = value;
|
|
133
170
|
if (type === "tag" &&
|
|
134
171
|
value === SessionTag.TEMPORARILY_PAUSED &&
|
|
@@ -165,6 +202,18 @@ const MessageHeader = ({ onClose, currentSession, isJoined, onOpenThreadInfo, })
|
|
|
165
202
|
setCurrentSessionStatus(currentSession.status);
|
|
166
203
|
}
|
|
167
204
|
}, [currentSession]);
|
|
168
|
-
return (_jsxs("div", { className:
|
|
205
|
+
return (_jsxs("div", { className: `px-4 py-3 flex items-center border-b gap-3 bg-white ${isCrm
|
|
206
|
+
? "flex-nowrap border-gray-25 [container-type:inline-size]"
|
|
207
|
+
: "flex-wrap"}`, "data-cp-name": "MessageHeader", children: [showOwnerPlaceholder ? (_jsx("span", { "aria-hidden": true, className: "h-10 w-10 shrink-0 animate-pulse rounded-full bg-gray-25" })) : ownerIdentity ? (isCrm ? (_jsx(TintedAvatar, { name: headerShortName, src: ownerIdentity.avatarUrl, size: 40 })) : (_jsx(Avatar, { src: ownerIdentity.avatarUrl, size: "large", alt: "", className: "min-w-10 min-h-10", children: ((_c = headerName === null || headerName === void 0 ? void 0 : headerName.charAt) === null || _c === void 0 ? void 0 : _c.call(headerName, 0)) || "A" }))) : shouldShowMemberCount ? (_jsx(GroupCompositeAvatar, { groupID: conversationData === null || conversationData === void 0 ? void 0 : conversationData.groupID, faceURL: avatar, ownerUserID: currentGroupInfo === null || currentGroupInfo === void 0 ? void 0 : currentGroupInfo.ownerUserID, groupName: displayName, size: 40, className: "min-w-10 min-h-10" })) : isCrm ? (_jsx(TintedAvatar, { name: headerShortName, src: avatar, size: 40 })) : (_jsx(Avatar, { src: avatar, size: "large", alt: "", className: "min-w-10 min-h-10", children: ((_d = displayName === null || displayName === void 0 ? void 0 : displayName.charAt) === null || _d === void 0 ? void 0 : _d.call(displayName, 0)) || "A" })), _jsxs("div", { className: `flex flex-col overflow-hidden flex-1 ${isCrm ? "min-w-[96px]" : ""}`, children: [showOwnerPlaceholder ? (_jsxs("span", { "aria-hidden": true, className: "flex flex-col gap-1.5 py-0.5", children: [_jsx("span", { className: "h-4 w-36 animate-pulse rounded bg-gray-25" }), _jsx("span", { className: "h-3 w-24 animate-pulse rounded bg-gray-25" })] })) : (_jsx("p", { className: `text-base truncate ${isCrm ? "m-0 font-semibold leading-[normal] text-gray-900" : ""}`, title: headerName || undefined, children: (isCrm ? headerShortName : headerName) || "" })), showMemberCountLine && (_jsx("p", { className: "text-xs text-gray-500 truncate", children: t("member_count", { count: memberCount }) })), isCrm && !showOwnerPlaceholder && metaParts.length > 0 && (_jsx("p", { className: "m-0 flex min-w-0 items-center gap-1 overflow-hidden whitespace-nowrap text-xs text-gray-600 [container-type:inline-size]", "data-testid": "header-meta-line", children: metaParts.map((part, index) => (_jsxs(Fragment, { children: [index > 0 && (_jsx("span", { "aria-hidden": true, className: "h-[3px] w-[3px] shrink-0 rounded-full bg-gray-200" })), part] }, index))) }))] }), _jsxs("div", { className: `flex items-center justify-end ${isCrm
|
|
208
|
+
? "shrink-0 gap-3 [@container(max-width:699px)]:gap-2"
|
|
209
|
+
: "gap-2 overflow-hidden"}`, children: [_jsxs("div", { className: isCrm ? "flex items-center gap-2" : "contents", children: [isCx && !isRealGroup && (_jsx(SelectSession, { placeholder: t(isCrm ? "reply_status_placeholder" : "select_tag"), options: tagOptions, value: currentSessionTag, onChange: (value) => handleUpdateSession(value, "tag", value === currentSessionTag), excludeOptions: [SessionTag.SLOW_PROCESSING, SessionTag.NONE] })), isCx && !isRealGroup && (_jsx(SelectSession, { placeholder: t("select_status"), options: statusOptions, value: isEnding ? SessionStatus.COMPLETED : currentSessionStatus, disabled: isEnding, onChange: (value) => handleUpdateSession(value, "status", value === currentSessionStatus) }))] }), _jsxs("div", { className: isCrm
|
|
210
|
+
? "flex items-center gap-1 [@container(max-width:699px)]:gap-0.5"
|
|
211
|
+
: "contents", children: [_jsx(SearchDrawer, {}), canViewMemberList && (_jsx(GroupMembersDrawer, { groupID: conversationData === null || conversationData === void 0 ? void 0 : conversationData.groupID, conversationId: conversationData === null || conversationData === void 0 ? void 0 : conversationData.conversationID, currentSession: currentSession })), _jsx(MediaCollection, {}), _jsx(Button, { type: "text", shape: "default", className: headerIconButtonClass(isCrm, isInfoPanelOpen), onClick: handleInfoToggle, "aria-label": t("thread_info_open"), title: t("thread_info_open"), children: _jsx(HeaderIcon, { isCrm: isCrm, stroke: "panel-right", font: "align-justify-o" }) }), !!onClose && (_jsx(Button, { type: "text", shape: "default", className: "text-[var(--dc-color-header-icon)] w-8 h-8 p-0", onClick: onClose, "aria-label": t("close"), children: _jsx(Icon, { icon: "close-b", size: 22 }) }))] })] }), isCrm && currentSession && (_jsx(EndSessionConfirm, { open: isEndConfirmOpen, session: currentSession, customerName: headerName || "", onConfirm: () => {
|
|
212
|
+
setIsEndConfirmOpen(false);
|
|
213
|
+
endSession({
|
|
214
|
+
sessionId: currentSession.id,
|
|
215
|
+
conversationId: currentSession.conversationId,
|
|
216
|
+
});
|
|
217
|
+
}, onCancel: () => setIsEndConfirmOpen(false) }))] }));
|
|
169
218
|
};
|
|
170
219
|
export default MessageHeader;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ReactNode, Ref } from "react";
|
|
1
|
+
import { HTMLAttributes, ReactNode, Ref } from "react";
|
|
2
2
|
import type { MessageListLoadState } from "../../hooks/message/useMessageListScroll";
|
|
3
3
|
export interface MessageInfiniteScrollProps {
|
|
4
4
|
scrollRef: Ref<HTMLDivElement>;
|
|
@@ -10,7 +10,9 @@ export interface MessageInfiniteScrollProps {
|
|
|
10
10
|
children: ReactNode;
|
|
11
11
|
empty?: ReactNode;
|
|
12
12
|
containerClassName?: string;
|
|
13
|
+
/** Extra attributes for the scroll container (CRM keyboard access). */
|
|
14
|
+
containerProps?: HTMLAttributes<HTMLDivElement>;
|
|
13
15
|
}
|
|
14
|
-
declare const MessageInfiniteScroll: ({ scrollRef, scrollableTargetId, loadState, moreOldLoading, onLoadMoreOld, onScroll, children, empty, containerClassName, }: MessageInfiniteScrollProps) => import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
declare const MessageInfiniteScroll: ({ scrollRef, scrollableTargetId, loadState, moreOldLoading, onLoadMoreOld, onScroll, children, empty, containerClassName, containerProps, }: MessageInfiniteScrollProps) => import("react/jsx-runtime").JSX.Element;
|
|
15
17
|
export default MessageInfiniteScroll;
|
|
16
18
|
//# sourceMappingURL=MessageInfiniteScroll.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageInfiniteScroll.d.ts","sourceRoot":"","sources":["../../../src/components/message/MessageInfiniteScroll.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"MessageInfiniteScroll.d.ts","sourceRoot":"","sources":["../../../src/components/message/MessageInfiniteScroll.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAIvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAEjF,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,GAAG,CAAC,cAAc,CAAC,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,oBAAoB,CAAC;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IACrD,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,uEAAuE;IACvE,cAAc,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;CACjD;AAED,QAAA,MAAM,qBAAqB,GAAI,6IAW5B,0BAA0B,4CAsC5B,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
|
|
@@ -3,5 +3,5 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
3
3
|
import { Spin } from "antd";
|
|
4
4
|
import clsx from "clsx";
|
|
5
5
|
import InfiniteScroll from "react-infinite-scroll-component";
|
|
6
|
-
const MessageInfiniteScroll = ({ scrollRef, scrollableTargetId, loadState, moreOldLoading = false, onLoadMoreOld, onScroll, children, empty, containerClassName, }) => (_jsx("div", { id: scrollableTargetId, ref: scrollRef, className: clsx("flex h-full flex-col-reverse overflow-x-hidden overflow-y-auto pb-3", containerClassName), "data-cp-name": "MessageInfiniteScroll", children: empty && loadState.messageList.length === 0 ? (empty) : (_jsx(InfiniteScroll, { dataLength: loadState.messageList.length, next: onLoadMoreOld, className: "flex w-full min-w-0 flex-col-reverse", inverse: true, hasMore: loadState.hasMoreOld, loader: moreOldLoading ? (_jsx("div", { className: "flex w-full items-center justify-center py-2", children: _jsx(Spin, { size: "small" }) })) : (_jsx("span", { className: "sr-only" })), scrollableTarget: scrollableTargetId, onScroll: (e) => onScroll(e), children: children })) }));
|
|
6
|
+
const MessageInfiniteScroll = ({ scrollRef, scrollableTargetId, loadState, moreOldLoading = false, onLoadMoreOld, onScroll, children, empty, containerClassName, containerProps, }) => (_jsx("div", Object.assign({ id: scrollableTargetId, ref: scrollRef, className: clsx("flex h-full flex-col-reverse overflow-x-hidden overflow-y-auto pb-3", containerClassName), "data-cp-name": "MessageInfiniteScroll" }, containerProps, { children: empty && loadState.messageList.length === 0 ? (empty) : (_jsx(InfiniteScroll, { dataLength: loadState.messageList.length, next: onLoadMoreOld, className: "flex w-full min-w-0 flex-col-reverse", inverse: true, hasMore: loadState.hasMoreOld, loader: moreOldLoading ? (_jsx("div", { className: "flex w-full items-center justify-center py-2", children: _jsx(Spin, { size: "small" }) })) : (_jsx("span", { className: "sr-only" })), scrollableTarget: scrollableTargetId, onScroll: (e) => onScroll(e), children: children })) })));
|
|
7
7
|
export default MessageInfiniteScroll;
|