@droppii-org/chat-sdk 0.0.23 → 0.0.24
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/chatBubble/ChatBubble.d.ts +1 -5
- package/dist/components/chatBubble/ChatBubble.d.ts.map +1 -1
- package/dist/components/chatBubble/ChatBubble.js +5 -7
- package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
- package/dist/components/conversation/DeskConversationList.js +2 -3
- package/dist/components/message/item/index.d.ts +1 -1
- package/dist/components/message/item/index.d.ts.map +1 -1
- package/dist/components/message/item/index.js +20 -1
- package/dist/screens/chatBubble/index.d.ts +0 -1
- package/dist/screens/chatBubble/index.d.ts.map +1 -1
- package/dist/screens/chatBubble/index.js +17 -2
- package/package.json +1 -1
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import { SessionType } from "@openim/wasm-client-sdk";
|
|
2
1
|
interface ChatBubbleProps {
|
|
3
|
-
conversationId: string;
|
|
4
|
-
sourceID: string;
|
|
5
|
-
sessionType: SessionType;
|
|
6
2
|
className?: string;
|
|
7
3
|
}
|
|
8
|
-
declare const ChatBubble: ({
|
|
4
|
+
declare const ChatBubble: ({ className }: ChatBubbleProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
5
|
export default ChatBubble;
|
|
10
6
|
//# sourceMappingURL=ChatBubble.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatBubble.d.ts","sourceRoot":"","sources":["../../../src/components/chatBubble/ChatBubble.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChatBubble.d.ts","sourceRoot":"","sources":["../../../src/components/chatBubble/ChatBubble.tsx"],"names":[],"mappings":"AAOA,UAAU,eAAe;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,UAAU,GAAI,eAAe,eAAe,4CAsDjD,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -4,12 +4,10 @@ import { useState } from "react";
|
|
|
4
4
|
import { FloatButton, Drawer } from "antd";
|
|
5
5
|
import { MessageOutlined, CloseOutlined } from "@ant-design/icons";
|
|
6
6
|
import MessageList from "../message/MessageList";
|
|
7
|
-
import
|
|
8
|
-
const ChatBubble = ({
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
sessionType,
|
|
12
|
-
});
|
|
7
|
+
import useConversationStore from "../../hooks/conversation/useConversationStore";
|
|
8
|
+
const ChatBubble = ({ className }) => {
|
|
9
|
+
const conversationDetail = useConversationStore((state) => state.conversationData);
|
|
10
|
+
const selectedThreadId = useConversationStore((state) => state.selectedThreadId);
|
|
13
11
|
const [isOpen, setIsOpen] = useState(false);
|
|
14
12
|
const toggleChat = () => {
|
|
15
13
|
setIsOpen(!isOpen);
|
|
@@ -23,6 +21,6 @@ const ChatBubble = ({ conversationId, sourceID, sessionType, className, }) => {
|
|
|
23
21
|
body: { padding: 0 },
|
|
24
22
|
}, classNames: {
|
|
25
23
|
wrapper: "!z-[9999]",
|
|
26
|
-
}, children: _jsx(MessageList, { conversationId:
|
|
24
|
+
}, children: _jsx(MessageList, { conversationId: selectedThreadId, conversationData: conversationDetail, className: "flex-1", onClose: () => setIsOpen(false) }) })] }));
|
|
27
25
|
};
|
|
28
26
|
export default ChatBubble;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeskConversationList.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/DeskConversationList.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DeskConversationList.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/DeskConversationList.tsx"],"names":[],"mappings":"AAqGA,UAAU,yBAAyB;IACjC,oBAAoB,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,oBAAoB,GAAI,sCAG3B,yBAAyB,4CAgM3B,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -64,8 +64,7 @@ const formatTimestamp = (timestamp) => {
|
|
|
64
64
|
};
|
|
65
65
|
// Transform API data to UI-friendly format
|
|
66
66
|
const transformConversationData = (apiData, currentUserId) => {
|
|
67
|
-
return apiData.map((conv) => (Object.assign(Object.assign({}, conv), { id: conv.conversationID, threadId: conv.conversationID, name: conv.showName || "Unknown User", username: conv.userID || conv.groupID || "", avatar: conv.faceURL ||
|
|
68
|
-
"https://i.pinimg.com/736x/55/e5/ed/55e5edbb1a5b5f6e4f3cefc98de629ca.jpg", lastMessage: parseLatestMessage(conv.latestMsg, currentUserId), timestamp: formatTimestamp(conv.latestMsgSendTime), unreadCount: conv.unreadCount, isOnline: true, source: conv.conversationType === 3 ? "group" : "direct" })));
|
|
67
|
+
return apiData.map((conv) => (Object.assign(Object.assign({}, conv), { id: conv.conversationID, threadId: conv.conversationID, name: conv.showName || "Unknown User", username: conv.userID || conv.groupID || "", avatar: conv.faceURL || "", lastMessage: parseLatestMessage(conv.latestMsg, currentUserId), timestamp: formatTimestamp(conv.latestMsgSendTime), unreadCount: conv.unreadCount, isOnline: true, source: conv.conversationType === 3 ? "group" : "direct" })));
|
|
69
68
|
};
|
|
70
69
|
const DeskConversationList = ({ onConversationSelect, className = "", }) => {
|
|
71
70
|
const [searchQuery, setSearchQuery] = useState("");
|
|
@@ -125,7 +124,7 @@ const DeskConversationList = ({ onConversationSelect, className = "", }) => {
|
|
|
125
124
|
}, [selectedThreadId, onSetSelectedSourceId]);
|
|
126
125
|
return (_jsxs("div", { className: `flex flex-col h-full bg-white border-r border-gray-200 w-[320px] ${className}`, children: [_jsx("div", { className: "p-3 border-b border-gray-200", children: _jsx(Input, { placeholder: "T\u00ECm ki\u1EBFm", prefix: _jsx(Icon, { icon: "search-o", size: 18, className: "text-gray-400" }), value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), className: "rounded-lg" }) }), _jsxs("div", { className: "flex-1 overflow-y-auto", children: [filteredConversations.map((conversation) => (_jsxs("div", { onClick: () => handleConversationClick(conversation), className: `relative p-3 border-b border-gray-100 hover:bg-gray-50 cursor-pointer transition-colors ${selectedThreadId === conversation.threadId
|
|
127
126
|
? "bg-blue-50"
|
|
128
|
-
: "bg-white"}`, children: [selectedThreadId === conversation.threadId && (_jsx("div", { className: "absolute left-0 top-0 bottom-0 w-1 bg-blue-500" })), _jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "relative flex-shrink-0", children: _jsx(Badge, { dot: conversation.isOnline, status: conversation.isOnline ? "success" : "default", offset: [-2, 36], children: _jsx(Avatar, { size: 48, src: conversation.avatar, alt: conversation.name }) }) }), _jsx("div", { className: "flex-1 min-w-0", children: _jsxs("div", { className: "flex items-start justify-between", children: [_jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("h3", { className: "font-semibold text-gray-900 text-sm truncate", children: conversation.name }), _jsx("p", { className: "text-xs text-gray-500 truncate mt-0.5", children: conversation.lastMessage })] }), _jsxs("div", { className: "flex flex-col items-end gap-1 ml-2", children: [_jsx("span", { className: "text-xs text-gray-400", children: conversation.timestamp }), _jsx("div", { className: "flex items-center gap-1", children: conversation.unreadCount > 0 && (_jsx(Badge, { count: conversation.unreadCount })) })] })] }) })] })] }, conversation.id))), filteredConversations.length === 0 && (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx(Empty, { image: _jsx(Icon, { icon: "chat-square-b", size: 48, className: "text-gray-300" }), description: _jsxs("div", { children: [_jsx("p", { className: "text-lg font-medium mb-2 text-gray-500", children: "Kh\u00F4ng t\u00ECm th\u1EA5y cu\u1ED9c tr\u00F2 chuy\u1EC7n" }), _jsx("p", { className: "text-sm text-gray-400", children: searchQuery
|
|
127
|
+
: "bg-white"}`, children: [selectedThreadId === conversation.threadId && (_jsx("div", { className: "absolute left-0 top-0 bottom-0 w-1 bg-blue-500" })), _jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "relative flex-shrink-0", children: _jsx(Badge, { dot: conversation.isOnline, status: conversation.isOnline ? "success" : "default", offset: [-2, 36], children: _jsx(Avatar, { size: 48, src: conversation.avatar, alt: conversation.name, children: conversation.name.charAt(0).toUpperCase() }) }) }), _jsx("div", { className: "flex-1 min-w-0", children: _jsxs("div", { className: "flex items-start justify-between", children: [_jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("h3", { className: "font-semibold text-gray-900 text-sm truncate", children: conversation.name }), _jsx("p", { className: "text-xs text-gray-500 truncate mt-0.5", children: conversation.lastMessage })] }), _jsxs("div", { className: "flex flex-col items-end gap-1 ml-2", children: [_jsx("span", { className: "text-xs text-gray-400", children: conversation.timestamp }), _jsx("div", { className: "flex items-center gap-1", children: conversation.unreadCount > 0 && (_jsx(Badge, { count: conversation.unreadCount })) })] })] }) })] })] }, conversation.id))), filteredConversations.length === 0 && (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx(Empty, { image: _jsx(Icon, { icon: "chat-square-b", size: 48, className: "text-gray-300" }), description: _jsxs("div", { children: [_jsx("p", { className: "text-lg font-medium mb-2 text-gray-500", children: "Kh\u00F4ng t\u00ECm th\u1EA5y cu\u1ED9c tr\u00F2 chuy\u1EC7n" }), _jsx("p", { className: "text-sm text-gray-400", children: searchQuery
|
|
129
128
|
? "Thử tìm kiếm với từ khóa khác"
|
|
130
129
|
: "Chưa có cuộc trò chuyện nào" })] }) }) }))] })] }));
|
|
131
130
|
};
|
|
@@ -2,6 +2,6 @@ import { GroupMessageItem } from "../../../types/chat";
|
|
|
2
2
|
interface MessageItemProps {
|
|
3
3
|
groupMessage: GroupMessageItem;
|
|
4
4
|
}
|
|
5
|
-
declare const MessageItem: ({ groupMessage }: MessageItemProps) => import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
declare const MessageItem: ({ groupMessage }: MessageItemProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
6
6
|
export default MessageItem;
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAkBvD,UAAU,gBAAgB;IACxB,YAAY,EAAE,gBAAgB,CAAC;CAChC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAkBvD,UAAU,gBAAgB;IACxB,YAAY,EAAE,gBAAgB,CAAC;CAChC;AAiBD,QAAA,MAAM,WAAW,GAAI,kBAAkB,gBAAgB,mDA2GtD,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -10,10 +10,25 @@ import ImageMessageItem from "./ImageMessage";
|
|
|
10
10
|
import FileMessageItem from "./FileMessage";
|
|
11
11
|
import VideoMessageItem from "./VideoMessage";
|
|
12
12
|
dayjs.extend(isToday);
|
|
13
|
+
const visibleTypeMessage = [
|
|
14
|
+
MessageType.TextMessage,
|
|
15
|
+
MessageType.PictureMessage,
|
|
16
|
+
MessageType.VoiceMessage,
|
|
17
|
+
MessageType.VideoMessage,
|
|
18
|
+
MessageType.FileMessage,
|
|
19
|
+
MessageType.AtTextMessage,
|
|
20
|
+
MessageType.MergeMessage,
|
|
21
|
+
MessageType.CardMessage,
|
|
22
|
+
MessageType.LocationMessage,
|
|
23
|
+
MessageType.CustomMessage,
|
|
24
|
+
MessageType.QuoteMessage,
|
|
25
|
+
MessageType.FaceMessage,
|
|
26
|
+
];
|
|
13
27
|
const MessageItem = ({ groupMessage }) => {
|
|
14
28
|
const { user } = useChatContext();
|
|
15
29
|
const messagesInGroup = (groupMessage === null || groupMessage === void 0 ? void 0 : groupMessage.messages) || [];
|
|
16
30
|
const isToday = dayjs(groupMessage === null || groupMessage === void 0 ? void 0 : groupMessage.sendTime).isToday();
|
|
31
|
+
const isVisibleGroup = messagesInGroup === null || messagesInGroup === void 0 ? void 0 : messagesInGroup.some((message) => visibleTypeMessage.includes(message === null || message === void 0 ? void 0 : message.contentType));
|
|
17
32
|
const renderMessageByType = (message) => {
|
|
18
33
|
switch (message === null || message === void 0 ? void 0 : message.contentType) {
|
|
19
34
|
case MessageType.TextMessage:
|
|
@@ -28,12 +43,16 @@ const MessageItem = ({ groupMessage }) => {
|
|
|
28
43
|
return _jsx(TextMessageItem, { message: message });
|
|
29
44
|
}
|
|
30
45
|
};
|
|
46
|
+
if (!isVisibleGroup)
|
|
47
|
+
return null;
|
|
31
48
|
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
49
|
var _a, _b, _c, _d;
|
|
50
|
+
if (!visibleTypeMessage.includes(message === null || message === void 0 ? void 0 : message.contentType))
|
|
51
|
+
return null;
|
|
33
52
|
const isMine = (message === null || message === void 0 ? void 0 : message.sendID) === (user === null || user === void 0 ? void 0 : user.userID);
|
|
34
53
|
const showAvatar = messageIndex === messagesInGroup.length - 1;
|
|
35
54
|
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
|
|
55
|
+
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: clsx("flex flex-col flex-[0.8]", isMine ? "items-end" : "items-start"), 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
56
|
return renderMessageByType(item);
|
|
38
57
|
}), (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
58
|
})] }, groupMessage === null || groupMessage === void 0 ? void 0 : groupMessage.groupMessageID));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/screens/chatBubble/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/screens/chatBubble/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAQtD,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,WAAW,GAAI,OAAO,gBAAgB,mDAsB3C,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -2,11 +2,26 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import ChatBubble from "../../components/chatBubble/ChatBubble";
|
|
3
3
|
import { useChatContext } from "../../context/ChatContext";
|
|
4
4
|
import { ConnectStatus } from "../../types/chat";
|
|
5
|
+
import { useConversationDetail } from "../../hooks/conversation/useConversation";
|
|
6
|
+
import useConversationStore from "../../hooks/conversation/useConversationStore";
|
|
7
|
+
import { useEffect } from "react";
|
|
5
8
|
const DChatBubble = (props) => {
|
|
6
|
-
const {
|
|
9
|
+
const { sourceID, sessionType, className } = props;
|
|
7
10
|
const { connectStatus } = useChatContext();
|
|
11
|
+
const { conversationDetail } = useConversationDetail({
|
|
12
|
+
sourceID,
|
|
13
|
+
sessionType,
|
|
14
|
+
});
|
|
15
|
+
const setSelectedThreadId = useConversationStore((state) => state.setSelectedThreadId);
|
|
16
|
+
const setConversationData = useConversationStore((state) => state.setConversationData);
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
if (!conversationDetail)
|
|
19
|
+
return;
|
|
20
|
+
setSelectedThreadId(conversationDetail.conversationID);
|
|
21
|
+
setConversationData(conversationDetail);
|
|
22
|
+
}, [conversationDetail]);
|
|
8
23
|
if (connectStatus !== ConnectStatus.Connected)
|
|
9
24
|
return null;
|
|
10
|
-
return
|
|
25
|
+
return _jsx(ChatBubble, { className: className });
|
|
11
26
|
};
|
|
12
27
|
export default DChatBubble;
|