@droppii-org/chat-sdk 0.6.51 → 0.6.53
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/group/AdminPermissionModal.d.ts.map +1 -1
- package/dist/components/group/AdminPermissionModal.js +9 -38
- package/dist/components/group/MemberPermissionPanel.d.ts.map +1 -1
- package/dist/components/group/MemberPermissionPanel.js +45 -33
- package/dist/components/search-conversation/SearchAll.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchAll.js +7 -9
- package/dist/components/search-conversation/SearchConversationAsGroups.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchConversationAsGroups.js +3 -0
- package/dist/components/search-conversation/SearchConversationAsMessages.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchConversationAsMessages.js +4 -1
- package/dist/components/search-conversation/SearchConversationAsUsers.d.ts.map +1 -1
- package/dist/components/search-conversation/SearchConversationAsUsers.js +4 -6
- package/dist/components/search-conversation/SearchScopeContext.d.ts +4 -0
- package/dist/components/search-conversation/SearchScopeContext.d.ts.map +1 -0
- package/dist/components/search-conversation/SearchScopeContext.js +5 -0
- package/dist/components/search-conversation/index.d.ts +5 -2
- package/dist/components/search-conversation/index.d.ts.map +1 -1
- package/dist/components/search-conversation/index.js +17 -12
- package/dist/components/search-conversation/item/SearchItemAsGroup.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsGroup.js +9 -0
- package/dist/components/search-conversation/item/SearchItemAsMessage.d.ts +2 -0
- package/dist/components/search-conversation/item/SearchItemAsMessage.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsMessage.js +28 -6
- package/dist/components/search-conversation/item/SearchItemAsUser.d.ts +2 -1
- package/dist/components/search-conversation/item/SearchItemAsUser.d.ts.map +1 -1
- package/dist/components/search-conversation/item/SearchItemAsUser.js +9 -2
- package/dist/hooks/group/useGroupMemberActions.d.ts +7 -0
- package/dist/hooks/group/useGroupMemberActions.d.ts.map +1 -1
- package/dist/hooks/group/useGroupMemberActions.js +23 -0
- package/dist/hooks/message/useTypingStatus.d.ts.map +1 -1
- package/dist/hooks/message/useTypingStatus.js +1 -9
- package/dist/hooks/search/useOpenPdpSearchResult.d.ts +8 -0
- package/dist/hooks/search/useOpenPdpSearchResult.d.ts.map +1 -0
- package/dist/hooks/search/useOpenPdpSearchResult.js +31 -0
- package/dist/hooks/search/useSearchGroups.d.ts +3 -1
- package/dist/hooks/search/useSearchGroups.d.ts.map +1 -1
- package/dist/hooks/search/useSearchGroups.js +22 -11
- package/dist/hooks/search/useSearchMessage.d.ts +2 -0
- package/dist/hooks/search/useSearchMessage.d.ts.map +1 -1
- package/dist/hooks/search/useSearchMessage.js +10 -4
- package/dist/hooks/search/useSearchPdpTeamSessions.d.ts +17 -0
- package/dist/hooks/search/useSearchPdpTeamSessions.d.ts.map +1 -0
- package/dist/hooks/search/useSearchPdpTeamSessions.js +38 -0
- package/dist/hooks/search/useSearchUsers.d.ts +14 -0
- package/dist/hooks/search/useSearchUsers.d.ts.map +1 -0
- package/dist/hooks/search/useSearchUsers.js +23 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/locales/vi/common.json +2 -0
- 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 +3 -0
- package/dist/services/routes.d.ts.map +1 -1
- package/dist/services/routes.js +3 -0
- package/dist/types/search.d.ts +2 -0
- package/dist/types/search.d.ts.map +1 -0
- package/dist/types/search.js +1 -0
- package/dist/utils/conversation.d.ts +2 -1
- package/dist/utils/conversation.d.ts.map +1 -1
- package/dist/utils/conversation.js +8 -1
- package/dist/utils/groupPermissionSwitches.d.ts +9 -0
- package/dist/utils/groupPermissionSwitches.d.ts.map +1 -0
- package/dist/utils/groupPermissionSwitches.js +19 -0
- package/package.json +2 -2
- package/dist/store/groupPermissionOverrides.d.ts +0 -23
- package/dist/store/groupPermissionOverrides.d.ts.map +0 -1
- package/dist/store/groupPermissionOverrides.js +0 -12
|
@@ -4,12 +4,19 @@ import { Avatar, message } from "antd";
|
|
|
4
4
|
import { highlightSearch, sanitizeHtml } from "../../../utils/common";
|
|
5
5
|
import useConversationStore from "../../../store/conversation";
|
|
6
6
|
import { useTranslation } from "react-i18next";
|
|
7
|
+
import { useOpenPdpSearchResult } from "../../../hooks/search/useOpenPdpSearchResult";
|
|
8
|
+
import { useSearchScope } from "../SearchScopeContext";
|
|
7
9
|
const SearchItemAsUser = (props) => {
|
|
8
|
-
var _a, _b, _c, _d, _e, _f;
|
|
10
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
9
11
|
const { session, searchTerm = "" } = props;
|
|
10
12
|
const { t } = useTranslation();
|
|
13
|
+
const scope = useSearchScope();
|
|
14
|
+
const openPdpResult = useOpenPdpSearchResult();
|
|
11
15
|
const ownerName = `${(_a = session.owner) === null || _a === void 0 ? void 0 : _a.fullName}${((_b = session.owner) === null || _b === void 0 ? void 0 : _b.username) ? ` (${(_c = session.owner) === null || _c === void 0 ? void 0 : _c.username})` : ""}`;
|
|
12
16
|
const onPressItem = async () => {
|
|
17
|
+
if (scope === "pdp-portal") {
|
|
18
|
+
return openPdpResult({ threadId: session.conversationId });
|
|
19
|
+
}
|
|
13
20
|
if (!(session === null || session === void 0 ? void 0 : session.conversation)) {
|
|
14
21
|
return message.error(t("err_get_conversation"));
|
|
15
22
|
}
|
|
@@ -18,7 +25,7 @@ const SearchItemAsUser = (props) => {
|
|
|
18
25
|
.getState()
|
|
19
26
|
.setSelectedConversationId(session.conversationId);
|
|
20
27
|
};
|
|
21
|
-
return (_jsxs("div", { className: "py-3 px-2 flex items-center gap-3 hover:bg-gray-100 hover:rounded-sm cursor-pointer border-b mx-1", onClick: onPressItem, "data-cp-name": "SearchItemAsUser", children: [_jsx(Avatar, { size: "large", src: (_d = session.owner) === null || _d === void 0 ? void 0 : _d.avatar, alt: (_e = session.owner) === null || _e === void 0 ? void 0 : _e.username, children: (_f = session.owner) === null || _f === void 0 ? void 0 : _f.fullName.charAt(0).toUpperCase() }), _jsx("div", { className: "flex flex-col flex-1 min-w-0", children: _jsx("p", { className: "text-sm font-semibold truncate", dangerouslySetInnerHTML: {
|
|
28
|
+
return (_jsxs("div", { className: "py-3 px-2 flex items-center gap-3 hover:bg-gray-100 hover:rounded-sm cursor-pointer border-b mx-1", onClick: onPressItem, "data-cp-name": "SearchItemAsUser", children: [_jsx(Avatar, { size: "large", src: (_d = session.owner) === null || _d === void 0 ? void 0 : _d.avatar, alt: (_e = session.owner) === null || _e === void 0 ? void 0 : _e.username, children: (_g = (_f = session.owner) === null || _f === void 0 ? void 0 : _f.fullName) === null || _g === void 0 ? void 0 : _g.charAt(0).toUpperCase() }), _jsx("div", { className: "flex flex-col flex-1 min-w-0", children: _jsx("p", { className: "text-sm font-semibold truncate", dangerouslySetInnerHTML: {
|
|
22
29
|
__html: sanitizeHtml(highlightSearch(ownerName, searchTerm)),
|
|
23
30
|
} }) })] }, session.id));
|
|
24
31
|
};
|
|
@@ -27,5 +27,12 @@ interface SetGroupMemberPermissionsParams {
|
|
|
27
27
|
permissions: string[];
|
|
28
28
|
}
|
|
29
29
|
export declare const useSetGroupMemberPermissions: () => import("@tanstack/react-query").UseMutationResult<unknown, Error, SetGroupMemberPermissionsParams, unknown>;
|
|
30
|
+
interface SetRolePermissionsParams {
|
|
31
|
+
groupID: string;
|
|
32
|
+
enablePermissions: string[];
|
|
33
|
+
disablePermissions: string[];
|
|
34
|
+
}
|
|
35
|
+
export declare const useSetAdminRolePermissions: () => import("@tanstack/react-query").UseMutationResult<unknown, Error, SetRolePermissionsParams, unknown>;
|
|
36
|
+
export declare const useSetMemberRolePermissions: () => import("@tanstack/react-query").UseMutationResult<unknown, Error, SetRolePermissionsParams, unknown>;
|
|
30
37
|
export {};
|
|
31
38
|
//# sourceMappingURL=useGroupMemberActions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGroupMemberActions.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useGroupMemberActions.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAmB,MAAM,8BAA8B,CAAC;AAQhF,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;AAEF,UAAU,+BAA+B;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,eAAO,MAAM,4BAA4B,mHAexC,CAAC"}
|
|
1
|
+
{"version":3,"file":"useGroupMemberActions.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useGroupMemberActions.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAmB,MAAM,8BAA8B,CAAC;AAQhF,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;AAEF,UAAU,+BAA+B;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,eAAO,MAAM,4BAA4B,mHAexC,CAAC;AAEF,UAAU,wBAAwB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAaD,eAAO,MAAM,0BAA0B,4GAOtC,CAAC;AAGF,eAAO,MAAM,2BAA2B,4GAOvC,CAAC"}
|
|
@@ -64,3 +64,26 @@ export const useSetGroupMemberPermissions = () => {
|
|
|
64
64
|
},
|
|
65
65
|
});
|
|
66
66
|
};
|
|
67
|
+
const toRolePermissionsReq = ({ groupID, enablePermissions, disablePermissions, }) => ({
|
|
68
|
+
groupID,
|
|
69
|
+
enablePermissions: enablePermissions,
|
|
70
|
+
disablePermissions: disablePermissions,
|
|
71
|
+
});
|
|
72
|
+
// One call for every Admin of the group; each Admin keeps the keys not listed.
|
|
73
|
+
export const useSetAdminRolePermissions = () => {
|
|
74
|
+
return useMutation({
|
|
75
|
+
mutationFn: async (params) => {
|
|
76
|
+
const { data } = await DChatSDK.setGroupAdminPermissions(toRolePermissionsReq(params));
|
|
77
|
+
return data;
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
// One call for every ordinary member of the group; each keeps the keys not listed.
|
|
82
|
+
export const useSetMemberRolePermissions = () => {
|
|
83
|
+
return useMutation({
|
|
84
|
+
mutationFn: async (params) => {
|
|
85
|
+
const { data } = await DChatSDK.setGroupMemberPermissions(toRolePermissionsReq(params));
|
|
86
|
+
return data;
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTypingStatus.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useTypingStatus.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,uBAAuB,EACvB,WAAW,
|
|
1
|
+
{"version":3,"file":"useTypingStatus.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useTypingStatus.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,uBAAuB,EACvB,WAAW,EACZ,MAAM,8BAA8B,CAAC;AA0BtC,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,WAK7C,CAAC;AAqDF,eAAO,MAAM,wBAAwB,GACnC,SAAS,uBAAuB,GAAG,MAAM,SA0B1C,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,uBAAuB,GAAI,SAAS,WAAW,SAK3D,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,mFAAmF;IACnF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,cAAc,GAAI,iBAAiB,MAAM,KAAG,WAoBxD,CAAC"}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { useTranslation } from "react-i18next";
|
|
2
2
|
import { useShallow } from "zustand/react/shallow";
|
|
3
|
-
import { SessionType, } from "@droppii-org/wasm-client-sdk";
|
|
4
3
|
import { DChatSDK } from "../../constants/sdk";
|
|
5
4
|
import useAuthStore from "../../store/auth";
|
|
6
5
|
import useConversationStore from "../../store/conversation";
|
|
7
6
|
import useTypingStore from "../../store/typing";
|
|
8
|
-
import { getGroupIdFromConversationId } from "../../utils/conversation";
|
|
7
|
+
import { getConversationIdFromMessage, getGroupIdFromConversationId, } from "../../utils/conversation";
|
|
9
8
|
// One typer is named; from two on the text drops names ("Nhiều người đang nhập").
|
|
10
9
|
const MAX_NAMED_TYPERS = 1;
|
|
11
10
|
// Longer names are cut to this many characters and end with "...".
|
|
@@ -97,13 +96,6 @@ export const handleInputStatusChanged = (payload) => {
|
|
|
97
96
|
useTypingStore.getState().removeTyper(conversationID, userID);
|
|
98
97
|
}
|
|
99
98
|
};
|
|
100
|
-
// Mirrors OpenIM's conversationID scheme: si_<sorted user ids> / sg_<groupID>.
|
|
101
|
-
const getConversationIdFromMessage = (message) => {
|
|
102
|
-
if (message.sessionType === SessionType.Single) {
|
|
103
|
-
return `si_${[message.sendID, message.recvID].sort().join("_")}`;
|
|
104
|
-
}
|
|
105
|
-
return message.groupID ? `sg_${message.groupID}` : "";
|
|
106
|
-
};
|
|
107
99
|
/** A typer's own message landing ends their typing state right away. */
|
|
108
100
|
export const removeTyperOnNewMessage = (message) => {
|
|
109
101
|
const conversationId = getConversationIdFromMessage(message);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface PdpSearchResultTarget {
|
|
2
|
+
threadId?: string;
|
|
3
|
+
groupId?: string;
|
|
4
|
+
messageId?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const buildPdpSearchResultUrl: (pathname: string, search: string, target: PdpSearchResultTarget) => string;
|
|
7
|
+
export declare const useOpenPdpSearchResult: () => (target: PdpSearchResultTarget) => void;
|
|
8
|
+
//# sourceMappingURL=useOpenPdpSearchResult.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useOpenPdpSearchResult.d.ts","sourceRoot":"","sources":["../../../src/hooks/search/useOpenPdpSearchResult.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,eAAO,MAAM,uBAAuB,GAClC,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,QAAQ,qBAAqB,WAQ9B,CAAC;AAIF,eAAO,MAAM,sBAAsB,iBAItB,qBAAqB,SAuBjC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback } from "react";
|
|
3
|
+
import { useChatNavigate } from "../../hooks/conversation/useChatNavigate";
|
|
4
|
+
import useConversationStore from "../../store/conversation";
|
|
5
|
+
const TARGET_PARAMS = ["threadId", "groupId", "userId", "botId", "messageId"];
|
|
6
|
+
export const buildPdpSearchResultUrl = (pathname, search, target) => {
|
|
7
|
+
const params = new URLSearchParams(search);
|
|
8
|
+
TARGET_PARAMS.forEach((key) => params.delete(key));
|
|
9
|
+
Object.entries(target).forEach(([key, value]) => {
|
|
10
|
+
if (value)
|
|
11
|
+
params.set(key, value);
|
|
12
|
+
});
|
|
13
|
+
return `${pathname}?${params.toString()}`;
|
|
14
|
+
};
|
|
15
|
+
// PDP opens results through its URL: DChatConversationDetail re-resolves the target
|
|
16
|
+
// with forceRevalidate, which is the access check before showing any content.
|
|
17
|
+
export const useOpenPdpSearchResult = () => {
|
|
18
|
+
const onNavigate = useChatNavigate();
|
|
19
|
+
return useCallback((target) => {
|
|
20
|
+
onNavigate(buildPdpSearchResultUrl(window.location.pathname, window.location.search, target));
|
|
21
|
+
// The resolver skips an already-open thread, so hand it the jump target directly.
|
|
22
|
+
const { conversationData, setConversationData } = useConversationStore.getState();
|
|
23
|
+
if (target.messageId &&
|
|
24
|
+
conversationData &&
|
|
25
|
+
conversationData.conversationID === target.threadId) {
|
|
26
|
+
setConversationData(conversationData, target.messageId, {
|
|
27
|
+
forceRevalidate: true,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}, [onNavigate]);
|
|
31
|
+
};
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { BaseResponse, IConversationGroupItem } from "../../types/dto";
|
|
2
2
|
import { type ConversationGroupDisplayItem } from "../../hooks/group/useConversationGroups";
|
|
3
|
+
import type { SearchScope } from "../../types/search";
|
|
3
4
|
interface UseSearchGroupsParams {
|
|
4
5
|
searchTerm: string;
|
|
5
6
|
enabled?: boolean;
|
|
6
7
|
pageSize?: number;
|
|
8
|
+
scope?: SearchScope;
|
|
7
9
|
}
|
|
8
|
-
export declare const useSearchGroups: ({ searchTerm, enabled, pageSize, }: UseSearchGroupsParams) => {
|
|
10
|
+
export declare const useSearchGroups: ({ searchTerm, enabled, pageSize, scope, }: UseSearchGroupsParams) => {
|
|
9
11
|
groups: ConversationGroupDisplayItem[];
|
|
10
12
|
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<BaseResponse<IConversationGroupItem[]>, unknown>, Error>>;
|
|
11
13
|
hasNextPage: boolean;
|
|
@@ -1 +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;
|
|
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;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,UAAU,qBAAqB;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AA4BD,eAAO,MAAM,eAAe,GAAI,2CAK7B,qBAAqB;;;;;;CAkEvB,CAAC"}
|
|
@@ -8,23 +8,34 @@ import { PAGE_SIZE } from "../../constants";
|
|
|
8
8
|
import useAuthStore from "../../store/auth";
|
|
9
9
|
import useConversationStore from "../../store/conversation";
|
|
10
10
|
import { buildFallbackConversation, syncGroupConversationsToStore, } from "../../hooks/group/useConversationGroups";
|
|
11
|
-
|
|
11
|
+
const fetchGroupsPage = (scope, page, pageSize, searchTerm) => {
|
|
12
|
+
if (scope === "pdp-portal") {
|
|
13
|
+
// Joined groups only, already limited to the PDP account by BE.
|
|
14
|
+
return apiInstance.post(ENDPOINTS.chatService.searchPdpPortalGroups, { page, pageSize, searchTerm });
|
|
15
|
+
}
|
|
16
|
+
return apiInstance.get(ENDPOINTS.chatService.searchConversationGroups, {
|
|
17
|
+
params: {
|
|
18
|
+
page,
|
|
19
|
+
pageSize,
|
|
20
|
+
applicationType: useAuthStore.getState().applicationType,
|
|
21
|
+
searchTerm,
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
export const useSearchGroups = ({ searchTerm, enabled = true, pageSize = PAGE_SIZE.medium, scope = "crm", }) => {
|
|
12
26
|
const trimmedSearchTerm = searchTerm.trim();
|
|
13
27
|
const conversationList = useConversationStore((state) => state.conversationList);
|
|
14
28
|
const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading } = useInfiniteQuery({
|
|
15
29
|
initialPageParam: 1,
|
|
16
|
-
queryKey: [
|
|
30
|
+
queryKey: [
|
|
31
|
+
QUERY_KEYS.SEARCH_CONVERSATION_GROUPS,
|
|
32
|
+
scope,
|
|
33
|
+
trimmedSearchTerm,
|
|
34
|
+
pageSize,
|
|
35
|
+
],
|
|
17
36
|
queryFn: async ({ pageParam = 1 }) => {
|
|
18
37
|
var _a, _b;
|
|
19
|
-
const
|
|
20
|
-
const res = await apiInstance.get(ENDPOINTS.chatService.searchConversationGroups, {
|
|
21
|
-
params: {
|
|
22
|
-
page: pageParam,
|
|
23
|
-
pageSize,
|
|
24
|
-
applicationType,
|
|
25
|
-
searchTerm: trimmedSearchTerm,
|
|
26
|
-
},
|
|
27
|
-
});
|
|
38
|
+
const res = await fetchGroupsPage(scope, pageParam, pageSize, trimmedSearchTerm);
|
|
28
39
|
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
40
|
void syncGroupConversationsToStore(res.data.data).catch((error) => {
|
|
30
41
|
console.error("syncGroupConversationsToStore", error);
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { SearchMessageRequest } from "../../types/dto";
|
|
2
|
+
import type { SearchScope } from "../../types/search";
|
|
2
3
|
interface UseSearchMessagePayload {
|
|
3
4
|
payload: Pick<SearchMessageRequest, "contentType" | "pageSize" | "recvID" | "searchTerm" | "tag">;
|
|
4
5
|
options?: {
|
|
5
6
|
pageSize?: number;
|
|
6
7
|
untilEmptyPage?: boolean;
|
|
8
|
+
scope?: SearchScope;
|
|
7
9
|
};
|
|
8
10
|
}
|
|
9
11
|
export declare const useSearchMessage: ({ payload, options, }: UseSearchMessagePayload) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSearchMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/search/useSearchMessage.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,oBAAoB,EAErB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"useSearchMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/search/useSearchMessage.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,oBAAoB,EAErB,MAAM,aAAa,CAAC;AAOrB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,UAAU,uBAAuB;IAC/B,OAAO,EAAE,IAAI,CACX,oBAAoB,EACpB,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,KAAK,CAC7D,CAAC;IACF,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,WAAW,CAAA;KAAE,CAAC;CAChF;AAED,eAAO,MAAM,gBAAgB,GAAI,uBAG9B,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0FzB,CAAC"}
|
|
@@ -20,12 +20,15 @@ import useConversationStore from "../../store/conversation";
|
|
|
20
20
|
import { isGroupSession } from "../../utils/imCommon";
|
|
21
21
|
import { PAGE_SIZE } from "../../constants";
|
|
22
22
|
export const useSearchMessage = ({ payload, options, }) => {
|
|
23
|
+
const isPdpPortal = (options === null || options === void 0 ? void 0 : options.scope) === "pdp-portal";
|
|
23
24
|
const _a = useInfiniteQuery({
|
|
24
25
|
initialPageParam: 1,
|
|
25
26
|
queryKey: [QUERY_KEYS.SEARCH_MESSAGE, payload, options],
|
|
26
27
|
queryFn: async ({ pageParam = 1 }) => {
|
|
27
28
|
const params = Object.assign(Object.assign({ pageSize: (options === null || options === void 0 ? void 0 : options.pageSize) || PAGE_SIZE.small }, payload), { page: pageParam, applicationType: useAuthStore.getState().applicationType });
|
|
28
|
-
const res = await apiInstance.post(
|
|
29
|
+
const res = await apiInstance.post(isPdpPortal
|
|
30
|
+
? ENDPOINTS.chatService.searchPdpPortalMessages
|
|
31
|
+
: ENDPOINTS.chatService.searchMessage, params);
|
|
29
32
|
return res.data;
|
|
30
33
|
},
|
|
31
34
|
getNextPageParam: (lastPage) => {
|
|
@@ -54,8 +57,11 @@ export const useSearchMessage = ({ payload, options, }) => {
|
|
|
54
57
|
.getState()
|
|
55
58
|
.conversationList.filter((c) => isGroupSession(c.conversationType))
|
|
56
59
|
.map((c) => c.groupID));
|
|
57
|
-
|
|
58
|
-
|
|
60
|
+
// PDP's endpoint is scoped server-side and returns team threads the user hasn't joined.
|
|
61
|
+
const allItems = isPdpPortal
|
|
62
|
+
? rawItems
|
|
63
|
+
: rawItems.filter((item) => !isGroupSession(item.chatLog.sessionType) ||
|
|
64
|
+
joinedGroupIDs.has(item.chatLog.groupID));
|
|
59
65
|
const mGroupeddata = allItems.reduce((acc, item) => {
|
|
60
66
|
const dateKey = dayjs(item.chatLog.sendTime).format("YYYY-MM-DD");
|
|
61
67
|
if (!acc[dateKey])
|
|
@@ -67,7 +73,7 @@ export const useSearchMessage = ({ payload, options, }) => {
|
|
|
67
73
|
groupedData: mGroupeddata,
|
|
68
74
|
dataFlatten: allItems,
|
|
69
75
|
};
|
|
70
|
-
}, [data]);
|
|
76
|
+
}, [data, isPdpPortal]);
|
|
71
77
|
return Object.assign({ data,
|
|
72
78
|
fetchNextPage,
|
|
73
79
|
hasNextPage,
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BaseResponse } from "../../types/dto";
|
|
2
|
+
import { ISessionByStatus } from "../../store/type";
|
|
3
|
+
export type PdpTeamSessionItem = Omit<ISessionByStatus, "conversation">;
|
|
4
|
+
interface UseSearchPdpTeamSessionsParams {
|
|
5
|
+
searchTerm: string;
|
|
6
|
+
enabled?: boolean;
|
|
7
|
+
pageSize?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare const useSearchPdpTeamSessions: ({ searchTerm, enabled, pageSize, }: UseSearchPdpTeamSessionsParams) => {
|
|
10
|
+
dataFlatten: PdpTeamSessionItem[];
|
|
11
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<BaseResponse<PdpTeamSessionItem[]>, unknown>, Error>>;
|
|
12
|
+
hasNextPage: boolean;
|
|
13
|
+
isFetchingNextPage: boolean;
|
|
14
|
+
isLoading: boolean;
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=useSearchPdpTeamSessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSearchPdpTeamSessions.d.ts","sourceRoot":"","sources":["../../../src/hooks/search/useSearchPdpTeamSessions.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhD,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;AAExE,UAAU,8BAA8B;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD,eAAO,MAAM,wBAAwB,GAAI,oCAItC,8BAA8B;;;;;;CAsChC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
// "Người dùng" for PDP Portal: sellers owning a thread of the account's team inbox.
|
|
9
|
+
export const useSearchPdpTeamSessions = ({ searchTerm, enabled = true, pageSize = PAGE_SIZE.medium, }) => {
|
|
10
|
+
const trimmedSearchTerm = searchTerm.trim();
|
|
11
|
+
const { data, fetchNextPage, hasNextPage, isFetchingNextPage, isLoading } = useInfiniteQuery({
|
|
12
|
+
initialPageParam: 1,
|
|
13
|
+
queryKey: [
|
|
14
|
+
QUERY_KEYS.SEARCH_PDP_PORTAL_TEAM_SESSIONS,
|
|
15
|
+
trimmedSearchTerm,
|
|
16
|
+
pageSize,
|
|
17
|
+
],
|
|
18
|
+
queryFn: async ({ pageParam = 1 }) => {
|
|
19
|
+
const res = await apiInstance.post(ENDPOINTS.chatService.searchPdpPortalTeamSessions, { page: pageParam, pageSize, searchTerm: trimmedSearchTerm });
|
|
20
|
+
return res.data;
|
|
21
|
+
},
|
|
22
|
+
getNextPageParam: (lastPage) => {
|
|
23
|
+
var _a, _b;
|
|
24
|
+
const dataLength = ((_a = lastPage === null || lastPage === void 0 ? void 0 : lastPage.data) === null || _a === void 0 ? void 0 : _a.length) || 0;
|
|
25
|
+
const currentPage = ((_b = lastPage === null || lastPage === void 0 ? void 0 : lastPage.pageable) === null || _b === void 0 ? void 0 : _b.pageNumber) || 1;
|
|
26
|
+
return dataLength < pageSize ? undefined : currentPage + 1;
|
|
27
|
+
},
|
|
28
|
+
enabled: enabled && trimmedSearchTerm !== "",
|
|
29
|
+
});
|
|
30
|
+
const dataFlatten = 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]);
|
|
31
|
+
return {
|
|
32
|
+
dataFlatten,
|
|
33
|
+
fetchNextPage,
|
|
34
|
+
hasNextPage,
|
|
35
|
+
isFetchingNextPage,
|
|
36
|
+
isLoading,
|
|
37
|
+
};
|
|
38
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SearchScope } from "../../types/search";
|
|
2
|
+
interface UseSearchUsersParams {
|
|
3
|
+
searchTerm: string;
|
|
4
|
+
scope: SearchScope;
|
|
5
|
+
pageSize?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare const useSearchUsers: ({ searchTerm, scope, pageSize, }: UseSearchUsersParams) => {
|
|
8
|
+
dataFlatten: import("./useSearchPdpTeamSessions").PdpTeamSessionItem[];
|
|
9
|
+
hasNextPage: boolean;
|
|
10
|
+
fetchNextPage: (options?: import("@tanstack/react-query").FetchNextPageOptions) => Promise<import("@tanstack/react-query").InfiniteQueryObserverResult<import("@tanstack/react-query").InfiniteData<import("../../types/dto").BaseResponse<import("./useSearchPdpTeamSessions").PdpTeamSessionItem[]>, unknown>, Error>>;
|
|
11
|
+
isLoading: boolean;
|
|
12
|
+
};
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=useSearchUsers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSearchUsers.d.ts","sourceRoot":"","sources":["../../../src/hooks/search/useSearchUsers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlD,UAAU,oBAAoB;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD,eAAO,MAAM,cAAc,GAAI,kCAI5B,oBAAoB;;;;;CAmBtB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useGetSession } from "../../hooks/session/useGetSession";
|
|
3
|
+
import { useSearchPdpTeamSessions } from "./useSearchPdpTeamSessions";
|
|
4
|
+
// Both hooks are always called (rules of hooks); only the scope's own one is enabled.
|
|
5
|
+
export const useSearchUsers = ({ searchTerm, scope, pageSize, }) => {
|
|
6
|
+
const isPdpPortal = scope === "pdp-portal";
|
|
7
|
+
const crm = useGetSession({
|
|
8
|
+
filter: { searchTerm: searchTerm.trim() },
|
|
9
|
+
options: { pageSize, isEnabled: !isPdpPortal },
|
|
10
|
+
});
|
|
11
|
+
const pdp = useSearchPdpTeamSessions({
|
|
12
|
+
searchTerm,
|
|
13
|
+
pageSize,
|
|
14
|
+
enabled: isPdpPortal,
|
|
15
|
+
});
|
|
16
|
+
const active = isPdpPortal ? pdp : crm;
|
|
17
|
+
return {
|
|
18
|
+
dataFlatten: active.dataFlatten,
|
|
19
|
+
hasNextPage: active.hasNextPage,
|
|
20
|
+
fetchNextPage: active.fetchNextPage,
|
|
21
|
+
isLoading: active.isLoading,
|
|
22
|
+
};
|
|
23
|
+
};
|
package/dist/index.d.ts
CHANGED
|
@@ -32,6 +32,9 @@ export { default as ComposeNewMessageModal } from "./components/compose/ComposeN
|
|
|
32
32
|
export type { ComposeNewMessageModalProps } from "./components/compose/ComposeNewMessageModal";
|
|
33
33
|
export { default as DChatConversationDetail } from "./screens/conversation-detail";
|
|
34
34
|
export type { DChatConversationDetailProps } from "./screens/conversation-detail";
|
|
35
|
+
export { default as DChatSearchConversation } from "./components/search-conversation";
|
|
36
|
+
export type { SearchConversationProps as DChatSearchConversationProps } from "./components/search-conversation";
|
|
37
|
+
export type { SearchScope as DChatSearchScope } from "./types/search";
|
|
35
38
|
export { ConversationDetailHeader, ConversationDetailInput, } from "./components/conversation-detail";
|
|
36
39
|
export type { ConversationDetailHeaderProps, ConversationDetailInputProps, } from "./components/conversation-detail";
|
|
37
40
|
export { MORE_OPTIONS, MoreOptionKey } from "./constants/moreOption";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,CAAC;AAExB,OAAO,gBAAgB,MAAM,wBAAwB,CAAC;AACtD,OAAO,WAAW,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC/E,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,YAAY,MAAM,cAAc,CAAC;AACxC,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,MAAM,cAAc,CAAC;AAC7C,cAAc,eAAe,CAAC;AAG9B,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG5C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,8CAA8C,CAAC;AACzF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,wDAAwD,CAAC;AACxG,YAAY,EAAE,wBAAwB,EAAE,MAAM,wDAAwD,CAAC;AAEvG,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACjF,YAAY,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAEhF,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,uDAAuD,CAAC;AACzG,YAAY,EAAE,0BAA0B,EAAE,MAAM,uDAAuD,CAAC;AAMxG,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAC7E,YAAY,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAE5E,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,wDAAwD,CAAC;AAC3G,YAAY,EAAE,2BAA2B,EAAE,MAAM,wDAAwD,CAAC;AAM1G,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,wDAAwD,CAAC;AAC3G,YAAY,EAAE,2BAA2B,EAAE,MAAM,wDAAwD,CAAC;AAE1G,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAChG,YAAY,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAE/F,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACnF,YAAY,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -33,6 +33,9 @@ export { default as ConversationPeerAvatar } from "./components/conversation-inb
|
|
|
33
33
|
export { default as ConversationInboxTitle } from "./components/conversation-inbox/ConversationInboxTitle";
|
|
34
34
|
export { default as ComposeNewMessageModal } from "./components/compose/ComposeNewMessageModal";
|
|
35
35
|
export { default as DChatConversationDetail } from "./screens/conversation-detail";
|
|
36
|
+
// CRM's global search (Tất cả/Người dùng/Tin nhắn/Nhóm) for hosts with their own
|
|
37
|
+
// inbox layout; scope="pdp-portal" switches to the PDP-scoped endpoints.
|
|
38
|
+
export { default as DChatSearchConversation } from "./components/search-conversation";
|
|
36
39
|
export { ConversationDetailHeader, ConversationDetailInput, } from "./components/conversation-detail";
|
|
37
40
|
export { MORE_OPTIONS, MoreOptionKey } from "./constants/moreOption";
|
|
38
41
|
export { ChatCategory, ChatType, PeerType, } from "./types/conversation";
|
|
@@ -211,6 +211,7 @@
|
|
|
211
211
|
"my_messages": "Tin nhắn của tôi",
|
|
212
212
|
"my_inbox_tab": "My inbox",
|
|
213
213
|
"team_messages": "Tin nhắn nhóm",
|
|
214
|
+
"pdp_team_inbox_tag": "Tin nhắn chung",
|
|
214
215
|
"join_group_required": "Bạn cần tham gia nhóm để gửi tin nhắn",
|
|
215
216
|
"send_message_disabled": "Chỉ quản trị viên được phép gửi tin nhắn",
|
|
216
217
|
"send_message_disabled_group_mute": "Chỉ chủ nhóm và quản trị viên được phép gửi tin nhắn",
|
|
@@ -252,6 +253,7 @@
|
|
|
252
253
|
"permission_remove_member": "Xoá thành viên",
|
|
253
254
|
"permission_update_group_info": "Cập nhật thông tin nhóm",
|
|
254
255
|
"update_member_permissions_success": "Cập nhật quyền thành viên thành công",
|
|
256
|
+
"update_member_permissions_failed": "Cập nhật quyền thành viên thất bại",
|
|
255
257
|
"update_admin_permissions_success": "Cập nhật quyền quản trị viên thành công",
|
|
256
258
|
"invite_via_link": "Mời vào nhóm bằng link",
|
|
257
259
|
"invite_link_empty_owner_title": "Tạo link tham gia nhóm",
|
package/dist/services/query.d.ts
CHANGED
|
@@ -42,6 +42,7 @@ export declare const QUERY_KEYS: {
|
|
|
42
42
|
SEARCH_CONVERSATION_GROUPS: string;
|
|
43
43
|
SEARCH_CONTACTS: string;
|
|
44
44
|
SEARCH_PUBLIC_GROUPS: string;
|
|
45
|
+
SEARCH_PDP_PORTAL_TEAM_SESSIONS: string;
|
|
45
46
|
GET_BLACK_LIST: string;
|
|
46
47
|
DELETE_CONVERSATION: string;
|
|
47
48
|
GET_JOIN_LINK: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/services/query.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/services/query.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoDtB,CAAC"}
|
package/dist/services/query.js
CHANGED
|
@@ -42,6 +42,7 @@ export const QUERY_KEYS = {
|
|
|
42
42
|
SEARCH_CONVERSATION_GROUPS: "SEARCH_CONVERSATION_GROUPS",
|
|
43
43
|
SEARCH_CONTACTS: "SEARCH_CONTACTS",
|
|
44
44
|
SEARCH_PUBLIC_GROUPS: "SEARCH_PUBLIC_GROUPS",
|
|
45
|
+
SEARCH_PDP_PORTAL_TEAM_SESSIONS: "SEARCH_PDP_PORTAL_TEAM_SESSIONS",
|
|
45
46
|
GET_BLACK_LIST: "GET_BLACK_LIST",
|
|
46
47
|
DELETE_CONVERSATION: "DELETE_CONVERSATION",
|
|
47
48
|
GET_JOIN_LINK: "GET_JOIN_LINK",
|
|
@@ -32,6 +32,9 @@ export declare const ENDPOINTS: {
|
|
|
32
32
|
getConversationsImDetail: string;
|
|
33
33
|
getConversationGroups: string;
|
|
34
34
|
searchConversationGroups: string;
|
|
35
|
+
searchPdpPortalMessages: string;
|
|
36
|
+
searchPdpPortalTeamSessions: string;
|
|
37
|
+
searchPdpPortalGroups: string;
|
|
35
38
|
createConversation: string;
|
|
36
39
|
getConversationDetail: (conversationId: string) => string;
|
|
37
40
|
runBotFlow: (conversationId: string) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/services/routes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;;;;mCAMS,MAAM;;0CAGC,MAAM,UAAU,MAAM;6BAEnC,MAAM;;oDAEiB,MAAM;uCAEnB,MAAM;kCAEX,MAAM;;oCAGJ,MAAM;mCAEP,MAAM;uCAEF,MAAM;;;;;;;;;iCAUZ,MAAM;4CAEK,MAAM;mCAEf,MAAM;yCAEA,MAAM;gCAEf,MAAM
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/services/routes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS;;;;;;mCAMS,MAAM;;0CAGC,MAAM,UAAU,MAAM;6BAEnC,MAAM;;oDAEiB,MAAM;uCAEnB,MAAM;kCAEX,MAAM;;oCAGJ,MAAM;mCAEP,MAAM;uCAEF,MAAM;;;;;;;;;iCAUZ,MAAM;4CAEK,MAAM;mCAEf,MAAM;yCAEA,MAAM;gCAEf,MAAM;;;;;;;;gDAYU,MAAM;qCAEjB,MAAM;uCAEJ,MAAM;0CAEH,MAAM;yCAEP,MAAM;8BAEjB,MAAM;wCACI,MAAM;;;;;4CAMF,MAAM;;;;;;;;;;;;CAa7C,CAAC"}
|
package/dist/services/routes.js
CHANGED
|
@@ -32,6 +32,9 @@ export const ENDPOINTS = {
|
|
|
32
32
|
getConversationsImDetail: "/chat-service/v1/crm/conversations/im-detail",
|
|
33
33
|
getConversationGroups: "/chat-service/v1/crm/conversations/groups",
|
|
34
34
|
searchConversationGroups: "/chat-service/v1/crm/conversations/groups/search",
|
|
35
|
+
searchPdpPortalMessages: "/chat-service/v1/pdp-portal/messages/search",
|
|
36
|
+
searchPdpPortalTeamSessions: "/chat-service/v1/pdp-portal/conversations/teams/query",
|
|
37
|
+
searchPdpPortalGroups: "/chat-service/v1/pdp-portal/conversations/groups/query",
|
|
35
38
|
createConversation: "/chat-service/v1/app/conversations",
|
|
36
39
|
getConversationDetail: (conversationId) => `/chat-service/v1/app/conversations/${conversationId}`,
|
|
37
40
|
runBotFlow: (conversationId) => `/chat-service/v1/app/conversations/${conversationId}/bot-flows/run`,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/types/search.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ConversationItem } from "@droppii-org/wasm-client-sdk";
|
|
1
|
+
import { ConversationItem, MessageItem } from "@droppii-org/wasm-client-sdk";
|
|
2
2
|
import { ChatCategory, PeerType, type ConversationExtra } from "../types/conversation";
|
|
3
3
|
export declare const parseConversationExtra: (ex: string | undefined) => ConversationExtra;
|
|
4
4
|
export declare const resolveConversationChatCategory: (item: ConversationItem) => ChatCategory;
|
|
@@ -47,6 +47,7 @@ export declare const resolvePeerBadgeColor: (peerType: PeerType) => "" | "bg-[va
|
|
|
47
47
|
* "group unknown".
|
|
48
48
|
*/
|
|
49
49
|
export declare const getGroupIdFromConversationId: (conversationId?: string) => string;
|
|
50
|
+
export declare const getConversationIdFromMessage: (message: MessageItem) => string;
|
|
50
51
|
/**
|
|
51
52
|
* Pulls the OTHER participant out of a 1:1 conversation id
|
|
52
53
|
* ("si_<userA>_<userB>"), which is what getOneConversation wants as its
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/utils/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/utils/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,WAAW,EAEZ,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,YAAY,EACZ,QAAQ,EACR,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAW9B,eAAO,MAAM,sBAAsB,GACjC,IAAI,MAAM,GAAG,SAAS,KACrB,iBAcF,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAC1C,MAAM,gBAAgB,KACrB,YAA4D,CAAC;AAEhE,eAAO,MAAM,wBAAwB,GAAI,MAAM,gBAAgB,KAAG,MAOjE,CAAC;AAEF,KAAK,oBAAoB,GAAG;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;CACb,GAAG,IAAI,CAAC;AAIT,eAAO,MAAM,4BAA4B,GACvC,OAAO,oBAAoB,KAC1B,MAiBF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,yBAAyB,GACpC,MAAM,oBAAoB,GAAG,SAAS,EACtC,eAAe,MAAM,KACpB,OAGF,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,GAAG,IAAI,CAAC;AAET;;;GAGG;AACH,eAAO,MAAM,8BAA8B,GACzC,MAAM,CAAC,WAAW,CAAC,oBAAoB,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EACpF,OAAO,mBAAmB,GAAG,SAAS,EACtC,eAAe,MAAM,KACpB;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAShD,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,MAAM,gBAAgB,YAChB,CAAC;AAEjC,eAAO,MAAM,cAAc,GAAI,MAAM,gBAAgB,YAChB,CAAC;AAEtC,eAAO,MAAM,WAAW,GAAI,MAAM,gBAAgB,YAChB,CAAC;AAEnC,eAAO,MAAM,8BAA8B,GACzC,MAAM,gBAAgB,EACtB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,KACzB,MAKF,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,MAAM,gBAAgB,KACrB,MAAM,GAAG,IAGX,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,UAAU,QAAQ,EAClB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,KACzB,MAIF,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,UAAU,QAAQ,8EAIvD,CAAC;AAKF;;;;;;;;;GASG;AACH,eAAO,MAAM,4BAA4B,GAAI,iBAAiB,MAAM,WAG5D,CAAC;AAGT,eAAO,MAAM,4BAA4B,GAAI,SAAS,WAAW,WAKhE,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,+BAA+B,GAC1C,iBAAiB,MAAM,EACvB,aAAa,MAAM,KAClB,MAYF,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SessionType } from "@droppii-org/wasm-client-sdk";
|
|
1
|
+
import { SessionType, } from "@droppii-org/wasm-client-sdk";
|
|
2
2
|
import { ChatCategory, PeerType, } from "../types/conversation";
|
|
3
3
|
import { DChatApplicationType, } from "../types/chat";
|
|
4
4
|
const DEFAULT_CONVERSATION_EXTRA = {
|
|
@@ -125,6 +125,13 @@ const SINGLE_CONVERSATION_ID_PREFIX = "si_";
|
|
|
125
125
|
export const getGroupIdFromConversationId = (conversationId) => (conversationId === null || conversationId === void 0 ? void 0 : conversationId.startsWith(GROUP_CONVERSATION_ID_PREFIX))
|
|
126
126
|
? conversationId.slice(GROUP_CONVERSATION_ID_PREFIX.length)
|
|
127
127
|
: "";
|
|
128
|
+
// Mirrors OpenIM's conversationID scheme: si_<sorted user ids> / sg_<groupID>.
|
|
129
|
+
export const getConversationIdFromMessage = (message) => {
|
|
130
|
+
if (message.sessionType === SessionType.Single) {
|
|
131
|
+
return `si_${[message.sendID, message.recvID].sort().join("_")}`;
|
|
132
|
+
}
|
|
133
|
+
return message.groupID ? `sg_${message.groupID}` : "";
|
|
134
|
+
};
|
|
128
135
|
/**
|
|
129
136
|
* Pulls the OTHER participant out of a 1:1 conversation id
|
|
130
137
|
* ("si_<userA>_<userB>"), which is what getOneConversation wants as its
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type PermissionSwitchKeys<S extends string> = Record<S, readonly string[]>;
|
|
2
|
+
export type SwitchStates<S extends string> = Record<S, boolean>;
|
|
3
|
+
export declare const commonSwitchStates: <S extends string>(switchKeys: PermissionSwitchKeys<S>, permissionLists: string[][]) => SwitchStates<S>;
|
|
4
|
+
export declare const changedSwitches: <S extends string>(baseline: SwitchStates<S>, pending: SwitchStates<S>) => Partial<SwitchStates<S>>;
|
|
5
|
+
export declare const toRolePermissionChange: <S extends string>(switchKeys: PermissionSwitchKeys<S>, changes: Partial<SwitchStates<S>>) => {
|
|
6
|
+
enablePermissions: string[];
|
|
7
|
+
disablePermissions: string[];
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=groupPermissionSwitches.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groupPermissionSwitches.d.ts","sourceRoot":"","sources":["../../src/utils/groupPermissionSwitches.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,MAAM,IAAI,MAAM,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;AAClF,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,IAAI,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAGhE,eAAO,MAAM,kBAAkB,GAAI,CAAC,SAAS,MAAM,EACjD,YAAY,oBAAoB,CAAC,CAAC,CAAC,EACnC,iBAAiB,MAAM,EAAE,EAAE,KAC1B,YAAY,CAAC,CAAC,CASK,CAAC;AAGvB,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,MAAM,EAC9C,UAAU,YAAY,CAAC,CAAC,CAAC,EACzB,SAAS,YAAY,CAAC,CAAC,CAAC,KACvB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAKK,CAAC;AAGhC,eAAO,MAAM,sBAAsB,GAAI,CAAC,SAAS,MAAM,EACrD,YAAY,oBAAoB,CAAC,CAAC,CAAC,EACnC,SAAS,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;;;CAQlC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// A switch reads on only when every given permission list grants all of its keys.
|
|
2
|
+
export const commonSwitchStates = (switchKeys, permissionLists) => Object.fromEntries(Object.keys(switchKeys).map((name) => [
|
|
3
|
+
name,
|
|
4
|
+
permissionLists.length > 0 &&
|
|
5
|
+
permissionLists.every((list) => switchKeys[name].every((key) => list.includes(key))),
|
|
6
|
+
]));
|
|
7
|
+
// The switches whose pending value differs from the baseline, with their new value.
|
|
8
|
+
export const changedSwitches = (baseline, pending) => Object.fromEntries(Object.keys(baseline)
|
|
9
|
+
.filter((name) => pending[name] !== baseline[name])
|
|
10
|
+
.map((name) => [name, pending[name]]));
|
|
11
|
+
// Splits the flipped switches into the enable/disable key lists of a role-wide update.
|
|
12
|
+
export const toRolePermissionChange = (switchKeys, changes) => {
|
|
13
|
+
const enablePermissions = [];
|
|
14
|
+
const disablePermissions = [];
|
|
15
|
+
Object.entries(changes).forEach(([name, enabled]) => {
|
|
16
|
+
(enabled ? enablePermissions : disablePermissions).push(...switchKeys[name]);
|
|
17
|
+
});
|
|
18
|
+
return { enablePermissions, disablePermissions };
|
|
19
|
+
};
|