@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
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { IFilterSummary } from "../../store/type";
|
|
2
|
+
import type { ISessionSummaryResponse } from "../../types/dto";
|
|
3
|
+
interface SessionFolderListProps {
|
|
4
|
+
summary: ISessionSummaryResponse;
|
|
5
|
+
/** Set for a team's folders; undefined for "my messages". */
|
|
6
|
+
teamId?: string;
|
|
7
|
+
/** Id of the single active folder (see `getActiveFolderId`). */
|
|
8
|
+
activeFolderId: string;
|
|
9
|
+
onFilterSelect: (filter: IFilterSummary) => void;
|
|
10
|
+
/** Present only in "my messages", where the "all" row lives. */
|
|
11
|
+
allGroups?: {
|
|
12
|
+
active: boolean;
|
|
13
|
+
onSelect: () => void;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Folders of one scope. The "open" parent has two click targets: the label
|
|
18
|
+
* only reveals its children, the chevron collapses them. The API cannot list
|
|
19
|
+
* all open sessions at once, so the label never changes the filter.
|
|
20
|
+
*/
|
|
21
|
+
declare const SessionFolderList: ({ summary, teamId, activeFolderId, onFilterSelect, allGroups, }: SessionFolderListProps) => import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export default SessionFolderList;
|
|
23
|
+
//# sourceMappingURL=SessionFolderList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionFolderList.d.ts","sourceRoot":"","sources":["../../../src/components/session/SessionFolderList.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAQ3D,UAAU,sBAAsB;IAC9B,OAAO,EAAE,uBAAuB,CAAC;IACjC,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IACjD,gEAAgE;IAChE,SAAS,CAAC,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;CACvD;AAED;;;;GAIG;AACH,QAAA,MAAM,iBAAiB,GAAI,iEAMxB,sBAAsB,4CAyFxB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { useTranslation } from "react-i18next";
|
|
5
|
+
import { Tooltip } from "antd";
|
|
6
|
+
import { StrokeIcon } from "../../components/icon/StrokeIcon";
|
|
7
|
+
import { buildFolderId } from "../../store/sessionFolder";
|
|
8
|
+
import FolderRow, { FolderCount } from "./FolderRow";
|
|
9
|
+
import { getCompletedFilterConfig, getFilterCount, getOpenFilterConfigs, } from "./sessionFilters";
|
|
10
|
+
/**
|
|
11
|
+
* Folders of one scope. The "open" parent has two click targets: the label
|
|
12
|
+
* only reveals its children, the chevron collapses them. The API cannot list
|
|
13
|
+
* all open sessions at once, so the label never changes the filter.
|
|
14
|
+
*/
|
|
15
|
+
const SessionFolderList = ({ summary, teamId, activeFolderId, onFilterSelect, allGroups, }) => {
|
|
16
|
+
const { t } = useTranslation();
|
|
17
|
+
const [isOpenGroupExpanded, setIsOpenGroupExpanded] = useState(true);
|
|
18
|
+
const isTeam = !!teamId;
|
|
19
|
+
const completed = getCompletedFilterConfig();
|
|
20
|
+
const isActive = (filterKey) => activeFolderId ===
|
|
21
|
+
buildFolderId({ scope: isTeam ? "team" : "mine", teamId, filterKey });
|
|
22
|
+
const groupLabel = t("active_sessions");
|
|
23
|
+
const toggleLabel = t(isOpenGroupExpanded ? "folder_group_collapse" : "folder_group_expand", { name: groupLabel });
|
|
24
|
+
return (_jsxs("div", { className: "flex flex-col gap-0.5", "data-cp-name": "SessionFolderList", children: [_jsxs("div", { className: "flex items-center gap-0.5", children: [_jsxs("button", { type: "button", onClick: () => setIsOpenGroupExpanded(true), className: `flex h-9 min-w-0 flex-1 items-center gap-2.5 rounded-lg pr-2 text-left text-sm text-gray-900 hover:bg-gray-5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400 ${isTeam ? "pl-5" : "pl-2"}`, children: [_jsx(StrokeIcon, { name: "message-circle", size: 18, className: "text-gray-600" }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: groupLabel }), _jsx(FolderCount, { count: summary.activeSessionCount })] }), !isTeam && (_jsx(Tooltip, { title: toggleLabel, children: _jsx("button", { type: "button", "aria-label": toggleLabel, "aria-expanded": isOpenGroupExpanded, onClick: () => setIsOpenGroupExpanded((expanded) => !expanded), className: "flex h-7 w-7 shrink-0 items-center justify-center rounded-lg text-gray-600 hover:bg-gray-5 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400", children: _jsx(StrokeIcon, { name: isOpenGroupExpanded ? "chevron-down" : "chevron-right", size: 16 }) }) }))] }), (isTeam || isOpenGroupExpanded) &&
|
|
25
|
+
getOpenFilterConfigs(isTeam).map((config) => (_jsx("div", { className: "flex", children: _jsx(FolderRow, { label: t(config.labelKey), iconName: config.iconName, iconClassName: config.iconClassName, count: getFilterCount(config, summary), highlighted: config.highlighted, active: isActive(config.key), indentClassName: isTeam ? "pl-8" : "pl-7", onClick: () => onFilterSelect(Object.assign(Object.assign({}, config.filter), (teamId && { teamId }))) }) }, config.key))), completed && (_jsx("div", { className: "flex", children: _jsx(FolderRow, { label: t(completed.labelKey), iconName: completed.iconName, iconClassName: completed.iconClassName, count: getFilterCount(completed, summary), active: isActive(completed.key), indentClassName: isTeam ? "pl-5" : "pl-2", onClick: () => onFilterSelect(Object.assign(Object.assign({}, completed.filter), (teamId && { teamId }))) }) })), allGroups && (_jsx("div", { className: "flex", children: _jsx(FolderRow, { label: t("all_groups"), iconName: "inbox", iconClassName: "text-gray-600", active: allGroups.active, onClick: allGroups.onSelect }) }))] }));
|
|
26
|
+
};
|
|
27
|
+
export default SessionFolderList;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { IFilterSummary } from "../../store/type";
|
|
2
|
+
import type { ISessionSummaryResponse } from "../../types/dto";
|
|
3
|
+
import type { StrokeIconName } from "../../components/icon/strokeIconNodes";
|
|
4
|
+
export interface SessionFilterConfig {
|
|
5
|
+
key: string;
|
|
6
|
+
labelKey: string;
|
|
7
|
+
iconName: StrokeIconName;
|
|
8
|
+
iconClassName?: string;
|
|
9
|
+
filter: IFilterSummary;
|
|
10
|
+
countSource: "status" | "tag";
|
|
11
|
+
/** Only shown in team folders (unassigned sessions have no owner yet). */
|
|
12
|
+
teamOnly?: boolean;
|
|
13
|
+
/** Needs attention: the count is a red badge instead of plain text. */
|
|
14
|
+
highlighted?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare const SESSION_FILTER_CONFIGS: SessionFilterConfig[];
|
|
17
|
+
export declare const ALL_GROUPS_KEY = "ALL_GROUPS";
|
|
18
|
+
export declare const getFilterConfig: (key: string) => SessionFilterConfig | undefined;
|
|
19
|
+
/** Open-folder rows, without the completed one (it sits beside the "open" group). */
|
|
20
|
+
export declare const getOpenFilterConfigs: (includeUnassigned: boolean) => SessionFilterConfig[];
|
|
21
|
+
export declare const getCompletedFilterConfig: () => SessionFilterConfig | undefined;
|
|
22
|
+
/** Count shown next to a folder, from the summary; 0 when the summary has no entry. */
|
|
23
|
+
export declare const getFilterCount: (config: SessionFilterConfig, summary: ISessionSummaryResponse | undefined) => number;
|
|
24
|
+
//# sourceMappingURL=sessionFilters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionFilters.d.ts","sourceRoot":"","sources":["../../../src/components/session/sessionFilters.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAExE,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,cAAc,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,EAAE,QAAQ,GAAG,KAAK,CAAC;IAC9B,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,sBAAsB,EAAE,mBAAmB,EA8DvD,CAAC;AAEF,eAAO,MAAM,cAAc,eAAe,CAAC;AAE3C,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,oCACkB,CAAC;AAE9D,qFAAqF;AACrF,eAAO,MAAM,oBAAoB,GAAI,mBAAmB,OAAO,0BAK5D,CAAC;AAEJ,eAAO,MAAM,wBAAwB,uCAC4C,CAAC;AAElF,uFAAuF;AACvF,eAAO,MAAM,cAAc,GACzB,QAAQ,mBAAmB,EAC3B,SAAS,uBAAuB,GAAG,SAAS,KAC3C,MAMF,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { SessionStatus, SessionTag } from "../../types/chat";
|
|
2
|
+
export const SESSION_FILTER_CONFIGS = [
|
|
3
|
+
{
|
|
4
|
+
key: SessionStatus.UNASSIGNED,
|
|
5
|
+
labelKey: "unassigned",
|
|
6
|
+
iconName: "user-plus",
|
|
7
|
+
iconClassName: "text-warning-400",
|
|
8
|
+
filter: { status: SessionStatus.UNASSIGNED, tag: undefined },
|
|
9
|
+
countSource: "status",
|
|
10
|
+
teamOnly: true,
|
|
11
|
+
highlighted: true,
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
key: SessionTag.SLOW_PROCESSING,
|
|
15
|
+
labelKey: "slow_processing",
|
|
16
|
+
iconName: "alert-circle",
|
|
17
|
+
iconClassName: "text-danger-600",
|
|
18
|
+
filter: { status: undefined, tag: SessionTag.SLOW_PROCESSING },
|
|
19
|
+
countSource: "tag",
|
|
20
|
+
highlighted: true,
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
key: SessionStatus.WAITING_PROCESS,
|
|
24
|
+
labelKey: "waiting_process",
|
|
25
|
+
iconName: "clock",
|
|
26
|
+
iconClassName: "text-warning-400",
|
|
27
|
+
filter: { status: SessionStatus.WAITING_PROCESS, tag: undefined },
|
|
28
|
+
countSource: "status",
|
|
29
|
+
highlighted: true,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
key: SessionTag.AWAITING_REPLY,
|
|
33
|
+
labelKey: "awaiting_reply",
|
|
34
|
+
iconName: "reply",
|
|
35
|
+
iconClassName: "text-secondary-400",
|
|
36
|
+
filter: { status: undefined, tag: SessionTag.AWAITING_REPLY },
|
|
37
|
+
countSource: "tag",
|
|
38
|
+
highlighted: true,
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
key: SessionStatus.IN_PROCESS,
|
|
42
|
+
labelKey: "in_process",
|
|
43
|
+
iconName: "play-circle",
|
|
44
|
+
iconClassName: "text-primary-400",
|
|
45
|
+
filter: { status: SessionStatus.IN_PROCESS, tag: undefined },
|
|
46
|
+
countSource: "status",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
key: SessionTag.TEMPORARILY_PAUSED,
|
|
50
|
+
labelKey: "temporarily_paused",
|
|
51
|
+
iconName: "pause-circle",
|
|
52
|
+
iconClassName: "text-gray-600",
|
|
53
|
+
filter: { status: undefined, tag: SessionTag.TEMPORARILY_PAUSED },
|
|
54
|
+
countSource: "tag",
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
key: SessionStatus.COMPLETED,
|
|
58
|
+
labelKey: "closed_sessions",
|
|
59
|
+
iconName: "check-circle",
|
|
60
|
+
iconClassName: "text-gray-600",
|
|
61
|
+
filter: { status: SessionStatus.COMPLETED, tag: undefined },
|
|
62
|
+
countSource: "status",
|
|
63
|
+
},
|
|
64
|
+
];
|
|
65
|
+
export const ALL_GROUPS_KEY = "ALL_GROUPS";
|
|
66
|
+
export const getFilterConfig = (key) => SESSION_FILTER_CONFIGS.find((config) => config.key === key);
|
|
67
|
+
/** Open-folder rows, without the completed one (it sits beside the "open" group). */
|
|
68
|
+
export const getOpenFilterConfigs = (includeUnassigned) => SESSION_FILTER_CONFIGS.filter((config) => config.key !== SessionStatus.COMPLETED &&
|
|
69
|
+
(!config.teamOnly || includeUnassigned));
|
|
70
|
+
export const getCompletedFilterConfig = () => SESSION_FILTER_CONFIGS.find((config) => config.key === SessionStatus.COMPLETED);
|
|
71
|
+
/** Count shown next to a folder, from the summary; 0 when the summary has no entry. */
|
|
72
|
+
export const getFilterCount = (config, summary) => {
|
|
73
|
+
var _a, _b, _c;
|
|
74
|
+
if (!summary)
|
|
75
|
+
return 0;
|
|
76
|
+
if (config.key === SessionStatus.COMPLETED)
|
|
77
|
+
return (_a = summary.completedSessionCount) !== null && _a !== void 0 ? _a : 0;
|
|
78
|
+
const source = config.countSource === "status" ? summary.sessionStatuses : summary.tagCounts;
|
|
79
|
+
return (_c = (_b = source === null || source === void 0 ? void 0 : source.find((item) => item.type === config.key)) === null || _b === void 0 ? void 0 : _b.count) !== null && _c !== void 0 ? _c : 0;
|
|
80
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface ShortcutHelpModalProps {
|
|
2
|
+
open: boolean;
|
|
3
|
+
onClose: () => void;
|
|
4
|
+
}
|
|
5
|
+
/** Lists the desk shortcuts and lets the agent turn single-key ones off. */
|
|
6
|
+
declare const ShortcutHelpModal: ({ open, onClose }: ShortcutHelpModalProps) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export default ShortcutHelpModal;
|
|
8
|
+
//# sourceMappingURL=ShortcutHelpModal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShortcutHelpModal.d.ts","sourceRoot":"","sources":["../../../src/components/shortcut-help/ShortcutHelpModal.tsx"],"names":[],"mappings":"AAMA,UAAU,sBAAsB;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAiBD,4EAA4E;AAC5E,QAAA,MAAM,iBAAiB,GAAI,mBAAmB,sBAAsB,4CA6DnE,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Modal, Switch } from "antd";
|
|
4
|
+
import { StrokeIcon } from "../../components/icon/StrokeIcon";
|
|
5
|
+
import { useTranslation } from "react-i18next";
|
|
6
|
+
import useShortcutPrefsStore from "../../store/shortcutPrefs";
|
|
7
|
+
const SHORTCUTS = [
|
|
8
|
+
{ labelKey: "shortcut_next_prev", keys: ["J", "K"] },
|
|
9
|
+
{ labelKey: "shortcut_reply", keys: ["R"] },
|
|
10
|
+
{ labelKey: "shortcut_internal", keys: ["N"] },
|
|
11
|
+
{ labelKey: "shortcut_search", keys: ["/"] },
|
|
12
|
+
{ labelKey: "shortcut_escape", keys: ["Esc"] },
|
|
13
|
+
{ labelKey: "shortcut_help", keys: ["?"] },
|
|
14
|
+
];
|
|
15
|
+
const Kbd = ({ children }) => (_jsx("kbd", { 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: children }));
|
|
16
|
+
/** Lists the desk shortcuts and lets the agent turn single-key ones off. */
|
|
17
|
+
const ShortcutHelpModal = ({ open, onClose }) => {
|
|
18
|
+
const { t } = useTranslation();
|
|
19
|
+
const enabled = useShortcutPrefsStore((s) => s.singleKeyEnabled);
|
|
20
|
+
const setEnabled = useShortcutPrefsStore((s) => s.setSingleKeyEnabled);
|
|
21
|
+
return (_jsx(Modal, { open: open, onCancel: onClose, width: 480, destroyOnHidden: true, closable: { "aria-label": t("close_with_esc") }, "data-cp-name": "ShortcutHelpModal", title: _jsxs("span", { className: "flex items-center gap-3", children: [_jsx("span", { "aria-hidden": "true", className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-primary-25 text-primary-500", children: _jsx(StrokeIcon, { name: "keyboard", size: 20 }) }), t("shortcut_help_title")] }), footer: _jsxs("div", { className: "flex items-center gap-2 text-left", children: [_jsxs("span", { className: "flex flex-1 flex-col gap-0.5", children: [_jsx("span", { id: "shortcut-switch-label", className: "text-sm font-medium text-gray-900", children: t("shortcut_switch_label") }), _jsx("span", { className: "text-xs text-gray-600", children: t("shortcut_switch_hint") })] }), _jsx(Switch, { checked: enabled, onChange: setEnabled, "aria-labelledby": "shortcut-switch-label" })] }), children: _jsx("ul", { className: "m-0 list-none p-0", children: SHORTCUTS.map(({ labelKey, keys }, index) => (_jsxs("li", { className: `flex items-center justify-between py-2.5 text-sm text-gray-900 ${index > 0 ? "border-t border-gray-25" : ""}`, children: [_jsx("span", { children: t(labelKey) }), _jsx("span", { className: "flex gap-1", children: keys.map((key) => (_jsx(Kbd, { children: key }, key))) })] }, labelKey))) }) }));
|
|
22
|
+
};
|
|
23
|
+
export default ShortcutHelpModal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssignConfirmModal.d.ts","sourceRoot":"","sources":["../../../src/components/thread/AssignConfirmModal.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"AssignConfirmModal.d.ts","sourceRoot":"","sources":["../../../src/components/thread/AssignConfirmModal.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAIjD,UAAU,uBAAuB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,QAAA,MAAM,kBAAkB,GAAI,4DAOzB,uBAAuB,4CAuDzB,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Modal, Button
|
|
2
|
+
import { Modal, Button } from "antd";
|
|
3
3
|
import { useTranslation, Trans } from "react-i18next";
|
|
4
|
+
import TintedAvatar from "../../components/common/TintedAvatar";
|
|
4
5
|
const AssignConfirmModal = ({ open, agent, loading, onCancel, onConfirm, afterClose, }) => {
|
|
5
6
|
var _a;
|
|
6
7
|
const { t } = useTranslation();
|
|
7
|
-
return (_jsx(Modal, { open: open, onCancel: onCancel, footer: null, closable: !loading, centered: true,
|
|
8
|
+
return (_jsx(Modal, { open: open, onCancel: onCancel, footer: null, closable: !loading, centered: true, destroyOnHidden: true, width: 400, maskClosable: !loading, keyboard: !loading, afterClose: afterClose, "data-cp-name": "AssignConfirmModal", children: _jsxs("div", { className: "flex flex-col items-center gap-4 pt-2", role: "alertdialog", "aria-label": t("manual_assign_confirm_question", {
|
|
8
9
|
name: agent === null || agent === void 0 ? void 0 : agent.displayName,
|
|
9
|
-
}), children: [_jsx(
|
|
10
|
+
}), children: [_jsx(TintedAvatar, { name: (_a = agent === null || agent === void 0 ? void 0 : agent.displayName) !== null && _a !== void 0 ? _a : "", src: agent === null || agent === void 0 ? void 0 : agent.avatar, size: 48 }), _jsx("p", { className: "text-base text-center", children: _jsx(Trans, { i18nKey: "manual_assign_confirm_question", values: { name: agent === null || agent === void 0 ? void 0 : agent.displayName }, components: { bold: _jsx("strong", {}) } }) }), _jsxs("div", { className: "flex gap-3 w-full", children: [_jsx(Button, { className: "flex-1", size: "large", onClick: onCancel, disabled: loading, children: t("cancel") }), _jsx(Button, { type: "primary", className: "flex-1", size: "large", onClick: onConfirm, loading: loading, disabled: !agent, children: t("manual_assign_button_reassign") })] })] }) }));
|
|
10
11
|
};
|
|
11
12
|
export default AssignConfirmModal;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ISessionResponse } from "../../types/dto";
|
|
2
|
+
interface EndSessionConfirmProps {
|
|
3
|
+
open: boolean;
|
|
4
|
+
session: ISessionResponse;
|
|
5
|
+
customerName: string;
|
|
6
|
+
onConfirm: () => void;
|
|
7
|
+
onCancel: () => void;
|
|
8
|
+
}
|
|
9
|
+
declare const EndSessionConfirm: ({ open, session, customerName, onConfirm, onCancel, }: EndSessionConfirmProps) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export default EndSessionConfirm;
|
|
11
|
+
//# sourceMappingURL=EndSessionConfirm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EndSessionConfirm.d.ts","sourceRoot":"","sources":["../../../src/components/thread/EndSessionConfirm.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAK/C,UAAU,sBAAsB;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,gBAAgB,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAGD,QAAA,MAAM,iBAAiB,GAAI,uDAMxB,sBAAsB,4CAyCxB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useTranslation } from "react-i18next";
|
|
4
|
+
import ConfirmModal from "../../components/common/ConfirmModal";
|
|
5
|
+
import { END_SESSION_UNDO_MS } from "../../store/pendingSessionClose";
|
|
6
|
+
import { splitDisplayName } from "../../components/conversation/rowDisplayName";
|
|
7
|
+
import { formatSessionTime } from "./sessionDateFormat";
|
|
8
|
+
// Shared by the session card and the header status menu so both ask the same question.
|
|
9
|
+
const EndSessionConfirm = ({ open, session, customerName, onConfirm, onCancel, }) => {
|
|
10
|
+
var _a, _b;
|
|
11
|
+
const { t } = useTranslation();
|
|
12
|
+
const tagNames = (_a = session.labels) === null || _a === void 0 ? void 0 : _a.map((label) => label.name).join(", ");
|
|
13
|
+
const rows = [
|
|
14
|
+
{
|
|
15
|
+
label: t("end_session_row_session"),
|
|
16
|
+
value: t("end_session_session_value", {
|
|
17
|
+
order: session.order,
|
|
18
|
+
time: formatSessionTime(session.createdDate),
|
|
19
|
+
}),
|
|
20
|
+
},
|
|
21
|
+
{ label: t("end_session_row_tags"), value: tagNames || t("end_session_no_tags") },
|
|
22
|
+
{
|
|
23
|
+
label: t("end_session_row_owner"),
|
|
24
|
+
value: ((_b = session.supporter) === null || _b === void 0 ? void 0 : _b.fullName) || t("end_session_no_owner"),
|
|
25
|
+
},
|
|
26
|
+
];
|
|
27
|
+
return (_jsx(ConfirmModal, { open: open, title: t("end_session_title", { name: splitDisplayName(customerName).name }), okText: t("end_session_button"), cancelText: t("action_cancel"), onOk: onConfirm, onCancel: onCancel, getContainer: () => document.body, footerNote: t("end_session_undo_hint", {
|
|
28
|
+
count: Math.round(END_SESSION_UNDO_MS / 1000),
|
|
29
|
+
}), children: _jsx("dl", { className: "m-0 grid grid-cols-[96px_minmax(0,1fr)] gap-y-2 text-sm", children: rows.map((row) => (_jsxs("div", { className: "contents", children: [_jsx("dt", { className: "text-gray-600", children: row.label }), _jsx("dd", { className: "m-0 break-words", children: row.value })] }, row.label))) }) }));
|
|
30
|
+
};
|
|
31
|
+
export default EndSessionConfirm;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EndSessionToast.d.ts","sourceRoot":"","sources":["../../../src/components/thread/EndSessionToast.tsx"],"names":[],"mappings":"AAUA,UAAU,oBAAoB;IAC5B,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,QAAA,MAAM,eAAe,GAAI,YAAY,oBAAoB,4CA4BxD,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
import { useTranslation } from "react-i18next";
|
|
5
|
+
import { Button } from "antd";
|
|
6
|
+
import { StrokeIcon } from "../../components/icon/StrokeIcon";
|
|
7
|
+
import { END_SESSION_UNDO_MS } from "../../store/pendingSessionClose";
|
|
8
|
+
const TOTAL_SECONDS = Math.ceil(END_SESSION_UNDO_MS / 1000);
|
|
9
|
+
const EndSessionToast = ({ onUndo }) => {
|
|
10
|
+
const { t } = useTranslation();
|
|
11
|
+
const [secondsLeft, setSecondsLeft] = useState(TOTAL_SECONDS);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
const interval = setInterval(() => setSecondsLeft((value) => Math.max(value - 1, 0)), 1000);
|
|
14
|
+
return () => clearInterval(interval);
|
|
15
|
+
}, []);
|
|
16
|
+
return (_jsxs("span", { className: "inline-flex items-center gap-3", "data-cp-name": "EndSessionToast", children: [_jsx("span", { className: "font-medium", children: t("end_session_done") }), _jsx(Button, { type: "link", icon: _jsx(StrokeIcon, { name: "undo", size: 18 }), onClick: onUndo, className: "!h-8 !px-2 !font-medium", children: t("undo") }), _jsx("span", { className: "text-xs text-gray-600", children: t("end_session_seconds_left", { count: secondsLeft }) })] }));
|
|
17
|
+
};
|
|
18
|
+
export default EndSessionToast;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { ChangeEvent } from "react";
|
|
2
|
+
export type GroupInfoRow = "member-permission" | "admin-permission" | "invite-link";
|
|
3
|
+
export type GroupInfoConfirm = "leave" | "disband" | "delete";
|
|
4
|
+
export interface GroupInfoBodyCrmProps {
|
|
5
|
+
groupID: string;
|
|
6
|
+
groupName?: string;
|
|
7
|
+
faceURL?: string;
|
|
8
|
+
ownerUserID?: string;
|
|
9
|
+
introduction?: string;
|
|
10
|
+
memberCount?: number;
|
|
11
|
+
isPublic: boolean;
|
|
12
|
+
canEditAvatar: boolean;
|
|
13
|
+
canEditName: boolean;
|
|
14
|
+
canEditDescription: boolean;
|
|
15
|
+
canConfigPermissions: boolean;
|
|
16
|
+
showInviteLink: boolean;
|
|
17
|
+
showAllowSend: boolean;
|
|
18
|
+
isOwner: boolean;
|
|
19
|
+
isAdminOrOwner: boolean;
|
|
20
|
+
isViewOnlyMember: boolean;
|
|
21
|
+
notifyEnabled: boolean;
|
|
22
|
+
isTogglingNotification: boolean;
|
|
23
|
+
allowSendMessage: boolean;
|
|
24
|
+
isTogglingSendMessage: boolean;
|
|
25
|
+
isAvatarUploading: boolean;
|
|
26
|
+
isSaving: boolean;
|
|
27
|
+
editingField: "name" | "description" | null;
|
|
28
|
+
nameValue: string;
|
|
29
|
+
descriptionValue: string;
|
|
30
|
+
avatarInputRef: React.RefObject<HTMLInputElement>;
|
|
31
|
+
onNameChange: (value: string) => void;
|
|
32
|
+
onDescriptionChange: (value: string) => void;
|
|
33
|
+
onStartEdit: (field: "name" | "description") => void;
|
|
34
|
+
onCancelEdit: (field: "name" | "description") => void;
|
|
35
|
+
onSaveEdit: (field: "name" | "description") => void;
|
|
36
|
+
onAvatarClick: () => void;
|
|
37
|
+
onAvatarSelect: (event: ChangeEvent<HTMLInputElement>) => void;
|
|
38
|
+
onToggleNotification: (checked: boolean) => void;
|
|
39
|
+
onToggleSendMessage: (checked: boolean) => void;
|
|
40
|
+
onOpenRow: (row: GroupInfoRow) => void;
|
|
41
|
+
onConfirm: (action: GroupInfoConfirm) => void;
|
|
42
|
+
}
|
|
43
|
+
/** CRM body of the group info panel: identity, description, settings, admin rows, danger zone. */
|
|
44
|
+
declare const GroupInfoBodyCrm: (props: GroupInfoBodyCrmProps) => import("react/jsx-runtime").JSX.Element;
|
|
45
|
+
export default GroupInfoBodyCrm;
|
|
46
|
+
//# sourceMappingURL=GroupInfoBodyCrm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupInfoBodyCrm.d.ts","sourceRoot":"","sources":["../../../src/components/thread/GroupInfoBodyCrm.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAUzC,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,aAAa,CAAC;AACpF,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,sBAAsB,EAAE,OAAO,CAAC;IAChC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAAC;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAClD,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,KAAK,IAAI,CAAC;IACrD,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,KAAK,IAAI,CAAC;IACtD,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,KAAK,IAAI,CAAC;IACpD,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAC/D,oBAAoB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,mBAAmB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,SAAS,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;CAC/C;AA6BD,kGAAkG;AAClG,QAAA,MAAM,gBAAgB,GAAI,OAAO,qBAAqB,4CA8JrD,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
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 { Input } from "antd";
|
|
5
|
+
import { useTranslation } from "react-i18next";
|
|
6
|
+
import { CrmIcon as Icon } from "../../components/group/crmIcon";
|
|
7
|
+
import GroupCompositeAvatar from "../../components/group/GroupCompositeAvatar";
|
|
8
|
+
import { ACCEPTED_IMAGE_TYPES } from "../../utils/fileValidation";
|
|
9
|
+
import { FOCUS_RING_CLASS } from "../../utils/a11yClickable";
|
|
10
|
+
import { DangerRow, InfoCard, NavRow, SectionLabel, SwitchRow } from "./GroupInfoRows";
|
|
11
|
+
const ICON_BUTTON = `flex shrink-0 items-center justify-center rounded-lg text-gray-600 hover:bg-gray-5 ${FOCUS_RING_CLASS}`;
|
|
12
|
+
const Chip = ({ icon, tone, children }) => (_jsxs("span", { className: `inline-flex h-[22px] items-center gap-1 whitespace-nowrap rounded-full px-2 text-xs font-medium ${tone === "primary" ? "bg-primary-25 text-primary-500" : "bg-gray-25 text-gray-900"}`, children: [_jsx(Icon, { icon: icon, size: 12 }), children] }));
|
|
13
|
+
const EditActions = ({ disabled, canSave, onCancel, onSave }) => {
|
|
14
|
+
const { t } = useTranslation();
|
|
15
|
+
return (_jsxs("div", { className: "flex justify-end gap-2", children: [_jsx("button", { type: "button", disabled: disabled, onClick: onCancel, className: `h-8 rounded-lg border border-gray-50 bg-white px-3 text-sm font-medium text-gray-900 disabled:text-gray-300 ${FOCUS_RING_CLASS}`, children: t("action_cancel") }), _jsx("button", { type: "button", disabled: !canSave, onClick: onSave, className: `h-8 rounded-lg bg-primary-400 px-3 text-sm font-medium text-white disabled:bg-gray-75 disabled:text-gray-300 ${FOCUS_RING_CLASS}`, children: t("save") })] }));
|
|
16
|
+
};
|
|
17
|
+
/** CRM body of the group info panel: identity, description, settings, admin rows, danger zone. */
|
|
18
|
+
const GroupInfoBodyCrm = (props) => {
|
|
19
|
+
var _a, _b;
|
|
20
|
+
const { t } = useTranslation();
|
|
21
|
+
const descriptionRef = useRef(null);
|
|
22
|
+
const { editingField } = props;
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
var _a;
|
|
25
|
+
if (editingField === "description")
|
|
26
|
+
(_a = descriptionRef.current) === null || _a === void 0 ? void 0 : _a.focus({ cursor: "end" });
|
|
27
|
+
}, [editingField]);
|
|
28
|
+
const hasDescription = Boolean(props.introduction);
|
|
29
|
+
const nameChanged = props.nameValue.trim() !== "" && props.nameValue.trim() !== ((_a = props.groupName) !== null && _a !== void 0 ? _a : "");
|
|
30
|
+
const descChanged = props.descriptionValue.trim() !== ((_b = props.introduction) !== null && _b !== void 0 ? _b : "");
|
|
31
|
+
const hasAdminRows = props.canConfigPermissions || props.showInviteLink;
|
|
32
|
+
return (_jsxs("div", { className: "flex flex-1 flex-col gap-4 overflow-y-auto p-4", children: [_jsxs("div", { className: "flex items-center gap-3", children: [_jsxs("span", { className: "relative block h-[60px] w-[60px] shrink-0", children: [_jsx(GroupCompositeAvatar, { groupID: props.groupID, faceURL: props.faceURL, ownerUserID: props.ownerUserID, groupName: props.groupName, size: 56 }), props.isAvatarUploading && (_jsx("span", { className: "absolute left-0 top-0 flex h-14 w-14 items-center justify-center rounded-full bg-gray-900/30", children: _jsx("span", { className: "h-4 w-4 animate-spin rounded-full border-2 border-white border-t-transparent" }) })), props.canEditAvatar && (_jsxs(_Fragment, { children: [_jsx("input", { ref: props.avatarInputRef, type: "file", accept: ACCEPTED_IMAGE_TYPES.join(", "), className: "hidden", onChange: props.onAvatarSelect }), _jsx("button", { type: "button", disabled: props.isAvatarUploading, onClick: props.onAvatarClick, "aria-label": t("group_info_edit_avatar"), title: t("group_info_edit_avatar"), className: `absolute bottom-0 right-0 flex h-6 w-6 items-center justify-center rounded-full border-2 border-white bg-gray-900 text-white ${FOCUS_RING_CLASS}`, children: _jsx(Icon, { icon: "camera-o", size: 12 }) })] }))] }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [editingField === "name" ? (_jsx(Input, { autoFocus: true, value: props.nameValue, onChange: (event) => props.onNameChange(event.target.value), maxLength: 255, disabled: props.isSaving, "aria-label": t("group_info_edit_name"), onPressEnter: () => nameChanged && props.onSaveEdit("name") })) : (_jsxs("span", { className: "flex items-center gap-0.5", children: [_jsx("span", { className: "truncate text-base font-semibold text-gray-900", title: props.groupName, children: props.groupName }), props.canEditName && (_jsx("button", { type: "button", className: `h-7 w-7 ${ICON_BUTTON}`, onClick: () => props.onStartEdit("name"), "aria-label": t("group_info_edit_name"), title: t("group_info_edit_name"), children: _jsx(Icon, { icon: "edit-o", size: 16 }) }))] })), _jsxs("span", { className: "flex flex-wrap gap-1.5", children: [_jsx(Chip, { icon: props.isPublic ? "globe-o" : "lock-o", tone: "primary", children: t(props.isPublic ? "group_visibility_public" : "group_visibility_private") }), typeof props.memberCount === "number" && (_jsx(Chip, { icon: "user-two-o", tone: "neutral", children: t("member_count", { count: props.memberCount }) }))] })] })] }), editingField === "name" && (_jsx(EditActions, { disabled: props.isSaving, canSave: !props.isSaving && nameChanged, onCancel: () => props.onCancelEdit("name"), onSave: () => props.onSaveEdit("name") })), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "text-xs font-medium text-gray-600", children: t("description") }), editingField === "description" ? (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Input.TextArea, { ref: descriptionRef, value: props.descriptionValue, onChange: (event) => props.onDescriptionChange(event.target.value), placeholder: t("enter_group_description"), "aria-label": t("description"), autoSize: { minRows: 2, maxRows: 5 }, maxLength: 500, showCount: true, disabled: props.isSaving }), _jsx(EditActions, { disabled: props.isSaving, canSave: !props.isSaving && descChanged, onCancel: () => props.onCancelEdit("description"), onSave: () => props.onSaveEdit("description") })] })) : (_jsxs(_Fragment, { children: [_jsx("p", { className: "m-0 whitespace-pre-wrap break-words text-sm text-gray-600", children: hasDescription ? props.introduction : t("group_info_no_description") }), props.canEditDescription && (_jsxs("button", { type: "button", onClick: () => props.onStartEdit("description"), className: `flex h-6 items-center gap-1.5 self-start rounded-lg text-[13px] font-medium text-primary-500 hover:text-primary-600 ${FOCUS_RING_CLASS}`, children: [_jsx(Icon, { icon: hasDescription ? "edit-o" : "plus-o", size: 14 }), t(hasDescription ? "group_info_edit_description" : "group_info_add_description")] }))] }))] }), _jsx(SectionLabel, { children: t("group_settings_section") }), _jsx(InfoCard, { children: [
|
|
33
|
+
_jsx(SwitchRow, { icon: "bell-o", label: t("notification"), checked: props.notifyEnabled, loading: props.isTogglingNotification, onChange: props.onToggleNotification }, "notify"),
|
|
34
|
+
props.showAllowSend && (_jsx(SwitchRow, { icon: "chat-square-o", label: t("members_can_send_message"), hint: t("allow_send_message_hint"), checked: props.allowSendMessage, loading: props.isTogglingSendMessage, onChange: props.onToggleSendMessage }, "send")),
|
|
35
|
+
] }), hasAdminRows && (_jsxs(_Fragment, { children: [_jsx(SectionLabel, { children: t("group_admin_section") }), _jsx(InfoCard, { children: [
|
|
36
|
+
props.canConfigPermissions && _jsx(NavRow, { icon: "shield-o", label: t("member_permission_row"), onClick: () => props.onOpenRow("member-permission") }, "member"),
|
|
37
|
+
props.canConfigPermissions && _jsx(NavRow, { icon: "shield-o", label: t("admin_permission_row"), onClick: () => props.onOpenRow("admin-permission") }, "admin"),
|
|
38
|
+
props.showInviteLink && _jsx(NavRow, { icon: "link-alt-o", label: t("invite_via_link_short"), onClick: () => props.onOpenRow("invite-link") }, "invite"),
|
|
39
|
+
] })] })), _jsxs("div", { className: "flex flex-col gap-0.5 border-t border-gray-25 pt-2", children: [props.isAdminOrOwner && _jsx(DangerRow, { icon: "trash-o", label: t("group_delete_conversation"), onClick: () => props.onConfirm("delete") }), !props.isViewOnlyMember && _jsx(DangerRow, { icon: "logout-o", label: t("leave_group"), onClick: () => props.onConfirm("leave") }), !props.isViewOnlyMember && (_jsx(DangerRow, { icon: "user-del-o", label: t("disband_group"), onClick: () => props.onConfirm("disband"), disabledNote: props.isOwner ? undefined : t("group_owner_only") }))] })] }));
|
|
40
|
+
};
|
|
41
|
+
export default GroupInfoBodyCrm;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
export declare const SectionLabel: ({ children }: {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
/** Bordered card that stacks rows separated by hairlines inset past the icon. */
|
|
6
|
+
export declare const InfoCard: ({ children }: {
|
|
7
|
+
children: ReactNode[];
|
|
8
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
interface SwitchRowProps {
|
|
10
|
+
icon: string;
|
|
11
|
+
label: string;
|
|
12
|
+
hint?: string;
|
|
13
|
+
checked: boolean;
|
|
14
|
+
loading?: boolean;
|
|
15
|
+
onChange: (checked: boolean) => void;
|
|
16
|
+
}
|
|
17
|
+
export declare const SwitchRow: ({ icon, label, hint, checked, loading, onChange, }: SwitchRowProps) => import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
interface NavRowProps {
|
|
19
|
+
icon: string;
|
|
20
|
+
label: string;
|
|
21
|
+
onClick: () => void;
|
|
22
|
+
}
|
|
23
|
+
export declare const NavRow: ({ icon, label, onClick }: NavRowProps) => import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
interface DangerRowProps {
|
|
25
|
+
icon: string;
|
|
26
|
+
label: string;
|
|
27
|
+
onClick: () => void;
|
|
28
|
+
/** When set the row is disabled and the note explains why. */
|
|
29
|
+
disabledNote?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare const DangerRow: ({ icon, label, onClick, disabledNote }: DangerRowProps) => import("react/jsx-runtime").JSX.Element;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=GroupInfoRows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupInfoRows.d.ts","sourceRoot":"","sources":["../../../src/components/thread/GroupInfoRows.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,eAAO,MAAM,YAAY,GAAI,cAAc;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,4CAEjE,CAAC;AAEF,iFAAiF;AACjF,eAAO,MAAM,QAAQ,GAAI,cAAc;IAAE,QAAQ,EAAE,SAAS,EAAE,CAAA;CAAE,4CAY/D,CAAC;AAEF,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC;AAED,eAAO,MAAM,SAAS,GAAI,oDAOvB,cAAc,4CAmBhB,CAAC;AAEF,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,MAAM,GAAI,0BAA0B,WAAW,4CAa3D,CAAC;AAEF,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,SAAS,GAAI,wCAAwC,cAAc,4CAiB/E,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Switch } from "antd";
|
|
4
|
+
import clsx from "clsx";
|
|
5
|
+
import { CrmIcon as Icon } from "../../components/group/crmIcon";
|
|
6
|
+
import { FOCUS_RING_CLASS } from "../../utils/a11yClickable";
|
|
7
|
+
export const SectionLabel = ({ children }) => (_jsx("span", { className: "-mb-2 text-xs font-medium text-gray-600", children: children }));
|
|
8
|
+
/** Bordered card that stacks rows separated by hairlines inset past the icon. */
|
|
9
|
+
export const InfoCard = ({ children }) => {
|
|
10
|
+
const rows = children.filter(Boolean);
|
|
11
|
+
return (_jsx("div", { className: "flex flex-col overflow-hidden rounded-xl border border-gray-25", children: rows.map((row, index) => (_jsxs("div", { children: [index > 0 && _jsx("div", { "aria-hidden": "true", className: "ml-11 h-px bg-gray-25" }), row] }, index))) }));
|
|
12
|
+
};
|
|
13
|
+
export const SwitchRow = ({ icon, label, hint, checked, loading, onChange, }) => {
|
|
14
|
+
const id = `group-switch-${icon}`;
|
|
15
|
+
return (_jsxs("div", { className: "flex min-h-12 items-center gap-3 px-3 py-2", children: [_jsx(Icon, { icon: icon, size: 20, className: "shrink-0 text-gray-600" }), _jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [_jsx("span", { id: id, className: "text-sm text-gray-900", children: label }), hint && _jsx("span", { className: "text-xs leading-snug text-gray-600", children: hint })] }), _jsx(Switch, { checked: checked, loading: loading, onChange: onChange, "aria-labelledby": id })] }));
|
|
16
|
+
};
|
|
17
|
+
export const NavRow = ({ icon, label, onClick }) => (_jsxs("button", { type: "button", onClick: onClick, className: clsx("flex h-12 w-full items-center gap-3 px-3 text-left text-sm text-gray-900 hover:bg-gray-10", FOCUS_RING_CLASS), children: [_jsx(Icon, { icon: icon, size: 20, className: "shrink-0 text-gray-600" }), _jsx("span", { className: "flex-1", children: label }), _jsx(Icon, { icon: "angle-right-o", size: 16, className: "shrink-0 text-gray-600" })] }));
|
|
18
|
+
export const DangerRow = ({ icon, label, onClick, disabledNote }) => (_jsxs("button", { type: "button", onClick: onClick, disabled: Boolean(disabledNote), className: clsx("flex h-11 w-full items-center gap-3 rounded-lg px-3 text-left text-sm font-medium text-danger-600", disabledNote ? "cursor-not-allowed" : "hover:bg-danger-10", FOCUS_RING_CLASS), children: [_jsx(Icon, { icon: icon, size: 20, className: clsx("shrink-0", disabledNote && "opacity-50") }), _jsx("span", { className: clsx("flex-1", disabledNote && "opacity-50"), children: label }), disabledNote && (_jsx("span", { className: "text-xs font-normal text-gray-600", children: disabledNote }))] }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroupThreadInfo.d.ts","sourceRoot":"","sources":["../../../src/components/thread/GroupThreadInfo.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GroupThreadInfo.d.ts","sourceRoot":"","sources":["../../../src/components/thread/GroupThreadInfo.tsx"],"names":[],"mappings":"AA0BA,MAAM,WAAW,qBAAqB;IACpC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,UAAU,oBAAoB;IAC5B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AASD,QAAA,MAAM,eAAe,GAAI,qBAAqB,oBAAoB,mDAqrBjE,CAAC;AAEF,eAAe,eAAe,CAAC"}
|