@droppii-org/chat-sdk 0.6.55 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/canned-response/CannedResponseBody.d.ts.map +1 -1
- package/dist/components/canned-response/CannedResponseBody.js +4 -3
- package/dist/components/canned-response/CannedResponsePanel.d.ts +9 -0
- package/dist/components/canned-response/CannedResponsePanel.d.ts.map +1 -0
- package/dist/components/canned-response/CannedResponsePanel.js +72 -0
- package/dist/components/canned-response/CannedResponseRow.d.ts +10 -0
- package/dist/components/canned-response/CannedResponseRow.d.ts.map +1 -0
- package/dist/components/canned-response/CannedResponseRow.js +6 -0
- package/dist/components/canned-response/CannedScopeChips.d.ts +10 -0
- package/dist/components/canned-response/CannedScopeChips.d.ts.map +1 -0
- package/dist/components/canned-response/CannedScopeChips.js +34 -0
- package/dist/components/canned-response/cannedScopes.d.ts +16 -0
- package/dist/components/canned-response/cannedScopes.d.ts.map +1 -0
- package/dist/components/canned-response/cannedScopes.js +39 -0
- package/dist/components/canned-response/index.d.ts.map +1 -1
- package/dist/components/canned-response/index.js +11 -10
- package/dist/components/canned-response/insertCannedContent.d.ts +7 -0
- package/dist/components/canned-response/insertCannedContent.d.ts.map +1 -0
- package/dist/components/canned-response/insertCannedContent.js +39 -0
- package/dist/components/canned-response/team/TeamItem.d.ts.map +1 -1
- package/dist/components/canned-response/team/TeamItem.js +5 -4
- package/dist/components/common/ConfirmModal.d.ts +13 -1
- package/dist/components/common/ConfirmModal.d.ts.map +1 -1
- package/dist/components/common/ConfirmModal.js +24 -6
- package/dist/components/common/DeskPanelDrawer.d.ts +17 -0
- package/dist/components/common/DeskPanelDrawer.d.ts.map +1 -0
- package/dist/components/common/DeskPanelDrawer.js +21 -0
- package/dist/components/common/DeskSidePanel.d.ts +17 -0
- package/dist/components/common/DeskSidePanel.d.ts.map +1 -0
- package/dist/components/common/DeskSidePanel.js +23 -0
- package/dist/components/common/TintedAvatar.d.ts +11 -0
- package/dist/components/common/TintedAvatar.d.ts.map +1 -0
- package/dist/components/common/TintedAvatar.js +17 -0
- package/dist/components/compose/ComposeNewMessageModal.d.ts.map +1 -1
- package/dist/components/compose/ComposeNewMessageModal.js +11 -1
- package/dist/components/conversation/ConversationByGroupItem.d.ts.map +1 -1
- package/dist/components/conversation/ConversationByGroupItem.js +10 -6
- package/dist/components/conversation/ConversationBySessionItem.d.ts +4 -1
- package/dist/components/conversation/ConversationBySessionItem.d.ts.map +1 -1
- package/dist/components/conversation/ConversationBySessionItem.js +36 -10
- package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
- package/dist/components/conversation/DeskConversationList.js +44 -29
- package/dist/components/conversation/DeskConversationRow.d.ts +19 -0
- package/dist/components/conversation/DeskConversationRow.d.ts.map +1 -0
- package/dist/components/conversation/DeskConversationRow.js +18 -0
- package/dist/components/conversation/DeskListEmptyState.d.ts +6 -0
- package/dist/components/conversation/DeskListEmptyState.d.ts.map +1 -0
- package/dist/components/conversation/DeskListEmptyState.js +11 -0
- package/dist/components/conversation/DeskListHeader.d.ts +14 -0
- package/dist/components/conversation/DeskListHeader.d.ts.map +1 -0
- package/dist/components/conversation/DeskListHeader.js +39 -0
- package/dist/components/conversation/DeskListSkeleton.d.ts +6 -0
- package/dist/components/conversation/DeskListSkeleton.d.ts.map +1 -0
- package/dist/components/conversation/DeskListSkeleton.js +9 -0
- package/dist/components/conversation/DeskRowAvatar.d.ts +8 -0
- package/dist/components/conversation/DeskRowAvatar.d.ts.map +1 -0
- package/dist/components/conversation/DeskRowAvatar.js +6 -0
- package/dist/components/conversation/RowChip.d.ts +14 -0
- package/dist/components/conversation/RowChip.d.ts.map +1 -0
- package/dist/components/conversation/RowChip.js +11 -0
- package/dist/components/conversation/avatarTint.d.ts +6 -0
- package/dist/components/conversation/avatarTint.d.ts.map +1 -0
- package/dist/components/conversation/avatarTint.js +27 -0
- package/dist/components/conversation/folderEmptyState.d.ts +2 -0
- package/dist/components/conversation/folderEmptyState.d.ts.map +1 -0
- package/dist/components/conversation/folderEmptyState.js +14 -0
- package/dist/components/conversation/internalNotePreview.d.ts +6 -0
- package/dist/components/conversation/internalNotePreview.d.ts.map +1 -0
- package/dist/components/conversation/internalNotePreview.js +11 -0
- package/dist/components/conversation/listHeading.d.ts +19 -0
- package/dist/components/conversation/listHeading.d.ts.map +1 -0
- package/dist/components/conversation/listHeading.js +24 -0
- package/dist/components/conversation/rowDisplayName.d.ts +7 -0
- package/dist/components/conversation/rowDisplayName.d.ts.map +1 -0
- package/dist/components/conversation/rowDisplayName.js +8 -0
- package/dist/components/conversation/rowTime.d.ts +4 -0
- package/dist/components/conversation/rowTime.d.ts.map +1 -0
- package/dist/components/conversation/rowTime.js +10 -0
- package/dist/components/conversation-detail/PinLimitModal.d.ts.map +1 -1
- package/dist/components/conversation-detail/PinLimitModal.js +3 -1
- package/dist/components/group/AddMemberModal.d.ts.map +1 -1
- package/dist/components/group/AddMemberModal.js +15 -4
- package/dist/components/group/AdminPermissionModal.d.ts +1 -0
- package/dist/components/group/AdminPermissionModal.d.ts.map +1 -1
- package/dist/components/group/AdminPermissionModal.js +38 -3
- package/dist/components/group/CreateGroupForm.d.ts +3 -1
- package/dist/components/group/CreateGroupForm.d.ts.map +1 -1
- package/dist/components/group/CreateGroupForm.js +7 -1
- package/dist/components/group/CreateGroupFormCrmView.d.ts +23 -0
- package/dist/components/group/CreateGroupFormCrmView.d.ts.map +1 -0
- package/dist/components/group/CreateGroupFormCrmView.js +25 -0
- package/dist/components/group/DisableSendPermissionConfirm.d.ts +11 -0
- package/dist/components/group/DisableSendPermissionConfirm.d.ts.map +1 -0
- package/dist/components/group/DisableSendPermissionConfirm.js +10 -0
- package/dist/components/group/GroupCompositeAvatar.d.ts.map +1 -1
- package/dist/components/group/GroupCompositeAvatar.js +39 -4
- package/dist/components/group/GroupMemberPicker.d.ts +5 -2
- package/dist/components/group/GroupMemberPicker.d.ts.map +1 -1
- package/dist/components/group/GroupMemberPicker.js +8 -42
- package/dist/components/group/GroupMemberPickerCrm.d.ts +4 -0
- package/dist/components/group/GroupMemberPickerCrm.d.ts.map +1 -0
- package/dist/components/group/GroupMemberPickerCrm.js +48 -0
- package/dist/components/group/GroupMemberPickerLegacy.d.ts +8 -0
- package/dist/components/group/GroupMemberPickerLegacy.d.ts.map +1 -0
- package/dist/components/group/GroupMemberPickerLegacy.js +46 -0
- package/dist/components/group/GroupPanelHeader.d.ts +10 -0
- package/dist/components/group/GroupPanelHeader.d.ts.map +1 -0
- package/dist/components/group/GroupPanelHeader.js +11 -0
- package/dist/components/group/MemberPermissionPanel.d.ts.map +1 -1
- package/dist/components/group/MemberPermissionPanel.js +31 -2
- package/dist/components/group/PermissionPanelCrm.d.ts +24 -0
- package/dist/components/group/PermissionPanelCrm.d.ts.map +1 -0
- package/dist/components/group/PermissionPanelCrm.js +16 -0
- package/dist/components/group/PersonAvatar.d.ts +11 -0
- package/dist/components/group/PersonAvatar.d.ts.map +1 -0
- package/dist/components/group/PersonAvatar.js +21 -0
- package/dist/components/group/crmIcon.d.ts +9 -0
- package/dist/components/group/crmIcon.d.ts.map +1 -0
- package/dist/components/group/crmIcon.js +38 -0
- package/dist/components/icon/AdaptiveIcon.d.ts +15 -0
- package/dist/components/icon/AdaptiveIcon.d.ts.map +1 -0
- package/dist/components/icon/AdaptiveIcon.js +10 -0
- package/dist/components/icon/StrokeIcon.d.ts +14 -0
- package/dist/components/icon/StrokeIcon.d.ts.map +1 -0
- package/dist/components/icon/StrokeIcon.js +5 -0
- package/dist/components/icon/strokeIconNodes.d.ts +431 -0
- package/dist/components/icon/strokeIconNodes.d.ts.map +1 -0
- package/dist/components/icon/strokeIconNodes.js +269 -0
- package/dist/components/media-collection/index.d.ts.map +1 -1
- package/dist/components/media-collection/index.js +21 -5
- package/dist/components/message/GroupMembersDrawer.d.ts.map +1 -1
- package/dist/components/message/GroupMembersDrawer.js +60 -13
- package/dist/components/message/GroupMembersPanelCrm.d.ts +23 -0
- package/dist/components/message/GroupMembersPanelCrm.d.ts.map +1 -0
- package/dist/components/message/GroupMembersPanelCrm.js +55 -0
- package/dist/components/message/MessageHeader.d.ts.map +1 -1
- package/dist/components/message/MessageHeader.js +76 -27
- package/dist/components/message/MessageInfiniteScroll.d.ts +4 -2
- package/dist/components/message/MessageInfiniteScroll.d.ts.map +1 -1
- package/dist/components/message/MessageInfiniteScroll.js +1 -1
- package/dist/components/message/MessageList.d.ts +2 -1
- package/dist/components/message/MessageList.d.ts.map +1 -1
- package/dist/components/message/MessageList.js +12 -1
- package/dist/components/message/SelectSession.d.ts +4 -1
- package/dist/components/message/SelectSession.d.ts.map +1 -1
- package/dist/components/message/SelectSession.js +13 -4
- package/dist/components/message/UnassignedSessionFooter.js +2 -2
- package/dist/components/message/footer/ActionBar.d.ts +5 -1
- package/dist/components/message/footer/ActionBar.d.ts.map +1 -1
- package/dist/components/message/footer/ActionBar.js +14 -1
- package/dist/components/message/footer/CannedResponsePlugin.d.ts.map +1 -1
- package/dist/components/message/footer/CannedResponsePlugin.js +18 -3
- package/dist/components/message/footer/ClosedSessionBanner.d.ts +9 -0
- package/dist/components/message/footer/ClosedSessionBanner.d.ts.map +1 -0
- package/dist/components/message/footer/ClosedSessionBanner.js +13 -0
- package/dist/components/message/footer/ComposerEditor.d.ts.map +1 -1
- package/dist/components/message/footer/ComposerEditor.js +9 -4
- package/dist/components/message/footer/ComposerTabs.d.ts +1 -2
- package/dist/components/message/footer/ComposerTabs.d.ts.map +1 -1
- package/dist/components/message/footer/ComposerTabs.js +14 -35
- package/dist/components/message/footer/CrmComposerCard.d.ts +11 -0
- package/dist/components/message/footer/CrmComposerCard.d.ts.map +1 -0
- package/dist/components/message/footer/CrmComposerCard.js +30 -0
- package/dist/components/message/footer/EnterHandler.d.ts.map +1 -1
- package/dist/components/message/footer/EnterHandler.js +3 -0
- package/dist/components/message/footer/FilePreview.js +2 -2
- package/dist/components/message/footer/LinkInputPreview.js +2 -2
- package/dist/components/message/footer/MediaActions.d.ts +2 -1
- package/dist/components/message/footer/MediaActions.d.ts.map +1 -1
- package/dist/components/message/footer/MediaActions.js +21 -4
- package/dist/components/message/footer/SessionClosedModal.d.ts +3 -1
- package/dist/components/message/footer/SessionClosedModal.d.ts.map +1 -1
- package/dist/components/message/footer/SessionClosedModal.js +6 -2
- package/dist/components/message/footer/ToolbarPlugin.d.ts +3 -1
- package/dist/components/message/footer/ToolbarPlugin.d.ts.map +1 -1
- package/dist/components/message/footer/ToolbarPlugin.js +2 -2
- package/dist/components/message/footer/clearComposerHistory.d.ts +3 -0
- package/dist/components/message/footer/clearComposerHistory.d.ts.map +1 -0
- package/dist/components/message/footer/clearComposerHistory.js +11 -0
- package/dist/components/message/footer/index.d.ts +2 -2
- package/dist/components/message/footer/index.d.ts.map +1 -1
- package/dist/components/message/footer/index.js +15 -5
- package/dist/components/message/footer/mention/MentionMenu.d.ts.map +1 -1
- package/dist/components/message/footer/mention/MentionMenu.js +4 -1
- package/dist/components/message/footer/useComposerFocusRequest.d.ts +10 -0
- package/dist/components/message/footer/useComposerFocusRequest.d.ts.map +1 -0
- package/dist/components/message/footer/useComposerFocusRequest.js +28 -0
- package/dist/components/message/groupMemberMenuCrm.d.ts +32 -0
- package/dist/components/message/groupMemberMenuCrm.d.ts.map +1 -0
- package/dist/components/message/groupMemberMenuCrm.js +83 -0
- package/dist/components/message/groupMemberTypes.d.ts +13 -0
- package/dist/components/message/groupMemberTypes.d.ts.map +1 -0
- package/dist/components/message/groupMemberTypes.js +1 -0
- package/dist/components/message/headerIconButton.d.ts +10 -0
- package/dist/components/message/headerIconButton.d.ts.map +1 -0
- package/dist/components/message/headerIconButton.js +9 -0
- package/dist/components/message/item/CrmSystemLine.d.ts +10 -0
- package/dist/components/message/item/CrmSystemLine.d.ts.map +1 -0
- package/dist/components/message/item/CrmSystemLine.js +6 -0
- package/dist/components/message/item/DateDivider.d.ts +5 -0
- package/dist/components/message/item/DateDivider.d.ts.map +1 -0
- package/dist/components/message/item/DateDivider.js +5 -0
- package/dist/components/message/item/GroupNotificationMessage.d.ts.map +1 -1
- package/dist/components/message/item/GroupNotificationMessage.js +9 -0
- package/dist/components/message/item/MemberEventSummary.d.ts +8 -0
- package/dist/components/message/item/MemberEventSummary.d.ts.map +1 -0
- package/dist/components/message/item/MemberEventSummary.js +18 -0
- package/dist/components/message/item/MessageBubble.d.ts +3 -1
- package/dist/components/message/item/MessageBubble.d.ts.map +1 -1
- package/dist/components/message/item/MessageBubble.js +27 -13
- package/dist/components/message/item/MessageMoreButton.d.ts +13 -0
- package/dist/components/message/item/MessageMoreButton.d.ts.map +1 -0
- package/dist/components/message/item/MessageMoreButton.js +42 -0
- package/dist/components/message/item/QuoteMessage.d.ts.map +1 -1
- package/dist/components/message/item/QuoteMessage.js +23 -2
- package/dist/components/message/item/RevokeMessage.js +1 -1
- package/dist/components/message/item/SessionEventMessage.d.ts.map +1 -1
- package/dist/components/message/item/SessionEventMessage.js +13 -1
- package/dist/components/message/item/SystemLogMessage.d.ts.map +1 -1
- package/dist/components/message/item/SystemLogMessage.js +7 -0
- package/dist/components/message/item/index.d.ts.map +1 -1
- package/dist/components/message/item/index.js +80 -18
- package/dist/components/message/item/otherSenders.d.ts +7 -0
- package/dist/components/message/item/otherSenders.d.ts.map +1 -0
- package/dist/components/message/item/otherSenders.js +29 -0
- package/dist/components/message/item/textStyle.d.ts +1 -1
- package/dist/components/message/item/textStyle.d.ts.map +1 -1
- package/dist/components/message/item/textStyle.js +2 -2
- package/dist/components/message/messageKeyboardNav.d.ts +8 -0
- package/dist/components/message/messageKeyboardNav.d.ts.map +1 -0
- package/dist/components/message/messageKeyboardNav.js +24 -0
- package/dist/components/message/reply/ReplyPreviewBar.d.ts.map +1 -1
- package/dist/components/message/reply/ReplyPreviewBar.js +11 -4
- package/dist/components/message/toolbox/MessageToolboxMenu.d.ts.map +1 -1
- package/dist/components/message/toolbox/MessageToolboxMenu.js +16 -1
- package/dist/components/search-conversation/SearchAll.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchAll.js +12 -1
- package/dist/components/search-conversation/SearchDrawer.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchDrawer.js +31 -15
- package/dist/components/search-conversation/SearchMessageOnCurrentConversation.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchMessageOnCurrentConversation.js +5 -2
- package/dist/components/search-conversation/index.d.ts.map +1 -1
- package/dist/components/search-conversation/index.js +3 -1
- package/dist/components/search-conversation/item/SearchItemAsGroup.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsGroup.js +14 -4
- package/dist/components/search-conversation/item/SearchItemAsMessage.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsMessage.js +18 -7
- package/dist/components/search-conversation/item/SearchItemAsUser.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsUser.js +23 -5
- package/dist/components/search-conversation/item/searchRowClass.d.ts +3 -0
- package/dist/components/search-conversation/item/searchRowClass.d.ts.map +1 -0
- package/dist/components/search-conversation/item/searchRowClass.js +5 -0
- package/dist/components/session/DeskAssignedSession.d.ts +5 -1
- package/dist/components/session/DeskAssignedSession.d.ts.map +1 -1
- package/dist/components/session/DeskAssignedSession.js +40 -12
- package/dist/components/session/DeskTeamInbox.d.ts.map +1 -1
- package/dist/components/session/DeskTeamInbox.js +15 -22
- package/dist/components/session/FolderRow.d.ts +21 -0
- package/dist/components/session/FolderRow.d.ts.map +1 -0
- package/dist/components/session/FolderRow.js +16 -0
- package/dist/components/session/SessionFolderList.d.ts +23 -0
- package/dist/components/session/SessionFolderList.d.ts.map +1 -0
- package/dist/components/session/SessionFolderList.js +27 -0
- package/dist/components/session/sessionFilters.d.ts +24 -0
- package/dist/components/session/sessionFilters.d.ts.map +1 -0
- package/dist/components/session/sessionFilters.js +80 -0
- package/dist/components/shortcut-help/ShortcutHelpModal.d.ts +8 -0
- package/dist/components/shortcut-help/ShortcutHelpModal.d.ts.map +1 -0
- package/dist/components/shortcut-help/ShortcutHelpModal.js +23 -0
- package/dist/components/thread/AssignConfirmModal.d.ts.map +1 -1
- package/dist/components/thread/AssignConfirmModal.js +4 -3
- package/dist/components/thread/EndSessionConfirm.d.ts +11 -0
- package/dist/components/thread/EndSessionConfirm.d.ts.map +1 -0
- package/dist/components/thread/EndSessionConfirm.js +31 -0
- package/dist/components/thread/EndSessionToast.d.ts +6 -0
- package/dist/components/thread/EndSessionToast.d.ts.map +1 -0
- package/dist/components/thread/EndSessionToast.js +18 -0
- package/dist/components/thread/GroupInfoBodyCrm.d.ts +46 -0
- package/dist/components/thread/GroupInfoBodyCrm.d.ts.map +1 -0
- package/dist/components/thread/GroupInfoBodyCrm.js +41 -0
- package/dist/components/thread/GroupInfoRows.d.ts +33 -0
- package/dist/components/thread/GroupInfoRows.d.ts.map +1 -0
- package/dist/components/thread/GroupInfoRows.js +18 -0
- package/dist/components/thread/GroupThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/GroupThreadInfo.js +23 -6
- package/dist/components/thread/ManualAssignPopover.d.ts +3 -1
- package/dist/components/thread/ManualAssignPopover.d.ts.map +1 -1
- package/dist/components/thread/ManualAssignPopover.js +21 -9
- package/dist/components/thread/SessionDetailCard.d.ts +6 -0
- package/dist/components/thread/SessionDetailCard.d.ts.map +1 -0
- package/dist/components/thread/SessionDetailCard.js +103 -0
- package/dist/components/thread/SessionSection.d.ts +2 -4
- package/dist/components/thread/SessionSection.d.ts.map +1 -1
- package/dist/components/thread/SessionSection.js +19 -122
- package/dist/components/thread/SessionTagPicker.d.ts +11 -0
- package/dist/components/thread/SessionTagPicker.d.ts.map +1 -0
- package/dist/components/thread/SessionTagPicker.js +27 -0
- package/dist/components/thread/SingleThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/SingleThreadInfo.js +16 -6
- package/dist/components/thread/SupportSessionPanel.d.ts +18 -0
- package/dist/components/thread/SupportSessionPanel.d.ts.map +1 -0
- package/dist/components/thread/SupportSessionPanel.js +46 -0
- package/dist/components/thread/ThreadInfo.d.ts +8 -1
- package/dist/components/thread/ThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/ThreadInfo.js +27 -29
- package/dist/components/thread/ThreadInfoHeader.d.ts +13 -0
- package/dist/components/thread/ThreadInfoHeader.d.ts.map +1 -0
- package/dist/components/thread/ThreadInfoHeader.js +11 -0
- package/dist/components/thread/UserSection.d.ts.map +1 -1
- package/dist/components/thread/UserSection.js +35 -22
- package/dist/components/thread/sessionDateFormat.d.ts +3 -0
- package/dist/components/thread/sessionDateFormat.d.ts.map +1 -0
- package/dist/components/thread/sessionDateFormat.js +13 -0
- package/dist/components/thread/sessionDuration.d.ts +5 -0
- package/dist/components/thread/sessionDuration.d.ts.map +1 -0
- package/dist/components/thread/sessionDuration.js +24 -0
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +2 -0
- package/dist/constants/layout.d.ts +24 -0
- package/dist/constants/layout.d.ts.map +1 -0
- package/dist/constants/layout.js +23 -0
- package/dist/context/ChatContext.d.ts.map +1 -1
- package/dist/context/ChatContext.js +27 -1
- package/dist/hooks/canned-response/useSearchCannedAcrossScopes.d.ts +7 -0
- package/dist/hooks/canned-response/useSearchCannedAcrossScopes.d.ts.map +1 -0
- package/dist/hooks/canned-response/useSearchCannedAcrossScopes.js +46 -0
- package/dist/hooks/common/useCloseOnSidePanelOpen.d.ts +3 -0
- package/dist/hooks/common/useCloseOnSidePanelOpen.d.ts.map +1 -0
- package/dist/hooks/common/useCloseOnSidePanelOpen.js +15 -0
- package/dist/hooks/common/useDeskShortcuts.d.ts +11 -0
- package/dist/hooks/common/useDeskShortcuts.d.ts.map +1 -0
- package/dist/hooks/common/useDeskShortcuts.js +94 -0
- package/dist/hooks/common/useEscapeLayer.d.ts +3 -0
- package/dist/hooks/common/useEscapeLayer.d.ts.map +1 -0
- package/dist/hooks/common/useEscapeLayer.js +18 -0
- package/dist/hooks/common/useMediaQuery.d.ts +3 -0
- package/dist/hooks/common/useMediaQuery.d.ts.map +1 -0
- package/dist/hooks/common/useMediaQuery.js +12 -0
- package/dist/hooks/common/useSidePanel.d.ts +12 -0
- package/dist/hooks/common/useSidePanel.d.ts.map +1 -0
- package/dist/hooks/common/useSidePanel.js +32 -0
- package/dist/hooks/group/useConversationGroups.d.ts.map +1 -1
- package/dist/hooks/group/useConversationGroups.js +3 -0
- package/dist/hooks/message/useNewMessageAnnouncement.d.ts +3 -0
- package/dist/hooks/message/useNewMessageAnnouncement.d.ts.map +1 -0
- package/dist/hooks/message/useNewMessageAnnouncement.js +30 -0
- package/dist/hooks/search/useSearchGroups.js +2 -1
- package/dist/hooks/search/useSearchMessage.d.ts +3 -1
- package/dist/hooks/search/useSearchMessage.d.ts.map +1 -1
- package/dist/hooks/search/useSearchMessage.js +2 -2
- package/dist/hooks/session/useBotSessionOwnerIdentity.d.ts +12 -0
- package/dist/hooks/session/useBotSessionOwnerIdentity.d.ts.map +1 -0
- package/dist/hooks/session/useBotSessionOwnerIdentity.js +22 -0
- package/dist/hooks/session/useCloseSession.d.ts +1 -0
- package/dist/hooks/session/useCloseSession.d.ts.map +1 -1
- package/dist/hooks/session/useCloseSession.js +9 -8
- package/dist/hooks/session/useEndSession.d.ts +11 -0
- package/dist/hooks/session/useEndSession.d.ts.map +1 -0
- package/dist/hooks/session/useEndSession.js +45 -0
- package/dist/hooks/session/useGetSession.d.ts.map +1 -1
- package/dist/hooks/session/useGetSession.js +27 -6
- package/dist/hooks/session/usePendingSessionClose.d.ts +5 -0
- package/dist/hooks/session/usePendingSessionClose.d.ts.map +1 -0
- package/dist/hooks/session/usePendingSessionClose.js +12 -0
- package/dist/hooks/session/useSessionCustomerName.d.ts +3 -0
- package/dist/hooks/session/useSessionCustomerName.d.ts.map +1 -0
- package/dist/hooks/session/useSessionCustomerName.js +19 -0
- package/dist/hooks/session/useSessionFieldAutosave.d.ts +19 -0
- package/dist/hooks/session/useSessionFieldAutosave.d.ts.map +1 -0
- package/dist/hooks/session/useSessionFieldAutosave.js +52 -0
- package/dist/hooks/user/useUserUsername.d.ts +3 -0
- package/dist/hooks/user/useUserUsername.d.ts.map +1 -0
- package/dist/hooks/user/useUserUsername.js +49 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/locales/vi/common.json +201 -21
- package/dist/locales/vi/conversation-inbox.json +21 -2
- package/dist/screens/desk-message/DeskWorkspace.d.ts +12 -0
- package/dist/screens/desk-message/DeskWorkspace.d.ts.map +1 -0
- package/dist/screens/desk-message/DeskWorkspace.js +57 -0
- package/dist/screens/desk-message/FolderOverlay.d.ts +4 -0
- package/dist/screens/desk-message/FolderOverlay.d.ts.map +1 -0
- package/dist/screens/desk-message/FolderOverlay.js +32 -0
- package/dist/screens/desk-message/SkipLinks.d.ts +4 -0
- package/dist/screens/desk-message/SkipLinks.d.ts.map +1 -0
- package/dist/screens/desk-message/SkipLinks.js +19 -0
- package/dist/screens/desk-message/ViewportNotice.d.ts +4 -0
- package/dist/screens/desk-message/ViewportNotice.d.ts.map +1 -0
- package/dist/screens/desk-message/ViewportNotice.js +9 -0
- package/dist/screens/desk-message/index.d.ts +3 -2
- package/dist/screens/desk-message/index.d.ts.map +1 -1
- package/dist/screens/desk-message/index.js +4 -12
- package/dist/store/deskPanelHost.d.ts +13 -0
- package/dist/store/deskPanelHost.d.ts.map +1 -0
- package/dist/store/deskPanelHost.js +9 -0
- package/dist/store/escapeLayers.d.ts +15 -0
- package/dist/store/escapeLayers.d.ts.map +1 -0
- package/dist/store/escapeLayers.js +15 -0
- package/dist/store/pendingSessionClose.d.ts +19 -0
- package/dist/store/pendingSessionClose.d.ts.map +1 -0
- package/dist/store/pendingSessionClose.js +74 -0
- package/dist/store/session.d.ts +2 -1
- package/dist/store/session.d.ts.map +1 -1
- package/dist/store/session.js +4 -1
- package/dist/store/sessionFolder.d.ts +15 -0
- package/dist/store/sessionFolder.d.ts.map +1 -0
- package/dist/store/sessionFolder.js +18 -0
- package/dist/store/shortcutPrefs.d.ts +9 -0
- package/dist/store/shortcutPrefs.d.ts.map +1 -0
- package/dist/store/shortcutPrefs.js +23 -0
- package/dist/store/sidePanel.d.ts +12 -0
- package/dist/store/sidePanel.d.ts.map +1 -0
- package/dist/store/sidePanel.js +9 -0
- package/dist/store/workspaceLayout.d.ts +12 -0
- package/dist/store/workspaceLayout.d.ts.map +1 -0
- package/dist/store/workspaceLayout.js +9 -0
- package/dist/styles/global.css +1 -1
- package/dist/types/chat.d.ts +18 -0
- package/dist/types/chat.d.ts.map +1 -1
- package/dist/types/dto.d.ts +2 -1
- package/dist/types/dto.d.ts.map +1 -1
- package/dist/utils/a11yClickable.d.ts +10 -0
- package/dist/utils/a11yClickable.d.ts.map +1 -0
- package/dist/utils/a11yClickable.js +15 -0
- package/dist/utils/events.d.ts +4 -0
- package/dist/utils/events.d.ts.map +1 -1
- package/dist/utils/headerMemberCount.d.ts +10 -0
- package/dist/utils/headerMemberCount.d.ts.map +1 -0
- package/dist/utils/headerMemberCount.js +3 -0
- package/dist/utils/memberEventRun.d.ts +16 -0
- package/dist/utils/memberEventRun.d.ts.map +1 -0
- package/dist/utils/memberEventRun.js +40 -0
- package/package.json +1 -1
- package/dist/components/session/SessionFilterMenu.d.ts +0 -15
- package/dist/components/session/SessionFilterMenu.d.ts.map +0 -1
- package/dist/components/session/SessionFilterMenu.js +0 -30
- package/dist/components/session/sessionMenuItems.d.ts +0 -28
- package/dist/components/session/sessionMenuItems.d.ts.map +0 -1
- package/dist/components/session/sessionMenuItems.js +0 -119
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { EligibleAccountItem } from "../../hooks/group/useEligibleAccounts";
|
|
2
|
-
interface GroupMemberPickerProps {
|
|
2
|
+
export interface GroupMemberPickerProps {
|
|
3
3
|
selectedMembers: EligibleAccountItem[];
|
|
4
4
|
onChangeSelectedMembers: (members: EligibleAccountItem[]) => void;
|
|
5
|
+
/** Existing group: people already in it show as "Đã trong nhóm" and cannot be picked (CRM). */
|
|
6
|
+
groupID?: string;
|
|
5
7
|
}
|
|
6
|
-
|
|
8
|
+
/** Member picker shared by "Tạo nhóm chat" and "Thêm thành viên". */
|
|
9
|
+
declare const GroupMemberPicker: (props: GroupMemberPickerProps) => import("react/jsx-runtime").JSX.Element;
|
|
7
10
|
export default GroupMemberPicker;
|
|
8
11
|
//# sourceMappingURL=GroupMemberPicker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroupMemberPicker.d.ts","sourceRoot":"","sources":["../../../src/components/group/GroupMemberPicker.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GroupMemberPicker.d.ts","sourceRoot":"","sources":["../../../src/components/group/GroupMemberPicker.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAI7E,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,mBAAmB,EAAE,CAAC;IACvC,uBAAuB,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,IAAI,CAAC;IAClE,+FAA+F;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qEAAqE;AACrE,QAAA,MAAM,iBAAiB,GAAI,OAAO,sBAAsB,4CAUvD,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -1,45 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as _jsx
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
import { formatMemberLabel } from "../../utils/common";
|
|
11
|
-
const GroupMemberPicker = ({ selectedMembers, onChangeSelectedMembers, }) => {
|
|
12
|
-
const { t } = useTranslation("conversation-inbox");
|
|
13
|
-
const [search, setSearch] = useState("");
|
|
14
|
-
const debouncedSearch = useDebounce(search, { wait: 300 });
|
|
15
|
-
const { accounts, isLoading, fetchNextPage, hasNextPage, isFetchingNextPage } = useEligibleAccounts(debouncedSearch);
|
|
16
|
-
const handleListScroll = (event) => {
|
|
17
|
-
if (!hasNextPage || isFetchingNextPage)
|
|
18
|
-
return;
|
|
19
|
-
const { scrollTop, scrollHeight, clientHeight } = event.currentTarget;
|
|
20
|
-
if (scrollHeight - scrollTop - clientHeight < 80) {
|
|
21
|
-
void fetchNextPage();
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
const selectedIds = new Set(selectedMembers.map((member) => member.userID));
|
|
25
|
-
const toggleMember = (account) => {
|
|
26
|
-
if (selectedIds.has(account.userID)) {
|
|
27
|
-
onChangeSelectedMembers(selectedMembers.filter((member) => member.userID !== account.userID));
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
onChangeSelectedMembers([...selectedMembers, account]);
|
|
31
|
-
};
|
|
32
|
-
const handleRemoveMember = (userID) => {
|
|
33
|
-
onChangeSelectedMembers(selectedMembers.filter((member) => member.userID !== userID));
|
|
34
|
-
};
|
|
35
|
-
const handleClearAll = () => {
|
|
36
|
-
onChangeSelectedMembers([]);
|
|
37
|
-
};
|
|
38
|
-
return (_jsxs("div", { className: "grid grid-cols-2 gap-3", "data-cp-name": "GroupMemberPicker", children: [_jsxs("div", { className: "flex flex-col gap-2 rounded-xl border border-gray-200 p-3", 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" }) }), _jsx("div", { className: "max-h-64 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) => {
|
|
39
|
-
const isSelected = selectedIds.has(account.userID);
|
|
40
|
-
return (_jsxs("div", { className: "flex cursor-pointer items-center gap-3 rounded-lg px-3 py-3 transition-colors duration-150 hover:bg-[#f5f5f5]", onClick: () => toggleMember(account), 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
|
|
41
|
-
? "border-[var(--dc-color-primary)] bg-[var(--dc-color-primary)]"
|
|
42
|
-
: "border-gray-300 bg-white"), children: isSelected && (_jsx(Icon, { icon: "check-b", size: 11, className: "text-white" })) })] }, account.userID));
|
|
43
|
-
}), isFetchingNextPage && (_jsx("div", { className: "flex items-center justify-center py-3", children: _jsx(Spin, { size: "small" }) }))] })) })] }), _jsxs("div", { className: "flex flex-col gap-2 rounded-xl border border-gray-200 p-3", children: [_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") }))] }), _jsx("div", { className: "max-h-64 overflow-y-auto", children: selectedMembers.length === 0 ? (_jsxs("div", { className: "flex h-full min-h-[200px] flex-col items-center justify-center gap-2 text-center", children: [_jsx(Icon, { icon: "user-three-b", size: 28, className: "text-gray-300" }), _jsx("span", { className: "text-sm text-gray-400", children: t("create_group.no_member_selected") })] })) : (selectedMembers.map((member) => (_jsxs("div", { className: "flex items-center gap-3 rounded-lg px-3 py-3", children: [_jsx(Avatar, { src: member.avatar, size: 40, className: "shrink-0", children: member.displayName.charAt(0) || "A" }), _jsx("span", { className: "flex-1 truncate text-base font-medium text-gray-900", children: formatMemberLabel(member.displayName, member.username) }), _jsx(Icon, { icon: "close-b", size: 14, className: "shrink-0 cursor-pointer text-gray-400", onClick: () => handleRemoveMember(member.userID) })] }, member.userID)))) })] })] }));
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import useAuthStore from "../../store/auth";
|
|
4
|
+
import GroupMemberPickerCrm from "./GroupMemberPickerCrm";
|
|
5
|
+
import GroupMemberPickerLegacy from "./GroupMemberPickerLegacy";
|
|
6
|
+
/** Member picker shared by "Tạo nhóm chat" and "Thêm thành viên". */
|
|
7
|
+
const GroupMemberPicker = (props) => {
|
|
8
|
+
const isCrm = useAuthStore((state) => state.isCrm);
|
|
9
|
+
return isCrm ? (_jsx(GroupMemberPickerCrm, Object.assign({}, props))) : (_jsx(GroupMemberPickerLegacy, { selectedMembers: props.selectedMembers, onChangeSelectedMembers: props.onChangeSelectedMembers }));
|
|
44
10
|
};
|
|
45
11
|
export default GroupMemberPicker;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GroupMemberPickerProps } from "./GroupMemberPicker";
|
|
2
|
+
declare const GroupMemberPickerCrm: ({ selectedMembers, onChangeSelectedMembers, groupID, }: GroupMemberPickerProps) => import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
export default GroupMemberPickerCrm;
|
|
4
|
+
//# sourceMappingURL=GroupMemberPickerCrm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupMemberPickerCrm.d.ts","sourceRoot":"","sources":["../../../src/components/group/GroupMemberPickerCrm.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAKlE,QAAA,MAAM,oBAAoB,GAAI,wDAI3B,sBAAsB,4CAqIxB,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { useDebounce } from "ahooks";
|
|
5
|
+
import { Empty, Spin } from "antd";
|
|
6
|
+
import clsx from "clsx";
|
|
7
|
+
import { useTranslation } from "react-i18next";
|
|
8
|
+
import { StrokeIcon } from "../../components/icon/StrokeIcon";
|
|
9
|
+
import { useEligibleAccounts } from "../../hooks/group/useEligibleAccounts";
|
|
10
|
+
import { useEligibleAccountsForGroup } from "../../hooks/group/useEligibleAccountsForGroup";
|
|
11
|
+
import { useGroupMembers } from "../../hooks/group/useGroupMembers";
|
|
12
|
+
import { FOCUS_RING_CLASS } from "../../utils/a11yClickable";
|
|
13
|
+
import PersonAvatar from "./PersonAvatar";
|
|
14
|
+
/** In a small group the existing members stay listed; in a big one only while searching. */
|
|
15
|
+
const MAX_LOCKED_WITHOUT_SEARCH = 6;
|
|
16
|
+
const GroupMemberPickerCrm = ({ selectedMembers, onChangeSelectedMembers, groupID, }) => {
|
|
17
|
+
const { t } = useTranslation("conversation-inbox");
|
|
18
|
+
const [search, setSearch] = useState("");
|
|
19
|
+
const debouncedSearch = useDebounce(search, { wait: 300 });
|
|
20
|
+
const forNewGroup = useEligibleAccounts(debouncedSearch, !groupID);
|
|
21
|
+
const forGroup = useEligibleAccountsForGroup(debouncedSearch, groupID !== null && groupID !== void 0 ? groupID : "", Boolean(groupID));
|
|
22
|
+
const { accounts, isLoading, fetchNextPage, hasNextPage, isFetchingNextPage } = groupID ? forGroup : forNewGroup;
|
|
23
|
+
const { members: groupMembers } = useGroupMembers(groupID);
|
|
24
|
+
const keyword = search.trim().toLowerCase();
|
|
25
|
+
const lockedAll = groupMembers.filter((member) => (member.nickname || member.userID).toLowerCase().includes(keyword));
|
|
26
|
+
const showLocked = keyword !== "" || groupMembers.length <= MAX_LOCKED_WITHOUT_SEARCH;
|
|
27
|
+
const locked = showLocked ? lockedAll : [];
|
|
28
|
+
const selectedIds = new Set(selectedMembers.map((member) => member.userID));
|
|
29
|
+
const toggle = (account) => onChangeSelectedMembers(selectedIds.has(account.userID)
|
|
30
|
+
? selectedMembers.filter((member) => member.userID !== account.userID)
|
|
31
|
+
: [...selectedMembers, account]);
|
|
32
|
+
const handleScroll = (event) => {
|
|
33
|
+
if (!hasNextPage || isFetchingNextPage)
|
|
34
|
+
return;
|
|
35
|
+
const { scrollTop, scrollHeight, clientHeight } = event.currentTarget;
|
|
36
|
+
if (scrollHeight - scrollTop - clientHeight < 80)
|
|
37
|
+
void fetchNextPage();
|
|
38
|
+
};
|
|
39
|
+
const rowClass = "flex items-center gap-2.5 rounded-lg px-2 py-1.5";
|
|
40
|
+
return (_jsxs("div", { className: "grid grid-cols-[minmax(0,1.5fr)_minmax(0,1fr)] items-stretch gap-3", "data-cp-name": "GroupMemberPicker", children: [_jsxs("div", { className: "flex min-w-0 flex-col gap-1.5 rounded-xl border border-gray-25 p-2", children: [_jsxs("label", { className: "flex h-9 items-center gap-2 rounded-lg bg-gray-5 px-2.5 text-gray-600 focus-within:outline focus-within:outline-2 focus-within:outline-primary-200", children: [_jsx("span", { className: "sr-only", children: t("create_group.search_label") }), _jsx(StrokeIcon, { name: "search", size: 16 }), _jsx("input", { type: "search", value: search, onChange: (event) => setSearch(event.target.value), placeholder: t("create_group.search_by_name"), className: "min-w-0 flex-1 border-0 bg-transparent p-0 text-sm text-gray-900 outline-none placeholder:text-gray-600" })] }), _jsx("div", { className: "h-[300px] overflow-y-auto", onScroll: handleScroll, children: isLoading ? (_jsx("div", { className: "flex items-center justify-center py-6", children: _jsx(Spin, {}) })) : accounts.length === 0 && locked.length === 0 ? (_jsx(Empty, { description: t("create_group.no_member_found") })) : (_jsxs("ul", { className: "m-0 flex list-none flex-col gap-0.5 p-0", children: [locked.map((member) => {
|
|
41
|
+
const name = member.nickname || member.userID;
|
|
42
|
+
return (_jsx("li", { children: _jsxs("label", { className: clsx(rowClass, "cursor-not-allowed opacity-70"), children: [_jsx("input", { type: "checkbox", checked: true, disabled: true, className: "m-0 h-[18px] w-[18px] shrink-0 accent-primary-400" }), _jsx(PersonAvatar, { name: name, src: member.faceURL, size: 32 }), _jsx("span", { className: "min-w-0 flex-1 truncate text-sm text-gray-900", children: name }), _jsx("span", { className: "shrink-0 text-xs text-gray-600", children: t("create_group.already_in_group") })] }) }, `locked-${member.userID}`));
|
|
43
|
+
}), accounts.map((account) => {
|
|
44
|
+
const isSelected = selectedIds.has(account.userID);
|
|
45
|
+
return (_jsx("li", { children: _jsxs("label", { className: clsx(rowClass, "cursor-pointer focus-within:outline focus-within:outline-2 focus-within:outline-primary-200", isSelected ? "bg-primary-25" : "hover:bg-gray-10"), children: [_jsx("input", { type: "checkbox", checked: isSelected, onChange: () => toggle(account), className: "m-0 h-[18px] w-[18px] shrink-0 accent-primary-400" }), _jsx(PersonAvatar, { name: account.displayName, src: account.avatar, size: 32 }), _jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [_jsx("span", { className: "truncate text-sm leading-[18px] text-gray-900", children: account.displayName }), _jsx("span", { className: "truncate text-xs leading-4 text-gray-600", children: account.username })] })] }) }, account.userID));
|
|
46
|
+
}), isFetchingNextPage && (_jsx("li", { className: "flex justify-center py-3", children: _jsx(Spin, { size: "small" }) }))] })) })] }), _jsxs("div", { className: "flex min-w-0 flex-col gap-2 rounded-xl bg-gray-5 p-3", children: [_jsx("span", { className: "text-[13px] font-semibold text-gray-900", children: t("create_group.selected_title", { count: selectedMembers.length }) }), selectedMembers.length === 0 ? (_jsx("span", { className: "text-sm text-gray-600", children: t("create_group.no_member_selected") })) : (_jsx("ul", { className: "m-0 flex list-none flex-col gap-1 overflow-y-auto p-0", children: selectedMembers.map((member) => (_jsxs("li", { className: "flex items-center gap-2 rounded-lg bg-white py-1 pl-1.5 pr-1", children: [_jsx(PersonAvatar, { name: member.displayName, src: member.avatar, size: 24 }), _jsx("span", { className: "min-w-0 flex-1 truncate text-[13px] text-gray-900", children: member.displayName }), _jsx("button", { type: "button", "aria-label": t("create_group.remove_selected", { name: member.displayName }), title: t("create_group.remove_selected", { name: member.displayName }), onClick: () => toggle(member), className: `flex h-6 w-6 shrink-0 items-center justify-center rounded text-gray-600 hover:bg-gray-25 ${FOCUS_RING_CLASS}`, children: _jsx(StrokeIcon, { name: "x", size: 14 }) })] }, member.userID))) }))] })] }));
|
|
47
|
+
};
|
|
48
|
+
export default GroupMemberPickerCrm;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { EligibleAccountItem } from "../../hooks/group/useEligibleAccounts";
|
|
2
|
+
interface GroupMemberPickerProps {
|
|
3
|
+
selectedMembers: EligibleAccountItem[];
|
|
4
|
+
onChangeSelectedMembers: (members: EligibleAccountItem[]) => void;
|
|
5
|
+
}
|
|
6
|
+
declare const GroupMemberPickerLegacy: ({ selectedMembers, onChangeSelectedMembers, }: GroupMemberPickerProps) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export default GroupMemberPickerLegacy;
|
|
8
|
+
//# sourceMappingURL=GroupMemberPickerLegacy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupMemberPickerLegacy.d.ts","sourceRoot":"","sources":["../../../src/components/group/GroupMemberPickerLegacy.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAG7E,UAAU,sBAAsB;IAC9B,eAAe,EAAE,mBAAmB,EAAE,CAAC;IACvC,uBAAuB,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,IAAI,CAAC;CACnE;AAED,QAAA,MAAM,uBAAuB,GAAI,+CAG9B,sBAAsB,4CAqJxB,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { clickableProps, FOCUS_RING_CLASS } from "../../utils/a11yClickable";
|
|
4
|
+
import { useDebounce } from "ahooks";
|
|
5
|
+
import { Avatar, Empty, Input, Spin } from "antd";
|
|
6
|
+
import clsx from "clsx";
|
|
7
|
+
import { useState } from "react";
|
|
8
|
+
import { useTranslation } from "react-i18next";
|
|
9
|
+
import { Icon } from "../../components/icon";
|
|
10
|
+
import { useEligibleAccounts } from "../../hooks/group/useEligibleAccounts";
|
|
11
|
+
import { formatMemberLabel } from "../../utils/common";
|
|
12
|
+
const GroupMemberPickerLegacy = ({ selectedMembers, onChangeSelectedMembers, }) => {
|
|
13
|
+
const { t } = useTranslation("conversation-inbox");
|
|
14
|
+
const [search, setSearch] = useState("");
|
|
15
|
+
const debouncedSearch = useDebounce(search, { wait: 300 });
|
|
16
|
+
const { accounts, isLoading, fetchNextPage, hasNextPage, isFetchingNextPage } = useEligibleAccounts(debouncedSearch);
|
|
17
|
+
const handleListScroll = (event) => {
|
|
18
|
+
if (!hasNextPage || isFetchingNextPage)
|
|
19
|
+
return;
|
|
20
|
+
const { scrollTop, scrollHeight, clientHeight } = event.currentTarget;
|
|
21
|
+
if (scrollHeight - scrollTop - clientHeight < 80) {
|
|
22
|
+
void fetchNextPage();
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const selectedIds = new Set(selectedMembers.map((member) => member.userID));
|
|
26
|
+
const toggleMember = (account) => {
|
|
27
|
+
if (selectedIds.has(account.userID)) {
|
|
28
|
+
onChangeSelectedMembers(selectedMembers.filter((member) => member.userID !== account.userID));
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
onChangeSelectedMembers([...selectedMembers, account]);
|
|
32
|
+
};
|
|
33
|
+
const handleRemoveMember = (userID) => {
|
|
34
|
+
onChangeSelectedMembers(selectedMembers.filter((member) => member.userID !== userID));
|
|
35
|
+
};
|
|
36
|
+
const handleClearAll = () => {
|
|
37
|
+
onChangeSelectedMembers([]);
|
|
38
|
+
};
|
|
39
|
+
return (_jsxs("div", { className: "grid grid-cols-2 gap-3", "data-cp-name": "GroupMemberPicker", children: [_jsxs("div", { className: "flex flex-col gap-2 rounded-xl border border-gray-200 p-3", 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" }) }), _jsx("div", { className: "max-h-64 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) => {
|
|
40
|
+
const isSelected = selectedIds.has(account.userID);
|
|
41
|
+
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
|
|
42
|
+
? "border-[var(--dc-color-primary)] bg-[var(--dc-color-primary)]"
|
|
43
|
+
: "border-gray-300 bg-white"), children: isSelected && (_jsx(Icon, { icon: "check-b", size: 11, className: "text-white" })) })] }), account.userID));
|
|
44
|
+
}), isFetchingNextPage && (_jsx("div", { className: "flex items-center justify-center py-3", children: _jsx(Spin, { size: "small" }) }))] })) })] }), _jsxs("div", { className: "flex flex-col gap-2 rounded-xl border border-gray-200 p-3", children: [_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") }))] }), _jsx("div", { className: "max-h-64 overflow-y-auto", children: selectedMembers.length === 0 ? (_jsxs("div", { className: "flex h-full min-h-[200px] flex-col items-center justify-center gap-2 text-center", children: [_jsx(Icon, { icon: "user-three-b", size: 28, className: "text-gray-300" }), _jsx("span", { className: "text-sm text-gray-400", children: t("create_group.no_member_selected") })] })) : (selectedMembers.map((member) => (_jsxs("div", { className: "flex items-center gap-3 rounded-lg px-3 py-3", children: [_jsx(Avatar, { src: member.avatar, size: 40, className: "shrink-0", children: member.displayName.charAt(0) || "A" }), _jsx("span", { className: "flex-1 truncate text-base font-medium text-gray-900", children: formatMemberLabel(member.displayName, member.username) }), _jsx(Icon, { icon: "close-b", size: 14, className: "shrink-0 cursor-pointer text-gray-400", onClick: () => handleRemoveMember(member.userID) })] }, member.userID)))) })] })] }));
|
|
45
|
+
};
|
|
46
|
+
export default GroupMemberPickerLegacy;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface GroupPanelHeaderProps {
|
|
2
|
+
title: string;
|
|
3
|
+
onClose?: () => void;
|
|
4
|
+
onBack?: () => void;
|
|
5
|
+
backLabel?: string;
|
|
6
|
+
}
|
|
7
|
+
/** CRM side-panel header: 56px bar with an optional back button and a close button. */
|
|
8
|
+
declare const GroupPanelHeader: ({ title, onClose, onBack, backLabel, }: GroupPanelHeaderProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export default GroupPanelHeader;
|
|
10
|
+
//# sourceMappingURL=GroupPanelHeader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GroupPanelHeader.d.ts","sourceRoot":"","sources":["../../../src/components/group/GroupPanelHeader.tsx"],"names":[],"mappings":"AAIA,UAAU,qBAAqB;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,uFAAuF;AACvF,QAAA,MAAM,gBAAgB,GAAI,wCAKvB,qBAAqB,4CAmCvB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useTranslation } from "react-i18next";
|
|
4
|
+
import { CrmIcon as Icon } from "../../components/group/crmIcon";
|
|
5
|
+
const ICON_BUTTON = "flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-gray-600 hover:bg-gray-5 focus-visible:outline focus-visible:outline-2 focus-visible:outline-primary-200";
|
|
6
|
+
/** CRM side-panel header: 56px bar with an optional back button and a close button. */
|
|
7
|
+
const GroupPanelHeader = ({ title, onClose, onBack, backLabel, }) => {
|
|
8
|
+
const { t } = useTranslation();
|
|
9
|
+
return (_jsxs("div", { className: `flex h-14 shrink-0 items-center gap-1 border-b border-gray-25 pr-2 ${onBack ? "pl-2" : "pl-4"}`, children: [onBack && (_jsx("button", { type: "button", className: ICON_BUTTON, onClick: onBack, "aria-label": backLabel, title: backLabel, children: _jsx(Icon, { icon: "arrow-left-o", size: 20 }) })), _jsx("h2", { className: "m-0 min-w-0 flex-1 truncate text-base font-bold text-gray-900", children: title }), onClose && (_jsx("button", { type: "button", className: ICON_BUTTON, onClick: onClose, "aria-label": t("close"), title: t("close"), children: _jsx(Icon, { icon: "close-o", size: 20 }) }))] }));
|
|
10
|
+
};
|
|
11
|
+
export default GroupPanelHeader;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemberPermissionPanel.d.ts","sourceRoot":"","sources":["../../../src/components/group/MemberPermissionPanel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MemberPermissionPanel.d.ts","sourceRoot":"","sources":["../../../src/components/group/MemberPermissionPanel.tsx"],"names":[],"mappings":"AAqBA,UAAU,0BAA0B;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AA8BD,QAAA,MAAM,qBAAqB,GAAI,4BAA4B,0BAA0B,mDA0IpF,CAAC;AAEF,eAAe,qBAAqB,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, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useEffect, useState } from "react";
|
|
4
4
|
import { ConfigProvider, 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 { useSetMemberRolePermissions } from "../../hooks/group/useGroupMemberActions";
|
|
9
9
|
import { Icon } from "../../components/icon";
|
|
10
|
+
import useAuthStore from "../../store/auth";
|
|
11
|
+
import PermissionPanelCrm 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";
|
|
@@ -22,6 +25,12 @@ const SWITCH_LABELS = {
|
|
|
22
25
|
pinMessage: "permission_pin_message",
|
|
23
26
|
viewMemberInformation: "permission_view_member_info",
|
|
24
27
|
};
|
|
28
|
+
const SWITCH_DESCRIPTIONS = {
|
|
29
|
+
sendMessage: "permission_desc_send_message",
|
|
30
|
+
addMember: "permission_desc_add_member",
|
|
31
|
+
pinMessage: "permission_desc_pin_message",
|
|
32
|
+
viewMemberInformation: "permission_desc_view_member_info",
|
|
33
|
+
};
|
|
25
34
|
const SWITCHES = Object.keys(SWITCH_PERMISSION_KEYS);
|
|
26
35
|
// "Configure Member Permissions", inline in the "Thông tin" sidebar. Switches
|
|
27
36
|
// start from what every ordinary member already shares, and "Lưu" sends only
|
|
@@ -30,7 +39,9 @@ const MemberPermissionPanel = ({ open, groupID, onClose }) => {
|
|
|
30
39
|
const { t } = useTranslation();
|
|
31
40
|
const { members: groupMembers, isLoading } = useGroupMembers(open ? groupID : undefined);
|
|
32
41
|
const { mutateAsync: setMemberRolePermissions } = useSetMemberRolePermissions();
|
|
42
|
+
const isCrm = useAuthStore((state) => state.isCrm);
|
|
33
43
|
const [isSaving, setIsSaving] = useState(false);
|
|
44
|
+
const [isConfirmOpen, setIsConfirmOpen] = useState(false);
|
|
34
45
|
const [edits, setEdits] = useState({});
|
|
35
46
|
useEffect(() => {
|
|
36
47
|
if (open)
|
|
@@ -41,9 +52,17 @@ const MemberPermissionPanel = ({ open, groupID, onClose }) => {
|
|
|
41
52
|
const pending = Object.assign(Object.assign({}, baseline), edits);
|
|
42
53
|
const changes = changedSwitches(baseline, pending);
|
|
43
54
|
const hasChanges = Object.keys(changes).length > 0;
|
|
55
|
+
const requestSave = () => {
|
|
56
|
+
if (isCrm && changes.sendMessage === false) {
|
|
57
|
+
setIsConfirmOpen(true);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
void handleSave();
|
|
61
|
+
};
|
|
44
62
|
const handleSave = async () => {
|
|
45
63
|
if (!groupID || !hasChanges)
|
|
46
64
|
return;
|
|
65
|
+
setIsConfirmOpen(false);
|
|
47
66
|
setIsSaving(true);
|
|
48
67
|
try {
|
|
49
68
|
await setMemberRolePermissions(Object.assign({ groupID }, toRolePermissionChange(SWITCH_PERMISSION_KEYS, changes)));
|
|
@@ -60,6 +79,16 @@ const MemberPermissionPanel = ({ open, groupID, onClose }) => {
|
|
|
60
79
|
};
|
|
61
80
|
if (!open)
|
|
62
81
|
return null;
|
|
63
|
-
|
|
82
|
+
if (isCrm) {
|
|
83
|
+
return (_jsxs(_Fragment, { children: [_jsx(PermissionPanelCrm, { title: t("member_permission_row"), rows: SWITCHES.map((name) => ({
|
|
84
|
+
key: name,
|
|
85
|
+
label: t(SWITCH_LABELS[name]),
|
|
86
|
+
description: t(SWITCH_DESCRIPTIONS[name]),
|
|
87
|
+
checked: pending[name],
|
|
88
|
+
disabled: isLoading,
|
|
89
|
+
onChange: (checked) => setEdits((prev) => (Object.assign(Object.assign({}, prev), { [name]: checked }))),
|
|
90
|
+
})), canSave: hasChanges && !isLoading, isSaving: isSaving, onBack: onClose, onSave: requestSave }), _jsx(DisableSendPermissionConfirm, { open: isConfirmOpen, title: t("disable_send_permission_title_all_members"), loading: isSaving, onConfirm: handleSave, onCancel: () => setIsConfirmOpen(false) })] }));
|
|
91
|
+
}
|
|
92
|
+
return (_jsxs("div", { className: "absolute inset-0 bg-white flex flex-col z-10", "data-cp-name": "MemberPermissionPanel", 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("member_permission_settings") })] }), _jsx("div", { className: "flex-1 overflow-y-auto", children: _jsx(ConfigProvider, { theme: { token: { colorPrimary: ANTD_PRIMARY_COLOR_VAR } }, children: _jsx("div", { className: "flex flex-col py-2", children: SWITCHES.map((name) => (_jsxs("div", { className: "flex items-center justify-between px-4 py-3", children: [_jsx("span", { className: "text-sm", children: t(SWITCH_LABELS[name]) }), _jsx(Switch, { checked: pending[name], disabled: isLoading, onChange: (checked) => setEdits((prev) => (Object.assign(Object.assign({}, prev), { [name]: checked }))) })] }, name))) }) }) }), _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 || isLoading, onClick: requestSave, children: t("save") })] }), _jsx(DisableSendPermissionConfirm, { open: isConfirmOpen, title: t("disable_send_permission_title_all_members"), loading: isSaving, onConfirm: handleSave, onCancel: () => setIsConfirmOpen(false) })] }));
|
|
64
93
|
};
|
|
65
94
|
export default MemberPermissionPanel;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface PermissionRowDef {
|
|
2
|
+
key: string;
|
|
3
|
+
label: string;
|
|
4
|
+
description: string;
|
|
5
|
+
checked: boolean;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
onChange: (checked: boolean) => void;
|
|
8
|
+
}
|
|
9
|
+
/** One permission per row: name, one-line description, switch. */
|
|
10
|
+
export declare const PermissionRowList: ({ rows }: {
|
|
11
|
+
rows: PermissionRowDef[];
|
|
12
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
interface PermissionPanelCrmProps {
|
|
14
|
+
title: string;
|
|
15
|
+
rows: PermissionRowDef[];
|
|
16
|
+
canSave: boolean;
|
|
17
|
+
isSaving: boolean;
|
|
18
|
+
onBack: () => void;
|
|
19
|
+
onSave: () => void;
|
|
20
|
+
}
|
|
21
|
+
/** CRM sub-panel of Thông tin nhóm: back header, permission rows, footer pinned to the bottom. */
|
|
22
|
+
declare const PermissionPanelCrm: ({ title, rows, canSave, isSaving, onBack, onSave }: PermissionPanelCrmProps) => import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export default PermissionPanelCrm;
|
|
24
|
+
//# sourceMappingURL=PermissionPanelCrm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PermissionPanelCrm.d.ts","sourceRoot":"","sources":["../../../src/components/group/PermissionPanelCrm.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC;AAED,kEAAkE;AAClE,eAAO,MAAM,iBAAiB,GAAI,UAAU;IAAE,IAAI,EAAE,gBAAgB,EAAE,CAAA;CAAE,4CAevE,CAAC;AAEF,UAAU,uBAAuB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,gBAAgB,EAAE,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,kGAAkG;AAClG,QAAA,MAAM,kBAAkB,GAAI,oDAAoD,uBAAuB,4CAgBtG,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Button, Switch } from "antd";
|
|
4
|
+
import { useTranslation } from "react-i18next";
|
|
5
|
+
import GroupPanelHeader from "./GroupPanelHeader";
|
|
6
|
+
/** One permission per row: name, one-line description, switch. */
|
|
7
|
+
export const PermissionRowList = ({ rows }) => (_jsx("ul", { className: "m-0 flex list-none flex-col p-0", children: rows.map((row) => {
|
|
8
|
+
const id = `permission-${row.key}`;
|
|
9
|
+
return (_jsxs("li", { className: "flex items-center gap-3 px-4 py-3", children: [_jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [_jsx("span", { id: id, className: "text-sm text-gray-900", children: row.label }), _jsx("span", { className: "text-xs leading-snug text-gray-600", children: row.description })] }), _jsx(Switch, { checked: row.checked, disabled: row.disabled, onChange: row.onChange, "aria-labelledby": id })] }, row.key));
|
|
10
|
+
}) }));
|
|
11
|
+
/** CRM sub-panel of Thông tin nhóm: back header, permission rows, footer pinned to the bottom. */
|
|
12
|
+
const PermissionPanelCrm = ({ title, rows, canSave, isSaving, onBack, onSave }) => {
|
|
13
|
+
const { t } = useTranslation();
|
|
14
|
+
return (_jsxs("div", { className: "absolute inset-0 z-10 flex flex-col bg-white", "data-cp-name": "PermissionPanelCrm", children: [_jsx(GroupPanelHeader, { title: title, onBack: onBack, backLabel: t("back") }), _jsx("div", { className: "min-h-0 flex-1 overflow-y-auto py-1", children: _jsx(PermissionRowList, { rows: rows }) }), _jsxs("div", { className: "flex shrink-0 justify-end gap-2 border-t border-gray-25 bg-gray-10 px-4 py-3", children: [_jsx(Button, { onClick: onBack, children: t("action_cancel") }), _jsx(Button, { type: "primary", disabled: !canSave, loading: isSaving, onClick: onSave, children: t("save") })] })] }));
|
|
15
|
+
};
|
|
16
|
+
export default PermissionPanelCrm;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface PersonAvatarProps {
|
|
2
|
+
name: string;
|
|
3
|
+
src?: string | null;
|
|
4
|
+
/** Pixel size of the round avatar. */
|
|
5
|
+
size: 24 | 32 | 36;
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
/** Photo when it loads, otherwise tinted initials. */
|
|
9
|
+
declare const PersonAvatar: ({ name, src, size, className }: PersonAvatarProps) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export default PersonAvatar;
|
|
11
|
+
//# sourceMappingURL=PersonAvatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PersonAvatar.d.ts","sourceRoot":"","sources":["../../../src/components/group/PersonAvatar.tsx"],"names":[],"mappings":"AAQA,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,sCAAsC;IACtC,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,sDAAsD;AACtD,QAAA,MAAM,YAAY,GAAI,gCAAgC,iBAAiB,4CA8BtE,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
const SIZE_CLASS = {
|
|
7
|
+
24: "h-6 w-6 text-[9px]",
|
|
8
|
+
32: "h-8 w-8 text-xs",
|
|
9
|
+
36: "h-9 w-9 text-[13px]",
|
|
10
|
+
};
|
|
11
|
+
/** Photo when it loads, otherwise tinted initials. */
|
|
12
|
+
const PersonAvatar = ({ name, src, size, className }) => {
|
|
13
|
+
const [failedSrc, setFailedSrc] = useState(null);
|
|
14
|
+
if (src && src !== failedSrc) {
|
|
15
|
+
return (
|
|
16
|
+
// eslint-disable-next-line @next/next/no-img-element
|
|
17
|
+
_jsx("img", { src: src, alt: "", className: clsx("shrink-0 rounded-full object-cover", SIZE_CLASS[size], className), onError: () => setFailedSrc(src) }));
|
|
18
|
+
}
|
|
19
|
+
return (_jsx("span", { "aria-hidden": "true", className: clsx("flex shrink-0 items-center justify-center rounded-full font-semibold", SIZE_CLASS[size], getAvatarTint(name), className), children: getInitials(name) }));
|
|
20
|
+
};
|
|
21
|
+
export default PersonAvatar;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface CrmIconProps {
|
|
2
|
+
icon: string;
|
|
3
|
+
size?: number;
|
|
4
|
+
className?: string;
|
|
5
|
+
}
|
|
6
|
+
/** CRM-only icon: renders the mockup line icon for a legacy icon-font name. */
|
|
7
|
+
export declare const CrmIcon: ({ icon, size, className }: CrmIconProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=crmIcon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crmIcon.d.ts","sourceRoot":"","sources":["../../../src/components/group/crmIcon.tsx"],"names":[],"mappings":"AAmCA,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,+EAA+E;AAC/E,eAAO,MAAM,OAAO,GAAI,2BAAgC,YAAY,4CAEnE,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { StrokeIcon } from "../../components/icon/StrokeIcon";
|
|
3
|
+
// Droppii icon-font names used by shared group markup -> the mockups' line icons.
|
|
4
|
+
const MAP = {
|
|
5
|
+
"arrow-left-o": "chevron-left",
|
|
6
|
+
"close-o": "x",
|
|
7
|
+
"close-b": "x",
|
|
8
|
+
"angle-right-o": "chevron-right",
|
|
9
|
+
"bell-o": "bell",
|
|
10
|
+
"bell-off-o": "bell-off",
|
|
11
|
+
"chat-square-o": "message-circle",
|
|
12
|
+
"shield-o": "shield",
|
|
13
|
+
"shield-fail-o": "shield",
|
|
14
|
+
"link-alt-o": "link",
|
|
15
|
+
"trash-o": "trash",
|
|
16
|
+
"logout-o": "log-out",
|
|
17
|
+
"user-del-o": "x-circle",
|
|
18
|
+
"camera-o": "camera",
|
|
19
|
+
"edit-o": "edit",
|
|
20
|
+
"plus-o": "plus",
|
|
21
|
+
"globe-o": "globe",
|
|
22
|
+
"globe-b": "globe",
|
|
23
|
+
"lock-o": "lock",
|
|
24
|
+
"lock-b": "lock",
|
|
25
|
+
"user-two-o": "users",
|
|
26
|
+
"search-o": "search",
|
|
27
|
+
"user-add-o": "user-plus",
|
|
28
|
+
"more-horizontal-b": "more",
|
|
29
|
+
"key-o": "key",
|
|
30
|
+
"check-b": "check",
|
|
31
|
+
"camera-b": "camera",
|
|
32
|
+
"user-x": "user-x",
|
|
33
|
+
};
|
|
34
|
+
/** CRM-only icon: renders the mockup line icon for a legacy icon-font name. */
|
|
35
|
+
export const CrmIcon = ({ icon, size = 20, className }) => {
|
|
36
|
+
var _a;
|
|
37
|
+
return (_jsx(StrokeIcon, { name: (_a = MAP[icon]) !== null && _a !== void 0 ? _a : "info", size: size, className: className }));
|
|
38
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { StrokeIconName } from "./strokeIconNodes";
|
|
2
|
+
interface AdaptiveIconProps {
|
|
3
|
+
/** Line icon shown in CRM. */
|
|
4
|
+
stroke: StrokeIconName;
|
|
5
|
+
/** Icon-font glyph every other host keeps. */
|
|
6
|
+
font: string;
|
|
7
|
+
size?: number;
|
|
8
|
+
/** Size of the line icon when it differs from the font glyph's. */
|
|
9
|
+
strokeSize?: number;
|
|
10
|
+
className?: string;
|
|
11
|
+
}
|
|
12
|
+
/** Mockup line icon in CRM, the icon-font glyph elsewhere. */
|
|
13
|
+
export declare const AdaptiveIcon: ({ stroke, font, size, strokeSize, className }: AdaptiveIconProps) => import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=AdaptiveIcon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdaptiveIcon.d.ts","sourceRoot":"","sources":["../../../src/components/icon/AdaptiveIcon.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,UAAU,iBAAiB;IACzB,8BAA8B;IAC9B,MAAM,EAAE,cAAc,CAAC;IACvB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,8DAA8D;AAC9D,eAAO,MAAM,YAAY,GAAI,+CAAoD,iBAAiB,4CAOjG,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import useAuthStore from "../../store/auth";
|
|
4
|
+
import { Icon } from "./index";
|
|
5
|
+
import { StrokeIcon } from "./StrokeIcon";
|
|
6
|
+
/** Mockup line icon in CRM, the icon-font glyph elsewhere. */
|
|
7
|
+
export const AdaptiveIcon = ({ stroke, font, size = 20, strokeSize, className }) => {
|
|
8
|
+
const isCrm = useAuthStore((state) => state.isCrm);
|
|
9
|
+
return isCrm ? (_jsx(StrokeIcon, { name: stroke, size: strokeSize !== null && strokeSize !== void 0 ? strokeSize : size, className: className })) : (_jsx(Icon, { icon: font, size: size, className: className }));
|
|
10
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CSSProperties } from "react";
|
|
2
|
+
import { StrokeIconName } from "./strokeIconNodes";
|
|
3
|
+
export interface StrokeIconProps {
|
|
4
|
+
name: StrokeIconName;
|
|
5
|
+
size?: number;
|
|
6
|
+
strokeWidth?: number;
|
|
7
|
+
className?: string;
|
|
8
|
+
style?: CSSProperties;
|
|
9
|
+
/** Gives the icon an accessible name; without it the icon is decorative. */
|
|
10
|
+
title?: string;
|
|
11
|
+
}
|
|
12
|
+
/** Line icons from the approved CRM mockups. Colour follows `currentColor`. */
|
|
13
|
+
export declare const StrokeIcon: ({ name, size, strokeWidth, className, style, title, }: StrokeIconProps) => import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=StrokeIcon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StrokeIcon.d.ts","sourceRoot":"","sources":["../../../src/components/icon/StrokeIcon.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,aAAa,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAqB,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,+EAA+E;AAC/E,eAAO,MAAM,UAAU,GAAI,uDAOxB,eAAe,4CAqBjB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createElement } from "react";
|
|
3
|
+
import { STROKE_ICON_NODES } from "./strokeIconNodes";
|
|
4
|
+
/** Line icons from the approved CRM mockups. Colour follows `currentColor`. */
|
|
5
|
+
export const StrokeIcon = ({ name, size = 20, strokeWidth = 1.75, className, style, title, }) => (_jsx("svg", { "data-cp-name": "StrokeIcon", width: size, height: size, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: strokeWidth, strokeLinecap: "round", strokeLinejoin: "round", className: className, style: Object.assign({ flexShrink: 0, display: "block" }, style), role: title ? "img" : undefined, "aria-hidden": title ? undefined : true, "aria-label": title, children: STROKE_ICON_NODES[name].map(([tag, attrs], index) => createElement(tag, Object.assign({ key: index }, attrs))) }));
|