@droppii-org/chat-sdk 0.0.20 → 0.0.22

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 (72) hide show
  1. package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
  2. package/dist/components/conversation/DeskConversationList.js +15 -10
  3. package/dist/components/message/MessageHeader.d.ts +8 -0
  4. package/dist/components/message/MessageHeader.d.ts.map +1 -0
  5. package/dist/components/message/MessageHeader.js +9 -0
  6. package/dist/components/message/MessageList.d.ts +1 -1
  7. package/dist/components/message/MessageList.d.ts.map +1 -1
  8. package/dist/components/message/MessageList.js +41 -113
  9. package/dist/components/message/footer/ActionBar.d.ts +3 -0
  10. package/dist/components/message/footer/ActionBar.d.ts.map +1 -0
  11. package/dist/components/message/footer/ActionBar.js +143 -0
  12. package/dist/components/message/footer/EmojiPicker.d.ts +7 -0
  13. package/dist/components/message/footer/EmojiPicker.d.ts.map +1 -0
  14. package/dist/components/message/footer/EmojiPicker.js +151 -0
  15. package/dist/components/message/footer/EnterHandler.d.ts +2 -0
  16. package/dist/components/message/footer/EnterHandler.d.ts.map +1 -0
  17. package/dist/components/message/footer/EnterHandler.js +106 -0
  18. package/dist/components/message/footer/FilePreview.d.ts +10 -0
  19. package/dist/components/message/footer/FilePreview.d.ts.map +1 -0
  20. package/dist/components/message/footer/FilePreview.js +48 -0
  21. package/dist/components/message/footer/ToolbarPlugin.d.ts +2 -0
  22. package/dist/components/message/footer/ToolbarPlugin.d.ts.map +1 -0
  23. package/dist/components/message/footer/ToolbarPlugin.js +169 -0
  24. package/dist/components/message/footer/index.d.ts +10 -0
  25. package/dist/components/message/footer/index.d.ts.map +1 -0
  26. package/dist/components/message/footer/index.js +65 -0
  27. package/dist/components/message/item/FileMessage.d.ts +7 -0
  28. package/dist/components/message/item/FileMessage.d.ts.map +1 -0
  29. package/dist/components/message/item/FileMessage.js +27 -0
  30. package/dist/components/message/item/ImageMessage.d.ts +7 -0
  31. package/dist/components/message/item/ImageMessage.d.ts.map +1 -0
  32. package/dist/components/message/item/ImageMessage.js +23 -0
  33. package/dist/components/message/item/TextMessage.d.ts +7 -0
  34. package/dist/components/message/item/TextMessage.d.ts.map +1 -0
  35. package/dist/components/message/item/TextMessage.js +21 -0
  36. package/dist/components/message/item/VideoMessage.d.ts +7 -0
  37. package/dist/components/message/item/VideoMessage.d.ts.map +1 -0
  38. package/dist/components/message/item/VideoMessage.js +20 -0
  39. package/dist/components/message/item/index.d.ts +7 -0
  40. package/dist/components/message/item/index.d.ts.map +1 -0
  41. package/dist/components/message/item/index.js +41 -0
  42. package/dist/context/ChatContext.d.ts.map +1 -1
  43. package/dist/context/ChatContext.js +14 -9
  44. package/dist/hooks/conversation/useConversation.d.ts +1 -0
  45. package/dist/hooks/conversation/useConversation.d.ts.map +1 -1
  46. package/dist/hooks/conversation/useConversation.js +24 -8
  47. package/dist/hooks/conversation/useConversationStore.d.ts +12 -0
  48. package/dist/hooks/conversation/useConversationStore.d.ts.map +1 -0
  49. package/dist/hooks/conversation/useConversationStore.js +10 -0
  50. package/dist/hooks/global/useGlobalEvent.d.ts +2 -0
  51. package/dist/hooks/global/useGlobalEvent.d.ts.map +1 -0
  52. package/dist/hooks/global/useGlobalEvent.js +78 -0
  53. package/dist/hooks/message/useMessage.d.ts +17 -8
  54. package/dist/hooks/message/useMessage.d.ts.map +1 -1
  55. package/dist/hooks/message/useMessage.js +95 -49
  56. package/dist/hooks/message/useSendMessage.d.ts +22 -10
  57. package/dist/hooks/message/useSendMessage.d.ts.map +1 -1
  58. package/dist/hooks/message/useSendMessage.js +214 -20
  59. package/dist/layout/index.d.ts +7 -0
  60. package/dist/layout/index.d.ts.map +1 -0
  61. package/dist/layout/index.js +11 -0
  62. package/dist/screens/deskMessage/index.d.ts.map +1 -1
  63. package/dist/screens/deskMessage/index.js +4 -10
  64. package/dist/styles/global.css +1 -1
  65. package/dist/tsconfig.tsbuildinfo +1 -0
  66. package/dist/types/chat.d.ts +43 -2
  67. package/dist/types/chat.d.ts.map +1 -1
  68. package/dist/types/chat.js +8 -0
  69. package/dist/utils/events.d.ts +13 -0
  70. package/dist/utils/events.d.ts.map +1 -0
  71. package/dist/utils/events.js +4 -0
  72. package/package.json +20 -6
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import dayjs from "dayjs";
3
+ import clsx from "clsx";
4
+ import { Avatar } from "antd";
5
+ import isToday from "dayjs/plugin/isToday";
6
+ import { useChatContext } from "../../../context/ChatContext";
7
+ import { MessageType, SessionType, } from "@openim/wasm-client-sdk";
8
+ import TextMessageItem from "./TextMessage";
9
+ import ImageMessageItem from "./ImageMessage";
10
+ import FileMessageItem from "./FileMessage";
11
+ import VideoMessageItem from "./VideoMessage";
12
+ dayjs.extend(isToday);
13
+ const MessageItem = ({ groupMessage }) => {
14
+ const { user } = useChatContext();
15
+ const messagesInGroup = (groupMessage === null || groupMessage === void 0 ? void 0 : groupMessage.messages) || [];
16
+ const isToday = dayjs(groupMessage === null || groupMessage === void 0 ? void 0 : groupMessage.sendTime).isToday();
17
+ const renderMessageByType = (message) => {
18
+ switch (message === null || message === void 0 ? void 0 : message.contentType) {
19
+ case MessageType.TextMessage:
20
+ return _jsx(TextMessageItem, { message: message });
21
+ case MessageType.PictureMessage:
22
+ return _jsx(ImageMessageItem, { message: message });
23
+ case MessageType.FileMessage:
24
+ return _jsx(FileMessageItem, { message: message });
25
+ case MessageType.VideoMessage:
26
+ return _jsx(VideoMessageItem, { message: message });
27
+ default:
28
+ return _jsx(TextMessageItem, { message: message });
29
+ }
30
+ };
31
+ return (_jsxs("div", { className: "flex flex-col gap-2 my-4 mx-3 sm:mx-4", children: [_jsx("div", { className: "flex justify-center", children: _jsx("span", { className: "text-xs text-gray-600 text-center bg-neutral-100 px-2 py-1 rounded-full", children: dayjs(groupMessage === null || groupMessage === void 0 ? void 0 : groupMessage.sendTime).format(isToday ? "HH:mm" : "HH:mm, DD MMMM") }) }), messagesInGroup === null || messagesInGroup === void 0 ? void 0 : messagesInGroup.map((message, messageIndex) => {
32
+ var _a, _b, _c, _d;
33
+ const isMine = (message === null || message === void 0 ? void 0 : message.sendID) === (user === null || user === void 0 ? void 0 : user.userID);
34
+ const showAvatar = messageIndex === messagesInGroup.length - 1;
35
+ const showSenderName = messageIndex === 0 && (message === null || message === void 0 ? void 0 : message.sessionType) === SessionType.Group;
36
+ return (_jsx("div", { className: clsx("flex", isMine ? "justify-end" : "justify-start"), children: _jsxs("div", { className: clsx("flex flex-1 items-end gap-2", isMine ? "justify-end" : "justify-start"), children: [!isMine && (_jsx("div", { className: "flex items-center justify-center w-[32px] h-[32px]", children: showAvatar && (_jsx(Avatar, { children: ((_b = (_a = message === null || message === void 0 ? void 0 : message.senderNickname) === null || _a === void 0 ? void 0 : _a.charAt) === null || _b === void 0 ? void 0 : _b.call(_a, 0)) || "A" })) })), _jsxs("div", { className: "flex flex-col items-end flex-[0.8]", children: [!isMine && showSenderName && (_jsx("span", { className: "text-xs text-gray-500 mb-1 px-3", children: message === null || message === void 0 ? void 0 : message.senderNickname })), _jsxs("div", { className: clsx("px-3 py-2 rounded-2xl max-w-full break-words flex flex-col flex-1 text-gray-900 gap-1", isMine ? "bg-blue-100" : "bg-gray-100"), children: [(message === null || message === void 0 ? void 0 : message.contentType) === MessageType.MergeMessage ? (_jsxs("div", { children: [(_d = (_c = message === null || message === void 0 ? void 0 : message.mergeElem) === null || _c === void 0 ? void 0 : _c.multiMessage) === null || _d === void 0 ? void 0 : _d.map((item) => {
37
+ return renderMessageByType(item);
38
+ }), (message === null || message === void 0 ? void 0 : message.textElem) && (_jsx(TextMessageItem, { message: message }))] })) : (renderMessageByType(message)), _jsx("span", { className: clsx("text-xs text-gray-500 text-right text-gray-500"), children: dayjs(message === null || message === void 0 ? void 0 : message.sendTime).format("HH:mm") })] })] })] }) }, message === null || message === void 0 ? void 0 : message.clientMsgID));
39
+ })] }, groupMessage === null || groupMessage === void 0 ? void 0 : groupMessage.groupMessageID));
40
+ };
41
+ export default MessageItem;
@@ -1 +1 @@
1
- {"version":3,"file":"ChatContext.d.ts","sourceRoot":"","sources":["../../src/context/ChatContext.tsx"],"names":[],"mappings":"AAIA,OAAO,EACL,eAAe,EACf,iBAAiB,EAElB,MAAM,eAAe,CAAC;AAGvB,eAAO,MAAM,WAAW,0CAGtB,CAAC;AAEH,eAAO,MAAM,cAAc,uBAAgC,CAAC;AAE5D,eAAO,MAAM,YAAY,GAAI,qCAI1B,iBAAiB,4CAyEnB,CAAC"}
1
+ {"version":3,"file":"ChatContext.d.ts","sourceRoot":"","sources":["../../src/context/ChatContext.tsx"],"names":[],"mappings":"AAIA,OAAO,EACL,eAAe,EACf,iBAAiB,EAElB,MAAM,eAAe,CAAC;AAIvB,eAAO,MAAM,WAAW,0CAGtB,CAAC;AAEH,eAAO,MAAM,cAAc,uBAAgC,CAAC;AAE5D,eAAO,MAAM,YAAY,GAAI,qCAI1B,iBAAiB,4CA6EnB,CAAC"}
@@ -4,6 +4,7 @@ import { createContext, useContext, useEffect, useState } from "react";
4
4
  import { CbEvents } from "@openim/wasm-client-sdk";
5
5
  import { ConnectStatus, } from "../types/chat";
6
6
  import { DChatSDK } from "../constants/sdk";
7
+ import MainLayout from "../layout";
7
8
  export const ChatContext = createContext({
8
9
  user: null,
9
10
  connectStatus: ConnectStatus.Disconnected,
@@ -22,16 +23,20 @@ export const ChatProvider = ({ children, config, refetchToken, }) => {
22
23
  });
23
24
  };
24
25
  const handleLogin = (newToken) => {
25
- DChatSDK.login(Object.assign(Object.assign({}, config), { token: newToken || config.token }))
26
- .then((res) => {
27
- getUserInfo();
28
- })
29
- .catch(({ errCode, errMsg }) => {
30
- console.log("handleLogin", errCode, errMsg);
31
- });
26
+ if (config) {
27
+ DChatSDK.login(Object.assign(Object.assign({}, config), { token: newToken || config.token }))
28
+ .then((res) => {
29
+ getUserInfo();
30
+ })
31
+ .catch(({ errCode, errMsg }) => {
32
+ console.log("handleLogin", errCode, errMsg);
33
+ });
34
+ }
32
35
  };
33
36
  useEffect(() => {
34
- handleLogin();
37
+ if (config) {
38
+ handleLogin();
39
+ }
35
40
  }, [config]);
36
41
  useEffect(() => {
37
42
  DChatSDK.on(CbEvents.OnUserTokenExpired, () => {
@@ -67,5 +72,5 @@ export const ChatProvider = ({ children, config, refetchToken, }) => {
67
72
  DChatSDK.off(CbEvents.OnConnecting, () => { });
68
73
  };
69
74
  }, [refetchToken]);
70
- return (_jsx(ChatContext.Provider, { value: { user, connectStatus }, children: children }));
75
+ return (_jsx(ChatContext.Provider, { value: { user, connectStatus }, children: _jsx(MainLayout, { children: children }) }));
71
76
  };
@@ -2,6 +2,7 @@ import { ConversationItem, SessionType } from "@openim/wasm-client-sdk";
2
2
  export declare const useConversationList: (selectedThreadId?: string) => {
3
3
  conversationList: ConversationItem[];
4
4
  getAllConversationList: () => Promise<void>;
5
+ markConversationMessageAsRead: (conversationId: string) => void;
5
6
  };
6
7
  export declare const useConversationDetail: ({ sourceID, sessionType, }: {
7
8
  sourceID: string;
@@ -1 +1 @@
1
- {"version":3,"file":"useConversation.d.ts","sourceRoot":"","sources":["../../../src/hooks/conversation/useConversation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,WAAW,EAEZ,MAAM,yBAAyB,CAAC;AAIjC,eAAO,MAAM,mBAAmB,GAAI,mBAAmB,MAAM;;;CA0C5D,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,4BAGnC;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;CAC1B;;CAuBA,CAAC"}
1
+ {"version":3,"file":"useConversation.d.ts","sourceRoot":"","sources":["../../../src/hooks/conversation/useConversation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,WAAW,EAEZ,MAAM,yBAAyB,CAAC;AAIjC,eAAO,MAAM,mBAAmB,GAAI,mBAAmB,MAAM;;;oDAgBxC,MAAM;CA+C1B,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,4BAGnC;IACD,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;CAC1B;;CAuBA,CAAC"}
@@ -12,27 +12,43 @@ export const useConversationList = (selectedThreadId) => {
12
12
  console.log("getAllConversationList", err);
13
13
  });
14
14
  }, []);
15
+ const markConversationMessageAsRead = useCallback((conversationId) => {
16
+ if (!conversationId)
17
+ return;
18
+ DChatSDK.markConversationMessageAsRead(conversationId)
19
+ .then()
20
+ .catch(({ errCode, errMsg }) => {
21
+ // Failed call
22
+ });
23
+ }, []);
15
24
  useEffect(() => {
16
25
  getAllConversationList();
17
26
  }, [getAllConversationList]);
18
27
  useEffect(() => {
19
- DChatSDK.on(CbEvents.OnConversationChanged, ({ data }) => {
20
- setConversationList(data);
21
- });
28
+ const handler = ({ data }) => {
29
+ setConversationList((prev) => {
30
+ // Tạo map để cập nhật
31
+ const map = new Map(prev.map((c) => [c.conversationID, c]));
32
+ data.forEach((changed) => {
33
+ map.set(changed.conversationID, changed);
34
+ });
35
+ return Array.from(map.values());
36
+ });
37
+ };
38
+ DChatSDK.on(CbEvents.OnConversationChanged, handler);
22
39
  return () => {
23
- DChatSDK.off(CbEvents.OnConversationChanged, () => { });
40
+ DChatSDK.off(CbEvents.OnConversationChanged, handler);
24
41
  };
25
42
  }, []);
26
43
  useEffect(() => {
27
44
  if (selectedThreadId) {
28
- DChatSDK.markConversationMessageAsRead(selectedThreadId).catch(({ errCode, errMsg }) => {
29
- console.error("Failed to mark messages as read", errCode, errMsg);
30
- });
45
+ markConversationMessageAsRead(selectedThreadId);
31
46
  }
32
- }, [selectedThreadId]);
47
+ }, [selectedThreadId, markConversationMessageAsRead]);
33
48
  return {
34
49
  conversationList,
35
50
  getAllConversationList,
51
+ markConversationMessageAsRead,
36
52
  };
37
53
  };
38
54
  export const useConversationDetail = ({ sourceID, sessionType, }) => {
@@ -0,0 +1,12 @@
1
+ import { ConversationItem } from "@openim/wasm-client-sdk";
2
+ interface ConversationStore {
3
+ conversationData: ConversationItem | null;
4
+ setConversationData: (data: ConversationItem) => void;
5
+ selectedThreadId: string;
6
+ selectedSourceId: string;
7
+ setSelectedThreadId: (threadId: string) => void;
8
+ setSelectedSourceId: (sourceId: string) => void;
9
+ }
10
+ declare const useConversationStore: import("zustand").UseBoundStore<import("zustand").StoreApi<ConversationStore>>;
11
+ export default useConversationStore;
12
+ //# sourceMappingURL=useConversationStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useConversationStore.d.ts","sourceRoot":"","sources":["../../../src/hooks/conversation/useConversationStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,UAAU,iBAAiB;IACzB,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC1C,mBAAmB,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACtD,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,mBAAmB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACjD;AAED,QAAA,MAAM,oBAAoB,gFAOvB,CAAC;AAEJ,eAAe,oBAAoB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { create } from "zustand";
2
+ const useConversationStore = create((set) => ({
3
+ conversationData: null,
4
+ setConversationData: (data) => set({ conversationData: data }),
5
+ selectedThreadId: "",
6
+ setSelectedThreadId: (threadId) => set({ selectedThreadId: threadId }),
7
+ selectedSourceId: "",
8
+ setSelectedSourceId: (sourceId) => set({ selectedSourceId: sourceId }),
9
+ }));
10
+ export default useConversationStore;
@@ -0,0 +1,2 @@
1
+ export declare const useGlobalEvent: () => void;
2
+ //# sourceMappingURL=useGlobalEvent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGlobalEvent.d.ts","sourceRoot":"","sources":["../../../src/hooks/global/useGlobalEvent.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,cAAc,YAqF1B,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { useEffect } from "react";
2
+ import { DChatSDK } from "../../constants/sdk";
3
+ import { CbEvents, MessageType, SessionType, } from "@openim/wasm-client-sdk";
4
+ import { CustomType } from "../../types/chat";
5
+ import { pushNewMessage, updateOneMessage } from "../message/useMessage";
6
+ import { useChatContext } from "../../context/ChatContext";
7
+ import useConversationStore from "../conversation/useConversationStore";
8
+ const notPushType = [MessageType.TypingMessage, MessageType.RevokeMessage];
9
+ export const useGlobalEvent = () => {
10
+ const { user } = useChatContext();
11
+ const selectedSourceId = useConversationStore((state) => state.selectedSourceId);
12
+ const revokedMessageHandler = ({ data }) => {
13
+ updateOneMessage({
14
+ clientMsgID: data.clientMsgID,
15
+ contentType: MessageType.RevokeMessage,
16
+ notificationElem: {
17
+ detail: JSON.stringify(data),
18
+ },
19
+ });
20
+ };
21
+ const inCurrentConversation = (newServerMsg) => {
22
+ switch (newServerMsg.sessionType) {
23
+ case SessionType.Single:
24
+ return (newServerMsg.sendID === selectedSourceId ||
25
+ ((user === null || user === void 0 ? void 0 : user.userID) && newServerMsg.recvID === selectedSourceId));
26
+ case SessionType.Group:
27
+ case SessionType.WorkingGroup:
28
+ return newServerMsg.groupID === selectedSourceId;
29
+ case SessionType.Notification:
30
+ return newServerMsg.sendID === selectedSourceId;
31
+ default:
32
+ return false;
33
+ }
34
+ };
35
+ const handleNewMessage = (newServerMsg) => {
36
+ if (newServerMsg.contentType === MessageType.CustomMessage) {
37
+ const customData = JSON.parse(newServerMsg.customElem.data);
38
+ if (CustomType.CallingInvite <= customData.customType &&
39
+ customData.customType <= CustomType.CallingHungup) {
40
+ return;
41
+ }
42
+ }
43
+ if (!inCurrentConversation(newServerMsg))
44
+ return;
45
+ if (!notPushType.includes(newServerMsg.contentType)) {
46
+ pushNewMessage(newServerMsg);
47
+ }
48
+ };
49
+ const newMessageHandler = ({ data }) => {
50
+ data.map((message) => handleNewMessage(message));
51
+ };
52
+ const loginCheck = async () => {
53
+ // check openIM token and user info
54
+ };
55
+ const setIMListener = () => {
56
+ // message
57
+ DChatSDK.on(CbEvents.OnRecvNewMessages, newMessageHandler);
58
+ DChatSDK.on(CbEvents.OnNewRecvMessageRevoked, revokedMessageHandler);
59
+ };
60
+ const disposeIMListener = () => {
61
+ // message
62
+ DChatSDK.off(CbEvents.OnRecvNewMessages, newMessageHandler);
63
+ };
64
+ /** LIFE CYCLE */
65
+ useEffect(() => {
66
+ loginCheck();
67
+ setIMListener();
68
+ window.addEventListener("online", () => {
69
+ DChatSDK.networkStatusChanged();
70
+ });
71
+ window.addEventListener("offline", () => {
72
+ DChatSDK.networkStatusChanged();
73
+ });
74
+ return () => {
75
+ disposeIMListener();
76
+ };
77
+ }, []);
78
+ };
@@ -1,12 +1,21 @@
1
1
  import { MessageItem } from "@openim/wasm-client-sdk";
2
2
  import { GroupMessageItem } from "../../types/chat";
3
- export declare const useMessage: (conversationId?: string) => {
4
- groupMessages: GroupMessageItem[];
5
- refetch: () => void;
6
- markConversationMessageAsRead: (message?: MessageItem) => void;
7
- isEnd?: boolean | undefined;
8
- errCode?: number | undefined;
9
- errMsg?: string | undefined;
10
- messageList?: MessageItem[] | undefined;
3
+ export declare const useMessage: (conversationId: string) => {
4
+ loadState: {
5
+ initLoading: boolean;
6
+ hasMoreOld: boolean;
7
+ messageList: MessageItem[];
8
+ groupMessageList: GroupMessageItem[];
9
+ };
10
+ latestLoadState: import("react").RefObject<{
11
+ initLoading: boolean;
12
+ hasMoreOld: boolean;
13
+ messageList: MessageItem[];
14
+ groupMessageList: GroupMessageItem[];
15
+ }>;
16
+ moreOldLoading: boolean;
17
+ getMoreOldMessages: (loadMore?: any) => Promise<void>;
11
18
  };
19
+ export declare const pushNewMessage: (message: MessageItem) => void;
20
+ export declare const updateOneMessage: (message: MessageItem) => void;
12
21
  //# sourceMappingURL=useMessage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useMessage.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,WAAW,EACZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAqB,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEvE,eAAO,MAAM,UAAU,GAAI,iBAAiB,MAAM;;;8CAgEnC,WAAW;;;;;CA8BzB,CAAC"}
1
+ {"version":3,"file":"useMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useMessage.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAqB,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAOvE,eAAO,MAAM,UAAU,GAAI,gBAAgB,MAAM;;;;qBAI1B,WAAW,EAAE;0BACR,gBAAgB,EAAE;;;;;qBADvB,WAAW,EAAE;0BACR,gBAAgB,EAAE;;;;CA8I7C,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,SAAS,WAAW,SACpB,CAAC;AAChC,eAAO,MAAM,gBAAgB,GAAI,SAAS,WAAW,SACpB,CAAC"}
@@ -1,13 +1,22 @@
1
- import { useCallback, useEffect, useMemo, useState } from "react";
2
- import { ViewType, CbEvents, } from "@openim/wasm-client-sdk";
1
+ import { useEffect, useState } from "react";
2
+ import { ViewType } from "@openim/wasm-client-sdk";
3
3
  import { DChatSDK } from "../../constants/sdk";
4
+ import { v4 as uuidv4 } from "uuid";
5
+ import { useLatest, useRequest } from "ahooks";
6
+ import emitter, { emit } from "../../utils/events";
7
+ const PAGE_SIZE = 50;
4
8
  export const useMessage = (conversationId) => {
5
- const [dataMessages, setDataMessages] = useState(null);
6
- const groupMessages = useMemo(() => {
7
- var _a;
8
- if (!dataMessages || !(dataMessages === null || dataMessages === void 0 ? void 0 : dataMessages.messageList))
9
+ const [loadState, setLoadState] = useState({
10
+ initLoading: true,
11
+ hasMoreOld: true,
12
+ messageList: [],
13
+ groupMessageList: [],
14
+ });
15
+ const latestLoadState = useLatest(loadState);
16
+ const parseGroupMessageList = (messageList) => {
17
+ if (!messageList)
9
18
  return [];
10
- const mGroupMessages = (_a = dataMessages === null || dataMessages === void 0 ? void 0 : dataMessages.messageList) === null || _a === void 0 ? void 0 : _a.reduce((acc, cur) => {
19
+ const mGroupMessages = messageList === null || messageList === void 0 ? void 0 : messageList.reduce((acc, cur) => {
11
20
  const extendMessageInfo = JSON.parse((cur === null || cur === void 0 ? void 0 : cur.ex) || "{}");
12
21
  if (extendMessageInfo === null || extendMessageInfo === void 0 ? void 0 : extendMessageInfo.groupMessageID) {
13
22
  const findGroupMessageIndex = acc.findIndex((item) => item.groupMessageID === (extendMessageInfo === null || extendMessageInfo === void 0 ? void 0 : extendMessageInfo.groupMessageID));
@@ -23,56 +32,93 @@ export const useMessage = (conversationId) => {
23
32
  acc[findGroupMessageIndex].messages.push(cur);
24
33
  }
25
34
  }
35
+ else {
36
+ acc.push({
37
+ groupMessageID: uuidv4(),
38
+ messages: [cur],
39
+ sendID: cur.sendID,
40
+ sendTime: cur.sendTime,
41
+ });
42
+ }
26
43
  return acc;
27
44
  }, []);
28
45
  return mGroupMessages;
29
- }, [dataMessages]);
30
- console.log("groupMessages", groupMessages);
31
- const getAdvancedHistoryMessageList = useCallback(() => {
32
- if (!conversationId)
33
- return;
34
- DChatSDK.getSelfUserInfo()
35
- .then(({ data }) => {
36
- console.log("getSelfUserInfo", data);
37
- })
38
- .catch(({ errCode, errMsg }) => {
39
- console.log("getSelfUserInfo", errCode, errMsg);
40
- });
41
- DChatSDK.getAdvancedHistoryMessageList({
42
- conversationID: conversationId,
43
- count: 1000,
44
- startClientMsgID: "",
46
+ };
47
+ const { loading: moreOldLoading, runAsync: getMoreOldMessages } = useRequest(async (loadMore = true) => {
48
+ var _a, _b;
49
+ const reqConversationID = conversationId;
50
+ const { data } = await DChatSDK.getAdvancedHistoryMessageList({
51
+ count: PAGE_SIZE,
52
+ startClientMsgID: loadMore
53
+ ? ((_b = (_a = latestLoadState.current) === null || _a === void 0 ? void 0 : _a.messageList[0]) === null || _b === void 0 ? void 0 : _b.clientMsgID) || ""
54
+ : "",
55
+ conversationID: conversationId !== null && conversationId !== void 0 ? conversationId : "",
45
56
  viewType: ViewType.History,
46
- })
47
- .then(({ data }) => {
48
- setDataMessages(data);
49
- })
50
- .catch((err) => {
51
- console.log("getAdvancedHistoryMessageList", err);
52
57
  });
53
- }, [conversationId]);
54
- const onRecvNewMessages = useCallback((data) => {
55
- getAdvancedHistoryMessageList();
56
- }, [getAdvancedHistoryMessageList]);
57
- const markConversationMessageAsRead = useCallback((message) => {
58
- if (!conversationId)
58
+ if (conversationId !== reqConversationID)
59
59
  return;
60
- DChatSDK.markConversationMessageAsRead(conversationId)
61
- .then()
62
- .catch(({ errCode, errMsg }) => {
63
- // Failed call
64
- });
65
- }, [conversationId]);
60
+ setTimeout(() => setLoadState((preState) => {
61
+ const messageList = [
62
+ ...data.messageList,
63
+ ...(loadMore ? preState.messageList : []),
64
+ ];
65
+ const groupMessageList = parseGroupMessageList(messageList);
66
+ return Object.assign(Object.assign({}, preState), { initLoading: false, hasMoreOld: !data.isEnd, messageList,
67
+ groupMessageList });
68
+ }));
69
+ }, {
70
+ manual: true,
71
+ });
72
+ const loadHistoryMessages = () => getMoreOldMessages(false);
66
73
  useEffect(() => {
67
- getAdvancedHistoryMessageList();
68
- }, [getAdvancedHistoryMessageList]);
74
+ const pushNewMessage = (message) => {
75
+ var _a, _b;
76
+ if ((_b = (_a = latestLoadState.current) === null || _a === void 0 ? void 0 : _a.messageList) === null || _b === void 0 ? void 0 : _b.find((item) => item.clientMsgID === message.clientMsgID)) {
77
+ return;
78
+ }
79
+ setLoadState((preState) => {
80
+ const messageList = [...preState.messageList, message];
81
+ const groupMessageList = parseGroupMessageList(messageList);
82
+ return Object.assign(Object.assign({}, preState), { messageList,
83
+ groupMessageList });
84
+ });
85
+ };
86
+ const updateOneMessage = (message) => {
87
+ setLoadState((preState) => {
88
+ const tmpList = [...preState.messageList];
89
+ const idx = tmpList.findIndex((msg) => msg.clientMsgID === message.clientMsgID);
90
+ if (idx < 0) {
91
+ return preState;
92
+ }
93
+ tmpList[idx] = Object.assign(Object.assign({}, tmpList[idx]), message);
94
+ const groupMessageList = parseGroupMessageList(tmpList);
95
+ return Object.assign(Object.assign({}, preState), { messageList: tmpList, groupMessageList });
96
+ });
97
+ };
98
+ emitter.on("PUSH_NEW_MSG", pushNewMessage);
99
+ emitter.on("UPDATE_ONE_MSG", updateOneMessage);
100
+ return () => {
101
+ emitter.off("PUSH_NEW_MSG", pushNewMessage);
102
+ emitter.off("UPDATE_ONE_MSG", updateOneMessage);
103
+ };
104
+ }, []);
69
105
  useEffect(() => {
70
- DChatSDK.on(CbEvents.OnRecvNewMessages, ({ data }) => {
71
- onRecvNewMessages(data);
72
- });
106
+ loadHistoryMessages();
73
107
  return () => {
74
- DChatSDK.off(CbEvents.OnRecvNewMessages, () => { });
108
+ setLoadState(() => ({
109
+ initLoading: true,
110
+ hasMoreOld: true,
111
+ messageList: [],
112
+ groupMessageList: [],
113
+ }));
75
114
  };
76
- }, [onRecvNewMessages]);
77
- return Object.assign(Object.assign({}, dataMessages), { groupMessages, refetch: getAdvancedHistoryMessageList, markConversationMessageAsRead });
115
+ }, [conversationId]);
116
+ return {
117
+ loadState,
118
+ latestLoadState,
119
+ moreOldLoading,
120
+ getMoreOldMessages,
121
+ };
78
122
  };
123
+ export const pushNewMessage = (message) => emit("PUSH_NEW_MSG", message);
124
+ export const updateOneMessage = (message) => emit("UPDATE_ONE_MSG", message);
@@ -1,13 +1,25 @@
1
- import { MessageItem } from "@openim/wasm-client-sdk";
2
- import { ExtendMessageInfo } from "../../types/chat";
3
- interface SendMessageProps {
4
- recvID: string;
5
- groupID: string;
6
- }
1
+ import { MergerMsgParams, MessageItem } from "@openim/wasm-client-sdk";
2
+ import { ExtendMessageInfo, FileMsgParamsByFile, ImageMsgParamsByFile, VideoMsgParamsByFile } from "../../types/chat";
3
+ import { UploadFile } from "antd";
7
4
  export declare const createTextMessage: (text: string) => Promise<MessageItem | null>;
8
- export declare const useSendMessage: (props: SendMessageProps) => {
9
- sendTextMessage: (text: string, lastMessage?: MessageItem) => Promise<boolean>;
5
+ export declare const createImageMessageByFile: (file: ImageMsgParamsByFile) => Promise<MessageItem | null>;
6
+ export declare const createMergerMessage: (mergerMsgParams: MergerMsgParams) => Promise<MessageItem | null>;
7
+ export declare const createVideoMessageByFile: (file: VideoMsgParamsByFile) => Promise<MessageItem | null>;
8
+ export declare const createFileMessageByFile: (file: FileMsgParamsByFile) => Promise<MessageItem | null>;
9
+ export declare const useSendMessage: (lastMessage?: MessageItem) => {
10
+ sendTextMessage: ({ plainText, richText, }: {
11
+ plainText: string;
12
+ richText: string;
13
+ }) => Promise<void>;
14
+ sendMergeMessage: ({ richText, plainText, files, }: {
15
+ richText: string;
16
+ plainText: string;
17
+ files: UploadFile[];
18
+ }) => Promise<void>;
10
19
  };
11
- export declare const generateExtendMessageInfo: (currentUserID: string, lastMessage?: MessageItem) => ExtendMessageInfo;
12
- export {};
20
+ export declare const generateExtendMessageInfo: ({ richText, currentUserID, lastMessage, }: {
21
+ richText?: string;
22
+ currentUserID: string;
23
+ lastMessage?: MessageItem;
24
+ }) => ExtendMessageInfo;
13
25
  //# sourceMappingURL=useSendMessage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSendMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useSendMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAMrD,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,iBAAiB,GAAU,MAAM,MAAM,gCAanD,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,OAAO,gBAAgB;4BAKrC,MAAM,gBAAgB,WAAW;CAiCjD,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,eAAe,MAAM,EACrB,cAAc,WAAW,KAapB,iBACN,CAAC"}
1
+ {"version":3,"file":"useSendMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useSendMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,WAAW,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,kBAAkB,CAAC;AAQ1B,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAGlC,eAAO,MAAM,iBAAiB,GAAU,MAAM,MAAM,gCAanD,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,MAAM,oBAAoB,gCAaxE,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,iBAAiB,eAAe,gCAazE,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,MAAM,oBAAoB,gCAaxE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,MAAM,mBAAmB,gCAatE,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,cAAc,WAAW;gDAiCjD;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB;wDAwBE;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,UAAU,EAAE,CAAC;KACrB;CA4FJ,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,2CAIvC;IACD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,KAmBM,iBACN,CAAC"}