@droppii-org/chat-sdk 0.1.64 → 0.1.66

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 (29) hide show
  1. package/dist/components/conversation-detail/ConversationMessageList.d.ts.map +1 -1
  2. package/dist/components/conversation-detail/ConversationMessageList.js +18 -8
  3. package/dist/components/conversation-detail/PinLimitModal.d.ts +2 -1
  4. package/dist/components/conversation-detail/PinLimitModal.d.ts.map +1 -1
  5. package/dist/components/conversation-detail/PinLimitModal.js +2 -5
  6. package/dist/components/conversation-detail/PinnedMessageItem.d.ts +11 -0
  7. package/dist/components/conversation-detail/PinnedMessageItem.d.ts.map +1 -0
  8. package/dist/components/conversation-detail/PinnedMessageItem.js +44 -0
  9. package/dist/components/conversation-detail/PinnedMessagesPanel.d.ts +7 -0
  10. package/dist/components/conversation-detail/PinnedMessagesPanel.d.ts.map +1 -0
  11. package/dist/components/conversation-detail/PinnedMessagesPanel.js +51 -0
  12. package/dist/components/message/item/renderMessageContent.d.ts +4 -0
  13. package/dist/components/message/item/renderMessageContent.d.ts.map +1 -0
  14. package/dist/components/message/item/renderMessageContent.js +43 -0
  15. package/dist/constants/index.d.ts +0 -1
  16. package/dist/constants/index.d.ts.map +1 -1
  17. package/dist/constants/index.js +0 -1
  18. package/dist/hooks/global/useGlobalEvent.d.ts.map +1 -1
  19. package/dist/hooks/global/useGlobalEvent.js +1 -0
  20. package/dist/hooks/message/usePinnedMessages.d.ts +1 -0
  21. package/dist/hooks/message/usePinnedMessages.d.ts.map +1 -1
  22. package/dist/hooks/message/usePinnedMessages.js +4 -2
  23. package/dist/locales/vi/common.json +2 -0
  24. package/dist/store/conversation.d.ts.map +1 -1
  25. package/dist/store/conversation.js +5 -1
  26. package/dist/store/type.d.ts +2 -1
  27. package/dist/store/type.d.ts.map +1 -1
  28. package/dist/tsconfig.tsbuildinfo +1 -1
  29. package/package.json +127 -126
@@ -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;AAkBzE,MAAM,WAAW,4BAA4B;IAC3C,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAED,QAAA,MAAM,uBAAuB,GAAI,gBAAgB,4BAA4B,4CAsK5E,CAAC;AAEF,eAAe,uBAAuB,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;AAkBzE,MAAM,WAAW,4BAA4B;IAC3C,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAED,QAAA,MAAM,uBAAuB,GAAI,gBAAgB,4BAA4B,4CAuL5E,CAAC;AAEF,eAAe,uBAAuB,CAAC"}
@@ -9,13 +9,13 @@ import MessageInfiniteScroll from "../../components/message/MessageInfiniteScrol
9
9
  import { useMessage } from "../../hooks/message/useMessage";
10
10
  import { useMessageListScroll } from "../../hooks/message/useMessageListScroll";
11
11
  import { usePinMessage } from "../../hooks/message/usePinMessage";
12
+ import { useRevokeMessage } from "../../hooks/message/useRevokeMessage";
12
13
  import useConversationStore from "../../store/conversation";
13
14
  import useAuthStore from "../../store/auth";
14
15
  import { isGroupChat as resolveIsGroupChat } from "../../utils/conversation";
15
16
  import emitter from "../../utils/events";
16
17
  import MessageItem from "../../components/message/item";
17
18
  import PinLimitModal from "./PinLimitModal";
18
- import { MAX_PINNED_MESSAGES_PER_CONVERSATION } from "../../constants";
19
19
  const ConversationMessageList = ({ bottomSlot }) => {
20
20
  const { t } = useTranslation("conversation-inbox");
21
21
  const { t: tCommon } = useTranslation();
@@ -36,9 +36,10 @@ const ConversationMessageList = ({ bottomSlot }) => {
36
36
  const closeToolbox = useCallback(() => setOpenToolboxMessageId(null), []);
37
37
  const { pinMessage, unpinMessage } = usePinMessage();
38
38
  const pinnedTotalCount = useConversationStore((state) => state.pinnedTotalCount);
39
+ const pinnedRemainingCount = useConversationStore((state) => state.pinnedRemainingCount);
39
40
  const [pinLimitModalOpen, setPinLimitModalOpen] = useState(false);
40
41
  const handlePinMessage = useCallback(async (message) => {
41
- if (pinnedTotalCount >= MAX_PINNED_MESSAGES_PER_CONVERSATION) {
42
+ if (pinnedRemainingCount <= 0 && pinnedTotalCount > 0) {
42
43
  setPinLimitModalOpen(true);
43
44
  return;
44
45
  }
@@ -46,21 +47,30 @@ const ConversationMessageList = ({ bottomSlot }) => {
46
47
  await pinMessage(conversationId, message.clientMsgID);
47
48
  toastMessage.success(tCommon("pin_message_success"));
48
49
  }
49
- catch (error) {
50
- console.error("pinMessage failed", error);
50
+ catch (_a) {
51
51
  toastMessage.error(tCommon("pin_message_failed"));
52
52
  }
53
- }, [conversationId, pinMessage, pinnedTotalCount, tCommon]);
53
+ }, [conversationId, pinMessage, pinnedRemainingCount, pinnedTotalCount, tCommon]);
54
54
  const handleUnpinMessage = useCallback(async (message) => {
55
55
  try {
56
56
  await unpinMessage(conversationId, message.clientMsgID);
57
57
  toastMessage.success(tCommon("unpin_message_success"));
58
58
  }
59
- catch (error) {
60
- console.error("unpinMessage failed", error);
59
+ catch (_a) {
61
60
  toastMessage.error(tCommon("unpin_message_failed"));
62
61
  }
63
62
  }, [conversationId, unpinMessage, tCommon]);
63
+ const { revokeMessage } = useRevokeMessage();
64
+ const handleRevokeMessage = useCallback(async (clientMsgID) => {
65
+ closeToolbox();
66
+ try {
67
+ await revokeMessage(conversationId, clientMsgID);
68
+ toastMessage.success(tCommon("revoke_message_success"));
69
+ }
70
+ catch (_a) {
71
+ toastMessage.error(tCommon("revoke_message_failed"));
72
+ }
73
+ }, [closeToolbox, conversationId, revokeMessage, tCommon]);
64
74
  const onPressQuoteMessage = useCallback((clientMsgID) => {
65
75
  const hasMessage = loadState.messageList.some((msg) => msg.clientMsgID === clientMsgID);
66
76
  if (hasMessage) {
@@ -82,6 +92,6 @@ const ConversationMessageList = ({ bottomSlot }) => {
82
92
  target: scrollRef,
83
93
  enable: !!openToolboxMessageId,
84
94
  });
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) })] }));
95
+ 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: handleRevokeMessage, onPressQuoteMessage: onPressQuoteMessage, onPinMessage: handlePinMessage, onUnpinMessage: handleUnpinMessage, enableLongPress: true }, message.clientMsgID)))] })), _jsx(PinLimitModal, { open: pinLimitModalOpen, max: pinnedTotalCount, onClose: () => setPinLimitModalOpen(false) })] }));
86
96
  };
87
97
  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":"AAIA,UAAU,kBAAkB;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,QAAA,MAAM,aAAa,GAAI,mBAAmB,kBAAkB,4CAoC3D,CAAC;AAEF,eAAe,aAAa,CAAC"}
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
- import { MAX_PINNED_MESSAGES_PER_CONVERSATION } from "../../constants";
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
+ };
@@ -7,5 +7,4 @@ export declare const PAGE_SIZE: {
7
7
  };
8
8
  export declare const MSG_ITEM_PREFIX = "msg-item-";
9
9
  export declare const MSG_ITEM_CONTENT_PREFIX = "msg-item-content-";
10
- export declare const MAX_PINNED_MESSAGES_PER_CONVERSATION = 5;
11
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,qFAC2D,CAAC;AAErF,eAAO,MAAM,SAAS;;;;;CAKZ,CAAC;AAEX,eAAO,MAAM,eAAe,cAAc,CAAC;AAC3C,eAAO,MAAM,uBAAuB,sBAAsB,CAAC;AAE3D,eAAO,MAAM,oCAAoC,IAAI,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"}
@@ -7,4 +7,3 @@ export const PAGE_SIZE = {
7
7
  };
8
8
  export const MSG_ITEM_PREFIX = "msg-item-";
9
9
  export const MSG_ITEM_CONTENT_PREFIX = "msg-item-content-";
10
- export const MAX_PINNED_MESSAGES_PER_CONVERSATION = 5;
@@ -1 +1 @@
1
- {"version":3,"file":"useGlobalEvent.d.ts","sourceRoot":"","sources":["../../../src/hooks/global/useGlobalEvent.ts"],"names":[],"mappings":"AAmCA,eAAO,MAAM,cAAc,YAkV1B,CAAC"}
1
+ {"version":3,"file":"useGlobalEvent.d.ts","sourceRoot":"","sources":["../../../src/hooks/global/useGlobalEvent.ts"],"names":[],"mappings":"AAmCA,eAAO,MAAM,cAAc,YAmV1B,CAAC"}
@@ -241,6 +241,7 @@ export const useGlobalEvent = () => {
241
241
  DChatSDK.off(CbEvents.OnSyncServerFailed, syncFailedHandler);
242
242
  // message
243
243
  DChatSDK.off(CbEvents.OnRecvNewMessages, newMessageHandler);
244
+ DChatSDK.off(CbEvents.OnNewRecvMessageRevoked, revokedMessageHandler);
244
245
  DChatSDK.off(CbEvents.OnRecvMessagePinned, messagePinnedHandler);
245
246
  // conversation
246
247
  DChatSDK.off(CbEvents.OnConversationChanged, conversationChangeHandler);
@@ -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,kBAmB/D,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,gBAAgB,MAAM;;;CAiBvD,CAAC"}
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.isEnd) !== null && _a !== void 0 ? _a : true);
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
  };
@@ -72,6 +72,8 @@
72
72
  "revoke_message_confirm_message": "Bạn có chắc chắn muốn thu hồi tin nhắn này?",
73
73
  "revoke": "Thu hồi",
74
74
  "revoked": "Đã thu hồi tin nhắn",
75
+ "revoke_message_success": "Đã thu hồi tin nhắn",
76
+ "revoke_message_failed": "Thu hồi tin nhắn thất bại",
75
77
  "manual_assign_search_placeholder": "Tìm kiếm",
76
78
  "manual_assign_no_results": "Không có kết quả phù hợp",
77
79
  "manual_assign_confirm_question": "Phân công lại cho <bold>{{name}}</bold>?",
@@ -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,gFAgOvB,CAAC;AAEJ,eAAe,oBAAoB,CAAC"}
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
  },
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/store/type.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,WAAW,EACZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,UAAU,EACX,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,WAAW,yBAAyB;IACxC,eAAe,EAAE,oBAAoB,CAAC;IACtC,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,MAAM,0BAA0B,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,iBAAiB,EAAE,CAAC;IACrC,SAAS,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,GAAG,EAAE,UAAU,CAAC;IAChB,eAAe,EAAE,oBAAoB,CAAC;IACtC,KAAK,CAAC,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,YAAY,EAAE,gBAAgB,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC1C,mBAAmB,EAAE,CACnB,IAAI,EAAE,gBAAgB,EACtB,iBAAiB,CAAC,EAAE,MAAM,KACvB,IAAI,CAAC;IACV,sBAAsB,EAAE,MAAM,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,yBAAyB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAEtD,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACrC,mBAAmB,CAAC,EAAE,gBAAgB,CAAC;IACvC,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,oBAAoB,CAAC,EAAE,eAAe,CAAC;IACvC,wBAAwB,EAAE,CACxB,QAAQ,CAAC,EAAE,OAAO,EAClB,SAAS,CAAC,EAAE,yBAAyB,KAClC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,sBAAsB,EAAE,CACtB,IAAI,EAAE,gBAAgB,EAAE,EACxB,IAAI,EAAE,0BAA0B,KAC7B,IAAI,CAAC;IACV,yBAAyB,EAAE,CAAC,YAAY,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,wBAAwB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,4BAA4B,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,sBAAsB,EAAE,MAAM,IAAI,CAAC;IACnC,yBAAyB,EAAE,MAAM,IAAI,CAAC;IACtC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,aAAa,EAAE,WAAW,GAAG,IAAI,CAAC;IAClC,gBAAgB,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACxD,iBAAiB,EAAE,WAAW,EAAE,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,oBAAoB,EAAE,CACpB,WAAW,EAAE,WAAW,EAAE,EAC1B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,OAAO,KACX,IAAI,CAAC;CACX;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,aAAa,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,WAAW,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,aAAa,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,oBAAoB,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACrC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,aAAa,EAAE,CAAC,MAAM,EAAE;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,aAAa,CAAC;QAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,eAAe,EAAE,oBAAoB,CAAC;QACtC,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QACvC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;KACtC,KAAK,IAAI,CAAC;CACZ"}
1
+ {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/store/type.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,WAAW,EACZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,UAAU,EACX,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,WAAW,yBAAyB;IACxC,eAAe,EAAE,oBAAoB,CAAC;IACtC,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,MAAM,0BAA0B,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE3D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,iBAAiB,EAAE,CAAC;IACrC,SAAS,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,GAAG,EAAE,UAAU,CAAC;IAChB,eAAe,EAAE,oBAAoB,CAAC;IACtC,KAAK,CAAC,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,YAAY,EAAE,gBAAgB,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC1C,mBAAmB,EAAE,CACnB,IAAI,EAAE,gBAAgB,EACtB,iBAAiB,CAAC,EAAE,MAAM,KACvB,IAAI,CAAC;IACV,sBAAsB,EAAE,MAAM,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,yBAAyB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAEtD,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACrC,mBAAmB,CAAC,EAAE,gBAAgB,CAAC;IACvC,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,oBAAoB,CAAC,EAAE,eAAe,CAAC;IACvC,wBAAwB,EAAE,CACxB,QAAQ,CAAC,EAAE,OAAO,EAClB,SAAS,CAAC,EAAE,yBAAyB,KAClC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,sBAAsB,EAAE,CACtB,IAAI,EAAE,gBAAgB,EAAE,EACxB,IAAI,EAAE,0BAA0B,KAC7B,IAAI,CAAC;IACV,yBAAyB,EAAE,CAAC,YAAY,CAAC,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,wBAAwB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,4BAA4B,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,sBAAsB,EAAE,MAAM,IAAI,CAAC;IACnC,yBAAyB,EAAE,MAAM,IAAI,CAAC;IACtC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,aAAa,EAAE,WAAW,GAAG,IAAI,CAAC;IAClC,gBAAgB,EAAE,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACxD,iBAAiB,EAAE,WAAW,EAAE,CAAC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,OAAO,CAAC;IACzB,oBAAoB,EAAE,CACpB,WAAW,EAAE,WAAW,EAAE,EAC1B,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,KAAK,EAAE,OAAO,KACX,IAAI,CAAC;CACX;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,aAAa,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,WAAW,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,aAAa,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,oBAAoB,CAAC;IACtC,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACrC,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,aAAa,EAAE,CAAC,MAAM,EAAE;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,aAAa,CAAC;QAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,eAAe,EAAE,oBAAoB,CAAC;QACtC,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QACvC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;KACtC,KAAK,IAAI,CAAC;CACZ"}