@droppii-org/chat-sdk 0.1.96 → 0.2.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/compose/ComposeNewMessageModal.d.ts +7 -0
- package/dist/components/compose/ComposeNewMessageModal.d.ts.map +1 -0
- package/dist/components/compose/ComposeNewMessageModal.js +61 -0
- package/dist/components/conversation/ConversationByGroupItem.d.ts +7 -0
- package/dist/components/conversation/ConversationByGroupItem.d.ts.map +1 -0
- package/dist/components/conversation/ConversationByGroupItem.js +50 -0
- package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
- package/dist/components/conversation/DeskConversationList.js +15 -6
- package/dist/components/conversation/ThreadCard.js +1 -1
- package/dist/components/group/AddMemberModal.d.ts +9 -0
- package/dist/components/group/AddMemberModal.d.ts.map +1 -0
- package/dist/components/group/AddMemberModal.js +70 -0
- package/dist/components/group/AdminPermissionModal.d.ts +9 -0
- package/dist/components/group/AdminPermissionModal.d.ts.map +1 -0
- package/dist/components/group/AdminPermissionModal.js +63 -0
- package/dist/components/group/CreateGroupForm.d.ts +6 -0
- package/dist/components/group/CreateGroupForm.d.ts.map +1 -0
- package/dist/components/group/CreateGroupForm.js +74 -0
- package/dist/components/group/GroupMemberPicker.d.ts +8 -0
- package/dist/components/group/GroupMemberPicker.d.ts.map +1 -0
- package/dist/components/group/GroupMemberPicker.js +44 -0
- package/dist/components/group/MemberPermissionPanel.d.ts +8 -0
- package/dist/components/group/MemberPermissionPanel.d.ts.map +1 -0
- package/dist/components/group/MemberPermissionPanel.js +53 -0
- package/dist/components/media-resources/FileResourceList.js +1 -1
- package/dist/components/media-resources/LinkResourceItem.js +1 -1
- package/dist/components/message/GroupMembersDrawer.d.ts.map +1 -1
- package/dist/components/message/GroupMembersDrawer.js +210 -28
- package/dist/components/message/MessageHeader.d.ts +2 -1
- package/dist/components/message/MessageHeader.d.ts.map +1 -1
- package/dist/components/message/MessageHeader.js +7 -2
- package/dist/components/message/MessageList.d.ts +1 -0
- package/dist/components/message/MessageList.d.ts.map +1 -1
- package/dist/components/message/MessageList.js +7 -2
- package/dist/components/message/SelectSession.d.ts.map +1 -1
- package/dist/components/message/SelectSession.js +3 -3
- package/dist/components/session/DeskAssignedSession.d.ts.map +1 -1
- package/dist/components/session/DeskAssignedSession.js +4 -1
- package/dist/components/session/DeskTeamInbox.js +1 -1
- package/dist/components/session/SessionFilterMenu.d.ts +3 -1
- package/dist/components/session/SessionFilterMenu.d.ts.map +1 -1
- package/dist/components/session/SessionFilterMenu.js +8 -5
- package/dist/components/session/sessionMenuItems.d.ts +3 -1
- package/dist/components/session/sessionMenuItems.d.ts.map +1 -1
- package/dist/components/session/sessionMenuItems.js +11 -1
- package/dist/components/thread/GroupThreadInfo.d.ts +11 -0
- package/dist/components/thread/GroupThreadInfo.d.ts.map +1 -0
- package/dist/components/thread/GroupThreadInfo.js +156 -0
- package/dist/components/thread/ManualAssignPopover.js +2 -2
- package/dist/components/thread/SessionSection.d.ts.map +1 -1
- package/dist/components/thread/SessionSection.js +2 -8
- package/dist/components/thread/SingleThreadInfo.d.ts +6 -0
- package/dist/components/thread/SingleThreadInfo.d.ts.map +1 -0
- package/dist/components/thread/SingleThreadInfo.js +70 -0
- package/dist/components/thread/ThreadInfo.d.ts +7 -1
- package/dist/components/thread/ThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/ThreadInfo.js +14 -2
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +3 -0
- package/dist/hooks/global/useGlobalEvent.d.ts.map +1 -1
- package/dist/hooks/global/useGlobalEvent.js +39 -0
- package/dist/hooks/group/useAddGroupMember.d.ts +7 -0
- package/dist/hooks/group/useAddGroupMember.d.ts.map +1 -0
- package/dist/hooks/group/useAddGroupMember.js +20 -0
- package/dist/hooks/group/useCreateGroup.d.ts +12 -0
- package/dist/hooks/group/useCreateGroup.d.ts.map +1 -0
- package/dist/hooks/group/useCreateGroup.js +62 -0
- package/dist/hooks/group/useDismissGroup.d.ts +4 -0
- package/dist/hooks/group/useDismissGroup.d.ts.map +1 -0
- package/dist/hooks/group/useDismissGroup.js +22 -0
- package/dist/hooks/group/useEligibleAccounts.d.ts +13 -0
- package/dist/hooks/group/useEligibleAccounts.d.ts.map +1 -0
- package/dist/hooks/group/useEligibleAccounts.js +23 -0
- package/dist/hooks/group/useEligibleAccountsForGroup.d.ts +9 -0
- package/dist/hooks/group/useEligibleAccountsForGroup.d.ts.map +1 -0
- package/dist/hooks/group/useEligibleAccountsForGroup.js +26 -0
- package/dist/hooks/group/useGetGroupCandidates.d.ts +14 -0
- package/dist/hooks/group/useGetGroupCandidates.d.ts.map +1 -0
- package/dist/hooks/group/useGetGroupCandidates.js +37 -0
- package/dist/hooks/group/useGroupMemberActions.d.ts +25 -0
- package/dist/hooks/group/useGroupMemberActions.d.ts.map +1 -0
- package/dist/hooks/group/useGroupMemberActions.js +54 -0
- package/dist/hooks/group/useGroupPermission.d.ts +15 -0
- package/dist/hooks/group/useGroupPermission.d.ts.map +1 -0
- package/dist/hooks/group/useGroupPermission.js +70 -0
- package/dist/hooks/group/useJoinedGroups.d.ts +13 -0
- package/dist/hooks/group/useJoinedGroups.d.ts.map +1 -0
- package/dist/hooks/group/useJoinedGroups.js +33 -0
- package/dist/hooks/group/useSearchGroupMembers.d.ts +8 -0
- package/dist/hooks/group/useSearchGroupMembers.d.ts.map +1 -0
- package/dist/hooks/group/useSearchGroupMembers.js +37 -0
- package/dist/hooks/group/useSetMemberPermission.d.ts +12 -0
- package/dist/hooks/group/useSetMemberPermission.d.ts.map +1 -0
- package/dist/hooks/group/useSetMemberPermission.js +32 -0
- package/dist/hooks/group/useToggleGroupSendMessage.d.ts +7 -0
- package/dist/hooks/group/useToggleGroupSendMessage.d.ts.map +1 -0
- package/dist/hooks/group/useToggleGroupSendMessage.js +22 -0
- package/dist/hooks/group/useUpdateGroupInfo.d.ts +7 -0
- package/dist/hooks/group/useUpdateGroupInfo.d.ts.map +1 -0
- package/dist/hooks/group/useUpdateGroupInfo.js +15 -0
- package/dist/hooks/session/useBlockUser.d.ts +10 -0
- package/dist/hooks/session/useBlockUser.d.ts.map +1 -0
- package/dist/hooks/session/useBlockUser.js +49 -0
- package/dist/hooks/session/useDeleteConversation.d.ts +4 -0
- package/dist/hooks/session/useDeleteConversation.d.ts.map +1 -0
- package/dist/hooks/session/useDeleteConversation.js +20 -0
- package/dist/hooks/session/useGetListSessionByConversation.d.ts +2 -1
- package/dist/hooks/session/useGetListSessionByConversation.d.ts.map +1 -1
- package/dist/hooks/session/useGetListSessionByConversation.js +2 -2
- package/dist/hooks/session/useToggleConversationNotification.d.ts +7 -0
- package/dist/hooks/session/useToggleConversationNotification.d.ts.map +1 -0
- package/dist/hooks/session/useToggleConversationNotification.js +15 -0
- package/dist/locales/vi/common.json +64 -1
- package/dist/locales/vi/conversation-inbox.json +33 -0
- package/dist/screens/desk-message/index.d.ts +3 -1
- package/dist/screens/desk-message/index.d.ts.map +1 -1
- package/dist/screens/desk-message/index.js +4 -2
- package/dist/services/query.d.ts +4 -0
- package/dist/services/query.d.ts.map +1 -1
- package/dist/services/query.js +4 -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/groupPermissionOverrides.d.ts +23 -0
- package/dist/store/groupPermissionOverrides.d.ts.map +1 -0
- package/dist/store/groupPermissionOverrides.js +12 -0
- package/dist/store/session.d.ts +3 -0
- package/dist/store/session.d.ts.map +1 -1
- package/dist/store/session.js +3 -1
- package/dist/styles/global.css +1 -1
- package/dist/types/dto.d.ts +12 -0
- package/dist/types/dto.d.ts.map +1 -1
- package/dist/utils/events.d.ts +1 -0
- package/dist/utils/events.d.ts.map +1 -1
- package/dist/utils/groupName.d.ts +8 -0
- package/dist/utils/groupName.d.ts.map +1 -0
- package/dist/utils/groupName.js +6 -0
- package/package.json +2 -2
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useMutation } from "@tanstack/react-query";
|
|
3
|
+
import { DChatSDK } from "../../constants/sdk";
|
|
4
|
+
export const useAddGroupMember = () => {
|
|
5
|
+
return useMutation({
|
|
6
|
+
mutationFn: async ({ groupID, userIDList }) => {
|
|
7
|
+
console.log("[AddGroupMember] inviteUserToGroup", { groupID, userIDList });
|
|
8
|
+
const { data } = await DChatSDK.inviteUserToGroup({
|
|
9
|
+
groupID,
|
|
10
|
+
userIDList,
|
|
11
|
+
reason: "",
|
|
12
|
+
});
|
|
13
|
+
console.log("[AddGroupMember] inviteUserToGroup success", { groupID, userIDList, data });
|
|
14
|
+
return data;
|
|
15
|
+
},
|
|
16
|
+
onError: (error, { groupID, userIDList }) => {
|
|
17
|
+
console.error("[AddGroupMember] inviteUserToGroup failed", { groupID, userIDList, error });
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { EligibleAccountItem } from "./useEligibleAccounts";
|
|
2
|
+
interface CreateGroupParams {
|
|
3
|
+
groupName: string;
|
|
4
|
+
isPublic: boolean;
|
|
5
|
+
members: EligibleAccountItem[];
|
|
6
|
+
faceURL?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const useCreateGroup: () => {
|
|
9
|
+
createGroup: ({ groupName, isPublic, members, faceURL }: CreateGroupParams) => Promise<import("@droppii-org/wasm-client-sdk").ConversationItem>;
|
|
10
|
+
};
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=useCreateGroup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCreateGroup.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useCreateGroup.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAIjE,UAAU,iBAAiB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAOD,eAAO,MAAM,cAAc;6DAO2B,iBAAiB;CAoDtE,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback } from "react";
|
|
3
|
+
import { useRouter } from "next/navigation";
|
|
4
|
+
import { message } from "antd";
|
|
5
|
+
import { useTranslation } from "react-i18next";
|
|
6
|
+
import { GroupType, GroupVerificationType, GroupVisibility, SessionType } from "@droppii-org/wasm-client-sdk";
|
|
7
|
+
import { DChatSDK } from "../../constants/sdk";
|
|
8
|
+
import useAuthStore from "../../store/auth";
|
|
9
|
+
import { generateDefaultGroupName } from "../../utils/groupName";
|
|
10
|
+
const DEFAULT_GROUP_FACE_URL = "/droppii.jpeg";
|
|
11
|
+
// Q4 (non-block): calling DChatSDK.createGroup() directly — the SDK's own
|
|
12
|
+
// eligibility check at submission time (if any) is whatever openIM does
|
|
13
|
+
// server-side; there's no separate BE revalidation endpoint yet. If members
|
|
14
|
+
// are rejected, the SDK call itself fails and we surface that via the
|
|
15
|
+
// existing error-handler pattern rather than pre-validating client-side.
|
|
16
|
+
export const useCreateGroup = () => {
|
|
17
|
+
const { t } = useTranslation("conversation-inbox");
|
|
18
|
+
const { t: tCommon } = useTranslation();
|
|
19
|
+
const router = useRouter();
|
|
20
|
+
const userID = useAuthStore((state) => state.userID);
|
|
21
|
+
const createGroup = useCallback(async ({ groupName, isPublic, members, faceURL }) => {
|
|
22
|
+
var _a, _b;
|
|
23
|
+
const trimmedName = groupName.trim();
|
|
24
|
+
const [firstMember, ...restMembers] = members;
|
|
25
|
+
const resolvedName = trimmedName ||
|
|
26
|
+
generateDefaultGroupName({
|
|
27
|
+
creatorName: tCommon("you"),
|
|
28
|
+
firstMemberName: firstMember === null || firstMember === void 0 ? void 0 : firstMember.displayName,
|
|
29
|
+
remainingCount: restMembers.length,
|
|
30
|
+
});
|
|
31
|
+
const resolvedFaceURL = faceURL || (firstMember === null || firstMember === void 0 ? void 0 : firstMember.avatar) || DEFAULT_GROUP_FACE_URL;
|
|
32
|
+
try {
|
|
33
|
+
const { data: group } = await DChatSDK.createGroup({
|
|
34
|
+
memberUserIDs: members.map((member) => member.userID),
|
|
35
|
+
ownerUserID: userID,
|
|
36
|
+
groupInfo: {
|
|
37
|
+
groupName: resolvedName,
|
|
38
|
+
faceURL: resolvedFaceURL,
|
|
39
|
+
groupType: GroupType.WorkingGroup,
|
|
40
|
+
needVerification: GroupVerificationType.AllNot,
|
|
41
|
+
ex: JSON.stringify({ isPublic }),
|
|
42
|
+
visibility: isPublic ? GroupVisibility.Public : GroupVisibility.Private,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
const { data: conversation } = await DChatSDK.getOneConversation({
|
|
46
|
+
sourceID: group.groupID,
|
|
47
|
+
sessionType: SessionType.Group,
|
|
48
|
+
});
|
|
49
|
+
message.success(t("create_group.create_group_success"));
|
|
50
|
+
const searchParams = new URLSearchParams();
|
|
51
|
+
searchParams.set("threadId", conversation.conversationID);
|
|
52
|
+
router.push(`/chat?${searchParams.toString()}`);
|
|
53
|
+
return conversation;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
const errorMessage = ((_b = (_a = error === null || error === void 0 ? void 0 : error.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.message) || t("create_group.create_group_failed");
|
|
57
|
+
message.error(errorMessage);
|
|
58
|
+
throw error;
|
|
59
|
+
}
|
|
60
|
+
}, [router, t, tCommon, userID]);
|
|
61
|
+
return { createGroup };
|
|
62
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDismissGroup.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useDismissGroup.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,eAAe;aAEmB,MAAM;WAYpD,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useMutation } from "@tanstack/react-query";
|
|
3
|
+
import { DChatSDK } from "../../constants/sdk";
|
|
4
|
+
import useConversationStore from "../../store/conversation";
|
|
5
|
+
import useSessionStore from "../../store/session";
|
|
6
|
+
import { SessionStatus } from "../../types/chat";
|
|
7
|
+
import emitter from "../../utils/events";
|
|
8
|
+
export const useDismissGroup = () => {
|
|
9
|
+
return useMutation({
|
|
10
|
+
mutationFn: async ({ groupID }) => {
|
|
11
|
+
const { data } = await DChatSDK.dismissGroup(groupID);
|
|
12
|
+
emitter.emit("GROUP_MEMBERS_CHANGED");
|
|
13
|
+
return data;
|
|
14
|
+
},
|
|
15
|
+
onSuccess: () => {
|
|
16
|
+
useConversationStore.getState().clearSelectedConversation();
|
|
17
|
+
useSessionStore
|
|
18
|
+
.getState()
|
|
19
|
+
.setFilterSummary({ status: SessionStatus.IN_PROCESS });
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface EligibleAccountItem {
|
|
2
|
+
userID: string;
|
|
3
|
+
displayName: string;
|
|
4
|
+
avatar: string | null;
|
|
5
|
+
}
|
|
6
|
+
export declare const useEligibleAccounts: (search: string, enabled?: boolean) => {
|
|
7
|
+
accounts: EligibleAccountItem[];
|
|
8
|
+
isLoading: boolean;
|
|
9
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("../../types/dto").BaseResponse<import("../../types/dto").IGroupCandidateResponse[]>, unknown>, Error>>;
|
|
10
|
+
hasNextPage: boolean;
|
|
11
|
+
isFetchingNextPage: boolean;
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=useEligibleAccounts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEligibleAccounts.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useEligibleAccounts.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAKD,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,EAAE,iBAAc;;;;;;CAwBjE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { useMemo } from "react";
|
|
2
|
+
import { useGetGroupCandidates } from "./useGetGroupCandidates";
|
|
3
|
+
// GET /chat-service/v1/crm/users/group-candidates — server already returns
|
|
4
|
+
// only eligible (active) accounts and supports searchTerm filtering, so no
|
|
5
|
+
// client-side active/inactive filtering is needed here (Q3 resolved).
|
|
6
|
+
export const useEligibleAccounts = (search, enabled = true) => {
|
|
7
|
+
const { candidates, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading } = useGetGroupCandidates({
|
|
8
|
+
searchTerm: search.trim(),
|
|
9
|
+
enabled,
|
|
10
|
+
});
|
|
11
|
+
const accounts = useMemo(() => candidates.map((candidate) => ({
|
|
12
|
+
userID: candidate.id,
|
|
13
|
+
displayName: candidate.fullName,
|
|
14
|
+
avatar: candidate.avatar,
|
|
15
|
+
})), [candidates]);
|
|
16
|
+
return {
|
|
17
|
+
accounts,
|
|
18
|
+
isLoading,
|
|
19
|
+
fetchNextPage,
|
|
20
|
+
hasNextPage,
|
|
21
|
+
isFetchingNextPage,
|
|
22
|
+
};
|
|
23
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { EligibleAccountItem } from "./useEligibleAccounts";
|
|
2
|
+
export declare const useEligibleAccountsForGroup: (search: string, existingMemberIDs: string[], enabled?: boolean) => {
|
|
3
|
+
accounts: EligibleAccountItem[];
|
|
4
|
+
isLoading: boolean;
|
|
5
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("../../types/dto").BaseResponse<import("../../types/dto").IGroupCandidateResponse[]>, unknown>, Error>>;
|
|
6
|
+
hasNextPage: boolean;
|
|
7
|
+
isFetchingNextPage: boolean;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=useEligibleAccountsForGroup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEligibleAccountsForGroup.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useEligibleAccountsForGroup.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAKjE,eAAO,MAAM,2BAA2B,GACtC,QAAQ,MAAM,EACd,mBAAmB,MAAM,EAAE,EAC3B,iBAAc;;;;;;CAgCf,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { useMemo } from "react";
|
|
2
|
+
import { useGetGroupCandidates } from "./useGetGroupCandidates";
|
|
3
|
+
// getGroupCandidates has no server-side "exclude group members" filter yet
|
|
4
|
+
// (BE gap tracked in DROPPII-30003 breakdown, Q1) — filtering existing group
|
|
5
|
+
// members out client-side here as an interim until BE adds it.
|
|
6
|
+
export const useEligibleAccountsForGroup = (search, existingMemberIDs, enabled = true) => {
|
|
7
|
+
const { candidates, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading } = useGetGroupCandidates({
|
|
8
|
+
searchTerm: search.trim(),
|
|
9
|
+
enabled,
|
|
10
|
+
});
|
|
11
|
+
const existingMemberIDSet = useMemo(() => new Set(existingMemberIDs), [existingMemberIDs]);
|
|
12
|
+
const accounts = useMemo(() => candidates
|
|
13
|
+
.filter((candidate) => !existingMemberIDSet.has(candidate.id))
|
|
14
|
+
.map((candidate) => ({
|
|
15
|
+
userID: candidate.id,
|
|
16
|
+
displayName: candidate.fullName,
|
|
17
|
+
avatar: candidate.avatar,
|
|
18
|
+
})), [candidates, existingMemberIDSet]);
|
|
19
|
+
return {
|
|
20
|
+
accounts,
|
|
21
|
+
isLoading,
|
|
22
|
+
fetchNextPage,
|
|
23
|
+
hasNextPage,
|
|
24
|
+
isFetchingNextPage,
|
|
25
|
+
};
|
|
26
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { BaseResponse, IGroupCandidateResponse } from "../../types/dto";
|
|
2
|
+
interface UseGetGroupCandidatesParams {
|
|
3
|
+
searchTerm?: string;
|
|
4
|
+
enabled?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare const useGetGroupCandidates: ({ searchTerm, enabled, }: UseGetGroupCandidatesParams) => {
|
|
7
|
+
candidates: IGroupCandidateResponse[];
|
|
8
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<BaseResponse<IGroupCandidateResponse[]>, unknown>, Error>>;
|
|
9
|
+
hasNextPage: boolean;
|
|
10
|
+
isFetchingNextPage: boolean;
|
|
11
|
+
isLoading: boolean;
|
|
12
|
+
};
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=useGetGroupCandidates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGetGroupCandidates.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useGetGroupCandidates.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAIpE,UAAU,2BAA2B;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,qBAAqB,GAAI,0BAGnC,2BAA2B;;;;;;CAqC7B,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { useMemo } from "react";
|
|
2
|
+
import { useInfiniteQuery } from "@tanstack/react-query";
|
|
3
|
+
import { QUERY_KEYS } from "../../services/query";
|
|
4
|
+
import { apiInstance } from "../../services/api";
|
|
5
|
+
import { ENDPOINTS } from "../../services/routes";
|
|
6
|
+
const GROUP_CANDIDATES_PAGE_SIZE = 20;
|
|
7
|
+
export const useGetGroupCandidates = ({ searchTerm = "", enabled = true, }) => {
|
|
8
|
+
const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading } = useInfiniteQuery({
|
|
9
|
+
initialPageParam: 1,
|
|
10
|
+
queryKey: [QUERY_KEYS.GET_GROUP_CANDIDATES, searchTerm],
|
|
11
|
+
queryFn: async ({ pageParam = 1 }) => {
|
|
12
|
+
const res = await apiInstance.get(ENDPOINTS.chatService.getGroupCandidates, {
|
|
13
|
+
params: {
|
|
14
|
+
page: pageParam,
|
|
15
|
+
pageSize: GROUP_CANDIDATES_PAGE_SIZE,
|
|
16
|
+
searchTerm: searchTerm || undefined,
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
return res === null || res === void 0 ? void 0 : res.data;
|
|
20
|
+
},
|
|
21
|
+
getNextPageParam: (lastPage, allPages) => {
|
|
22
|
+
var _a, _b;
|
|
23
|
+
const totalPages = (_b = (_a = lastPage === null || lastPage === void 0 ? void 0 : lastPage.pageable) === null || _a === void 0 ? void 0 : _a.totalPages) !== null && _b !== void 0 ? _b : 0;
|
|
24
|
+
const nextPage = allPages.length + 1;
|
|
25
|
+
return nextPage <= totalPages ? nextPage : undefined;
|
|
26
|
+
},
|
|
27
|
+
enabled,
|
|
28
|
+
});
|
|
29
|
+
const candidates = useMemo(() => { var _a; return (_a = data === null || data === void 0 ? void 0 : data.pages.flatMap((page) => { var _a; return (_a = page.data) !== null && _a !== void 0 ? _a : []; })) !== null && _a !== void 0 ? _a : []; }, [data]);
|
|
30
|
+
return {
|
|
31
|
+
candidates,
|
|
32
|
+
fetchNextPage,
|
|
33
|
+
hasNextPage,
|
|
34
|
+
isFetchingNextPage,
|
|
35
|
+
isLoading,
|
|
36
|
+
};
|
|
37
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { GroupMemberRole } from "@droppii-org/wasm-client-sdk";
|
|
2
|
+
interface MuteGroupMemberParams {
|
|
3
|
+
groupID: string;
|
|
4
|
+
userID: string;
|
|
5
|
+
mute: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare const useMuteGroupMember: () => import("@tanstack/react-query").UseMutationResult<unknown, Error, MuteGroupMemberParams, unknown>;
|
|
8
|
+
interface KickGroupMemberParams {
|
|
9
|
+
groupID: string;
|
|
10
|
+
userID: string;
|
|
11
|
+
}
|
|
12
|
+
export declare const useKickGroupMember: () => import("@tanstack/react-query").UseMutationResult<unknown, Error, KickGroupMemberParams, unknown>;
|
|
13
|
+
interface SetGroupMemberRoleParams {
|
|
14
|
+
groupID: string;
|
|
15
|
+
userID: string;
|
|
16
|
+
roleLevel: GroupMemberRole;
|
|
17
|
+
}
|
|
18
|
+
export declare const useSetGroupMemberRole: () => import("@tanstack/react-query").UseMutationResult<unknown, Error, SetGroupMemberRoleParams, unknown>;
|
|
19
|
+
interface TransferGroupOwnerParams {
|
|
20
|
+
groupID: string;
|
|
21
|
+
newOwnerUserID: string;
|
|
22
|
+
}
|
|
23
|
+
export declare const useTransferGroupOwner: () => import("@tanstack/react-query").UseMutationResult<unknown, Error, TransferGroupOwnerParams, unknown>;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=useGroupMemberActions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGroupMemberActions.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useGroupMemberActions.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAQ/D,UAAU,qBAAqB;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACf;AAED,eAAO,MAAM,kBAAkB,yGAW9B,CAAC;AAEF,UAAU,qBAAqB;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,kBAAkB,yGAW9B,CAAC;AAEF,UAAU,wBAAwB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,eAAe,CAAC;CAC5B;AAED,eAAO,MAAM,qBAAqB,4GAWjC,CAAC;AAEF,UAAU,wBAAwB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,qBAAqB,4GAUjC,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useMutation } from "@tanstack/react-query";
|
|
3
|
+
import { DChatSDK } from "../../constants/sdk";
|
|
4
|
+
// openIM has no dedicated "permanent" sentinel for changeGroupMemberMute —
|
|
5
|
+
// a mutedSeconds this large (~100 years) is the de facto permanent mute
|
|
6
|
+
// until BE ships a real "disable send permission" flag (Q1, DROPPII-30248).
|
|
7
|
+
const PERMANENT_MUTE_SECONDS = 60 * 60 * 24 * 365 * 100;
|
|
8
|
+
export const useMuteGroupMember = () => {
|
|
9
|
+
return useMutation({
|
|
10
|
+
mutationFn: async ({ groupID, userID, mute }) => {
|
|
11
|
+
const { data } = await DChatSDK.changeGroupMemberMute({
|
|
12
|
+
groupID,
|
|
13
|
+
userID,
|
|
14
|
+
mutedSeconds: mute ? PERMANENT_MUTE_SECONDS : 0,
|
|
15
|
+
});
|
|
16
|
+
return data;
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
export const useKickGroupMember = () => {
|
|
21
|
+
return useMutation({
|
|
22
|
+
mutationFn: async ({ groupID, userID }) => {
|
|
23
|
+
const { data } = await DChatSDK.kickGroupMember({
|
|
24
|
+
groupID,
|
|
25
|
+
userIDList: [userID],
|
|
26
|
+
reason: "",
|
|
27
|
+
});
|
|
28
|
+
return data;
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
export const useSetGroupMemberRole = () => {
|
|
33
|
+
return useMutation({
|
|
34
|
+
mutationFn: async ({ groupID, userID, roleLevel }) => {
|
|
35
|
+
const { data } = await DChatSDK.setGroupMemberRoleLevel({
|
|
36
|
+
groupID,
|
|
37
|
+
userID,
|
|
38
|
+
roleLevel,
|
|
39
|
+
});
|
|
40
|
+
return data;
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
export const useTransferGroupOwner = () => {
|
|
45
|
+
return useMutation({
|
|
46
|
+
mutationFn: async ({ groupID, newOwnerUserID }) => {
|
|
47
|
+
const { data } = await DChatSDK.transferGroupOwner({
|
|
48
|
+
groupID,
|
|
49
|
+
newOwnerUserID,
|
|
50
|
+
});
|
|
51
|
+
return data;
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface GroupPermissions {
|
|
2
|
+
sendMessage: boolean;
|
|
3
|
+
pinMessage: boolean;
|
|
4
|
+
updateGroupName: boolean;
|
|
5
|
+
updateGroupAvatar: boolean;
|
|
6
|
+
updateGroupDescription: boolean;
|
|
7
|
+
addMember: boolean;
|
|
8
|
+
removeMember: boolean;
|
|
9
|
+
addAdmin: boolean;
|
|
10
|
+
transferOwnership: boolean;
|
|
11
|
+
configGroupPermission: boolean;
|
|
12
|
+
viewMemberInformation: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare const useGroupPermission: (groupID?: string) => GroupPermissions;
|
|
15
|
+
//# sourceMappingURL=useGroupPermission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useGroupPermission.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useGroupPermission.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sBAAsB,EAAE,OAAO,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAiDD,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,KAAG,gBA6CrD,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { useMemo } from "react";
|
|
2
|
+
import { GroupMemberRole } from "@droppii-org/wasm-client-sdk";
|
|
3
|
+
import useConversationStore from "../../store/conversation";
|
|
4
|
+
import useGroupPermissionOverridesStore from "../../store/groupPermissionOverrides";
|
|
5
|
+
// Default permission matrix per DROPPII-30248 spec (Group Permission Logic
|
|
6
|
+
// And Effects In Livechat). BE/SDK does not persist per-permission config for
|
|
7
|
+
// 9 of the 11 permissions yet (only applyMemberFriend/lookMemberInfo exist,
|
|
8
|
+
// and those are unrelated group-wide toggles, not this role matrix) — mocked
|
|
9
|
+
// from roleLevel until BE ships real storage.
|
|
10
|
+
const PERMISSION_MATRIX = {
|
|
11
|
+
[GroupMemberRole.Normal]: {
|
|
12
|
+
sendMessage: true,
|
|
13
|
+
pinMessage: true,
|
|
14
|
+
updateGroupName: true,
|
|
15
|
+
updateGroupAvatar: true,
|
|
16
|
+
updateGroupDescription: true,
|
|
17
|
+
addMember: true,
|
|
18
|
+
removeMember: true,
|
|
19
|
+
addAdmin: true,
|
|
20
|
+
transferOwnership: true,
|
|
21
|
+
configGroupPermission: true,
|
|
22
|
+
viewMemberInformation: true,
|
|
23
|
+
},
|
|
24
|
+
[GroupMemberRole.Admin]: {
|
|
25
|
+
sendMessage: true,
|
|
26
|
+
pinMessage: true,
|
|
27
|
+
updateGroupName: true,
|
|
28
|
+
updateGroupAvatar: true,
|
|
29
|
+
updateGroupDescription: true,
|
|
30
|
+
addMember: true,
|
|
31
|
+
removeMember: true,
|
|
32
|
+
addAdmin: true,
|
|
33
|
+
transferOwnership: true,
|
|
34
|
+
configGroupPermission: true,
|
|
35
|
+
viewMemberInformation: true,
|
|
36
|
+
},
|
|
37
|
+
[GroupMemberRole.Owner]: {
|
|
38
|
+
sendMessage: true,
|
|
39
|
+
pinMessage: true,
|
|
40
|
+
updateGroupName: true,
|
|
41
|
+
updateGroupAvatar: true,
|
|
42
|
+
updateGroupDescription: true,
|
|
43
|
+
addMember: true,
|
|
44
|
+
removeMember: true,
|
|
45
|
+
addAdmin: true,
|
|
46
|
+
transferOwnership: true,
|
|
47
|
+
configGroupPermission: true,
|
|
48
|
+
viewMemberInformation: true,
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
export const useGroupPermission = (groupID) => {
|
|
52
|
+
const currentMemberInGroup = useConversationStore((state) => state.currentMemberInGroup);
|
|
53
|
+
const memberOverrides = useGroupPermissionOverridesStore((state) => groupID ? state.memberOverridesByGroup[groupID] : undefined);
|
|
54
|
+
const adminOverrides = useGroupPermissionOverridesStore((state) => groupID ? state.adminOverridesByGroup[groupID] : undefined);
|
|
55
|
+
return useMemo(() => {
|
|
56
|
+
var _a, _b;
|
|
57
|
+
const roleLevel = (_a = currentMemberInGroup === null || currentMemberInGroup === void 0 ? void 0 : currentMemberInGroup.roleLevel) !== null && _a !== void 0 ? _a : GroupMemberRole.Normal;
|
|
58
|
+
console.log("🚀 ~ useGroupPermission ~ roleLevel:", roleLevel);
|
|
59
|
+
const base = (_b = PERMISSION_MATRIX[roleLevel]) !== null && _b !== void 0 ? _b : PERMISSION_MATRIX[GroupMemberRole.Normal];
|
|
60
|
+
// Configure Member/Admin Permissions (DROPPII-30248 follow-up) — mocked
|
|
61
|
+
// local overrides on top of the role default, not persisted by BE yet.
|
|
62
|
+
if (roleLevel === GroupMemberRole.Normal && memberOverrides) {
|
|
63
|
+
return Object.assign(Object.assign({}, base), { sendMessage: memberOverrides.sendMessage, addMember: memberOverrides.addMember, pinMessage: memberOverrides.pinMessage, viewMemberInformation: memberOverrides.viewMemberInformation });
|
|
64
|
+
}
|
|
65
|
+
if (roleLevel === GroupMemberRole.Admin && adminOverrides) {
|
|
66
|
+
return Object.assign(Object.assign({}, base), { sendMessage: adminOverrides.sendMessage, pinMessage: adminOverrides.pinMessage, viewMemberInformation: adminOverrides.viewMemberInformation, addMember: adminOverrides.addMember, removeMember: adminOverrides.removeMember, updateGroupName: adminOverrides.updateGroupInfo, updateGroupAvatar: adminOverrides.updateGroupInfo, updateGroupDescription: adminOverrides.updateGroupInfo });
|
|
67
|
+
}
|
|
68
|
+
return base;
|
|
69
|
+
}, [currentMemberInGroup === null || currentMemberInGroup === void 0 ? void 0 : currentMemberInGroup.roleLevel, memberOverrides, adminOverrides]);
|
|
70
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface UseJoinedGroupsParams {
|
|
2
|
+
enabled?: boolean;
|
|
3
|
+
pageSize?: number;
|
|
4
|
+
}
|
|
5
|
+
export declare const useJoinedGroups: ({ enabled, pageSize, }?: UseJoinedGroupsParams) => {
|
|
6
|
+
groups: import("@droppii-org/wasm-client-sdk").GroupItem[];
|
|
7
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("@droppii-org/wasm-client-sdk").GroupItem[], unknown>, Error>>;
|
|
8
|
+
hasNextPage: boolean;
|
|
9
|
+
isFetchingNextPage: boolean;
|
|
10
|
+
isLoading: boolean;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=useJoinedGroups.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useJoinedGroups.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useJoinedGroups.ts"],"names":[],"mappings":"AAQA,UAAU,qBAAqB;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,eAAe,GAAI,yBAG7B,qBAA0B;;;;;;CAoC5B,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { useInfiniteQuery } from "@tanstack/react-query";
|
|
4
|
+
import { DChatSDK } from "../../constants/sdk";
|
|
5
|
+
import { QUERY_KEYS } from "../../services/query";
|
|
6
|
+
import { PAGE_SIZE } from "../../constants";
|
|
7
|
+
export const useJoinedGroups = ({ enabled = true, pageSize = PAGE_SIZE.medium, } = {}) => {
|
|
8
|
+
const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading, } = useInfiniteQuery({
|
|
9
|
+
initialPageParam: 0,
|
|
10
|
+
queryKey: [QUERY_KEYS.GET_JOINED_GROUP_LIST, pageSize],
|
|
11
|
+
queryFn: async ({ pageParam = 0 }) => {
|
|
12
|
+
const res = await DChatSDK.getJoinedGroupListPage({
|
|
13
|
+
offset: pageParam,
|
|
14
|
+
count: pageSize,
|
|
15
|
+
});
|
|
16
|
+
return res.data;
|
|
17
|
+
},
|
|
18
|
+
getNextPageParam: (lastPage, allPages) => {
|
|
19
|
+
if (lastPage.length < pageSize)
|
|
20
|
+
return undefined;
|
|
21
|
+
return allPages.length * pageSize;
|
|
22
|
+
},
|
|
23
|
+
enabled,
|
|
24
|
+
});
|
|
25
|
+
const groups = useMemo(() => { var _a; return (_a = data === null || data === void 0 ? void 0 : data.pages.flatMap((page) => page)) !== null && _a !== void 0 ? _a : []; }, [data]);
|
|
26
|
+
return {
|
|
27
|
+
groups,
|
|
28
|
+
fetchNextPage,
|
|
29
|
+
hasNextPage,
|
|
30
|
+
isFetchingNextPage,
|
|
31
|
+
isLoading,
|
|
32
|
+
};
|
|
33
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { GroupMemberItem } from "@droppii-org/wasm-client-sdk";
|
|
2
|
+
interface UseSearchGroupMembersResult {
|
|
3
|
+
results: GroupMemberItem[];
|
|
4
|
+
isSearching: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare const useSearchGroupMembers: (groupID: string | undefined, keyword: string) => UseSearchGroupMembersResult;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=useSearchGroupMembers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSearchGroupMembers.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useSearchGroupMembers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAM/D,UAAU,2BAA2B;IACnC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,qBAAqB,GAChC,SAAS,MAAM,GAAG,SAAS,EAC3B,SAAS,MAAM,KACd,2BAkCF,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { useCallback, useEffect, useState } from "react";
|
|
2
|
+
import { DChatSDK } from "../../constants/sdk";
|
|
3
|
+
const SEARCH_GROUP_MEMBER_OFFSET = 0;
|
|
4
|
+
const SEARCH_GROUP_MEMBER_COUNT = 999;
|
|
5
|
+
export const useSearchGroupMembers = (groupID, keyword) => {
|
|
6
|
+
const [results, setResults] = useState([]);
|
|
7
|
+
const [isSearching, setIsSearching] = useState(false);
|
|
8
|
+
const search = useCallback(async () => {
|
|
9
|
+
if (!groupID || !keyword.trim()) {
|
|
10
|
+
setResults([]);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
setIsSearching(true);
|
|
14
|
+
try {
|
|
15
|
+
const { data } = await DChatSDK.searchGroupMembers({
|
|
16
|
+
groupID,
|
|
17
|
+
keywordList: [keyword.trim()],
|
|
18
|
+
isSearchUserID: false,
|
|
19
|
+
isSearchMemberNickname: true,
|
|
20
|
+
offset: SEARCH_GROUP_MEMBER_OFFSET,
|
|
21
|
+
count: SEARCH_GROUP_MEMBER_COUNT,
|
|
22
|
+
});
|
|
23
|
+
setResults(data !== null && data !== void 0 ? data : []);
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
console.error("Error searching group members:", err);
|
|
27
|
+
setResults([]);
|
|
28
|
+
}
|
|
29
|
+
finally {
|
|
30
|
+
setIsSearching(false);
|
|
31
|
+
}
|
|
32
|
+
}, [groupID, keyword]);
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
void search();
|
|
35
|
+
}, [search]);
|
|
36
|
+
return { results, isSearching };
|
|
37
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface SetApplyMemberFriendParams {
|
|
2
|
+
groupID: string;
|
|
3
|
+
allow: boolean;
|
|
4
|
+
}
|
|
5
|
+
interface SetLookMemberInfoParams {
|
|
6
|
+
groupID: string;
|
|
7
|
+
allow: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare const useSetApplyMemberFriend: () => import("@tanstack/react-query").UseMutationResult<unknown, Error, SetApplyMemberFriendParams, unknown>;
|
|
10
|
+
export declare const useSetLookMemberInfo: () => import("@tanstack/react-query").UseMutationResult<unknown, Error, SetLookMemberInfoParams, unknown>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=useSetMemberPermission.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSetMemberPermission.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useSetMemberPermission.ts"],"names":[],"mappings":"AAOA,UAAU,0BAA0B;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,uBAAuB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAMD,eAAO,MAAM,uBAAuB,8GAWnC,CAAC;AAEF,eAAO,MAAM,oBAAoB,2GAWhC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useMutation } from "@tanstack/react-query";
|
|
3
|
+
import { AllowType } from "@droppii-org/wasm-client-sdk";
|
|
4
|
+
import { DChatSDK } from "../../constants/sdk";
|
|
5
|
+
import useConversationStore from "../../store/conversation";
|
|
6
|
+
const refreshGroupInfo = (groupID) => {
|
|
7
|
+
void useConversationStore.getState().getCurrentGroupInfoByReq(groupID);
|
|
8
|
+
};
|
|
9
|
+
export const useSetApplyMemberFriend = () => {
|
|
10
|
+
return useMutation({
|
|
11
|
+
mutationFn: async ({ groupID, allow }) => {
|
|
12
|
+
const { data } = await DChatSDK.setGroupApplyMemberFriend({
|
|
13
|
+
groupID,
|
|
14
|
+
rule: allow ? AllowType.Allowed : AllowType.NotAllowed,
|
|
15
|
+
});
|
|
16
|
+
return data;
|
|
17
|
+
},
|
|
18
|
+
onSuccess: (_data, variables) => refreshGroupInfo(variables.groupID),
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
export const useSetLookMemberInfo = () => {
|
|
22
|
+
return useMutation({
|
|
23
|
+
mutationFn: async ({ groupID, allow }) => {
|
|
24
|
+
const { data } = await DChatSDK.setGroupLookMemberInfo({
|
|
25
|
+
groupID,
|
|
26
|
+
rule: allow ? AllowType.Allowed : AllowType.NotAllowed,
|
|
27
|
+
});
|
|
28
|
+
return data;
|
|
29
|
+
},
|
|
30
|
+
onSuccess: (_data, variables) => refreshGroupInfo(variables.groupID),
|
|
31
|
+
});
|
|
32
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
interface ToggleGroupSendMessageParams {
|
|
2
|
+
groupID: string;
|
|
3
|
+
allowSendMessage: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare const useToggleGroupSendMessage: () => import("@tanstack/react-query").UseMutationResult<unknown, Error, ToggleGroupSendMessageParams, unknown>;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=useToggleGroupSendMessage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useToggleGroupSendMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useToggleGroupSendMessage.ts"],"names":[],"mappings":"AAMA,UAAU,4BAA4B;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAMD,eAAO,MAAM,yBAAyB,gHAarC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useMutation } from "@tanstack/react-query";
|
|
3
|
+
import { DChatSDK } from "../../constants/sdk";
|
|
4
|
+
import useConversationStore from "../../store/conversation";
|
|
5
|
+
// Q4 (non-block, pending BE confirmation): "Cho phép gửi tin nhắn" is wired
|
|
6
|
+
// to changeGroupMute, inverted (isMute = !allowSendMessage) since it's the
|
|
7
|
+
// only openIM method that gates every member's ability to send in a group.
|
|
8
|
+
// Adjust if BE confirms a dedicated field instead.
|
|
9
|
+
export const useToggleGroupSendMessage = () => {
|
|
10
|
+
return useMutation({
|
|
11
|
+
mutationFn: async ({ groupID, allowSendMessage }) => {
|
|
12
|
+
const { data } = await DChatSDK.changeGroupMute({
|
|
13
|
+
groupID,
|
|
14
|
+
isMute: !allowSendMessage,
|
|
15
|
+
});
|
|
16
|
+
return data;
|
|
17
|
+
},
|
|
18
|
+
onSuccess: (_data, variables) => {
|
|
19
|
+
void useConversationStore.getState().getCurrentGroupInfoByReq(variables.groupID);
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
};
|