@droppii-org/chat-sdk 0.6.55 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/canned-response/CannedResponseBody.d.ts.map +1 -1
- package/dist/components/canned-response/CannedResponseBody.js +4 -3
- package/dist/components/canned-response/CannedResponsePanel.d.ts +9 -0
- package/dist/components/canned-response/CannedResponsePanel.d.ts.map +1 -0
- package/dist/components/canned-response/CannedResponsePanel.js +72 -0
- package/dist/components/canned-response/CannedResponseRow.d.ts +10 -0
- package/dist/components/canned-response/CannedResponseRow.d.ts.map +1 -0
- package/dist/components/canned-response/CannedResponseRow.js +6 -0
- package/dist/components/canned-response/CannedScopeChips.d.ts +10 -0
- package/dist/components/canned-response/CannedScopeChips.d.ts.map +1 -0
- package/dist/components/canned-response/CannedScopeChips.js +34 -0
- package/dist/components/canned-response/cannedScopes.d.ts +16 -0
- package/dist/components/canned-response/cannedScopes.d.ts.map +1 -0
- package/dist/components/canned-response/cannedScopes.js +39 -0
- package/dist/components/canned-response/index.d.ts.map +1 -1
- package/dist/components/canned-response/index.js +11 -10
- package/dist/components/canned-response/insertCannedContent.d.ts +7 -0
- package/dist/components/canned-response/insertCannedContent.d.ts.map +1 -0
- package/dist/components/canned-response/insertCannedContent.js +39 -0
- package/dist/components/canned-response/team/TeamItem.d.ts.map +1 -1
- package/dist/components/canned-response/team/TeamItem.js +5 -4
- package/dist/components/common/ConfirmModal.d.ts +13 -1
- package/dist/components/common/ConfirmModal.d.ts.map +1 -1
- package/dist/components/common/ConfirmModal.js +24 -6
- package/dist/components/common/DeskPanelDrawer.d.ts +17 -0
- package/dist/components/common/DeskPanelDrawer.d.ts.map +1 -0
- package/dist/components/common/DeskPanelDrawer.js +21 -0
- package/dist/components/common/DeskSidePanel.d.ts +17 -0
- package/dist/components/common/DeskSidePanel.d.ts.map +1 -0
- package/dist/components/common/DeskSidePanel.js +23 -0
- package/dist/components/common/TintedAvatar.d.ts +11 -0
- package/dist/components/common/TintedAvatar.d.ts.map +1 -0
- package/dist/components/common/TintedAvatar.js +17 -0
- package/dist/components/compose/ComposeNewMessageModal.d.ts.map +1 -1
- package/dist/components/compose/ComposeNewMessageModal.js +11 -1
- package/dist/components/conversation/ConversationByGroupItem.d.ts.map +1 -1
- package/dist/components/conversation/ConversationByGroupItem.js +10 -6
- package/dist/components/conversation/ConversationBySessionItem.d.ts +4 -1
- package/dist/components/conversation/ConversationBySessionItem.d.ts.map +1 -1
- package/dist/components/conversation/ConversationBySessionItem.js +36 -10
- package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
- package/dist/components/conversation/DeskConversationList.js +44 -29
- package/dist/components/conversation/DeskConversationRow.d.ts +19 -0
- package/dist/components/conversation/DeskConversationRow.d.ts.map +1 -0
- package/dist/components/conversation/DeskConversationRow.js +18 -0
- package/dist/components/conversation/DeskListEmptyState.d.ts +6 -0
- package/dist/components/conversation/DeskListEmptyState.d.ts.map +1 -0
- package/dist/components/conversation/DeskListEmptyState.js +11 -0
- package/dist/components/conversation/DeskListHeader.d.ts +14 -0
- package/dist/components/conversation/DeskListHeader.d.ts.map +1 -0
- package/dist/components/conversation/DeskListHeader.js +39 -0
- package/dist/components/conversation/DeskListSkeleton.d.ts +6 -0
- package/dist/components/conversation/DeskListSkeleton.d.ts.map +1 -0
- package/dist/components/conversation/DeskListSkeleton.js +9 -0
- package/dist/components/conversation/DeskRowAvatar.d.ts +8 -0
- package/dist/components/conversation/DeskRowAvatar.d.ts.map +1 -0
- package/dist/components/conversation/DeskRowAvatar.js +6 -0
- package/dist/components/conversation/RowChip.d.ts +14 -0
- package/dist/components/conversation/RowChip.d.ts.map +1 -0
- package/dist/components/conversation/RowChip.js +11 -0
- package/dist/components/conversation/avatarTint.d.ts +6 -0
- package/dist/components/conversation/avatarTint.d.ts.map +1 -0
- package/dist/components/conversation/avatarTint.js +27 -0
- package/dist/components/conversation/folderEmptyState.d.ts +2 -0
- package/dist/components/conversation/folderEmptyState.d.ts.map +1 -0
- package/dist/components/conversation/folderEmptyState.js +14 -0
- package/dist/components/conversation/internalNotePreview.d.ts +6 -0
- package/dist/components/conversation/internalNotePreview.d.ts.map +1 -0
- package/dist/components/conversation/internalNotePreview.js +11 -0
- package/dist/components/conversation/listHeading.d.ts +19 -0
- package/dist/components/conversation/listHeading.d.ts.map +1 -0
- package/dist/components/conversation/listHeading.js +24 -0
- package/dist/components/conversation/rowDisplayName.d.ts +7 -0
- package/dist/components/conversation/rowDisplayName.d.ts.map +1 -0
- package/dist/components/conversation/rowDisplayName.js +8 -0
- package/dist/components/conversation/rowTime.d.ts +4 -0
- package/dist/components/conversation/rowTime.d.ts.map +1 -0
- package/dist/components/conversation/rowTime.js +10 -0
- package/dist/components/conversation-detail/PinLimitModal.d.ts.map +1 -1
- package/dist/components/conversation-detail/PinLimitModal.js +3 -1
- package/dist/components/group/AddMemberModal.d.ts.map +1 -1
- package/dist/components/group/AddMemberModal.js +15 -4
- package/dist/components/group/AdminPermissionModal.d.ts +1 -0
- package/dist/components/group/AdminPermissionModal.d.ts.map +1 -1
- package/dist/components/group/AdminPermissionModal.js +38 -3
- package/dist/components/group/CreateGroupForm.d.ts +3 -1
- package/dist/components/group/CreateGroupForm.d.ts.map +1 -1
- package/dist/components/group/CreateGroupForm.js +7 -1
- package/dist/components/group/CreateGroupFormCrmView.d.ts +23 -0
- package/dist/components/group/CreateGroupFormCrmView.d.ts.map +1 -0
- package/dist/components/group/CreateGroupFormCrmView.js +25 -0
- package/dist/components/group/DisableSendPermissionConfirm.d.ts +11 -0
- package/dist/components/group/DisableSendPermissionConfirm.d.ts.map +1 -0
- package/dist/components/group/DisableSendPermissionConfirm.js +10 -0
- package/dist/components/group/GroupCompositeAvatar.d.ts.map +1 -1
- package/dist/components/group/GroupCompositeAvatar.js +39 -4
- package/dist/components/group/GroupMemberPicker.d.ts +5 -2
- package/dist/components/group/GroupMemberPicker.d.ts.map +1 -1
- package/dist/components/group/GroupMemberPicker.js +8 -42
- package/dist/components/group/GroupMemberPickerCrm.d.ts +4 -0
- package/dist/components/group/GroupMemberPickerCrm.d.ts.map +1 -0
- package/dist/components/group/GroupMemberPickerCrm.js +48 -0
- package/dist/components/group/GroupMemberPickerLegacy.d.ts +8 -0
- package/dist/components/group/GroupMemberPickerLegacy.d.ts.map +1 -0
- package/dist/components/group/GroupMemberPickerLegacy.js +46 -0
- package/dist/components/group/GroupPanelHeader.d.ts +10 -0
- package/dist/components/group/GroupPanelHeader.d.ts.map +1 -0
- package/dist/components/group/GroupPanelHeader.js +11 -0
- package/dist/components/group/MemberPermissionPanel.d.ts.map +1 -1
- package/dist/components/group/MemberPermissionPanel.js +31 -2
- package/dist/components/group/PermissionPanelCrm.d.ts +24 -0
- package/dist/components/group/PermissionPanelCrm.d.ts.map +1 -0
- package/dist/components/group/PermissionPanelCrm.js +16 -0
- package/dist/components/group/PersonAvatar.d.ts +11 -0
- package/dist/components/group/PersonAvatar.d.ts.map +1 -0
- package/dist/components/group/PersonAvatar.js +21 -0
- package/dist/components/group/crmIcon.d.ts +9 -0
- package/dist/components/group/crmIcon.d.ts.map +1 -0
- package/dist/components/group/crmIcon.js +38 -0
- package/dist/components/icon/AdaptiveIcon.d.ts +15 -0
- package/dist/components/icon/AdaptiveIcon.d.ts.map +1 -0
- package/dist/components/icon/AdaptiveIcon.js +10 -0
- package/dist/components/icon/StrokeIcon.d.ts +14 -0
- package/dist/components/icon/StrokeIcon.d.ts.map +1 -0
- package/dist/components/icon/StrokeIcon.js +5 -0
- package/dist/components/icon/strokeIconNodes.d.ts +431 -0
- package/dist/components/icon/strokeIconNodes.d.ts.map +1 -0
- package/dist/components/icon/strokeIconNodes.js +269 -0
- package/dist/components/media-collection/index.d.ts.map +1 -1
- package/dist/components/media-collection/index.js +21 -5
- package/dist/components/message/GroupMembersDrawer.d.ts.map +1 -1
- package/dist/components/message/GroupMembersDrawer.js +60 -13
- package/dist/components/message/GroupMembersPanelCrm.d.ts +23 -0
- package/dist/components/message/GroupMembersPanelCrm.d.ts.map +1 -0
- package/dist/components/message/GroupMembersPanelCrm.js +55 -0
- package/dist/components/message/MessageHeader.d.ts.map +1 -1
- package/dist/components/message/MessageHeader.js +76 -27
- package/dist/components/message/MessageInfiniteScroll.d.ts +4 -2
- package/dist/components/message/MessageInfiniteScroll.d.ts.map +1 -1
- package/dist/components/message/MessageInfiniteScroll.js +1 -1
- package/dist/components/message/MessageList.d.ts +2 -1
- package/dist/components/message/MessageList.d.ts.map +1 -1
- package/dist/components/message/MessageList.js +12 -1
- package/dist/components/message/SelectSession.d.ts +4 -1
- package/dist/components/message/SelectSession.d.ts.map +1 -1
- package/dist/components/message/SelectSession.js +13 -4
- package/dist/components/message/UnassignedSessionFooter.js +2 -2
- package/dist/components/message/footer/ActionBar.d.ts +5 -1
- package/dist/components/message/footer/ActionBar.d.ts.map +1 -1
- package/dist/components/message/footer/ActionBar.js +14 -1
- package/dist/components/message/footer/CannedResponsePlugin.d.ts.map +1 -1
- package/dist/components/message/footer/CannedResponsePlugin.js +18 -3
- package/dist/components/message/footer/ClosedSessionBanner.d.ts +9 -0
- package/dist/components/message/footer/ClosedSessionBanner.d.ts.map +1 -0
- package/dist/components/message/footer/ClosedSessionBanner.js +13 -0
- package/dist/components/message/footer/ComposerEditor.d.ts.map +1 -1
- package/dist/components/message/footer/ComposerEditor.js +9 -4
- package/dist/components/message/footer/ComposerTabs.d.ts +1 -2
- package/dist/components/message/footer/ComposerTabs.d.ts.map +1 -1
- package/dist/components/message/footer/ComposerTabs.js +14 -35
- package/dist/components/message/footer/CrmComposerCard.d.ts +11 -0
- package/dist/components/message/footer/CrmComposerCard.d.ts.map +1 -0
- package/dist/components/message/footer/CrmComposerCard.js +30 -0
- package/dist/components/message/footer/EnterHandler.d.ts.map +1 -1
- package/dist/components/message/footer/EnterHandler.js +3 -0
- package/dist/components/message/footer/FilePreview.js +2 -2
- package/dist/components/message/footer/LinkInputPreview.js +2 -2
- package/dist/components/message/footer/MediaActions.d.ts +2 -1
- package/dist/components/message/footer/MediaActions.d.ts.map +1 -1
- package/dist/components/message/footer/MediaActions.js +21 -4
- package/dist/components/message/footer/SessionClosedModal.d.ts +3 -1
- package/dist/components/message/footer/SessionClosedModal.d.ts.map +1 -1
- package/dist/components/message/footer/SessionClosedModal.js +6 -2
- package/dist/components/message/footer/ToolbarPlugin.d.ts +3 -1
- package/dist/components/message/footer/ToolbarPlugin.d.ts.map +1 -1
- package/dist/components/message/footer/ToolbarPlugin.js +2 -2
- package/dist/components/message/footer/clearComposerHistory.d.ts +3 -0
- package/dist/components/message/footer/clearComposerHistory.d.ts.map +1 -0
- package/dist/components/message/footer/clearComposerHistory.js +11 -0
- package/dist/components/message/footer/index.d.ts +2 -2
- package/dist/components/message/footer/index.d.ts.map +1 -1
- package/dist/components/message/footer/index.js +15 -5
- package/dist/components/message/footer/mention/MentionMenu.d.ts.map +1 -1
- package/dist/components/message/footer/mention/MentionMenu.js +4 -1
- package/dist/components/message/footer/useComposerFocusRequest.d.ts +10 -0
- package/dist/components/message/footer/useComposerFocusRequest.d.ts.map +1 -0
- package/dist/components/message/footer/useComposerFocusRequest.js +28 -0
- package/dist/components/message/groupMemberMenuCrm.d.ts +32 -0
- package/dist/components/message/groupMemberMenuCrm.d.ts.map +1 -0
- package/dist/components/message/groupMemberMenuCrm.js +83 -0
- package/dist/components/message/groupMemberTypes.d.ts +13 -0
- package/dist/components/message/groupMemberTypes.d.ts.map +1 -0
- package/dist/components/message/groupMemberTypes.js +1 -0
- package/dist/components/message/headerIconButton.d.ts +10 -0
- package/dist/components/message/headerIconButton.d.ts.map +1 -0
- package/dist/components/message/headerIconButton.js +9 -0
- package/dist/components/message/item/CrmSystemLine.d.ts +10 -0
- package/dist/components/message/item/CrmSystemLine.d.ts.map +1 -0
- package/dist/components/message/item/CrmSystemLine.js +6 -0
- package/dist/components/message/item/DateDivider.d.ts +5 -0
- package/dist/components/message/item/DateDivider.d.ts.map +1 -0
- package/dist/components/message/item/DateDivider.js +5 -0
- package/dist/components/message/item/GroupNotificationMessage.d.ts.map +1 -1
- package/dist/components/message/item/GroupNotificationMessage.js +9 -0
- package/dist/components/message/item/MemberEventSummary.d.ts +8 -0
- package/dist/components/message/item/MemberEventSummary.d.ts.map +1 -0
- package/dist/components/message/item/MemberEventSummary.js +18 -0
- package/dist/components/message/item/MessageBubble.d.ts +3 -1
- package/dist/components/message/item/MessageBubble.d.ts.map +1 -1
- package/dist/components/message/item/MessageBubble.js +27 -13
- package/dist/components/message/item/MessageMoreButton.d.ts +13 -0
- package/dist/components/message/item/MessageMoreButton.d.ts.map +1 -0
- package/dist/components/message/item/MessageMoreButton.js +42 -0
- package/dist/components/message/item/QuoteMessage.d.ts.map +1 -1
- package/dist/components/message/item/QuoteMessage.js +23 -2
- package/dist/components/message/item/RevokeMessage.js +1 -1
- package/dist/components/message/item/SessionEventMessage.d.ts.map +1 -1
- package/dist/components/message/item/SessionEventMessage.js +13 -1
- package/dist/components/message/item/SystemLogMessage.d.ts.map +1 -1
- package/dist/components/message/item/SystemLogMessage.js +7 -0
- package/dist/components/message/item/index.d.ts.map +1 -1
- package/dist/components/message/item/index.js +80 -18
- package/dist/components/message/item/otherSenders.d.ts +7 -0
- package/dist/components/message/item/otherSenders.d.ts.map +1 -0
- package/dist/components/message/item/otherSenders.js +29 -0
- package/dist/components/message/item/textStyle.d.ts +1 -1
- package/dist/components/message/item/textStyle.d.ts.map +1 -1
- package/dist/components/message/item/textStyle.js +2 -2
- package/dist/components/message/messageKeyboardNav.d.ts +8 -0
- package/dist/components/message/messageKeyboardNav.d.ts.map +1 -0
- package/dist/components/message/messageKeyboardNav.js +24 -0
- package/dist/components/message/reply/ReplyPreviewBar.d.ts.map +1 -1
- package/dist/components/message/reply/ReplyPreviewBar.js +11 -4
- package/dist/components/message/toolbox/MessageToolboxMenu.d.ts.map +1 -1
- package/dist/components/message/toolbox/MessageToolboxMenu.js +16 -1
- package/dist/components/search-conversation/SearchAll.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchAll.js +12 -1
- package/dist/components/search-conversation/SearchDrawer.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchDrawer.js +31 -15
- package/dist/components/search-conversation/SearchMessageOnCurrentConversation.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchMessageOnCurrentConversation.js +5 -2
- package/dist/components/search-conversation/index.d.ts.map +1 -1
- package/dist/components/search-conversation/index.js +3 -1
- package/dist/components/search-conversation/item/SearchItemAsGroup.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsGroup.js +14 -4
- package/dist/components/search-conversation/item/SearchItemAsMessage.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsMessage.js +18 -7
- package/dist/components/search-conversation/item/SearchItemAsUser.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsUser.js +23 -5
- package/dist/components/search-conversation/item/searchRowClass.d.ts +3 -0
- package/dist/components/search-conversation/item/searchRowClass.d.ts.map +1 -0
- package/dist/components/search-conversation/item/searchRowClass.js +5 -0
- package/dist/components/session/DeskAssignedSession.d.ts +5 -1
- package/dist/components/session/DeskAssignedSession.d.ts.map +1 -1
- package/dist/components/session/DeskAssignedSession.js +40 -12
- package/dist/components/session/DeskTeamInbox.d.ts.map +1 -1
- package/dist/components/session/DeskTeamInbox.js +15 -22
- package/dist/components/session/FolderRow.d.ts +21 -0
- package/dist/components/session/FolderRow.d.ts.map +1 -0
- package/dist/components/session/FolderRow.js +16 -0
- package/dist/components/session/SessionFolderList.d.ts +23 -0
- package/dist/components/session/SessionFolderList.d.ts.map +1 -0
- package/dist/components/session/SessionFolderList.js +27 -0
- package/dist/components/session/sessionFilters.d.ts +24 -0
- package/dist/components/session/sessionFilters.d.ts.map +1 -0
- package/dist/components/session/sessionFilters.js +80 -0
- package/dist/components/shortcut-help/ShortcutHelpModal.d.ts +8 -0
- package/dist/components/shortcut-help/ShortcutHelpModal.d.ts.map +1 -0
- package/dist/components/shortcut-help/ShortcutHelpModal.js +23 -0
- package/dist/components/thread/AssignConfirmModal.d.ts.map +1 -1
- package/dist/components/thread/AssignConfirmModal.js +4 -3
- package/dist/components/thread/EndSessionConfirm.d.ts +11 -0
- package/dist/components/thread/EndSessionConfirm.d.ts.map +1 -0
- package/dist/components/thread/EndSessionConfirm.js +31 -0
- package/dist/components/thread/EndSessionToast.d.ts +6 -0
- package/dist/components/thread/EndSessionToast.d.ts.map +1 -0
- package/dist/components/thread/EndSessionToast.js +18 -0
- package/dist/components/thread/GroupInfoBodyCrm.d.ts +46 -0
- package/dist/components/thread/GroupInfoBodyCrm.d.ts.map +1 -0
- package/dist/components/thread/GroupInfoBodyCrm.js +41 -0
- package/dist/components/thread/GroupInfoRows.d.ts +33 -0
- package/dist/components/thread/GroupInfoRows.d.ts.map +1 -0
- package/dist/components/thread/GroupInfoRows.js +18 -0
- package/dist/components/thread/GroupThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/GroupThreadInfo.js +23 -6
- package/dist/components/thread/ManualAssignPopover.d.ts +3 -1
- package/dist/components/thread/ManualAssignPopover.d.ts.map +1 -1
- package/dist/components/thread/ManualAssignPopover.js +21 -9
- package/dist/components/thread/SessionDetailCard.d.ts +6 -0
- package/dist/components/thread/SessionDetailCard.d.ts.map +1 -0
- package/dist/components/thread/SessionDetailCard.js +103 -0
- package/dist/components/thread/SessionSection.d.ts +2 -4
- package/dist/components/thread/SessionSection.d.ts.map +1 -1
- package/dist/components/thread/SessionSection.js +19 -122
- package/dist/components/thread/SessionTagPicker.d.ts +11 -0
- package/dist/components/thread/SessionTagPicker.d.ts.map +1 -0
- package/dist/components/thread/SessionTagPicker.js +27 -0
- package/dist/components/thread/SingleThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/SingleThreadInfo.js +16 -6
- package/dist/components/thread/SupportSessionPanel.d.ts +18 -0
- package/dist/components/thread/SupportSessionPanel.d.ts.map +1 -0
- package/dist/components/thread/SupportSessionPanel.js +46 -0
- package/dist/components/thread/ThreadInfo.d.ts +8 -1
- package/dist/components/thread/ThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/ThreadInfo.js +27 -29
- package/dist/components/thread/ThreadInfoHeader.d.ts +13 -0
- package/dist/components/thread/ThreadInfoHeader.d.ts.map +1 -0
- package/dist/components/thread/ThreadInfoHeader.js +11 -0
- package/dist/components/thread/UserSection.d.ts.map +1 -1
- package/dist/components/thread/UserSection.js +35 -22
- package/dist/components/thread/sessionDateFormat.d.ts +3 -0
- package/dist/components/thread/sessionDateFormat.d.ts.map +1 -0
- package/dist/components/thread/sessionDateFormat.js +13 -0
- package/dist/components/thread/sessionDuration.d.ts +5 -0
- package/dist/components/thread/sessionDuration.d.ts.map +1 -0
- package/dist/components/thread/sessionDuration.js +24 -0
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +2 -0
- package/dist/constants/layout.d.ts +24 -0
- package/dist/constants/layout.d.ts.map +1 -0
- package/dist/constants/layout.js +23 -0
- package/dist/context/ChatContext.d.ts.map +1 -1
- package/dist/context/ChatContext.js +27 -1
- package/dist/hooks/canned-response/useSearchCannedAcrossScopes.d.ts +7 -0
- package/dist/hooks/canned-response/useSearchCannedAcrossScopes.d.ts.map +1 -0
- package/dist/hooks/canned-response/useSearchCannedAcrossScopes.js +46 -0
- package/dist/hooks/common/useCloseOnSidePanelOpen.d.ts +3 -0
- package/dist/hooks/common/useCloseOnSidePanelOpen.d.ts.map +1 -0
- package/dist/hooks/common/useCloseOnSidePanelOpen.js +15 -0
- package/dist/hooks/common/useDeskShortcuts.d.ts +11 -0
- package/dist/hooks/common/useDeskShortcuts.d.ts.map +1 -0
- package/dist/hooks/common/useDeskShortcuts.js +94 -0
- package/dist/hooks/common/useEscapeLayer.d.ts +3 -0
- package/dist/hooks/common/useEscapeLayer.d.ts.map +1 -0
- package/dist/hooks/common/useEscapeLayer.js +18 -0
- package/dist/hooks/common/useMediaQuery.d.ts +3 -0
- package/dist/hooks/common/useMediaQuery.d.ts.map +1 -0
- package/dist/hooks/common/useMediaQuery.js +12 -0
- package/dist/hooks/common/useSidePanel.d.ts +12 -0
- package/dist/hooks/common/useSidePanel.d.ts.map +1 -0
- package/dist/hooks/common/useSidePanel.js +32 -0
- package/dist/hooks/group/useConversationGroups.d.ts.map +1 -1
- package/dist/hooks/group/useConversationGroups.js +3 -0
- package/dist/hooks/message/useNewMessageAnnouncement.d.ts +3 -0
- package/dist/hooks/message/useNewMessageAnnouncement.d.ts.map +1 -0
- package/dist/hooks/message/useNewMessageAnnouncement.js +30 -0
- package/dist/hooks/search/useSearchGroups.js +2 -1
- package/dist/hooks/search/useSearchMessage.d.ts +3 -1
- package/dist/hooks/search/useSearchMessage.d.ts.map +1 -1
- package/dist/hooks/search/useSearchMessage.js +2 -2
- package/dist/hooks/session/useBotSessionOwnerIdentity.d.ts +12 -0
- package/dist/hooks/session/useBotSessionOwnerIdentity.d.ts.map +1 -0
- package/dist/hooks/session/useBotSessionOwnerIdentity.js +22 -0
- package/dist/hooks/session/useCloseSession.d.ts +1 -0
- package/dist/hooks/session/useCloseSession.d.ts.map +1 -1
- package/dist/hooks/session/useCloseSession.js +9 -8
- package/dist/hooks/session/useEndSession.d.ts +11 -0
- package/dist/hooks/session/useEndSession.d.ts.map +1 -0
- package/dist/hooks/session/useEndSession.js +45 -0
- package/dist/hooks/session/useGetSession.d.ts.map +1 -1
- package/dist/hooks/session/useGetSession.js +27 -6
- package/dist/hooks/session/usePendingSessionClose.d.ts +5 -0
- package/dist/hooks/session/usePendingSessionClose.d.ts.map +1 -0
- package/dist/hooks/session/usePendingSessionClose.js +12 -0
- package/dist/hooks/session/useSessionCustomerName.d.ts +3 -0
- package/dist/hooks/session/useSessionCustomerName.d.ts.map +1 -0
- package/dist/hooks/session/useSessionCustomerName.js +19 -0
- package/dist/hooks/session/useSessionFieldAutosave.d.ts +19 -0
- package/dist/hooks/session/useSessionFieldAutosave.d.ts.map +1 -0
- package/dist/hooks/session/useSessionFieldAutosave.js +52 -0
- package/dist/hooks/user/useUserUsername.d.ts +3 -0
- package/dist/hooks/user/useUserUsername.d.ts.map +1 -0
- package/dist/hooks/user/useUserUsername.js +49 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/locales/vi/common.json +201 -21
- package/dist/locales/vi/conversation-inbox.json +21 -2
- package/dist/screens/desk-message/DeskWorkspace.d.ts +12 -0
- package/dist/screens/desk-message/DeskWorkspace.d.ts.map +1 -0
- package/dist/screens/desk-message/DeskWorkspace.js +57 -0
- package/dist/screens/desk-message/FolderOverlay.d.ts +4 -0
- package/dist/screens/desk-message/FolderOverlay.d.ts.map +1 -0
- package/dist/screens/desk-message/FolderOverlay.js +32 -0
- package/dist/screens/desk-message/SkipLinks.d.ts +4 -0
- package/dist/screens/desk-message/SkipLinks.d.ts.map +1 -0
- package/dist/screens/desk-message/SkipLinks.js +19 -0
- package/dist/screens/desk-message/ViewportNotice.d.ts +4 -0
- package/dist/screens/desk-message/ViewportNotice.d.ts.map +1 -0
- package/dist/screens/desk-message/ViewportNotice.js +9 -0
- package/dist/screens/desk-message/index.d.ts +3 -2
- package/dist/screens/desk-message/index.d.ts.map +1 -1
- package/dist/screens/desk-message/index.js +4 -12
- package/dist/store/deskPanelHost.d.ts +13 -0
- package/dist/store/deskPanelHost.d.ts.map +1 -0
- package/dist/store/deskPanelHost.js +9 -0
- package/dist/store/escapeLayers.d.ts +15 -0
- package/dist/store/escapeLayers.d.ts.map +1 -0
- package/dist/store/escapeLayers.js +15 -0
- package/dist/store/pendingSessionClose.d.ts +19 -0
- package/dist/store/pendingSessionClose.d.ts.map +1 -0
- package/dist/store/pendingSessionClose.js +74 -0
- package/dist/store/session.d.ts +2 -1
- package/dist/store/session.d.ts.map +1 -1
- package/dist/store/session.js +4 -1
- package/dist/store/sessionFolder.d.ts +15 -0
- package/dist/store/sessionFolder.d.ts.map +1 -0
- package/dist/store/sessionFolder.js +18 -0
- package/dist/store/shortcutPrefs.d.ts +9 -0
- package/dist/store/shortcutPrefs.d.ts.map +1 -0
- package/dist/store/shortcutPrefs.js +23 -0
- package/dist/store/sidePanel.d.ts +12 -0
- package/dist/store/sidePanel.d.ts.map +1 -0
- package/dist/store/sidePanel.js +9 -0
- package/dist/store/workspaceLayout.d.ts +12 -0
- package/dist/store/workspaceLayout.d.ts.map +1 -0
- package/dist/store/workspaceLayout.js +9 -0
- package/dist/styles/global.css +1 -1
- package/dist/types/chat.d.ts +18 -0
- package/dist/types/chat.d.ts.map +1 -1
- package/dist/types/dto.d.ts +2 -1
- package/dist/types/dto.d.ts.map +1 -1
- package/dist/utils/a11yClickable.d.ts +10 -0
- package/dist/utils/a11yClickable.d.ts.map +1 -0
- package/dist/utils/a11yClickable.js +15 -0
- package/dist/utils/events.d.ts +4 -0
- package/dist/utils/events.d.ts.map +1 -1
- package/dist/utils/headerMemberCount.d.ts +10 -0
- package/dist/utils/headerMemberCount.d.ts.map +1 -0
- package/dist/utils/headerMemberCount.js +3 -0
- package/dist/utils/memberEventRun.d.ts +16 -0
- package/dist/utils/memberEventRun.d.ts.map +1 -0
- package/dist/utils/memberEventRun.js +40 -0
- package/package.json +1 -1
- package/dist/components/session/SessionFilterMenu.d.ts +0 -15
- package/dist/components/session/SessionFilterMenu.d.ts.map +0 -1
- package/dist/components/session/SessionFilterMenu.js +0 -30
- package/dist/components/session/sessionMenuItems.d.ts +0 -28
- package/dist/components/session/sessionMenuItems.d.ts.map +0 -1
- package/dist/components/session/sessionMenuItems.js +0 -119
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComposeNewMessageModal.d.ts","sourceRoot":"","sources":["../../../src/components/compose/ComposeNewMessageModal.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ComposeNewMessageModal.d.ts","sourceRoot":"","sources":["../../../src/components/compose/ComposeNewMessageModal.tsx"],"names":[],"mappings":"AAmBA,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAID,QAAA,MAAM,sBAAsB,GAAI,oBAG7B,2BAA2B,4CAwO7B,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { clickableProps, FOCUS_RING_CLASS } from "../../utils/a11yClickable";
|
|
3
4
|
import { useDebounce } from "ahooks";
|
|
4
5
|
import { Avatar, Empty, Input, Modal, Spin } from "antd";
|
|
5
6
|
import { useState } from "react";
|
|
@@ -10,10 +11,15 @@ import { useEligibleAccounts } from "../../hooks/group/useEligibleAccounts";
|
|
|
10
11
|
import { DChatSDK } from "../../constants/sdk";
|
|
11
12
|
import useConversationStore from "../../store/conversation";
|
|
12
13
|
import CreateGroupForm from "../../components/group/CreateGroupForm";
|
|
14
|
+
import useAuthStore from "../../store/auth";
|
|
15
|
+
import { StrokeIcon } from "../../components/icon/StrokeIcon";
|
|
16
|
+
import TintedAvatar from "../../components/common/TintedAvatar";
|
|
13
17
|
import { useChatNavigate } from "../../hooks/conversation/useChatNavigate";
|
|
14
18
|
const ComposeNewMessageModal = ({ open, onClose, }) => {
|
|
15
19
|
const { t } = useTranslation("conversation-inbox");
|
|
20
|
+
const isCrm = useAuthStore((state) => state.isCrm);
|
|
16
21
|
const [step, setStep] = useState("compose");
|
|
22
|
+
const [footerEl, setFooterEl] = useState(null);
|
|
17
23
|
const [search, setSearch] = useState("");
|
|
18
24
|
const [openingUserID, setOpeningUserID] = useState(null);
|
|
19
25
|
const debouncedSearch = useDebounce(search, { wait: 300 });
|
|
@@ -54,6 +60,10 @@ const ComposeNewMessageModal = ({ open, onClose, }) => {
|
|
|
54
60
|
setOpeningUserID(null);
|
|
55
61
|
}
|
|
56
62
|
};
|
|
57
|
-
return (_jsx(Modal, { "data-cp-name": "ComposeNewMessageModal", title: step
|
|
63
|
+
return (_jsx(Modal, { "data-cp-name": "ComposeNewMessageModal", title: step !== "create-group" ? (t("compose.title")) : isCrm ? (_jsxs("span", { className: "flex items-center gap-3", children: [_jsx("button", { type: "button", onClick: () => setStep("compose"), "aria-label": t("create_group.back_to_compose_label"), title: t("create_group.back_to_compose_label"), className: "-ml-1 flex h-8 w-8 items-center justify-center rounded-lg text-gray-600 hover:bg-gray-5 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary-200", children: _jsx(StrokeIcon, { name: "chevron-left", size: 20 }) }), t("create_group.title")] })) : (t("create_group.title")), open: open, onCancel: handleClose, afterClose: handleAfterClose, footer: isCrm && step === "create-group" ? _jsx("div", { ref: setFooterEl }) : null, centered: true, destroyOnHidden: true, width: step === "create-group" ? 720 : undefined, getContainer: false, children: step === "compose" ? (_jsxs("div", { className: "flex flex-col gap-4", children: [isCrm ? (_jsx(Input, { size: "large", variant: "borderless", value: search, onChange: (event) => setSearch(event.target.value), placeholder: t("compose.search_member_placeholder"), "aria-label": t("compose.search_member_placeholder"), className: "!bg-gray-5 !px-2.5 focus-within:!ring-2 focus-within:!ring-primary-200", prefix: _jsx(StrokeIcon, { name: "search", size: 18, className: "mr-1 text-gray-600" }) })) : (_jsx(Input, { size: "large", value: search, onChange: (event) => setSearch(event.target.value), placeholder: t("compose.search_member_placeholder"), prefix: _jsx(Icon, { icon: "search-o", size: 18, className: "text-gray-400" }) })), _jsxs("button", { type: "button", className: `flex items-center gap-3 rounded-xl px-4 py-3.5 text-left transition-colors ${isCrm
|
|
64
|
+
? "bg-gray-5 hover:bg-gray-25"
|
|
65
|
+
: "bg-[var(--dc-color-primary-light)] hover:bg-[var(--dc-color-primary-light)]"}`, onClick: () => setStep("create-group"), children: [_jsx("span", { className: "flex h-11 w-11 shrink-0 items-center justify-center rounded-full bg-white", children: isCrm ? (_jsx(StrokeIcon, { name: "users", size: 22, className: "text-primary-400" })) : (_jsx(Icon, { icon: "user-three-b", size: 22, className: "text-[var(--dc-color-primary)]" })) }), _jsx("span", { className: "flex-1 text-base font-semibold text-gray-900", children: t("compose.create_group") }), isCrm ? (_jsx(StrokeIcon, { name: "chevron-right", size: 18, className: "text-gray-600" })) : (_jsx(Icon, { icon: "angle-right-o", size: 18, className: "text-gray-400" }))] }), !debouncedSearch && (_jsxs("div", { className: "flex items-center gap-2 px-1", children: [_jsx("span", { className: isCrm
|
|
66
|
+
? "shrink-0 text-[13px] font-semibold text-gray-600"
|
|
67
|
+
: "shrink-0 text-xs font-semibold uppercase tracking-wide text-gray-400", children: t("compose.recent_suggestions") }), _jsx("span", { className: `h-px flex-1 ${isCrm ? "bg-gray-25" : "bg-gray-100"}` })] })), _jsx("div", { className: "max-h-80 overflow-y-auto", children: isLoading ? (_jsx("div", { className: "flex items-center justify-center py-6", children: _jsx(Spin, {}) })) : accounts.length === 0 ? (_jsx(Empty, { description: t("compose.no_member_found") })) : (accounts.map((account) => isCrm ? (_jsxs("div", Object.assign({ className: `flex cursor-pointer items-center gap-3 rounded-lg px-2 py-2 transition-colors hover:bg-gray-5 ${FOCUS_RING_CLASS}` }, clickableProps(() => handleOpenDirectMessage(account)), { children: [_jsx(TintedAvatar, { name: account.displayName, src: account.avatar, size: 40 }), _jsxs("span", { className: "flex min-w-0 flex-1 flex-col", children: [_jsx("span", { className: "truncate text-sm font-medium text-gray-900", children: account.displayName }), account.username && (_jsx("span", { className: "truncate text-xs text-gray-600", children: account.username }))] }), openingUserID === account.userID && _jsx(Spin, { size: "small" })] }), account.userID)) : (_jsxs("div", Object.assign({ className: `flex cursor-pointer items-center gap-3 border-b border-gray-50 px-1 py-3 transition-colors last:border-b-0 hover:bg-[#f5f5f5] ${FOCUS_RING_CLASS}` }, clickableProps(() => handleOpenDirectMessage(account)), { children: [_jsx(Avatar, { src: account.avatar, size: 44, className: "shrink-0", children: account.displayName.charAt(0) || "A" }), _jsx("span", { className: "flex-1 truncate text-base font-medium text-gray-900", children: account.displayName }), openingUserID === account.userID && _jsx(Spin, { size: "small" })] }), account.userID)))) })] })) : (_jsx(CreateGroupForm, { onDone: handleClose, footerEl: footerEl })) }));
|
|
58
68
|
};
|
|
59
69
|
export default ComposeNewMessageModal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationByGroupItem.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/ConversationByGroupItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"ConversationByGroupItem.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/ConversationByGroupItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qCAAqC,CAAC;AAaxF,UAAU,4BAA4B;IACpC,KAAK,EAAE,4BAA4B,CAAC;IACpC,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,QAAA,MAAM,uBAAuB,GAAI,2BAG9B,4BAA4B,4CAoE9B,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useTranslation } from "react-i18next";
|
|
4
4
|
import useConversationStore from "../../store/conversation";
|
|
5
5
|
import { useChatContext } from "../../context/ChatContext";
|
|
6
6
|
import { useChatNavigate } from "../../hooks/conversation/useChatNavigate";
|
|
7
|
-
import {
|
|
7
|
+
import { parseLatestMessage } from "../../utils/common";
|
|
8
8
|
import GroupCompositeAvatar from "../../components/group/GroupCompositeAvatar";
|
|
9
|
-
import
|
|
9
|
+
import DeskConversationRow from "./DeskConversationRow";
|
|
10
|
+
import { GroupVisibility } from "@droppii-org/wasm-client-sdk";
|
|
11
|
+
import { StrokeIcon } from "../../components/icon/StrokeIcon";
|
|
12
|
+
import RowChip from "./RowChip";
|
|
13
|
+
import { formatListRowTime } from "./rowTime";
|
|
10
14
|
import MentionIndicatorIcon from "./MentionIndicatorIcon";
|
|
11
15
|
const ConversationByGroupItem = ({ group, latestPreview, }) => {
|
|
12
16
|
const { t } = useTranslation();
|
|
@@ -28,12 +32,12 @@ const ConversationByGroupItem = ({ group, latestPreview, }) => {
|
|
|
28
32
|
};
|
|
29
33
|
const latestMsg = (latestPreview === null || latestPreview === void 0 ? void 0 : latestPreview.latestMsg) || "";
|
|
30
34
|
const latestMsgSendTime = (latestPreview === null || latestPreview === void 0 ? void 0 : latestPreview.latestMsgSendTime) || 0;
|
|
31
|
-
return (_jsx(
|
|
35
|
+
return (_jsx(DeskConversationRow, { onClick: handleClick, isSelected: isSelected, unreadCount: conversation.unreadCount, preview: parseLatestMessage(latestMsg, user === null || user === void 0 ? void 0 : user.userID, t, {
|
|
32
36
|
peerType: conversation.peerType,
|
|
33
37
|
conversationType: conversation.conversationType,
|
|
34
38
|
showName: conversation.showName,
|
|
35
39
|
}), mentionIndicator: _jsx(MentionIndicatorIcon, { groupAtType: conversation.groupAtType }), time: latestMsgSendTime > 0
|
|
36
|
-
?
|
|
37
|
-
: undefined, avatar: _jsx(GroupCompositeAvatar, { groupID: group.groupId, faceURL: conversation.faceURL, groupName: conversation.showName, size:
|
|
40
|
+
? formatListRowTime(latestMsgSendTime, t)
|
|
41
|
+
: undefined, avatar: _jsx(GroupCompositeAvatar, { groupID: group.groupId, faceURL: conversation.faceURL, groupName: conversation.showName, size: 40 }), name: conversation.showName, meta: group.visibility === GroupVisibility.Private ? (_jsxs(RowChip, { tone: "primary", children: [_jsx(StrokeIcon, { name: "lock", size: 14 }), t("group_visibility_private")] })) : undefined }));
|
|
38
42
|
};
|
|
39
43
|
export default ConversationByGroupItem;
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import type { LatestPreview } from "../../hooks/session/useSessionLatestPreview";
|
|
2
2
|
import { ISessionByStatus } from "../../store/type";
|
|
3
|
+
import { SessionTag } from "../../types/chat";
|
|
3
4
|
interface ConversationBySessionItemProps {
|
|
4
5
|
sessionItem: ISessionByStatus;
|
|
5
6
|
latestPreview?: LatestPreview;
|
|
7
|
+
/** Tag the open folder already filters by; its chip would repeat the folder name. */
|
|
8
|
+
folderTag?: SessionTag;
|
|
6
9
|
}
|
|
7
|
-
declare const ConversationBySessionItem: ({ sessionItem, latestPreview, }: ConversationBySessionItemProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
10
|
+
declare const ConversationBySessionItem: ({ sessionItem, latestPreview, folderTag, }: ConversationBySessionItemProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
8
11
|
export default ConversationBySessionItem;
|
|
9
12
|
//# sourceMappingURL=ConversationBySessionItem.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationBySessionItem.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/ConversationBySessionItem.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ConversationBySessionItem.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/ConversationBySessionItem.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAE7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAQhD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAU1C,UAAU,8BAA8B;IACtC,WAAW,EAAE,gBAAgB,CAAC;IAC9B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,qFAAqF;IACrF,SAAS,CAAC,EAAE,UAAU,CAAC;CACxB;AAaD,QAAA,MAAM,yBAAyB,GAAI,4CAIhC,8BAA8B,mDAsGhC,CAAC;AAEF,eAAe,yBAAyB,CAAC"}
|
|
@@ -1,19 +1,32 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { PeerType } from "../../types/conversation";
|
|
3
4
|
import { useTranslation } from "react-i18next";
|
|
4
5
|
import useConversationStore from "../../store/conversation";
|
|
5
|
-
import { Avatar } from "antd";
|
|
6
6
|
import { useChatContext } from "../../context/ChatContext";
|
|
7
7
|
import { useChatNavigate } from "../../hooks/conversation/useChatNavigate";
|
|
8
8
|
import { useConversationDisplayData } from "../../hooks/conversation/useConversation";
|
|
9
|
-
import { formatTimestamp, parseLatestMessage } from "../../utils/common";
|
|
10
9
|
import { isGroupSession } from "../../utils/imCommon";
|
|
11
10
|
import { resolveBotSessionOwnerIdentity } from "../../utils/conversation";
|
|
11
|
+
import { SessionTag } from "../../types/chat";
|
|
12
12
|
import GroupCompositeAvatar from "../../components/group/GroupCompositeAvatar";
|
|
13
|
-
import
|
|
13
|
+
import DeskConversationRow from "./DeskConversationRow";
|
|
14
|
+
import { formatListRowTime } from "./rowTime";
|
|
15
|
+
import DeskRowAvatar from "./DeskRowAvatar";
|
|
16
|
+
import RowChip from "./RowChip";
|
|
17
|
+
import { buildSessionPreview } from "./internalNotePreview";
|
|
18
|
+
import { splitDisplayName } from "./rowDisplayName";
|
|
14
19
|
import MentionIndicatorIcon from "./MentionIndicatorIcon";
|
|
15
|
-
const
|
|
16
|
-
|
|
20
|
+
const TAG_CHIPS = {
|
|
21
|
+
[SessionTag.AWAITING_REPLY]: { tone: "warning", labelKey: "awaiting_reply" },
|
|
22
|
+
[SessionTag.SLOW_PROCESSING]: { tone: "danger", labelKey: "slow_processing" },
|
|
23
|
+
[SessionTag.TEMPORARILY_PAUSED]: {
|
|
24
|
+
tone: "neutral",
|
|
25
|
+
labelKey: "temporarily_paused",
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
const ConversationBySessionItem = ({ sessionItem, latestPreview, folderTag, }) => {
|
|
29
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
17
30
|
const { t } = useTranslation();
|
|
18
31
|
const { user } = useChatContext();
|
|
19
32
|
const onNavigate = useChatNavigate();
|
|
@@ -36,18 +49,31 @@ const ConversationBySessionItem = ({ sessionItem, latestPreview, }) => {
|
|
|
36
49
|
setSelectedConversationId(conversation.conversationID);
|
|
37
50
|
};
|
|
38
51
|
const { avatar, displayName = "" } = useConversationDisplayData(conversation || null);
|
|
39
|
-
|
|
40
|
-
|
|
52
|
+
// The session payload names the customer even while the conversation is a bare
|
|
53
|
+
// fallback (no peerType yet), so the row's name and avatar tint never jump.
|
|
54
|
+
const isBotSession = (conversation === null || conversation === void 0 ? void 0 : conversation.peerType) === PeerType.BOT || Boolean(sessionItem === null || sessionItem === void 0 ? void 0 : sessionItem.botId);
|
|
55
|
+
const owner = sessionItem === null || sessionItem === void 0 ? void 0 : sessionItem.owner;
|
|
56
|
+
const ownerIdentity = (_a = resolveBotSessionOwnerIdentity(conversation, owner, user === null || user === void 0 ? void 0 : user.userID)) !== null && _a !== void 0 ? _a : (isBotSession && (((_b = owner === null || owner === void 0 ? void 0 : owner.fullName) === null || _b === void 0 ? void 0 : _b.trim()) || ((_c = owner === null || owner === void 0 ? void 0 : owner.username) === null || _c === void 0 ? void 0 : _c.trim()))
|
|
57
|
+
? {
|
|
58
|
+
displayName: ((_d = owner.fullName) === null || _d === void 0 ? void 0 : _d.trim()) && ((_e = owner.username) === null || _e === void 0 ? void 0 : _e.trim())
|
|
59
|
+
? `${owner.fullName.trim()} (${owner.username.trim()})`
|
|
60
|
+
: (((_f = owner.fullName) === null || _f === void 0 ? void 0 : _f.trim()) || ((_g = owner.username) === null || _g === void 0 ? void 0 : _g.trim())),
|
|
61
|
+
avatarUrl: ((_h = owner.avatar) === null || _h === void 0 ? void 0 : _h.trim()) || undefined,
|
|
62
|
+
}
|
|
63
|
+
: null);
|
|
64
|
+
const fullTitle = (_j = ownerIdentity === null || ownerIdentity === void 0 ? void 0 : ownerIdentity.displayName) !== null && _j !== void 0 ? _j : displayName;
|
|
65
|
+
const { name } = splitDisplayName(fullTitle);
|
|
41
66
|
const latestMsg = (latestPreview === null || latestPreview === void 0 ? void 0 : latestPreview.latestMsg) || "";
|
|
42
67
|
const latestMsgSendTime = (latestPreview === null || latestPreview === void 0 ? void 0 : latestPreview.latestMsgSendTime) || 0;
|
|
43
68
|
if (!conversation)
|
|
44
69
|
return null;
|
|
45
|
-
|
|
70
|
+
const tagChip = sessionItem.tag !== folderTag ? TAG_CHIPS[sessionItem.tag] : undefined;
|
|
71
|
+
return (_jsx(DeskConversationRow, { onClick: () => handleConversationClick(conversation), isSelected: isSelected, unreadCount: conversation.unreadCount, preview: buildSessionPreview(latestMsg, user === null || user === void 0 ? void 0 : user.userID, t, {
|
|
46
72
|
peerType: conversation.peerType,
|
|
47
73
|
conversationType: conversation.conversationType,
|
|
48
74
|
showName: conversation.showName,
|
|
49
75
|
}), mentionIndicator: _jsx(MentionIndicatorIcon, { groupAtType: conversation.groupAtType }), time: latestMsgSendTime > 0
|
|
50
|
-
?
|
|
51
|
-
: undefined, avatar: ownerIdentity
|
|
76
|
+
? formatListRowTime(latestMsgSendTime, t)
|
|
77
|
+
: undefined, avatar: !ownerIdentity && isGroupSession(conversation.conversationType) ? (_jsx(GroupCompositeAvatar, { groupID: conversation.groupID, faceURL: avatar, groupName: displayName, size: 40 })) : (_jsx(DeskRowAvatar, { name: name, src: ownerIdentity ? ownerIdentity.avatarUrl : avatar })), name: name, nameTooltip: fullTitle, meta: tagChip ? (_jsx(RowChip, { tone: tagChip.tone, children: t(tagChip.labelKey) })) : undefined }));
|
|
52
78
|
};
|
|
53
79
|
export default ConversationBySessionItem;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeskConversationList.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/DeskConversationList.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DeskConversationList.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/DeskConversationList.tsx"],"names":[],"mappings":"AA+BA,QAAA,MAAM,oBAAoB,+CAgRzB,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useEffect, useRef } from "react";
|
|
4
4
|
import { useSearchParams } from "next/navigation";
|
|
5
|
-
import {
|
|
6
|
-
import { Icon } from "../../components/icon";
|
|
5
|
+
import { Drawer } from "antd";
|
|
7
6
|
import useConversationStore from "../../store/conversation";
|
|
8
7
|
import { useTranslation } from "react-i18next";
|
|
9
8
|
import { useBoolean, useDebounce } from "ahooks";
|
|
@@ -19,10 +18,16 @@ import { useGetTeamSessionSummary } from "../../hooks/session/useGetTeamSessionS
|
|
|
19
18
|
import { useConversationGroups } from "../../hooks/group/useConversationGroups";
|
|
20
19
|
import { DChatSDK } from "../../constants/sdk";
|
|
21
20
|
import emitter from "../../utils/events";
|
|
22
|
-
import {
|
|
21
|
+
import { useGetSessionSummary } from "../../hooks/session/useGetSessionSummary";
|
|
22
|
+
import { getActiveFolder } from "../../store/sessionFolder";
|
|
23
|
+
import { ALL_GROUPS_KEY } from "../../components/session/sessionFilters";
|
|
24
|
+
import DeskListHeader from "./DeskListHeader";
|
|
25
|
+
import DeskListEmptyState from "./DeskListEmptyState";
|
|
26
|
+
import DeskListSkeleton from "./DeskListSkeleton";
|
|
27
|
+
import { getListHeading } from "./listHeading";
|
|
23
28
|
import ComposeNewMessageModal from "../../components/compose/ComposeNewMessageModal";
|
|
29
|
+
import { useCloseOnSidePanelOpen } from "../../hooks/common/useCloseOnSidePanelOpen";
|
|
24
30
|
const DeskConversationList = () => {
|
|
25
|
-
var _a, _b;
|
|
26
31
|
const searchInputRef = useRef(null);
|
|
27
32
|
const { t } = useTranslation();
|
|
28
33
|
const [search, setSearch] = useState("");
|
|
@@ -36,7 +41,7 @@ const DeskConversationList = () => {
|
|
|
36
41
|
const viewMode = useSessionStore((state) => state.viewMode);
|
|
37
42
|
const isAllGroupsView = viewMode === "allGroups";
|
|
38
43
|
const { data: teamSummaries } = useGetTeamSessionSummary();
|
|
39
|
-
const { dataFlatten: rawSessions, hasNextPage, fetchNextPage, refetch, isSyncing, } = useGetSession({
|
|
44
|
+
const { dataFlatten: rawSessions, hasNextPage, fetchNextPage, refetch, isSyncing, isLoading: isSessionsLoading, } = useGetSession({
|
|
40
45
|
filter: filterSummary,
|
|
41
46
|
options: { isEnabled: !isAllGroupsView },
|
|
42
47
|
});
|
|
@@ -44,22 +49,34 @@ const DeskConversationList = () => {
|
|
|
44
49
|
const latestPreviewMap = useSessionLatestPreview(rawSessions);
|
|
45
50
|
const sessions = useSortedSessions(rawSessions, latestPreviewMap);
|
|
46
51
|
const groupLatestPreviewMap = useSessionLatestPreview(conversationGroups);
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const
|
|
51
|
-
const
|
|
52
|
-
?
|
|
53
|
-
:
|
|
52
|
+
const { data: mySummary } = useGetSessionSummary();
|
|
53
|
+
const folder = getActiveFolder(filterSummary, viewMode);
|
|
54
|
+
const heading = getListHeading({ folder, mySummary, teams: teamSummaries });
|
|
55
|
+
const emptyFilterKey = isAllGroupsView ? ALL_GROUPS_KEY : folder.filterKey;
|
|
56
|
+
const isListLoading = isAllGroupsView
|
|
57
|
+
? isConversationGroupsLoading
|
|
58
|
+
: isSessionsLoading || isSyncing;
|
|
54
59
|
const debouncedSearch = useDebounce(search, { wait: 500 });
|
|
60
|
+
// Closing hands focus back to the field (drawer focus restore, Esc); that focus
|
|
61
|
+
// must not reopen the search it just closed.
|
|
62
|
+
const searchClosedAtRef = useRef(0);
|
|
55
63
|
const onCloseSearch = () => {
|
|
64
|
+
var _a;
|
|
65
|
+
searchClosedAtRef.current = Date.now();
|
|
56
66
|
setSearch("");
|
|
57
67
|
setShowSearchFalse();
|
|
58
|
-
|
|
59
|
-
var _a;
|
|
60
|
-
(_a = searchInputRef.current) === null || _a === void 0 ? void 0 : _a.blur();
|
|
61
|
-
}, 500);
|
|
68
|
+
(_a = searchInputRef.current) === null || _a === void 0 ? void 0 : _a.blur();
|
|
62
69
|
};
|
|
70
|
+
const onSearchFocus = () => {
|
|
71
|
+
if (Date.now() - searchClosedAtRef.current < 600)
|
|
72
|
+
return;
|
|
73
|
+
setShowSearchTrue();
|
|
74
|
+
};
|
|
75
|
+
// Opening a side panel (members, info, media…) closes the conversation search.
|
|
76
|
+
useCloseOnSidePanelOpen(() => {
|
|
77
|
+
if (showSearch)
|
|
78
|
+
onCloseSearch();
|
|
79
|
+
});
|
|
63
80
|
useEffect(() => {
|
|
64
81
|
if (showSearch) {
|
|
65
82
|
setTimeout(() => {
|
|
@@ -129,23 +146,21 @@ const DeskConversationList = () => {
|
|
|
129
146
|
emitter.off("UPDATE_SESSION", handler);
|
|
130
147
|
};
|
|
131
148
|
}, [filterSummary, refetch]);
|
|
132
|
-
return (_jsxs("
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}, className: "rounded-lg text-sm flex-1 h-[36px]", size: "large", allowClear: true, onClick: setShowSearchTrue, value: search, autoFocus: false, onClear: onCloseSearch }), showSearch ? (_jsx(Button, { onClick: onCloseSearch, variant: "outlined", className: "p-0 w-[36px] h-[36px] text-gray-500", children: _jsx(Icon, { icon: "close-b", size: 22 }) })) : (_jsx(Button, { "data-testid": "conversation-list-compose-icon", onClick: () => setIsComposeOpen(true), variant: "outlined", className: "p-0 w-[36px] h-[36px] shrink-0 text-gray-500", children: _jsx(Icon, { icon: "edit-b", size: 20 }) }))] }), _jsxs("div", { className: "flex items-center justify-between mt-2", children: [_jsx("span", { className: "text-sm font-semibold text-blue-500 truncate", children: pathName }), isAllGroupsView ? (_jsxs("span", { className: "flex items-center gap-1.5 shrink-0", children: [_jsx(Icon, { icon: "user-three-o", size: 16, className: "text-gray-500" }), _jsx("span", { className: "text-sm font-semibold text-gray-800", children: t("all_groups") })] })) : (filterConfig && (_jsxs("span", { className: "flex items-center gap-1.5 shrink-0", children: [_jsx(Icon, { icon: filterConfig.iconName, size: 16, className: "text-gray-500" }), _jsx("span", { className: "text-sm font-semibold text-gray-800", children: t(filterConfig.labelKey) })] })))] })] }), _jsxs("div", { className: "relative flex-1 min-h-0", children: [_jsx("div", { id: "scrollableConversationsDiv", style: {
|
|
149
|
+
return (_jsxs("section", { "aria-label": t("conversation_list_label"), className: "flex flex-col h-full w-full bg-white", "data-cp-name": "DeskConversationList", children: [_jsx(DeskListHeader, { ref: searchInputRef, heading: heading, search: search, isSearching: showSearch, onSearchChange: (value) => {
|
|
150
|
+
if (!showSearch && value)
|
|
151
|
+
setShowSearchTrue();
|
|
152
|
+
setSearch(value);
|
|
153
|
+
}, onSearchFocus: onSearchFocus, onCloseSearch: onCloseSearch, onCompose: () => setIsComposeOpen(true) }), _jsxs("div", { className: "relative flex-1 min-h-0", children: [_jsx("div", { id: "scrollableConversationsDiv", "aria-busy": isListLoading, style: {
|
|
138
154
|
height: "100%",
|
|
139
155
|
overflow: showSearch ? "hidden" : "auto",
|
|
140
|
-
}, children: isAllGroupsView ? (isConversationGroupsLoading ? (_jsx(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
// yet — showing the list now would flash a wrong, too-low
|
|
144
|
-
// count that corrects itself a moment later.
|
|
145
|
-
_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx(Spin, {}) })) : (sessions === null || sessions === void 0 ? void 0 : sessions.length) === 0 ? (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx(Empty, { image: _jsx(Icon, { icon: "chat-square-b", size: 80, className: "text-gray-300" }), description: t("no_conversation") }) })) : ((_b = sessions === null || sessions === void 0 ? void 0 : sessions.map) === null || _b === void 0 ? void 0 : _b.call(sessions, (session) => (_jsx(ConversationBySessionItem, { sessionItem: session, latestPreview: latestPreviewMap.get(session.conversationId) }, session.conversationId)))) })) }), _jsx(Drawer, { open: showSearch, mask: false, closeIcon: false, styles: {
|
|
156
|
+
}, children: isAllGroupsView ? (isConversationGroupsLoading ? (_jsx(DeskListSkeleton, { rows: 8 })) : !(conversationGroups === null || conversationGroups === void 0 ? void 0 : conversationGroups.length) ? (_jsx(DeskListEmptyState, { filterKey: emptyFilterKey })) : (_jsx(InfiniteScroll, { dataLength: conversationGroups.length, next: fetchNextGroupsPage, hasMore: !!hasNextGroupsPage, loader: _jsx(DeskListSkeleton, { rows: 2 }), scrollableTarget: "scrollableConversationsDiv", children: _jsx("div", { className: "flex flex-col gap-0.5 px-1 pb-2", children: conversationGroups.map((group) => (_jsx(ConversationByGroupItem, { group: group, latestPreview: groupLatestPreviewMap.get(group.conversationId) }, group.groupId))) }) }))) : isSessionsLoading || (isSyncing && !(sessions === null || sessions === void 0 ? void 0 : sessions.length)) ? (
|
|
157
|
+
// First load, or the client cache has not caught up with any row yet.
|
|
158
|
+
_jsx(DeskListSkeleton, { rows: 8 })) : !(sessions === null || sessions === void 0 ? void 0 : sessions.length) ? (_jsx(DeskListEmptyState, { filterKey: emptyFilterKey })) : (_jsx(InfiniteScroll, { dataLength: sessions.length, next: fetchNextPage, hasMore: hasNextPage, loader: _jsx(DeskListSkeleton, { rows: 2 }), scrollableTarget: "scrollableConversationsDiv", children: _jsx("div", { className: "flex flex-col gap-0.5 px-1 pb-2", children: sessions.map((session) => (_jsx(ConversationBySessionItem, { sessionItem: session, latestPreview: latestPreviewMap.get(session.conversationId), folderTag: filterSummary.tag }, session.conversationId))) }) })) }), _jsx(Drawer, { open: showSearch, "aria-label": t("search"), mask: false, closeIcon: false, styles: {
|
|
146
159
|
body: {
|
|
147
160
|
padding: 0,
|
|
148
161
|
},
|
|
149
|
-
}, getContainer: false,
|
|
162
|
+
}, getContainer: false,
|
|
163
|
+
// Focus stays in the search field; the drawer must not take or restore it.
|
|
164
|
+
autoFocus: false, destroyOnHidden: true, width: "100%", children: _jsx(SearchConversation, { searchTerm: debouncedSearch }) })] }), _jsx(ComposeNewMessageModal, { open: isComposeOpen, onClose: () => setIsComposeOpen(false) })] }));
|
|
150
165
|
};
|
|
151
166
|
export default DeskConversationList;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
export interface DeskConversationRowProps {
|
|
3
|
+
avatar: ReactNode;
|
|
4
|
+
name: string;
|
|
5
|
+
/** Full name with username, shown on hover when the row only shows the name. */
|
|
6
|
+
nameTooltip?: string;
|
|
7
|
+
preview: string;
|
|
8
|
+
time?: string;
|
|
9
|
+
unreadCount?: number;
|
|
10
|
+
mentionIndicator?: ReactNode;
|
|
11
|
+
/** Chips under the preview. */
|
|
12
|
+
meta?: ReactNode;
|
|
13
|
+
isSelected?: boolean;
|
|
14
|
+
onClick: () => void;
|
|
15
|
+
}
|
|
16
|
+
/** CRM desk list row; the chip line only exists when the row has chips. */
|
|
17
|
+
declare const DeskConversationRow: ({ avatar, name, nameTooltip, preview, time, unreadCount, mentionIndicator, meta, isSelected, onClick, }: DeskConversationRowProps) => import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export default DeskConversationRow;
|
|
19
|
+
//# sourceMappingURL=DeskConversationRow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeskConversationRow.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/DeskConversationRow.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOvC,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,SAAS,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,+BAA+B;IAC/B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,2EAA2E;AAC3E,QAAA,MAAM,mBAAmB,GAAI,yGAW1B,wBAAwB,4CA2D1B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import clsx from "clsx";
|
|
4
|
+
import { Tooltip } from "antd";
|
|
5
|
+
import { useTranslation } from "react-i18next";
|
|
6
|
+
const formatUnread = (count) => (count > 99 ? "99+" : String(count));
|
|
7
|
+
/** CRM desk list row; the chip line only exists when the row has chips. */
|
|
8
|
+
const DeskConversationRow = ({ avatar, name, nameTooltip, preview, time, unreadCount = 0, mentionIndicator, meta, isSelected = false, onClick, }) => {
|
|
9
|
+
const { t } = useTranslation();
|
|
10
|
+
const hasUnread = unreadCount > 0;
|
|
11
|
+
const hasPreview = preview.trim() !== "";
|
|
12
|
+
return (_jsxs("button", { type: "button", onClick: onClick, "data-cp-name": "DeskConversationRow", "aria-current": isSelected ? "true" : undefined, className: clsx("relative flex w-full shrink-0 items-start gap-3 rounded-lg px-3 py-2.5 text-left transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400",
|
|
13
|
+
// Active row: left accent bar, and primary chips turn white so they stay visible.
|
|
14
|
+
isSelected
|
|
15
|
+
? "bg-primary-25 before:absolute before:inset-y-2 before:left-0 before:w-[3px] before:rounded-r-full before:bg-primary-400 [&_[data-tone=primary]]:!bg-white"
|
|
16
|
+
: "hover:bg-gray-5"), children: [avatar, _jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [_jsxs("span", { className: "flex items-baseline gap-2", children: [_jsx(Tooltip, { title: nameTooltip && nameTooltip !== name ? nameTooltip : undefined, children: _jsx("span", { className: clsx("min-w-0 flex-1 truncate text-sm text-gray-900", hasUnread || isSelected ? "font-semibold" : "font-medium"), children: name }) }), time && _jsx("span", { className: "shrink-0 text-xs text-gray-600", children: time })] }), _jsxs("span", { className: "flex min-h-4 items-center gap-2", children: [_jsx("span", { className: clsx("min-w-0 flex-1 truncate text-[13px]", hasUnread && hasPreview ? "font-semibold text-gray-900" : "text-gray-600"), children: hasPreview ? preview : t("no_message_yet") }), mentionIndicator, hasUnread && (_jsx("span", { "data-cp-name": "UnreadBadge", className: "inline-flex h-5 min-w-5 shrink-0 items-center justify-center rounded-full bg-primary-400 px-1.5 text-xs font-semibold tabular-nums text-white", children: formatUnread(unreadCount) }))] }), meta && (_jsx("span", { className: "flex h-5 items-center gap-1 overflow-hidden", children: meta }))] })] }));
|
|
17
|
+
};
|
|
18
|
+
export default DeskConversationRow;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Shown when the selected folder has no conversations; the sentence names the folder. */
|
|
2
|
+
declare const DeskListEmptyState: ({ filterKey }: {
|
|
3
|
+
filterKey: string;
|
|
4
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
export default DeskListEmptyState;
|
|
6
|
+
//# sourceMappingURL=DeskListEmptyState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeskListEmptyState.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/DeskListEmptyState.tsx"],"names":[],"mappings":"AAKA,0FAA0F;AAC1F,QAAA,MAAM,kBAAkB,GAAI,eAAe;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,4CAW/D,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useTranslation } from "react-i18next";
|
|
4
|
+
import { StrokeIcon } from "../../components/icon/StrokeIcon";
|
|
5
|
+
import { getFolderEmptyKey } from "./folderEmptyState";
|
|
6
|
+
/** Shown when the selected folder has no conversations; the sentence names the folder. */
|
|
7
|
+
const DeskListEmptyState = ({ filterKey }) => {
|
|
8
|
+
const { t } = useTranslation();
|
|
9
|
+
return (_jsxs("div", { className: "flex flex-col items-center gap-3 px-6 py-12 text-center", "data-cp-name": "DeskListEmptyState", children: [_jsx(StrokeIcon, { name: "message-circle", size: 56, strokeWidth: 1.25, className: "text-gray-100" }), _jsx("p", { className: "text-sm text-gray-600", children: t(getFolderEmptyKey(filterKey)) })] }));
|
|
10
|
+
};
|
|
11
|
+
export default DeskListEmptyState;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ListHeading } from "./listHeading";
|
|
2
|
+
interface DeskListHeaderProps {
|
|
3
|
+
heading: ListHeading;
|
|
4
|
+
search: string;
|
|
5
|
+
isSearching: boolean;
|
|
6
|
+
onSearchChange: (value: string) => void;
|
|
7
|
+
onSearchFocus: () => void;
|
|
8
|
+
onCloseSearch: () => void;
|
|
9
|
+
onCompose: () => void;
|
|
10
|
+
}
|
|
11
|
+
/** Search row plus a title that names the folder the list below is built from. */
|
|
12
|
+
declare const DeskListHeader: import("react").ForwardRefExoticComponent<DeskListHeaderProps & import("react").RefAttributes<HTMLInputElement>>;
|
|
13
|
+
export default DeskListHeader;
|
|
14
|
+
//# sourceMappingURL=DeskListHeader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeskListHeader.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/DeskListHeader.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,UAAU,mBAAmB;IAC3B,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,kFAAkF;AAClF,QAAA,MAAM,cAAc,kHAkJnB,CAAC;AAGF,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef, useState } from "react";
|
|
4
|
+
import { Button, Tooltip } from "antd";
|
|
5
|
+
import { useTranslation } from "react-i18next";
|
|
6
|
+
import { StrokeIcon } from "../../components/icon/StrokeIcon";
|
|
7
|
+
import { useMediaQuery } from "../../hooks/common/useMediaQuery";
|
|
8
|
+
import useWorkspaceLayoutStore from "../../store/workspaceLayout";
|
|
9
|
+
import useShortcutPrefsStore from "../../store/shortcutPrefs";
|
|
10
|
+
import { LAYOUT_BREAKPOINTS } from "../../constants/layout";
|
|
11
|
+
/** Search row plus a title that names the folder the list below is built from. */
|
|
12
|
+
const DeskListHeader = forwardRef(({ heading, search, isSearching, onSearchChange, onSearchFocus, onCloseSearch, onCompose, }, inputRef) => {
|
|
13
|
+
var _a, _b;
|
|
14
|
+
const { t } = useTranslation();
|
|
15
|
+
const [isFocused, setIsFocused] = useState(false);
|
|
16
|
+
const isFolderInline = useMediaQuery(`(min-width: ${LAYOUT_BREAKPOINTS.folderInline}px)`);
|
|
17
|
+
const setFolderOverlayOpen = useWorkspaceLayoutStore((state) => state.setFolderOverlayOpen);
|
|
18
|
+
const singleKeyEnabled = useShortcutPrefsStore((s) => s.singleKeyEnabled);
|
|
19
|
+
const context = (_a = heading.contextText) !== null && _a !== void 0 ? _a : t((_b = heading.contextKey) !== null && _b !== void 0 ? _b : "my_messages");
|
|
20
|
+
const showSlashHint = singleKeyEnabled && !isFocused && !search && !isSearching;
|
|
21
|
+
return (_jsxs("div", { "data-cp-name": "DeskListHeader", children: [_jsxs("div", { className: "flex items-center gap-2 p-3", children: [!isFolderInline && (_jsx(Tooltip, { title: t("folder_panel_open"), children: _jsx(Button, { onClick: () => setFolderOverlayOpen(true), className: "flex h-9 w-9 shrink-0 items-center justify-center border-0 bg-gray-5 p-0 text-gray-900", "aria-label": t("folder_panel_open"), children: _jsx(StrokeIcon, { name: "panel-left", size: 20 }) }) })), _jsx("label", { htmlFor: "desk-list-search", className: "sr-only", children: t("search_conversation_label") }), _jsxs("div", { className: "flex h-9 min-w-0 flex-1 items-center gap-2 rounded-lg bg-gray-5 pl-2.5 pr-2 text-gray-600 focus-within:ring-2 focus-within:ring-primary-200", children: [_jsx(StrokeIcon, { name: "search", size: 18 }), _jsx("input", { id: "desk-list-search", ref: inputRef, type: "text", "data-desk-search": true, autoComplete: "off",
|
|
22
|
+
// The narrow list (folder toggle shown) has no room for the long hint.
|
|
23
|
+
placeholder: t(isFolderInline ? "desk_search_placeholder" : "search_conversation_label"), value: search, onChange: (e) => onSearchChange(e.target.value), onFocus: () => {
|
|
24
|
+
setIsFocused(true);
|
|
25
|
+
onSearchFocus();
|
|
26
|
+
}, onBlur: () => setIsFocused(false),
|
|
27
|
+
// Focus can already sit in the field after a close, so a click opens too.
|
|
28
|
+
onClick: () => {
|
|
29
|
+
if (!isSearching)
|
|
30
|
+
onSearchFocus();
|
|
31
|
+
}, onKeyDown: (e) => {
|
|
32
|
+
if (e.key === "Escape" && (isSearching || search)) {
|
|
33
|
+
e.stopPropagation();
|
|
34
|
+
onCloseSearch();
|
|
35
|
+
}
|
|
36
|
+
}, className: "min-w-0 flex-1 border-0 bg-transparent p-0 text-sm text-gray-900 outline-none placeholder:text-gray-600" }), search && (_jsx("button", { type: "button", "aria-label": t("clear"), onClick: onCloseSearch, className: "flex h-5 w-5 shrink-0 items-center justify-center rounded-full text-gray-600 hover:text-gray-900 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary-200", children: _jsx(StrokeIcon, { name: "x", size: 14 }) })), showSlashHint && (_jsx("kbd", { "aria-hidden": "true", className: "inline-flex h-6 min-w-[24px] items-center justify-center rounded border border-b-2 border-gray-50 bg-white px-1.5 font-sans text-xs font-semibold text-gray-900", children: "/" }))] }), isSearching ? (_jsx(Tooltip, { title: t("close"), children: _jsx(Button, { onClick: onCloseSearch, "aria-label": t("close"), className: "h-9 w-9 shrink-0 p-0 text-gray-600", children: _jsx(StrokeIcon, { name: "x", size: 20 }) }) })) : (_jsx(Tooltip, { title: t("compose_new_message"), children: _jsx(Button, { "data-testid": "conversation-list-compose-icon", onClick: onCompose, "aria-label": t("compose_new_message"), className: "flex !h-8 !w-8 shrink-0 items-center justify-center rounded-lg border-0 bg-primary-25 p-0 text-primary-500", children: _jsx(StrokeIcon, { name: "edit", size: 18 }) }) }))] }), !isSearching && (_jsxs("div", { className: "flex flex-col gap-0.5 border-b border-gray-25 px-4 pb-3 pt-1", children: [isFolderInline ? (_jsx("span", { className: "truncate text-xs font-medium text-gray-600", children: context })) : (_jsxs("button", { type: "button", "aria-label": `${t("folder_panel_open")}: ${context}`, onClick: () => setFolderOverlayOpen(true), className: "flex min-w-0 items-center gap-1 self-start rounded border-0 bg-transparent p-0 text-xs font-medium leading-[1.4] text-gray-600 hover:text-gray-900 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary-200", children: [_jsx("span", { className: "truncate", children: context }), _jsx(StrokeIcon, { name: "chevron-down", size: 14 })] })), _jsxs("h2", { className: "m-0 flex min-w-0 items-center gap-2 text-lg font-bold text-gray-900", children: [_jsx("span", { className: "truncate", children: t(heading.titleKey) }), " ", !!heading.count && (_jsx("span", { className: "inline-flex h-6 shrink-0 items-center rounded-full bg-primary-25 px-2 text-sm font-semibold tabular-nums text-primary-500", children: heading.count }))] })] }))] }));
|
|
37
|
+
});
|
|
38
|
+
DeskListHeader.displayName = "DeskListHeader";
|
|
39
|
+
export default DeskListHeader;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Placeholder rows shaped like DeskConversationRow, shown while the desk list loads. */
|
|
2
|
+
declare const DeskListSkeleton: ({ rows }: {
|
|
3
|
+
rows: number;
|
|
4
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
export default DeskListSkeleton;
|
|
6
|
+
//# sourceMappingURL=DeskListSkeleton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeskListSkeleton.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/DeskListSkeleton.tsx"],"names":[],"mappings":"AAGA,yFAAyF;AACzF,QAAA,MAAM,gBAAgB,GAAI,UAAU;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,4CAwBnD,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useTranslation } from "react-i18next";
|
|
4
|
+
/** Placeholder rows shaped like DeskConversationRow, shown while the desk list loads. */
|
|
5
|
+
const DeskListSkeleton = ({ rows }) => {
|
|
6
|
+
const { t } = useTranslation();
|
|
7
|
+
return (_jsxs("div", { role: "status", className: "flex flex-col gap-0.5 px-1 pb-2", "data-testid": "desk-list-skeleton", children: [_jsx("span", { className: "sr-only", children: t("desk_list_loading") }), Array.from({ length: rows }, (_, index) => (_jsxs("div", { "aria-hidden": "true", className: "flex items-start gap-3 px-3 py-2.5 motion-safe:animate-pulse", children: [_jsx("span", { className: "h-10 w-10 shrink-0 rounded-full bg-gray-25" }), _jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-2 pt-0.5", children: [_jsxs("span", { className: "flex items-center gap-2", children: [_jsx("span", { className: "h-3.5 w-2/5 rounded bg-gray-25" }), _jsx("span", { className: "ml-auto h-3 w-9 rounded bg-gray-25" })] }), _jsx("span", { className: "h-3 w-4/5 rounded bg-gray-25" }), index % 2 === 0 && _jsx("span", { className: "h-4 w-16 rounded-full bg-gray-25" })] })] }, index)))] }));
|
|
8
|
+
};
|
|
9
|
+
export default DeskListSkeleton;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface DeskRowAvatarProps {
|
|
2
|
+
name: string;
|
|
3
|
+
src?: string | null;
|
|
4
|
+
}
|
|
5
|
+
/** 40px list avatar; the white ring keeps it visible on the active row's tint. */
|
|
6
|
+
declare const DeskRowAvatar: ({ name, src }: DeskRowAvatarProps) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export default DeskRowAvatar;
|
|
8
|
+
//# sourceMappingURL=DeskRowAvatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeskRowAvatar.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/DeskRowAvatar.tsx"],"names":[],"mappings":"AAGA,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,kFAAkF;AAClF,QAAA,MAAM,aAAa,GAAI,eAAe,kBAAkB,4CAQvD,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import TintedAvatar from "../../components/common/TintedAvatar";
|
|
4
|
+
/** 40px list avatar; the white ring keeps it visible on the active row's tint. */
|
|
5
|
+
const DeskRowAvatar = ({ name, src }) => (_jsx(TintedAvatar, { name: name, src: src, size: 40, className: "ring-2 ring-white", testId: "row-avatar-initials" }));
|
|
6
|
+
export default DeskRowAvatar;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
declare const TONES: {
|
|
3
|
+
readonly primary: "bg-primary-25 text-primary-500";
|
|
4
|
+
readonly warning: "bg-warning-25 text-warning-800";
|
|
5
|
+
readonly danger: "bg-danger-25 text-danger-800";
|
|
6
|
+
readonly neutral: "bg-[var(--dc-color-neutral-surface)] text-gray-900";
|
|
7
|
+
};
|
|
8
|
+
/** Small pill on the list row's meta line. */
|
|
9
|
+
declare const RowChip: ({ tone, children, }: {
|
|
10
|
+
tone: keyof typeof TONES;
|
|
11
|
+
children: ReactNode;
|
|
12
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export default RowChip;
|
|
14
|
+
//# sourceMappingURL=RowChip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RowChip.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/RowChip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,QAAA,MAAM,KAAK;;;;;CAKD,CAAC;AAEX,8CAA8C;AAC9C,QAAA,MAAM,OAAO,GAAI,qBAGd;IACD,IAAI,EAAE,MAAM,OAAO,KAAK,CAAC;IACzB,QAAQ,EAAE,SAAS,CAAC;CACrB,4CAUA,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import clsx from "clsx";
|
|
3
|
+
const TONES = {
|
|
4
|
+
primary: "bg-primary-25 text-primary-500",
|
|
5
|
+
warning: "bg-warning-25 text-warning-800",
|
|
6
|
+
danger: "bg-danger-25 text-danger-800",
|
|
7
|
+
neutral: "bg-[var(--dc-color-neutral-surface)] text-gray-900",
|
|
8
|
+
};
|
|
9
|
+
/** Small pill on the list row's meta line. */
|
|
10
|
+
const RowChip = ({ tone, children, }) => (_jsx("span", { "data-tone": tone, className: clsx("inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-full px-2 text-xs font-medium", TONES[tone]), children: children }));
|
|
11
|
+
export default RowChip;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const AVATAR_TINTS: readonly ["bg-secondary-25 text-secondary-600", "bg-primary-25 text-primary-500", "bg-success-25 text-success-900", "bg-warning-25 text-warning-800", "bg-[var(--dc-color-neutral-surface)] text-gray-900"];
|
|
2
|
+
/** Same name always gets the same tint, so a customer keeps their colour across lists. */
|
|
3
|
+
export declare const getAvatarTint: (name: string) => string;
|
|
4
|
+
/** Initials from the last two words that start with a letter ("Lê Quốc Bảo" -> "QB"). */
|
|
5
|
+
export declare const getInitials: (name: string) => string;
|
|
6
|
+
//# sourceMappingURL=avatarTint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatarTint.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/avatarTint.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,YAAY,6MAMf,CAAC;AAUX,0FAA0F;AAC1F,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAC8B,CAAC;AAE5E,yFAAyF;AACzF,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,MAO1C,CAAC"}
|