@droppii-org/chat-sdk 0.6.56 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/canned-response/CannedResponseBody.d.ts.map +1 -1
- package/dist/components/canned-response/CannedResponseBody.js +4 -3
- package/dist/components/canned-response/CannedResponsePanel.d.ts +9 -0
- package/dist/components/canned-response/CannedResponsePanel.d.ts.map +1 -0
- package/dist/components/canned-response/CannedResponsePanel.js +72 -0
- package/dist/components/canned-response/CannedResponseRow.d.ts +10 -0
- package/dist/components/canned-response/CannedResponseRow.d.ts.map +1 -0
- package/dist/components/canned-response/CannedResponseRow.js +6 -0
- package/dist/components/canned-response/CannedScopeChips.d.ts +10 -0
- package/dist/components/canned-response/CannedScopeChips.d.ts.map +1 -0
- package/dist/components/canned-response/CannedScopeChips.js +34 -0
- package/dist/components/canned-response/cannedScopes.d.ts +16 -0
- package/dist/components/canned-response/cannedScopes.d.ts.map +1 -0
- package/dist/components/canned-response/cannedScopes.js +39 -0
- package/dist/components/canned-response/index.d.ts.map +1 -1
- package/dist/components/canned-response/index.js +11 -10
- package/dist/components/canned-response/insertCannedContent.d.ts +7 -0
- package/dist/components/canned-response/insertCannedContent.d.ts.map +1 -0
- package/dist/components/canned-response/insertCannedContent.js +39 -0
- package/dist/components/canned-response/team/TeamItem.d.ts.map +1 -1
- package/dist/components/canned-response/team/TeamItem.js +5 -4
- package/dist/components/common/ConfirmModal.d.ts +13 -1
- package/dist/components/common/ConfirmModal.d.ts.map +1 -1
- package/dist/components/common/ConfirmModal.js +24 -6
- package/dist/components/common/DeskPanelDrawer.d.ts +17 -0
- package/dist/components/common/DeskPanelDrawer.d.ts.map +1 -0
- package/dist/components/common/DeskPanelDrawer.js +21 -0
- package/dist/components/common/DeskSidePanel.d.ts +17 -0
- package/dist/components/common/DeskSidePanel.d.ts.map +1 -0
- package/dist/components/common/DeskSidePanel.js +23 -0
- package/dist/components/common/TintedAvatar.d.ts +11 -0
- package/dist/components/common/TintedAvatar.d.ts.map +1 -0
- package/dist/components/common/TintedAvatar.js +17 -0
- package/dist/components/compose/ComposeNewMessageModal.d.ts.map +1 -1
- package/dist/components/compose/ComposeNewMessageModal.js +11 -1
- package/dist/components/conversation/ConversationByGroupItem.d.ts.map +1 -1
- package/dist/components/conversation/ConversationByGroupItem.js +10 -6
- package/dist/components/conversation/ConversationBySessionItem.d.ts +4 -1
- package/dist/components/conversation/ConversationBySessionItem.d.ts.map +1 -1
- package/dist/components/conversation/ConversationBySessionItem.js +36 -10
- package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
- package/dist/components/conversation/DeskConversationList.js +44 -29
- package/dist/components/conversation/DeskConversationRow.d.ts +19 -0
- package/dist/components/conversation/DeskConversationRow.d.ts.map +1 -0
- package/dist/components/conversation/DeskConversationRow.js +18 -0
- package/dist/components/conversation/DeskListEmptyState.d.ts +6 -0
- package/dist/components/conversation/DeskListEmptyState.d.ts.map +1 -0
- package/dist/components/conversation/DeskListEmptyState.js +11 -0
- package/dist/components/conversation/DeskListHeader.d.ts +14 -0
- package/dist/components/conversation/DeskListHeader.d.ts.map +1 -0
- package/dist/components/conversation/DeskListHeader.js +39 -0
- package/dist/components/conversation/DeskListSkeleton.d.ts +6 -0
- package/dist/components/conversation/DeskListSkeleton.d.ts.map +1 -0
- package/dist/components/conversation/DeskListSkeleton.js +9 -0
- package/dist/components/conversation/DeskRowAvatar.d.ts +8 -0
- package/dist/components/conversation/DeskRowAvatar.d.ts.map +1 -0
- package/dist/components/conversation/DeskRowAvatar.js +6 -0
- package/dist/components/conversation/RowChip.d.ts +14 -0
- package/dist/components/conversation/RowChip.d.ts.map +1 -0
- package/dist/components/conversation/RowChip.js +11 -0
- package/dist/components/conversation/avatarTint.d.ts +6 -0
- package/dist/components/conversation/avatarTint.d.ts.map +1 -0
- package/dist/components/conversation/avatarTint.js +27 -0
- package/dist/components/conversation/folderEmptyState.d.ts +2 -0
- package/dist/components/conversation/folderEmptyState.d.ts.map +1 -0
- package/dist/components/conversation/folderEmptyState.js +14 -0
- package/dist/components/conversation/internalNotePreview.d.ts +6 -0
- package/dist/components/conversation/internalNotePreview.d.ts.map +1 -0
- package/dist/components/conversation/internalNotePreview.js +11 -0
- package/dist/components/conversation/listHeading.d.ts +19 -0
- package/dist/components/conversation/listHeading.d.ts.map +1 -0
- package/dist/components/conversation/listHeading.js +24 -0
- package/dist/components/conversation/rowDisplayName.d.ts +7 -0
- package/dist/components/conversation/rowDisplayName.d.ts.map +1 -0
- package/dist/components/conversation/rowDisplayName.js +8 -0
- package/dist/components/conversation/rowTime.d.ts +4 -0
- package/dist/components/conversation/rowTime.d.ts.map +1 -0
- package/dist/components/conversation/rowTime.js +10 -0
- package/dist/components/conversation-detail/PinLimitModal.d.ts.map +1 -1
- package/dist/components/conversation-detail/PinLimitModal.js +3 -1
- package/dist/components/group/AddMemberModal.d.ts.map +1 -1
- package/dist/components/group/AddMemberModal.js +15 -4
- package/dist/components/group/AdminPermissionModal.d.ts +1 -0
- package/dist/components/group/AdminPermissionModal.d.ts.map +1 -1
- package/dist/components/group/AdminPermissionModal.js +38 -3
- package/dist/components/group/CreateGroupForm.d.ts +3 -1
- package/dist/components/group/CreateGroupForm.d.ts.map +1 -1
- package/dist/components/group/CreateGroupForm.js +7 -1
- package/dist/components/group/CreateGroupFormCrmView.d.ts +23 -0
- package/dist/components/group/CreateGroupFormCrmView.d.ts.map +1 -0
- package/dist/components/group/CreateGroupFormCrmView.js +25 -0
- package/dist/components/group/DisableSendPermissionConfirm.d.ts +11 -0
- package/dist/components/group/DisableSendPermissionConfirm.d.ts.map +1 -0
- package/dist/components/group/DisableSendPermissionConfirm.js +10 -0
- package/dist/components/group/GroupCompositeAvatar.d.ts.map +1 -1
- package/dist/components/group/GroupCompositeAvatar.js +39 -4
- package/dist/components/group/GroupMemberPicker.d.ts +5 -2
- package/dist/components/group/GroupMemberPicker.d.ts.map +1 -1
- package/dist/components/group/GroupMemberPicker.js +8 -42
- package/dist/components/group/GroupMemberPickerCrm.d.ts +4 -0
- package/dist/components/group/GroupMemberPickerCrm.d.ts.map +1 -0
- package/dist/components/group/GroupMemberPickerCrm.js +48 -0
- package/dist/components/group/GroupMemberPickerLegacy.d.ts +8 -0
- package/dist/components/group/GroupMemberPickerLegacy.d.ts.map +1 -0
- package/dist/components/group/GroupMemberPickerLegacy.js +46 -0
- package/dist/components/group/GroupPanelHeader.d.ts +10 -0
- package/dist/components/group/GroupPanelHeader.d.ts.map +1 -0
- package/dist/components/group/GroupPanelHeader.js +11 -0
- package/dist/components/group/MemberPermissionPanel.d.ts.map +1 -1
- package/dist/components/group/MemberPermissionPanel.js +31 -2
- package/dist/components/group/PermissionPanelCrm.d.ts +24 -0
- package/dist/components/group/PermissionPanelCrm.d.ts.map +1 -0
- package/dist/components/group/PermissionPanelCrm.js +16 -0
- package/dist/components/group/PersonAvatar.d.ts +11 -0
- package/dist/components/group/PersonAvatar.d.ts.map +1 -0
- package/dist/components/group/PersonAvatar.js +21 -0
- package/dist/components/group/crmIcon.d.ts +9 -0
- package/dist/components/group/crmIcon.d.ts.map +1 -0
- package/dist/components/group/crmIcon.js +38 -0
- package/dist/components/icon/AdaptiveIcon.d.ts +15 -0
- package/dist/components/icon/AdaptiveIcon.d.ts.map +1 -0
- package/dist/components/icon/AdaptiveIcon.js +10 -0
- package/dist/components/icon/StrokeIcon.d.ts +14 -0
- package/dist/components/icon/StrokeIcon.d.ts.map +1 -0
- package/dist/components/icon/StrokeIcon.js +5 -0
- package/dist/components/icon/strokeIconNodes.d.ts +431 -0
- package/dist/components/icon/strokeIconNodes.d.ts.map +1 -0
- package/dist/components/icon/strokeIconNodes.js +269 -0
- package/dist/components/media-collection/index.d.ts.map +1 -1
- package/dist/components/media-collection/index.js +21 -5
- package/dist/components/message/GroupMembersDrawer.d.ts.map +1 -1
- package/dist/components/message/GroupMembersDrawer.js +60 -13
- package/dist/components/message/GroupMembersPanelCrm.d.ts +23 -0
- package/dist/components/message/GroupMembersPanelCrm.d.ts.map +1 -0
- package/dist/components/message/GroupMembersPanelCrm.js +55 -0
- package/dist/components/message/MessageHeader.d.ts.map +1 -1
- package/dist/components/message/MessageHeader.js +76 -27
- package/dist/components/message/MessageInfiniteScroll.d.ts +4 -2
- package/dist/components/message/MessageInfiniteScroll.d.ts.map +1 -1
- package/dist/components/message/MessageInfiniteScroll.js +1 -1
- package/dist/components/message/MessageList.d.ts +2 -1
- package/dist/components/message/MessageList.d.ts.map +1 -1
- package/dist/components/message/MessageList.js +12 -1
- package/dist/components/message/SelectSession.d.ts +4 -1
- package/dist/components/message/SelectSession.d.ts.map +1 -1
- package/dist/components/message/SelectSession.js +13 -4
- package/dist/components/message/UnassignedSessionFooter.js +2 -2
- package/dist/components/message/footer/ActionBar.d.ts +5 -1
- package/dist/components/message/footer/ActionBar.d.ts.map +1 -1
- package/dist/components/message/footer/ActionBar.js +14 -1
- package/dist/components/message/footer/CannedResponsePlugin.d.ts.map +1 -1
- package/dist/components/message/footer/CannedResponsePlugin.js +18 -3
- package/dist/components/message/footer/ClosedSessionBanner.d.ts +9 -0
- package/dist/components/message/footer/ClosedSessionBanner.d.ts.map +1 -0
- package/dist/components/message/footer/ClosedSessionBanner.js +13 -0
- package/dist/components/message/footer/ComposerEditor.d.ts.map +1 -1
- package/dist/components/message/footer/ComposerEditor.js +9 -4
- package/dist/components/message/footer/ComposerTabs.d.ts +1 -2
- package/dist/components/message/footer/ComposerTabs.d.ts.map +1 -1
- package/dist/components/message/footer/ComposerTabs.js +14 -35
- package/dist/components/message/footer/CrmComposerCard.d.ts +11 -0
- package/dist/components/message/footer/CrmComposerCard.d.ts.map +1 -0
- package/dist/components/message/footer/CrmComposerCard.js +30 -0
- package/dist/components/message/footer/EnterHandler.d.ts.map +1 -1
- package/dist/components/message/footer/EnterHandler.js +3 -0
- package/dist/components/message/footer/FilePreview.js +2 -2
- package/dist/components/message/footer/LinkInputPreview.js +2 -2
- package/dist/components/message/footer/MediaActions.d.ts +2 -1
- package/dist/components/message/footer/MediaActions.d.ts.map +1 -1
- package/dist/components/message/footer/MediaActions.js +21 -4
- package/dist/components/message/footer/SessionClosedModal.d.ts +3 -1
- package/dist/components/message/footer/SessionClosedModal.d.ts.map +1 -1
- package/dist/components/message/footer/SessionClosedModal.js +6 -2
- package/dist/components/message/footer/ToolbarPlugin.d.ts +3 -1
- package/dist/components/message/footer/ToolbarPlugin.d.ts.map +1 -1
- package/dist/components/message/footer/ToolbarPlugin.js +2 -2
- package/dist/components/message/footer/clearComposerHistory.d.ts +3 -0
- package/dist/components/message/footer/clearComposerHistory.d.ts.map +1 -0
- package/dist/components/message/footer/clearComposerHistory.js +11 -0
- package/dist/components/message/footer/index.d.ts +2 -2
- package/dist/components/message/footer/index.d.ts.map +1 -1
- package/dist/components/message/footer/index.js +15 -5
- package/dist/components/message/footer/mention/MentionMenu.d.ts.map +1 -1
- package/dist/components/message/footer/mention/MentionMenu.js +4 -1
- package/dist/components/message/footer/useComposerFocusRequest.d.ts +10 -0
- package/dist/components/message/footer/useComposerFocusRequest.d.ts.map +1 -0
- package/dist/components/message/footer/useComposerFocusRequest.js +28 -0
- package/dist/components/message/groupMemberMenuCrm.d.ts +32 -0
- package/dist/components/message/groupMemberMenuCrm.d.ts.map +1 -0
- package/dist/components/message/groupMemberMenuCrm.js +83 -0
- package/dist/components/message/groupMemberTypes.d.ts +13 -0
- package/dist/components/message/groupMemberTypes.d.ts.map +1 -0
- package/dist/components/message/groupMemberTypes.js +1 -0
- package/dist/components/message/headerIconButton.d.ts +10 -0
- package/dist/components/message/headerIconButton.d.ts.map +1 -0
- package/dist/components/message/headerIconButton.js +9 -0
- package/dist/components/message/item/CrmSystemLine.d.ts +10 -0
- package/dist/components/message/item/CrmSystemLine.d.ts.map +1 -0
- package/dist/components/message/item/CrmSystemLine.js +6 -0
- package/dist/components/message/item/DateDivider.d.ts +5 -0
- package/dist/components/message/item/DateDivider.d.ts.map +1 -0
- package/dist/components/message/item/DateDivider.js +5 -0
- package/dist/components/message/item/GroupNotificationMessage.d.ts.map +1 -1
- package/dist/components/message/item/GroupNotificationMessage.js +9 -0
- package/dist/components/message/item/MemberEventSummary.d.ts +8 -0
- package/dist/components/message/item/MemberEventSummary.d.ts.map +1 -0
- package/dist/components/message/item/MemberEventSummary.js +18 -0
- package/dist/components/message/item/MessageBubble.d.ts +3 -1
- package/dist/components/message/item/MessageBubble.d.ts.map +1 -1
- package/dist/components/message/item/MessageBubble.js +27 -13
- package/dist/components/message/item/MessageMoreButton.d.ts +13 -0
- package/dist/components/message/item/MessageMoreButton.d.ts.map +1 -0
- package/dist/components/message/item/MessageMoreButton.js +42 -0
- package/dist/components/message/item/RevokeMessage.js +1 -1
- package/dist/components/message/item/SessionEventMessage.d.ts.map +1 -1
- package/dist/components/message/item/SessionEventMessage.js +13 -1
- package/dist/components/message/item/SystemLogMessage.d.ts.map +1 -1
- package/dist/components/message/item/SystemLogMessage.js +7 -0
- package/dist/components/message/item/index.d.ts.map +1 -1
- package/dist/components/message/item/index.js +64 -15
- package/dist/components/message/item/otherSenders.d.ts +7 -0
- package/dist/components/message/item/otherSenders.d.ts.map +1 -0
- package/dist/components/message/item/otherSenders.js +29 -0
- package/dist/components/message/item/textStyle.d.ts +1 -1
- package/dist/components/message/item/textStyle.d.ts.map +1 -1
- package/dist/components/message/item/textStyle.js +2 -2
- package/dist/components/message/messageKeyboardNav.d.ts +8 -0
- package/dist/components/message/messageKeyboardNav.d.ts.map +1 -0
- package/dist/components/message/messageKeyboardNav.js +24 -0
- package/dist/components/message/reply/ReplyPreviewBar.js +2 -2
- package/dist/components/message/toolbox/MessageToolboxMenu.d.ts.map +1 -1
- package/dist/components/message/toolbox/MessageToolboxMenu.js +16 -1
- package/dist/components/search-conversation/SearchAll.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchAll.js +12 -1
- package/dist/components/search-conversation/SearchDrawer.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchDrawer.js +31 -15
- package/dist/components/search-conversation/SearchMessageOnCurrentConversation.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchMessageOnCurrentConversation.js +5 -2
- package/dist/components/search-conversation/index.d.ts.map +1 -1
- package/dist/components/search-conversation/index.js +3 -1
- package/dist/components/search-conversation/item/SearchItemAsGroup.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsGroup.js +14 -4
- package/dist/components/search-conversation/item/SearchItemAsMessage.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsMessage.js +18 -7
- package/dist/components/search-conversation/item/SearchItemAsUser.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsUser.js +23 -5
- package/dist/components/search-conversation/item/searchRowClass.d.ts +3 -0
- package/dist/components/search-conversation/item/searchRowClass.d.ts.map +1 -0
- package/dist/components/search-conversation/item/searchRowClass.js +5 -0
- package/dist/components/session/DeskAssignedSession.d.ts +5 -1
- package/dist/components/session/DeskAssignedSession.d.ts.map +1 -1
- package/dist/components/session/DeskAssignedSession.js +40 -12
- package/dist/components/session/DeskTeamInbox.d.ts.map +1 -1
- package/dist/components/session/DeskTeamInbox.js +15 -22
- package/dist/components/session/FolderRow.d.ts +21 -0
- package/dist/components/session/FolderRow.d.ts.map +1 -0
- package/dist/components/session/FolderRow.js +16 -0
- package/dist/components/session/SessionFolderList.d.ts +23 -0
- package/dist/components/session/SessionFolderList.d.ts.map +1 -0
- package/dist/components/session/SessionFolderList.js +27 -0
- package/dist/components/session/sessionFilters.d.ts +24 -0
- package/dist/components/session/sessionFilters.d.ts.map +1 -0
- package/dist/components/session/sessionFilters.js +80 -0
- package/dist/components/shortcut-help/ShortcutHelpModal.d.ts +8 -0
- package/dist/components/shortcut-help/ShortcutHelpModal.d.ts.map +1 -0
- package/dist/components/shortcut-help/ShortcutHelpModal.js +23 -0
- package/dist/components/thread/AssignConfirmModal.d.ts.map +1 -1
- package/dist/components/thread/AssignConfirmModal.js +4 -3
- package/dist/components/thread/EndSessionConfirm.d.ts +11 -0
- package/dist/components/thread/EndSessionConfirm.d.ts.map +1 -0
- package/dist/components/thread/EndSessionConfirm.js +31 -0
- package/dist/components/thread/EndSessionToast.d.ts +6 -0
- package/dist/components/thread/EndSessionToast.d.ts.map +1 -0
- package/dist/components/thread/EndSessionToast.js +18 -0
- package/dist/components/thread/GroupInfoBodyCrm.d.ts +46 -0
- package/dist/components/thread/GroupInfoBodyCrm.d.ts.map +1 -0
- package/dist/components/thread/GroupInfoBodyCrm.js +41 -0
- package/dist/components/thread/GroupInfoRows.d.ts +33 -0
- package/dist/components/thread/GroupInfoRows.d.ts.map +1 -0
- package/dist/components/thread/GroupInfoRows.js +18 -0
- package/dist/components/thread/GroupThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/GroupThreadInfo.js +23 -6
- package/dist/components/thread/ManualAssignPopover.d.ts +3 -1
- package/dist/components/thread/ManualAssignPopover.d.ts.map +1 -1
- package/dist/components/thread/ManualAssignPopover.js +21 -9
- package/dist/components/thread/SessionDetailCard.d.ts +6 -0
- package/dist/components/thread/SessionDetailCard.d.ts.map +1 -0
- package/dist/components/thread/SessionDetailCard.js +103 -0
- package/dist/components/thread/SessionSection.d.ts +2 -4
- package/dist/components/thread/SessionSection.d.ts.map +1 -1
- package/dist/components/thread/SessionSection.js +19 -122
- package/dist/components/thread/SessionTagPicker.d.ts +11 -0
- package/dist/components/thread/SessionTagPicker.d.ts.map +1 -0
- package/dist/components/thread/SessionTagPicker.js +27 -0
- package/dist/components/thread/SingleThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/SingleThreadInfo.js +16 -6
- package/dist/components/thread/SupportSessionPanel.d.ts +18 -0
- package/dist/components/thread/SupportSessionPanel.d.ts.map +1 -0
- package/dist/components/thread/SupportSessionPanel.js +46 -0
- package/dist/components/thread/ThreadInfo.d.ts +8 -1
- package/dist/components/thread/ThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/ThreadInfo.js +27 -29
- package/dist/components/thread/ThreadInfoHeader.d.ts +13 -0
- package/dist/components/thread/ThreadInfoHeader.d.ts.map +1 -0
- package/dist/components/thread/ThreadInfoHeader.js +11 -0
- package/dist/components/thread/UserSection.d.ts.map +1 -1
- package/dist/components/thread/UserSection.js +35 -22
- package/dist/components/thread/sessionDateFormat.d.ts +3 -0
- package/dist/components/thread/sessionDateFormat.d.ts.map +1 -0
- package/dist/components/thread/sessionDateFormat.js +13 -0
- package/dist/components/thread/sessionDuration.d.ts +5 -0
- package/dist/components/thread/sessionDuration.d.ts.map +1 -0
- package/dist/components/thread/sessionDuration.js +24 -0
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +2 -0
- package/dist/constants/layout.d.ts +24 -0
- package/dist/constants/layout.d.ts.map +1 -0
- package/dist/constants/layout.js +23 -0
- package/dist/context/ChatContext.d.ts.map +1 -1
- package/dist/context/ChatContext.js +27 -1
- package/dist/hooks/canned-response/useSearchCannedAcrossScopes.d.ts +7 -0
- package/dist/hooks/canned-response/useSearchCannedAcrossScopes.d.ts.map +1 -0
- package/dist/hooks/canned-response/useSearchCannedAcrossScopes.js +46 -0
- package/dist/hooks/common/useCloseOnSidePanelOpen.d.ts +3 -0
- package/dist/hooks/common/useCloseOnSidePanelOpen.d.ts.map +1 -0
- package/dist/hooks/common/useCloseOnSidePanelOpen.js +15 -0
- package/dist/hooks/common/useDeskShortcuts.d.ts +11 -0
- package/dist/hooks/common/useDeskShortcuts.d.ts.map +1 -0
- package/dist/hooks/common/useDeskShortcuts.js +94 -0
- package/dist/hooks/common/useEscapeLayer.d.ts +3 -0
- package/dist/hooks/common/useEscapeLayer.d.ts.map +1 -0
- package/dist/hooks/common/useEscapeLayer.js +18 -0
- package/dist/hooks/common/useMediaQuery.d.ts +3 -0
- package/dist/hooks/common/useMediaQuery.d.ts.map +1 -0
- package/dist/hooks/common/useMediaQuery.js +12 -0
- package/dist/hooks/common/useSidePanel.d.ts +12 -0
- package/dist/hooks/common/useSidePanel.d.ts.map +1 -0
- package/dist/hooks/common/useSidePanel.js +32 -0
- package/dist/hooks/group/useConversationGroups.d.ts.map +1 -1
- package/dist/hooks/group/useConversationGroups.js +3 -0
- package/dist/hooks/message/useNewMessageAnnouncement.d.ts +3 -0
- package/dist/hooks/message/useNewMessageAnnouncement.d.ts.map +1 -0
- package/dist/hooks/message/useNewMessageAnnouncement.js +30 -0
- package/dist/hooks/search/useSearchGroups.js +2 -1
- package/dist/hooks/search/useSearchMessage.d.ts +3 -1
- package/dist/hooks/search/useSearchMessage.d.ts.map +1 -1
- package/dist/hooks/search/useSearchMessage.js +2 -2
- package/dist/hooks/session/useBotSessionOwnerIdentity.d.ts +12 -0
- package/dist/hooks/session/useBotSessionOwnerIdentity.d.ts.map +1 -0
- package/dist/hooks/session/useBotSessionOwnerIdentity.js +22 -0
- package/dist/hooks/session/useCloseSession.d.ts +1 -0
- package/dist/hooks/session/useCloseSession.d.ts.map +1 -1
- package/dist/hooks/session/useCloseSession.js +9 -8
- package/dist/hooks/session/useEndSession.d.ts +11 -0
- package/dist/hooks/session/useEndSession.d.ts.map +1 -0
- package/dist/hooks/session/useEndSession.js +45 -0
- package/dist/hooks/session/useGetSession.d.ts.map +1 -1
- package/dist/hooks/session/useGetSession.js +27 -6
- package/dist/hooks/session/usePendingSessionClose.d.ts +5 -0
- package/dist/hooks/session/usePendingSessionClose.d.ts.map +1 -0
- package/dist/hooks/session/usePendingSessionClose.js +12 -0
- package/dist/hooks/session/useSessionCustomerName.d.ts +3 -0
- package/dist/hooks/session/useSessionCustomerName.d.ts.map +1 -0
- package/dist/hooks/session/useSessionCustomerName.js +19 -0
- package/dist/hooks/session/useSessionFieldAutosave.d.ts +19 -0
- package/dist/hooks/session/useSessionFieldAutosave.d.ts.map +1 -0
- package/dist/hooks/session/useSessionFieldAutosave.js +52 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/locales/vi/common.json +201 -21
- package/dist/locales/vi/conversation-inbox.json +21 -2
- package/dist/screens/desk-message/DeskWorkspace.d.ts +12 -0
- package/dist/screens/desk-message/DeskWorkspace.d.ts.map +1 -0
- package/dist/screens/desk-message/DeskWorkspace.js +57 -0
- package/dist/screens/desk-message/FolderOverlay.d.ts +4 -0
- package/dist/screens/desk-message/FolderOverlay.d.ts.map +1 -0
- package/dist/screens/desk-message/FolderOverlay.js +32 -0
- package/dist/screens/desk-message/SkipLinks.d.ts +4 -0
- package/dist/screens/desk-message/SkipLinks.d.ts.map +1 -0
- package/dist/screens/desk-message/SkipLinks.js +19 -0
- package/dist/screens/desk-message/ViewportNotice.d.ts +4 -0
- package/dist/screens/desk-message/ViewportNotice.d.ts.map +1 -0
- package/dist/screens/desk-message/ViewportNotice.js +9 -0
- package/dist/screens/desk-message/index.d.ts +3 -2
- package/dist/screens/desk-message/index.d.ts.map +1 -1
- package/dist/screens/desk-message/index.js +4 -12
- package/dist/store/deskPanelHost.d.ts +13 -0
- package/dist/store/deskPanelHost.d.ts.map +1 -0
- package/dist/store/deskPanelHost.js +9 -0
- package/dist/store/escapeLayers.d.ts +15 -0
- package/dist/store/escapeLayers.d.ts.map +1 -0
- package/dist/store/escapeLayers.js +15 -0
- package/dist/store/pendingSessionClose.d.ts +19 -0
- package/dist/store/pendingSessionClose.d.ts.map +1 -0
- package/dist/store/pendingSessionClose.js +74 -0
- package/dist/store/session.d.ts +2 -1
- package/dist/store/session.d.ts.map +1 -1
- package/dist/store/session.js +4 -1
- package/dist/store/sessionFolder.d.ts +15 -0
- package/dist/store/sessionFolder.d.ts.map +1 -0
- package/dist/store/sessionFolder.js +18 -0
- package/dist/store/shortcutPrefs.d.ts +9 -0
- package/dist/store/shortcutPrefs.d.ts.map +1 -0
- package/dist/store/shortcutPrefs.js +23 -0
- package/dist/store/sidePanel.d.ts +12 -0
- package/dist/store/sidePanel.d.ts.map +1 -0
- package/dist/store/sidePanel.js +9 -0
- package/dist/store/workspaceLayout.d.ts +12 -0
- package/dist/store/workspaceLayout.d.ts.map +1 -0
- package/dist/store/workspaceLayout.js +9 -0
- package/dist/styles/global.css +1 -1
- package/dist/types/chat.d.ts +18 -0
- package/dist/types/chat.d.ts.map +1 -1
- package/dist/types/dto.d.ts +2 -1
- package/dist/types/dto.d.ts.map +1 -1
- package/dist/utils/a11yClickable.d.ts +10 -0
- package/dist/utils/a11yClickable.d.ts.map +1 -0
- package/dist/utils/a11yClickable.js +15 -0
- package/dist/utils/events.d.ts +4 -0
- package/dist/utils/events.d.ts.map +1 -1
- package/dist/utils/headerMemberCount.d.ts +10 -0
- package/dist/utils/headerMemberCount.d.ts.map +1 -0
- package/dist/utils/headerMemberCount.js +3 -0
- package/dist/utils/memberEventRun.d.ts +16 -0
- package/dist/utils/memberEventRun.d.ts.map +1 -0
- package/dist/utils/memberEventRun.js +40 -0
- package/package.json +2 -2
- package/dist/components/session/SessionFilterMenu.d.ts +0 -15
- package/dist/components/session/SessionFilterMenu.d.ts.map +0 -1
- package/dist/components/session/SessionFilterMenu.js +0 -30
- package/dist/components/session/sessionMenuItems.d.ts +0 -28
- package/dist/components/session/sessionMenuItems.d.ts.map +0 -1
- package/dist/components/session/sessionMenuItems.js +0 -119
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CannedResponseBody.d.ts","sourceRoot":"","sources":["../../../src/components/canned-response/CannedResponseBody.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CannedResponseBody.d.ts","sourceRoot":"","sources":["../../../src/components/canned-response/CannedResponseBody.tsx"],"names":[],"mappings":"AAkBA,UAAU,wBAAwB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AASD,QAAA,MAAM,kBAAkB,GAAI,OAAO,wBAAwB,4CAiN1D,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { clickableProps, FOCUS_RING_CLASS } from "../../utils/a11yClickable";
|
|
2
3
|
import { Empty, Segmented, Spin } from "antd";
|
|
3
4
|
import { useFetchMyTeams } from "../../hooks/team/useFetchMyTeam";
|
|
4
5
|
import { useTranslation } from "react-i18next";
|
|
@@ -97,13 +98,13 @@ const CannedResponseBody = (props) => {
|
|
|
97
98
|
const htmlContent = (canned === null || canned === void 0 ? void 0 : canned.content) || "";
|
|
98
99
|
// 🔒 Sanitize HTML to prevent XSS attacks
|
|
99
100
|
const sanitizedContent = sanitizeHtml(htmlContent);
|
|
100
|
-
return (_jsxs("div", { ref: (el) => {
|
|
101
|
+
return (_jsxs("div", Object.assign({ ref: (el) => {
|
|
101
102
|
itemRefs.current[index] = el;
|
|
102
|
-
}, className: clsx("flex flex-col flex-1 px-3 py-2 cursor-pointer hover:bg-blue-100 w-full border-b border-gray-200", isActive && "bg-blue-100"),
|
|
103
|
+
}, className: clsx("flex flex-col flex-1 px-3 py-2 cursor-pointer hover:bg-blue-100 w-full border-b border-gray-200", FOCUS_RING_CLASS, isActive && "bg-blue-100") }, clickableProps(() => onSelectCannedResponse === null || onSelectCannedResponse === void 0 ? void 0 : onSelectCannedResponse(sanitizedContent)), { children: [_jsxs("span", { className: "text-xs truncate text-gray-500", children: [`${((_a = canned === null || canned === void 0 ? void 0 : canned.category) === null || _a === void 0 ? void 0 : _a.name)
|
|
103
104
|
? `${(_b = canned === null || canned === void 0 ? void 0 : canned.category) === null || _b === void 0 ? void 0 : _b.name} / `
|
|
104
105
|
: ""}`, _jsx("span", { className: "text-black", children: `${(canned === null || canned === void 0 ? void 0 : canned.name) || ""} ` }), _jsx("span", { children: "/" }), _jsx("span", { className: "text-blue-500", children: ` #${(canned === null || canned === void 0 ? void 0 : canned.shortcut) || ""}` })] }), _jsx("div", { dangerouslySetInnerHTML: {
|
|
105
106
|
__html: sanitizedContent,
|
|
106
|
-
}, className: "text-sm mt-1" })] }, canned === null || canned === void 0 ? void 0 : canned.id));
|
|
107
|
+
}, className: "text-sm mt-1" })] }), canned === null || canned === void 0 ? void 0 : canned.id));
|
|
107
108
|
})) })] })] }));
|
|
108
109
|
};
|
|
109
110
|
export default CannedResponseBody;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CannedCreateRequest } from "../../types/chat";
|
|
2
|
+
interface CannedResponsePanelProps {
|
|
3
|
+
query: string;
|
|
4
|
+
viewedTeamId?: string;
|
|
5
|
+
onCreate?: (request: CannedCreateRequest) => void;
|
|
6
|
+
}
|
|
7
|
+
declare const CannedResponsePanel: ({ query, viewedTeamId, onCreate, }: CannedResponsePanelProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export default CannedResponsePanel;
|
|
9
|
+
//# sourceMappingURL=CannedResponsePanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CannedResponsePanel.d.ts","sourceRoot":"","sources":["../../../src/components/canned-response/CannedResponsePanel.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAE,mBAAmB,EAA8B,MAAM,cAAc,CAAC;AAQ/E,UAAU,wBAAwB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;CACnD;AAaD,QAAA,MAAM,mBAAmB,GAAI,oCAI1B,wBAAwB,4CAiJ1B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
4
|
+
import { Spin } from "antd";
|
|
5
|
+
import { StrokeIcon } from "../../components/icon/StrokeIcon";
|
|
6
|
+
import { useDebounce } from "ahooks";
|
|
7
|
+
import { useTranslation } from "react-i18next";
|
|
8
|
+
import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext";
|
|
9
|
+
import { useFetchMyTeams } from "../../hooks/team/useFetchMyTeam";
|
|
10
|
+
import { useSearchCannedAcrossScopes } from "../../hooks/canned-response/useSearchCannedAcrossScopes";
|
|
11
|
+
import { useMessageFooterContext } from "../../components/message/footer";
|
|
12
|
+
import { CannedResponseVisibleScope } from "../../types/chat";
|
|
13
|
+
import { sanitizeHtml } from "../../utils/common";
|
|
14
|
+
import emitter from "../../utils/events";
|
|
15
|
+
import { insertCannedContent } from "./insertCannedContent";
|
|
16
|
+
import { buildCannedScopes } from "./cannedScopes";
|
|
17
|
+
import CannedScopeChips, { ALL_SCOPES_KEY } from "./CannedScopeChips";
|
|
18
|
+
import CannedResponseRow from "./CannedResponseRow";
|
|
19
|
+
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 }));
|
|
20
|
+
const toPreview = (html) => {
|
|
21
|
+
var _a;
|
|
22
|
+
return (_a = new DOMParser().parseFromString(sanitizeHtml(html), "text/html").body
|
|
23
|
+
.textContent) !== null && _a !== void 0 ? _a : "";
|
|
24
|
+
};
|
|
25
|
+
// CRM only: lists matches for the "#shortcut" being typed; focus stays in the composer.
|
|
26
|
+
const CannedResponsePanel = ({ query, viewedTeamId, onCreate, }) => {
|
|
27
|
+
const { t } = useTranslation();
|
|
28
|
+
const [editor] = useLexicalComposerContext();
|
|
29
|
+
const { activeCannedIndex, setActiveCannedIndex, setMaxActiveCannedIndex } = useMessageFooterContext();
|
|
30
|
+
const { data: myTeams } = useFetchMyTeams();
|
|
31
|
+
const [filter, setFilter] = useState(ALL_SCOPES_KEY);
|
|
32
|
+
const debouncedQuery = useDebounce(query, { wait: 200 });
|
|
33
|
+
const itemRefs = useRef([]);
|
|
34
|
+
const scopes = useMemo(() => buildCannedScopes(myTeams !== null && myTeams !== void 0 ? myTeams : [], t("personal"), viewedTeamId), [myTeams, t, viewedTeamId]);
|
|
35
|
+
const activeScopes = useMemo(() => (filter === ALL_SCOPES_KEY ? scopes : scopes.filter((s) => s.key === filter)), [scopes, filter]);
|
|
36
|
+
const { rows, isLoading, isError } = useSearchCannedAcrossScopes(activeScopes, debouncedQuery);
|
|
37
|
+
const settling = query !== debouncedQuery;
|
|
38
|
+
const insertRow = useCallback((row) => insertCannedContent(editor, sanitizeHtml(row.content || "")), [editor]);
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
const onSelect = (index) => {
|
|
41
|
+
const row = index === null ? undefined : rows[Math.min(index, rows.length - 1)];
|
|
42
|
+
if (row)
|
|
43
|
+
insertRow(row);
|
|
44
|
+
};
|
|
45
|
+
emitter.on("CANNED_RESPONSE_SELECT", onSelect);
|
|
46
|
+
return () => emitter.off("CANNED_RESPONSE_SELECT", onSelect);
|
|
47
|
+
}, [rows, insertRow]);
|
|
48
|
+
useEffect(() => setActiveCannedIndex(0), [debouncedQuery, filter, setActiveCannedIndex]);
|
|
49
|
+
useEffect(() => setMaxActiveCannedIndex(Math.max(rows.length - 1, 0)), [rows.length, setMaxActiveCannedIndex]);
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
var _a, _b;
|
|
52
|
+
if (activeCannedIndex !== null) {
|
|
53
|
+
(_b = (_a = itemRefs.current[activeCannedIndex]) === null || _a === void 0 ? void 0 : _a.scrollIntoView) === null || _b === void 0 ? void 0 : _b.call(_a, { block: "nearest" });
|
|
54
|
+
}
|
|
55
|
+
}, [activeCannedIndex]);
|
|
56
|
+
const create = () => {
|
|
57
|
+
var _a;
|
|
58
|
+
const scope = scopes.find((s) => s.key === filter);
|
|
59
|
+
const isPersonal = (scope === null || scope === void 0 ? void 0 : scope.visibilityScope) === CannedResponseVisibleScope.PRIVATE;
|
|
60
|
+
onCreate === null || onCreate === void 0 ? void 0 : onCreate({
|
|
61
|
+
visibilityScope: isPersonal ? "PRIVATE" : "TEAM",
|
|
62
|
+
teamId: isPersonal ? undefined : (_a = scope === null || scope === void 0 ? void 0 : scope.teamId) !== null && _a !== void 0 ? _a : viewedTeamId,
|
|
63
|
+
onCreated: (content) => editor.focus(() => insertCannedContent(editor, sanitizeHtml(content))),
|
|
64
|
+
});
|
|
65
|
+
};
|
|
66
|
+
const noQuery = query.length === 0;
|
|
67
|
+
const empty = !noQuery && !settling && !isLoading && rows.length === 0;
|
|
68
|
+
return (_jsxs("div", { "data-cp-name": "CannedResponsePanel", role: "region", "aria-label": t("composer_quick_reply"), className: "absolute inset-x-4 bottom-full z-20 mb-2 overflow-hidden rounded-xl bg-white shadow-[0_16px_16px_-8px_rgba(27,63,228,0.2),0_0_0_1px_rgba(57,62,64,0.06)]", children: [_jsxs("div", { className: "flex items-center gap-2 border-b border-gray-25 px-3 py-2.5", children: [_jsx("span", { className: "shrink-0 text-[13px] font-semibold text-gray-900", children: t("composer_quick_reply") }), _jsx("span", { className: "flex-1" }), _jsx(CannedScopeChips, { scopes: scopes, value: filter, onChange: setFilter })] }), _jsxs("div", { className: "max-h-[260px] min-h-[96px] overflow-y-auto p-1", children: [noQuery && (_jsx("p", { className: "px-3 py-6 text-center text-sm text-gray-600", children: t("canned_search_prompt") })), !noQuery && (settling || isLoading) && (_jsx("div", { className: "flex justify-center py-6", children: _jsx(Spin, { size: "small" }) })), isError && !settling && (_jsx("p", { role: "alert", className: "px-3 py-6 text-center text-sm text-danger-600", children: t("canned_loading_failed") })), empty && !isError && (_jsxs("div", { className: "flex flex-col items-center gap-3 px-3 py-5", children: [_jsx("p", { className: "text-center text-sm text-gray-600", children: t("canned_search_empty", { query }) }), _jsxs("button", { type: "button", tabIndex: -1, onMouseDown: (e) => e.preventDefault(), onClick: create, className: "flex h-8 items-center gap-1.5 rounded-lg border border-gray-50 bg-white px-3.5 text-sm font-medium text-gray-900 hover:bg-gray-5", children: [_jsx(StrokeIcon, { name: "plus", size: 16 }), t("canned_create_new")] })] })), !settling && rows.length > 0 && (_jsx("ul", { className: "m-0 flex list-none flex-col gap-0.5 p-0", children: rows.map((row, index) => (_jsx(CannedResponseRow, { ref: (el) => {
|
|
69
|
+
itemRefs.current[index] = el;
|
|
70
|
+
}, row: row, preview: toPreview(row.content || ""), active: index === activeCannedIndex, onSelect: () => insertRow(row) }, row.id))) }))] }), _jsxs("div", { className: "flex items-center gap-2 border-t border-gray-25 px-3 py-2 text-xs text-gray-600", children: [_jsx(Kbd, { children: "\u2191" }), _jsx(Kbd, { children: "\u2193" }), " ", t("canned_hint_select"), " \u00B7 ", _jsx(Kbd, { children: "Enter" }), " ", t("canned_hint_insert"), " \u00B7", " ", _jsx(Kbd, { children: "Esc" }), " ", t("canned_hint_close"), _jsx("span", { className: "flex-1" }), _jsxs("button", { type: "button", tabIndex: -1, onMouseDown: (e) => e.preventDefault(), onClick: create, className: "flex h-7 items-center gap-1.5 rounded-lg px-2 text-[13px] font-medium text-primary-500 hover:bg-primary-25", children: [_jsx(StrokeIcon, { name: "plus", size: 16 }), t("canned_create_quick")] })] })] }));
|
|
71
|
+
};
|
|
72
|
+
export default CannedResponsePanel;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CannedRow } from "./cannedScopes";
|
|
2
|
+
interface CannedResponseRowProps {
|
|
3
|
+
row: CannedRow;
|
|
4
|
+
preview: string;
|
|
5
|
+
active: boolean;
|
|
6
|
+
onSelect: () => void;
|
|
7
|
+
}
|
|
8
|
+
declare const CannedResponseRow: import("react").ForwardRefExoticComponent<CannedResponseRowProps & import("react").RefAttributes<HTMLLIElement>>;
|
|
9
|
+
export default CannedResponseRow;
|
|
10
|
+
//# sourceMappingURL=CannedResponseRow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CannedResponseRow.d.ts","sourceRoot":"","sources":["../../../src/components/canned-response/CannedResponseRow.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,UAAU,sBAAsB;IAC9B,GAAG,EAAE,SAAS,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,QAAA,MAAM,iBAAiB,kHA2BtB,CAAC;AAGF,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import clsx from "clsx";
|
|
3
|
+
import { forwardRef } from "react";
|
|
4
|
+
const CannedResponseRow = forwardRef(({ row, preview, active, onSelect }, ref) => (_jsx("li", { ref: ref, children: _jsxs("button", { type: "button", tabIndex: -1, "aria-current": active, onMouseDown: (e) => e.preventDefault(), onClick: onSelect, className: clsx("flex w-full items-center gap-3 rounded-lg px-3 py-2 text-left", active ? "bg-primary-25" : "hover:bg-gray-5"), children: [_jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [_jsxs("span", { className: "flex items-baseline gap-2 text-[13px]", children: [_jsx("span", { className: "font-semibold text-primary-500", children: `#${row.shortcut}` }), _jsx("span", { className: "truncate font-medium text-gray-900", children: row.name })] }), _jsx("span", { className: "truncate text-[13px] text-gray-600", children: preview })] }), _jsx("span", { className: "inline-flex h-[22px] max-w-[140px] shrink-0 items-center truncate rounded-full bg-[var(--dc-color-neutral-surface)] px-2 text-xs font-medium text-gray-900", children: row.scopeLabel })] }) })));
|
|
5
|
+
CannedResponseRow.displayName = "CannedResponseRow";
|
|
6
|
+
export default CannedResponseRow;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CannedScope } from "./cannedScopes";
|
|
2
|
+
export declare const ALL_SCOPES_KEY = "ALL";
|
|
3
|
+
interface CannedScopeChipsProps {
|
|
4
|
+
scopes: CannedScope[];
|
|
5
|
+
value: string;
|
|
6
|
+
onChange: (key: string) => void;
|
|
7
|
+
}
|
|
8
|
+
declare const CannedScopeChips: ({ scopes, value, onChange }: CannedScopeChipsProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export default CannedScopeChips;
|
|
10
|
+
//# sourceMappingURL=CannedScopeChips.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CannedScopeChips.d.ts","sourceRoot":"","sources":["../../../src/components/canned-response/CannedScopeChips.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,eAAO,MAAM,cAAc,QAAQ,CAAC;AAEpC,UAAU,qBAAqB;IAC7B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAGD,QAAA,MAAM,gBAAgB,GAAI,6BAA6B,qBAAqB,4CAsD3E,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
3
|
+
import clsx from "clsx";
|
|
4
|
+
import { useTranslation } from "react-i18next";
|
|
5
|
+
export const ALL_SCOPES_KEY = "ALL";
|
|
6
|
+
// Chips never take focus: the agent keeps typing in the composer while filtering.
|
|
7
|
+
const CannedScopeChips = ({ scopes, value, onChange }) => {
|
|
8
|
+
const { t } = useTranslation();
|
|
9
|
+
const chips = [{ key: ALL_SCOPES_KEY, label: t("all") }, ...scopes];
|
|
10
|
+
const ref = useRef(null);
|
|
11
|
+
const [hasMoreRight, setHasMoreRight] = useState(false);
|
|
12
|
+
// With many teams the row scrolls sideways; a fade on the right edge shows there is more.
|
|
13
|
+
const measure = useCallback(() => {
|
|
14
|
+
const el = ref.current;
|
|
15
|
+
if (el)
|
|
16
|
+
setHasMoreRight(el.scrollLeft + el.clientWidth < el.scrollWidth - 1);
|
|
17
|
+
}, []);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
measure();
|
|
20
|
+
const el = ref.current;
|
|
21
|
+
if (!el || typeof ResizeObserver === "undefined")
|
|
22
|
+
return;
|
|
23
|
+
const observer = new ResizeObserver(measure);
|
|
24
|
+
observer.observe(el);
|
|
25
|
+
return () => observer.disconnect();
|
|
26
|
+
}, [measure, chips.length]);
|
|
27
|
+
return (_jsx("div", { ref: ref, role: "group", "aria-label": t("canned_scope_filter"), onScroll: measure, className: clsx("flex min-w-0 gap-1.5 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden", hasMoreRight && "[mask-image:linear-gradient(to_right,#000_calc(100%-32px),transparent)]"), children: chips.map((chip) => {
|
|
28
|
+
const selected = chip.key === value;
|
|
29
|
+
return (_jsx("button", { type: "button", tabIndex: -1, "aria-pressed": selected, onMouseDown: (e) => e.preventDefault(), onClick: () => onChange(chip.key), className: clsx("h-7 shrink-0 whitespace-nowrap rounded-full border px-2.5 text-xs font-medium", selected
|
|
30
|
+
? "border-primary-25 bg-primary-25 text-primary-500"
|
|
31
|
+
: "border-gray-50 bg-white text-gray-900 hover:bg-gray-5"), children: chip.label }, chip.key));
|
|
32
|
+
}) }));
|
|
33
|
+
};
|
|
34
|
+
export default CannedScopeChips;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CannedResponseVisibleScope } from "../../types/chat";
|
|
2
|
+
import { ICannedResponseItem, IMyTeamResponse } from "../../types/dto";
|
|
3
|
+
export declare const PERSONAL_SCOPE_KEY = "PRIVATE";
|
|
4
|
+
export interface CannedScope {
|
|
5
|
+
key: string;
|
|
6
|
+
visibilityScope: CannedResponseVisibleScope;
|
|
7
|
+
teamId?: string;
|
|
8
|
+
label: string;
|
|
9
|
+
}
|
|
10
|
+
export interface CannedRow extends ICannedResponseItem {
|
|
11
|
+
scopeKey: string;
|
|
12
|
+
scopeLabel: string;
|
|
13
|
+
}
|
|
14
|
+
export declare const buildCannedScopes: (teams: IMyTeamResponse[], personalLabel: string, viewedTeamId?: string) => CannedScope[];
|
|
15
|
+
export declare const mergeCannedResults: (scopes: CannedScope[], results: ICannedResponseItem[][]) => CannedRow[];
|
|
16
|
+
//# sourceMappingURL=cannedScopes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cannedScopes.d.ts","sourceRoot":"","sources":["../../../src/components/canned-response/cannedScopes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnE,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,0BAA0B,CAAC;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAU,SAAQ,mBAAmB;IACpD,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,eAAO,MAAM,iBAAiB,GAC5B,OAAO,eAAe,EAAE,EACxB,eAAe,MAAM,EACrB,eAAe,MAAM,KACpB,WAAW,EAmBb,CAAC;AAGF,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,WAAW,EAAE,EACrB,SAAS,mBAAmB,EAAE,EAAE,KAC/B,SAAS,EAWX,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { CannedResponseVisibleScope } from "../../types/chat";
|
|
2
|
+
export const PERSONAL_SCOPE_KEY = "PRIVATE";
|
|
3
|
+
// The search endpoint takes one scope per call, so the picker queries each scope.
|
|
4
|
+
// Order is the display order: personal first, then the team being viewed, then the rest.
|
|
5
|
+
export const buildCannedScopes = (teams, personalLabel, viewedTeamId) => {
|
|
6
|
+
const teamScopes = teams.map((team) => ({
|
|
7
|
+
key: team.teamId,
|
|
8
|
+
visibilityScope: CannedResponseVisibleScope.TEAM,
|
|
9
|
+
teamId: team.teamId,
|
|
10
|
+
label: team.name,
|
|
11
|
+
}));
|
|
12
|
+
const viewedIndex = teamScopes.findIndex((scope) => scope.key === viewedTeamId);
|
|
13
|
+
if (viewedIndex > 0) {
|
|
14
|
+
teamScopes.unshift(...teamScopes.splice(viewedIndex, 1));
|
|
15
|
+
}
|
|
16
|
+
return [
|
|
17
|
+
{
|
|
18
|
+
key: PERSONAL_SCOPE_KEY,
|
|
19
|
+
visibilityScope: CannedResponseVisibleScope.PRIVATE,
|
|
20
|
+
label: personalLabel,
|
|
21
|
+
},
|
|
22
|
+
...teamScopes,
|
|
23
|
+
];
|
|
24
|
+
};
|
|
25
|
+
// Concatenates per-scope results in scope order and drops repeated ids.
|
|
26
|
+
export const mergeCannedResults = (scopes, results) => {
|
|
27
|
+
const seen = new Set();
|
|
28
|
+
const rows = [];
|
|
29
|
+
scopes.forEach((scope, index) => {
|
|
30
|
+
var _a;
|
|
31
|
+
((_a = results[index]) !== null && _a !== void 0 ? _a : []).forEach((item) => {
|
|
32
|
+
if (seen.has(item.id))
|
|
33
|
+
return;
|
|
34
|
+
seen.add(item.id);
|
|
35
|
+
rows.push(Object.assign(Object.assign({}, item), { scopeKey: scope.key, scopeLabel: scope.label }));
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
return rows;
|
|
39
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/canned-response/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/canned-response/index.tsx"],"names":[],"mappings":"AAWA,UAAU,oBAAoB;IAC5B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,QAAA,MAAM,cAAc,GAAI,kDAIrB,oBAAoB,4CA0CtB,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -7,28 +7,29 @@ import { useLexicalComposerContext } from "@lexical/react/LexicalComposerContext
|
|
|
7
7
|
import { $getRoot } from "lexical";
|
|
8
8
|
import { $generateNodesFromDOM } from "@lexical/html";
|
|
9
9
|
import CannedResponseFooter from "./CannedResponseFooter";
|
|
10
|
+
import useAuthStore from "../../store/auth";
|
|
11
|
+
import { insertCannedContent } from "./insertCannedContent";
|
|
10
12
|
const CannedResponse = ({ onClose, openCreateCannedModal, cannedQuery = "", }) => {
|
|
11
13
|
const [editor] = useLexicalComposerContext();
|
|
14
|
+
const isCrm = useAuthStore((state) => state.isCrm);
|
|
12
15
|
const [search, setSearch] = useState("");
|
|
13
16
|
const debouncedSearch = useDebounce(search, {
|
|
14
17
|
wait: 300,
|
|
15
18
|
});
|
|
16
19
|
const onSelectCannedResponse = useCallback((content) => {
|
|
20
|
+
// The composer is shared with BIZ/PDP/Mall, which keep replacing the draft.
|
|
21
|
+
if (isCrm) {
|
|
22
|
+
insertCannedContent(editor, content);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
17
25
|
editor.update(() => {
|
|
18
26
|
const root = $getRoot();
|
|
19
|
-
// 1. Clear content cũ
|
|
20
27
|
root.clear();
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const dom = parser.parseFromString(content, "text/html");
|
|
24
|
-
// 3. Convert DOM -> Lexical nodes
|
|
25
|
-
const nodes = $generateNodesFromDOM(editor, dom);
|
|
26
|
-
// 4. Append vào editor
|
|
27
|
-
root.append(...nodes);
|
|
28
|
-
// 5. Move cursor về cuối (optional nhưng nên có)
|
|
28
|
+
const dom = new DOMParser().parseFromString(content, "text/html");
|
|
29
|
+
root.append(...$generateNodesFromDOM(editor, dom));
|
|
29
30
|
root.selectEnd();
|
|
30
31
|
});
|
|
31
|
-
}, [editor]);
|
|
32
|
+
}, [editor, isCrm]);
|
|
32
33
|
return (_jsxs("div", { className: "w-[600px]", "data-cp-name": "CannedResponse", children: [_jsx(CannedResponseHeader, { onClose: onClose, search: search, setSearch: setSearch }), _jsx(CannedResponseBody, { search: debouncedSearch, onSelectCannedResponse: onSelectCannedResponse, cannedQuery: cannedQuery }), _jsx(CannedResponseFooter, { openCreateCannedModal: openCreateCannedModal })] }));
|
|
33
34
|
};
|
|
34
35
|
export default CannedResponse;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type LexicalEditor } from "lexical";
|
|
2
|
+
/**
|
|
3
|
+
* Inserts a canned reply at the cursor, keeping the draft. The insert is its own
|
|
4
|
+
* undo step so Cmd+Z returns to the draft.
|
|
5
|
+
*/
|
|
6
|
+
export declare const insertCannedContent: (editor: LexicalEditor, content: string) => void;
|
|
7
|
+
//# sourceMappingURL=insertCannedContent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insertCannedContent.d.ts","sourceRoot":"","sources":["../../../src/components/canned-response/insertCannedContent.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,SAAS,CAAC;AAkBjB;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,aAAa,EAAE,SAAS,MAAM,SAqBzE,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { $createParagraphNode, $getRoot, $getSelection, $isRangeSelection, $isTextNode, } from "lexical";
|
|
2
|
+
import { $generateNodesFromDOM } from "@lexical/html";
|
|
3
|
+
const TRIGGER_BEFORE_CURSOR = /(^|\s)#\w*$/;
|
|
4
|
+
// Drops the "#shortcut" the agent typed to open the picker, so only the reply stays.
|
|
5
|
+
const $removeTriggerBeforeCursor = () => {
|
|
6
|
+
const selection = $getSelection();
|
|
7
|
+
if (!$isRangeSelection(selection) || !selection.isCollapsed())
|
|
8
|
+
return;
|
|
9
|
+
const { anchor } = selection;
|
|
10
|
+
const node = anchor.getNode();
|
|
11
|
+
if (!$isTextNode(node))
|
|
12
|
+
return;
|
|
13
|
+
const match = node.getTextContent().slice(0, anchor.offset).match(TRIGGER_BEFORE_CURSOR);
|
|
14
|
+
if (!match)
|
|
15
|
+
return;
|
|
16
|
+
const triggerStart = anchor.offset - match[0].replace(/^\s/, "").length;
|
|
17
|
+
node.spliceText(triggerStart, anchor.offset - triggerStart, "", true);
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Inserts a canned reply at the cursor, keeping the draft. The insert is its own
|
|
21
|
+
* undo step so Cmd+Z returns to the draft.
|
|
22
|
+
*/
|
|
23
|
+
export const insertCannedContent = (editor, content) => {
|
|
24
|
+
editor.update(() => {
|
|
25
|
+
const root = $getRoot();
|
|
26
|
+
const nodes = $generateNodesFromDOM(editor, new DOMParser().parseFromString(content, "text/html"));
|
|
27
|
+
if (!$isRangeSelection($getSelection())) {
|
|
28
|
+
if (root.getTextContentSize() === 0) {
|
|
29
|
+
root.clear();
|
|
30
|
+
root.append($createParagraphNode());
|
|
31
|
+
}
|
|
32
|
+
root.selectEnd();
|
|
33
|
+
}
|
|
34
|
+
$removeTriggerBeforeCursor();
|
|
35
|
+
const selection = $getSelection();
|
|
36
|
+
if ($isRangeSelection(selection))
|
|
37
|
+
selection.insertNodes(nodes);
|
|
38
|
+
}, { tag: "history-push" });
|
|
39
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TeamItem.d.ts","sourceRoot":"","sources":["../../../../src/components/canned-response/team/TeamItem.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TeamItem.d.ts","sourceRoot":"","sources":["../../../../src/components/canned-response/team/TeamItem.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAQ9C,UAAU,aAAa;IACrB,IAAI,EAAE,eAAe,CAAC;IACtB,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,QAAA,MAAM,QAAQ,GAAI,8EAMf,aAAa,4CAsFf,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { clickableProps, FOCUS_RING_CLASS } from "../../../utils/a11yClickable";
|
|
2
3
|
import { useFetchCannedCategories } from "../../../hooks/canned-response/useFetchCannedCategories";
|
|
3
4
|
import { useBoolean } from "ahooks";
|
|
4
5
|
import { Icon } from "../../../components/icon";
|
|
@@ -15,17 +16,17 @@ const TeamItem = ({ team, onSelectCategory, selectedTeamId, selectedCategoryId,
|
|
|
15
16
|
}
|
|
16
17
|
toggle();
|
|
17
18
|
}, [toggle, isOpen, onSelectCategory, team === null || team === void 0 ? void 0 : team.teamId, selectedTeamId]);
|
|
18
|
-
return (_jsxs("div", { className: "border-b border-gray-200", "data-cp-name": "TeamItem", children: [_jsxs("div", { className:
|
|
19
|
+
return (_jsxs("div", { className: "border-b border-gray-200", "data-cp-name": "TeamItem", children: [_jsxs("div", Object.assign({ className: `flex items-center justify-between py-2 cursor-pointer ${FOCUS_RING_CLASS}` }, clickableProps(onToggle), { "aria-expanded": isOpen, children: [_jsx("span", { className: "text-sm font-medium truncate flex-1", children: (team === null || team === void 0 ? void 0 : team.name) || "" }), _jsx(Icon, { icon: isOpen ? "angle-up-b" : "angle-down-b", size: 16, className: clsx(!isOpen && "text-gray-500") })] })), isOpen && (_jsxs("div", { className: "mb-2", children: [_jsx("div", Object.assign({ className: clsx("px-3 py-1 cursor-pointer hover:bg-gray-100 rounded-md", FOCUS_RING_CLASS, selectedTeamId &&
|
|
19
20
|
selectedTeamId === (team === null || team === void 0 ? void 0 : team.teamId) &&
|
|
20
21
|
!selectedCategoryId &&
|
|
21
|
-
"bg-gray-100"),
|
|
22
|
+
"bg-gray-100") }, clickableProps(() => onSelectCategory === null || onSelectCategory === void 0 ? void 0 : onSelectCategory(team === null || team === void 0 ? void 0 : team.teamId, undefined)), { children: _jsx("span", { className: clsx("text-sm truncate", selectedTeamId === (team === null || team === void 0 ? void 0 : team.teamId) && !selectedCategoryId
|
|
22
23
|
? "font-medium text-blue-500"
|
|
23
|
-
: "text-gray-500"), children: t("all") }) }, `${team.teamId}-all`), categories === null || categories === void 0 ? void 0 : categories.map((category) => {
|
|
24
|
+
: "text-gray-500"), children: t("all") }) }), `${team.teamId}-all`), categories === null || categories === void 0 ? void 0 : categories.map((category) => {
|
|
24
25
|
const isSelected = selectedTeamId &&
|
|
25
26
|
selectedCategoryId &&
|
|
26
27
|
selectedTeamId === (category === null || category === void 0 ? void 0 : category.teamId) &&
|
|
27
28
|
selectedCategoryId === (category === null || category === void 0 ? void 0 : category.id);
|
|
28
|
-
return (_jsx("div", { className: clsx("px-3 py-1 cursor-pointer hover:bg-gray-100 rounded-md", isSelected && "bg-gray-100"),
|
|
29
|
+
return (_jsx("div", Object.assign({ className: clsx("px-3 py-1 cursor-pointer hover:bg-gray-100 rounded-md", FOCUS_RING_CLASS, isSelected && "bg-gray-100") }, clickableProps(() => onSelectCategory === null || onSelectCategory === void 0 ? void 0 : onSelectCategory(team === null || team === void 0 ? void 0 : team.teamId, category === null || category === void 0 ? void 0 : category.id)), { children: _jsx("span", { className: clsx("text-sm truncate", isSelected ? "font-medium text-blue-500" : "text-gray-500"), children: category === null || category === void 0 ? void 0 : category.name }) }), `${team.teamId}-${category.id}`));
|
|
29
30
|
})] }))] }));
|
|
30
31
|
};
|
|
31
32
|
export default TeamItem;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import type { ModalProps } from "antd";
|
|
1
2
|
import type { ReactNode } from "react";
|
|
3
|
+
import type { StrokeIconName } from "../../components/icon/strokeIconNodes";
|
|
2
4
|
export interface ConfirmModalProps {
|
|
3
5
|
open: boolean;
|
|
4
6
|
title: ReactNode;
|
|
@@ -11,8 +13,18 @@ export interface ConfirmModalProps {
|
|
|
11
13
|
okButtonProps?: {
|
|
12
14
|
disabled?: boolean;
|
|
13
15
|
};
|
|
16
|
+
/** CRM only: danger icon beside the title and a solid danger OK button. */
|
|
17
|
+
destructive?: boolean;
|
|
18
|
+
/** CRM only: line under the body, e.g. "Không thể hoàn tác.". */
|
|
19
|
+
warning?: ReactNode;
|
|
20
|
+
/** CRM only: line icon before the OK label. */
|
|
21
|
+
okIcon?: StrokeIconName;
|
|
22
|
+
/** CRM only: muted text at the left of the footer, before the buttons. */
|
|
23
|
+
footerNote?: ReactNode;
|
|
24
|
+
/** Where the modal mounts; defaults to inline (`false`). */
|
|
25
|
+
getContainer?: ModalProps["getContainer"];
|
|
14
26
|
children: ReactNode;
|
|
15
27
|
}
|
|
16
|
-
declare const ConfirmModal: ({ open, title, okText, cancelText, onOk, onCancel, okType, confirmLoading, okButtonProps, children, }: ConfirmModalProps) => import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
declare const ConfirmModal: ({ open, title, okText, cancelText, onOk, onCancel, okType, confirmLoading, okButtonProps, destructive, okIcon, warning, footerNote, getContainer, children, }: ConfirmModalProps) => import("react/jsx-runtime").JSX.Element;
|
|
17
29
|
export default ConfirmModal;
|
|
18
30
|
//# sourceMappingURL=ConfirmModal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmModal.d.ts","sourceRoot":"","sources":["../../../src/components/common/ConfirmModal.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ConfirmModal.d.ts","sourceRoot":"","sources":["../../../src/components/common/ConfirmModal.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,SAAS,CAAC;IACtB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACvC,2EAA2E;IAC3E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iEAAiE;IACjE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,4DAA4D;IAC5D,YAAY,CAAC,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;IAC1C,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,QAAA,MAAM,YAAY,GAAI,+JAgBnB,iBAAiB,4CAoFnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -1,15 +1,33 @@
|
|
|
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 { Modal } from "antd";
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
import useAuthStore from "../../store/auth";
|
|
5
|
+
import { StrokeIcon } from "../../components/icon/StrokeIcon";
|
|
6
|
+
const ConfirmModal = ({ open, title, okText, cancelText, onOk, onCancel, okType = "primary", confirmLoading, okButtonProps, destructive = false, okIcon, warning, footerNote, getContainer = false, children, }) => {
|
|
7
|
+
// CRM takes header/body/footer and button styling from its antd theme;
|
|
8
|
+
// other hosts keep this component's own look.
|
|
9
|
+
const isCrm = useAuthStore((state) => state.isCrm);
|
|
10
|
+
const isDanger = destructive || okType === "danger";
|
|
11
|
+
const crmTitle = destructive ? (_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-danger-25 text-danger-600", children: _jsx(StrokeIcon, { name: "alert-triangle", size: 20 }) }), title] })) : (title);
|
|
12
|
+
const crmFooter = footerNote
|
|
13
|
+
? (_, { OkBtn, CancelBtn }) => (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "min-w-0 flex-1 text-left text-[13px] text-gray-600", children: footerNote }), _jsx(CancelBtn, {}), _jsx(OkBtn, {})] }))
|
|
14
|
+
: undefined;
|
|
15
|
+
const lookProps = isCrm
|
|
16
|
+
? Object.assign({ okType: isDanger ? "primary" : okType, okButtonProps: Object.assign(Object.assign(Object.assign({}, okButtonProps), (isDanger && { danger: true })), (okIcon && { icon: _jsx(StrokeIcon, { name: okIcon, size: 18 }) })), title: crmTitle }, (crmFooter ? { footer: crmFooter } : {})) : {
|
|
17
|
+
okButtonProps: Object.assign(Object.assign({}, okButtonProps), { className: okType === "danger"
|
|
6
18
|
? "!h-10 !rounded-lg !border-danger-400 !bg-danger-400 !text-white hover:!border-danger-300 hover:!bg-danger-300"
|
|
7
|
-
: "!h-10 !rounded-lg !border-[var(--dc-color-primary)] !bg-[var(--dc-color-primary)] !text-white hover:!border-[var(--dc-color-primary-hover)] hover:!bg-[var(--dc-color-primary-hover)]" }),
|
|
19
|
+
: "!h-10 !rounded-lg !border-[var(--dc-color-primary)] !bg-[var(--dc-color-primary)] !text-white hover:!border-[var(--dc-color-primary-hover)] hover:!bg-[var(--dc-color-primary-hover)]" }),
|
|
20
|
+
cancelButtonProps: {
|
|
8
21
|
className: "!h-10 !rounded-lg !border-gray-25 !bg-gray-25 !text-gray-900",
|
|
9
|
-
},
|
|
22
|
+
},
|
|
23
|
+
styles: {
|
|
10
24
|
header: { textAlign: "center", marginBottom: 0 },
|
|
11
25
|
footer: { marginTop: 16 },
|
|
12
26
|
body: { paddingTop: 4 },
|
|
13
|
-
},
|
|
27
|
+
},
|
|
28
|
+
classNames: { footer: "border-t border-gray-25 pt-4" },
|
|
29
|
+
title: _jsx("span", { className: "text-[18px] font-bold text-gray-900", children: title }),
|
|
30
|
+
};
|
|
31
|
+
return (_jsxs(Modal, Object.assign({ "data-cp-name": "ConfirmModal", centered: true, open: open, onOk: onOk, onCancel: onCancel, okText: okText, cancelText: cancelText, confirmLoading: confirmLoading, getContainer: getContainer, forceRender: !isCrm, destroyOnHidden: isCrm }, lookProps, { children: [children, isCrm && warning && (_jsxs("p", { className: "mt-4 flex items-center gap-1.5 text-[13px] font-medium text-danger-600", children: [_jsx(StrokeIcon, { name: "alert-circle", size: 16 }), warning] }))] })));
|
|
14
32
|
};
|
|
15
33
|
export default ConfirmModal;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
interface DeskPanelDrawerProps {
|
|
3
|
+
open: boolean;
|
|
4
|
+
label: string;
|
|
5
|
+
onClose: () => void;
|
|
6
|
+
/** Positioned element the drawer and its scrim mount into; in place when missing. */
|
|
7
|
+
container?: HTMLElement | null;
|
|
8
|
+
/** Off when the panel focuses its own field on open. */
|
|
9
|
+
autoFocus?: boolean;
|
|
10
|
+
/** Off while a layer inside the drawer should take Esc first. */
|
|
11
|
+
keyboard?: boolean;
|
|
12
|
+
children: ReactNode;
|
|
13
|
+
}
|
|
14
|
+
/** Overlay drawer for a desk side panel (inset 8px, rounded, light scrim). Sits below modals opened from it. */
|
|
15
|
+
declare const DeskPanelDrawer: ({ open, label, onClose, container, autoFocus, keyboard, children, }: DeskPanelDrawerProps) => import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export default DeskPanelDrawer;
|
|
17
|
+
//# sourceMappingURL=DeskPanelDrawer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeskPanelDrawer.d.ts","sourceRoot":"","sources":["../../../src/components/common/DeskPanelDrawer.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,UAAU,oBAAoB;IAC5B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,qFAAqF;IACrF,SAAS,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC/B,wDAAwD;IACxD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,gHAAgH;AAChH,QAAA,MAAM,eAAe,GAAI,qEAQtB,oBAAoB,4CA+BtB,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { Drawer } from "antd";
|
|
4
|
+
import { LAYOUT_WIDTHS } from "../../constants/layout";
|
|
5
|
+
/** Overlay drawer for a desk side panel (inset 8px, rounded, light scrim). Sits below modals opened from it. */
|
|
6
|
+
const DeskPanelDrawer = ({ open, label, onClose, container, autoFocus = true, keyboard = true, children, }) => (_jsx(Drawer, { open: open, "aria-label": label, onClose: onClose, autoFocus: autoFocus, keyboard: keyboard,
|
|
7
|
+
// antd slides a drawer 180px aside when one opens inside it; panels here stack in place.
|
|
8
|
+
push: false, destroyOnHidden: true, closeIcon: false, getContainer: container !== null && container !== void 0 ? container : false, rootStyle: { position: "absolute" }, zIndex: 900, width: LAYOUT_WIDTHS.infoDrawer, styles: {
|
|
9
|
+
mask: { background: "rgba(57, 62, 64, 0.16)" },
|
|
10
|
+
wrapper: {
|
|
11
|
+
top: 8,
|
|
12
|
+
right: 8,
|
|
13
|
+
bottom: 8,
|
|
14
|
+
height: "auto",
|
|
15
|
+
borderRadius: 12,
|
|
16
|
+
overflow: "hidden",
|
|
17
|
+
boxShadow: "0 8px 24px rgba(57, 62, 64, 0.16)",
|
|
18
|
+
},
|
|
19
|
+
body: { padding: 0, background: "transparent" },
|
|
20
|
+
}, children: children }));
|
|
21
|
+
export default DeskPanelDrawer;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
interface DeskSidePanelProps {
|
|
3
|
+
open: boolean;
|
|
4
|
+
label: string;
|
|
5
|
+
onClose: () => void;
|
|
6
|
+
/** Off when the panel focuses its own field on open. */
|
|
7
|
+
autoFocus?: boolean;
|
|
8
|
+
/** Receives `true` when the panel sits inline in the workspace row. */
|
|
9
|
+
children: (isInline: boolean) => ReactNode;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* CRM desk side panel opened from the chat header (members, search, library, info):
|
|
13
|
+
* an inline column where the workspace has room, otherwise an inset drawer over it.
|
|
14
|
+
*/
|
|
15
|
+
declare const DeskSidePanel: ({ open, label, onClose, autoFocus, children, }: DeskSidePanelProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
16
|
+
export default DeskSidePanel;
|
|
17
|
+
//# sourceMappingURL=DeskSidePanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeskSidePanel.d.ts","sourceRoot":"","sources":["../../../src/components/common/DeskSidePanel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,UAAU,kBAAkB;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,wDAAwD;IACxD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uEAAuE;IACvE,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,SAAS,CAAC;CAC5C;AAED;;;GAGG;AACH,QAAA,MAAM,aAAa,GAAI,gDAMpB,kBAAkB,mDAiCpB,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { createPortal } from "react-dom";
|
|
4
|
+
import useDeskPanelHostStore from "../../store/deskPanelHost";
|
|
5
|
+
import { LAYOUT_WIDTHS } from "../../constants/layout";
|
|
6
|
+
import DeskPanelDrawer from "./DeskPanelDrawer";
|
|
7
|
+
/**
|
|
8
|
+
* CRM desk side panel opened from the chat header (members, search, library, info):
|
|
9
|
+
* an inline column where the workspace has room, otherwise an inset drawer over it.
|
|
10
|
+
*/
|
|
11
|
+
const DeskSidePanel = ({ open, label, onClose, autoFocus, children, }) => {
|
|
12
|
+
const host = useDeskPanelHostStore();
|
|
13
|
+
if (host.isInline && host.slot) {
|
|
14
|
+
return open
|
|
15
|
+
? createPortal(_jsx("aside", { "aria-label": label, className: "h-full shrink-0 overflow-hidden rounded-xl bg-white shadow-sm", style: { width: LAYOUT_WIDTHS.infoInline }, children: children(true) }), host.slot)
|
|
16
|
+
: null;
|
|
17
|
+
}
|
|
18
|
+
if (host.workspace) {
|
|
19
|
+
return (_jsx(DeskPanelDrawer, { open: open, label: label, onClose: onClose, container: host.workspace, autoFocus: autoFocus, children: _jsx("div", { className: "h-full overflow-hidden rounded-xl bg-white", children: children(false) }) }));
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
};
|
|
23
|
+
export default DeskSidePanel;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface TintedAvatarProps {
|
|
2
|
+
name: string;
|
|
3
|
+
src?: string | null;
|
|
4
|
+
size: number;
|
|
5
|
+
className?: string;
|
|
6
|
+
testId?: string;
|
|
7
|
+
}
|
|
8
|
+
/** CRM avatar: the photo when it loads, otherwise initials on one of the five mockup tints. */
|
|
9
|
+
declare const TintedAvatar: ({ name, src, size, className, testId, }: TintedAvatarProps) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export default TintedAvatar;
|
|
11
|
+
//# sourceMappingURL=TintedAvatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TintedAvatar.d.ts","sourceRoot":"","sources":["../../../src/components/common/TintedAvatar.tsx"],"names":[],"mappings":"AAKA,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,+FAA+F;AAC/F,QAAA,MAAM,YAAY,GAAI,yCAMnB,iBAAiB,4CA6BnB,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import clsx from "clsx";
|
|
5
|
+
import { getAvatarTint, getInitials } from "../../components/conversation/avatarTint";
|
|
6
|
+
/** CRM avatar: the photo when it loads, otherwise initials on one of the five mockup tints. */
|
|
7
|
+
const TintedAvatar = ({ name, src, size, className, testId = "tinted-avatar-initials", }) => {
|
|
8
|
+
const [failedSrc, setFailedSrc] = useState(null);
|
|
9
|
+
const dimension = { width: size, height: size };
|
|
10
|
+
if (src && src !== failedSrc) {
|
|
11
|
+
return (
|
|
12
|
+
// eslint-disable-next-line @next/next/no-img-element
|
|
13
|
+
_jsx("img", { src: src, alt: "", style: dimension, className: clsx("shrink-0 rounded-full object-cover", className), onError: () => setFailedSrc(src) }));
|
|
14
|
+
}
|
|
15
|
+
return (_jsx("span", { "aria-hidden": "true", "data-testid": testId, style: Object.assign(Object.assign({}, dimension), { fontSize: Math.round(size * 0.35) }), className: clsx("flex shrink-0 items-center justify-center rounded-full font-semibold", getAvatarTint(name), className), children: getInitials(name) }));
|
|
16
|
+
};
|
|
17
|
+
export default TintedAvatar;
|