@droppii-org/chat-sdk 0.1.18 → 0.1.20

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.
Files changed (108) hide show
  1. package/dist/components/conversation/ConversationBySessionItem.d.ts +3 -1
  2. package/dist/components/conversation/ConversationBySessionItem.d.ts.map +1 -1
  3. package/dist/components/conversation/ConversationBySessionItem.js +4 -7
  4. package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
  5. package/dist/components/conversation/DeskConversationList.js +6 -2
  6. package/dist/components/message/GroupMembersDrawer.d.ts +4 -1
  7. package/dist/components/message/GroupMembersDrawer.d.ts.map +1 -1
  8. package/dist/components/message/GroupMembersDrawer.js +39 -5
  9. package/dist/components/message/MessageHeader.d.ts +2 -1
  10. package/dist/components/message/MessageHeader.d.ts.map +1 -1
  11. package/dist/components/message/MessageHeader.js +3 -4
  12. package/dist/components/message/MessageList.d.ts.map +1 -1
  13. package/dist/components/message/MessageList.js +8 -20
  14. package/dist/components/message/UnassignedSessionFooter.d.ts +7 -0
  15. package/dist/components/message/UnassignedSessionFooter.d.ts.map +1 -0
  16. package/dist/components/message/UnassignedSessionFooter.js +26 -0
  17. package/dist/components/searchConversation/SearchAll.d.ts.map +1 -1
  18. package/dist/components/searchConversation/SearchAll.js +5 -3
  19. package/dist/components/searchConversation/SearchConversationAsMessages.d.ts.map +1 -1
  20. package/dist/components/searchConversation/SearchConversationAsMessages.js +1 -1
  21. package/dist/components/searchConversation/SearchConversationAsUsers.js +1 -1
  22. package/dist/components/searchConversation/SearchConversationMyInbox.d.ts +6 -0
  23. package/dist/components/searchConversation/SearchConversationMyInbox.d.ts.map +1 -0
  24. package/dist/components/searchConversation/SearchConversationMyInbox.js +24 -0
  25. package/dist/components/searchConversation/SearchMessageOnCurrentConversation.d.ts.map +1 -1
  26. package/dist/components/searchConversation/SearchMessageOnCurrentConversation.js +1 -1
  27. package/dist/components/searchConversation/index.d.ts +1 -0
  28. package/dist/components/searchConversation/index.d.ts.map +1 -1
  29. package/dist/components/searchConversation/index.js +8 -1
  30. package/dist/components/searchConversation/item/SearchItemAsMessage.d.ts +1 -0
  31. package/dist/components/searchConversation/item/SearchItemAsMessage.d.ts.map +1 -1
  32. package/dist/components/searchConversation/item/SearchItemAsMessage.js +4 -4
  33. package/dist/components/thread/ManualAssignPopover.d.ts +5 -2
  34. package/dist/components/thread/ManualAssignPopover.d.ts.map +1 -1
  35. package/dist/components/thread/ManualAssignPopover.js +40 -21
  36. package/dist/components/thread/SessionSection.d.ts.map +1 -1
  37. package/dist/components/thread/SessionSection.js +4 -2
  38. package/dist/components/thread/ThreadInfo.d.ts.map +1 -1
  39. package/dist/components/thread/ThreadInfo.js +2 -1
  40. package/dist/constants/index.d.ts +6 -1
  41. package/dist/constants/index.d.ts.map +1 -1
  42. package/dist/constants/index.js +6 -1
  43. package/dist/hooks/cannedResponse/useFetchCannedResponse.js +2 -2
  44. package/dist/hooks/global/useGlobalEvent.d.ts.map +1 -1
  45. package/dist/hooks/global/useGlobalEvent.js +11 -0
  46. package/dist/hooks/group/useGroupMembers.d.ts.map +1 -1
  47. package/dist/hooks/group/useGroupMembers.js +17 -0
  48. package/dist/hooks/message/useMessage.js +5 -5
  49. package/dist/hooks/message/usePullSessionMessages.d.ts +2 -0
  50. package/dist/hooks/message/usePullSessionMessages.d.ts.map +1 -1
  51. package/dist/hooks/message/usePullSessionMessages.js +18 -15
  52. package/dist/hooks/search/useSearchMessage.d.ts +2 -1
  53. package/dist/hooks/search/useSearchMessage.d.ts.map +1 -1
  54. package/dist/hooks/search/useSearchMessage.js +9 -9
  55. package/dist/hooks/session/useAssignSession.d.ts +4 -0
  56. package/dist/hooks/session/useAssignSession.d.ts.map +1 -1
  57. package/dist/hooks/session/useAssignSession.js +44 -11
  58. package/dist/hooks/session/useConversationSessionState.d.ts +1 -8
  59. package/dist/hooks/session/useConversationSessionState.d.ts.map +1 -1
  60. package/dist/hooks/session/useConversationSessionState.js +2 -25
  61. package/dist/hooks/session/useGetListSessionByConversation.d.ts.map +1 -1
  62. package/dist/hooks/session/useGetListSessionByConversation.js +2 -1
  63. package/dist/hooks/session/useGetSession.d.ts.map +1 -1
  64. package/dist/hooks/session/useGetSession.js +2 -2
  65. package/dist/hooks/session/useGetTeamSupporters.d.ts +2 -1
  66. package/dist/hooks/session/useGetTeamSupporters.d.ts.map +1 -1
  67. package/dist/hooks/session/useGetTeamSupporters.js +2 -2
  68. package/dist/hooks/session/useIsJoinedGroup.d.ts +1 -1
  69. package/dist/hooks/session/useIsJoinedGroup.d.ts.map +1 -1
  70. package/dist/hooks/session/useIsJoinedGroup.js +13 -19
  71. package/dist/hooks/session/useJoinGroupFlow.d.ts +8 -6
  72. package/dist/hooks/session/useJoinGroupFlow.d.ts.map +1 -1
  73. package/dist/hooks/session/useJoinGroupFlow.js +19 -57
  74. package/dist/hooks/session/useJoinSession.d.ts.map +1 -1
  75. package/dist/hooks/session/useJoinSession.js +3 -0
  76. package/dist/hooks/session/useLeaveConversation.d.ts +5 -0
  77. package/dist/hooks/session/useLeaveConversation.d.ts.map +1 -0
  78. package/dist/hooks/session/useLeaveConversation.js +35 -0
  79. package/dist/hooks/session/useSessionLatestPreview.d.ts +7 -0
  80. package/dist/hooks/session/useSessionLatestPreview.d.ts.map +1 -0
  81. package/dist/hooks/session/useSessionLatestPreview.js +82 -0
  82. package/dist/hooks/session/useSortedSessions.d.ts +4 -0
  83. package/dist/hooks/session/useSortedSessions.d.ts.map +1 -0
  84. package/dist/hooks/session/useSortedSessions.js +13 -0
  85. package/dist/hooks/session/useSyncGroupStateAfterJoin.d.ts +9 -0
  86. package/dist/hooks/session/useSyncGroupStateAfterJoin.d.ts.map +1 -0
  87. package/dist/hooks/session/useSyncGroupStateAfterJoin.js +23 -0
  88. package/dist/index.d.ts +1 -0
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +1 -0
  91. package/dist/locales/vi/common.json +13 -2
  92. package/dist/services/query.d.ts +3 -0
  93. package/dist/services/query.d.ts.map +1 -1
  94. package/dist/services/query.js +3 -0
  95. package/dist/services/routes.d.ts +2 -0
  96. package/dist/services/routes.d.ts.map +1 -1
  97. package/dist/services/routes.js +2 -0
  98. package/dist/store/conversation.d.ts.map +1 -1
  99. package/dist/store/conversation.js +5 -2
  100. package/dist/styles/global.css +1 -1
  101. package/dist/tsconfig.tsbuildinfo +1 -1
  102. package/dist/types/dto.d.ts +4 -0
  103. package/dist/types/dto.d.ts.map +1 -1
  104. package/dist/utils/events.d.ts +1 -0
  105. package/dist/utils/events.d.ts.map +1 -1
  106. package/dist/utils/messageTransform.d.ts.map +1 -1
  107. package/dist/utils/messageTransform.js +1 -1
  108. package/package.json +1 -1
@@ -1,3 +1,4 @@
1
+ import { type ReactNode } from "react";
1
2
  interface SupporterInfo {
2
3
  avatar: string;
3
4
  username: string;
@@ -6,9 +7,11 @@ interface SupporterInfo {
6
7
  }
7
8
  interface ManualAssignPopoverProps {
8
9
  sessionId: string;
9
- supporter: SupporterInfo;
10
+ supporter?: SupporterInfo | null;
10
11
  teamId?: string;
12
+ children?: ReactNode;
13
+ excludeCurrentUser?: boolean;
11
14
  }
12
- declare const ManualAssignPopover: ({ sessionId, supporter, teamId: propTeamId, }: ManualAssignPopoverProps) => import("react/jsx-runtime").JSX.Element;
15
+ declare const ManualAssignPopover: ({ sessionId, supporter, teamId: propTeamId, children, excludeCurrentUser, }: ManualAssignPopoverProps) => import("react/jsx-runtime").JSX.Element;
13
16
  export default ManualAssignPopover;
14
17
  //# sourceMappingURL=ManualAssignPopover.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ManualAssignPopover.d.ts","sourceRoot":"","sources":["../../../src/components/thread/ManualAssignPopover.tsx"],"names":[],"mappings":"AAiBA,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,wBAAwB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,aAAa,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAqDD,QAAA,MAAM,mBAAmB,GAAI,+CAI1B,wBAAwB,4CAmL1B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"ManualAssignPopover.d.ts","sourceRoot":"","sources":["../../../src/components/thread/ManualAssignPopover.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAkBjD,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,UAAU,wBAAwB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AA8CD,QAAA,MAAM,mBAAmB,GAAI,6EAM1B,wBAAwB,4CA4O1B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -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, isCurrentAssignee, isCurrentUser, }) => {
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, "aria-selected": isCurrentAssignee, className: clsx("flex items-center gap-3 px-3 py-2 rounded-md transition-colors", isCurrentAssignee
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 (isAssigning)
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 || isAssigning)
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("manual_assign_failed"));
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 (isAssigning)
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: [_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]
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, isCurrentAssignee: item.memberId === (supporter === null || supporter === void 0 ? void 0 : supporter.id), 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") }) })) })] }));
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", isAssigning
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-purple-500", children: _jsx(Icon, { icon: "shuffle-b", size: 20 }) })] }) }), _jsx(AssignConfirmModal, { open: confirmModalOpen, agent: selectedAgent, loading: isAssigning, onCancel: handleCancelConfirm, onConfirm: handleConfirmAssign, afterClose: handleAfterClose })] }));
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;AAoBnE,eAAO,MAAM,iBAAiB,GAAI,wBAG/B;IACD,OAAO,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;CACnB,4CA6MA,CAAC;AA+CF,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"}
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: [_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
+ }), 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":"AAMA,QAAA,MAAM,UAAU,sDAsCf,CAAC;AAEF,eAAe,UAAU,CAAC"}
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: 50,
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 = 50;
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,KAAK,CAAC;AAE5B,eAAO,MAAM,eAAe,cAAc,CAAC;AAC3C,eAAO,MAAM,uBAAuB,sBAAsB,CAAC"}
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"}
@@ -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 = 50;
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":"AAgCA,eAAO,MAAM,cAAc,YAuS1B,CAAC"}
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,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAM1D,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,qBA2CF,CAAC"}
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: 10,
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: 10,
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;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"}
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
- const query = useQuery({
21
+ return useQuery({
10
22
  queryKey: [QUERY_KEYS.PULL_SESSION_MESSAGES, conversationID, userID],
11
23
  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
- },
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,CACrD,CAAC;IACF,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjC;AAED,eAAO,MAAM,gBAAgB,GAAI,uBAG9B,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmEzB,CAAC"}
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 pageSize = (options === null || options === void 0 ? void 0 : options.pageSize) || PAGE_SIZE;
32
- const dataLength = ((_a = lastPage === null || lastPage === void 0 ? void 0 : lastPage.data) === null || _a === void 0 ? void 0 : _a.length) || 0;
33
- const currentPage = ((_b = lastPage === null || lastPage === void 0 ? void 0 : lastPage.pageable) === null || _b === void 0 ? void 0 : _b.pageNumber) || 1;
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
- return Object.values(filter).some((v) => {
68
- if (typeof v === "string")
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;AAG/C,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,gBAAgB,qHAazB,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
- export const useAssignSession = () => useMutation({
7
- mutationKey: [QUERY_KEYS.ASSIGN_SESSION],
8
- mutationFn: async ({ sessionId, supporterId }) => {
9
- const res = await apiInstance.post(ENDPOINTS.chatService.assignSession(sessionId), {
10
- applicationType: useAuthStore.getState().applicationType,
11
- supporterId,
12
- });
13
- return res === null || res === void 0 ? void 0 : res.data;
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, userID, }: UseConversationSessionStateParams) => {
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 {};