@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.
- package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
- package/dist/components/conversation/DeskConversationList.js +15 -10
- package/dist/components/message/MessageHeader.d.ts +8 -0
- package/dist/components/message/MessageHeader.d.ts.map +1 -0
- package/dist/components/message/MessageHeader.js +9 -0
- package/dist/components/message/MessageList.d.ts +1 -1
- package/dist/components/message/MessageList.d.ts.map +1 -1
- package/dist/components/message/MessageList.js +41 -113
- package/dist/components/message/footer/ActionBar.d.ts +3 -0
- package/dist/components/message/footer/ActionBar.d.ts.map +1 -0
- package/dist/components/message/footer/ActionBar.js +143 -0
- package/dist/components/message/footer/EmojiPicker.d.ts +7 -0
- package/dist/components/message/footer/EmojiPicker.d.ts.map +1 -0
- package/dist/components/message/footer/EmojiPicker.js +151 -0
- package/dist/components/message/footer/EnterHandler.d.ts +2 -0
- package/dist/components/message/footer/EnterHandler.d.ts.map +1 -0
- package/dist/components/message/footer/EnterHandler.js +106 -0
- package/dist/components/message/footer/FilePreview.d.ts +10 -0
- package/dist/components/message/footer/FilePreview.d.ts.map +1 -0
- package/dist/components/message/footer/FilePreview.js +48 -0
- package/dist/components/message/footer/ToolbarPlugin.d.ts +2 -0
- package/dist/components/message/footer/ToolbarPlugin.d.ts.map +1 -0
- package/dist/components/message/footer/ToolbarPlugin.js +169 -0
- package/dist/components/message/footer/index.d.ts +10 -0
- package/dist/components/message/footer/index.d.ts.map +1 -0
- package/dist/components/message/footer/index.js +65 -0
- package/dist/components/message/item/FileMessage.d.ts +7 -0
- package/dist/components/message/item/FileMessage.d.ts.map +1 -0
- package/dist/components/message/item/FileMessage.js +27 -0
- package/dist/components/message/item/ImageMessage.d.ts +7 -0
- package/dist/components/message/item/ImageMessage.d.ts.map +1 -0
- package/dist/components/message/item/ImageMessage.js +23 -0
- package/dist/components/message/item/TextMessage.d.ts +7 -0
- package/dist/components/message/item/TextMessage.d.ts.map +1 -0
- package/dist/components/message/item/TextMessage.js +21 -0
- package/dist/components/message/item/VideoMessage.d.ts +7 -0
- package/dist/components/message/item/VideoMessage.d.ts.map +1 -0
- package/dist/components/message/item/VideoMessage.js +20 -0
- package/dist/components/message/item/index.d.ts +7 -0
- package/dist/components/message/item/index.d.ts.map +1 -0
- package/dist/components/message/item/index.js +41 -0
- package/dist/context/ChatContext.d.ts.map +1 -1
- package/dist/context/ChatContext.js +14 -9
- package/dist/hooks/conversation/useConversation.d.ts +1 -0
- package/dist/hooks/conversation/useConversation.d.ts.map +1 -1
- package/dist/hooks/conversation/useConversation.js +24 -8
- package/dist/hooks/conversation/useConversationStore.d.ts +12 -0
- package/dist/hooks/conversation/useConversationStore.d.ts.map +1 -0
- package/dist/hooks/conversation/useConversationStore.js +10 -0
- package/dist/hooks/global/useGlobalEvent.d.ts +2 -0
- package/dist/hooks/global/useGlobalEvent.d.ts.map +1 -0
- package/dist/hooks/global/useGlobalEvent.js +78 -0
- package/dist/hooks/message/useMessage.d.ts +17 -8
- package/dist/hooks/message/useMessage.d.ts.map +1 -1
- package/dist/hooks/message/useMessage.js +95 -49
- package/dist/hooks/message/useSendMessage.d.ts +22 -10
- package/dist/hooks/message/useSendMessage.d.ts.map +1 -1
- package/dist/hooks/message/useSendMessage.js +214 -20
- package/dist/layout/index.d.ts +7 -0
- package/dist/layout/index.d.ts.map +1 -0
- package/dist/layout/index.js +11 -0
- package/dist/screens/deskMessage/index.d.ts.map +1 -1
- package/dist/screens/deskMessage/index.js +4 -10
- package/dist/styles/global.css +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/chat.d.ts +43 -2
- package/dist/types/chat.d.ts.map +1 -1
- package/dist/types/chat.js +8 -0
- package/dist/utils/events.d.ts +13 -0
- package/dist/utils/events.d.ts.map +1 -0
- package/dist/utils/events.js +4 -0
- 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;
|
|
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
|
-
|
|
26
|
-
.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
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;;;
|
|
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
|
-
|
|
20
|
-
setConversationList(
|
|
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
|
-
|
|
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 @@
|
|
|
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
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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,
|
|
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 {
|
|
2
|
-
import { ViewType
|
|
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 [
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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 =
|
|
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
|
-
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
68
|
-
|
|
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
|
-
|
|
71
|
-
onRecvNewMessages(data);
|
|
72
|
-
});
|
|
106
|
+
loadHistoryMessages();
|
|
73
107
|
return () => {
|
|
74
|
-
|
|
108
|
+
setLoadState(() => ({
|
|
109
|
+
initLoading: true,
|
|
110
|
+
hasMoreOld: true,
|
|
111
|
+
messageList: [],
|
|
112
|
+
groupMessageList: [],
|
|
113
|
+
}));
|
|
75
114
|
};
|
|
76
|
-
}, [
|
|
77
|
-
return
|
|
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
|
-
|
|
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
|
|
9
|
-
|
|
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: (
|
|
12
|
-
|
|
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,
|
|
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"}
|