@droppii-org/chat-sdk 0.1.19 → 0.1.21
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/conversation/ConversationBySessionItem.d.ts +3 -1
- package/dist/components/conversation/ConversationBySessionItem.d.ts.map +1 -1
- package/dist/components/conversation/ConversationBySessionItem.js +4 -7
- package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
- package/dist/components/conversation/DeskConversationList.js +6 -2
- package/dist/components/message/GroupMembersDrawer.d.ts +4 -1
- package/dist/components/message/GroupMembersDrawer.d.ts.map +1 -1
- package/dist/components/message/GroupMembersDrawer.js +39 -5
- 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 +3 -4
- package/dist/components/message/MessageList.d.ts.map +1 -1
- package/dist/components/message/MessageList.js +8 -11
- package/dist/components/message/UnassignedSessionFooter.d.ts +7 -0
- package/dist/components/message/UnassignedSessionFooter.d.ts.map +1 -0
- package/dist/components/message/UnassignedSessionFooter.js +26 -0
- package/dist/components/message/footer/ActionBar.d.ts.map +1 -1
- package/dist/components/message/footer/ActionBar.js +4 -1
- package/dist/components/message/footer/EnterHandler.d.ts.map +1 -1
- package/dist/components/message/footer/EnterHandler.js +20 -2
- package/dist/components/message/footer/SessionClosedModal.d.ts +10 -0
- package/dist/components/message/footer/SessionClosedModal.d.ts.map +1 -0
- package/dist/components/message/footer/SessionClosedModal.js +9 -0
- package/dist/components/message/footer/index.d.ts.map +1 -1
- package/dist/components/message/footer/index.js +103 -18
- package/dist/components/message/item/SystemLogMessage.d.ts.map +1 -1
- package/dist/components/message/item/SystemLogMessage.js +9 -10
- package/dist/components/searchConversation/SearchAll.d.ts.map +1 -1
- package/dist/components/searchConversation/SearchAll.js +5 -3
- package/dist/components/searchConversation/SearchConversationAsMessages.d.ts.map +1 -1
- package/dist/components/searchConversation/SearchConversationAsMessages.js +1 -1
- package/dist/components/searchConversation/SearchConversationAsUsers.js +1 -1
- package/dist/components/searchConversation/SearchConversationMyInbox.d.ts +6 -0
- package/dist/components/searchConversation/SearchConversationMyInbox.d.ts.map +1 -0
- package/dist/components/searchConversation/SearchConversationMyInbox.js +24 -0
- package/dist/components/searchConversation/SearchDrawer.js +10 -10
- package/dist/components/searchConversation/SearchMessageOnCurrentConversation.d.ts.map +1 -1
- package/dist/components/searchConversation/SearchMessageOnCurrentConversation.js +1 -1
- package/dist/components/searchConversation/index.d.ts +1 -0
- package/dist/components/searchConversation/index.d.ts.map +1 -1
- package/dist/components/searchConversation/index.js +8 -1
- package/dist/components/searchConversation/item/SearchItemAsMessage.d.ts +1 -0
- package/dist/components/searchConversation/item/SearchItemAsMessage.d.ts.map +1 -1
- package/dist/components/searchConversation/item/SearchItemAsMessage.js +4 -4
- package/dist/components/thread/ManualAssignPopover.d.ts +5 -2
- package/dist/components/thread/ManualAssignPopover.d.ts.map +1 -1
- package/dist/components/thread/ManualAssignPopover.js +40 -21
- package/dist/components/thread/SessionSection.d.ts.map +1 -1
- package/dist/components/thread/SessionSection.js +4 -2
- package/dist/components/thread/ThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/ThreadInfo.js +2 -1
- package/dist/constants/index.d.ts +6 -1
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +6 -1
- package/dist/hooks/cannedResponse/useFetchCannedResponse.js +2 -2
- package/dist/hooks/global/useGlobalEvent.d.ts.map +1 -1
- package/dist/hooks/global/useGlobalEvent.js +11 -0
- package/dist/hooks/group/useGroupMembers.d.ts.map +1 -1
- package/dist/hooks/group/useGroupMembers.js +17 -0
- package/dist/hooks/message/useMessage.js +5 -5
- package/dist/hooks/message/usePullSessionMessages.d.ts +2 -0
- package/dist/hooks/message/usePullSessionMessages.d.ts.map +1 -1
- package/dist/hooks/message/usePullSessionMessages.js +18 -15
- package/dist/hooks/search/useSearchMessage.d.ts +2 -1
- package/dist/hooks/search/useSearchMessage.d.ts.map +1 -1
- package/dist/hooks/search/useSearchMessage.js +9 -9
- package/dist/hooks/session/useAssignSession.d.ts +4 -0
- package/dist/hooks/session/useAssignSession.d.ts.map +1 -1
- package/dist/hooks/session/useAssignSession.js +44 -11
- package/dist/hooks/session/useConversationSessionState.d.ts +1 -8
- package/dist/hooks/session/useConversationSessionState.d.ts.map +1 -1
- package/dist/hooks/session/useConversationSessionState.js +2 -25
- package/dist/hooks/session/useGetListSessionByConversation.d.ts.map +1 -1
- package/dist/hooks/session/useGetListSessionByConversation.js +2 -1
- package/dist/hooks/session/useGetSession.d.ts.map +1 -1
- package/dist/hooks/session/useGetSession.js +2 -2
- package/dist/hooks/session/useGetTeamSupporters.d.ts +2 -1
- package/dist/hooks/session/useGetTeamSupporters.d.ts.map +1 -1
- package/dist/hooks/session/useGetTeamSupporters.js +2 -2
- package/dist/hooks/session/useIsJoinedGroup.d.ts +1 -1
- package/dist/hooks/session/useIsJoinedGroup.d.ts.map +1 -1
- package/dist/hooks/session/useIsJoinedGroup.js +13 -19
- package/dist/hooks/session/useJoinGroupFlow.d.ts +8 -6
- package/dist/hooks/session/useJoinGroupFlow.d.ts.map +1 -1
- package/dist/hooks/session/useJoinGroupFlow.js +19 -57
- package/dist/hooks/session/useJoinSession.d.ts.map +1 -1
- package/dist/hooks/session/useJoinSession.js +3 -0
- package/dist/hooks/session/useLeaveConversation.d.ts +5 -0
- package/dist/hooks/session/useLeaveConversation.d.ts.map +1 -0
- package/dist/hooks/session/useLeaveConversation.js +35 -0
- package/dist/hooks/session/useReopenOrCreateSession.d.ts +4 -0
- package/dist/hooks/session/useReopenOrCreateSession.d.ts.map +1 -0
- package/dist/hooks/session/useReopenOrCreateSession.js +32 -0
- package/dist/hooks/session/useSessionLatestPreview.d.ts +7 -0
- package/dist/hooks/session/useSessionLatestPreview.d.ts.map +1 -0
- package/dist/hooks/session/useSessionLatestPreview.js +82 -0
- package/dist/hooks/session/useSortedSessions.d.ts +4 -0
- package/dist/hooks/session/useSortedSessions.d.ts.map +1 -0
- package/dist/hooks/session/useSortedSessions.js +13 -0
- package/dist/hooks/session/useSyncGroupStateAfterJoin.d.ts +9 -0
- package/dist/hooks/session/useSyncGroupStateAfterJoin.d.ts.map +1 -0
- package/dist/hooks/session/useSyncGroupStateAfterJoin.js +23 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/locales/vi/common.json +18 -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 +4 -0
- package/dist/services/routes.d.ts.map +1 -1
- package/dist/services/routes.js +4 -0
- package/dist/store/conversation.d.ts.map +1 -1
- package/dist/store/conversation.js +5 -2
- package/dist/styles/global.css +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/chat.d.ts +1 -1
- package/dist/types/chat.d.ts.map +1 -1
- package/dist/types/dto.d.ts +4 -0
- package/dist/types/dto.d.ts.map +1 -1
- package/dist/utils/events.d.ts +2 -0
- package/dist/utils/events.d.ts.map +1 -1
- package/dist/utils/messageLog.d.ts +1 -1
- package/dist/utils/messageLog.d.ts.map +1 -1
- package/dist/utils/messageLog.js +23 -6
- package/dist/utils/messageTransform.d.ts.map +1 -1
- package/dist/utils/messageTransform.js +1 -1
- package/dist/utils/queryHelpers.d.ts +1 -1
- package/dist/utils/queryHelpers.d.ts.map +1 -1
- package/dist/utils/queryHelpers.js +1 -1
- package/package.json +1 -1
|
@@ -1,30 +1,25 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import { useState } from "react";
|
|
3
|
-
import { Popover, Input, Avatar, Spin, Badge } from "antd";
|
|
3
|
+
import { Popover, Input, Avatar, Spin, Badge, Divider } from "antd";
|
|
4
4
|
import { useTranslation } from "react-i18next";
|
|
5
5
|
import clsx from "clsx";
|
|
6
6
|
import { Icon } from "../icon";
|
|
7
7
|
import { useGetTeamSupporters } from "../../hooks/session/useGetTeamSupporters";
|
|
8
|
-
import { useAssignSession } from "../../hooks/session/useAssignSession";
|
|
9
|
-
import { useQueryClient } from "@tanstack/react-query";
|
|
8
|
+
import { useAssignSession, useAutoAssignSession, } from "../../hooks/session/useAssignSession";
|
|
10
9
|
import { message as antdMessage } from "antd";
|
|
11
|
-
import { invalidateSessionQueries } from "../../utils/queryHelpers";
|
|
12
10
|
import AssignConfirmModal from "./AssignConfirmModal";
|
|
13
11
|
import { useDebounce } from "ahooks";
|
|
14
12
|
import useAuthStore from "../../store/auth";
|
|
15
13
|
const SEARCH_DEBOUNCE_WAIT = 300;
|
|
16
|
-
const SupporterItem = ({ supporter, onClick,
|
|
14
|
+
const SupporterItem = ({ supporter, onClick, isCurrentUser, }) => {
|
|
17
15
|
var _a;
|
|
18
16
|
const { t } = useTranslation();
|
|
19
17
|
const isOnline = supporter.status === "ONLINE";
|
|
20
|
-
return (_jsxs("div", { role: "option", tabIndex: 0, "
|
|
21
|
-
? "bg-blue-50 border border-blue-200 pointer-events-none"
|
|
22
|
-
: "cursor-pointer hover:bg-gray-50"), onClick: () => onClick(supporter), children: [_jsx(Badge, { dot: true, color: isOnline ? "#52c41a" : "#d9d9d9", offset: [-2, 24], children: _jsx(Avatar, { src: supporter.avatar, size: 32, children: ((_a = supporter.displayName) === null || _a === void 0 ? void 0 : _a.charAt(0)) || "A" }) }), _jsxs("div", { className: "flex items-center gap-2 min-w-0 flex-1", children: [_jsx("span", { className: "text-sm truncate", children: supporter.displayName }), isCurrentUser && (_jsx("span", { className: "text-xs text-blue-500 shrink-0", children: t("current_account") }))] }), _jsx("div", { className: "flex items-center gap-2 shrink-0", children: isCurrentAssignee && (_jsx("span", { className: "text-xs text-blue-500 shrink-0", children: t("manual_assign_current") })) })] }));
|
|
18
|
+
return (_jsxs("div", { role: "option", tabIndex: 0, className: "flex items-center gap-3 px-3 py-2 rounded-md transition-colors cursor-pointer hover:bg-gray-50", onClick: () => onClick(supporter), children: [_jsx(Badge, { dot: true, color: isOnline ? "#52c41a" : "#d9d9d9", offset: [-2, 24], children: _jsx(Avatar, { src: supporter.avatar, size: 32, children: ((_a = supporter.displayName) === null || _a === void 0 ? void 0 : _a.charAt(0)) || "A" }) }), _jsxs("div", { className: "flex items-center gap-2 min-w-0 flex-1", children: [_jsx("span", { className: "text-sm truncate", children: supporter.displayName }), isCurrentUser && (_jsx("span", { className: "text-xs text-blue-500 shrink-0", children: t("current_account") }))] }), _jsx("div", { className: "flex items-center gap-2 shrink-0", children: !!supporter.openSessionCount && supporter.openSessionCount > 0 && (_jsxs("span", { className: "flex items-center gap-0.5 bg-blue-500 text-white text-xs font-medium px-1.5 py-0.5 rounded-full", children: [_jsx(Icon, { icon: "chat-square-b", size: 11 }), supporter.openSessionCount] })) })] }));
|
|
23
19
|
};
|
|
24
|
-
const ManualAssignPopover = ({ sessionId, supporter, teamId: propTeamId, }) => {
|
|
20
|
+
const ManualAssignPopover = ({ sessionId, supporter, teamId: propTeamId, children, excludeCurrentUser = false, }) => {
|
|
25
21
|
var _a, _b;
|
|
26
22
|
const { t } = useTranslation();
|
|
27
|
-
const queryClient = useQueryClient();
|
|
28
23
|
const authUserID = useAuthStore((state) => state.userID);
|
|
29
24
|
const [open, setOpen] = useState(false);
|
|
30
25
|
const [searchText, setSearchText] = useState("");
|
|
@@ -37,27 +32,49 @@ const ManualAssignPopover = ({ sessionId, supporter, teamId: propTeamId, }) => {
|
|
|
37
32
|
const { data: supporters, isLoading, isFetching, } = useGetTeamSupporters({
|
|
38
33
|
teamId,
|
|
39
34
|
search: debouncedSearch || undefined,
|
|
35
|
+
enabled: open,
|
|
40
36
|
});
|
|
41
37
|
const { mutate: assignSession, isPending: isAssigning } = useAssignSession();
|
|
38
|
+
const { mutate: autoAssignSession, isPending: isAutoAssigning } = useAutoAssignSession();
|
|
39
|
+
const isSubmitting = isAssigning || isAutoAssigning;
|
|
40
|
+
const isAutoAssignDisabled = isSubmitting || isLoading || isFetching;
|
|
41
|
+
const hasAvailableAutoAssignSupporter = supporters === null || supporters === void 0 ? void 0 : supporters.some((item) => item.status === "ONLINE" && item.memberId !== (supporter === null || supporter === void 0 ? void 0 : supporter.id));
|
|
42
42
|
const handleSelectAgent = (agent) => {
|
|
43
|
-
if (
|
|
43
|
+
if (isSubmitting)
|
|
44
44
|
return;
|
|
45
45
|
setSelectedAgent(agent);
|
|
46
|
+
setOpen(false);
|
|
47
|
+
setSearchText("");
|
|
46
48
|
setConfirmModalOpen(true);
|
|
47
49
|
};
|
|
48
50
|
const handleConfirmAssign = () => {
|
|
49
|
-
if (!selectedAgent ||
|
|
51
|
+
if (!selectedAgent || isSubmitting)
|
|
50
52
|
return;
|
|
51
53
|
assignSession({ sessionId, supporterId: selectedAgent.memberId }, {
|
|
52
54
|
onSuccess: () => {
|
|
53
55
|
antdMessage.success(t("manual_assign_success"));
|
|
54
56
|
setConfirmModalOpen(false);
|
|
57
|
+
},
|
|
58
|
+
onError: () => {
|
|
59
|
+
antdMessage.error(t("manual_assign_failed"));
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
const handleAutoAssign = () => {
|
|
64
|
+
if (isAutoAssignDisabled)
|
|
65
|
+
return;
|
|
66
|
+
if (!hasAvailableAutoAssignSupporter) {
|
|
67
|
+
antdMessage.error(t("auto_assign_failed"));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
autoAssignSession({ sessionId }, {
|
|
71
|
+
onSuccess: () => {
|
|
72
|
+
antdMessage.success(t("auto_assign_success"));
|
|
55
73
|
setOpen(false);
|
|
56
74
|
setSearchText("");
|
|
57
|
-
invalidateSessionQueries(queryClient);
|
|
58
75
|
},
|
|
59
76
|
onError: () => {
|
|
60
|
-
antdMessage.error(t("
|
|
77
|
+
antdMessage.error(t("auto_assign_failed"));
|
|
61
78
|
},
|
|
62
79
|
});
|
|
63
80
|
};
|
|
@@ -68,16 +85,18 @@ const ManualAssignPopover = ({ sessionId, supporter, teamId: propTeamId, }) => {
|
|
|
68
85
|
setSelectedAgent(null);
|
|
69
86
|
};
|
|
70
87
|
const handleOpenChange = (newOpen) => {
|
|
71
|
-
if (
|
|
72
|
-
return;
|
|
73
|
-
if (!newOpen && confirmModalOpen)
|
|
88
|
+
if (isSubmitting)
|
|
74
89
|
return;
|
|
75
90
|
setOpen(newOpen);
|
|
76
91
|
if (!newOpen) {
|
|
77
92
|
setSearchText("");
|
|
78
93
|
}
|
|
79
94
|
};
|
|
80
|
-
const popoverContent = (_jsxs("div", { className: "w-64", children: [
|
|
95
|
+
const popoverContent = (_jsxs("div", { className: "w-64", children: [_jsxs("button", { type: "button", className: clsx("flex w-full items-center gap-3 rounded-md px-3 py-2 text-left text-sm transition-colors", isAutoAssignDisabled
|
|
96
|
+
? "cursor-not-allowed text-gray-400"
|
|
97
|
+
: "text-gray-700 hover:bg-gray-50"), onClick: handleAutoAssign, disabled: isAutoAssignDisabled, children: [isAutoAssigning ? (_jsx(Spin, { size: "small" })) : (_jsx("span", { className: "text-blue-500", children: _jsx(Icon, { icon: "refresh-b", size: 20 }) })), _jsx("span", { children: t("manual_assign_button_auto_reassign") })] }), _jsx(Divider, { className: "my-2" }), _jsx("div", { className: "mb-2", children: _jsx(Input, { autoFocus: true, placeholder: t("manual_assign_search_placeholder"), value: searchText, onChange: (e) => setSearchText(e.target.value), prefix: _jsx(Icon, { icon: "search-o", size: 16, className: "text-gray-400" }), className: "rounded-lg border-gray-300 focus-within:border-[#3278f7] focus-within:shadow-[0_0_0_2px_rgba(50,120,247,0.12)]", allowClear: true }) }), _jsx("div", { className: "max-h-72 overflow-y-auto", role: "listbox", children: isLoading ? (_jsx("div", { className: "flex items-center justify-center py-8", children: _jsx(Spin, {}) })) : supporters && supporters.length > 0 ? (_jsx("div", { className: clsx("flex flex-col transition-opacity duration-200", isFetching && "opacity-50 pointer-events-none"), children: [...supporters]
|
|
98
|
+
.filter((item) => item.memberId !== (supporter === null || supporter === void 0 ? void 0 : supporter.id))
|
|
99
|
+
.filter((item) => !excludeCurrentUser || item.memberId !== authUserID)
|
|
81
100
|
.sort((supporterA, supporterB) => {
|
|
82
101
|
const isSupporterACurrentUser = supporterA.memberId === authUserID;
|
|
83
102
|
const isSupporterBCurrentUser = supporterB.memberId === authUserID;
|
|
@@ -88,9 +107,9 @@ const ManualAssignPopover = ({ sessionId, supporter, teamId: propTeamId, }) => {
|
|
|
88
107
|
sensitivity: "base",
|
|
89
108
|
});
|
|
90
109
|
})
|
|
91
|
-
.map((item) => (_jsx(SupporterItem, { supporter: item, onClick: handleSelectAgent,
|
|
92
|
-
return (_jsxs(_Fragment, { children: [_jsx(Popover, { content: popoverContent, trigger: "click", open: open, onOpenChange: handleOpenChange, placement: "topLeft", arrow: false, children: _jsxs("div", { role: "button", tabIndex: 0, "aria-label": t("manual_assign_button_reassign"), className: clsx("flex items-center border border-gray-200 rounded-lg p-1 gap-1 transition-opacity",
|
|
110
|
+
.map((item) => (_jsx(SupporterItem, { supporter: item, onClick: handleSelectAgent, isCurrentUser: item.memberId === authUserID }, item.memberId))) })) : (_jsx("div", { className: "flex items-center justify-center py-8", children: _jsx("span", { className: "text-sm text-gray-400", children: t("manual_assign_no_results") }) })) })] }));
|
|
111
|
+
return (_jsxs(_Fragment, { children: [_jsx(Popover, { content: popoverContent, trigger: "click", open: open, onOpenChange: handleOpenChange, placement: "topLeft", arrow: false, children: children !== null && children !== void 0 ? children : (_jsxs("div", { role: "button", tabIndex: 0, "aria-label": t("manual_assign_button_reassign"), className: clsx("flex items-center border border-gray-200 rounded-lg p-1 gap-1 transition-opacity", isSubmitting
|
|
93
112
|
? "opacity-50 pointer-events-none"
|
|
94
|
-
: "cursor-pointer hover:opacity-80"), children: [_jsx(Avatar, { src: supporter === null || supporter === void 0 ? void 0 : supporter.avatar, size: 28, children: ((_b = (_a = supporter === null || supporter === void 0 ? void 0 : supporter.fullName) === null || _a === void 0 ? void 0 : _a.charAt) === null || _b === void 0 ? void 0 : _b.call(_a, 0)) || "A" }), _jsx("span", { className: "text-
|
|
113
|
+
: "cursor-pointer hover:opacity-80"), children: [_jsx(Avatar, { src: supporter === null || supporter === void 0 ? void 0 : supporter.avatar, size: 28, children: ((_b = (_a = supporter === null || supporter === void 0 ? void 0 : supporter.fullName) === null || _a === void 0 ? void 0 : _a.charAt) === null || _b === void 0 ? void 0 : _b.call(_a, 0)) || "A" }), _jsx("span", { className: "text-blue-500", children: _jsx(Icon, { icon: "shuffle-b", size: 20 }) })] })) }), _jsx(AssignConfirmModal, { open: confirmModalOpen, agent: selectedAgent, loading: isAssigning, onCancel: handleCancelConfirm, onConfirm: handleConfirmAssign, afterClose: handleAfterClose })] }));
|
|
95
114
|
};
|
|
96
115
|
export default ManualAssignPopover;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionSection.d.ts","sourceRoot":"","sources":["../../../src/components/thread/SessionSection.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAkB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"SessionSection.d.ts","sourceRoot":"","sources":["../../../src/components/thread/SessionSection.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAkB,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAqBnE,eAAO,MAAM,iBAAiB,GAAI,wBAG/B;IACD,OAAO,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;CACnB,4CAkNA,CAAC;AAiDF,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,QAAA,MAAM,cAAc,GAAI,yBAAyB,mBAAmB,4CAmDnE,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -10,6 +10,7 @@ import { useQueryClient } from "@tanstack/react-query";
|
|
|
10
10
|
import { QUERY_KEYS } from "../../services/query";
|
|
11
11
|
import { useEffect, useState } from "react";
|
|
12
12
|
import { useTranslation } from "react-i18next";
|
|
13
|
+
import { SessionStatus } from "../../types/chat";
|
|
13
14
|
const { TextArea } = Input;
|
|
14
15
|
const formatSessionDate = (dateString) => {
|
|
15
16
|
if (!dateString)
|
|
@@ -22,7 +23,7 @@ const formatSessionDate = (dateString) => {
|
|
|
22
23
|
return `${hours}:${minutes} ${day}/${month}`;
|
|
23
24
|
};
|
|
24
25
|
export const SessionDetailCard = ({ session, isActive, }) => {
|
|
25
|
-
var _a, _b, _c, _d, _e;
|
|
26
|
+
var _a, _b, _c, _d, _e, _f;
|
|
26
27
|
const queryClient = useQueryClient();
|
|
27
28
|
const { t } = useTranslation("common");
|
|
28
29
|
const { data: availableLabels, isLoading: isLoadingLabels } = useGetLabelSession();
|
|
@@ -115,7 +116,8 @@ export const SessionDetailCard = ({ session, isActive, }) => {
|
|
|
115
116
|
return (_jsxs("div", { className: `p-3 border rounded-lg shadow-md ${isActive ? "border-blue-500" : "border-gray-300"}`, children: [_jsxs("div", { className: "flex justify-between items-start mb-3", children: [_jsx("div", { className: "flex items-center gap-2", children: _jsxs("div", { className: "flex flex-col", children: [_jsxs("div", { className: "flex items-center gap-1", children: [_jsx(Icon, { icon: "chat-square-b", size: 16, className: "text-gray-500" }), _jsx("p", { className: "font-semibold text-sm", children: t("session_label", { order: session.order }) })] }), _jsx("p", { className: "text-xs text-gray-400", children: formatSessionDate(session.closedDate || session.createdDate) })] }) }), isActive ? (_jsx(Tag, { color: "processing", children: t("session_active") })) : (_jsx(Avatar, { src: (_a = session.supporter) === null || _a === void 0 ? void 0 : _a.avatar, size: 24, children: ((_d = (_c = (_b = session.supporter) === null || _b === void 0 ? void 0 : _b.fullName) === null || _c === void 0 ? void 0 : _c.charAt) === null || _d === void 0 ? void 0 : _d.call(_c, 0)) || "A" }))] }), _jsxs("div", { className: "flex flex-col gap-3 text-sm", children: [_jsxs("div", { className: "flex items-center gap-2 text-gray-500", children: [_jsx(Icon, { icon: "tag-o", size: 16, className: "mt-1" }), _jsx(Select, { mode: "multiple", loading: isLoadingLabels, className: "w-full", placeholder: t("session_add_tag_placeholder"), options: labelOptions, value: (_e = session.labels) === null || _e === void 0 ? void 0 : _e.map((label) => label.id), onChange: handleUpdateLabels, removeIcon: true })] }), _jsxs("div", { className: "flex items-start gap-2 text-gray-500", children: [_jsx(Icon, { icon: "info-circle-o", size: 16, className: "mt-1" }), _jsx(TextArea, { value: issueDetailInput.value, onChange: (e) => setIssueDetailInput({
|
|
116
117
|
value: e.target.value,
|
|
117
118
|
sessionId: session.id,
|
|
118
|
-
}), placeholder: t("session_issue_detail_placeholder"), className: "border-none !shadow-none py-0 px-2", autoSize: { minRows: 1, maxRows: 3 } })] }), _jsxs("div", { className: "flex items-start gap-2 text-gray-500", children: [_jsx(Icon, { icon: "paper-o", size: 16, className: "mt-1" }), _jsx(TextArea, { value: noteInput.value, onChange: (e) => setNoteInput({ value: e.target.value, sessionId: session.id }), placeholder: t("session_note_placeholder"), className: "border-none !shadow-none py-0 px-2", autoSize: { minRows: 1, maxRows: 3 } })] })] }), isActive && (_jsxs("div", { className: "flex items-center gap-2 mt-4 border-t border-gray-200 pt-4", children: [
|
|
119
|
+
}), placeholder: t("session_issue_detail_placeholder"), className: "border-none !shadow-none py-0 px-2", autoSize: { minRows: 1, maxRows: 3 } })] }), _jsxs("div", { className: "flex items-start gap-2 text-gray-500", children: [_jsx(Icon, { icon: "paper-o", size: 16, className: "mt-1" }), _jsx(TextArea, { value: noteInput.value, onChange: (e) => setNoteInput({ value: e.target.value, sessionId: session.id }), placeholder: t("session_note_placeholder"), className: "border-none !shadow-none py-0 px-2", autoSize: { minRows: 1, maxRows: 3 } })] })] }), isActive && (_jsxs("div", { className: "flex items-center gap-2 mt-4 border-t border-gray-200 pt-4", children: [session.status !== SessionStatus.UNASSIGNED &&
|
|
120
|
+
((_f = session.supporter) === null || _f === void 0 ? void 0 : _f.id) && (_jsx(ManualAssignPopover, { sessionId: session.id, supporter: session.supporter, teamId: session.teamId })), _jsx(Button, { type: "primary", className: "flex-1", onClick: handleCloseSession, loading: isClosing, children: t("session_close_button") })] }))] }));
|
|
119
121
|
};
|
|
120
122
|
const ClosedSessionItem = ({ session, expandedSessionId, onToggleExpand, }) => {
|
|
121
123
|
var _a, _b, _c, _d;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThreadInfo.d.ts","sourceRoot":"","sources":["../../../src/components/thread/ThreadInfo.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ThreadInfo.d.ts","sourceRoot":"","sources":["../../../src/components/thread/ThreadInfo.tsx"],"names":[],"mappings":"AAOA,QAAA,MAAM,UAAU,sDAsCf,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -4,13 +4,14 @@ import UserSection from "./UserSection";
|
|
|
4
4
|
import SessionSection, { SessionDetailCard } from "./SessionSection";
|
|
5
5
|
import { useGetListSessionByConversation } from "../../hooks/session/useGetListSessionByConversation";
|
|
6
6
|
import { useMemo } from "react";
|
|
7
|
+
import { PAGE_SIZE } from "../../constants";
|
|
7
8
|
const ThreadInfo = () => {
|
|
8
9
|
const conversationData = useConversationStore((state) => state.conversationData);
|
|
9
10
|
const conversationId = (conversationData === null || conversationData === void 0 ? void 0 : conversationData.conversationID) || "";
|
|
10
11
|
const { data: sessions, isLoading } = useGetListSessionByConversation({
|
|
11
12
|
conversationId,
|
|
12
13
|
page: 1,
|
|
13
|
-
pageSize:
|
|
14
|
+
pageSize: PAGE_SIZE.large,
|
|
14
15
|
});
|
|
15
16
|
const { closedSessions, activeSession } = useMemo(() => {
|
|
16
17
|
if (!sessions)
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
export declare const coreWasmPath = "https://droppiistg.blob.core.windows.net/droppii-stg-public/livechat/openIM.wasm";
|
|
2
|
-
export declare const PAGE_SIZE
|
|
2
|
+
export declare const PAGE_SIZE: {
|
|
3
|
+
readonly xs: 5;
|
|
4
|
+
readonly small: 10;
|
|
5
|
+
readonly medium: 20;
|
|
6
|
+
readonly large: 50;
|
|
7
|
+
};
|
|
3
8
|
export declare const MSG_ITEM_PREFIX = "msg-item-";
|
|
4
9
|
export declare const MSG_ITEM_CONTENT_PREFIX = "msg-item-content-";
|
|
5
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,qFAC2D,CAAC;AAErF,eAAO,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,qFAC2D,CAAC;AAErF,eAAO,MAAM,SAAS;;;;;CAKZ,CAAC;AAEX,eAAO,MAAM,eAAe,cAAc,CAAC;AAC3C,eAAO,MAAM,uBAAuB,sBAAsB,CAAC"}
|
package/dist/constants/index.js
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
export const coreWasmPath = "https://droppiistg.blob.core.windows.net/droppii-stg-public/livechat/openIM.wasm";
|
|
2
|
-
export const PAGE_SIZE =
|
|
2
|
+
export const PAGE_SIZE = {
|
|
3
|
+
xs: 5,
|
|
4
|
+
small: 10,
|
|
5
|
+
medium: 20,
|
|
6
|
+
large: 50,
|
|
7
|
+
};
|
|
3
8
|
export const MSG_ITEM_PREFIX = "msg-item-";
|
|
4
9
|
export const MSG_ITEM_CONTENT_PREFIX = "msg-item-content-";
|
|
@@ -20,7 +20,7 @@ export const useFetchCannedResponse = (payload) => {
|
|
|
20
20
|
initialPageParam: 1,
|
|
21
21
|
queryKey: [QUERY_KEYS.GET_CANNED_RESPONSES, payload],
|
|
22
22
|
queryFn: async ({ pageParam = 1 }) => {
|
|
23
|
-
const params = Object.assign(Object.assign({ pageSize: (payload === null || payload === void 0 ? void 0 : payload.pageSize) || PAGE_SIZE }, payload), { page: pageParam });
|
|
23
|
+
const params = Object.assign(Object.assign({ pageSize: (payload === null || payload === void 0 ? void 0 : payload.pageSize) || PAGE_SIZE.large }, payload), { page: pageParam });
|
|
24
24
|
const res = await apiInstance.get(ENDPOINTS.chatService.getCannedResponses, {
|
|
25
25
|
params,
|
|
26
26
|
});
|
|
@@ -28,7 +28,7 @@ export const useFetchCannedResponse = (payload) => {
|
|
|
28
28
|
},
|
|
29
29
|
getNextPageParam: (lastPage) => {
|
|
30
30
|
var _a, _b;
|
|
31
|
-
const pageSize = (payload === null || payload === void 0 ? void 0 : payload.pageSize) || PAGE_SIZE;
|
|
31
|
+
const pageSize = (payload === null || payload === void 0 ? void 0 : payload.pageSize) || PAGE_SIZE.large;
|
|
32
32
|
const dataLength = ((_a = lastPage === null || lastPage === void 0 ? void 0 : lastPage.data) === null || _a === void 0 ? void 0 : _a.length) || 0;
|
|
33
33
|
const currentPage = ((_b = lastPage === null || lastPage === void 0 ? void 0 : lastPage.pageable) === null || _b === void 0 ? void 0 : _b.pageNumber) || 1;
|
|
34
34
|
return dataLength < pageSize ? undefined : currentPage + 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGlobalEvent.d.ts","sourceRoot":"","sources":["../../../src/hooks/global/useGlobalEvent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useGlobalEvent.d.ts","sourceRoot":"","sources":["../../../src/hooks/global/useGlobalEvent.ts"],"names":[],"mappings":"AAiCA,eAAO,MAAM,cAAc,YAoT1B,CAAC"}
|
|
@@ -12,6 +12,7 @@ import { QUERY_KEYS } from "../../services/query";
|
|
|
12
12
|
import { useQueryClient } from "@tanstack/react-query";
|
|
13
13
|
import { isGroupSession } from "../../utils/imCommon";
|
|
14
14
|
import { invalidateSessionQueries } from "../../utils/queryHelpers";
|
|
15
|
+
import emitter from "../../utils/events";
|
|
15
16
|
const notPushType = [MessageType.TypingMessage, MessageType.RevokeMessage];
|
|
16
17
|
export const useGlobalEvent = () => {
|
|
17
18
|
const { user } = useChatContext();
|
|
@@ -174,6 +175,10 @@ export const useGlobalEvent = () => {
|
|
|
174
175
|
break;
|
|
175
176
|
}
|
|
176
177
|
};
|
|
178
|
+
const groupMemberChangedHandler = () => {
|
|
179
|
+
void refreshCurrentGroupState();
|
|
180
|
+
emitter.emit("GROUP_MEMBERS_CHANGED");
|
|
181
|
+
};
|
|
177
182
|
const setIMListener = () => {
|
|
178
183
|
//account
|
|
179
184
|
DChatSDK.on(CbEvents.OnUserTokenExpired, userTokenHandler);
|
|
@@ -192,6 +197,9 @@ export const useGlobalEvent = () => {
|
|
|
192
197
|
// conversation
|
|
193
198
|
DChatSDK.on(CbEvents.OnConversationChanged, conversationChangeHandler);
|
|
194
199
|
DChatSDK.on(CbEvents.OnNewConversation, newConversationHandler);
|
|
200
|
+
// group members
|
|
201
|
+
DChatSDK.on(CbEvents.OnGroupMemberAdded, groupMemberChangedHandler);
|
|
202
|
+
DChatSDK.on(CbEvents.OnGroupMemberDeleted, groupMemberChangedHandler);
|
|
195
203
|
//busines notification
|
|
196
204
|
DChatSDK.on(CbEvents.OnRecvCustomBusinessMessage, businessNotificationHandler);
|
|
197
205
|
};
|
|
@@ -212,6 +220,9 @@ export const useGlobalEvent = () => {
|
|
|
212
220
|
// conversation
|
|
213
221
|
DChatSDK.off(CbEvents.OnConversationChanged, conversationChangeHandler);
|
|
214
222
|
DChatSDK.off(CbEvents.OnNewConversation, newConversationHandler);
|
|
223
|
+
// group members
|
|
224
|
+
DChatSDK.off(CbEvents.OnGroupMemberAdded, groupMemberChangedHandler);
|
|
225
|
+
DChatSDK.off(CbEvents.OnGroupMemberDeleted, groupMemberChangedHandler);
|
|
215
226
|
//busines notification
|
|
216
227
|
DChatSDK.off(CbEvents.OnRecvCustomBusinessMessage, businessNotificationHandler);
|
|
217
228
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGroupMembers.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useGroupMembers.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"useGroupMembers.d.ts","sourceRoot":"","sources":["../../../src/hooks/group/useGroupMembers.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,eAAe,EAAW,MAAM,yBAAyB,CAAC;AAM7E,UAAU,qBAAqB;IAC7B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,KACf,qBA+DF,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { useCallback, useEffect, useState } from "react";
|
|
2
|
+
import { CbEvents } from "@openim/wasm-client-sdk";
|
|
2
3
|
import { DChatSDK } from "../../constants/sdk";
|
|
3
4
|
const GROUP_MEMBER_LIST_OFFSET = 0;
|
|
4
5
|
const GROUP_MEMBER_LIST_COUNT = 999;
|
|
@@ -35,6 +36,22 @@ export const useGroupMembers = (groupID) => {
|
|
|
35
36
|
useEffect(() => {
|
|
36
37
|
void fetchMembers();
|
|
37
38
|
}, [fetchMembers]);
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
if (!groupID)
|
|
41
|
+
return;
|
|
42
|
+
const onMemberDeleted = ({ data }) => {
|
|
43
|
+
if (data.groupID === groupID) {
|
|
44
|
+
setMembers((prev) => prev.filter((m) => m.userID !== data.userID));
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const onMemberAdded = () => void fetchMembers();
|
|
48
|
+
DChatSDK.on(CbEvents.OnGroupMemberDeleted, onMemberDeleted);
|
|
49
|
+
DChatSDK.on(CbEvents.OnGroupMemberAdded, onMemberAdded);
|
|
50
|
+
return () => {
|
|
51
|
+
DChatSDK.off(CbEvents.OnGroupMemberDeleted, onMemberDeleted);
|
|
52
|
+
DChatSDK.off(CbEvents.OnGroupMemberAdded, onMemberAdded);
|
|
53
|
+
};
|
|
54
|
+
}, [groupID, fetchMembers]);
|
|
38
55
|
return {
|
|
39
56
|
members,
|
|
40
57
|
isLoading,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { useEffect, useState } from "react";
|
|
2
2
|
import { ViewType, MessageType, } from "@openim/wasm-client-sdk";
|
|
3
3
|
import { DChatSDK } from "../../constants/sdk";
|
|
4
|
+
import { PAGE_SIZE } from "../../constants";
|
|
4
5
|
import { useLatest, useRequest } from "ahooks";
|
|
5
6
|
import emitter, { emit } from "../../utils/events";
|
|
6
7
|
import isEmpty from "lodash/isEmpty";
|
|
7
|
-
const PAGE_SIZE = 50;
|
|
8
8
|
export const visibleTypeMessage = [
|
|
9
9
|
MessageType.TextMessage,
|
|
10
10
|
MessageType.PictureMessage,
|
|
@@ -35,7 +35,7 @@ export const useMessage = (conversationId, searchClientMsgID, enabled = true) =>
|
|
|
35
35
|
var _a, _b, _c, _d, _e;
|
|
36
36
|
const reqConversationID = conversationId;
|
|
37
37
|
const params = {
|
|
38
|
-
count: PAGE_SIZE,
|
|
38
|
+
count: PAGE_SIZE.large,
|
|
39
39
|
startClientMsgID: loadMore
|
|
40
40
|
? ((_e = (_b = (_a = latestLoadState.current) === null || _a === void 0 ? void 0 : _a.messageList) === null || _b === void 0 ? void 0 : _b[((_d = (_c = latestLoadState.current) === null || _c === void 0 ? void 0 : _c.messageList) === null || _d === void 0 ? void 0 : _d.length) - 1]) === null || _e === void 0 ? void 0 : _e.clientMsgID) || ""
|
|
41
41
|
: "",
|
|
@@ -60,7 +60,7 @@ export const useMessage = (conversationId, searchClientMsgID, enabled = true) =>
|
|
|
60
60
|
var _a, _b;
|
|
61
61
|
const reqConversationID = conversationId;
|
|
62
62
|
const { data } = await DChatSDK.getAdvancedHistoryMessageListReverse({
|
|
63
|
-
count: PAGE_SIZE,
|
|
63
|
+
count: PAGE_SIZE.large,
|
|
64
64
|
startClientMsgID: loadMore
|
|
65
65
|
? ((_b = (_a = latestLoadState.current) === null || _a === void 0 ? void 0 : _a.messageList[0]) === null || _b === void 0 ? void 0 : _b.clientMsgID) || ""
|
|
66
66
|
: "",
|
|
@@ -86,13 +86,13 @@ export const useMessage = (conversationId, searchClientMsgID, enabled = true) =>
|
|
|
86
86
|
return;
|
|
87
87
|
const reqConversationID = conversationId;
|
|
88
88
|
const { data: dataPrev } = await DChatSDK.getAdvancedHistoryMessageList({
|
|
89
|
-
count:
|
|
89
|
+
count: PAGE_SIZE.small,
|
|
90
90
|
startClientMsgID: searchClientMsgID,
|
|
91
91
|
conversationID: conversationId !== null && conversationId !== void 0 ? conversationId : "",
|
|
92
92
|
viewType: ViewType.History,
|
|
93
93
|
});
|
|
94
94
|
const { data: dataNext } = await DChatSDK.getAdvancedHistoryMessageListReverse({
|
|
95
|
-
count:
|
|
95
|
+
count: PAGE_SIZE.small,
|
|
96
96
|
startClientMsgID: searchClientMsgID,
|
|
97
97
|
conversationID: conversationId !== null && conversationId !== void 0 ? conversationId : "",
|
|
98
98
|
viewType: ViewType.Search,
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { MessageItem } from "@openim/wasm-client-sdk";
|
|
2
|
+
import { IPullSessionMessagesRequest } from "../../types/dto";
|
|
2
3
|
interface UsePullSessionMessagesParams {
|
|
3
4
|
conversationID?: string;
|
|
4
5
|
userID?: string;
|
|
5
6
|
enabled?: boolean;
|
|
6
7
|
}
|
|
8
|
+
export declare const fetchPullSessionMessages: ({ conversationID, userID, applicationType, }: IPullSessionMessagesRequest) => Promise<MessageItem[]>;
|
|
7
9
|
export declare const usePullSessionMessages: ({ conversationID, userID, enabled, }: UsePullSessionMessagesParams) => import("@tanstack/react-query").UseQueryResult<MessageItem[], Error>;
|
|
8
10
|
export {};
|
|
9
11
|
//# sourceMappingURL=usePullSessionMessages.d.ts.map
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"usePullSessionMessages.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/usePullSessionMessages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAItD,OAAO,EAEL,2BAA2B,EAE5B,MAAM,iBAAiB,CAAC;AAOzB,UAAU,4BAA4B;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,eAAO,MAAM,wBAAwB,GAAU,8CAI5C,2BAA2B,KAAG,OAAO,CAAC,WAAW,EAAE,CAerD,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,sCAIpC,4BAA4B,yEAa9B,CAAC"}
|
|
@@ -4,24 +4,27 @@ import { ENDPOINTS } from "../../services/routes";
|
|
|
4
4
|
import { QUERY_KEYS } from "../../services/query";
|
|
5
5
|
import useAuthStore from "../../store/auth";
|
|
6
6
|
import { sortMessagesDesc, transformPulledMessage, } from "../../utils/messageTransform";
|
|
7
|
+
export const fetchPullSessionMessages = async ({ conversationID, userID, applicationType, }) => {
|
|
8
|
+
var _a, _b, _c, _d;
|
|
9
|
+
const payload = {
|
|
10
|
+
conversationID,
|
|
11
|
+
userID,
|
|
12
|
+
applicationType,
|
|
13
|
+
};
|
|
14
|
+
const res = await apiInstance.post(ENDPOINTS.chatService.pullSessionMessages, payload);
|
|
15
|
+
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];
|
|
16
|
+
const rawList = (_d = group === null || group === void 0 ? void 0 : group.Msgs) !== null && _d !== void 0 ? _d : [];
|
|
17
|
+
return sortMessagesDesc(rawList.map(transformPulledMessage));
|
|
18
|
+
};
|
|
7
19
|
export const usePullSessionMessages = ({ conversationID, userID, enabled = true, }) => {
|
|
8
20
|
const applicationType = useAuthStore((state) => state.applicationType);
|
|
9
|
-
|
|
21
|
+
return useQuery({
|
|
10
22
|
queryKey: [QUERY_KEYS.PULL_SESSION_MESSAGES, conversationID, userID],
|
|
11
23
|
enabled: Boolean(enabled && conversationID && userID),
|
|
12
|
-
queryFn:
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
},
|
|
24
|
+
queryFn: () => fetchPullSessionMessages({
|
|
25
|
+
conversationID: conversationID !== null && conversationID !== void 0 ? conversationID : "",
|
|
26
|
+
userID: userID !== null && userID !== void 0 ? userID : "",
|
|
27
|
+
applicationType,
|
|
28
|
+
}),
|
|
25
29
|
});
|
|
26
|
-
return query;
|
|
27
30
|
};
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { SearchMessageItem, SearchMessageRequest, SearchMessageResponse } from "../../types/dto";
|
|
2
2
|
interface UseSearchMessagePayload {
|
|
3
|
-
payload: Pick<SearchMessageRequest, "contentType" | "pageSize" | "recvID" | "searchTerm">;
|
|
3
|
+
payload: Pick<SearchMessageRequest, "contentType" | "pageSize" | "recvID" | "searchTerm" | "tag">;
|
|
4
4
|
options?: {
|
|
5
5
|
pageSize?: number;
|
|
6
|
+
untilEmptyPage?: boolean;
|
|
6
7
|
};
|
|
7
8
|
}
|
|
8
9
|
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,EACL,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,iBAAiB,CAAC;AAMzB,UAAU,uBAAuB;IAC/B,OAAO,EAAE,IAAI,CACX,oBAAoB,EACpB,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"useSearchMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/search/useSearchMessage.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,iBAAiB,CAAC;AAMzB,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,CAAA;KAAE,CAAC;CAC3D;AAED,eAAO,MAAM,gBAAgB,GAAI,uBAG9B,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsEzB,CAAC"}
|
|
@@ -22,15 +22,18 @@ export const useSearchMessage = ({ payload, options, }) => {
|
|
|
22
22
|
initialPageParam: 1,
|
|
23
23
|
queryKey: [QUERY_KEYS.SEARCH_MESSAGE, payload, options],
|
|
24
24
|
queryFn: async ({ pageParam = 1 }) => {
|
|
25
|
-
const params = Object.assign(Object.assign({ pageSize: (options === null || options === void 0 ? void 0 : options.pageSize) || PAGE_SIZE }, payload), { page: pageParam, applicationType: useAuthStore.getState().applicationType });
|
|
25
|
+
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 });
|
|
26
26
|
const res = await apiInstance.post(ENDPOINTS.chatService.searchMessage, params);
|
|
27
27
|
return res.data;
|
|
28
28
|
},
|
|
29
29
|
getNextPageParam: (lastPage) => {
|
|
30
30
|
var _a, _b;
|
|
31
|
-
const
|
|
32
|
-
const dataLength = ((
|
|
33
|
-
|
|
31
|
+
const currentPage = ((_a = lastPage === null || lastPage === void 0 ? void 0 : lastPage.pageable) === null || _a === void 0 ? void 0 : _a.pageNumber) || 1;
|
|
32
|
+
const dataLength = ((_b = lastPage === null || lastPage === void 0 ? void 0 : lastPage.data) === null || _b === void 0 ? void 0 : _b.length) || 0;
|
|
33
|
+
if (options === null || options === void 0 ? void 0 : options.untilEmptyPage) {
|
|
34
|
+
return dataLength > 0 ? currentPage + 1 : undefined;
|
|
35
|
+
}
|
|
36
|
+
const pageSize = (options === null || options === void 0 ? void 0 : options.pageSize) || PAGE_SIZE.small;
|
|
34
37
|
return dataLength < pageSize ? undefined : currentPage + 1;
|
|
35
38
|
},
|
|
36
39
|
enabled: hasValidFilter(payload),
|
|
@@ -64,9 +67,6 @@ export const useSearchMessage = ({ payload, options, }) => {
|
|
|
64
67
|
dataFlatten }, rest);
|
|
65
68
|
};
|
|
66
69
|
const hasValidFilter = (filter) => {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return v.trim() !== "";
|
|
70
|
-
return v !== undefined && v !== null;
|
|
71
|
-
});
|
|
70
|
+
const { searchTerm, recvID } = filter;
|
|
71
|
+
return Boolean(searchTerm === null || searchTerm === void 0 ? void 0 : searchTerm.trim()) || Boolean(recvID === null || recvID === void 0 ? void 0 : recvID.trim());
|
|
72
72
|
};
|
|
@@ -4,5 +4,9 @@ interface AssignSessionParams {
|
|
|
4
4
|
supporterId: string;
|
|
5
5
|
}
|
|
6
6
|
export declare const useAssignSession: () => import("@tanstack/react-query").UseMutationResult<BaseResponse<boolean>, Error, AssignSessionParams, unknown>;
|
|
7
|
+
interface AutoAssignSessionParams {
|
|
8
|
+
sessionId: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const useAutoAssignSession: () => import("@tanstack/react-query").UseMutationResult<BaseResponse<boolean>, Error, AutoAssignSessionParams, unknown>;
|
|
7
11
|
export {};
|
|
8
12
|
//# sourceMappingURL=useAssignSession.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAssignSession.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useAssignSession.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"useAssignSession.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useAssignSession.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAM/C,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,gBAAgB,qHA0B5B,CAAC;AAEF,UAAU,uBAAuB;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,oBAAoB,yHAqBhC,CAAC"}
|
|
@@ -1,15 +1,48 @@
|
|
|
1
|
-
import { useMutation } from "@tanstack/react-query";
|
|
1
|
+
import { useMutation, useQueryClient } from "@tanstack/react-query";
|
|
2
2
|
import { QUERY_KEYS } from "../../services/query";
|
|
3
3
|
import { apiInstance } from "../../services/api";
|
|
4
4
|
import { ENDPOINTS } from "../../services/routes";
|
|
5
5
|
import useAuthStore from "../../store/auth";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
6
|
+
import useConversationStore from "../../store/conversation";
|
|
7
|
+
import { invalidateSessionQueries } from "../../utils/queryHelpers";
|
|
8
|
+
import { useSyncGroupStateAfterJoin } from "./useSyncGroupStateAfterJoin";
|
|
9
|
+
export const useAssignSession = () => {
|
|
10
|
+
const queryClient = useQueryClient();
|
|
11
|
+
const authUserID = useAuthStore((state) => state.userID);
|
|
12
|
+
const groupId = useConversationStore((state) => { var _a; return (_a = state.conversationData) === null || _a === void 0 ? void 0 : _a.groupID; });
|
|
13
|
+
const { syncGroupStateAfterJoin } = useSyncGroupStateAfterJoin({ groupId });
|
|
14
|
+
return useMutation({
|
|
15
|
+
mutationKey: [QUERY_KEYS.ASSIGN_SESSION],
|
|
16
|
+
mutationFn: async ({ sessionId, supporterId }) => {
|
|
17
|
+
const res = await apiInstance.post(ENDPOINTS.chatService.assignSession(sessionId), {
|
|
18
|
+
applicationType: useAuthStore.getState().applicationType,
|
|
19
|
+
supporterId,
|
|
20
|
+
});
|
|
21
|
+
return res === null || res === void 0 ? void 0 : res.data;
|
|
22
|
+
},
|
|
23
|
+
onSuccess: async (_, variables) => {
|
|
24
|
+
invalidateSessionQueries(queryClient);
|
|
25
|
+
if (variables.supporterId === authUserID) {
|
|
26
|
+
await syncGroupStateAfterJoin();
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
export const useAutoAssignSession = () => {
|
|
32
|
+
const queryClient = useQueryClient();
|
|
33
|
+
const groupId = useConversationStore((state) => { var _a; return (_a = state.conversationData) === null || _a === void 0 ? void 0 : _a.groupID; });
|
|
34
|
+
const { syncGroupStateAfterJoin } = useSyncGroupStateAfterJoin({ groupId });
|
|
35
|
+
return useMutation({
|
|
36
|
+
mutationKey: [QUERY_KEYS.AUTO_ASSIGN_SESSION],
|
|
37
|
+
mutationFn: async ({ sessionId }) => {
|
|
38
|
+
const res = await apiInstance.post(ENDPOINTS.chatService.autoAssignSession(sessionId), {
|
|
39
|
+
applicationType: useAuthStore.getState().applicationType,
|
|
40
|
+
});
|
|
41
|
+
return res === null || res === void 0 ? void 0 : res.data;
|
|
42
|
+
},
|
|
43
|
+
onSuccess: async () => {
|
|
44
|
+
invalidateSessionQueries(queryClient);
|
|
45
|
+
await syncGroupStateAfterJoin();
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
};
|
|
@@ -3,18 +3,11 @@ interface UseConversationSessionStateParams {
|
|
|
3
3
|
conversationId: string;
|
|
4
4
|
conversationType?: SessionType;
|
|
5
5
|
groupId?: string;
|
|
6
|
-
userID?: string;
|
|
7
6
|
}
|
|
8
|
-
export declare const useConversationSessionState: ({ conversationId, conversationType, groupId,
|
|
9
|
-
isGroupConversation: boolean;
|
|
7
|
+
export declare const useConversationSessionState: ({ conversationId, conversationType, groupId, }: UseConversationSessionStateParams) => {
|
|
10
8
|
groupId: string | undefined;
|
|
11
|
-
isJoined: boolean | null;
|
|
12
9
|
latestConversationSession: import("../../types/dto").ISessionResponse | undefined;
|
|
13
|
-
isSessionMember: boolean;
|
|
14
|
-
isMember: boolean;
|
|
15
|
-
isNotGroupMember: boolean;
|
|
16
10
|
customerUserID: string;
|
|
17
|
-
refetchIsJoined: () => Promise<void>;
|
|
18
11
|
refetchConversationSessions: (options?: import("@tanstack/react-query").RefetchOptions) => Promise<import("@tanstack/react-query").QueryObserverResult<import("../../types/dto").ISessionResponse[], Error>>;
|
|
19
12
|
};
|
|
20
13
|
export {};
|
|
@@ -1 +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;
|
|
1
|
+
{"version":3,"file":"useConversationSessionState.d.ts","sourceRoot":"","sources":["../../../src/hooks/session/useConversationSessionState.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAItD,UAAU,iCAAiC;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,2BAA2B,GAAI,gDAIzC,iCAAiC;;;;;CAmBnC,CAAC"}
|