@droppii-org/chat-sdk 0.6.56 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/canned-response/CannedResponseBody.d.ts.map +1 -1
- package/dist/components/canned-response/CannedResponseBody.js +4 -3
- package/dist/components/canned-response/CannedResponsePanel.d.ts +9 -0
- package/dist/components/canned-response/CannedResponsePanel.d.ts.map +1 -0
- package/dist/components/canned-response/CannedResponsePanel.js +72 -0
- package/dist/components/canned-response/CannedResponseRow.d.ts +10 -0
- package/dist/components/canned-response/CannedResponseRow.d.ts.map +1 -0
- package/dist/components/canned-response/CannedResponseRow.js +6 -0
- package/dist/components/canned-response/CannedScopeChips.d.ts +10 -0
- package/dist/components/canned-response/CannedScopeChips.d.ts.map +1 -0
- package/dist/components/canned-response/CannedScopeChips.js +34 -0
- package/dist/components/canned-response/cannedScopes.d.ts +16 -0
- package/dist/components/canned-response/cannedScopes.d.ts.map +1 -0
- package/dist/components/canned-response/cannedScopes.js +39 -0
- package/dist/components/canned-response/index.d.ts.map +1 -1
- package/dist/components/canned-response/index.js +11 -10
- package/dist/components/canned-response/insertCannedContent.d.ts +7 -0
- package/dist/components/canned-response/insertCannedContent.d.ts.map +1 -0
- package/dist/components/canned-response/insertCannedContent.js +39 -0
- package/dist/components/canned-response/team/TeamItem.d.ts.map +1 -1
- package/dist/components/canned-response/team/TeamItem.js +5 -4
- package/dist/components/common/ConfirmModal.d.ts +13 -1
- package/dist/components/common/ConfirmModal.d.ts.map +1 -1
- package/dist/components/common/ConfirmModal.js +24 -6
- package/dist/components/common/DeskPanelDrawer.d.ts +17 -0
- package/dist/components/common/DeskPanelDrawer.d.ts.map +1 -0
- package/dist/components/common/DeskPanelDrawer.js +21 -0
- package/dist/components/common/DeskSidePanel.d.ts +17 -0
- package/dist/components/common/DeskSidePanel.d.ts.map +1 -0
- package/dist/components/common/DeskSidePanel.js +23 -0
- package/dist/components/common/TintedAvatar.d.ts +11 -0
- package/dist/components/common/TintedAvatar.d.ts.map +1 -0
- package/dist/components/common/TintedAvatar.js +17 -0
- package/dist/components/compose/ComposeNewMessageModal.d.ts.map +1 -1
- package/dist/components/compose/ComposeNewMessageModal.js +11 -1
- package/dist/components/conversation/ConversationByGroupItem.d.ts.map +1 -1
- package/dist/components/conversation/ConversationByGroupItem.js +10 -6
- package/dist/components/conversation/ConversationBySessionItem.d.ts +4 -1
- package/dist/components/conversation/ConversationBySessionItem.d.ts.map +1 -1
- package/dist/components/conversation/ConversationBySessionItem.js +36 -10
- package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
- package/dist/components/conversation/DeskConversationList.js +44 -29
- package/dist/components/conversation/DeskConversationRow.d.ts +19 -0
- package/dist/components/conversation/DeskConversationRow.d.ts.map +1 -0
- package/dist/components/conversation/DeskConversationRow.js +18 -0
- package/dist/components/conversation/DeskListEmptyState.d.ts +6 -0
- package/dist/components/conversation/DeskListEmptyState.d.ts.map +1 -0
- package/dist/components/conversation/DeskListEmptyState.js +11 -0
- package/dist/components/conversation/DeskListHeader.d.ts +14 -0
- package/dist/components/conversation/DeskListHeader.d.ts.map +1 -0
- package/dist/components/conversation/DeskListHeader.js +39 -0
- package/dist/components/conversation/DeskListSkeleton.d.ts +6 -0
- package/dist/components/conversation/DeskListSkeleton.d.ts.map +1 -0
- package/dist/components/conversation/DeskListSkeleton.js +9 -0
- package/dist/components/conversation/DeskRowAvatar.d.ts +8 -0
- package/dist/components/conversation/DeskRowAvatar.d.ts.map +1 -0
- package/dist/components/conversation/DeskRowAvatar.js +6 -0
- package/dist/components/conversation/RowChip.d.ts +14 -0
- package/dist/components/conversation/RowChip.d.ts.map +1 -0
- package/dist/components/conversation/RowChip.js +11 -0
- package/dist/components/conversation/avatarTint.d.ts +6 -0
- package/dist/components/conversation/avatarTint.d.ts.map +1 -0
- package/dist/components/conversation/avatarTint.js +27 -0
- package/dist/components/conversation/folderEmptyState.d.ts +2 -0
- package/dist/components/conversation/folderEmptyState.d.ts.map +1 -0
- package/dist/components/conversation/folderEmptyState.js +14 -0
- package/dist/components/conversation/internalNotePreview.d.ts +6 -0
- package/dist/components/conversation/internalNotePreview.d.ts.map +1 -0
- package/dist/components/conversation/internalNotePreview.js +11 -0
- package/dist/components/conversation/listHeading.d.ts +19 -0
- package/dist/components/conversation/listHeading.d.ts.map +1 -0
- package/dist/components/conversation/listHeading.js +24 -0
- package/dist/components/conversation/rowDisplayName.d.ts +7 -0
- package/dist/components/conversation/rowDisplayName.d.ts.map +1 -0
- package/dist/components/conversation/rowDisplayName.js +8 -0
- package/dist/components/conversation/rowTime.d.ts +4 -0
- package/dist/components/conversation/rowTime.d.ts.map +1 -0
- package/dist/components/conversation/rowTime.js +10 -0
- package/dist/components/conversation-detail/PinLimitModal.d.ts.map +1 -1
- package/dist/components/conversation-detail/PinLimitModal.js +3 -1
- package/dist/components/group/AddMemberModal.d.ts.map +1 -1
- package/dist/components/group/AddMemberModal.js +15 -4
- package/dist/components/group/AdminPermissionModal.d.ts +1 -0
- package/dist/components/group/AdminPermissionModal.d.ts.map +1 -1
- package/dist/components/group/AdminPermissionModal.js +38 -3
- package/dist/components/group/CreateGroupForm.d.ts +3 -1
- package/dist/components/group/CreateGroupForm.d.ts.map +1 -1
- package/dist/components/group/CreateGroupForm.js +7 -1
- package/dist/components/group/CreateGroupFormCrmView.d.ts +23 -0
- package/dist/components/group/CreateGroupFormCrmView.d.ts.map +1 -0
- package/dist/components/group/CreateGroupFormCrmView.js +25 -0
- package/dist/components/group/DisableSendPermissionConfirm.d.ts +11 -0
- package/dist/components/group/DisableSendPermissionConfirm.d.ts.map +1 -0
- package/dist/components/group/DisableSendPermissionConfirm.js +10 -0
- package/dist/components/group/GroupCompositeAvatar.d.ts.map +1 -1
- package/dist/components/group/GroupCompositeAvatar.js +39 -4
- package/dist/components/group/GroupMemberPicker.d.ts +5 -2
- package/dist/components/group/GroupMemberPicker.d.ts.map +1 -1
- package/dist/components/group/GroupMemberPicker.js +8 -42
- package/dist/components/group/GroupMemberPickerCrm.d.ts +4 -0
- package/dist/components/group/GroupMemberPickerCrm.d.ts.map +1 -0
- package/dist/components/group/GroupMemberPickerCrm.js +48 -0
- package/dist/components/group/GroupMemberPickerLegacy.d.ts +8 -0
- package/dist/components/group/GroupMemberPickerLegacy.d.ts.map +1 -0
- package/dist/components/group/GroupMemberPickerLegacy.js +46 -0
- package/dist/components/group/GroupPanelHeader.d.ts +10 -0
- package/dist/components/group/GroupPanelHeader.d.ts.map +1 -0
- package/dist/components/group/GroupPanelHeader.js +11 -0
- package/dist/components/group/MemberPermissionPanel.d.ts.map +1 -1
- package/dist/components/group/MemberPermissionPanel.js +31 -2
- package/dist/components/group/PermissionPanelCrm.d.ts +24 -0
- package/dist/components/group/PermissionPanelCrm.d.ts.map +1 -0
- package/dist/components/group/PermissionPanelCrm.js +16 -0
- package/dist/components/group/PersonAvatar.d.ts +11 -0
- package/dist/components/group/PersonAvatar.d.ts.map +1 -0
- package/dist/components/group/PersonAvatar.js +21 -0
- package/dist/components/group/crmIcon.d.ts +9 -0
- package/dist/components/group/crmIcon.d.ts.map +1 -0
- package/dist/components/group/crmIcon.js +38 -0
- package/dist/components/icon/AdaptiveIcon.d.ts +15 -0
- package/dist/components/icon/AdaptiveIcon.d.ts.map +1 -0
- package/dist/components/icon/AdaptiveIcon.js +10 -0
- package/dist/components/icon/StrokeIcon.d.ts +14 -0
- package/dist/components/icon/StrokeIcon.d.ts.map +1 -0
- package/dist/components/icon/StrokeIcon.js +5 -0
- package/dist/components/icon/strokeIconNodes.d.ts +431 -0
- package/dist/components/icon/strokeIconNodes.d.ts.map +1 -0
- package/dist/components/icon/strokeIconNodes.js +269 -0
- package/dist/components/media-collection/index.d.ts.map +1 -1
- package/dist/components/media-collection/index.js +21 -5
- package/dist/components/message/GroupMembersDrawer.d.ts.map +1 -1
- package/dist/components/message/GroupMembersDrawer.js +60 -13
- package/dist/components/message/GroupMembersPanelCrm.d.ts +23 -0
- package/dist/components/message/GroupMembersPanelCrm.d.ts.map +1 -0
- package/dist/components/message/GroupMembersPanelCrm.js +55 -0
- package/dist/components/message/MessageHeader.d.ts.map +1 -1
- package/dist/components/message/MessageHeader.js +76 -27
- package/dist/components/message/MessageInfiniteScroll.d.ts +4 -2
- package/dist/components/message/MessageInfiniteScroll.d.ts.map +1 -1
- package/dist/components/message/MessageInfiniteScroll.js +1 -1
- package/dist/components/message/MessageList.d.ts +2 -1
- package/dist/components/message/MessageList.d.ts.map +1 -1
- package/dist/components/message/MessageList.js +12 -1
- package/dist/components/message/SelectSession.d.ts +4 -1
- package/dist/components/message/SelectSession.d.ts.map +1 -1
- package/dist/components/message/SelectSession.js +13 -4
- package/dist/components/message/UnassignedSessionFooter.js +2 -2
- package/dist/components/message/footer/ActionBar.d.ts +5 -1
- package/dist/components/message/footer/ActionBar.d.ts.map +1 -1
- package/dist/components/message/footer/ActionBar.js +14 -1
- package/dist/components/message/footer/CannedResponsePlugin.d.ts.map +1 -1
- package/dist/components/message/footer/CannedResponsePlugin.js +18 -3
- package/dist/components/message/footer/ClosedSessionBanner.d.ts +9 -0
- package/dist/components/message/footer/ClosedSessionBanner.d.ts.map +1 -0
- package/dist/components/message/footer/ClosedSessionBanner.js +13 -0
- package/dist/components/message/footer/ComposerEditor.d.ts.map +1 -1
- package/dist/components/message/footer/ComposerEditor.js +9 -4
- package/dist/components/message/footer/ComposerTabs.d.ts +1 -2
- package/dist/components/message/footer/ComposerTabs.d.ts.map +1 -1
- package/dist/components/message/footer/ComposerTabs.js +14 -35
- package/dist/components/message/footer/CrmComposerCard.d.ts +11 -0
- package/dist/components/message/footer/CrmComposerCard.d.ts.map +1 -0
- package/dist/components/message/footer/CrmComposerCard.js +30 -0
- package/dist/components/message/footer/EnterHandler.d.ts.map +1 -1
- package/dist/components/message/footer/EnterHandler.js +3 -0
- package/dist/components/message/footer/FilePreview.js +2 -2
- package/dist/components/message/footer/LinkInputPreview.js +2 -2
- package/dist/components/message/footer/MediaActions.d.ts +2 -1
- package/dist/components/message/footer/MediaActions.d.ts.map +1 -1
- package/dist/components/message/footer/MediaActions.js +21 -4
- package/dist/components/message/footer/SessionClosedModal.d.ts +3 -1
- package/dist/components/message/footer/SessionClosedModal.d.ts.map +1 -1
- package/dist/components/message/footer/SessionClosedModal.js +6 -2
- package/dist/components/message/footer/ToolbarPlugin.d.ts +3 -1
- package/dist/components/message/footer/ToolbarPlugin.d.ts.map +1 -1
- package/dist/components/message/footer/ToolbarPlugin.js +2 -2
- package/dist/components/message/footer/clearComposerHistory.d.ts +3 -0
- package/dist/components/message/footer/clearComposerHistory.d.ts.map +1 -0
- package/dist/components/message/footer/clearComposerHistory.js +11 -0
- package/dist/components/message/footer/index.d.ts +2 -2
- package/dist/components/message/footer/index.d.ts.map +1 -1
- package/dist/components/message/footer/index.js +15 -5
- package/dist/components/message/footer/mention/MentionMenu.d.ts.map +1 -1
- package/dist/components/message/footer/mention/MentionMenu.js +4 -1
- package/dist/components/message/footer/useComposerFocusRequest.d.ts +10 -0
- package/dist/components/message/footer/useComposerFocusRequest.d.ts.map +1 -0
- package/dist/components/message/footer/useComposerFocusRequest.js +28 -0
- package/dist/components/message/groupMemberMenuCrm.d.ts +32 -0
- package/dist/components/message/groupMemberMenuCrm.d.ts.map +1 -0
- package/dist/components/message/groupMemberMenuCrm.js +83 -0
- package/dist/components/message/groupMemberTypes.d.ts +13 -0
- package/dist/components/message/groupMemberTypes.d.ts.map +1 -0
- package/dist/components/message/groupMemberTypes.js +1 -0
- package/dist/components/message/headerIconButton.d.ts +10 -0
- package/dist/components/message/headerIconButton.d.ts.map +1 -0
- package/dist/components/message/headerIconButton.js +9 -0
- package/dist/components/message/item/CrmSystemLine.d.ts +10 -0
- package/dist/components/message/item/CrmSystemLine.d.ts.map +1 -0
- package/dist/components/message/item/CrmSystemLine.js +6 -0
- package/dist/components/message/item/DateDivider.d.ts +5 -0
- package/dist/components/message/item/DateDivider.d.ts.map +1 -0
- package/dist/components/message/item/DateDivider.js +5 -0
- package/dist/components/message/item/GroupNotificationMessage.d.ts.map +1 -1
- package/dist/components/message/item/GroupNotificationMessage.js +9 -0
- package/dist/components/message/item/MemberEventSummary.d.ts +8 -0
- package/dist/components/message/item/MemberEventSummary.d.ts.map +1 -0
- package/dist/components/message/item/MemberEventSummary.js +18 -0
- package/dist/components/message/item/MessageBubble.d.ts +3 -1
- package/dist/components/message/item/MessageBubble.d.ts.map +1 -1
- package/dist/components/message/item/MessageBubble.js +27 -13
- package/dist/components/message/item/MessageMoreButton.d.ts +13 -0
- package/dist/components/message/item/MessageMoreButton.d.ts.map +1 -0
- package/dist/components/message/item/MessageMoreButton.js +42 -0
- package/dist/components/message/item/RevokeMessage.js +1 -1
- package/dist/components/message/item/SessionEventMessage.d.ts.map +1 -1
- package/dist/components/message/item/SessionEventMessage.js +13 -1
- package/dist/components/message/item/SystemLogMessage.d.ts.map +1 -1
- package/dist/components/message/item/SystemLogMessage.js +7 -0
- package/dist/components/message/item/index.d.ts.map +1 -1
- package/dist/components/message/item/index.js +64 -15
- package/dist/components/message/item/otherSenders.d.ts +7 -0
- package/dist/components/message/item/otherSenders.d.ts.map +1 -0
- package/dist/components/message/item/otherSenders.js +29 -0
- package/dist/components/message/item/textStyle.d.ts +1 -1
- package/dist/components/message/item/textStyle.d.ts.map +1 -1
- package/dist/components/message/item/textStyle.js +2 -2
- package/dist/components/message/messageKeyboardNav.d.ts +8 -0
- package/dist/components/message/messageKeyboardNav.d.ts.map +1 -0
- package/dist/components/message/messageKeyboardNav.js +24 -0
- package/dist/components/message/reply/ReplyPreviewBar.js +2 -2
- package/dist/components/message/toolbox/MessageToolboxMenu.d.ts.map +1 -1
- package/dist/components/message/toolbox/MessageToolboxMenu.js +16 -1
- package/dist/components/search-conversation/SearchAll.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchAll.js +12 -1
- package/dist/components/search-conversation/SearchDrawer.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchDrawer.js +31 -15
- package/dist/components/search-conversation/SearchMessageOnCurrentConversation.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchMessageOnCurrentConversation.js +5 -2
- package/dist/components/search-conversation/index.d.ts.map +1 -1
- package/dist/components/search-conversation/index.js +3 -1
- package/dist/components/search-conversation/item/SearchItemAsGroup.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsGroup.js +14 -4
- package/dist/components/search-conversation/item/SearchItemAsMessage.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsMessage.js +18 -7
- package/dist/components/search-conversation/item/SearchItemAsUser.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsUser.js +23 -5
- package/dist/components/search-conversation/item/searchRowClass.d.ts +3 -0
- package/dist/components/search-conversation/item/searchRowClass.d.ts.map +1 -0
- package/dist/components/search-conversation/item/searchRowClass.js +5 -0
- package/dist/components/session/DeskAssignedSession.d.ts +5 -1
- package/dist/components/session/DeskAssignedSession.d.ts.map +1 -1
- package/dist/components/session/DeskAssignedSession.js +40 -12
- package/dist/components/session/DeskTeamInbox.d.ts.map +1 -1
- package/dist/components/session/DeskTeamInbox.js +15 -22
- package/dist/components/session/FolderRow.d.ts +21 -0
- package/dist/components/session/FolderRow.d.ts.map +1 -0
- package/dist/components/session/FolderRow.js +16 -0
- package/dist/components/session/SessionFolderList.d.ts +23 -0
- package/dist/components/session/SessionFolderList.d.ts.map +1 -0
- package/dist/components/session/SessionFolderList.js +27 -0
- package/dist/components/session/sessionFilters.d.ts +24 -0
- package/dist/components/session/sessionFilters.d.ts.map +1 -0
- package/dist/components/session/sessionFilters.js +80 -0
- package/dist/components/shortcut-help/ShortcutHelpModal.d.ts +8 -0
- package/dist/components/shortcut-help/ShortcutHelpModal.d.ts.map +1 -0
- package/dist/components/shortcut-help/ShortcutHelpModal.js +23 -0
- package/dist/components/thread/AssignConfirmModal.d.ts.map +1 -1
- package/dist/components/thread/AssignConfirmModal.js +4 -3
- package/dist/components/thread/EndSessionConfirm.d.ts +11 -0
- package/dist/components/thread/EndSessionConfirm.d.ts.map +1 -0
- package/dist/components/thread/EndSessionConfirm.js +31 -0
- package/dist/components/thread/EndSessionToast.d.ts +6 -0
- package/dist/components/thread/EndSessionToast.d.ts.map +1 -0
- package/dist/components/thread/EndSessionToast.js +18 -0
- package/dist/components/thread/GroupInfoBodyCrm.d.ts +46 -0
- package/dist/components/thread/GroupInfoBodyCrm.d.ts.map +1 -0
- package/dist/components/thread/GroupInfoBodyCrm.js +41 -0
- package/dist/components/thread/GroupInfoRows.d.ts +33 -0
- package/dist/components/thread/GroupInfoRows.d.ts.map +1 -0
- package/dist/components/thread/GroupInfoRows.js +18 -0
- package/dist/components/thread/GroupThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/GroupThreadInfo.js +23 -6
- package/dist/components/thread/ManualAssignPopover.d.ts +3 -1
- package/dist/components/thread/ManualAssignPopover.d.ts.map +1 -1
- package/dist/components/thread/ManualAssignPopover.js +21 -9
- package/dist/components/thread/SessionDetailCard.d.ts +6 -0
- package/dist/components/thread/SessionDetailCard.d.ts.map +1 -0
- package/dist/components/thread/SessionDetailCard.js +103 -0
- package/dist/components/thread/SessionSection.d.ts +2 -4
- package/dist/components/thread/SessionSection.d.ts.map +1 -1
- package/dist/components/thread/SessionSection.js +19 -122
- package/dist/components/thread/SessionTagPicker.d.ts +11 -0
- package/dist/components/thread/SessionTagPicker.d.ts.map +1 -0
- package/dist/components/thread/SessionTagPicker.js +27 -0
- package/dist/components/thread/SingleThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/SingleThreadInfo.js +16 -6
- package/dist/components/thread/SupportSessionPanel.d.ts +18 -0
- package/dist/components/thread/SupportSessionPanel.d.ts.map +1 -0
- package/dist/components/thread/SupportSessionPanel.js +46 -0
- package/dist/components/thread/ThreadInfo.d.ts +8 -1
- package/dist/components/thread/ThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/ThreadInfo.js +27 -29
- package/dist/components/thread/ThreadInfoHeader.d.ts +13 -0
- package/dist/components/thread/ThreadInfoHeader.d.ts.map +1 -0
- package/dist/components/thread/ThreadInfoHeader.js +11 -0
- package/dist/components/thread/UserSection.d.ts.map +1 -1
- package/dist/components/thread/UserSection.js +35 -22
- package/dist/components/thread/sessionDateFormat.d.ts +3 -0
- package/dist/components/thread/sessionDateFormat.d.ts.map +1 -0
- package/dist/components/thread/sessionDateFormat.js +13 -0
- package/dist/components/thread/sessionDuration.d.ts +5 -0
- package/dist/components/thread/sessionDuration.d.ts.map +1 -0
- package/dist/components/thread/sessionDuration.js +24 -0
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +2 -0
- package/dist/constants/layout.d.ts +24 -0
- package/dist/constants/layout.d.ts.map +1 -0
- package/dist/constants/layout.js +23 -0
- package/dist/context/ChatContext.d.ts.map +1 -1
- package/dist/context/ChatContext.js +27 -1
- package/dist/hooks/canned-response/useSearchCannedAcrossScopes.d.ts +7 -0
- package/dist/hooks/canned-response/useSearchCannedAcrossScopes.d.ts.map +1 -0
- package/dist/hooks/canned-response/useSearchCannedAcrossScopes.js +46 -0
- package/dist/hooks/common/useCloseOnSidePanelOpen.d.ts +3 -0
- package/dist/hooks/common/useCloseOnSidePanelOpen.d.ts.map +1 -0
- package/dist/hooks/common/useCloseOnSidePanelOpen.js +15 -0
- package/dist/hooks/common/useDeskShortcuts.d.ts +11 -0
- package/dist/hooks/common/useDeskShortcuts.d.ts.map +1 -0
- package/dist/hooks/common/useDeskShortcuts.js +94 -0
- package/dist/hooks/common/useEscapeLayer.d.ts +3 -0
- package/dist/hooks/common/useEscapeLayer.d.ts.map +1 -0
- package/dist/hooks/common/useEscapeLayer.js +18 -0
- package/dist/hooks/common/useMediaQuery.d.ts +3 -0
- package/dist/hooks/common/useMediaQuery.d.ts.map +1 -0
- package/dist/hooks/common/useMediaQuery.js +12 -0
- package/dist/hooks/common/useSidePanel.d.ts +12 -0
- package/dist/hooks/common/useSidePanel.d.ts.map +1 -0
- package/dist/hooks/common/useSidePanel.js +32 -0
- package/dist/hooks/group/useConversationGroups.d.ts.map +1 -1
- package/dist/hooks/group/useConversationGroups.js +3 -0
- package/dist/hooks/message/useNewMessageAnnouncement.d.ts +3 -0
- package/dist/hooks/message/useNewMessageAnnouncement.d.ts.map +1 -0
- package/dist/hooks/message/useNewMessageAnnouncement.js +30 -0
- package/dist/hooks/search/useSearchGroups.js +2 -1
- package/dist/hooks/search/useSearchMessage.d.ts +3 -1
- package/dist/hooks/search/useSearchMessage.d.ts.map +1 -1
- package/dist/hooks/search/useSearchMessage.js +2 -2
- package/dist/hooks/session/useBotSessionOwnerIdentity.d.ts +12 -0
- package/dist/hooks/session/useBotSessionOwnerIdentity.d.ts.map +1 -0
- package/dist/hooks/session/useBotSessionOwnerIdentity.js +22 -0
- package/dist/hooks/session/useCloseSession.d.ts +1 -0
- package/dist/hooks/session/useCloseSession.d.ts.map +1 -1
- package/dist/hooks/session/useCloseSession.js +9 -8
- package/dist/hooks/session/useEndSession.d.ts +11 -0
- package/dist/hooks/session/useEndSession.d.ts.map +1 -0
- package/dist/hooks/session/useEndSession.js +45 -0
- package/dist/hooks/session/useGetSession.d.ts.map +1 -1
- package/dist/hooks/session/useGetSession.js +27 -6
- package/dist/hooks/session/usePendingSessionClose.d.ts +5 -0
- package/dist/hooks/session/usePendingSessionClose.d.ts.map +1 -0
- package/dist/hooks/session/usePendingSessionClose.js +12 -0
- package/dist/hooks/session/useSessionCustomerName.d.ts +3 -0
- package/dist/hooks/session/useSessionCustomerName.d.ts.map +1 -0
- package/dist/hooks/session/useSessionCustomerName.js +19 -0
- package/dist/hooks/session/useSessionFieldAutosave.d.ts +19 -0
- package/dist/hooks/session/useSessionFieldAutosave.d.ts.map +1 -0
- package/dist/hooks/session/useSessionFieldAutosave.js +52 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/locales/vi/common.json +201 -21
- package/dist/locales/vi/conversation-inbox.json +21 -2
- package/dist/screens/desk-message/DeskWorkspace.d.ts +12 -0
- package/dist/screens/desk-message/DeskWorkspace.d.ts.map +1 -0
- package/dist/screens/desk-message/DeskWorkspace.js +57 -0
- package/dist/screens/desk-message/FolderOverlay.d.ts +4 -0
- package/dist/screens/desk-message/FolderOverlay.d.ts.map +1 -0
- package/dist/screens/desk-message/FolderOverlay.js +32 -0
- package/dist/screens/desk-message/SkipLinks.d.ts +4 -0
- package/dist/screens/desk-message/SkipLinks.d.ts.map +1 -0
- package/dist/screens/desk-message/SkipLinks.js +19 -0
- package/dist/screens/desk-message/ViewportNotice.d.ts +4 -0
- package/dist/screens/desk-message/ViewportNotice.d.ts.map +1 -0
- package/dist/screens/desk-message/ViewportNotice.js +9 -0
- package/dist/screens/desk-message/index.d.ts +3 -2
- package/dist/screens/desk-message/index.d.ts.map +1 -1
- package/dist/screens/desk-message/index.js +4 -12
- package/dist/store/deskPanelHost.d.ts +13 -0
- package/dist/store/deskPanelHost.d.ts.map +1 -0
- package/dist/store/deskPanelHost.js +9 -0
- package/dist/store/escapeLayers.d.ts +15 -0
- package/dist/store/escapeLayers.d.ts.map +1 -0
- package/dist/store/escapeLayers.js +15 -0
- package/dist/store/pendingSessionClose.d.ts +19 -0
- package/dist/store/pendingSessionClose.d.ts.map +1 -0
- package/dist/store/pendingSessionClose.js +74 -0
- package/dist/store/session.d.ts +2 -1
- package/dist/store/session.d.ts.map +1 -1
- package/dist/store/session.js +4 -1
- package/dist/store/sessionFolder.d.ts +15 -0
- package/dist/store/sessionFolder.d.ts.map +1 -0
- package/dist/store/sessionFolder.js +18 -0
- package/dist/store/shortcutPrefs.d.ts +9 -0
- package/dist/store/shortcutPrefs.d.ts.map +1 -0
- package/dist/store/shortcutPrefs.js +23 -0
- package/dist/store/sidePanel.d.ts +12 -0
- package/dist/store/sidePanel.d.ts.map +1 -0
- package/dist/store/sidePanel.js +9 -0
- package/dist/store/workspaceLayout.d.ts +12 -0
- package/dist/store/workspaceLayout.d.ts.map +1 -0
- package/dist/store/workspaceLayout.js +9 -0
- package/dist/styles/global.css +1 -1
- package/dist/types/chat.d.ts +18 -0
- package/dist/types/chat.d.ts.map +1 -1
- package/dist/types/dto.d.ts +2 -1
- package/dist/types/dto.d.ts.map +1 -1
- package/dist/utils/a11yClickable.d.ts +10 -0
- package/dist/utils/a11yClickable.d.ts.map +1 -0
- package/dist/utils/a11yClickable.js +15 -0
- package/dist/utils/events.d.ts +4 -0
- package/dist/utils/events.d.ts.map +1 -1
- package/dist/utils/headerMemberCount.d.ts +10 -0
- package/dist/utils/headerMemberCount.d.ts.map +1 -0
- package/dist/utils/headerMemberCount.js +3 -0
- package/dist/utils/memberEventRun.d.ts +16 -0
- package/dist/utils/memberEventRun.d.ts.map +1 -0
- package/dist/utils/memberEventRun.js +40 -0
- package/package.json +2 -2
- package/dist/components/session/SessionFilterMenu.d.ts +0 -15
- package/dist/components/session/SessionFilterMenu.d.ts.map +0 -1
- package/dist/components/session/SessionFilterMenu.js +0 -30
- package/dist/components/session/sessionMenuItems.d.ts +0 -28
- package/dist/components/session/sessionMenuItems.d.ts.map +0 -1
- package/dist/components/session/sessionMenuItems.js +0 -119
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// The five tints of the approved mockups; text shades keep at least 4.5:1 contrast.
|
|
2
|
+
export const AVATAR_TINTS = [
|
|
3
|
+
"bg-secondary-25 text-secondary-600",
|
|
4
|
+
"bg-primary-25 text-primary-500",
|
|
5
|
+
"bg-success-25 text-success-900",
|
|
6
|
+
"bg-warning-25 text-warning-800",
|
|
7
|
+
"bg-[var(--dc-color-neutral-surface)] text-gray-900",
|
|
8
|
+
];
|
|
9
|
+
const hashString = (value) => {
|
|
10
|
+
let hash = 5381;
|
|
11
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
12
|
+
hash = ((hash << 5) + hash + value.charCodeAt(i)) >>> 0;
|
|
13
|
+
}
|
|
14
|
+
return hash;
|
|
15
|
+
};
|
|
16
|
+
/** Same name always gets the same tint, so a customer keeps their colour across lists. */
|
|
17
|
+
export const getAvatarTint = (name) => AVATAR_TINTS[hashString(name.trim().toLowerCase()) % AVATAR_TINTS.length];
|
|
18
|
+
/** Initials from the last two words that start with a letter ("Lê Quốc Bảo" -> "QB"). */
|
|
19
|
+
export const getInitials = (name) => {
|
|
20
|
+
const words = name
|
|
21
|
+
.split(/\s+/)
|
|
22
|
+
.map((word) => { var _a; return (_a = Array.from(word)[0]) !== null && _a !== void 0 ? _a : ""; })
|
|
23
|
+
.filter((char) => /\p{L}/u.test(char));
|
|
24
|
+
if (words.length === 0)
|
|
25
|
+
return "?";
|
|
26
|
+
return words.slice(-2).join("").toUpperCase();
|
|
27
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folderEmptyState.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/folderEmptyState.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,iBAAiB,GAAI,WAAW,MAAM,KAAG,MACI,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { SessionStatus, SessionTag } from "../../types/chat";
|
|
2
|
+
import { ALL_GROUPS_KEY } from "../../components/session/sessionFilters";
|
|
3
|
+
/** i18n key of the empty-list sentence for each folder; never reuses the search screen's wording. */
|
|
4
|
+
const EMPTY_KEY_BY_FILTER = {
|
|
5
|
+
[SessionTag.SLOW_PROCESSING]: "folder_empty_slow_processing",
|
|
6
|
+
[SessionStatus.WAITING_PROCESS]: "folder_empty_waiting_process",
|
|
7
|
+
[SessionTag.AWAITING_REPLY]: "folder_empty_awaiting_reply",
|
|
8
|
+
[SessionStatus.IN_PROCESS]: "folder_empty_in_process",
|
|
9
|
+
[SessionTag.TEMPORARILY_PAUSED]: "folder_empty_temporarily_paused",
|
|
10
|
+
[SessionStatus.COMPLETED]: "folder_empty_completed",
|
|
11
|
+
[SessionStatus.UNASSIGNED]: "folder_empty_unassigned",
|
|
12
|
+
[ALL_GROUPS_KEY]: "folder_empty_all_groups",
|
|
13
|
+
};
|
|
14
|
+
export const getFolderEmptyKey = (filterKey) => { var _a; return (_a = EMPTY_KEY_BY_FILTER[filterKey]) !== null && _a !== void 0 ? _a : "folder_empty_default"; };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { TFunction } from "i18next";
|
|
2
|
+
import { parseLatestMessage } from "../../utils/common";
|
|
3
|
+
type PreviewConversation = Parameters<typeof parseLatestMessage>[3];
|
|
4
|
+
export declare const buildSessionPreview: (latestMsg: string, userId: string | undefined, t: TFunction, conversation: PreviewConversation) => string;
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=internalNotePreview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internalNotePreview.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/internalNotePreview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAA2B,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAE7E,KAAK,mBAAmB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;AAGpE,eAAO,MAAM,mBAAmB,GAC9B,WAAW,MAAM,EACjB,QAAQ,MAAM,GAAG,SAAS,EAC1B,GAAG,SAAS,EACZ,cAAc,mBAAmB,KAChC,MAQF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { isInternalLatestMessage, parseLatestMessage } from "../../utils/common";
|
|
2
|
+
// Desk list only: an internal note reads "Tin nhắn nội bộ: …" instead of a sender name.
|
|
3
|
+
export const buildSessionPreview = (latestMsg, userId, t, conversation) => {
|
|
4
|
+
if (!isInternalLatestMessage(latestMsg)) {
|
|
5
|
+
return parseLatestMessage(latestMsg, userId, t, conversation);
|
|
6
|
+
}
|
|
7
|
+
const text = parseLatestMessage(latestMsg, userId, t, conversation, {
|
|
8
|
+
includeSenderPrefix: false,
|
|
9
|
+
});
|
|
10
|
+
return text ? `${t("internal_preview_prefix")}: ${text}` : "";
|
|
11
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ActiveFolder } from "../../store/sessionFolder";
|
|
2
|
+
import type { ISessionSummaryResponse, ITeamSessionSummaryItem } from "../../types/dto";
|
|
3
|
+
export interface ListHeading {
|
|
4
|
+
/** Small line above the title: "my messages" or the team name. */
|
|
5
|
+
contextKey?: string;
|
|
6
|
+
contextText?: string;
|
|
7
|
+
titleKey: string;
|
|
8
|
+
/** Count from the summary; hidden when 0 or unknown. */
|
|
9
|
+
count?: number;
|
|
10
|
+
}
|
|
11
|
+
interface HeadingInput {
|
|
12
|
+
folder: ActiveFolder;
|
|
13
|
+
mySummary?: ISessionSummaryResponse;
|
|
14
|
+
teams?: ITeamSessionSummaryItem[];
|
|
15
|
+
}
|
|
16
|
+
/** Heading text that always describes the folder the list is built from. */
|
|
17
|
+
export declare const getListHeading: ({ folder, mySummary, teams }: HeadingInput) => ListHeading;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=listHeading.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listHeading.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/listHeading.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAMpF,MAAM,WAAW,WAAW;IAC1B,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,YAAY;IACpB,MAAM,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC,KAAK,CAAC,EAAE,uBAAuB,EAAE,CAAC;CACnC;AAED,4EAA4E;AAC5E,eAAO,MAAM,cAAc,GAAI,8BAA8B,YAAY,KAAG,WAoB3E,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { getFilterConfig, getFilterCount, } from "../../components/session/sessionFilters";
|
|
2
|
+
/** Heading text that always describes the folder the list is built from. */
|
|
3
|
+
export const getListHeading = ({ folder, mySummary, teams }) => {
|
|
4
|
+
var _a;
|
|
5
|
+
if (folder.scope === "allGroups") {
|
|
6
|
+
return { contextKey: "my_messages", titleKey: "all_groups" };
|
|
7
|
+
}
|
|
8
|
+
const config = getFilterConfig(folder.filterKey);
|
|
9
|
+
const titleKey = (_a = config === null || config === void 0 ? void 0 : config.labelKey) !== null && _a !== void 0 ? _a : "active_sessions";
|
|
10
|
+
if (folder.scope === "team") {
|
|
11
|
+
const team = teams === null || teams === void 0 ? void 0 : teams.find((item) => item.teamId === folder.teamId);
|
|
12
|
+
return {
|
|
13
|
+
contextText: team === null || team === void 0 ? void 0 : team.teamName,
|
|
14
|
+
contextKey: team ? undefined : "team_messages",
|
|
15
|
+
titleKey,
|
|
16
|
+
count: config ? getFilterCount(config, team === null || team === void 0 ? void 0 : team.summary) : undefined,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
return {
|
|
20
|
+
contextKey: "my_messages",
|
|
21
|
+
titleKey,
|
|
22
|
+
count: config ? getFilterCount(config, mySummary) : undefined,
|
|
23
|
+
};
|
|
24
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Splits "Full Name (username)" so the list can show the name and keep the username for a tooltip. */
|
|
2
|
+
export declare const splitDisplayName: (displayName: string) => {
|
|
3
|
+
name: string;
|
|
4
|
+
username?: string;
|
|
5
|
+
};
|
|
6
|
+
export declare const joinDisplayName: (name: string, username?: string) => string;
|
|
7
|
+
//# sourceMappingURL=rowDisplayName.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rowDisplayName.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/rowDisplayName.ts"],"names":[],"mappings":"AAAA,uGAAuG;AACvG,eAAO,MAAM,gBAAgB,GAC3B,aAAa,MAAM,KAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAInC,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,EAAE,WAAW,MAAM,KAAG,MACvB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Splits "Full Name (username)" so the list can show the name and keep the username for a tooltip. */
|
|
2
|
+
export const splitDisplayName = (displayName) => {
|
|
3
|
+
const match = displayName.match(/^(.*?)\s*\(([^()]+)\)\s*$/);
|
|
4
|
+
if (!match || !match[1].trim())
|
|
5
|
+
return { name: displayName.trim() };
|
|
6
|
+
return { name: match[1].trim(), username: match[2].trim() };
|
|
7
|
+
};
|
|
8
|
+
export const joinDisplayName = (name, username) => username ? `${name} (${username})` : name;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import dayjs from "dayjs";
|
|
2
|
+
/** List row time: "HH:mm" today, "Hôm qua" yesterday, otherwise "DD/MM" (with the year when it differs). */
|
|
3
|
+
export declare const formatListRowTime: (timestamp: number, t: (key: string) => string, now?: dayjs.Dayjs) => string;
|
|
4
|
+
//# sourceMappingURL=rowTime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rowTime.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/rowTime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,4GAA4G;AAC5G,eAAO,MAAM,iBAAiB,GAC5B,WAAW,MAAM,EACjB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EAC1B,MAAK,KAAK,CAAC,KAAe,KACzB,MAKF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import dayjs from "dayjs";
|
|
2
|
+
/** List row time: "HH:mm" today, "Hôm qua" yesterday, otherwise "DD/MM" (with the year when it differs). */
|
|
3
|
+
export const formatListRowTime = (timestamp, t, now = dayjs()) => {
|
|
4
|
+
const date = dayjs(timestamp);
|
|
5
|
+
if (date.isSame(now, "day"))
|
|
6
|
+
return date.format("HH:mm");
|
|
7
|
+
if (date.isSame(now.subtract(1, "day"), "day"))
|
|
8
|
+
return t("yesterday");
|
|
9
|
+
return date.format(date.isSame(now, "year") ? "DD/MM" : "DD/MM/YYYY");
|
|
10
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PinLimitModal.d.ts","sourceRoot":"","sources":["../../../src/components/conversation-detail/PinLimitModal.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PinLimitModal.d.ts","sourceRoot":"","sources":["../../../src/components/conversation-detail/PinLimitModal.tsx"],"names":[],"mappings":"AAIA,UAAU,kBAAkB;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,QAAA,MAAM,aAAa,GAAI,wBAAwB,kBAAkB,4CAqChE,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Modal, Button } from "antd";
|
|
3
3
|
import { useTranslation } from "react-i18next";
|
|
4
|
+
import useAuthStore from "../../store/auth";
|
|
4
5
|
const PinLimitModal = ({ open, max, onClose }) => {
|
|
5
6
|
const { t } = useTranslation();
|
|
6
|
-
|
|
7
|
+
const isCrm = useAuthStore((state) => state.isCrm);
|
|
8
|
+
return (_jsx(Modal, { open: open, onCancel: onClose, footer: null, centered: true, width: 400, destroyOnHidden: isCrm, "data-cp-name": "PinLimitModal", children: _jsxs("div", { className: "flex flex-col gap-2 pt-2", role: "alertdialog", "aria-label": t("pin_limit_modal_title"), children: [_jsx("p", { className: "text-lg font-semibold text-gray-900", children: t("pin_limit_modal_title") }), _jsx("p", { className: "text-base text-gray-600", children: t("pin_limit_modal_description", { max }) }), _jsx(Button, { type: "primary", size: "large", block: true, className: "mt-2 !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)]", onClick: onClose, children: t("pin_limit_modal_confirm") })] }) }));
|
|
7
9
|
};
|
|
8
10
|
export default PinLimitModal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddMemberModal.d.ts","sourceRoot":"","sources":["../../../src/components/group/AddMemberModal.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AddMemberModal.d.ts","sourceRoot":"","sources":["../../../src/components/group/AddMemberModal.tsx"],"names":[],"mappings":"AAiBA,UAAU,mBAAmB;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,QAAA,MAAM,cAAc,GAAI,6BAIrB,mBAAmB,4CA8OrB,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { clickableProps, FOCUS_RING_CLASS } from "../../utils/a11yClickable";
|
|
3
4
|
import { useDebounce } from "ahooks";
|
|
4
5
|
import { Avatar, Button, Empty, Input, Modal, Spin, message } from "antd";
|
|
5
6
|
import clsx from "clsx";
|
|
@@ -9,13 +10,18 @@ import { Icon } from "../../components/icon";
|
|
|
9
10
|
import { useEligibleAccountsForGroup } from "../../hooks/group/useEligibleAccountsForGroup";
|
|
10
11
|
import { useAddGroupMember } from "../../hooks/group/useAddGroupMember";
|
|
11
12
|
import { formatMemberLabel } from "../../utils/common";
|
|
13
|
+
import useAuthStore from "../../store/auth";
|
|
14
|
+
import useConversationStore from "../../store/conversation";
|
|
15
|
+
import GroupMemberPicker from "./GroupMemberPicker";
|
|
12
16
|
const AddMemberModal = ({ open, groupID, onClose, }) => {
|
|
13
17
|
const { t } = useTranslation("conversation-inbox");
|
|
14
18
|
const { t: tCommon } = useTranslation();
|
|
19
|
+
const isCrm = useAuthStore((state) => state.isCrm);
|
|
20
|
+
const groupName = useConversationStore((state) => { var _a; return (_a = state.currentGroupInfo.get(groupID)) === null || _a === void 0 ? void 0 : _a.groupName; });
|
|
15
21
|
const [search, setSearch] = useState("");
|
|
16
22
|
const [selectedMembers, setSelectedMembers] = useState([]);
|
|
17
23
|
const debouncedSearch = useDebounce(search, { wait: 300 });
|
|
18
|
-
const { accounts, isLoading, fetchNextPage, hasNextPage, isFetchingNextPage } = useEligibleAccountsForGroup(debouncedSearch, groupID, open);
|
|
24
|
+
const { accounts, isLoading, fetchNextPage, hasNextPage, isFetchingNextPage } = useEligibleAccountsForGroup(debouncedSearch, groupID, open && !isCrm);
|
|
19
25
|
const { mutateAsync: addGroupMember, isPending: isSubmitting } = useAddGroupMember();
|
|
20
26
|
const selectedIds = new Set(selectedMembers.map((member) => member.userID));
|
|
21
27
|
const toggleMember = (account) => {
|
|
@@ -61,11 +67,16 @@ const AddMemberModal = ({ open, groupID, onClose, }) => {
|
|
|
61
67
|
message.error(errorMessage);
|
|
62
68
|
}
|
|
63
69
|
};
|
|
64
|
-
|
|
70
|
+
if (isCrm) {
|
|
71
|
+
return (_jsx(Modal, { "data-cp-name": "AddMemberModal", centered: true, open: open, onCancel: handleClose, title: _jsxs("span", { className: "flex flex-col gap-0.5", children: [t("add_member.title_crm"), groupName && (_jsx("span", { className: "text-[13px] font-normal text-gray-600", children: groupName }))] }), width: 720, getContainer: false, destroyOnHidden: true, footer: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "flex-1 text-left text-[13px] text-gray-600", children: t("add_member.selected_footer", { count: selectedMembers.length }) }), _jsx(Button, { onClick: handleClose, children: t("create_group.cancel_crm") }), _jsx(Button, { type: "primary", disabled: selectedMembers.length === 0, loading: isSubmitting, onClick: handleSubmit, children: selectedMembers.length > 0
|
|
72
|
+
? t("add_member.submit", { count: selectedMembers.length })
|
|
73
|
+
: t("add_member.submit_empty") })] }), children: _jsx(GroupMemberPicker, { groupID: groupID, selectedMembers: selectedMembers, onChangeSelectedMembers: setSelectedMembers }) }));
|
|
74
|
+
}
|
|
75
|
+
return (_jsx(Modal, { "data-cp-name": "AddMemberModal", centered: true, open: open, onCancel: handleClose, footer: null, title: t("add_member.title"), getContainer: false, destroyOnHidden: true, children: _jsxs("div", { className: "flex flex-col gap-3 pt-2", children: [_jsx(Input, { value: search, onChange: (event) => setSearch(event.target.value), placeholder: t("create_group.search_member_placeholder"), prefix: _jsx(Icon, { icon: "search-o", size: 16, className: "text-gray-400" }) }), _jsxs("div", { className: "flex items-center justify-between px-1", children: [_jsx("span", { className: "text-sm text-gray-500", children: t("create_group.selected_count", { count: selectedMembers.length }) }), selectedMembers.length > 0 && (_jsx("button", { type: "button", className: "text-sm text-[var(--dc-color-primary)] hover:text-[var(--dc-color-primary-hover)] hover:underline", onClick: handleClearAll, children: t("create_group.clear_all") }))] }), selectedMembers.length > 0 && (_jsx("div", { className: "flex flex-wrap gap-2", children: selectedMembers.map((member) => (_jsxs("span", { className: "flex items-center gap-1.5 rounded-full bg-gray-100 pl-1 pr-2 py-1", children: [_jsx(Avatar, { src: member.avatar, size: 20, className: "shrink-0", children: member.displayName.charAt(0) || "A" }), _jsx("span", { className: "max-w-[120px] truncate text-sm text-gray-900", children: formatMemberLabel(member.displayName, member.username) }), _jsx(Icon, { icon: "close-b", size: 12, className: "shrink-0 cursor-pointer text-gray-400", onClick: () => handleRemoveMember(member.userID) })] }, member.userID))) })), _jsx("div", { className: "max-h-72 overflow-y-auto", onScroll: handleListScroll, children: isLoading ? (_jsx("div", { className: "flex items-center justify-center py-6", children: _jsx(Spin, {}) })) : accounts.length === 0 ? (_jsx(Empty, { description: t("create_group.no_member_found") })) : (_jsxs(_Fragment, { children: [accounts.map((account) => {
|
|
65
76
|
const isSelected = selectedIds.has(account.userID);
|
|
66
|
-
return (_jsxs("div", { className:
|
|
77
|
+
return (_jsxs("div", Object.assign({ className: `flex cursor-pointer items-center gap-3 rounded-lg px-3 py-3 transition-colors duration-150 hover:bg-[#f5f5f5] ${FOCUS_RING_CLASS}` }, clickableProps(() => toggleMember(account)), { "aria-pressed": isSelected, children: [_jsx(Avatar, { src: account.avatar, size: 40, className: "shrink-0", children: account.displayName.charAt(0) || "A" }), _jsx("span", { className: "flex-1 truncate text-base font-medium text-gray-900", children: formatMemberLabel(account.displayName, account.username) }), _jsx("span", { className: clsx("flex h-4 w-4 shrink-0 items-center justify-center rounded border", isSelected
|
|
67
78
|
? "border-[var(--dc-color-primary)] bg-[var(--dc-color-primary)]"
|
|
68
|
-
: "border-gray-300 bg-white"), children: isSelected && (_jsx(Icon, { icon: "check-b", size: 11, className: "text-white" })) })] }, account.userID));
|
|
79
|
+
: "border-gray-300 bg-white"), children: isSelected && (_jsx(Icon, { icon: "check-b", size: 11, className: "text-white" })) })] }), account.userID));
|
|
69
80
|
}), isFetchingNextPage && (_jsx("div", { className: "flex items-center justify-center py-3", children: _jsx(Spin, { size: "small" }) }))] })) }), _jsxs("div", { className: "flex justify-end gap-2 pt-2", children: [_jsx(Button, { onClick: handleClose, children: tCommon("cancel") }), _jsx(Button, { type: "primary", disabled: selectedMembers.length === 0, loading: isSubmitting, onClick: handleSubmit, children: t("add_member.confirm") })] })] }) }));
|
|
70
81
|
};
|
|
71
82
|
export default AddMemberModal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminPermissionModal.d.ts","sourceRoot":"","sources":["../../../src/components/group/AdminPermissionModal.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AdminPermissionModal.d.ts","sourceRoot":"","sources":["../../../src/components/group/AdminPermissionModal.tsx"],"names":[],"mappings":"AAwBA,UAAU,0BAA0B;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,UAAU,yBAAyB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IAIpB,MAAM,CAAC,EAAE,OAAO,CAAC;IAGjB,MAAM,CAAC,EAAE,0BAA0B,CAAC;IAKpC,wBAAwB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC5E;AAwCD,QAAA,MAAM,oBAAoB,GAAI,uEAO3B,yBAAyB,mDA+N3B,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useEffect, useState } from "react";
|
|
4
4
|
import { ConfigProvider, Modal, Switch, message } from "antd";
|
|
5
5
|
import { useTranslation } from "react-i18next";
|
|
@@ -7,6 +7,9 @@ import { GroupMemberRole } from "@droppii-org/wasm-client-sdk";
|
|
|
7
7
|
import { useGroupMembers } from "../../hooks/group/useGroupMembers";
|
|
8
8
|
import { useSetAdminRolePermissions, useSetGroupMemberPermissions, } from "../../hooks/group/useGroupMemberActions";
|
|
9
9
|
import { Icon } from "../../components/icon";
|
|
10
|
+
import useAuthStore from "../../store/auth";
|
|
11
|
+
import PermissionPanelCrm, { PermissionRowList } from "./PermissionPanelCrm";
|
|
12
|
+
import DisableSendPermissionConfirm from "./DisableSendPermissionConfirm";
|
|
10
13
|
import { ANTD_PRIMARY_COLOR_VAR } from "../../constants";
|
|
11
14
|
import { GROUP_PERMISSION_KEY } from "../../constants/im";
|
|
12
15
|
import { changedSwitches, commonSwitchStates, toRolePermissionChange, } from "../../utils/groupPermissionSwitches";
|
|
@@ -40,7 +43,9 @@ const AdminPermissionModal = ({ open, groupID, onClose, inline = false, member,
|
|
|
40
43
|
const { members: groupMembers } = useGroupMembers(member ? undefined : groupID);
|
|
41
44
|
const { mutateAsync: setMemberPermissions } = useSetGroupMemberPermissions();
|
|
42
45
|
const { mutateAsync: setAdminRolePermissions } = useSetAdminRolePermissions();
|
|
46
|
+
const isCrm = useAuthStore((state) => state.isCrm);
|
|
43
47
|
const [isSaving, setIsSaving] = useState(false);
|
|
48
|
+
const [isConfirmOpen, setIsConfirmOpen] = useState(false);
|
|
44
49
|
const [edits, setEdits] = useState({});
|
|
45
50
|
useEffect(() => {
|
|
46
51
|
if (open)
|
|
@@ -52,10 +57,18 @@ const AdminPermissionModal = ({ open, groupID, onClose, inline = false, member,
|
|
|
52
57
|
const changes = changedSwitches(baseline, pending);
|
|
53
58
|
const hasChanges = Object.keys(changes).length > 0;
|
|
54
59
|
const setSwitch = (name, checked) => setEdits((prev) => (Object.assign(Object.assign({}, prev), { [name]: checked })));
|
|
60
|
+
const requestSave = () => {
|
|
61
|
+
if (isCrm && changes.sendMessage === false) {
|
|
62
|
+
setIsConfirmOpen(true);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
void handleSave();
|
|
66
|
+
};
|
|
55
67
|
const handleSave = async () => {
|
|
56
68
|
var _a, _b;
|
|
57
69
|
if (!groupID || !hasChanges)
|
|
58
70
|
return;
|
|
71
|
+
setIsConfirmOpen(false);
|
|
59
72
|
setIsSaving(true);
|
|
60
73
|
try {
|
|
61
74
|
if (member) {
|
|
@@ -80,12 +93,34 @@ const AdminPermissionModal = ({ open, groupID, onClose, inline = false, member,
|
|
|
80
93
|
setIsSaving(false);
|
|
81
94
|
}
|
|
82
95
|
};
|
|
96
|
+
const crmRows = [
|
|
97
|
+
["sendMessage", "permission_send_message", "permission_desc_send_message"],
|
|
98
|
+
["pinMessage", "permission_pin_message", "permission_desc_pin_message"],
|
|
99
|
+
["viewMemberInformation", "permission_view_member_info", "permission_desc_view_member_info"],
|
|
100
|
+
["addMember", "permission_add_member", "permission_desc_add_member"],
|
|
101
|
+
["removeMember", "permission_remove_member", "permission_desc_remove_member"],
|
|
102
|
+
["updateGroupInfo", "permission_update_group_info", "permission_desc_update_group_info"],
|
|
103
|
+
].map(([name, label, description]) => ({
|
|
104
|
+
key: name,
|
|
105
|
+
label: t(label),
|
|
106
|
+
description: t(description),
|
|
107
|
+
checked: pending[name],
|
|
108
|
+
onChange: (checked) => setSwitch(name, checked),
|
|
109
|
+
}));
|
|
83
110
|
const rows = (_jsx(ConfigProvider, { theme: { token: { colorPrimary: ANTD_PRIMARY_COLOR_VAR } }, children: _jsxs("div", { className: "flex flex-col py-2", children: [_jsxs("div", { className: "flex items-center justify-between px-4 py-3", children: [_jsx("span", { className: "text-sm", children: t("permission_send_message") }), _jsx(Switch, { checked: pending.sendMessage, onChange: (checked) => setSwitch("sendMessage", checked) })] }), _jsxs("div", { className: "flex items-center justify-between px-4 py-3", children: [_jsx("span", { className: "text-sm", children: t("permission_pin_unpin_message") }), _jsx(Switch, { checked: pending.pinMessage, onChange: (checked) => setSwitch("pinMessage", checked) })] }), _jsxs("div", { className: "flex items-center justify-between px-4 py-3", children: [_jsx("span", { className: "text-sm", children: t("permission_view_member_info") }), _jsx(Switch, { checked: pending.viewMemberInformation, onChange: (checked) => setSwitch("viewMemberInformation", checked) })] }), _jsxs("div", { className: "flex items-center justify-between px-4 py-3", children: [_jsx("span", { className: "text-sm", children: t("permission_add_member") }), _jsx(Switch, { checked: pending.addMember, onChange: (checked) => setSwitch("addMember", checked) })] }), _jsxs("div", { className: "flex items-center justify-between px-4 py-3", children: [_jsx("span", { className: "text-sm", children: t("permission_remove_member") }), _jsx(Switch, { checked: pending.removeMember, onChange: (checked) => setSwitch("removeMember", checked) })] }), _jsxs("div", { className: "flex items-center justify-between px-4 py-3", children: [_jsx("span", { className: "text-sm", children: t("permission_update_group_info") }), _jsx(Switch, { checked: pending.updateGroupInfo, onChange: (checked) => setSwitch("updateGroupInfo", checked) })] })] }) }));
|
|
111
|
+
const confirm = (_jsx(DisableSendPermissionConfirm, { open: isConfirmOpen, title: member
|
|
112
|
+
? t("disable_send_permission_title_member", { name: member.nickname })
|
|
113
|
+
: t("disable_send_permission_title_all_admins"), loading: isSaving, onConfirm: handleSave, onCancel: () => setIsConfirmOpen(false) }));
|
|
114
|
+
if (inline && isCrm) {
|
|
115
|
+
if (!open)
|
|
116
|
+
return null;
|
|
117
|
+
return (_jsxs(_Fragment, { children: [_jsx(PermissionPanelCrm, { title: t("admin_permission_row"), rows: crmRows, canSave: hasChanges, isSaving: isSaving, onBack: onClose, onSave: requestSave }), confirm] }));
|
|
118
|
+
}
|
|
84
119
|
if (inline) {
|
|
85
120
|
if (!open)
|
|
86
121
|
return null;
|
|
87
|
-
return (_jsxs("div", { className: "absolute inset-0 bg-white flex flex-col z-10", children: [_jsxs("div", { className: "flex w-full items-center border-b border-gray-100 p-2", children: [_jsx("button", { type: "button", className: "flex shrink-0 cursor-pointer items-center justify-center p-2 text-[var(--dc-color-nav-icon)]", onClick: onClose, children: _jsx(Icon, { icon: "arrow-left-o", size: 24 }) }), _jsx("p", { className: "min-w-0 flex-1 truncate px-2 text-[18px] font-bold leading-[1.6] text-gray-900", children: t("admin_permission_settings") })] }), _jsxs("div", { className: "flex-1 overflow-y-auto", children: [rows, _jsxs("div", { className: "flex items-center justify-end gap-2 px-4 py-3 border-t border-gray-100", children: [_jsx("button", { type: "button", className: "px-4 py-1.5 rounded-full border border-gray-300 text-gray-700 text-sm font-medium", onClick: onClose, children: t("cancel") }), _jsx("button", { type: "button", className: "px-4 py-1.5 rounded-full bg-[var(--dc-color-primary)] text-white text-sm font-medium disabled:bg-gray-200 disabled:text-gray-400", disabled: !hasChanges || isSaving, onClick:
|
|
122
|
+
return (_jsxs("div", { className: "absolute inset-0 bg-white flex flex-col z-10", children: [_jsxs("div", { className: "flex w-full items-center border-b border-gray-100 p-2", children: [_jsx("button", { type: "button", className: "flex shrink-0 cursor-pointer items-center justify-center p-2 text-[var(--dc-color-nav-icon)]", onClick: onClose, children: _jsx(Icon, { icon: "arrow-left-o", size: 24 }) }), _jsx("p", { className: "min-w-0 flex-1 truncate px-2 text-[18px] font-bold leading-[1.6] text-gray-900", children: t("admin_permission_settings") })] }), _jsxs("div", { className: "flex-1 overflow-y-auto", children: [rows, _jsxs("div", { className: "flex items-center justify-end gap-2 px-4 py-3 border-t border-gray-100", children: [_jsx("button", { type: "button", className: "px-4 py-1.5 rounded-full border border-gray-300 text-gray-700 text-sm font-medium", onClick: onClose, children: t("cancel") }), _jsx("button", { type: "button", className: "px-4 py-1.5 rounded-full bg-[var(--dc-color-primary)] text-white text-sm font-medium disabled:bg-gray-200 disabled:text-gray-400", disabled: !hasChanges || isSaving, onClick: requestSave, children: t("save") })] })] }), confirm] }));
|
|
88
123
|
}
|
|
89
|
-
return (_jsx(Modal, { centered: true, open: open, onOk:
|
|
124
|
+
return (_jsxs(_Fragment, { children: [_jsx(Modal, { centered: true, destroyOnHidden: true, open: open, onOk: requestSave, onCancel: onClose, title: t("admin_permission_settings"), okText: t("save"), cancelText: t(isCrm ? "action_cancel" : "cancel"), confirmLoading: isSaving, okButtonProps: { disabled: !hasChanges }, getContainer: false, children: _jsx("div", { className: isCrm ? "-mx-6" : "mt-2", children: isCrm ? _jsx(PermissionRowList, { rows: crmRows }) : rows }) }), confirm] }));
|
|
90
125
|
};
|
|
91
126
|
export default AdminPermissionModal;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
interface CreateGroupFormProps {
|
|
2
2
|
onDone: () => void;
|
|
3
|
+
/** CRM only: the modal footer the action bar renders into. */
|
|
4
|
+
footerEl?: HTMLElement | null;
|
|
3
5
|
}
|
|
4
|
-
declare const CreateGroupForm: ({ onDone }: CreateGroupFormProps) => import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
declare const CreateGroupForm: ({ onDone, footerEl }: CreateGroupFormProps) => import("react/jsx-runtime").JSX.Element;
|
|
5
7
|
export default CreateGroupForm;
|
|
6
8
|
//# sourceMappingURL=CreateGroupForm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateGroupForm.d.ts","sourceRoot":"","sources":["../../../src/components/group/CreateGroupForm.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"CreateGroupForm.d.ts","sourceRoot":"","sources":["../../../src/components/group/CreateGroupForm.tsx"],"names":[],"mappings":"AAiBA,UAAU,oBAAoB;IAC5B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAC/B;AAED,QAAA,MAAM,eAAe,GAAI,sBAA6B,oBAAoB,4CA4OzE,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -9,8 +9,11 @@ import { useCreateGroup } from "../../hooks/group/useCreateGroup";
|
|
|
9
9
|
import { useUploadFile } from "../../hooks/common/useUploadFile";
|
|
10
10
|
import { validateFile } from "../../utils/fileValidation";
|
|
11
11
|
import GroupMemberPicker from "./GroupMemberPicker";
|
|
12
|
+
import CreateGroupFormCrmView from "./CreateGroupFormCrmView";
|
|
13
|
+
import useAuthStore from "../../store/auth";
|
|
12
14
|
const GROUP_NAME_MAX_LENGTH = 255;
|
|
13
|
-
const CreateGroupForm = ({ onDone }) => {
|
|
15
|
+
const CreateGroupForm = ({ onDone, footerEl = null }) => {
|
|
16
|
+
const isCrm = useAuthStore((state) => state.isCrm);
|
|
14
17
|
const { t } = useTranslation("conversation-inbox");
|
|
15
18
|
const { t: tCommon } = useTranslation("common");
|
|
16
19
|
const { createGroup } = useCreateGroup();
|
|
@@ -97,6 +100,9 @@ const CreateGroupForm = ({ onDone }) => {
|
|
|
97
100
|
description: t("create_group.privacy_public_desc"),
|
|
98
101
|
},
|
|
99
102
|
], [t]);
|
|
103
|
+
if (isCrm) {
|
|
104
|
+
return (_jsx(CreateGroupFormCrmView, { groupName: groupName, maxNameLength: GROUP_NAME_MAX_LENGTH, onGroupNameChange: (value) => setGroupName(value.slice(0, GROUP_NAME_MAX_LENGTH)), isPublic: isPublic, onPublicChange: setIsPublic, avatarPreviewUrl: avatarPreviewUrl, isAvatarUploading: isAvatarUploading, onAvatarSelect: handleAvatarSelect, selectedMembers: selectedMembers, onChangeSelectedMembers: setSelectedMembers, canSubmit: canSubmit, isSubmitting: isSubmitting, onSubmit: handleSubmit, onCancel: onDone, footerEl: footerEl }));
|
|
105
|
+
}
|
|
100
106
|
return (_jsxs("div", { className: "flex max-h-[70vh] flex-col", "data-cp-name": "CreateGroupForm", children: [_jsxs("div", { className: "flex flex-col overflow-y-auto pr-1", children: [_jsxs("div", { className: "flex items-center gap-4 py-6", children: [_jsx(Upload, { accept: "image/jpeg, image/png, image/jpg", showUploadList: false, beforeUpload: handleAvatarSelect, children: _jsxs("div", { className: "relative flex h-20 w-20 shrink-0 cursor-pointer items-center justify-center rounded-2xl bg-[var(--dc-color-primary-light)]", children: [avatarPreviewUrl ? (_jsx("img", { src: avatarPreviewUrl, alt: "", className: clsx("h-full w-full rounded-2xl object-cover", isAvatarUploading && "opacity-50") })) : (_jsx(Icon, { icon: "user-three-b", size: 32, className: "text-[var(--dc-color-primary)]" })), isAvatarUploading && (_jsx("span", { className: "absolute inset-0 flex items-center justify-center rounded-2xl bg-black/10", children: _jsx("span", { className: "h-5 w-5 animate-spin rounded-full border-2 border-white border-t-transparent" }) })), _jsx("span", { className: "absolute -bottom-1 -right-1 flex h-7 w-7 items-center justify-center rounded-full bg-gray-500", children: _jsx(Icon, { icon: "camera-b", size: 14, className: "text-white" }) })] }) }), _jsx(Input, { size: "large", value: groupName, onChange: (event) => setGroupName(event.target.value.slice(0, GROUP_NAME_MAX_LENGTH)), maxLength: GROUP_NAME_MAX_LENGTH, placeholder: t("create_group.name_placeholder"), className: "flex-1 text-base" })] }), _jsxs("div", { className: "flex flex-col gap-3 border-t border-gray-100 py-6", children: [_jsx("span", { className: "text-xs font-semibold uppercase tracking-wide text-gray-400", children: t("create_group.privacy_label") }), _jsx("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: privacyOptions.map((option) => (_jsxs("button", { type: "button", onClick: () => setIsPublic(option.value), className: clsx("rounded-xl border-2 p-4 text-left transition-colors", isPublic === option.value
|
|
101
107
|
? "border-[var(--dc-color-primary)] bg-[var(--dc-color-primary-light)]"
|
|
102
108
|
: "border-gray-200 bg-white"), children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Icon, { icon: option.icon, size: 18, className: isPublic === option.value
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { EligibleAccountItem } from "../../hooks/group/useEligibleAccounts";
|
|
2
|
+
interface CreateGroupFormCrmViewProps {
|
|
3
|
+
groupName: string;
|
|
4
|
+
maxNameLength: number;
|
|
5
|
+
onGroupNameChange: (value: string) => void;
|
|
6
|
+
isPublic: boolean;
|
|
7
|
+
onPublicChange: (value: boolean) => void;
|
|
8
|
+
avatarPreviewUrl: string;
|
|
9
|
+
isAvatarUploading: boolean;
|
|
10
|
+
onAvatarSelect: (file: File) => boolean;
|
|
11
|
+
selectedMembers: EligibleAccountItem[];
|
|
12
|
+
onChangeSelectedMembers: (members: EligibleAccountItem[]) => void;
|
|
13
|
+
canSubmit: boolean;
|
|
14
|
+
isSubmitting: boolean;
|
|
15
|
+
onSubmit: () => void;
|
|
16
|
+
onCancel: () => void;
|
|
17
|
+
/** Modal footer element the action bar renders into. */
|
|
18
|
+
footerEl: HTMLElement | null;
|
|
19
|
+
}
|
|
20
|
+
/** CRM layout of "Tạo nhóm chat": avatar + name, privacy radios, two-column picker, footer bar. */
|
|
21
|
+
declare const CreateGroupFormCrmView: (props: CreateGroupFormCrmViewProps) => import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export default CreateGroupFormCrmView;
|
|
23
|
+
//# sourceMappingURL=CreateGroupFormCrmView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CreateGroupFormCrmView.d.ts","sourceRoot":"","sources":["../../../src/components/group/CreateGroupFormCrmView.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAI7E,UAAU,2BAA2B;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,cAAc,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;IACxC,eAAe,EAAE,mBAAmB,EAAE,CAAC;IACvC,uBAAuB,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,IAAI,CAAC;IAClE,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,wDAAwD;IACxD,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;CAC9B;AAED,mGAAmG;AACnG,QAAA,MAAM,sBAAsB,GAAI,OAAO,2BAA2B,4CAiGjE,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { createPortal } from "react-dom";
|
|
4
|
+
import { Button, Input, Upload } from "antd";
|
|
5
|
+
import clsx from "clsx";
|
|
6
|
+
import { useTranslation } from "react-i18next";
|
|
7
|
+
import { StrokeIcon } from "../../components/icon/StrokeIcon";
|
|
8
|
+
import { FOCUS_RING_CLASS } from "../../utils/a11yClickable";
|
|
9
|
+
import GroupMemberPicker from "./GroupMemberPicker";
|
|
10
|
+
/** CRM layout of "Tạo nhóm chat": avatar + name, privacy radios, two-column picker, footer bar. */
|
|
11
|
+
const CreateGroupFormCrmView = (props) => {
|
|
12
|
+
const { t } = useTranslation("conversation-inbox");
|
|
13
|
+
const options = [
|
|
14
|
+
{ value: false, icon: "lock", label: t("create_group.privacy_private"), hint: t("create_group.privacy_private_hint") },
|
|
15
|
+
{ value: true, icon: "globe", label: t("create_group.privacy_public"), hint: t("create_group.privacy_public_hint") },
|
|
16
|
+
];
|
|
17
|
+
return (_jsxs("div", { className: "flex flex-col gap-4", "data-cp-name": "CreateGroupForm", children: [_jsxs("div", { className: "flex items-end gap-4", children: [_jsx(Upload, { accept: "image/jpeg, image/png, image/jpg", showUploadList: false, beforeUpload: props.onAvatarSelect, children: _jsx("button", { type: "button", "aria-label": t("create_group.add_avatar"), title: t("create_group.add_avatar"), className: `flex h-16 w-16 shrink-0 items-center justify-center overflow-hidden rounded-full border border-dashed border-gray-200 bg-gray-5 text-gray-600 ${FOCUS_RING_CLASS}`, children: props.avatarPreviewUrl ? (
|
|
18
|
+
// eslint-disable-next-line @next/next/no-img-element
|
|
19
|
+
_jsx("img", { src: props.avatarPreviewUrl, alt: "", className: clsx("h-full w-full object-cover", props.isAvatarUploading && "opacity-50") })) : (_jsx(StrokeIcon, { name: "camera", size: 22 })) }) }), _jsxs("div", { className: "flex flex-1 flex-col gap-1.5", children: [_jsxs("label", { htmlFor: "create-group-name", className: "text-[13px] font-medium text-gray-900", children: [_jsx("span", { className: "text-danger-600", children: "* " }), t("create_group.name_label")] }), _jsx(Input, { id: "create-group-name", size: "large", value: props.groupName, onChange: (event) => props.onGroupNameChange(event.target.value), maxLength: props.maxNameLength, placeholder: t("create_group.name_placeholder") })] })] }), _jsxs("fieldset", { className: "m-0 flex flex-col gap-2 border-0 p-0", children: [_jsx("legend", { className: "mb-2 p-0 text-[13px] font-medium text-gray-900", children: t("create_group.privacy_label") }), _jsx("div", { className: "flex gap-3", children: options.map((option) => {
|
|
20
|
+
const checked = props.isPublic === option.value;
|
|
21
|
+
return (_jsxs("label", { className: clsx("flex flex-1 cursor-pointer items-start gap-2.5 rounded-xl border p-3 focus-within:outline focus-within:outline-2 focus-within:outline-primary-200", checked ? "border-primary-400 bg-primary-25 shadow-[0_0_0_1px_var(--dc-color-primary)]" : "border-gray-50 bg-white"), children: [_jsx("input", { type: "radio", name: "group-privacy", checked: checked, onChange: () => props.onPublicChange(option.value), className: "m-0 mt-0.5 h-4 w-4 shrink-0 accent-primary-400" }), _jsxs("span", { className: "flex flex-col gap-1", children: [_jsxs("span", { className: "flex items-center gap-1.5 text-sm font-semibold text-gray-900", children: [_jsx(StrokeIcon, { name: option.icon, size: 16 }), option.label] }), _jsx("span", { className: "text-[13px] leading-snug text-gray-600", children: option.hint })] })] }, String(option.value)));
|
|
22
|
+
}) })] }), _jsxs("fieldset", { className: "m-0 flex flex-col gap-2 border-0 p-0", children: [_jsxs("legend", { className: "mb-2 p-0 text-[13px] font-medium text-gray-900", children: [t("create_group.members_label"), " ", _jsx("span", { className: "font-normal text-gray-600", children: t("create_group.members_owner_note") })] }), _jsx(GroupMemberPicker, { selectedMembers: props.selectedMembers, onChangeSelectedMembers: props.onChangeSelectedMembers })] }), props.footerEl &&
|
|
23
|
+
createPortal(_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "flex-1 text-left text-[13px] text-gray-600", children: t("create_group.selected_footer", { count: props.selectedMembers.length }) }), _jsx(Button, { onClick: props.onCancel, children: t("create_group.cancel_crm") }), _jsx(Button, { type: "primary", disabled: !props.canSubmit, loading: props.isSubmitting, onClick: props.onSubmit, children: t("create_group.submit") })] }), props.footerEl)] }));
|
|
24
|
+
};
|
|
25
|
+
export default CreateGroupFormCrmView;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ReactNode } from "react";
|
|
2
|
+
interface DisableSendPermissionConfirmProps {
|
|
3
|
+
open: boolean;
|
|
4
|
+
title: ReactNode;
|
|
5
|
+
loading?: boolean;
|
|
6
|
+
onConfirm: () => void;
|
|
7
|
+
onCancel: () => void;
|
|
8
|
+
}
|
|
9
|
+
declare const DisableSendPermissionConfirm: ({ open, title, loading, onConfirm, onCancel, }: DisableSendPermissionConfirmProps) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export default DisableSendPermissionConfirm;
|
|
11
|
+
//# sourceMappingURL=DisableSendPermissionConfirm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DisableSendPermissionConfirm.d.ts","sourceRoot":"","sources":["../../../src/components/group/DisableSendPermissionConfirm.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIlC,UAAU,iCAAiC;IACzC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAGD,QAAA,MAAM,4BAA4B,GAAI,gDAMnC,iCAAiC,4CAiBnC,CAAC;AAEF,eAAe,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useTranslation } from "react-i18next";
|
|
4
|
+
import ConfirmModal from "../../components/common/ConfirmModal";
|
|
5
|
+
// CRM only: turning off "gửi tin nhắn" silences people at once, so ask first.
|
|
6
|
+
const DisableSendPermissionConfirm = ({ open, title, loading, onConfirm, onCancel, }) => {
|
|
7
|
+
const { t } = useTranslation();
|
|
8
|
+
return (_jsx(ConfirmModal, { open: open, title: title, okText: t("disable_send_permission_ok"), cancelText: t("action_cancel"), onOk: onConfirm, onCancel: onCancel, okType: "danger", destructive: true, confirmLoading: loading, children: _jsx("p", { children: t("disable_send_permission_body") }) }));
|
|
9
|
+
};
|
|
10
|
+
export default DisableSendPermissionConfirm;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroupCompositeAvatar.d.ts","sourceRoot":"","sources":["../../../src/components/group/GroupCompositeAvatar.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GroupCompositeAvatar.d.ts","sourceRoot":"","sources":["../../../src/components/group/GroupCompositeAvatar.tsx"],"names":[],"mappings":"AASA,UAAU,yBAAyB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAOD,QAAA,MAAM,oBAAoB,GAAI,gEAO3B,yBAAyB,4CAiJ3B,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -4,6 +4,8 @@ import { Avatar } from "antd";
|
|
|
4
4
|
import { GroupMemberRole } from "@droppii-org/wasm-client-sdk";
|
|
5
5
|
import { useMemo } from "react";
|
|
6
6
|
import { useGroupMembers } from "../../hooks/group/useGroupMembers";
|
|
7
|
+
import useAuthStore from "../../store/auth";
|
|
8
|
+
import TintedAvatar from "../../components/common/TintedAvatar";
|
|
7
9
|
// AC-Default2 (DROPPII-29976): when a group is created without a picked
|
|
8
10
|
// avatar, show two overlapping avatars (owner bottom-left, first-joined
|
|
9
11
|
// non-owner member top-right) instead of a static placeholder image —
|
|
@@ -11,17 +13,20 @@ import { useGroupMembers } from "../../hooks/group/useGroupMembers";
|
|
|
11
13
|
// no image compositing/upload needed.
|
|
12
14
|
const GroupCompositeAvatar = ({ groupID, faceURL, ownerUserID, groupName, size = 56, className, }) => {
|
|
13
15
|
var _a, _b;
|
|
16
|
+
const isCrm = useAuthStore((state) => state.isCrm);
|
|
14
17
|
const shouldLoadMembers = !faceURL && Boolean(groupID);
|
|
15
18
|
const { members } = useGroupMembers(shouldLoadMembers ? groupID : undefined);
|
|
16
|
-
const { ownerFaceURL, ownerLetter, hasFirstMember, firstMemberFaceURL, firstMemberLetter } = useMemo(() => {
|
|
17
|
-
var _a, _b, _c, _d, _e;
|
|
19
|
+
const { ownerFaceURL, ownerLetter, ownerName, hasFirstMember, firstMemberFaceURL, firstMemberLetter, firstMemberName, } = useMemo(() => {
|
|
20
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
18
21
|
if (!members.length) {
|
|
19
22
|
return {
|
|
20
23
|
ownerFaceURL: undefined,
|
|
21
24
|
ownerLetter: undefined,
|
|
25
|
+
ownerName: "",
|
|
22
26
|
hasFirstMember: false,
|
|
23
27
|
firstMemberFaceURL: undefined,
|
|
24
28
|
firstMemberLetter: undefined,
|
|
29
|
+
firstMemberName: "",
|
|
25
30
|
};
|
|
26
31
|
}
|
|
27
32
|
// Prefer the explicit ownerUserID when the caller has it (e.g. GroupItem);
|
|
@@ -33,20 +38,50 @@ const GroupCompositeAvatar = ({ groupID, faceURL, ownerUserID, groupName, size =
|
|
|
33
38
|
return {
|
|
34
39
|
ownerFaceURL: owner === null || owner === void 0 ? void 0 : owner.faceURL,
|
|
35
40
|
ownerLetter: (_c = (_b = owner === null || owner === void 0 ? void 0 : owner.nickname) === null || _b === void 0 ? void 0 : _b.charAt) === null || _c === void 0 ? void 0 : _c.call(_b, 0),
|
|
41
|
+
ownerName: (_d = owner === null || owner === void 0 ? void 0 : owner.nickname) !== null && _d !== void 0 ? _d : "",
|
|
36
42
|
hasFirstMember: Boolean(firstMember),
|
|
37
43
|
firstMemberFaceURL: firstMember === null || firstMember === void 0 ? void 0 : firstMember.faceURL,
|
|
38
|
-
firstMemberLetter: (
|
|
44
|
+
firstMemberLetter: (_f = (_e = firstMember === null || firstMember === void 0 ? void 0 : firstMember.nickname) === null || _e === void 0 ? void 0 : _e.charAt) === null || _f === void 0 ? void 0 : _f.call(_e, 0),
|
|
45
|
+
firstMemberName: (_g = firstMember === null || firstMember === void 0 ? void 0 : firstMember.nickname) !== null && _g !== void 0 ? _g : "",
|
|
39
46
|
};
|
|
40
47
|
}, [members, ownerUserID]);
|
|
41
48
|
if (faceURL) {
|
|
49
|
+
if (isCrm) {
|
|
50
|
+
return (_jsx(TintedAvatar, { name: groupName !== null && groupName !== void 0 ? groupName : "", src: faceURL, size: size, className: className }));
|
|
51
|
+
}
|
|
42
52
|
return (_jsx(Avatar, { src: faceURL, size: size, className: className, children: ((_a = groupName === null || groupName === void 0 ? void 0 : groupName.charAt) === null || _a === void 0 ? void 0 : _a.call(groupName, 0)) || "G" }));
|
|
43
53
|
}
|
|
44
54
|
// Not enough members yet to compose two avatars (still loading, or a
|
|
45
55
|
// solo group with no other member) — fall back to a single placeholder.
|
|
46
56
|
if (!shouldLoadMembers || !hasFirstMember) {
|
|
57
|
+
if (isCrm) {
|
|
58
|
+
return (_jsx(TintedAvatar, { name: ownerName || groupName || "", size: size, className: className }));
|
|
59
|
+
}
|
|
47
60
|
return (_jsx(Avatar, { size: size, className: className, children: ownerLetter || ((_b = groupName === null || groupName === void 0 ? void 0 : groupName.charAt) === null || _b === void 0 ? void 0 : _b.call(groupName, 0)) || "G" }));
|
|
48
61
|
}
|
|
49
62
|
const subSize = Math.round(size * 0.62);
|
|
50
|
-
|
|
63
|
+
// CRM: larger circles with a white gap between them and a hairline ring so photos
|
|
64
|
+
// don't melt into the white header.
|
|
65
|
+
if (isCrm) {
|
|
66
|
+
const crmSubSize = Math.round(size * 0.72);
|
|
67
|
+
const ring = { boxShadow: "0 0 0 2px #FFFFFF, 0 0 0 3px #DDDEDF" };
|
|
68
|
+
return (_jsxs("div", { className: className, style: {
|
|
69
|
+
position: "relative",
|
|
70
|
+
width: size,
|
|
71
|
+
height: size,
|
|
72
|
+
flexShrink: 0,
|
|
73
|
+
}, children: [_jsx("span", { className: "absolute bottom-0 left-0 rounded-full", style: ring, children: _jsx(TintedAvatar, { name: ownerName, src: ownerFaceURL, size: crmSubSize }) }), _jsx("span", { className: "absolute right-0 top-0 rounded-full", style: ring, children: _jsx(TintedAvatar, { name: firstMemberName, src: firstMemberFaceURL, size: crmSubSize }) })] }));
|
|
74
|
+
}
|
|
75
|
+
return (_jsxs("div", { className: className, style: { position: "relative", width: size, height: size, flexShrink: 0 }, children: [_jsx(Avatar, { src: ownerFaceURL, size: subSize, style: {
|
|
76
|
+
position: "absolute",
|
|
77
|
+
left: 0,
|
|
78
|
+
bottom: 0,
|
|
79
|
+
border: "2px solid white",
|
|
80
|
+
}, children: ownerLetter || "A" }), _jsx(Avatar, { src: firstMemberFaceURL, size: subSize, style: {
|
|
81
|
+
position: "absolute",
|
|
82
|
+
right: 0,
|
|
83
|
+
top: 0,
|
|
84
|
+
border: "2px solid white",
|
|
85
|
+
}, children: firstMemberLetter || "A" })] }));
|
|
51
86
|
};
|
|
52
87
|
export default GroupCompositeAvatar;
|