@droppii-org/chat-sdk 0.1.64 → 0.1.65
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-detail/ConversationMessageList.d.ts.map +1 -1
- package/dist/components/conversation-detail/ConversationMessageList.js +6 -8
- package/dist/components/conversation-detail/PinLimitModal.d.ts +2 -1
- package/dist/components/conversation-detail/PinLimitModal.d.ts.map +1 -1
- package/dist/components/conversation-detail/PinLimitModal.js +2 -5
- package/dist/components/conversation-detail/PinnedMessageItem.d.ts +11 -0
- package/dist/components/conversation-detail/PinnedMessageItem.d.ts.map +1 -0
- package/dist/components/conversation-detail/PinnedMessageItem.js +44 -0
- package/dist/components/conversation-detail/PinnedMessagesPanel.d.ts +7 -0
- package/dist/components/conversation-detail/PinnedMessagesPanel.d.ts.map +1 -0
- package/dist/components/conversation-detail/PinnedMessagesPanel.js +51 -0
- package/dist/components/message/item/renderMessageContent.d.ts +4 -0
- package/dist/components/message/item/renderMessageContent.d.ts.map +1 -0
- package/dist/components/message/item/renderMessageContent.js +43 -0
- package/dist/constants/index.d.ts +0 -1
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +0 -1
- package/dist/hooks/message/usePinnedMessages.d.ts +1 -0
- package/dist/hooks/message/usePinnedMessages.d.ts.map +1 -1
- package/dist/hooks/message/usePinnedMessages.js +4 -2
- package/dist/store/conversation.d.ts.map +1 -1
- package/dist/store/conversation.js +5 -1
- package/dist/store/type.d.ts +2 -1
- package/dist/store/type.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationMessageList.d.ts","sourceRoot":"","sources":["../../../src/components/conversation-detail/ConversationMessageList.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ConversationMessageList.d.ts","sourceRoot":"","sources":["../../../src/components/conversation-detail/ConversationMessageList.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAiBzE,MAAM,WAAW,4BAA4B;IAC3C,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAED,QAAA,MAAM,uBAAuB,GAAI,gBAAgB,4BAA4B,4CAwK5E,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
|
|
@@ -15,7 +15,6 @@ import { isGroupChat as resolveIsGroupChat } from "../../utils/conversation";
|
|
|
15
15
|
import emitter from "../../utils/events";
|
|
16
16
|
import MessageItem from "../../components/message/item";
|
|
17
17
|
import PinLimitModal from "./PinLimitModal";
|
|
18
|
-
import { MAX_PINNED_MESSAGES_PER_CONVERSATION } from "../../constants";
|
|
19
18
|
const ConversationMessageList = ({ bottomSlot }) => {
|
|
20
19
|
const { t } = useTranslation("conversation-inbox");
|
|
21
20
|
const { t: tCommon } = useTranslation();
|
|
@@ -36,9 +35,10 @@ const ConversationMessageList = ({ bottomSlot }) => {
|
|
|
36
35
|
const closeToolbox = useCallback(() => setOpenToolboxMessageId(null), []);
|
|
37
36
|
const { pinMessage, unpinMessage } = usePinMessage();
|
|
38
37
|
const pinnedTotalCount = useConversationStore((state) => state.pinnedTotalCount);
|
|
38
|
+
const pinnedRemainingCount = useConversationStore((state) => state.pinnedRemainingCount);
|
|
39
39
|
const [pinLimitModalOpen, setPinLimitModalOpen] = useState(false);
|
|
40
40
|
const handlePinMessage = useCallback(async (message) => {
|
|
41
|
-
if (pinnedTotalCount
|
|
41
|
+
if (pinnedRemainingCount <= 0 && pinnedTotalCount > 0) {
|
|
42
42
|
setPinLimitModalOpen(true);
|
|
43
43
|
return;
|
|
44
44
|
}
|
|
@@ -46,18 +46,16 @@ const ConversationMessageList = ({ bottomSlot }) => {
|
|
|
46
46
|
await pinMessage(conversationId, message.clientMsgID);
|
|
47
47
|
toastMessage.success(tCommon("pin_message_success"));
|
|
48
48
|
}
|
|
49
|
-
catch (
|
|
50
|
-
console.error("pinMessage failed", error);
|
|
49
|
+
catch (_a) {
|
|
51
50
|
toastMessage.error(tCommon("pin_message_failed"));
|
|
52
51
|
}
|
|
53
|
-
}, [conversationId, pinMessage, pinnedTotalCount, tCommon]);
|
|
52
|
+
}, [conversationId, pinMessage, pinnedRemainingCount, pinnedTotalCount, tCommon]);
|
|
54
53
|
const handleUnpinMessage = useCallback(async (message) => {
|
|
55
54
|
try {
|
|
56
55
|
await unpinMessage(conversationId, message.clientMsgID);
|
|
57
56
|
toastMessage.success(tCommon("unpin_message_success"));
|
|
58
57
|
}
|
|
59
|
-
catch (
|
|
60
|
-
console.error("unpinMessage failed", error);
|
|
58
|
+
catch (_a) {
|
|
61
59
|
toastMessage.error(tCommon("unpin_message_failed"));
|
|
62
60
|
}
|
|
63
61
|
}, [conversationId, unpinMessage, tCommon]);
|
|
@@ -82,6 +80,6 @@ const ConversationMessageList = ({ bottomSlot }) => {
|
|
|
82
80
|
target: scrollRef,
|
|
83
81
|
enable: !!openToolboxMessageId,
|
|
84
82
|
});
|
|
85
|
-
return (_jsxs("div", { "data-testid": "conversation-message-list", className: "relative flex min-h-0 min-w-0 flex-1 flex-col overflow-x-hidden bg-white", children: [isMessageLoading ? (_jsx("div", { className: "flex flex-1 items-center justify-center py-12", children: _jsx(Spin, {}) })) : (_jsxs(MessageInfiniteScroll, { scrollRef: scrollRef, scrollableTargetId: "scrollableConversationMessagesDiv", loadState: loadState, moreOldLoading: moreOldLoading, onLoadMoreOld: loadMoreOldMessage, onScroll: handleInfiniteScroll, containerClassName: "h-full", empty: _jsx("div", { className: "flex flex-1 items-center justify-center py-12", children: _jsx(Empty, { description: t("empty.no_messages") }) }), children: [bottomSlot, loadState.messageList.map((message, index, array) => (_jsx(MessageItem, { message: message, allMessages: array, isGroupChat: isGroupChat, forceHideTip: index === 0 && !!bottomSlot, contextMenuOpen: openToolboxMessageId === message.clientMsgID, onContextMenuOpenChange: (open) => setOpenToolboxMessageId(open ? message.clientMsgID : null), onQuoteMessage: setQuotedMessage, onRevokeMessage: closeToolbox, onPressQuoteMessage: onPressQuoteMessage, onPinMessage: handlePinMessage, onUnpinMessage: handleUnpinMessage, enableLongPress: true }, message.clientMsgID)))] })), _jsx(PinLimitModal, { open: pinLimitModalOpen, onClose: () => setPinLimitModalOpen(false) })] }));
|
|
83
|
+
return (_jsxs("div", { "data-testid": "conversation-message-list", className: "relative flex min-h-0 min-w-0 flex-1 flex-col overflow-x-hidden bg-white", children: [isMessageLoading ? (_jsx("div", { className: "flex flex-1 items-center justify-center py-12", children: _jsx(Spin, {}) })) : (_jsxs(MessageInfiniteScroll, { scrollRef: scrollRef, scrollableTargetId: "scrollableConversationMessagesDiv", loadState: loadState, moreOldLoading: moreOldLoading, onLoadMoreOld: loadMoreOldMessage, onScroll: handleInfiniteScroll, containerClassName: "h-full", empty: _jsx("div", { className: "flex flex-1 items-center justify-center py-12", children: _jsx(Empty, { description: t("empty.no_messages") }) }), children: [bottomSlot, loadState.messageList.map((message, index, array) => (_jsx(MessageItem, { message: message, allMessages: array, isGroupChat: isGroupChat, forceHideTip: index === 0 && !!bottomSlot, contextMenuOpen: openToolboxMessageId === message.clientMsgID, onContextMenuOpenChange: (open) => setOpenToolboxMessageId(open ? message.clientMsgID : null), onQuoteMessage: setQuotedMessage, onRevokeMessage: closeToolbox, onPressQuoteMessage: onPressQuoteMessage, onPinMessage: handlePinMessage, onUnpinMessage: handleUnpinMessage, enableLongPress: true }, message.clientMsgID)))] })), _jsx(PinLimitModal, { open: pinLimitModalOpen, max: pinnedTotalCount, onClose: () => setPinLimitModalOpen(false) })] }));
|
|
86
84
|
};
|
|
87
85
|
export default ConversationMessageList;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
interface PinLimitModalProps {
|
|
2
2
|
open: boolean;
|
|
3
|
+
max: number;
|
|
3
4
|
onClose: () => void;
|
|
4
5
|
}
|
|
5
|
-
declare const PinLimitModal: ({ open, onClose }: PinLimitModalProps) => import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
declare const PinLimitModal: ({ open, max, onClose }: PinLimitModalProps) => import("react/jsx-runtime").JSX.Element;
|
|
6
7
|
export default PinLimitModal;
|
|
7
8
|
//# sourceMappingURL=PinLimitModal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PinLimitModal.d.ts","sourceRoot":"","sources":["../../../src/components/conversation-detail/PinLimitModal.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PinLimitModal.d.ts","sourceRoot":"","sources":["../../../src/components/conversation-detail/PinLimitModal.tsx"],"names":[],"mappings":"AAGA,UAAU,kBAAkB;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,QAAA,MAAM,aAAa,GAAI,wBAAwB,kBAAkB,4CAkChE,CAAC;AAEF,eAAe,aAAa,CAAC"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Modal, Button } from "antd";
|
|
3
3
|
import { useTranslation } from "react-i18next";
|
|
4
|
-
|
|
5
|
-
const PinLimitModal = ({ open, onClose }) => {
|
|
4
|
+
const PinLimitModal = ({ open, max, onClose }) => {
|
|
6
5
|
const { t } = useTranslation();
|
|
7
|
-
return (_jsx(Modal, { open: open, onCancel: onClose, footer: null, centered: true, width: 400, children: _jsxs("div", { className: "flex flex-col gap-2 pt-2", role: "alertdialog", "aria-label": t("pin_limit_modal_title"), children: [_jsx("p", { className: "text-lg font-semibold text-gray-900", children: t("pin_limit_modal_title") }), _jsx("p", { className: "text-base text-gray-600", children: t("pin_limit_modal_description", {
|
|
8
|
-
max: MAX_PINNED_MESSAGES_PER_CONVERSATION,
|
|
9
|
-
}) }), _jsx(Button, { type: "primary", size: "large", block: true, className: "mt-2 !border-primary-400 !bg-primary-400 !text-white hover:!border-primary-300 hover:!bg-primary-300", onClick: onClose, children: t("pin_limit_modal_confirm") })] }) }));
|
|
6
|
+
return (_jsx(Modal, { open: open, onCancel: onClose, footer: null, centered: true, width: 400, children: _jsxs("div", { className: "flex flex-col gap-2 pt-2", role: "alertdialog", "aria-label": t("pin_limit_modal_title"), children: [_jsx("p", { className: "text-lg font-semibold text-gray-900", children: t("pin_limit_modal_title") }), _jsx("p", { className: "text-base text-gray-600", children: t("pin_limit_modal_description", { max }) }), _jsx(Button, { type: "primary", size: "large", block: true, className: "mt-2 !border-primary-400 !bg-primary-400 !text-white hover:!border-primary-300 hover:!bg-primary-300", onClick: onClose, children: t("pin_limit_modal_confirm") })] }) }));
|
|
10
7
|
};
|
|
11
8
|
export default PinLimitModal;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MessageItem as MessageItemType } from "@openim/wasm-client-sdk";
|
|
2
|
+
interface PinnedMessageItemProps {
|
|
3
|
+
message: MessageItemType;
|
|
4
|
+
contextMenuOpen: boolean;
|
|
5
|
+
onContextMenuOpenChange: (open: boolean) => void;
|
|
6
|
+
onUnpin: (message: MessageItemType) => void;
|
|
7
|
+
onJump: (message: MessageItemType) => void;
|
|
8
|
+
}
|
|
9
|
+
declare const PinnedMessageItem: ({ message, contextMenuOpen, onContextMenuOpenChange, onUnpin, onJump, }: PinnedMessageItemProps) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export default PinnedMessageItem;
|
|
11
|
+
//# sourceMappingURL=PinnedMessageItem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PinnedMessageItem.d.ts","sourceRoot":"","sources":["../../../src/components/conversation-detail/PinnedMessageItem.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAczE,UAAU,sBAAsB;IAC9B,OAAO,EAAE,eAAe,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,uBAAuB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,OAAO,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;IAC5C,MAAM,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;CAC5C;AAED,QAAA,MAAM,iBAAiB,GAAI,yEAMxB,sBAAsB,4CA2FxB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useRef } from "react";
|
|
4
|
+
import clsx from "clsx";
|
|
5
|
+
import { Dropdown } from "antd";
|
|
6
|
+
import { useLongPress } from "ahooks";
|
|
7
|
+
import { useTranslation } from "react-i18next";
|
|
8
|
+
import { Icon } from "../../components/icon";
|
|
9
|
+
import MessageBubble from "../../components/message/item/MessageBubble";
|
|
10
|
+
import { renderBubbleContent } from "../../components/message/item/renderMessageContent";
|
|
11
|
+
import { buildMessageToolboxMenuItems, MessageToolboxActionKey, MESSAGE_TOOLBOX_OVERLAY_CLASSNAME, } from "../../components/message/toolbox";
|
|
12
|
+
import useAuthStore from "../../store/auth";
|
|
13
|
+
const LONG_PRESS_DELAY = 500;
|
|
14
|
+
const PinnedMessageItem = ({ message, contextMenuOpen, onContextMenuOpenChange, onUnpin, onJump, }) => {
|
|
15
|
+
const { t } = useTranslation();
|
|
16
|
+
const userID = useAuthStore((state) => state.userID);
|
|
17
|
+
const isMine = (message === null || message === void 0 ? void 0 : message.sendID) === userID;
|
|
18
|
+
const bubbleWrapperRef = useRef(null);
|
|
19
|
+
useLongPress(() => onContextMenuOpenChange(true), bubbleWrapperRef, {
|
|
20
|
+
delay: LONG_PRESS_DELAY,
|
|
21
|
+
});
|
|
22
|
+
const contextMenuItems = buildMessageToolboxMenuItems([
|
|
23
|
+
{
|
|
24
|
+
key: MessageToolboxActionKey.UNPIN,
|
|
25
|
+
label: t("context_menu_unpin"),
|
|
26
|
+
icon: "thumbtack-off-o",
|
|
27
|
+
onClick: () => onUnpin(message),
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
key: MessageToolboxActionKey.VIEW_ORIGINAL,
|
|
31
|
+
label: t("context_menu_view_original"),
|
|
32
|
+
icon: "chat-square-o",
|
|
33
|
+
onClick: () => onJump(message),
|
|
34
|
+
},
|
|
35
|
+
]);
|
|
36
|
+
const bubbleNode = (_jsx(MessageBubble, { isMine: isMine, senderName: message === null || message === void 0 ? void 0 : message.senderNickname, content: renderBubbleContent(message) }));
|
|
37
|
+
const pinnedBadgeNode = (_jsx("span", { "data-testid": "pinned-item-badge", className: clsx("absolute -top-2.5 z-[1] flex h-[22px] w-[26px] items-center justify-center rounded-full border border-white bg-gray-25", isMine ? "left-0" : "right-0"), children: _jsx(Icon, { icon: "thumbtack-b", size: 12, className: "text-primary-400" }) }));
|
|
38
|
+
const unpinButton = (_jsx("button", { type: "button", "data-testid": "pinned-item-unpin", "aria-label": t("context_menu_unpin"), onClick: (event) => {
|
|
39
|
+
event.stopPropagation();
|
|
40
|
+
onUnpin(message);
|
|
41
|
+
}, className: "flex h-7 w-7 shrink-0 items-center justify-center self-center rounded-full bg-gray-25 text-gray-600", children: _jsx(Icon, { icon: "thumbtack-off-o", size: 16 }) }));
|
|
42
|
+
return (_jsxs("div", { className: clsx("flex items-end gap-2 px-3 pb-4", isMine ? "justify-end" : "justify-start"), children: [isMine && unpinButton, _jsx(Dropdown, { menu: { items: contextMenuItems }, trigger: ["contextMenu"], open: contextMenuOpen, onOpenChange: onContextMenuOpenChange, overlayClassName: MESSAGE_TOOLBOX_OVERLAY_CLASSNAME, children: _jsxs("div", { ref: bubbleWrapperRef, className: "relative min-w-0 cursor-pointer", onClick: () => onJump(message), children: [bubbleNode, pinnedBadgeNode] }) }), !isMine && unpinButton] }));
|
|
43
|
+
};
|
|
44
|
+
export default PinnedMessageItem;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
interface PinnedMessagesPanelProps {
|
|
2
|
+
open: boolean;
|
|
3
|
+
onClose: () => void;
|
|
4
|
+
}
|
|
5
|
+
declare const PinnedMessagesPanel: ({ open, onClose }: PinnedMessagesPanelProps) => import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export default PinnedMessagesPanel;
|
|
7
|
+
//# sourceMappingURL=PinnedMessagesPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PinnedMessagesPanel.d.ts","sourceRoot":"","sources":["../../../src/components/conversation-detail/PinnedMessagesPanel.tsx"],"names":[],"mappings":"AAYA,UAAU,wBAAwB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,QAAA,MAAM,mBAAmB,GAAI,mBAAmB,wBAAwB,4CAkGvE,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
import { Drawer, Button, message as toastMessage } from "antd";
|
|
5
|
+
import { useTranslation } from "react-i18next";
|
|
6
|
+
import { Icon } from "../../components/icon";
|
|
7
|
+
import useConversationStore from "../../store/conversation";
|
|
8
|
+
import { usePinMessage } from "../../hooks/message/usePinMessage";
|
|
9
|
+
import { emit } from "../../utils/events";
|
|
10
|
+
import PinnedMessageItem from "./PinnedMessageItem";
|
|
11
|
+
const PinnedMessagesPanel = ({ open, onClose }) => {
|
|
12
|
+
const { t } = useTranslation();
|
|
13
|
+
const conversation = useConversationStore((state) => state.conversationData);
|
|
14
|
+
const selectedConversationId = useConversationStore((state) => state.selectedConversationId);
|
|
15
|
+
const pinnedMessageList = useConversationStore((state) => state.pinnedMessageList);
|
|
16
|
+
const setSearchClientMsgID = useConversationStore((state) => state.setSearchClientMsgID);
|
|
17
|
+
const conversationId = selectedConversationId || (conversation === null || conversation === void 0 ? void 0 : conversation.conversationID) || "";
|
|
18
|
+
const { unpinMessage } = usePinMessage();
|
|
19
|
+
const [openContextMenuId, setOpenContextMenuId] = useState(null);
|
|
20
|
+
useEffect(() => {
|
|
21
|
+
if (open && pinnedMessageList.length === 0) {
|
|
22
|
+
onClose();
|
|
23
|
+
}
|
|
24
|
+
}, [open, pinnedMessageList.length, onClose]);
|
|
25
|
+
const handleUnpin = async (message) => {
|
|
26
|
+
setOpenContextMenuId(null);
|
|
27
|
+
try {
|
|
28
|
+
await unpinMessage(conversationId, message.clientMsgID);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
console.error("unpinMessage failed", error);
|
|
32
|
+
toastMessage.error(t("unpin_message_failed"));
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const handleJump = (message) => {
|
|
36
|
+
setOpenContextMenuId(null);
|
|
37
|
+
onClose();
|
|
38
|
+
setSearchClientMsgID(message.clientMsgID);
|
|
39
|
+
emit("CHAT_LIST_SCROLL_TO_MESSAGE", message.clientMsgID);
|
|
40
|
+
};
|
|
41
|
+
return (_jsx(Drawer, { open: open, onClose: onClose, placement: "bottom", closeIcon: false, height: "90%", styles: {
|
|
42
|
+
body: { padding: 0 },
|
|
43
|
+
mask: { backgroundColor: "rgba(0, 0, 0, 0.8)" },
|
|
44
|
+
content: {
|
|
45
|
+
borderTopLeftRadius: 16,
|
|
46
|
+
borderTopRightRadius: 16,
|
|
47
|
+
overflow: "hidden",
|
|
48
|
+
},
|
|
49
|
+
}, getContainer: false, children: _jsxs("div", { className: "flex h-full flex-col bg-white", children: [_jsxs("div", { className: "flex items-center gap-4 border-b border-gray-25 px-3 py-4", children: [_jsx("span", { className: "flex-1 text-lg font-bold text-gray-900", children: t("pinned_panel_title") }), _jsx(Button, { type: "text", shape: "default", className: "h-6 w-6 p-0 text-gray-900", onClick: onClose, "aria-label": t("pinned_panel_title"), children: _jsx(Icon, { icon: "close-b", size: 24 }) })] }), _jsxs("div", { className: "flex flex-1 flex-col gap-3 overflow-y-auto py-3", children: [_jsx("p", { className: "px-3 text-sm leading-[160%] text-gray-600", children: t("pinned_panel_hint") }), pinnedMessageList.map((message) => (_jsx(PinnedMessageItem, { message: message, contextMenuOpen: openContextMenuId === message.clientMsgID, onContextMenuOpenChange: (isOpen) => setOpenContextMenuId(isOpen ? message.clientMsgID : null), onUnpin: handleUnpin, onJump: handleJump }, message.clientMsgID)))] })] }) }));
|
|
50
|
+
};
|
|
51
|
+
export default PinnedMessagesPanel;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { MessageItem as MessageItemType } from "@openim/wasm-client-sdk";
|
|
2
|
+
export declare const renderMessageByType: (message: MessageItemType) => import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
export declare const renderBubbleContent: (message: MessageItemType, onPressQuoteMessage?: (clientMsgID: string) => void) => import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
//# sourceMappingURL=renderMessageContent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderMessageContent.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/renderMessageContent.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,eAAe,EAAe,MAAM,yBAAyB,CAAC;AAWtF,eAAO,MAAM,mBAAmB,GAAI,SAAS,eAAe,4CAuB3D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,SAAS,eAAe,EACxB,sBAAsB,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,4CAwBpD,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { MessageType } from "@openim/wasm-client-sdk";
|
|
3
|
+
import TextMessageItem from "./TextMessage";
|
|
4
|
+
import ImageMessageItem from "./ImageMessage";
|
|
5
|
+
import FileMessageItem from "./FileMessage";
|
|
6
|
+
import VideoMessageItem from "./VideoMessage";
|
|
7
|
+
import MergeImageMessageItem from "./MergeImageMessage";
|
|
8
|
+
import UrlTextMessageItem from "./UrlTextMessage";
|
|
9
|
+
import RevokeMessageItem from "./RevokeMessage";
|
|
10
|
+
import QuoteMessageItem from "./QuoteMessage";
|
|
11
|
+
import SystemLogMessageItem from "./SystemLogMessage";
|
|
12
|
+
export const renderMessageByType = (message) => {
|
|
13
|
+
switch (message === null || message === void 0 ? void 0 : message.contentType) {
|
|
14
|
+
case MessageType.TextMessage:
|
|
15
|
+
case MessageType.QuoteMessage:
|
|
16
|
+
return _jsx(TextMessageItem, { message: message });
|
|
17
|
+
case MessageType.PictureMessage:
|
|
18
|
+
return _jsx(ImageMessageItem, { message: message });
|
|
19
|
+
case MessageType.FileMessage:
|
|
20
|
+
return _jsx(FileMessageItem, { message: message });
|
|
21
|
+
case MessageType.VideoMessage:
|
|
22
|
+
return _jsx(VideoMessageItem, { message: message });
|
|
23
|
+
case MessageType.MergeMessage:
|
|
24
|
+
return _jsx(MergeImageMessageItem, { message: message });
|
|
25
|
+
case MessageType.UrlTextMessage:
|
|
26
|
+
return _jsx(UrlTextMessageItem, { message: message });
|
|
27
|
+
case MessageType.LogTextMessage:
|
|
28
|
+
return _jsx(SystemLogMessageItem, { message: message });
|
|
29
|
+
case MessageType.RevokeMessage:
|
|
30
|
+
return _jsx(RevokeMessageItem, {});
|
|
31
|
+
default:
|
|
32
|
+
return _jsx(TextMessageItem, { message: message });
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
export const renderBubbleContent = (message, onPressQuoteMessage) => {
|
|
36
|
+
if (message === null || message === void 0 ? void 0 : message.quoteElem) {
|
|
37
|
+
return (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(QuoteMessageItem, { message: message, onPressQuoteMessage: onPressQuoteMessage }), renderMessageByType(message)] }));
|
|
38
|
+
}
|
|
39
|
+
if ((message === null || message === void 0 ? void 0 : message.contentType) === MessageType.MergeMessage) {
|
|
40
|
+
return (_jsxs(_Fragment, { children: [_jsx(MergeImageMessageItem, { message: message }), (message === null || message === void 0 ? void 0 : message.textElem) && _jsx(TextMessageItem, { message: message })] }));
|
|
41
|
+
}
|
|
42
|
+
return renderMessageByType(message);
|
|
43
|
+
};
|
|
@@ -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;;;;;CAKZ,CAAC;AAEX,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"}
|
package/dist/constants/index.js
CHANGED
|
@@ -2,5 +2,6 @@ export declare const fetchPinnedMessages: (conversationID: string) => Promise<vo
|
|
|
2
2
|
export declare const usePinnedMessages: (conversationID: string) => {
|
|
3
3
|
pinnedMessageList: import("@openim/wasm-client-sdk").MessageItem[];
|
|
4
4
|
pinnedTotalCount: number;
|
|
5
|
+
pinnedRemainingCount: number;
|
|
5
6
|
};
|
|
6
7
|
//# sourceMappingURL=usePinnedMessages.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePinnedMessages.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/usePinnedMessages.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,mBAAmB,GAAU,gBAAgB,MAAM,
|
|
1
|
+
{"version":3,"file":"usePinnedMessages.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/usePinnedMessages.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,mBAAmB,GAAU,gBAAgB,MAAM,kBAoB/D,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,gBAAgB,MAAM;;;;CAqBvD,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { DChatSDK } from "../../constants/sdk";
|
|
|
3
3
|
import { PAGE_SIZE } from "../../constants";
|
|
4
4
|
import useConversationStore from "../../store/conversation";
|
|
5
5
|
export const fetchPinnedMessages = async (conversationID) => {
|
|
6
|
-
var _a;
|
|
6
|
+
var _a, _b;
|
|
7
7
|
const { setPinnedMessageData } = useConversationStore.getState();
|
|
8
8
|
try {
|
|
9
9
|
const { data } = await DChatSDK.getPinnedMessageList({
|
|
@@ -12,7 +12,7 @@ export const fetchPinnedMessages = async (conversationID) => {
|
|
|
12
12
|
pageSize: PAGE_SIZE.small,
|
|
13
13
|
});
|
|
14
14
|
const sortedMessageList = [...(data.messageList || [])].sort((first, second) => (second.pinnedTime || 0) - (first.pinnedTime || 0));
|
|
15
|
-
setPinnedMessageData(sortedMessageList, data.totalCount || 0, (_a = data.
|
|
15
|
+
setPinnedMessageData(sortedMessageList, data.totalCount || 0, (_a = data.remainingPinCount) !== null && _a !== void 0 ? _a : 0, (_b = data.isEnd) !== null && _b !== void 0 ? _b : true);
|
|
16
16
|
}
|
|
17
17
|
catch (error) {
|
|
18
18
|
console.error("fetchPinnedMessages failed", error);
|
|
@@ -21,6 +21,7 @@ export const fetchPinnedMessages = async (conversationID) => {
|
|
|
21
21
|
export const usePinnedMessages = (conversationID) => {
|
|
22
22
|
const pinnedMessageList = useConversationStore((state) => state.pinnedMessageList);
|
|
23
23
|
const pinnedTotalCount = useConversationStore((state) => state.pinnedTotalCount);
|
|
24
|
+
const pinnedRemainingCount = useConversationStore((state) => state.pinnedRemainingCount);
|
|
24
25
|
useEffect(() => {
|
|
25
26
|
if (!conversationID)
|
|
26
27
|
return;
|
|
@@ -29,5 +30,6 @@ export const usePinnedMessages = (conversationID) => {
|
|
|
29
30
|
return {
|
|
30
31
|
pinnedMessageList,
|
|
31
32
|
pinnedTotalCount,
|
|
33
|
+
pinnedRemainingCount,
|
|
32
34
|
};
|
|
33
35
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/store/conversation.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAM3C,QAAA,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/store/conversation.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAM3C,QAAA,MAAM,oBAAoB,gFAoOvB,CAAC;AAEJ,eAAe,oBAAoB,CAAC"}
|
|
@@ -24,6 +24,7 @@ const useConversationStore = create((set, get) => ({
|
|
|
24
24
|
: {
|
|
25
25
|
pinnedMessageList: [],
|
|
26
26
|
pinnedTotalCount: 0,
|
|
27
|
+
pinnedRemainingCount: 0,
|
|
27
28
|
pinnedListIsEnd: false,
|
|
28
29
|
})));
|
|
29
30
|
},
|
|
@@ -166,6 +167,7 @@ const useConversationStore = create((set, get) => ({
|
|
|
166
167
|
quotedMessage: null,
|
|
167
168
|
pinnedMessageList: [],
|
|
168
169
|
pinnedTotalCount: 0,
|
|
170
|
+
pinnedRemainingCount: 0,
|
|
169
171
|
pinnedListIsEnd: false,
|
|
170
172
|
});
|
|
171
173
|
},
|
|
@@ -186,11 +188,13 @@ const useConversationStore = create((set, get) => ({
|
|
|
186
188
|
//pinned message
|
|
187
189
|
pinnedMessageList: [],
|
|
188
190
|
pinnedTotalCount: 0,
|
|
191
|
+
pinnedRemainingCount: 0,
|
|
189
192
|
pinnedListIsEnd: false,
|
|
190
|
-
setPinnedMessageData: (messageList, totalCount, isEnd) => {
|
|
193
|
+
setPinnedMessageData: (messageList, totalCount, remainingCount, isEnd) => {
|
|
191
194
|
set({
|
|
192
195
|
pinnedMessageList: messageList,
|
|
193
196
|
pinnedTotalCount: totalCount,
|
|
197
|
+
pinnedRemainingCount: remainingCount,
|
|
194
198
|
pinnedListIsEnd: isEnd,
|
|
195
199
|
});
|
|
196
200
|
},
|
package/dist/store/type.d.ts
CHANGED
|
@@ -66,8 +66,9 @@ export interface ConversationStore {
|
|
|
66
66
|
setQuotedMessage: (message: MessageItem | null) => void;
|
|
67
67
|
pinnedMessageList: MessageItem[];
|
|
68
68
|
pinnedTotalCount: number;
|
|
69
|
+
pinnedRemainingCount: number;
|
|
69
70
|
pinnedListIsEnd: boolean;
|
|
70
|
-
setPinnedMessageData: (messageList: MessageItem[], totalCount: number, isEnd: boolean) => void;
|
|
71
|
+
setPinnedMessageData: (messageList: MessageItem[], totalCount: number, remainingCount: number, isEnd: boolean) => void;
|
|
71
72
|
}
|
|
72
73
|
export interface IPersonalInfo {
|
|
73
74
|
fullName: string;
|
package/dist/store/type.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/store/type.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/store/type.ts"],"names":[],"mappings":"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"}
|