@droppii-org/chat-sdk 0.1.5 → 0.1.7
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/cannedResponse/CannedResponseBody.d.ts.map +1 -1
- package/dist/components/cannedResponse/CannedResponseBody.js +54 -3
- package/dist/components/conversation/ConversationBySessionItem.d.ts.map +1 -1
- package/dist/components/conversation/ConversationBySessionItem.js +7 -2
- package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
- package/dist/components/conversation/DeskConversationList.js +22 -17
- package/dist/components/message/MessageHeader.d.ts +2 -2
- package/dist/components/message/MessageHeader.d.ts.map +1 -1
- package/dist/components/message/MessageHeader.js +5 -2
- package/dist/components/message/MessageList.d.ts.map +1 -1
- package/dist/components/message/MessageList.js +31 -22
- package/dist/components/message/SelectSession.d.ts.map +1 -1
- package/dist/components/message/SelectSession.js +7 -9
- package/dist/components/message/footer/ActionBar.d.ts.map +1 -1
- package/dist/components/message/footer/ActionBar.js +3 -2
- package/dist/components/message/footer/CannedResponsePlugin.d.ts.map +1 -1
- package/dist/components/message/footer/CannedResponsePlugin.js +37 -1
- package/dist/components/message/footer/ComposerEditor.d.ts +7 -0
- package/dist/components/message/footer/ComposerEditor.d.ts.map +1 -0
- package/dist/components/message/footer/ComposerEditor.js +13 -0
- package/dist/components/message/footer/ComposerTabs.d.ts +9 -0
- package/dist/components/message/footer/ComposerTabs.d.ts.map +1 -0
- package/dist/components/message/footer/ComposerTabs.js +37 -0
- 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/index.d.ts +2 -2
- package/dist/components/message/footer/index.d.ts.map +1 -1
- package/dist/components/message/footer/index.js +45 -9
- package/dist/components/message/item/QuoteMessage.d.ts.map +1 -1
- package/dist/components/message/item/QuoteMessage.js +44 -35
- package/dist/components/message/item/index.d.ts.map +1 -1
- package/dist/components/message/item/index.js +11 -1
- package/dist/components/session/DeskAssignedSession.d.ts.map +1 -1
- package/dist/components/session/DeskAssignedSession.js +14 -109
- package/dist/components/session/DeskTeamInbox.d.ts +3 -0
- package/dist/components/session/DeskTeamInbox.d.ts.map +1 -0
- package/dist/components/session/DeskTeamInbox.js +56 -0
- package/dist/components/session/SessionFilterMenu.d.ts +13 -0
- package/dist/components/session/SessionFilterMenu.d.ts.map +1 -0
- package/dist/components/session/SessionFilterMenu.js +27 -0
- package/dist/components/session/sessionMenuItems.d.ts +26 -0
- package/dist/components/session/sessionMenuItems.d.ts.map +1 -0
- package/dist/components/session/sessionMenuItems.js +108 -0
- package/dist/hooks/conversation/useConversationPreview.d.ts +12 -0
- package/dist/hooks/conversation/useConversationPreview.d.ts.map +1 -0
- package/dist/hooks/conversation/useConversationPreview.js +22 -0
- package/dist/hooks/message/useConversationMessages.d.ts +27 -0
- package/dist/hooks/message/useConversationMessages.d.ts.map +1 -0
- package/dist/hooks/message/useConversationMessages.js +29 -0
- package/dist/hooks/message/useMessage.d.ts.map +1 -1
- package/dist/hooks/message/usePullSessionMessages.d.ts +9 -0
- package/dist/hooks/message/usePullSessionMessages.d.ts.map +1 -0
- package/dist/hooks/message/usePullSessionMessages.js +27 -0
- package/dist/hooks/message/useSendMessage.d.ts +8 -6
- package/dist/hooks/message/useSendMessage.d.ts.map +1 -1
- package/dist/hooks/message/useSendMessage.js +8 -8
- package/dist/hooks/session/useConversationSessionState.d.ts +21 -0
- package/dist/hooks/session/useConversationSessionState.d.ts.map +1 -0
- package/dist/hooks/session/useConversationSessionState.js +41 -0
- package/dist/hooks/session/useGetSession.d.ts.map +1 -1
- package/dist/hooks/session/useGetSession.js +138 -52
- package/dist/hooks/session/useGetTeamSessionSummary.d.ts +3 -0
- package/dist/hooks/session/useGetTeamSessionSummary.d.ts.map +1 -0
- package/dist/hooks/session/useGetTeamSessionSummary.js +12 -0
- package/dist/hooks/session/useIsJoinedGroup.d.ts +5 -0
- package/dist/hooks/session/useIsJoinedGroup.d.ts.map +1 -0
- package/dist/hooks/session/useIsJoinedGroup.js +24 -0
- package/dist/hooks/session/useJoinGroupFlow.d.ts +12 -0
- package/dist/hooks/session/useJoinGroupFlow.d.ts.map +1 -0
- package/dist/hooks/session/useJoinGroupFlow.js +59 -0
- package/dist/hooks/session/useJoinSession.d.ts +3 -0
- package/dist/hooks/session/useJoinSession.d.ts.map +1 -0
- package/dist/hooks/session/useJoinSession.js +38 -0
- package/dist/hooks/user/useCurrentUserAccountType.d.ts +3 -0
- package/dist/hooks/user/useCurrentUserAccountType.d.ts.map +1 -0
- package/dist/hooks/user/useCurrentUserAccountType.js +30 -0
- package/dist/locales/vi/common.json +12 -2
- package/dist/services/query.d.ts +5 -0
- package/dist/services/query.d.ts.map +1 -1
- package/dist/services/query.js +5 -0
- package/dist/services/routes.d.ts +5 -0
- package/dist/services/routes.d.ts.map +1 -1
- package/dist/services/routes.js +5 -0
- package/dist/store/conversation.d.ts.map +1 -1
- package/dist/store/conversation.js +41 -12
- package/dist/store/session.js +1 -1
- package/dist/styles/global.css +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/chat.d.ts +18 -1
- package/dist/types/chat.d.ts.map +1 -1
- package/dist/types/chat.js +9 -0
- package/dist/types/dto.d.ts +87 -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/messageTransform.d.ts +5 -0
- package/dist/utils/messageTransform.d.ts.map +1 -0
- package/dist/utils/messageTransform.js +106 -0
- package/dist/utils/queryHelpers.d.ts.map +1 -1
- package/dist/utils/queryHelpers.js +2 -0
- package/package.json +1 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { MenuProps } from "antd";
|
|
2
|
+
import { TFunction } from "i18next";
|
|
3
|
+
import { IFilterSummary } from "../../store/type";
|
|
4
|
+
import { ISessionSummaryResponse } from "../../types/dto";
|
|
5
|
+
type MenuItem = Required<MenuProps>["items"][number];
|
|
6
|
+
interface SessionFilterConfig {
|
|
7
|
+
key: string;
|
|
8
|
+
labelKey: string;
|
|
9
|
+
iconName: string;
|
|
10
|
+
iconClassName?: string;
|
|
11
|
+
filter: IFilterSummary;
|
|
12
|
+
countSource: "status" | "tag";
|
|
13
|
+
teamOnly?: boolean;
|
|
14
|
+
highlighted?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare const SESSION_FILTER_CONFIGS: SessionFilterConfig[];
|
|
17
|
+
export declare const getFilterConfig: (key: string) => SessionFilterConfig | undefined;
|
|
18
|
+
interface BuildSessionMenuItemsOptions {
|
|
19
|
+
summary: ISessionSummaryResponse;
|
|
20
|
+
t: TFunction;
|
|
21
|
+
onFilterSelect: (filter: IFilterSummary) => void;
|
|
22
|
+
includeUnassigned?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export declare const buildSessionMenuItems: ({ summary, t, onFilterSelect, includeUnassigned, }: BuildSessionMenuItemsOptions) => MenuItem[];
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=sessionMenuItems.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionMenuItems.d.ts","sourceRoot":"","sources":["../../../src/components/session/sessionMenuItems.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,KAAK,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD,UAAU,mBAAmB;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,EAAE,QAAQ,GAAG,KAAK,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,sBAAsB,EAAE,mBAAmB,EA0DvD,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,oCACQ,CAAC;AAEpD,UAAU,4BAA4B;IACpC,OAAO,EAAE,uBAAuB,CAAC;IACjC,CAAC,EAAE,SAAS,CAAC;IACb,cAAc,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IACjD,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AA0BD,eAAO,MAAM,qBAAqB,GAAI,oDAKnC,4BAA4B,KAAG,QAAQ,EA4CzC,CAAC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Icon } from "../icon";
|
|
3
|
+
import { SessionStatus, SessionTag } from "../../types/chat";
|
|
4
|
+
export const SESSION_FILTER_CONFIGS = [
|
|
5
|
+
{
|
|
6
|
+
key: SessionStatus.UNASSIGNED,
|
|
7
|
+
labelKey: "unassigned",
|
|
8
|
+
iconName: "user-del-o",
|
|
9
|
+
iconClassName: "!text-amber-500",
|
|
10
|
+
filter: { status: SessionStatus.UNASSIGNED, tag: undefined },
|
|
11
|
+
countSource: "status",
|
|
12
|
+
teamOnly: true,
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
key: SessionTag.SLOW_PROCESSING,
|
|
16
|
+
labelKey: "slow_processing",
|
|
17
|
+
iconName: "warning-square-o",
|
|
18
|
+
iconClassName: "!text-red-500",
|
|
19
|
+
filter: { status: undefined, tag: SessionTag.SLOW_PROCESSING },
|
|
20
|
+
countSource: "tag",
|
|
21
|
+
highlighted: true,
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
key: SessionStatus.WAITING_PROCESS,
|
|
25
|
+
labelKey: "waiting_process",
|
|
26
|
+
iconName: "time-circle-o",
|
|
27
|
+
iconClassName: "!text-orange-400",
|
|
28
|
+
filter: { status: SessionStatus.WAITING_PROCESS, tag: undefined },
|
|
29
|
+
countSource: "status",
|
|
30
|
+
highlighted: true,
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
key: SessionTag.AWAITING_REPLY,
|
|
34
|
+
labelKey: "awaiting_reply",
|
|
35
|
+
iconName: "arrow-reply-o",
|
|
36
|
+
iconClassName: "!text-purple-500",
|
|
37
|
+
filter: { status: undefined, tag: SessionTag.AWAITING_REPLY },
|
|
38
|
+
countSource: "tag",
|
|
39
|
+
highlighted: true,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
key: SessionStatus.IN_PROCESS,
|
|
43
|
+
labelKey: "in_process",
|
|
44
|
+
iconName: "play-circle-o",
|
|
45
|
+
filter: { status: SessionStatus.IN_PROCESS, tag: undefined },
|
|
46
|
+
countSource: "status",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
key: SessionTag.TEMPORARILY_PAUSED,
|
|
50
|
+
labelKey: "temporarily_paused",
|
|
51
|
+
iconName: "pause-o",
|
|
52
|
+
filter: { status: undefined, tag: SessionTag.TEMPORARILY_PAUSED },
|
|
53
|
+
countSource: "tag",
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
key: SessionStatus.COMPLETED,
|
|
57
|
+
labelKey: "closed_sessions",
|
|
58
|
+
iconName: "check-square-o",
|
|
59
|
+
filter: { status: SessionStatus.COMPLETED, tag: undefined },
|
|
60
|
+
countSource: "status",
|
|
61
|
+
},
|
|
62
|
+
];
|
|
63
|
+
export const getFilterConfig = (key) => SESSION_FILTER_CONFIGS.find((c) => c.key === key);
|
|
64
|
+
const countBadge = (count, highlighted) => {
|
|
65
|
+
if (!count)
|
|
66
|
+
return null;
|
|
67
|
+
if (highlighted) {
|
|
68
|
+
return (_jsx("span", { className: "text-xs font-medium text-white bg-red-500 rounded-full px-1.5 py-0.5 leading-none -mr-1.5", children: count }));
|
|
69
|
+
}
|
|
70
|
+
return _jsx("span", { className: "text-xs text-gray-500", children: count });
|
|
71
|
+
};
|
|
72
|
+
const getCount = (config, summary) => {
|
|
73
|
+
var _a, _b, _c, _d;
|
|
74
|
+
if (config.countSource === "status") {
|
|
75
|
+
return (((_b = (_a = summary.sessionStatuses) === null || _a === void 0 ? void 0 : _a.find((s) => s.type === config.key)) === null || _b === void 0 ? void 0 : _b.count) || "");
|
|
76
|
+
}
|
|
77
|
+
return ((_d = (_c = summary.tagCounts) === null || _c === void 0 ? void 0 : _c.find((s) => s.type === config.key)) === null || _d === void 0 ? void 0 : _d.count) || "";
|
|
78
|
+
};
|
|
79
|
+
export const buildSessionMenuItems = ({ summary, t, onFilterSelect, includeUnassigned = false, }) => {
|
|
80
|
+
const activeConfigs = SESSION_FILTER_CONFIGS.filter((c) => c.key !== SessionStatus.COMPLETED &&
|
|
81
|
+
(!c.teamOnly || includeUnassigned));
|
|
82
|
+
const activeChildren = activeConfigs.map((config) => ({
|
|
83
|
+
label: t(config.labelKey),
|
|
84
|
+
key: config.key,
|
|
85
|
+
icon: (_jsx(Icon, { icon: config.iconName, size: 18, className: config.iconClassName })),
|
|
86
|
+
onClick: () => onFilterSelect(config.filter),
|
|
87
|
+
itemIcon: countBadge(getCount(config, summary), config.highlighted),
|
|
88
|
+
}));
|
|
89
|
+
const closedConfig = SESSION_FILTER_CONFIGS.find((c) => c.key === SessionStatus.COMPLETED);
|
|
90
|
+
const closedItem = closedConfig
|
|
91
|
+
? {
|
|
92
|
+
label: t(closedConfig.labelKey),
|
|
93
|
+
key: closedConfig.key,
|
|
94
|
+
icon: _jsx(Icon, { icon: closedConfig.iconName, size: 20 }),
|
|
95
|
+
onClick: () => onFilterSelect(closedConfig.filter),
|
|
96
|
+
itemIcon: countBadge(summary.completedSessionCount),
|
|
97
|
+
}
|
|
98
|
+
: null;
|
|
99
|
+
return [
|
|
100
|
+
{
|
|
101
|
+
label: t("active_sessions"),
|
|
102
|
+
key: "ACTIVE_SESSIONS",
|
|
103
|
+
icon: _jsx(Icon, { icon: "chat-dot-o", size: 20 }),
|
|
104
|
+
children: activeChildren,
|
|
105
|
+
},
|
|
106
|
+
closedItem,
|
|
107
|
+
].filter(Boolean);
|
|
108
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ConversationItem } from "@openim/wasm-client-sdk";
|
|
2
|
+
interface UseConversationPreviewParams {
|
|
3
|
+
conversation?: ConversationItem | null;
|
|
4
|
+
ownerUserID?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const useConversationPreview: ({ conversation, ownerUserID, }: UseConversationPreviewParams) => {
|
|
7
|
+
latestMsg: string;
|
|
8
|
+
latestMsgSendTime: number;
|
|
9
|
+
isLoadingPreview: boolean;
|
|
10
|
+
};
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=useConversationPreview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConversationPreview.d.ts","sourceRoot":"","sources":["../../../src/hooks/conversation/useConversationPreview.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAe,MAAM,yBAAyB,CAAC;AAIxE,UAAU,4BAA4B;IACpC,YAAY,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,sBAAsB,GAAI,gCAGpC,4BAA4B;;;;CA6B9B,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { usePullSessionMessages } from "../message/usePullSessionMessages";
|
|
4
|
+
export const useConversationPreview = ({ conversation, ownerUserID, }) => {
|
|
5
|
+
var _a;
|
|
6
|
+
const hasPreview = Boolean(conversation === null || conversation === void 0 ? void 0 : conversation.latestMsg) && ((_a = conversation === null || conversation === void 0 ? void 0 : conversation.latestMsgSendTime) !== null && _a !== void 0 ? _a : 0) > 0;
|
|
7
|
+
const shouldFetchPreview = Boolean((conversation === null || conversation === void 0 ? void 0 : conversation.isNotInGroup) && (conversation === null || conversation === void 0 ? void 0 : conversation.conversationID) && ownerUserID) &&
|
|
8
|
+
!hasPreview;
|
|
9
|
+
const { data: messages, isLoading } = usePullSessionMessages({
|
|
10
|
+
conversationID: conversation === null || conversation === void 0 ? void 0 : conversation.conversationID,
|
|
11
|
+
userID: ownerUserID,
|
|
12
|
+
enabled: shouldFetchPreview,
|
|
13
|
+
});
|
|
14
|
+
const latestMessage = useMemo(() => messages === null || messages === void 0 ? void 0 : messages[0], [messages]);
|
|
15
|
+
return useMemo(() => ({
|
|
16
|
+
latestMsg: (conversation === null || conversation === void 0 ? void 0 : conversation.latestMsg) || (latestMessage ? JSON.stringify(latestMessage) : ""),
|
|
17
|
+
latestMsgSendTime: (conversation === null || conversation === void 0 ? void 0 : conversation.latestMsgSendTime) && conversation.latestMsgSendTime > 0
|
|
18
|
+
? conversation.latestMsgSendTime
|
|
19
|
+
: (latestMessage === null || latestMessage === void 0 ? void 0 : latestMessage.sendTime) || 0,
|
|
20
|
+
isLoadingPreview: isLoading,
|
|
21
|
+
}), [conversation === null || conversation === void 0 ? void 0 : conversation.latestMsg, conversation === null || conversation === void 0 ? void 0 : conversation.latestMsgSendTime, latestMessage, isLoading]);
|
|
22
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { MessageItem } from "@openim/wasm-client-sdk";
|
|
2
|
+
interface UseConversationMessagesParams {
|
|
3
|
+
conversationId?: string;
|
|
4
|
+
searchClientMsgID?: string;
|
|
5
|
+
restrictToLastSession?: boolean;
|
|
6
|
+
customerUserID?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const useConversationMessages: ({ conversationId, searchClientMsgID, restrictToLastSession, customerUserID, }: UseConversationMessagesParams) => {
|
|
9
|
+
loadState: {
|
|
10
|
+
initLoading: boolean;
|
|
11
|
+
hasMoreOld: boolean;
|
|
12
|
+
hasMoreNew: boolean;
|
|
13
|
+
messageList: MessageItem[];
|
|
14
|
+
};
|
|
15
|
+
latestLoadState: import("react").RefObject<{
|
|
16
|
+
initLoading: boolean;
|
|
17
|
+
hasMoreOld: boolean;
|
|
18
|
+
hasMoreNew: boolean;
|
|
19
|
+
messageList: MessageItem[];
|
|
20
|
+
}>;
|
|
21
|
+
moreOldLoading: boolean;
|
|
22
|
+
getMoreOldMessages: (loadMore?: any) => Promise<void>;
|
|
23
|
+
moreNewLoading: boolean;
|
|
24
|
+
getMoreNewMessages: (loadMore?: any) => Promise<void>;
|
|
25
|
+
};
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=useConversationMessages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConversationMessages.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useConversationMessages.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,UAAU,6BAA6B;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,uBAAuB,GAAI,+EAKrC,6BAA6B;;;;;;;;;;;;;;;;;CAkC/B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { useMessage } from "./useMessage";
|
|
4
|
+
import { usePullSessionMessages } from "./usePullSessionMessages";
|
|
5
|
+
export const useConversationMessages = ({ conversationId, searchClientMsgID, restrictToLastSession = false, customerUserID, }) => {
|
|
6
|
+
const sdkMessages = useMessage(conversationId, searchClientMsgID);
|
|
7
|
+
const { data: pulledMessages, isLoading: isPullLoading, isFetching: isPullFetching, } = usePullSessionMessages({
|
|
8
|
+
conversationID: conversationId,
|
|
9
|
+
userID: customerUserID,
|
|
10
|
+
enabled: restrictToLastSession,
|
|
11
|
+
});
|
|
12
|
+
const lastSessionState = useMemo(() => ({
|
|
13
|
+
initLoading: isPullLoading || isPullFetching,
|
|
14
|
+
hasMoreOld: false,
|
|
15
|
+
hasMoreNew: false,
|
|
16
|
+
messageList: pulledMessages !== null && pulledMessages !== void 0 ? pulledMessages : [],
|
|
17
|
+
}), [isPullLoading, isPullFetching, pulledMessages]);
|
|
18
|
+
if (restrictToLastSession) {
|
|
19
|
+
return {
|
|
20
|
+
loadState: lastSessionState,
|
|
21
|
+
latestLoadState: { current: lastSessionState },
|
|
22
|
+
moreOldLoading: false,
|
|
23
|
+
getMoreOldMessages: async () => undefined,
|
|
24
|
+
moreNewLoading: false,
|
|
25
|
+
getMoreNewMessages: async () => undefined,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return sdkMessages;
|
|
29
|
+
};
|
|
@@ -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,yBAAyB,CAAC;AAQjC,eAAO,MAAM,kBAAkB,eAe9B,CAAC;AAEF,eAAO,MAAM,UAAU,GACrB,iBAAiB,MAAM,EACvB,oBAAoB,MAAM;;;;;qBAML,WAAW,EAAE;;;;;;qBAAb,WAAW,EAAE;;;;;;
|
|
1
|
+
{"version":3,"file":"useMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useMessage.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,WAAW,EACX,WAAW,EAEZ,MAAM,yBAAyB,CAAC;AAQjC,eAAO,MAAM,kBAAkB,eAe9B,CAAC;AAEF,eAAO,MAAM,UAAU,GACrB,iBAAiB,MAAM,EACvB,oBAAoB,MAAM;;;;;qBAML,WAAW,EAAE;;;;;;qBAAb,WAAW,EAAE;;;;;;CAiPnC,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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { MessageItem } from "@openim/wasm-client-sdk";
|
|
2
|
+
interface UsePullSessionMessagesParams {
|
|
3
|
+
conversationID?: string;
|
|
4
|
+
userID?: string;
|
|
5
|
+
enabled?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare const usePullSessionMessages: ({ conversationID, userID, enabled, }: UsePullSessionMessagesParams) => import("@tanstack/react-query").UseQueryResult<MessageItem[], Error>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=usePullSessionMessages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePullSessionMessages.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/usePullSessionMessages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAetD,UAAU,4BAA4B;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,sBAAsB,GAAI,sCAIpC,4BAA4B,yEA4B9B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { useQuery } from "@tanstack/react-query";
|
|
2
|
+
import { apiInstance } from "../../services/api";
|
|
3
|
+
import { ENDPOINTS } from "../../services/routes";
|
|
4
|
+
import { QUERY_KEYS } from "../../services/query";
|
|
5
|
+
import useAuthStore from "../../store/auth";
|
|
6
|
+
import { sortMessagesDesc, transformPulledMessage, } from "../../utils/messageTransform";
|
|
7
|
+
export const usePullSessionMessages = ({ conversationID, userID, enabled = true, }) => {
|
|
8
|
+
const applicationType = useAuthStore((state) => state.applicationType);
|
|
9
|
+
const query = useQuery({
|
|
10
|
+
queryKey: [QUERY_KEYS.PULL_SESSION_MESSAGES, conversationID, userID],
|
|
11
|
+
enabled: Boolean(enabled && conversationID && userID),
|
|
12
|
+
queryFn: async () => {
|
|
13
|
+
var _a, _b, _c, _d;
|
|
14
|
+
const payload = {
|
|
15
|
+
conversationID: conversationID !== null && conversationID !== void 0 ? conversationID : "",
|
|
16
|
+
userID: userID !== null && userID !== void 0 ? userID : "",
|
|
17
|
+
applicationType,
|
|
18
|
+
};
|
|
19
|
+
const res = await apiInstance.post(ENDPOINTS.chatService.pullSessionMessages, payload);
|
|
20
|
+
const group = (_c = (_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.msgs) === null || _c === void 0 ? void 0 : _c[conversationID !== null && conversationID !== void 0 ? conversationID : ""];
|
|
21
|
+
const rawList = (_d = group === null || group === void 0 ? void 0 : group.Msgs) !== null && _d !== void 0 ? _d : [];
|
|
22
|
+
const messageList = sortMessagesDesc(rawList.map(transformPulledMessage));
|
|
23
|
+
return messageList;
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
return query;
|
|
27
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { MergerMsgParams, MessageItem } from "@openim/wasm-client-sdk";
|
|
2
2
|
import { ExtendMessageInfo, FileMsgParamsByFile, ImageMsgParamsByFile, VideoMsgParamsByFile } from "../../types/chat";
|
|
3
3
|
import { UploadFile } from "antd";
|
|
4
|
-
import {
|
|
4
|
+
import { ISessionResponse } from "../../types/dto";
|
|
5
5
|
export declare const isMediaResendable: (message: {
|
|
6
6
|
clientMsgID: string;
|
|
7
7
|
contentType: number;
|
|
@@ -14,21 +14,23 @@ export declare const createFileMessageByFile: (file: FileMsgParamsByFile) => Pro
|
|
|
14
14
|
export declare const createUrlTextMessage: (text: string, urls: string[]) => Promise<MessageItem | null>;
|
|
15
15
|
export declare const createQuoteMessage: (text: string, quotedMessage: MessageItem) => Promise<MessageItem | null>;
|
|
16
16
|
export declare const useSendMessage: () => {
|
|
17
|
-
sendTextMessage: ({ plainText, richText, currentSession, }: {
|
|
17
|
+
sendTextMessage: ({ plainText, richText, currentSession, isInternal, }: {
|
|
18
18
|
plainText: string;
|
|
19
19
|
richText: string;
|
|
20
|
-
currentSession?:
|
|
20
|
+
currentSession?: ISessionResponse;
|
|
21
|
+
isInternal: boolean;
|
|
21
22
|
}) => Promise<void>;
|
|
22
|
-
sendMergeMessage: ({ richText, plainText, files, currentSession, }: {
|
|
23
|
+
sendMergeMessage: ({ richText, plainText, files, currentSession, isInternal, }: {
|
|
23
24
|
richText: string;
|
|
24
25
|
plainText: string;
|
|
25
26
|
files: UploadFile[];
|
|
26
|
-
currentSession?:
|
|
27
|
+
currentSession?: ISessionResponse;
|
|
28
|
+
isInternal: boolean;
|
|
27
29
|
}) => Promise<void>;
|
|
28
30
|
resendMessage: (failedMessage: MessageItem) => Promise<void>;
|
|
29
31
|
};
|
|
30
32
|
export declare const generateExtendMessageInfo: ({ richText, currentSession, }: {
|
|
31
33
|
richText?: string;
|
|
32
|
-
currentSession?:
|
|
34
|
+
currentSession?: ISessionResponse;
|
|
33
35
|
}) => ExtendMessageInfo;
|
|
34
36
|
//# 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,WAAW,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,kBAAkB,CAAC;AAW1B,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAQlC,OAAO,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"useSendMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useSendMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,WAAW,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,kBAAkB,CAAC;AAW1B,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAQlC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAenD,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,kBAAkB,GAC7B,MAAM,MAAM,EACZ,eAAe,WAAW,gCAc3B,CAAC;AAEF,eAAO,MAAM,cAAc;4EA4KpB;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,CAAC,EAAE,gBAAgB,CAAC;QAClC,UAAU,EAAE,OAAO,CAAC;KACrB;oFAoCE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,UAAU,EAAE,CAAC;QACpB,cAAc,CAAC,EAAE,gBAAgB,CAAC;QAClC,UAAU,EAAE,OAAO,CAAC;KACrB;mCA7JqB,WAAW;CA8RpC,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,+BAGvC;IACD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,gBAAgB,CAAC;CACnC,KAWM,iBACN,CAAC"}
|
|
@@ -105,7 +105,7 @@ export const useSendMessage = () => {
|
|
|
105
105
|
const setQuotedMessage = useConversationStore((state) => state.setQuotedMessage);
|
|
106
106
|
const { userID: recvID, groupID } = conversationData || {};
|
|
107
107
|
const dispatchMessage = useCallback(async (message) => {
|
|
108
|
-
var _a;
|
|
108
|
+
var _a, _b;
|
|
109
109
|
const desc = generateContentBasedOnMessageType(message.contentType, ((_a = message === null || message === void 0 ? void 0 : message.textElem) === null || _a === void 0 ? void 0 : _a.content) || "") || t("new_message");
|
|
110
110
|
const { data: successMessage } = await DChatSDK.sendMessage({
|
|
111
111
|
recvID: recvID || "",
|
|
@@ -124,7 +124,7 @@ export const useSendMessage = () => {
|
|
|
124
124
|
iOSBadgeCount: true,
|
|
125
125
|
},
|
|
126
126
|
});
|
|
127
|
-
updateOneMessage(successMessage);
|
|
127
|
+
updateOneMessage(Object.assign(Object.assign({}, successMessage), { isInternal: (_b = successMessage.isInternal) !== null && _b !== void 0 ? _b : message.isInternal }));
|
|
128
128
|
messageFileStore.delete(message.clientMsgID);
|
|
129
129
|
}, [recvID, groupID]);
|
|
130
130
|
const sendMessage = useCallback(async (message) => {
|
|
@@ -160,7 +160,7 @@ export const useSendMessage = () => {
|
|
|
160
160
|
clientMsgID: failedMessage.clientMsgID,
|
|
161
161
|
});
|
|
162
162
|
removeOneMessage(failedMessage.clientMsgID);
|
|
163
|
-
await sendMessage(Object.assign(Object.assign({}, newTextPayload), { ex: failedMessage.ex }));
|
|
163
|
+
await sendMessage(Object.assign(Object.assign({}, newTextPayload), { ex: failedMessage.ex, isInternal: failedMessage.isInternal }));
|
|
164
164
|
return;
|
|
165
165
|
}
|
|
166
166
|
let newPayload = null;
|
|
@@ -216,9 +216,9 @@ export const useSendMessage = () => {
|
|
|
216
216
|
clientMsgID: failedMessage.clientMsgID,
|
|
217
217
|
});
|
|
218
218
|
removeOneMessage(failedMessage.clientMsgID);
|
|
219
|
-
await sendMessage(Object.assign(Object.assign({}, newPayload), { ex: failedMessage.ex }));
|
|
219
|
+
await sendMessage(Object.assign(Object.assign({}, newPayload), { ex: failedMessage.ex, isInternal: failedMessage.isInternal }));
|
|
220
220
|
}, [sendMessage]);
|
|
221
|
-
const sendTextMessage = useCallback(async ({ plainText, richText, currentSession, }) => {
|
|
221
|
+
const sendTextMessage = useCallback(async ({ plainText, richText, currentSession, isInternal, }) => {
|
|
222
222
|
if (!recvID && !groupID)
|
|
223
223
|
return;
|
|
224
224
|
const urls = extractLinks(plainText);
|
|
@@ -240,10 +240,10 @@ export const useSendMessage = () => {
|
|
|
240
240
|
richText,
|
|
241
241
|
currentSession,
|
|
242
242
|
});
|
|
243
|
-
let messageItem = Object.assign(Object.assign({}, message), { ex: JSON.stringify(extendMessageInfo) || "{}" });
|
|
243
|
+
let messageItem = Object.assign(Object.assign({}, message), { ex: JSON.stringify(extendMessageInfo) || "{}", isInternal });
|
|
244
244
|
sendMessage(messageItem);
|
|
245
245
|
}, [recvID, groupID, user, sendMessage, quotedMessage, setQuotedMessage]);
|
|
246
|
-
const sendMergeMessage = useCallback(async ({ richText, plainText, files, currentSession, }) => {
|
|
246
|
+
const sendMergeMessage = useCallback(async ({ richText, plainText, files, currentSession, isInternal, }) => {
|
|
247
247
|
if (!recvID && !groupID)
|
|
248
248
|
return;
|
|
249
249
|
const messageList = [];
|
|
@@ -354,7 +354,7 @@ export const useSendMessage = () => {
|
|
|
354
354
|
richText: (message === null || message === void 0 ? void 0 : message.contentType) === MessageType.TextMessage ? richText : "",
|
|
355
355
|
currentSession,
|
|
356
356
|
});
|
|
357
|
-
const mMessage = Object.assign(Object.assign({}, message), { ex: JSON.stringify(extendMessageInfo) || "{}" });
|
|
357
|
+
const mMessage = Object.assign(Object.assign({}, message), { ex: JSON.stringify(extendMessageInfo) || "{}", isInternal });
|
|
358
358
|
await sendMessage(mMessage);
|
|
359
359
|
}
|
|
360
360
|
}, [recvID, groupID, sendMessage, quotedMessage, setQuotedMessage]);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { SessionType } from "@openim/wasm-client-sdk";
|
|
2
|
+
interface UseConversationSessionStateParams {
|
|
3
|
+
conversationId: string;
|
|
4
|
+
conversationType?: SessionType;
|
|
5
|
+
groupId?: string;
|
|
6
|
+
userID?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const useConversationSessionState: ({ conversationId, conversationType, groupId, userID, }: UseConversationSessionStateParams) => {
|
|
9
|
+
isGroupConversation: boolean;
|
|
10
|
+
groupId: string | undefined;
|
|
11
|
+
isJoined: boolean | null;
|
|
12
|
+
latestConversationSession: import("../../types/dto").ISessionResponse | undefined;
|
|
13
|
+
isSessionMember: boolean;
|
|
14
|
+
isMember: boolean;
|
|
15
|
+
isNotGroupMember: boolean;
|
|
16
|
+
customerUserID: string;
|
|
17
|
+
refetchIsJoined: () => Promise<void>;
|
|
18
|
+
refetchConversationSessions: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("../../types/dto").ISessionResponse[], Error>>;
|
|
19
|
+
};
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=useConversationSessionState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useConversationSessionState.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useConversationSessionState.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAMtD,UAAU,iCAAiC;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,2BAA2B,GAAI,wDAKzC,iCAAiC;;;;;;;;;;;CA4CnC,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { useGetListSessionByConversation } from "./useGetListSessionByConversation";
|
|
4
|
+
import { useIsJoinedGroup } from "./useIsJoinedGroup";
|
|
5
|
+
import { isGroupSession } from "../../utils/imCommon";
|
|
6
|
+
export const useConversationSessionState = ({ conversationId, conversationType, groupId, userID, }) => {
|
|
7
|
+
var _a;
|
|
8
|
+
const isGroupConversation = isGroupSession(conversationType);
|
|
9
|
+
const currentGroupId = isGroupConversation ? groupId : undefined;
|
|
10
|
+
const { isJoined, refetch: refetchIsJoined } = useIsJoinedGroup(currentGroupId);
|
|
11
|
+
const { data: conversationSessions, refetch: refetchConversationSessions, } = useGetListSessionByConversation({
|
|
12
|
+
conversationId,
|
|
13
|
+
});
|
|
14
|
+
const latestConversationSession = useMemo(() => {
|
|
15
|
+
if (!(conversationSessions === null || conversationSessions === void 0 ? void 0 : conversationSessions.length))
|
|
16
|
+
return undefined;
|
|
17
|
+
return [...conversationSessions].sort((a, b) => new Date(b.createdDate).getTime() - new Date(a.createdDate).getTime())[0];
|
|
18
|
+
}, [conversationSessions]);
|
|
19
|
+
const isSessionMember = useMemo(() => {
|
|
20
|
+
var _a, _b;
|
|
21
|
+
if (!latestConversationSession || !userID)
|
|
22
|
+
return false;
|
|
23
|
+
if (latestConversationSession.supporterId === userID)
|
|
24
|
+
return true;
|
|
25
|
+
return (_b = (_a = latestConversationSession.priorSupporterIds) === null || _a === void 0 ? void 0 : _a.includes(userID)) !== null && _b !== void 0 ? _b : false;
|
|
26
|
+
}, [latestConversationSession, userID]);
|
|
27
|
+
const isMember = isJoined === true || isSessionMember;
|
|
28
|
+
const isNotGroupMember = isGroupConversation && isJoined !== null && !isMember;
|
|
29
|
+
return {
|
|
30
|
+
isGroupConversation,
|
|
31
|
+
groupId: currentGroupId,
|
|
32
|
+
isJoined,
|
|
33
|
+
latestConversationSession,
|
|
34
|
+
isSessionMember,
|
|
35
|
+
isMember,
|
|
36
|
+
isNotGroupMember,
|
|
37
|
+
customerUserID: (_a = latestConversationSession === null || latestConversationSession === void 0 ? void 0 : latestConversationSession.ownerId) !== null && _a !== void 0 ? _a : "",
|
|
38
|
+
refetchIsJoined,
|
|
39
|
+
refetchConversationSessions,
|
|
40
|
+
};
|
|
41
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGetSession.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useGetSession.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useGetSession.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useGetSession.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,YAAY,EAIb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAOpE,UAAU,kBAAkB;IAC1B,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;CACH;AA2JD,eAAO,MAAM,aAAa,GAAI,sBAG3B,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyEpB,CAAC"}
|