@droppii-org/chat-sdk 0.3.8 → 0.4.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.js +1 -1
- package/dist/components/canned-response/CannedResponseFooter.js +1 -1
- package/dist/components/canned-response/CannedResponseHeader.js +1 -1
- package/dist/components/canned-response/index.js +1 -1
- package/dist/components/canned-response/team/TeamItem.js +1 -1
- package/dist/components/common/ConfirmModal.d.ts.map +1 -1
- package/dist/components/common/ConfirmModal.js +1 -1
- package/dist/components/common/InfoModal.d.ts.map +1 -1
- package/dist/components/common/InfoModal.js +1 -1
- package/dist/components/compose/ComposeNewMessageModal.d.ts.map +1 -1
- package/dist/components/compose/ComposeNewMessageModal.js +1 -1
- package/dist/components/conversation/ConversationByGroupItem.d.ts.map +1 -1
- package/dist/components/conversation/ConversationByGroupItem.js +2 -1
- package/dist/components/conversation/ConversationBySessionItem.d.ts.map +1 -1
- package/dist/components/conversation/ConversationBySessionItem.js +2 -1
- package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
- package/dist/components/conversation/DeskConversationList.js +1 -1
- package/dist/components/conversation/MentionIndicatorIcon.d.ts +7 -0
- package/dist/components/conversation/MentionIndicatorIcon.d.ts.map +1 -0
- package/dist/components/conversation/MentionIndicatorIcon.js +17 -0
- package/dist/components/conversation/SwipeActionButton.d.ts.map +1 -1
- package/dist/components/conversation/SwipeActionButton.js +1 -1
- package/dist/components/conversation/SwipeableRow.d.ts.map +1 -1
- package/dist/components/conversation/SwipeableRow.js +1 -1
- package/dist/components/conversation/ThreadCard.d.ts +2 -1
- package/dist/components/conversation/ThreadCard.d.ts.map +1 -1
- package/dist/components/conversation/ThreadCard.js +4 -4
- package/dist/components/conversation-detail/ConversationDetailHeader.d.ts.map +1 -1
- package/dist/components/conversation-detail/ConversationDetailHeader.js +2 -2
- package/dist/components/conversation-detail/ConversationDetailInput.d.ts.map +1 -1
- package/dist/components/conversation-detail/ConversationDetailInput.js +5 -1
- package/dist/components/conversation-detail/ConversationMessageList.d.ts.map +1 -1
- package/dist/components/conversation-detail/ConversationMessageList.js +1 -1
- package/dist/components/conversation-detail/ConversationMoreOptionItem.d.ts.map +1 -1
- package/dist/components/conversation-detail/ConversationMoreOptionItem.js +1 -1
- package/dist/components/conversation-detail/ConversationMoreOptionPanel.d.ts.map +1 -1
- package/dist/components/conversation-detail/ConversationMoreOptionPanel.js +1 -1
- package/dist/components/conversation-detail/LeaveGroupBlockedModal.d.ts +12 -0
- package/dist/components/conversation-detail/LeaveGroupBlockedModal.d.ts.map +1 -0
- package/dist/components/conversation-detail/LeaveGroupBlockedModal.js +18 -0
- package/dist/components/conversation-detail/LeaveGroupConfirmModal.d.ts +16 -0
- package/dist/components/conversation-detail/LeaveGroupConfirmModal.d.ts.map +1 -0
- package/dist/components/conversation-detail/LeaveGroupConfirmModal.js +21 -0
- package/dist/components/conversation-detail/PinLimitModal.d.ts.map +1 -1
- package/dist/components/conversation-detail/PinLimitModal.js +1 -1
- package/dist/components/conversation-detail/PinnedMessageBar.d.ts.map +1 -1
- package/dist/components/conversation-detail/PinnedMessageBar.js +8 -4
- package/dist/components/conversation-detail/PinnedMessageItem.d.ts.map +1 -1
- package/dist/components/conversation-detail/PinnedMessageItem.js +1 -1
- package/dist/components/conversation-detail/PinnedMessagesPanel.d.ts.map +1 -1
- package/dist/components/conversation-detail/PinnedMessagesPanel.js +1 -1
- package/dist/components/conversation-detail/ThreadProfilePanel.d.ts.map +1 -1
- package/dist/components/conversation-detail/ThreadProfilePanel.js +12 -2
- package/dist/components/conversation-detail/bot/BotButtonMessage.d.ts.map +1 -1
- package/dist/components/conversation-detail/bot/BotButtonMessage.js +1 -1
- package/dist/components/conversation-detail/bot/BotInactiveNotice.d.ts.map +1 -1
- package/dist/components/conversation-detail/bot/BotInactiveNotice.js +1 -1
- package/dist/components/conversation-detail/bot/BotMenuSheet.d.ts.map +1 -1
- package/dist/components/conversation-detail/bot/BotMenuSheet.js +1 -1
- package/dist/components/conversation-detail/bot/BotStartButton.d.ts.map +1 -1
- package/dist/components/conversation-detail/bot/BotStartButton.js +1 -1
- package/dist/components/conversation-detail/bot/BotSuggest.d.ts.map +1 -1
- package/dist/components/conversation-detail/bot/BotSuggest.js +2 -2
- package/dist/components/conversation-detail/bot/CsSessionConfirmModal.d.ts.map +1 -1
- package/dist/components/conversation-detail/bot/CsSessionConfirmModal.js +1 -1
- package/dist/components/conversation-detail/index.d.ts +4 -0
- package/dist/components/conversation-detail/index.d.ts.map +1 -1
- package/dist/components/conversation-detail/index.js +2 -0
- package/dist/components/conversation-inbox/ConversationInboxHeader.d.ts.map +1 -1
- package/dist/components/conversation-inbox/ConversationInboxHeader.js +1 -1
- package/dist/components/conversation-inbox/ConversationInboxItem.d.ts.map +1 -1
- package/dist/components/conversation-inbox/ConversationInboxItem.js +2 -1
- package/dist/components/conversation-inbox/ConversationInboxList.d.ts.map +1 -1
- package/dist/components/conversation-inbox/ConversationInboxList.js +1 -1
- package/dist/components/conversation-inbox/ConversationInboxTitle.d.ts.map +1 -1
- package/dist/components/conversation-inbox/ConversationInboxTitle.js +1 -1
- package/dist/components/conversation-inbox/ConversationPeerAvatar.d.ts.map +1 -1
- package/dist/components/conversation-inbox/ConversationPeerAvatar.js +1 -1
- package/dist/components/conversation-inbox/MuteConversationConfirmModal.d.ts.map +1 -1
- package/dist/components/conversation-inbox/MuteConversationConfirmModal.js +1 -1
- package/dist/components/group/AddMemberModal.d.ts.map +1 -1
- package/dist/components/group/AddMemberModal.js +1 -1
- package/dist/components/group/CreateGroupForm.d.ts.map +1 -1
- package/dist/components/group/CreateGroupForm.js +1 -3
- package/dist/components/group/GroupMemberPicker.js +1 -1
- package/dist/components/group/MemberPermissionPanel.js +1 -1
- package/dist/components/icon/index.d.ts.map +1 -1
- package/dist/components/icon/index.js +1 -1
- package/dist/components/media-collection/FileCollection.d.ts.map +1 -1
- package/dist/components/media-collection/FileCollection.js +1 -1
- package/dist/components/media-collection/ImageCollection.d.ts.map +1 -1
- package/dist/components/media-collection/ImageCollection.js +1 -1
- package/dist/components/media-collection/LinkCollection.d.ts.map +1 -1
- package/dist/components/media-collection/LinkCollection.js +2 -2
- package/dist/components/media-collection/VideoCollection.d.ts.map +1 -1
- package/dist/components/media-collection/VideoCollection.js +1 -1
- package/dist/components/media-collection/index.js +1 -1
- package/dist/components/media-resources/FileResourceList.d.ts.map +1 -1
- package/dist/components/media-resources/FileResourceList.js +1 -1
- package/dist/components/media-resources/ImageResourceGrid.d.ts.map +1 -1
- package/dist/components/media-resources/ImageResourceGrid.js +1 -1
- package/dist/components/media-resources/LinkResourceItem.d.ts.map +1 -1
- package/dist/components/media-resources/LinkResourceItem.js +1 -1
- package/dist/components/media-resources/LinkResourceList.d.ts.map +1 -1
- package/dist/components/media-resources/LinkResourceList.js +1 -1
- package/dist/components/media-resources/MediaEntryCard.d.ts.map +1 -1
- package/dist/components/media-resources/MediaEntryCard.js +1 -1
- package/dist/components/media-resources/MediaResourcePanel.d.ts.map +1 -1
- package/dist/components/media-resources/MediaResourcePanel.js +1 -1
- package/dist/components/media-resources/MediaResourceTabBar.d.ts.map +1 -1
- package/dist/components/media-resources/MediaResourceTabBar.js +1 -1
- package/dist/components/media-resources/MediaResourceTabs.js +1 -1
- package/dist/components/media-resources/ResourceEmptyState.d.ts.map +1 -1
- package/dist/components/media-resources/ResourceEmptyState.js +1 -1
- package/dist/components/media-resources/ResourceScrollContainer.d.ts.map +1 -1
- package/dist/components/media-resources/ResourceScrollContainer.js +1 -1
- package/dist/components/media-resources/VideoResourceGrid.d.ts.map +1 -1
- package/dist/components/media-resources/VideoResourceGrid.js +1 -1
- package/dist/components/message/GroupMembersDrawer.js +1 -1
- package/dist/components/message/MessageHeader.d.ts.map +1 -1
- package/dist/components/message/MessageHeader.js +3 -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.map +1 -1
- package/dist/components/message/MessageList.js +22 -12
- package/dist/components/message/SelectSession.js +1 -1
- package/dist/components/message/UnassignedSessionFooter.d.ts.map +1 -1
- package/dist/components/message/UnassignedSessionFooter.js +1 -1
- package/dist/components/message/footer/ActionBar.d.ts.map +1 -1
- package/dist/components/message/footer/ActionBar.js +4 -1
- package/dist/components/message/footer/ComposerEditor.js +1 -1
- package/dist/components/message/footer/ComposerTabs.d.ts.map +1 -1
- package/dist/components/message/footer/ComposerTabs.js +1 -1
- package/dist/components/message/footer/EmojiPicker.js +1 -1
- package/dist/components/message/footer/EnterHandler.d.ts.map +1 -1
- package/dist/components/message/footer/EnterHandler.js +10 -1
- package/dist/components/message/footer/FilePreview.d.ts.map +1 -1
- package/dist/components/message/footer/FilePreview.js +4 -4
- package/dist/components/message/footer/LinkInputPreview.d.ts.map +1 -1
- package/dist/components/message/footer/LinkInputPreview.js +1 -1
- package/dist/components/message/footer/MediaActions.js +1 -1
- package/dist/components/message/footer/SessionClosedModal.d.ts.map +1 -1
- package/dist/components/message/footer/SessionClosedModal.js +1 -1
- package/dist/components/message/footer/ToolbarPlugin.js +1 -1
- package/dist/components/message/footer/editorConfig.d.ts +2 -1
- package/dist/components/message/footer/editorConfig.d.ts.map +1 -1
- package/dist/components/message/footer/editorConfig.js +2 -0
- package/dist/components/message/footer/index.d.ts.map +1 -1
- package/dist/components/message/footer/index.js +16 -2
- package/dist/components/message/footer/mention/MentionMenu.d.ts +6 -0
- package/dist/components/message/footer/mention/MentionMenu.d.ts.map +1 -0
- package/dist/components/message/footer/mention/MentionMenu.js +51 -0
- package/dist/components/message/footer/mention/MentionNode.d.ts +20 -0
- package/dist/components/message/footer/mention/MentionNode.d.ts.map +1 -0
- package/dist/components/message/footer/mention/MentionNode.js +39 -0
- package/dist/components/message/footer/mention/extractMentions.d.ts +6 -0
- package/dist/components/message/footer/mention/extractMentions.d.ts.map +1 -0
- package/dist/components/message/footer/mention/extractMentions.js +66 -0
- package/dist/components/message/footer/mention/useMentionOptions.d.ts +8 -0
- package/dist/components/message/footer/mention/useMentionOptions.d.ts.map +1 -0
- package/dist/components/message/footer/mention/useMentionOptions.js +45 -0
- package/dist/components/message/item/AtTextMessage.d.ts +16 -0
- package/dist/components/message/item/AtTextMessage.d.ts.map +1 -0
- package/dist/components/message/item/AtTextMessage.js +112 -0
- package/dist/components/message/item/FileMessage.js +1 -1
- package/dist/components/message/item/GroupNotificationMessage.d.ts.map +1 -1
- package/dist/components/message/item/GroupNotificationMessage.js +2 -2
- package/dist/components/message/item/ImageMessage.js +1 -1
- package/dist/components/message/item/LinkCard.d.ts.map +1 -1
- package/dist/components/message/item/LinkCard.js +1 -1
- package/dist/components/message/item/LinkText.d.ts.map +1 -1
- package/dist/components/message/item/LinkText.js +1 -1
- package/dist/components/message/item/MergeImageMessage.js +1 -1
- package/dist/components/message/item/MessageBubble.d.ts.map +1 -1
- package/dist/components/message/item/MessageBubble.js +2 -2
- package/dist/components/message/item/QuoteMessage.d.ts.map +1 -1
- package/dist/components/message/item/QuoteMessage.js +1 -1
- package/dist/components/message/item/RevokeMessage.d.ts.map +1 -1
- package/dist/components/message/item/RevokeMessage.js +1 -1
- package/dist/components/message/item/VideoMessage.js +1 -1
- package/dist/components/message/item/index.d.ts.map +1 -1
- package/dist/components/message/item/index.js +3 -3
- package/dist/components/message/item/renderMessageContent.d.ts.map +1 -1
- package/dist/components/message/item/renderMessageContent.js +3 -0
- package/dist/components/message/reply/ReplyPreviewBar.d.ts.map +1 -1
- package/dist/components/message/reply/ReplyPreviewBar.js +1 -1
- package/dist/components/message/reply/ReplyQuoteContent.d.ts.map +1 -1
- package/dist/components/message/reply/ReplyQuoteContent.js +7 -5
- package/dist/components/message/toolbox/MessageToolboxMenu.js +1 -1
- package/dist/components/message/toolbox/getCopyableMessageText.d.ts.map +1 -1
- package/dist/components/message/toolbox/getCopyableMessageText.js +5 -3
- package/dist/components/message/toolbox/isPinnableMessageType.d.ts.map +1 -1
- package/dist/components/message/toolbox/isPinnableMessageType.js +1 -0
- package/dist/components/search-conversation/SearchAll.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchAll.js +9 -3
- package/dist/components/search-conversation/SearchConversationAsGroups.d.ts +6 -0
- package/dist/components/search-conversation/SearchConversationAsGroups.d.ts.map +1 -0
- package/dist/components/search-conversation/SearchConversationAsGroups.js +20 -0
- package/dist/components/search-conversation/SearchConversationAsMessages.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchConversationAsMessages.js +1 -1
- package/dist/components/search-conversation/SearchConversationAsUsers.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchConversationAsUsers.js +1 -1
- package/dist/components/search-conversation/SearchConversationMyInbox.js +1 -1
- package/dist/components/search-conversation/SearchDrawer.js +1 -1
- package/dist/components/search-conversation/SearchMessageOnCurrentConversation.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchMessageOnCurrentConversation.js +1 -1
- package/dist/components/search-conversation/index.d.ts +2 -1
- package/dist/components/search-conversation/index.d.ts.map +1 -1
- package/dist/components/search-conversation/index.js +8 -1
- package/dist/components/search-conversation/item/SearchItemAsGroup.d.ts +8 -0
- package/dist/components/search-conversation/item/SearchItemAsGroup.d.ts.map +1 -0
- package/dist/components/search-conversation/item/SearchItemAsGroup.js +34 -0
- package/dist/components/search-conversation/item/SearchItemAsMessage.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsMessage.js +1 -1
- package/dist/components/search-conversation/item/SearchItemAsUser.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsUser.js +1 -1
- package/dist/components/session/DeskTeamInbox.d.ts.map +1 -1
- package/dist/components/session/DeskTeamInbox.js +3 -2
- package/dist/components/session/SessionFilterMenu.d.ts.map +1 -1
- package/dist/components/session/SessionFilterMenu.js +1 -1
- package/dist/components/thread/AssignConfirmModal.d.ts.map +1 -1
- package/dist/components/thread/AssignConfirmModal.js +1 -1
- package/dist/components/thread/GroupThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/GroupThreadInfo.js +7 -4
- package/dist/components/thread/ManualAssignPopover.d.ts.map +1 -1
- package/dist/components/thread/ManualAssignPopover.js +1 -1
- package/dist/components/thread/SessionSection.d.ts.map +1 -1
- package/dist/components/thread/SessionSection.js +2 -2
- package/dist/components/thread/SingleThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/SingleThreadInfo.js +1 -1
- package/dist/components/thread/ThreadInfo.js +1 -1
- package/dist/components/thread/UserSection.d.ts.map +1 -1
- package/dist/components/thread/UserSection.js +1 -1
- package/dist/components/video-player/VideoPlayerModal.d.ts.map +1 -1
- package/dist/components/video-player/VideoPlayerModal.js +1 -1
- package/dist/context/ChatContext.d.ts +1 -1
- package/dist/context/ChatContext.d.ts.map +1 -1
- package/dist/context/ChatContext.js +2 -1
- package/dist/hooks/global/useGlobalEvent.d.ts.map +1 -1
- package/dist/hooks/global/useGlobalEvent.js +125 -25
- package/dist/hooks/group/useConversationGroups.d.ts +5 -1
- package/dist/hooks/group/useConversationGroups.d.ts.map +1 -1
- package/dist/hooks/group/useConversationGroups.js +3 -3
- package/dist/hooks/group/useGroupPermission.d.ts +1 -1
- package/dist/hooks/group/useGroupPermission.d.ts.map +1 -1
- package/dist/hooks/group/useGroupPermission.js +2 -2
- package/dist/hooks/group/useLeaveGroupAction.d.ts +24 -0
- package/dist/hooks/group/useLeaveGroupAction.d.ts.map +1 -0
- package/dist/hooks/group/useLeaveGroupAction.js +79 -0
- package/dist/hooks/group/useQuitGroup.d.ts +6 -0
- package/dist/hooks/group/useQuitGroup.d.ts.map +1 -0
- package/dist/hooks/group/useQuitGroup.js +62 -0
- package/dist/hooks/message/useMessage.d.ts +4 -1
- package/dist/hooks/message/useMessage.d.ts.map +1 -1
- package/dist/hooks/message/useMessage.js +9 -2
- package/dist/hooks/message/useSendMessage.d.ts +8 -4
- package/dist/hooks/message/useSendMessage.d.ts.map +1 -1
- package/dist/hooks/message/useSendMessage.js +46 -12
- package/dist/hooks/search/useSearchGroups.d.ts +16 -0
- package/dist/hooks/search/useSearchGroups.d.ts.map +1 -0
- package/dist/hooks/search/useSearchGroups.js +65 -0
- package/dist/hooks/session/useConversationSessionState.d.ts +2 -1
- package/dist/hooks/session/useConversationSessionState.d.ts.map +1 -1
- package/dist/hooks/session/useConversationSessionState.js +5 -5
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js +10 -1
- package/dist/locales/vi/common.json +12 -0
- package/dist/locales/vi/conversation-inbox.json +18 -1
- package/dist/services/query.d.ts +1 -0
- package/dist/services/query.d.ts.map +1 -1
- package/dist/services/query.js +1 -0
- package/dist/services/routes.d.ts +1 -0
- package/dist/services/routes.d.ts.map +1 -1
- package/dist/services/routes.js +1 -0
- package/dist/store/auth.js +1 -1
- package/dist/store/conversation.d.ts.map +1 -1
- package/dist/store/conversation.js +96 -51
- package/dist/store/type.d.ts +8 -2
- package/dist/store/type.d.ts.map +1 -1
- package/dist/styles/global.css +1 -1
- package/dist/types/chat.d.ts +28 -2
- package/dist/types/chat.d.ts.map +1 -1
- package/dist/types/dto.d.ts +3 -1
- package/dist/types/dto.d.ts.map +1 -1
- package/dist/utils/common.d.ts.map +1 -1
- package/dist/utils/common.js +19 -9
- package/dist/utils/messageLog.d.ts +2 -2
- package/dist/utils/messageLog.d.ts.map +1 -1
- package/dist/utils/messageLog.js +33 -3
- package/package.json +17 -3
|
@@ -56,8 +56,8 @@ export const permissionListToGroupPermissions = (permissionList, roleLevel) => {
|
|
|
56
56
|
permissionList.includes(permissionString),
|
|
57
57
|
]));
|
|
58
58
|
};
|
|
59
|
-
export const useGroupPermission = (
|
|
60
|
-
const currentMemberInGroup = useConversationStore((state) => state.currentMemberInGroup);
|
|
59
|
+
export const useGroupPermission = (groupID) => {
|
|
60
|
+
const currentMemberInGroup = useConversationStore((state) => groupID ? state.currentMemberInGroup.get(groupID) : undefined);
|
|
61
61
|
return useMemo(() => {
|
|
62
62
|
var _a;
|
|
63
63
|
const roleLevel = (_a = currentMemberInGroup === null || currentMemberInGroup === void 0 ? void 0 : currentMemberInGroup.roleLevel) !== null && _a !== void 0 ? _a : GroupMemberRole.Normal;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
interface UseLeaveGroupActionParams {
|
|
2
|
+
groupID?: string;
|
|
3
|
+
conversationID?: string;
|
|
4
|
+
isGroupThread: boolean;
|
|
5
|
+
onLeft?: () => void;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Owns the "Rời nhóm" flow: who may leave, which modal opens, and the
|
|
9
|
+
* quitGroup call itself. Kept out of the panel so the panel stays
|
|
10
|
+
* presentational as more group-info rows land from sibling tickets.
|
|
11
|
+
*/
|
|
12
|
+
export declare const useLeaveGroupAction: ({ groupID, conversationID, isGroupThread, onLeft, }: UseLeaveGroupActionParams) => {
|
|
13
|
+
canLeaveGroup: boolean;
|
|
14
|
+
isPublicGroup: boolean;
|
|
15
|
+
isLeaving: boolean;
|
|
16
|
+
isConfirmOpen: boolean;
|
|
17
|
+
isBlockedOpen: boolean;
|
|
18
|
+
openLeaveGroup: () => void;
|
|
19
|
+
confirmLeaveGroup: () => Promise<void>;
|
|
20
|
+
closeConfirm: () => void;
|
|
21
|
+
closeBlocked: () => void;
|
|
22
|
+
};
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=useLeaveGroupAction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLeaveGroupAction.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useLeaveGroupAction.ts"],"names":[],"mappings":"AAUA,UAAU,yBAAyB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,qDAKjC,yBAAyB;;;;;;;;;;CA+E3B,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { message } from "antd";
|
|
4
|
+
import { useTranslation } from "react-i18next";
|
|
5
|
+
import { GroupMemberRole, GroupVisibility } from "@droppii-org/wasm-client-sdk";
|
|
6
|
+
import useConversationStore from "../../store/conversation";
|
|
7
|
+
import useAuthStore from "../../store/auth";
|
|
8
|
+
import { useQuitGroup } from "./useQuitGroup";
|
|
9
|
+
/**
|
|
10
|
+
* Owns the "Rời nhóm" flow: who may leave, which modal opens, and the
|
|
11
|
+
* quitGroup call itself. Kept out of the panel so the panel stays
|
|
12
|
+
* presentational as more group-info rows land from sibling tickets.
|
|
13
|
+
*/
|
|
14
|
+
export const useLeaveGroupAction = ({ groupID, conversationID, isGroupThread, onLeft, }) => {
|
|
15
|
+
const { t } = useTranslation("conversation-inbox");
|
|
16
|
+
const currentGroupInfo = useConversationStore((state) => groupID ? state.currentGroupInfo.get(groupID) : undefined);
|
|
17
|
+
const currentMemberInGroup = useConversationStore((state) => groupID ? state.currentMemberInGroup.get(groupID) : undefined);
|
|
18
|
+
const isViewOnlyMember = useConversationStore((state) => state.isViewOnlyMember);
|
|
19
|
+
// useAuthStore.userID is the canonical self ID here (ChatContext populates
|
|
20
|
+
// it on init). useUserStore.selfInfo is never filled in this host, so its
|
|
21
|
+
// `id` is undefined — which is also why roleLevel below stays undefined.
|
|
22
|
+
const selfUserID = useAuthStore((state) => state.userID);
|
|
23
|
+
const { mutateAsync: quitGroup, isPending: isLeaving } = useQuitGroup();
|
|
24
|
+
const [isConfirmOpen, setIsConfirmOpen] = useState(false);
|
|
25
|
+
const [isBlockedOpen, setIsBlockedOpen] = useState(false);
|
|
26
|
+
// Only a current member of a group thread can leave it. A view-only member
|
|
27
|
+
// of a public group already left / was removed, so the row stays hidden.
|
|
28
|
+
// currentGroupInfo is required too: without it we can classify neither the
|
|
29
|
+
// owner (who must be blocked) nor the visibility (which picks the copy), and
|
|
30
|
+
// guessing either way is worse than waiting for the fetch.
|
|
31
|
+
const canLeaveGroup = isGroupThread &&
|
|
32
|
+
!!groupID &&
|
|
33
|
+
!!currentMemberInGroup &&
|
|
34
|
+
!!currentGroupInfo &&
|
|
35
|
+
!isViewOnlyMember;
|
|
36
|
+
// ownerUserID is the reliable source. roleLevel is not: it comes only from
|
|
37
|
+
// getCurrentMemberInGroupByReq, which queries by useUserStore.selfInfo.id —
|
|
38
|
+
// undefined in this host — so the member entry is written by
|
|
39
|
+
// getSelfGroupPermissionByReq instead and carries no roleLevel at all.
|
|
40
|
+
// Kept as a fallback for hosts that do populate selfInfo.
|
|
41
|
+
const isGroupOwner = (currentGroupInfo === null || currentGroupInfo === void 0 ? void 0 : currentGroupInfo.ownerUserID) && selfUserID
|
|
42
|
+
? currentGroupInfo.ownerUserID === selfUserID
|
|
43
|
+
: (currentMemberInGroup === null || currentMemberInGroup === void 0 ? void 0 : currentMemberInGroup.roleLevel) === GroupMemberRole.Owner;
|
|
44
|
+
const isPublicGroup = (currentGroupInfo === null || currentGroupInfo === void 0 ? void 0 : currentGroupInfo.visibility) === GroupVisibility.Public;
|
|
45
|
+
// The owner must transfer ownership first (BR-002) — they get the blocking
|
|
46
|
+
// modal instead of the confirmation one, and nothing changes.
|
|
47
|
+
const openLeaveGroup = () => {
|
|
48
|
+
if (isGroupOwner) {
|
|
49
|
+
setIsBlockedOpen(true);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
setIsConfirmOpen(true);
|
|
53
|
+
};
|
|
54
|
+
const confirmLeaveGroup = async () => {
|
|
55
|
+
if (!groupID) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
await quitGroup({ groupID, conversationID, isPublicGroup });
|
|
60
|
+
setIsConfirmOpen(false);
|
|
61
|
+
onLeft === null || onLeft === void 0 ? void 0 : onLeft();
|
|
62
|
+
message.success(t("thread_detail.leave_group.success"));
|
|
63
|
+
}
|
|
64
|
+
catch (_error) {
|
|
65
|
+
message.error(t("thread_detail.leave_group.failed"));
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
return {
|
|
69
|
+
canLeaveGroup,
|
|
70
|
+
isPublicGroup,
|
|
71
|
+
isLeaving,
|
|
72
|
+
isConfirmOpen,
|
|
73
|
+
isBlockedOpen,
|
|
74
|
+
openLeaveGroup,
|
|
75
|
+
confirmLeaveGroup,
|
|
76
|
+
closeConfirm: () => setIsConfirmOpen(false),
|
|
77
|
+
closeBlocked: () => setIsBlockedOpen(false),
|
|
78
|
+
};
|
|
79
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useQuitGroup.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useQuitGroup.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,YAAY;aASV,MAAM;qBACE,MAAM;oBACP,OAAO;WA6D5B,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useMutation } from "@tanstack/react-query";
|
|
3
|
+
import { DChatSDK } from "../../constants/sdk";
|
|
4
|
+
import useConversationStore from "../../store/conversation";
|
|
5
|
+
import emitter from "../../utils/events";
|
|
6
|
+
import { useChatContext } from "../../context/ChatContext";
|
|
7
|
+
export const useQuitGroup = () => {
|
|
8
|
+
const { onNavigate } = useChatContext();
|
|
9
|
+
return useMutation({
|
|
10
|
+
mutationFn: async ({ groupID, conversationID, isPublicGroup, }) => {
|
|
11
|
+
// Set before the request — OnJoinedGroupDeleted also fires on our own
|
|
12
|
+
// client, with no ordering guarantee vs. this promise resolving. Without
|
|
13
|
+
// the flag leftGroupHandler would show the "removed from group" modal.
|
|
14
|
+
useConversationStore.getState().setSelfLeftGroupID(groupID);
|
|
15
|
+
const { data } = await DChatSDK.quitGroup(groupID);
|
|
16
|
+
// A public group stays in My Inbox after leaving — the user keeps
|
|
17
|
+
// view-only access to it, same as leftGroupHandler's staysViewOnly path.
|
|
18
|
+
//
|
|
19
|
+
// A private one must disappear, and that needs an explicit local
|
|
20
|
+
// cleanup: the server drops the membership but the wasm SDK keeps the
|
|
21
|
+
// row in its local DB, and My Inbox reads from there
|
|
22
|
+
// (getConversationListSplit), so the group returns on the next reload.
|
|
23
|
+
// hideConversation is the only SDK call that drops the row from that
|
|
24
|
+
// list — deleteConversationAndDeleteAllMsg just wipes the messages and
|
|
25
|
+
// leaves the conversation behind. Best-effort: the leave already
|
|
26
|
+
// succeeded server-side, and OnJoinedGroupDeleted may have cleaned up
|
|
27
|
+
// first, which makes this reject with RecordNotFound.
|
|
28
|
+
if (conversationID && !isPublicGroup) {
|
|
29
|
+
try {
|
|
30
|
+
await DChatSDK.hideConversation(conversationID);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error("Failed to hide the local conversation after leaving the group:", error);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
emitter.emit("GROUP_MEMBERS_CHANGED");
|
|
37
|
+
return data;
|
|
38
|
+
},
|
|
39
|
+
onSuccess: (_data, variables) => {
|
|
40
|
+
useConversationStore.getState().clearSelectedConversation();
|
|
41
|
+
// Same rule as above: only a private group leaves the inbox.
|
|
42
|
+
if (!variables.isPublicGroup) {
|
|
43
|
+
useConversationStore.setState((state) => ({
|
|
44
|
+
conversationList: state.conversationList.filter((conversation) => conversation.groupID !== variables.groupID),
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
// Clearing the store alone won't navigate away — URL threadId must
|
|
48
|
+
// also clear, or DeskConversationList re-selects it (see PR #226).
|
|
49
|
+
const newSearchParams = new URLSearchParams(window.location.search);
|
|
50
|
+
newSearchParams.delete("threadId");
|
|
51
|
+
newSearchParams.delete("userId");
|
|
52
|
+
newSearchParams.delete("groupId");
|
|
53
|
+
newSearchParams.delete("botId");
|
|
54
|
+
const query = newSearchParams.toString();
|
|
55
|
+
const pathname = window.location.pathname;
|
|
56
|
+
onNavigate === null || onNavigate === void 0 ? void 0 : onNavigate(query ? `${pathname}?${query}` : pathname);
|
|
57
|
+
},
|
|
58
|
+
onError: () => {
|
|
59
|
+
useConversationStore.getState().setSelfLeftGroupID(null);
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
};
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { MessageItem, MessageType } from "@droppii-org/wasm-client-sdk";
|
|
2
2
|
export declare const visibleTypeMessage: MessageType[];
|
|
3
|
-
export declare const isMessageHiddenForViewer: (message: MessageItem, isCrm: boolean
|
|
3
|
+
export declare const isMessageHiddenForViewer: (message: MessageItem, isCrm: boolean, conversation?: {
|
|
4
|
+
peerType?: string;
|
|
5
|
+
conversationType?: number;
|
|
6
|
+
}) => boolean;
|
|
4
7
|
export declare const useMessage: (conversationId?: string, searchClientMsgID?: string, enabled?: boolean, useAppHistory?: boolean) => {
|
|
5
8
|
loadState: {
|
|
6
9
|
initLoading: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useMessage.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,WAAW,EACX,WAAW,EAEZ,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"useMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useMessage.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,WAAW,EACX,WAAW,EAEZ,MAAM,8BAA8B,CAAC;AAatC,eAAO,MAAM,kBAAkB,eAkB9B,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,SAAS,WAAW,EACpB,OAAO,OAAO,EACd,eAAe;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,KAC9D,OAqBF,CAAC;AAEF,eAAO,MAAM,UAAU,GACrB,iBAAiB,MAAM,EACvB,oBAAoB,MAAM,EAC1B,iBAAc,EACd,uBAAqB;;;;;qBAeA,WAAW,EAAE;;;;;;qBAAb,WAAW,EAAE;;;;;;CAsSnC,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,SAAS,WAAW,SACpB,CAAC;AAChC,eAAO,MAAM,gBAAgB,GAAI,SAAS,WAAW,SACpB,CAAC;AAClC,eAAO,MAAM,gBAAgB,GAAI,aAAa,MAAM,SACf,CAAC;AAEtC,eAAO,MAAM,kBAAkB,GAC7B,aAAa,WAAW,EAAE,EAC1B,SAAS,WAAW,EACpB,WAAW,MAAM,GAAG,MAAM,KACzB,WAAW,GAAG,SAkBhB,CAAC"}
|
|
@@ -8,8 +8,9 @@ import isEmpty from "lodash/isEmpty";
|
|
|
8
8
|
import { useChatContext } from "../../context/ChatContext";
|
|
9
9
|
import useAuthStore from "../../store/auth";
|
|
10
10
|
import { ConnectStatus, SyncStatus } from "../../types/chat";
|
|
11
|
-
import { GROUP_NOTIFICATION_MESSAGE_TYPES, isSystemLogMessageType } from "../../utils/messageLog";
|
|
11
|
+
import { GROUP_NOTIFICATION_MESSAGE_TYPES, isGroupNotificationMessageType, isSystemLogMessageType } from "../../utils/messageLog";
|
|
12
12
|
import { isRenderableCustomMessage } from "../../utils/customMessage";
|
|
13
|
+
import { isGroupConversation } from "../../utils/imCommon";
|
|
13
14
|
export const visibleTypeMessage = [
|
|
14
15
|
MessageType.TextMessage,
|
|
15
16
|
MessageType.PictureMessage,
|
|
@@ -29,9 +30,15 @@ export const visibleTypeMessage = [
|
|
|
29
30
|
MessageType.LogTextMessage,
|
|
30
31
|
...GROUP_NOTIFICATION_MESSAGE_TYPES,
|
|
31
32
|
];
|
|
32
|
-
export const isMessageHiddenForViewer = (message, isCrm) => {
|
|
33
|
+
export const isMessageHiddenForViewer = (message, isCrm, conversation) => {
|
|
33
34
|
if (!visibleTypeMessage.includes(message === null || message === void 0 ? void 0 : message.contentType))
|
|
34
35
|
return true;
|
|
36
|
+
// Group notification messages stay hidden in a CX support session even
|
|
37
|
+
// for CRM — the isCrm early-return below only applies past this check.
|
|
38
|
+
if (isGroupNotificationMessageType(message === null || message === void 0 ? void 0 : message.contentType) &&
|
|
39
|
+
!isGroupConversation(conversation)) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
35
42
|
if (isCrm)
|
|
36
43
|
return false;
|
|
37
44
|
const isCustomMessage = MessageType.CustomMessage === (message === null || message === void 0 ? void 0 : message.contentType);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { CustomMsgParams, MergerMsgParams, MessageItem } from "@droppii-org/wasm-client-sdk";
|
|
1
|
+
import { AtMsgParams, CustomMsgParams, MergerMsgParams, MessageItem } from "@droppii-org/wasm-client-sdk";
|
|
2
2
|
import { type CustomMessagePayload } from "../../types/customMessage";
|
|
3
|
-
import { BotFlowMeta, ExtendMessageInfo, FileMsgParamsByFile, ImageMsgParamsByFile, UrlMetadataInfo, VideoMsgParamsByFile } from "../../types/chat";
|
|
3
|
+
import { BotFlowMeta, ExtendMessageInfo, FileMsgParamsByFile, ImageMsgParamsByFile, MentionOffset, MentionSendPayload, UrlMetadataInfo, VideoMsgParamsByFile } from "../../types/chat";
|
|
4
4
|
import { UploadFile } from "antd";
|
|
5
5
|
import { ISessionResponse } from "../../types/dto";
|
|
6
6
|
export declare const isMediaResendable: (message: {
|
|
@@ -12,6 +12,8 @@ export declare const createImageMessageByFile: (file: ImageMsgParamsByFile) => P
|
|
|
12
12
|
export declare const createMergerMessage: (mergerMsgParams: MergerMsgParams) => Promise<MessageItem | null>;
|
|
13
13
|
export declare const createVideoMessageByFile: (file: VideoMsgParamsByFile) => Promise<MessageItem | null>;
|
|
14
14
|
export declare const createFileMessageByFile: (file: FileMsgParamsByFile) => Promise<MessageItem | null>;
|
|
15
|
+
export declare const AT_ALL_TAG = "AtAllTag";
|
|
16
|
+
export declare const createAtTextMessage: (params: AtMsgParams) => Promise<MessageItem | null>;
|
|
15
17
|
export declare const createUrlTextMessage: (text: string, urls: string[]) => Promise<MessageItem | null>;
|
|
16
18
|
export declare const createCustomMessageByParams: (params: CustomMsgParams) => Promise<MessageItem | null>;
|
|
17
19
|
export declare const createCustomMessage: (payload: CustomMessagePayload) => Promise<MessageItem | null>;
|
|
@@ -21,7 +23,7 @@ export interface UseSendMessageOptions {
|
|
|
21
23
|
scrollEvent?: SendMessageScrollEvent;
|
|
22
24
|
}
|
|
23
25
|
export declare const useSendMessage: (options?: UseSendMessageOptions) => {
|
|
24
|
-
sendMergeMessage: ({ richText, plainText, files, currentSession, isInternal, urlMetadata, flow, customMessage, }: {
|
|
26
|
+
sendMergeMessage: ({ richText, plainText, files, currentSession, isInternal, urlMetadata, flow, customMessage, mentions, }: {
|
|
25
27
|
richText: string;
|
|
26
28
|
plainText: string;
|
|
27
29
|
files?: UploadFile[];
|
|
@@ -30,16 +32,18 @@ export declare const useSendMessage: (options?: UseSendMessageOptions) => {
|
|
|
30
32
|
urlMetadata?: UrlMetadataInfo;
|
|
31
33
|
flow?: BotFlowMeta;
|
|
32
34
|
customMessage?: CustomMessagePayload;
|
|
35
|
+
mentions?: MentionSendPayload;
|
|
33
36
|
}) => Promise<boolean>;
|
|
34
37
|
sendCustomMessage: (payload: CustomMessagePayload, sendOptions?: {
|
|
35
38
|
currentSession?: ISessionResponse;
|
|
36
39
|
}) => Promise<boolean>;
|
|
37
40
|
resendMessage: (failedMessage: MessageItem) => Promise<void>;
|
|
38
41
|
};
|
|
39
|
-
export declare const generateExtendMessageInfo: ({ richText, urlMetadata, currentSession, flow, }: {
|
|
42
|
+
export declare const generateExtendMessageInfo: ({ richText, urlMetadata, currentSession, flow, mentionOffsets, }: {
|
|
40
43
|
richText?: string;
|
|
41
44
|
urlMetadata?: UrlMetadataInfo;
|
|
42
45
|
currentSession?: ISessionResponse;
|
|
43
46
|
flow?: BotFlowMeta;
|
|
47
|
+
mentionOffsets?: MentionOffset[];
|
|
44
48
|
}) => ExtendMessageInfo;
|
|
45
49
|
//# sourceMappingURL=useSendMessage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSendMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useSendMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,eAAe,EACf,WAAW,EAIZ,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACrB,MAAM,cAAc,CAAC;AAWtB,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAQlC,OAAO,EAAgB,gBAAgB,EAAyB,MAAM,aAAa,CAAC;AAmBpF,eAAO,MAAM,iBAAiB,GAAI,SAAS;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,YAE0C,CAAC;AAE5C,eAAO,MAAM,iBAAiB,GAAU,MAAM,MAAM,gCAanD,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,MAAM,oBAAoB,gCAaxE,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,iBAAiB,eAAe,gCAazE,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,MAAM,oBAAoB,gCAaxE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,MAAM,mBAAmB,gCAatE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAU,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,gCActE,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,QAAQ,eAAe,gCAcxB,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,SAAS,oBAAoB,gCAOtE,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,MAAM,MAAM,EACZ,eAAe,WAAW,gCAc3B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAC9B,4BAA4B,GAC5B,iDAAiD,CAAC;AAEtD,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,sBAAsB,CAAC;CACtC;AAED,eAAO,MAAM,cAAc,GAAI,UAAU,qBAAqB;
|
|
1
|
+
{"version":3,"file":"useSendMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useSendMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,eAAe,EACf,eAAe,EACf,WAAW,EAIZ,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACrB,MAAM,cAAc,CAAC;AAWtB,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAQlC,OAAO,EAAgB,gBAAgB,EAAyB,MAAM,aAAa,CAAC;AAmBpF,eAAO,MAAM,iBAAiB,GAAI,SAAS;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,YAE0C,CAAC;AAE5C,eAAO,MAAM,iBAAiB,GAAU,MAAM,MAAM,gCAanD,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,MAAM,oBAAoB,gCAaxE,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,iBAAiB,eAAe,gCAazE,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,MAAM,oBAAoB,gCAaxE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,MAAM,mBAAmB,gCAatE,CAAC;AAGF,eAAO,MAAM,UAAU,aAAa,CAAC;AAErC,eAAO,MAAM,mBAAmB,GAAU,QAAQ,WAAW,gCAa5D,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAU,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,gCActE,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,QAAQ,eAAe,gCAcxB,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,SAAS,oBAAoB,gCAOtE,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,MAAM,MAAM,EACZ,eAAe,WAAW,gCAc3B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAC9B,4BAA4B,GAC5B,iDAAiD,CAAC;AAEtD,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,sBAAsB,CAAC;CACtC;AAED,eAAO,MAAM,cAAc,GAAI,UAAU,qBAAqB;gIAuSvD;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;QACrB,cAAc,CAAC,EAAE,gBAAgB,CAAC;QAClC,UAAU,EAAE,OAAO,CAAC;QACpB,WAAW,CAAC,EAAE,eAAe,CAAC;QAC9B,IAAI,CAAC,EAAE,WAAW,CAAC;QACnB,aAAa,CAAC,EAAE,oBAAoB,CAAC;QACrC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;KAC/B,KAAG,OAAO,CAAC,OAAO,CAAC;iCA7CT,oBAAoB,gBACf;QAAE,cAAc,CAAC,EAAE,gBAAgB,CAAA;KAAE,KAClD,OAAO,CAAC,OAAO,CAAC;mCAnHG,WAAW;CA+WpC,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,kEAMvC;IACD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;CAClC,sBAkCA,CAAC"}
|
|
@@ -26,7 +26,7 @@ const MEDIA_CONTENT_TYPES = new Set([
|
|
|
26
26
|
export const isMediaResendable = (message) => !MEDIA_CONTENT_TYPES.has(message.contentType) ||
|
|
27
27
|
messageFileStore.has(message.clientMsgID);
|
|
28
28
|
export const createTextMessage = async (text) => {
|
|
29
|
-
|
|
29
|
+
const textMessage = await DChatSDK.createTextMessage(text, new Date().getTime().toString())
|
|
30
30
|
.then(({ data }) => {
|
|
31
31
|
return data;
|
|
32
32
|
})
|
|
@@ -37,7 +37,7 @@ export const createTextMessage = async (text) => {
|
|
|
37
37
|
return textMessage;
|
|
38
38
|
};
|
|
39
39
|
export const createImageMessageByFile = async (file) => {
|
|
40
|
-
|
|
40
|
+
const imageMessage = await DChatSDK.createImageMessageByFile(file, new Date().getTime().toString())
|
|
41
41
|
.then(({ data }) => {
|
|
42
42
|
return data;
|
|
43
43
|
})
|
|
@@ -48,7 +48,7 @@ export const createImageMessageByFile = async (file) => {
|
|
|
48
48
|
return imageMessage;
|
|
49
49
|
};
|
|
50
50
|
export const createMergerMessage = async (mergerMsgParams) => {
|
|
51
|
-
|
|
51
|
+
const mergerMessage = await DChatSDK.createMergerMessage(mergerMsgParams, new Date().getTime().toString())
|
|
52
52
|
.then(({ data }) => {
|
|
53
53
|
return data;
|
|
54
54
|
})
|
|
@@ -59,7 +59,7 @@ export const createMergerMessage = async (mergerMsgParams) => {
|
|
|
59
59
|
return mergerMessage;
|
|
60
60
|
};
|
|
61
61
|
export const createVideoMessageByFile = async (file) => {
|
|
62
|
-
|
|
62
|
+
const videoMessage = await DChatSDK.createVideoMessageByFile(file, new Date().getTime().toString())
|
|
63
63
|
.then(({ data }) => {
|
|
64
64
|
return data;
|
|
65
65
|
})
|
|
@@ -70,7 +70,7 @@ export const createVideoMessageByFile = async (file) => {
|
|
|
70
70
|
return videoMessage;
|
|
71
71
|
};
|
|
72
72
|
export const createFileMessageByFile = async (file) => {
|
|
73
|
-
|
|
73
|
+
const fileMessage = await DChatSDK.createFileMessageByFile(file, new Date().getTime().toString())
|
|
74
74
|
.then(({ data }) => {
|
|
75
75
|
return data;
|
|
76
76
|
})
|
|
@@ -80,8 +80,21 @@ export const createFileMessageByFile = async (file) => {
|
|
|
80
80
|
});
|
|
81
81
|
return fileMessage;
|
|
82
82
|
};
|
|
83
|
+
// OpenIM SDK convention for "tag all members" in AtMsgParams.atUserIDList.
|
|
84
|
+
export const AT_ALL_TAG = "AtAllTag";
|
|
85
|
+
export const createAtTextMessage = async (params) => {
|
|
86
|
+
const atTextMessage = await DChatSDK.createTextAtMessage(params, new Date().getTime().toString())
|
|
87
|
+
.then(({ data }) => {
|
|
88
|
+
return data;
|
|
89
|
+
})
|
|
90
|
+
.catch(({ errCode, errMsg }) => {
|
|
91
|
+
console.error("createTextAtMessage", errCode, errMsg);
|
|
92
|
+
return null;
|
|
93
|
+
});
|
|
94
|
+
return atTextMessage;
|
|
95
|
+
};
|
|
83
96
|
export const createUrlTextMessage = async (text, urls) => {
|
|
84
|
-
|
|
97
|
+
const textMessage = await DChatSDK.createUrlTextMessage(text, JSON.stringify(urls), new Date().getTime().toString())
|
|
85
98
|
.then(({ data }) => {
|
|
86
99
|
return data;
|
|
87
100
|
})
|
|
@@ -92,7 +105,7 @@ export const createUrlTextMessage = async (text, urls) => {
|
|
|
92
105
|
return textMessage;
|
|
93
106
|
};
|
|
94
107
|
export const createCustomMessageByParams = async (params) => {
|
|
95
|
-
|
|
108
|
+
const customMessage = await DChatSDK.createCustomMessage(params, new Date().getTime().toString())
|
|
96
109
|
.then(({ data }) => {
|
|
97
110
|
return data;
|
|
98
111
|
})
|
|
@@ -110,7 +123,7 @@ export const createCustomMessage = async (payload) => {
|
|
|
110
123
|
});
|
|
111
124
|
};
|
|
112
125
|
export const createQuoteMessage = async (text, quotedMessage) => {
|
|
113
|
-
|
|
126
|
+
const textMessage = await DChatSDK.createQuoteMessage({
|
|
114
127
|
text,
|
|
115
128
|
message: JSON.stringify(quotedMessage),
|
|
116
129
|
})
|
|
@@ -326,7 +339,7 @@ export const useSendMessage = (options) => {
|
|
|
326
339
|
});
|
|
327
340
|
return sendMessage(Object.assign(Object.assign({}, customMessage), { ex: JSON.stringify(extendMessageInfo) || "{}", isInternal: false }), sendOptions === null || sendOptions === void 0 ? void 0 : sendOptions.currentSession);
|
|
328
341
|
}, [conversationData, recvID, groupID, sendMessage]);
|
|
329
|
-
const sendMergeMessage = useCallback(async ({ richText, plainText, files = [], currentSession, isInternal, urlMetadata, flow, customMessage, }) => {
|
|
342
|
+
const sendMergeMessage = useCallback(async ({ richText, plainText, files = [], currentSession, isInternal, urlMetadata, flow, customMessage, mentions, }) => {
|
|
330
343
|
if (!conversationData || (!recvID && !groupID))
|
|
331
344
|
return false;
|
|
332
345
|
const messageList = [];
|
|
@@ -449,10 +462,24 @@ export const useSendMessage = (options) => {
|
|
|
449
462
|
console.error("Lỗi xử lý tin nhắn:", err);
|
|
450
463
|
}
|
|
451
464
|
}
|
|
465
|
+
const hasMentions = !!mentions && (mentions.atUserIDList.length > 0 || mentions.isAtAll);
|
|
452
466
|
if (!!plainText && plainText.trim() !== "") {
|
|
453
467
|
const urls = extractLinkUrls(plainText);
|
|
454
468
|
let textMessage = null;
|
|
455
|
-
if (
|
|
469
|
+
if (hasMentions && mentions) {
|
|
470
|
+
// OpenIM SDK convention: "tag all" is signaled by the sentinel
|
|
471
|
+
// "AtAllTag" inside atUserIDList, not a separate flag/param.
|
|
472
|
+
textMessage = await createAtTextMessage({
|
|
473
|
+
text: plainText,
|
|
474
|
+
atUserIDList: mentions.isAtAll
|
|
475
|
+
? [AT_ALL_TAG, ...mentions.atUserIDList]
|
|
476
|
+
: mentions.atUserIDList,
|
|
477
|
+
atUsersInfo: mentions.atUsersInfo,
|
|
478
|
+
message: (quotedMessage === null || quotedMessage === void 0 ? void 0 : quotedMessage.clientMsgID) ? quotedMessage : undefined,
|
|
479
|
+
});
|
|
480
|
+
setQuotedMessage(null);
|
|
481
|
+
}
|
|
482
|
+
else if (quotedMessage === null || quotedMessage === void 0 ? void 0 : quotedMessage.clientMsgID) {
|
|
456
483
|
textMessage = await createQuoteMessage(plainText, quotedMessage);
|
|
457
484
|
setQuotedMessage(null);
|
|
458
485
|
}
|
|
@@ -475,7 +502,8 @@ export const useSendMessage = (options) => {
|
|
|
475
502
|
for (const message of messageList) {
|
|
476
503
|
const isTextLikeMessage = (message === null || message === void 0 ? void 0 : message.contentType) === MessageType.TextMessage ||
|
|
477
504
|
(message === null || message === void 0 ? void 0 : message.contentType) === MessageType.UrlTextMessage ||
|
|
478
|
-
(message === null || message === void 0 ? void 0 : message.contentType) === MessageType.QuoteMessage
|
|
505
|
+
(message === null || message === void 0 ? void 0 : message.contentType) === MessageType.QuoteMessage ||
|
|
506
|
+
(message === null || message === void 0 ? void 0 : message.contentType) === MessageType.AtTextMessage;
|
|
479
507
|
const extendMessageInfo = generateExtendMessageInfo({
|
|
480
508
|
richText: isTextLikeMessage ? richText : "",
|
|
481
509
|
urlMetadata: (message === null || message === void 0 ? void 0 : message.contentType) === MessageType.UrlTextMessage
|
|
@@ -483,6 +511,9 @@ export const useSendMessage = (options) => {
|
|
|
483
511
|
: undefined,
|
|
484
512
|
currentSession,
|
|
485
513
|
flow: isTextLikeMessage ? flow : undefined,
|
|
514
|
+
mentionOffsets: (message === null || message === void 0 ? void 0 : message.contentType) === MessageType.AtTextMessage
|
|
515
|
+
? mentions === null || mentions === void 0 ? void 0 : mentions.mentionOffsets
|
|
516
|
+
: undefined,
|
|
486
517
|
});
|
|
487
518
|
const mMessage = Object.assign(Object.assign({}, message), { ex: JSON.stringify(extendMessageInfo) || "{}", isInternal });
|
|
488
519
|
await sendMessage(mMessage, currentSession);
|
|
@@ -502,7 +533,7 @@ export const useSendMessage = (options) => {
|
|
|
502
533
|
resendMessage,
|
|
503
534
|
};
|
|
504
535
|
};
|
|
505
|
-
export const generateExtendMessageInfo = ({ richText, urlMetadata, currentSession, flow, }) => {
|
|
536
|
+
export const generateExtendMessageInfo = ({ richText, urlMetadata, currentSession, flow, mentionOffsets, }) => {
|
|
506
537
|
const extendMessageInfo = {
|
|
507
538
|
sessionId: (currentSession === null || currentSession === void 0 ? void 0 : currentSession.id) || "",
|
|
508
539
|
applicationType: useAuthStore.getState().applicationType,
|
|
@@ -510,6 +541,9 @@ export const generateExtendMessageInfo = ({ richText, urlMetadata, currentSessio
|
|
|
510
541
|
if (flow) {
|
|
511
542
|
extendMessageInfo.flow = flow;
|
|
512
543
|
}
|
|
544
|
+
if (mentionOffsets && mentionOffsets.length > 0) {
|
|
545
|
+
extendMessageInfo.mentions = { offsets: mentionOffsets };
|
|
546
|
+
}
|
|
513
547
|
const trimmedRichText = richText === null || richText === void 0 ? void 0 : richText.trim();
|
|
514
548
|
if (trimmedRichText) {
|
|
515
549
|
extendMessageInfo.messageInfo = {
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BaseResponse, IConversationGroupItem } from "../../types/dto";
|
|
2
|
+
import { type ConversationGroupDisplayItem } from "../../hooks/group/useConversationGroups";
|
|
3
|
+
interface UseSearchGroupsParams {
|
|
4
|
+
searchTerm: string;
|
|
5
|
+
enabled?: boolean;
|
|
6
|
+
pageSize?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare const useSearchGroups: ({ searchTerm, enabled, pageSize, }: UseSearchGroupsParams) => {
|
|
9
|
+
groups: ConversationGroupDisplayItem[];
|
|
10
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<BaseResponse<IConversationGroupItem[]>, unknown>, Error>>;
|
|
11
|
+
hasNextPage: boolean;
|
|
12
|
+
isFetchingNextPage: boolean;
|
|
13
|
+
isLoading: boolean;
|
|
14
|
+
};
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=useSearchGroups.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSearchGroups.d.ts","sourceRoot":"","sources":["../../../src/hooks/search/useSearchGroups.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAGnE,OAAO,EAGL,KAAK,4BAA4B,EAClC,MAAM,qCAAqC,CAAC;AAE7C,UAAU,qBAAqB;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,eAAe,GAAI,oCAI7B,qBAAqB;;;;;;CAmEvB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { useInfiniteQuery } from "@tanstack/react-query";
|
|
4
|
+
import { apiInstance } from "../../services/api";
|
|
5
|
+
import { ENDPOINTS } from "../../services/routes";
|
|
6
|
+
import { QUERY_KEYS } from "../../services/query";
|
|
7
|
+
import { PAGE_SIZE } from "../../constants";
|
|
8
|
+
import useAuthStore from "../../store/auth";
|
|
9
|
+
import useConversationStore from "../../store/conversation";
|
|
10
|
+
import { buildFallbackConversation, syncGroupConversationsToStore, } from "../../hooks/group/useConversationGroups";
|
|
11
|
+
export const useSearchGroups = ({ searchTerm, enabled = true, pageSize = PAGE_SIZE.medium, }) => {
|
|
12
|
+
const trimmedSearchTerm = searchTerm.trim();
|
|
13
|
+
const conversationList = useConversationStore((state) => state.conversationList);
|
|
14
|
+
const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading } = useInfiniteQuery({
|
|
15
|
+
initialPageParam: 1,
|
|
16
|
+
queryKey: [QUERY_KEYS.SEARCH_CONVERSATION_GROUPS, trimmedSearchTerm, pageSize],
|
|
17
|
+
queryFn: async ({ pageParam = 1 }) => {
|
|
18
|
+
var _a, _b;
|
|
19
|
+
const applicationType = useAuthStore.getState().applicationType;
|
|
20
|
+
const res = await apiInstance.get(ENDPOINTS.chatService.searchConversationGroups, {
|
|
21
|
+
params: {
|
|
22
|
+
page: pageParam,
|
|
23
|
+
pageSize,
|
|
24
|
+
applicationType,
|
|
25
|
+
searchTerm: trimmedSearchTerm,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
if ((_b = (_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.length) {
|
|
29
|
+
void syncGroupConversationsToStore(res.data.data).catch((error) => {
|
|
30
|
+
console.error("syncGroupConversationsToStore", error);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return res.data;
|
|
34
|
+
},
|
|
35
|
+
getNextPageParam: (lastPage) => {
|
|
36
|
+
var _a, _b;
|
|
37
|
+
const dataLength = ((_a = lastPage === null || lastPage === void 0 ? void 0 : lastPage.data) === null || _a === void 0 ? void 0 : _a.length) || 0;
|
|
38
|
+
const currentPage = ((_b = lastPage === null || lastPage === void 0 ? void 0 : lastPage.pageable) === null || _b === void 0 ? void 0 : _b.pageNumber) || 1;
|
|
39
|
+
return dataLength < pageSize ? undefined : currentPage + 1;
|
|
40
|
+
},
|
|
41
|
+
enabled: enabled && trimmedSearchTerm !== "",
|
|
42
|
+
});
|
|
43
|
+
const groups = useMemo(() => {
|
|
44
|
+
if (!data)
|
|
45
|
+
return [];
|
|
46
|
+
const allItems = data.pages.flatMap((page) => page.data);
|
|
47
|
+
return allItems.map((group) => {
|
|
48
|
+
const syncedConversation = conversationList === null || conversationList === void 0 ? void 0 : conversationList.find((conversation) => conversation.conversationID === group.conversationId);
|
|
49
|
+
return {
|
|
50
|
+
groupId: group.groupId,
|
|
51
|
+
conversationId: group.conversationId,
|
|
52
|
+
conversation: syncedConversation !== null && syncedConversation !== void 0 ? syncedConversation : buildFallbackConversation(group),
|
|
53
|
+
visibility: group.visibility,
|
|
54
|
+
memberCount: group.memberCount,
|
|
55
|
+
};
|
|
56
|
+
});
|
|
57
|
+
}, [data, conversationList]);
|
|
58
|
+
return {
|
|
59
|
+
groups,
|
|
60
|
+
fetchNextPage,
|
|
61
|
+
hasNextPage,
|
|
62
|
+
isFetchingNextPage,
|
|
63
|
+
isLoading,
|
|
64
|
+
};
|
|
65
|
+
};
|
|
@@ -2,9 +2,10 @@ import { SessionType } from "@droppii-org/wasm-client-sdk";
|
|
|
2
2
|
interface UseConversationSessionStateParams {
|
|
3
3
|
conversationId: string;
|
|
4
4
|
conversationType?: SessionType;
|
|
5
|
+
peerType?: string;
|
|
5
6
|
groupId?: string;
|
|
6
7
|
}
|
|
7
|
-
export declare const useConversationSessionState: ({ conversationId, conversationType, groupId, }: UseConversationSessionStateParams) => {
|
|
8
|
+
export declare const useConversationSessionState: ({ conversationId, conversationType, peerType, groupId, }: UseConversationSessionStateParams) => {
|
|
8
9
|
groupId: string | undefined;
|
|
9
10
|
latestConversationSession: import("../../types/dto").ISessionResponse | undefined;
|
|
10
11
|
customerUserID: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConversationSessionState.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useConversationSessionState.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAI3D,UAAU,iCAAiC;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,2BAA2B,GAAI,
|
|
1
|
+
{"version":3,"file":"useConversationSessionState.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useConversationSessionState.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAI3D,UAAU,iCAAiC;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,2BAA2B,GAAI,0DAKzC,iCAAiC;;;;;CAoBnC,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useGetListSessionByConversation } from "./useGetListSessionByConversation";
|
|
3
|
-
import {
|
|
4
|
-
export const useConversationSessionState = ({ conversationId, conversationType, groupId, }) => {
|
|
3
|
+
import { isGroupConversation } from "../../utils/imCommon";
|
|
4
|
+
export const useConversationSessionState = ({ conversationId, conversationType, peerType, groupId, }) => {
|
|
5
5
|
var _a;
|
|
6
|
-
const
|
|
7
|
-
const currentGroupId =
|
|
6
|
+
const isGroupChat = isGroupConversation({ peerType, conversationType });
|
|
7
|
+
const currentGroupId = isGroupChat ? groupId : undefined;
|
|
8
8
|
const { data: conversationSessions, refetch: refetchConversationSessions, } = useGetListSessionByConversation({
|
|
9
9
|
conversationId,
|
|
10
|
-
enabled: !
|
|
10
|
+
enabled: !isGroupChat,
|
|
11
11
|
});
|
|
12
12
|
const latestConversationSession = conversationSessions === null || conversationSessions === void 0 ? void 0 : conversationSessions[0];
|
|
13
13
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/layout/index.tsx"],"names":[],"mappings":"AAKA,OAAO,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/layout/index.tsx"],"names":[],"mappings":"AAKA,OAAO,iBAAiB,CAAC;AAazB,UAAU,eAAe;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AACD,QAAA,MAAM,UAAU,GAAI,cAAc,eAAe,4CAsChD,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
package/dist/layout/index.js
CHANGED
|
@@ -9,6 +9,7 @@ import timezone from "dayjs/plugin/timezone";
|
|
|
9
9
|
import { useSyncUsersInfo } from "../hooks/user/useUsersInfo";
|
|
10
10
|
import useConversationStore from "../store/conversation";
|
|
11
11
|
import InfoModal from "../components/common/InfoModal";
|
|
12
|
+
import { useChatContext } from "../context/ChatContext";
|
|
12
13
|
dayjs.extend(utc);
|
|
13
14
|
dayjs.extend(timezone);
|
|
14
15
|
dayjs.tz.setDefault("Asia/Ho_Chi_Minh");
|
|
@@ -17,8 +18,16 @@ const MainLayout = ({ children }) => {
|
|
|
17
18
|
const { t } = useTranslation();
|
|
18
19
|
useGlobalEvent();
|
|
19
20
|
useSyncUsersInfo();
|
|
21
|
+
const { renderGroupAccessModal } = useChatContext();
|
|
20
22
|
const removedFromGroupModalOpen = useConversationStore((state) => state.removedFromGroupModalOpen);
|
|
21
23
|
const hideRemovedFromGroupModal = useConversationStore((state) => state.hideRemovedFromGroupModal);
|
|
22
|
-
|
|
24
|
+
const modalProps = {
|
|
25
|
+
open: removedFromGroupModalOpen,
|
|
26
|
+
onOk: hideRemovedFromGroupModal,
|
|
27
|
+
title: t("removed_from_group_modal_title"),
|
|
28
|
+
okText: t("removed_from_group_modal_ok"),
|
|
29
|
+
message: t("removed_from_group_modal_message"),
|
|
30
|
+
};
|
|
31
|
+
return (_jsxs(_Fragment, { children: [children, renderGroupAccessModal ? (renderGroupAccessModal(modalProps)) : (_jsx(InfoModal, { open: modalProps.open, onOk: modalProps.onOk, title: modalProps.title, okText: modalProps.okText, children: _jsx("p", { children: modalProps.message }) }))] }));
|
|
23
32
|
};
|
|
24
33
|
export default MainLayout;
|