@droppii-org/chat-sdk 0.1.55 → 0.1.57
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/biz-inbox/BizThreadAvatar.d.ts +3 -3
- package/dist/components/biz-inbox/BizThreadAvatar.d.ts.map +1 -1
- package/dist/components/biz-inbox/BizThreadAvatar.js +5 -5
- package/dist/components/biz-inbox/BizThreadCard.d.ts +3 -3
- package/dist/components/biz-inbox/BizThreadCard.d.ts.map +1 -1
- package/dist/components/biz-inbox/BizThreadCard.js +7 -8
- package/dist/components/biz-inbox/BizThreadList.d.ts +3 -3
- package/dist/components/biz-inbox/BizThreadList.d.ts.map +1 -1
- package/dist/components/biz-inbox/BizThreadList.js +4 -8
- package/dist/components/biz-inbox/BizThreadTitle.d.ts +3 -3
- package/dist/components/biz-inbox/BizThreadTitle.d.ts.map +1 -1
- package/dist/components/biz-inbox/BizThreadTitle.js +5 -5
- package/dist/components/biz-thread-detail/BizMessageList.d.ts.map +1 -1
- package/dist/components/biz-thread-detail/BizMessageList.js +4 -5
- package/dist/components/biz-thread-detail/BizThreadDetailHeader.d.ts +2 -2
- package/dist/components/biz-thread-detail/BizThreadDetailHeader.d.ts.map +1 -1
- package/dist/components/biz-thread-detail/BizThreadDetailHeader.js +7 -5
- package/dist/components/biz-thread-detail/BizThreadDetailInput.d.ts.map +1 -1
- package/dist/components/biz-thread-detail/BizThreadDetailInput.js +8 -13
- package/dist/components/biz-thread-detail/bot/BotButtonMessage.d.ts +1 -1
- package/dist/components/biz-thread-detail/bot/BotButtonMessage.d.ts.map +1 -1
- package/dist/components/conversation-detail/ConversationDetailHeader.d.ts +8 -0
- package/dist/components/conversation-detail/ConversationDetailHeader.d.ts.map +1 -0
- package/dist/components/conversation-detail/ConversationDetailHeader.js +18 -0
- package/dist/components/conversation-detail/ConversationDetailInput.d.ts +8 -0
- package/dist/components/conversation-detail/ConversationDetailInput.d.ts.map +1 -0
- package/dist/components/conversation-detail/ConversationDetailInput.js +258 -0
- package/dist/components/conversation-detail/ConversationMessageList.d.ts +7 -0
- package/dist/components/conversation-detail/ConversationMessageList.d.ts.map +1 -0
- package/dist/components/conversation-detail/ConversationMessageList.js +42 -0
- package/dist/components/conversation-detail/ConversationMoreOptionItem.d.ts +8 -0
- package/dist/components/conversation-detail/ConversationMoreOptionItem.d.ts.map +1 -0
- package/dist/components/conversation-detail/ConversationMoreOptionItem.js +19 -0
- package/dist/components/conversation-detail/ConversationMoreOptionPanel.d.ts +10 -0
- package/dist/components/conversation-detail/ConversationMoreOptionPanel.d.ts.map +1 -0
- package/dist/components/conversation-detail/ConversationMoreOptionPanel.js +20 -0
- package/dist/components/conversation-detail/bot/BotButtonMessage.d.ts +10 -0
- package/dist/components/conversation-detail/bot/BotButtonMessage.d.ts.map +1 -0
- package/dist/components/conversation-detail/bot/BotButtonMessage.js +30 -0
- package/dist/components/conversation-detail/bot/BotStartButton.d.ts +8 -0
- package/dist/components/conversation-detail/bot/BotStartButton.d.ts.map +1 -0
- package/dist/components/conversation-detail/bot/BotStartButton.js +11 -0
- package/dist/components/conversation-detail/bot/BotSuggest.d.ts +7 -0
- package/dist/components/conversation-detail/bot/BotSuggest.d.ts.map +1 -0
- package/dist/components/conversation-detail/bot/BotSuggest.js +11 -0
- package/dist/components/conversation-detail/bot/index.d.ts +7 -0
- package/dist/components/conversation-detail/bot/index.d.ts.map +1 -0
- package/dist/components/conversation-detail/bot/index.js +3 -0
- package/dist/components/conversation-detail/index.d.ts +10 -0
- package/dist/components/conversation-detail/index.d.ts.map +1 -0
- package/dist/components/conversation-detail/index.js +5 -0
- package/dist/components/conversation-inbox/ConversationInboxHeader.d.ts +3 -0
- package/dist/components/conversation-inbox/ConversationInboxHeader.d.ts.map +1 -0
- package/dist/components/conversation-inbox/ConversationInboxHeader.js +8 -0
- package/dist/components/conversation-inbox/ConversationInboxItem.d.ts +8 -0
- package/dist/components/conversation-inbox/ConversationInboxItem.d.ts.map +1 -0
- package/dist/components/conversation-inbox/ConversationInboxItem.js +30 -0
- package/dist/components/conversation-inbox/ConversationInboxList.d.ts +12 -0
- package/dist/components/conversation-inbox/ConversationInboxList.d.ts.map +1 -0
- package/dist/components/conversation-inbox/ConversationInboxList.js +36 -0
- package/dist/components/conversation-inbox/ConversationInboxTitle.d.ts +9 -0
- package/dist/components/conversation-inbox/ConversationInboxTitle.d.ts.map +1 -0
- package/dist/components/conversation-inbox/ConversationInboxTitle.js +7 -0
- package/dist/components/conversation-inbox/ConversationPeerAvatar.d.ts +10 -0
- package/dist/components/conversation-inbox/ConversationPeerAvatar.d.ts.map +1 -0
- package/dist/components/conversation-inbox/ConversationPeerAvatar.js +10 -0
- package/dist/components/conversation-inbox/index.d.ts +10 -0
- package/dist/components/conversation-inbox/index.d.ts.map +1 -0
- package/dist/components/conversation-inbox/index.js +5 -0
- package/dist/components/message/footer/LinkInputPreview.js +1 -1
- package/dist/components/message/item/ImageMessage.js +1 -1
- package/dist/components/message/item/LinkCard.js +1 -1
- package/dist/components/message/item/LinkText.js +1 -1
- package/dist/components/message/item/VideoMessage.js +1 -1
- package/dist/components/message/item/index.d.ts +2 -1
- package/dist/components/message/item/index.d.ts.map +1 -1
- package/dist/components/message/item/index.js +51 -38
- package/dist/components/message/item/mediaSize.d.ts.map +1 -1
- package/dist/components/message/item/mediaSize.js +8 -8
- package/dist/components/message/toolbox/MessageToolboxMenu.d.ts +5 -0
- package/dist/components/message/toolbox/MessageToolboxMenu.d.ts.map +1 -0
- package/dist/components/message/toolbox/MessageToolboxMenu.js +10 -0
- package/dist/components/message/toolbox/getCopyableMessageText.d.ts +4 -0
- package/dist/components/message/toolbox/getCopyableMessageText.d.ts.map +1 -0
- package/dist/components/message/toolbox/getCopyableMessageText.js +28 -0
- package/dist/components/message/toolbox/index.d.ts +5 -0
- package/dist/components/message/toolbox/index.d.ts.map +1 -0
- package/dist/components/message/toolbox/index.js +4 -0
- package/dist/components/message/toolbox/types.d.ts +15 -0
- package/dist/components/message/toolbox/types.d.ts.map +1 -0
- package/dist/components/message/toolbox/types.js +6 -0
- package/dist/components/message/toolbox/useMessageToolboxVisibility.d.ts +9 -0
- package/dist/components/message/toolbox/useMessageToolboxVisibility.d.ts.map +1 -0
- package/dist/components/message/toolbox/useMessageToolboxVisibility.js +15 -0
- package/dist/constants/moreOption.d.ts +9 -0
- package/dist/constants/moreOption.d.ts.map +1 -0
- package/dist/constants/moreOption.js +37 -0
- package/dist/hooks/conversation/useActiveConversation.d.ts +3 -0
- package/dist/hooks/conversation/useActiveConversation.d.ts.map +1 -0
- package/dist/hooks/conversation/useActiveConversation.js +31 -0
- package/dist/hooks/conversation/useBotConversationDetail.d.ts +3 -0
- package/dist/hooks/conversation/useBotConversationDetail.d.ts.map +1 -0
- package/dist/hooks/conversation/useBotConversationDetail.js +18 -0
- package/dist/hooks/conversation/useBotFlow.d.ts +18 -0
- package/dist/hooks/conversation/useBotFlow.d.ts.map +1 -0
- package/dist/hooks/conversation/useBotFlow.js +150 -0
- package/dist/hooks/conversation/useConversationList.d.ts +15 -0
- package/dist/hooks/conversation/useConversationList.d.ts.map +1 -0
- package/dist/hooks/conversation/useConversationList.js +70 -0
- package/dist/hooks/conversation/useCreateConversation.d.ts +8 -0
- package/dist/hooks/conversation/useCreateConversation.d.ts.map +1 -0
- package/dist/hooks/conversation/useCreateConversation.js +15 -0
- package/dist/hooks/conversation/useResetBotFlow.d.ts +3 -0
- package/dist/hooks/conversation/useResetBotFlow.d.ts.map +1 -0
- package/dist/hooks/conversation/useResetBotFlow.js +14 -0
- package/dist/hooks/conversation/useRunBotFlow.d.ts +7 -0
- package/dist/hooks/conversation/useRunBotFlow.d.ts.map +1 -0
- package/dist/hooks/conversation/useRunBotFlow.js +14 -0
- package/dist/hooks/global/useGlobalEvent.d.ts.map +1 -1
- package/dist/hooks/global/useGlobalEvent.js +15 -7
- package/dist/hooks/message/useSendMessage.d.ts +1 -1
- package/dist/hooks/message/useSendMessage.d.ts.map +1 -1
- package/dist/hooks/user/useAuth.js +2 -2
- package/dist/index.d.ts +12 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -6
- package/dist/locales/i18n.js +3 -3
- package/dist/locales/i18n.ts +3 -3
- package/dist/locales/vi/biz-inbox.json +39 -39
- package/dist/locales/vi/common.json +3 -0
- package/dist/locales/vi/conversation-inbox.json +39 -0
- package/dist/screens/biz-message/index.d.ts +3 -4
- package/dist/screens/biz-message/index.d.ts.map +1 -1
- package/dist/screens/biz-message/index.js +5 -9
- package/dist/screens/biz-thread-detail/index.js +6 -6
- package/dist/screens/conversation-detail/index.d.ts +9 -0
- package/dist/screens/conversation-detail/index.d.ts.map +1 -0
- package/dist/screens/conversation-detail/index.js +53 -0
- package/dist/screens/conversation-inbox/index.d.ts +8 -0
- package/dist/screens/conversation-inbox/index.d.ts.map +1 -0
- package/dist/screens/conversation-inbox/index.js +30 -0
- package/dist/services/query.d.ts +0 -1
- package/dist/services/query.d.ts.map +1 -1
- package/dist/services/query.js +0 -1
- package/dist/services/routes.d.ts +0 -1
- package/dist/services/routes.d.ts.map +1 -1
- package/dist/services/routes.js +0 -1
- package/dist/store/conversation.d.ts.map +1 -1
- package/dist/store/conversation.js +14 -5
- package/dist/store/messageDraft.d.ts +9 -0
- package/dist/store/messageDraft.d.ts.map +1 -0
- package/dist/store/messageDraft.js +35 -0
- package/dist/store/type.d.ts +6 -1
- package/dist/store/type.d.ts.map +1 -1
- package/dist/styles/global.css +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/conversation.d.ts +116 -0
- package/dist/types/conversation.d.ts.map +1 -0
- package/dist/types/conversation.js +33 -0
- package/dist/utils/common.d.ts +1 -1
- package/dist/utils/common.d.ts.map +1 -1
- package/dist/utils/common.js +5 -3
- package/dist/utils/conversation.d.ts +12 -0
- package/dist/utils/conversation.d.ts.map +1 -0
- package/dist/utils/conversation.js +53 -0
- package/dist/utils/events.d.ts +1 -1
- package/dist/utils/events.d.ts.map +1 -1
- package/dist/utils/fileValidation.d.ts +2 -1
- package/dist/utils/fileValidation.d.ts.map +1 -1
- package/dist/utils/fileValidation.js +10 -1
- package/dist/utils/imCommon.d.ts +1 -0
- package/dist/utils/imCommon.d.ts.map +1 -1
- package/package.json +126 -127
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { usePathname, useRouter, useSearchParams } from "next/navigation";
|
|
4
|
+
import { useTranslation } from "react-i18next";
|
|
5
|
+
import { Empty, Spin } from "antd";
|
|
6
|
+
import InfiniteScroll from "react-infinite-scroll-component";
|
|
7
|
+
import useConversationStore from "../../store/conversation";
|
|
8
|
+
import { Icon } from "../../components/icon";
|
|
9
|
+
import ConversationInboxItem from "./ConversationInboxItem";
|
|
10
|
+
const FooterSkeleton = () => (_jsxs("div", { className: "flex items-center gap-3 p-3", children: [_jsx("div", { className: "h-10 w-10 animate-pulse rounded-full bg-neutral-200" }), _jsxs("div", { className: "flex flex-1 flex-col gap-2", children: [_jsx("div", { className: "h-3 w-1/2 animate-pulse rounded bg-neutral-200" }), _jsx("div", { className: "h-2.5 w-1/3 animate-pulse rounded bg-neutral-200" })] })] }));
|
|
11
|
+
const ConversationInboxList = ({ items, isLoading, isFetchingNextPage, hasNextPage, onLoadMore, onSelectThread, }) => {
|
|
12
|
+
const { t } = useTranslation("conversation-inbox");
|
|
13
|
+
const router = useRouter();
|
|
14
|
+
const pathname = usePathname();
|
|
15
|
+
const searchParams = useSearchParams();
|
|
16
|
+
const setConversationData = useConversationStore((state) => state.setConversationData);
|
|
17
|
+
const setSelectedConversationId = useConversationStore((state) => state.setSelectedConversationId);
|
|
18
|
+
const handleSelectThread = (item) => {
|
|
19
|
+
const newSearchParams = new URLSearchParams(searchParams);
|
|
20
|
+
newSearchParams.set("threadId", item.conversationID);
|
|
21
|
+
router.push(`${pathname}?${newSearchParams.toString()}`);
|
|
22
|
+
setSelectedConversationId(item.conversationID);
|
|
23
|
+
setConversationData(item);
|
|
24
|
+
onSelectThread === null || onSelectThread === void 0 ? void 0 : onSelectThread(item);
|
|
25
|
+
};
|
|
26
|
+
const handleEndReached = () => {
|
|
27
|
+
if (hasNextPage && !isFetchingNextPage) {
|
|
28
|
+
onLoadMore();
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
if (isLoading) {
|
|
32
|
+
return (_jsx("div", { "data-testid": "conversation-inbox-thread-list", className: "flex flex-1 items-center justify-center py-12", children: _jsx(Spin, {}) }));
|
|
33
|
+
}
|
|
34
|
+
return (_jsx("div", { id: "scrollableConversationThreadsDiv", "data-testid": "conversation-inbox-thread-list", className: "min-h-0 w-full flex-1 overflow-auto", children: _jsx(InfiniteScroll, { dataLength: items.length, next: handleEndReached, hasMore: hasNextPage, loader: isFetchingNextPage ? _jsx(FooterSkeleton, {}) : null, scrollableTarget: "scrollableConversationThreadsDiv", children: items.length === 0 ? (_jsx("div", { className: "flex items-center justify-center py-12", children: _jsx(Empty, { image: _jsx(Icon, { icon: "chat-square-b", size: 80, className: "text-gray-300" }), description: t("empty.no_conversations") }) })) : (items.map((item) => (_jsx(ConversationInboxItem, { item: item, onClick: handleSelectThread }, item.conversationID)))) }) }));
|
|
35
|
+
};
|
|
36
|
+
export default ConversationInboxList;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { PeerType } from "../../types/conversation";
|
|
2
|
+
export interface ConversationInboxTitleProps {
|
|
3
|
+
peerType: PeerType;
|
|
4
|
+
displayName: string;
|
|
5
|
+
hasUnread?: boolean;
|
|
6
|
+
}
|
|
7
|
+
declare const ConversationInboxTitle: ({ peerType, displayName, hasUnread, }: ConversationInboxTitleProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export default ConversationInboxTitle;
|
|
9
|
+
//# sourceMappingURL=ConversationInboxTitle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationInboxTitle.d.ts","sourceRoot":"","sources":["../../../src/components/conversation-inbox/ConversationInboxTitle.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,QAAA,MAAM,sBAAsB,GAAI,uCAI7B,2BAA2B,4CAmB7B,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import clsx from "clsx";
|
|
4
|
+
import { Icon } from "../../components/icon";
|
|
5
|
+
import { PeerType } from "../../types/conversation";
|
|
6
|
+
const ConversationInboxTitle = ({ peerType, displayName, hasUnread = false, }) => (_jsxs("div", { className: "flex min-w-0 items-center gap-1", children: [peerType === PeerType.GROUP && (_jsx(Icon, { icon: "user-two-b", size: 12, className: "shrink-0 text-black" })), peerType === PeerType.BOT && (_jsx("span", { className: "flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-black text-white", children: _jsx(Icon, { icon: "droppii-o-1", size: 8 }) })), _jsx("span", { className: clsx("min-w-0 truncate text-[16px] leading-[160%] text-black [font-feature-settings:'liga'_off,'clig'_off]", hasUnread ? "font-bold tracking-[0.16px]" : "font-[510]"), children: displayName })] }));
|
|
7
|
+
export default ConversationInboxTitle;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PeerType } from "../../types/conversation";
|
|
2
|
+
export interface ConversationPeerAvatarProps {
|
|
3
|
+
peerType: PeerType;
|
|
4
|
+
displayName: string;
|
|
5
|
+
avatarUrl: string | null;
|
|
6
|
+
badgeLabel: string;
|
|
7
|
+
}
|
|
8
|
+
declare const ConversationPeerAvatar: ({ peerType, displayName, avatarUrl, badgeLabel, }: ConversationPeerAvatarProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export default ConversationPeerAvatar;
|
|
10
|
+
//# sourceMappingURL=ConversationPeerAvatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationPeerAvatar.d.ts","sourceRoot":"","sources":["../../../src/components/conversation-inbox/ConversationPeerAvatar.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,sBAAsB,GAAI,mDAK7B,2BAA2B,4CAyB7B,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import clsx from "clsx";
|
|
4
|
+
import { Avatar } from "antd";
|
|
5
|
+
import { resolvePeerBadgeColor } from "../../utils/conversation";
|
|
6
|
+
const ConversationPeerAvatar = ({ peerType, displayName, avatarUrl, badgeLabel, }) => {
|
|
7
|
+
const badge = badgeLabel ? (_jsx("span", { className: clsx("absolute -bottom-px -right-px flex h-[17px] items-center justify-center gap-2 rounded-md border border-white px-1 text-[10px] font-semibold leading-3 text-white shadow-badge-inset", resolvePeerBadgeColor(peerType)), children: badgeLabel })) : null;
|
|
8
|
+
return (_jsxs("div", { className: "relative h-12 w-12 shrink-0", children: [_jsx(Avatar, { size: 48, src: avatarUrl || undefined, alt: displayName, className: "uppercase", children: (displayName === null || displayName === void 0 ? void 0 : displayName.charAt(0)) || "A" }), badge] }));
|
|
9
|
+
};
|
|
10
|
+
export default ConversationPeerAvatar;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { default as ConversationInboxHeader } from "./ConversationInboxHeader";
|
|
2
|
+
export { default as ConversationPeerAvatar } from "./ConversationPeerAvatar";
|
|
3
|
+
export type { ConversationPeerAvatarProps } from "./ConversationPeerAvatar";
|
|
4
|
+
export { default as ConversationInboxTitle } from "./ConversationInboxTitle";
|
|
5
|
+
export type { ConversationInboxTitleProps } from "./ConversationInboxTitle";
|
|
6
|
+
export { default as ConversationInboxItem } from "./ConversationInboxItem";
|
|
7
|
+
export type { ConversationInboxItemProps } from "./ConversationInboxItem";
|
|
8
|
+
export { default as ConversationInboxList } from "./ConversationInboxList";
|
|
9
|
+
export type { ConversationInboxListProps } from "./ConversationInboxList";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/conversation-inbox/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAE/E,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,YAAY,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAE5E,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,YAAY,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAE5E,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,YAAY,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAE1E,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,YAAY,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { default as ConversationInboxHeader } from "./ConversationInboxHeader";
|
|
2
|
+
export { default as ConversationPeerAvatar } from "./ConversationPeerAvatar";
|
|
3
|
+
export { default as ConversationInboxTitle } from "./ConversationInboxTitle";
|
|
4
|
+
export { default as ConversationInboxItem } from "./ConversationInboxItem";
|
|
5
|
+
export { default as ConversationInboxList } from "./ConversationInboxList";
|
|
@@ -6,7 +6,7 @@ import { getHostLabel } from "../../../utils/link";
|
|
|
6
6
|
import { openLink } from "../../../utils/openLink";
|
|
7
7
|
import { useTranslation } from "react-i18next";
|
|
8
8
|
const LinkInputPreview = ({ url, onRemove }) => {
|
|
9
|
-
const { t } = useTranslation("
|
|
9
|
+
const { t } = useTranslation("conversation-inbox");
|
|
10
10
|
const { data, isLoading, isError } = useFetchUrlMetadata(url);
|
|
11
11
|
const handleOpen = () => {
|
|
12
12
|
openLink(url, t);
|
|
@@ -17,7 +17,7 @@ const ImageMessageItem = (props) => {
|
|
|
17
17
|
snapshotHeight: (_k = pictureElem === null || pictureElem === void 0 ? void 0 : pictureElem.snapshotPicture) === null || _k === void 0 ? void 0 : _k.height,
|
|
18
18
|
});
|
|
19
19
|
const isSending = message.status === MessageStatus.Sending;
|
|
20
|
-
return (_jsx(Spin, { spinning: isSending, children: _jsx("div", { className: "relative max-w-[200px]", style: minStyle, children: _jsx(Image, { src: sourceUrl, width: minStyle.width, className: "cursor-pointer rounded-xl object-
|
|
20
|
+
return (_jsx(Spin, { spinning: isSending, children: _jsx("div", { className: "relative flex max-w-[200px] overflow-hidden rounded-xl", style: minStyle, children: _jsx(Image, { src: sourceUrl, width: minStyle.width, className: "block cursor-pointer rounded-xl object-cover", preview: {
|
|
21
21
|
src: bigUrl,
|
|
22
22
|
toolbarRender: (originalNode, info) => { var _a; return renderImagePreviewToolbar(originalNode, (_a = info === null || info === void 0 ? void 0 : info.image) === null || _a === void 0 ? void 0 : _a.url, t); },
|
|
23
23
|
}, placeholder: _jsx("div", { className: "flex items-center justify-center rounded-xl bg-black/10", style: minStyle, children: _jsx(Spin, {}) }) }) }) }));
|
|
@@ -4,7 +4,7 @@ import { useTranslation } from "react-i18next";
|
|
|
4
4
|
import { getHostLabel } from "../../../utils/link";
|
|
5
5
|
import { openLink } from "../../../utils/openLink";
|
|
6
6
|
const LinkCard = ({ metadata, url }) => {
|
|
7
|
-
const { t } = useTranslation("
|
|
7
|
+
const { t } = useTranslation("conversation-inbox");
|
|
8
8
|
const { title, description, image } = metadata;
|
|
9
9
|
if (!title && !description && !image) {
|
|
10
10
|
return null;
|
|
@@ -6,7 +6,7 @@ import { parseTextWithLinks } from "../../../utils/link";
|
|
|
6
6
|
import { openLink } from "../../../utils/openLink";
|
|
7
7
|
import { MESSAGE_TEXT_CLASS } from "./textStyle";
|
|
8
8
|
const LinkText = ({ text }) => {
|
|
9
|
-
const { t } = useTranslation("
|
|
9
|
+
const { t } = useTranslation("conversation-inbox");
|
|
10
10
|
const segments = parseTextWithLinks(text);
|
|
11
11
|
return (_jsx("span", { className: clsx("min-w-0 whitespace-pre-wrap text-left [overflow-wrap:anywhere]", MESSAGE_TEXT_CLASS), children: segments.map((segment, index) => segment.type === "link" ? (_jsx("button", { type: "button", onClick: () => openLink(segment.url, t), className: "inline text-left font-medium text-primary-400 underline-offset-2 hover:underline", children: segment.value }, `${segment.url}-${index}`)) : (_jsx("span", { children: segment.value }, `text-${index}`))) }));
|
|
12
12
|
};
|
|
@@ -13,6 +13,6 @@ const VideoMessageItem = (props) => {
|
|
|
13
13
|
snapshotHeight: videoElem === null || videoElem === void 0 ? void 0 : videoElem.snapshotHeight,
|
|
14
14
|
});
|
|
15
15
|
const isSending = message.status === MessageStatus.Sending;
|
|
16
|
-
return (_jsx(Spin, { spinning: isSending, children: _jsx("div", { className: "relative max-w-[200px]", style: minStyle, children: _jsx("video", { src: videoUrl, poster: posterUrl, controls: true, className: "rounded-xl object-cover", style: { width: minStyle.width } }) }) }));
|
|
16
|
+
return (_jsx(Spin, { spinning: isSending, children: _jsx("div", { className: "relative max-w-[200px] overflow-hidden rounded-xl", style: minStyle, children: _jsx("video", { src: videoUrl, poster: posterUrl, controls: true, className: "block rounded-xl object-cover", style: { width: minStyle.width } }) }) }));
|
|
17
17
|
};
|
|
18
18
|
export default VideoMessageItem;
|
|
@@ -9,7 +9,8 @@ interface MessageItemProps {
|
|
|
9
9
|
onRevokeMessage?: (clientMsgID: string) => void;
|
|
10
10
|
onQuoteMessage?: (message: MessageItemType) => void;
|
|
11
11
|
onPressQuoteMessage?: (clientMsgID: string) => void;
|
|
12
|
+
enableLongPress?: boolean;
|
|
12
13
|
}
|
|
13
|
-
declare const MessageItem: ({ message, allMessages, isGroupChat, forceHideTip, contextMenuOpen, onContextMenuOpenChange, onRevokeMessage, onQuoteMessage, onPressQuoteMessage, }: MessageItemProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
14
|
+
declare const MessageItem: ({ message, allMessages, isGroupChat, forceHideTip, contextMenuOpen, onContextMenuOpenChange, onRevokeMessage, onQuoteMessage, onPressQuoteMessage, enableLongPress, }: MessageItemProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
14
15
|
export default MessageItem;
|
|
15
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,WAAW,IAAI,eAAe,EAG/B,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/index.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,WAAW,IAAI,eAAe,EAG/B,MAAM,yBAAyB,CAAC;AAuCjC,UAAU,gBAAgB;IACxB,OAAO,EAAE,eAAe,CAAC;IACzB,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,uBAAuB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;IACpD,mBAAmB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAeD,QAAA,MAAM,WAAW,GAAI,uKAWlB,gBAAgB,mDA4RlB,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { createElement as _createElement } from "react";
|
|
|
2
2
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import dayjs from "dayjs";
|
|
4
4
|
import clsx from "clsx";
|
|
5
|
-
import { Dropdown } from "antd";
|
|
5
|
+
import { Dropdown, message as toastMessage } from "antd";
|
|
6
6
|
import { MessageStatus, MessageType, } from "@openim/wasm-client-sdk";
|
|
7
7
|
import TextMessageItem from "./TextMessage";
|
|
8
8
|
import ImageMessageItem from "./ImageMessage";
|
|
@@ -15,7 +15,8 @@ import { MSG_ITEM_CONTENT_PREFIX, MSG_ITEM_PREFIX } from "../../../constants";
|
|
|
15
15
|
import { formatTimestamp } from "../../../utils/common";
|
|
16
16
|
import useAuthStore from "../../../store/auth";
|
|
17
17
|
import useConversationStore from "../../../store/conversation";
|
|
18
|
-
import { useCallback, useMemo } from "react";
|
|
18
|
+
import { useCallback, useMemo, useRef } from "react";
|
|
19
|
+
import { useLongPress } from "ahooks";
|
|
19
20
|
import { Trans, useTranslation } from "react-i18next";
|
|
20
21
|
import UrlTextMessageItem from "./UrlTextMessage";
|
|
21
22
|
import MessageStatusIndicator from "./MessageStatusIndicator";
|
|
@@ -25,8 +26,9 @@ import RevokeMessageItem from "./RevokeMessage";
|
|
|
25
26
|
import QuoteMessageItem from "./QuoteMessage";
|
|
26
27
|
import SystemLogMessageItem from "./SystemLogMessage";
|
|
27
28
|
import { isSystemLogMessageType } from "../../../utils/messageLog";
|
|
29
|
+
import { buildMessageToolboxMenuItems, getCopyableMessageText, isCopyableMessageType, MessageToolboxActionKey, MESSAGE_TOOLBOX_OVERLAY_CLASSNAME, useMessageToolboxVisibility, } from "../../../components/message/toolbox";
|
|
28
30
|
const MessageAvatar = ({ avatarUrl }) => avatarUrl ? (_jsx("img", { src: avatarUrl, alt: "", className: "h-6 w-6 shrink-0 self-end rounded-full object-cover" })) : (_jsx("div", { className: "flex h-6 w-6 shrink-0 items-center justify-center self-end rounded-full bg-chat-avatar", children: _jsx(Icon, { icon: "droppii-o-1", size: 14, className: "text-white" }) }));
|
|
29
|
-
const MessageItem = ({ message, allMessages, isGroupChat = false, forceHideTip = false, contextMenuOpen, onContextMenuOpenChange, onRevokeMessage, onQuoteMessage, onPressQuoteMessage, }) => {
|
|
31
|
+
const MessageItem = ({ message, allMessages, isGroupChat = false, forceHideTip = false, contextMenuOpen, onContextMenuOpenChange, onRevokeMessage, onQuoteMessage, onPressQuoteMessage, enableLongPress = false, }) => {
|
|
30
32
|
var _a;
|
|
31
33
|
const { t } = useTranslation();
|
|
32
34
|
const { resendMessage } = useSendMessage();
|
|
@@ -56,52 +58,63 @@ const MessageItem = ({ message, allMessages, isGroupChat = false, forceHideTip =
|
|
|
56
58
|
return _jsx(TextMessageItem, { message: item });
|
|
57
59
|
}
|
|
58
60
|
}, []);
|
|
59
|
-
const {
|
|
60
|
-
const isMyMessage = (message === null || message === void 0 ? void 0 : message.sendID) === userID;
|
|
61
|
-
const isOlderThanOneDay = dayjs().diff(dayjs(message === null || message === void 0 ? void 0 : message.sendTime), "days", true) >= 1;
|
|
62
|
-
const status = message.status;
|
|
63
|
-
const isDeliveredForUi = status !== MessageStatus.Sending && status !== MessageStatus.Failed;
|
|
64
|
-
return {
|
|
65
|
-
isReplyable: isDeliveredForUi,
|
|
66
|
-
isRevocable: isMyMessage && isDeliveredForUi && !isOlderThanOneDay,
|
|
67
|
-
isMine: isMyMessage,
|
|
68
|
-
};
|
|
69
|
-
}, [userID, message]);
|
|
61
|
+
const { isDeliveredForUi, isRevocable, isMine } = useMessageToolboxVisibility(message, userID);
|
|
70
62
|
const contextMenuItems = useMemo(() => {
|
|
71
63
|
if ((message === null || message === void 0 ? void 0 : message.contentType) === MessageType.RevokeMessage ||
|
|
72
64
|
isSystemLogMessageType(message === null || message === void 0 ? void 0 : message.contentType)) {
|
|
73
65
|
return [];
|
|
74
66
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
:
|
|
96
|
-
|
|
67
|
+
const closeToolbox = () => onContextMenuOpenChange === null || onContextMenuOpenChange === void 0 ? void 0 : onContextMenuOpenChange(false);
|
|
68
|
+
const actions = [];
|
|
69
|
+
if (isDeliveredForUi && onQuoteMessage) {
|
|
70
|
+
actions.push({
|
|
71
|
+
key: MessageToolboxActionKey.REPLY,
|
|
72
|
+
label: t("context_menu_reply"),
|
|
73
|
+
icon: "arrow-reply-o",
|
|
74
|
+
onClick: () => onQuoteMessage(message),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
if (isDeliveredForUi) {
|
|
78
|
+
actions.push({
|
|
79
|
+
key: MessageToolboxActionKey.PIN,
|
|
80
|
+
label: t("context_menu_pin"),
|
|
81
|
+
icon: "thumbstack-o",
|
|
82
|
+
onClick: closeToolbox,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
if (isDeliveredForUi && isCopyableMessageType(message === null || message === void 0 ? void 0 : message.contentType)) {
|
|
86
|
+
actions.push({
|
|
87
|
+
key: MessageToolboxActionKey.COPY_MESSAGE,
|
|
88
|
+
label: t("context_menu_copy_message"),
|
|
89
|
+
icon: "copy-o",
|
|
90
|
+
onClick: () => {
|
|
91
|
+
navigator.clipboard.writeText(getCopyableMessageText(message));
|
|
92
|
+
toastMessage.success(t("copy_message_success"));
|
|
93
|
+
closeToolbox();
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
if (isRevocable && onRevokeMessage) {
|
|
98
|
+
actions.push({
|
|
99
|
+
key: MessageToolboxActionKey.REVOKE,
|
|
100
|
+
label: t("context_menu_revoke"),
|
|
101
|
+
icon: "trash-alt-o-1",
|
|
102
|
+
danger: true,
|
|
103
|
+
onClick: () => onRevokeMessage((message === null || message === void 0 ? void 0 : message.clientMsgID) || ""),
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return buildMessageToolboxMenuItems(actions);
|
|
97
107
|
}, [
|
|
98
|
-
|
|
108
|
+
isDeliveredForUi,
|
|
99
109
|
isRevocable,
|
|
100
110
|
t,
|
|
101
111
|
onRevokeMessage,
|
|
102
112
|
message,
|
|
103
113
|
onQuoteMessage,
|
|
114
|
+
onContextMenuOpenChange,
|
|
104
115
|
]);
|
|
116
|
+
const bubbleWrapperRef = useRef(null);
|
|
117
|
+
useLongPress(() => onContextMenuOpenChange === null || onContextMenuOpenChange === void 0 ? void 0 : onContextMenuOpenChange(true), enableLongPress ? bubbleWrapperRef : undefined, { delay: 500 });
|
|
105
118
|
const showSenderInfo = useMemo(() => {
|
|
106
119
|
var _a, _b, _c;
|
|
107
120
|
try {
|
|
@@ -148,7 +161,7 @@ const MessageItem = ({ message, allMessages, isGroupChat = false, forceHideTip =
|
|
|
148
161
|
_jsx(SystemLogMessageItem, { message: message })));
|
|
149
162
|
}
|
|
150
163
|
const bubbleNode = (_jsx(MessageBubble, { isMine: isMine, isInternal: isInternalMessage, senderName: message === null || message === void 0 ? void 0 : message.senderNickname, showSenderName: showSenderName, showTip: showTip, id: `${MSG_ITEM_CONTENT_PREFIX}${message === null || message === void 0 ? void 0 : message.clientMsgID}`, content: (message === null || message === void 0 ? void 0 : message.contentType) === MessageType.MergeMessage ? (_jsxs(_Fragment, { children: [_jsx(MergeImageMessageItem, { message: message }), (message === null || message === void 0 ? void 0 : message.textElem) && _jsx(TextMessageItem, { message: message })] })) : (renderMessageByType(message)) }));
|
|
151
|
-
const wrappedBubble = hasContextMenu ? (_jsx(Dropdown, { menu: { items: contextMenuItems }, trigger: ["contextMenu"], open: contextMenuOpen, onOpenChange: onContextMenuOpenChange, children: _jsx("div", { className: "min-w-0", children: bubbleNode }) })) : (bubbleNode);
|
|
164
|
+
const wrappedBubble = hasContextMenu ? (_jsx(Dropdown, { menu: { items: contextMenuItems }, trigger: ["contextMenu"], open: contextMenuOpen, onOpenChange: onContextMenuOpenChange, overlayClassName: MESSAGE_TOOLBOX_OVERLAY_CLASSNAME, children: _jsx("div", { ref: bubbleWrapperRef, className: "min-w-0", children: bubbleNode }) })) : (bubbleNode);
|
|
152
165
|
return (_createElement("div", Object.assign({}, messageContainerProps, { key: message === null || message === void 0 ? void 0 : message.clientMsgID }),
|
|
153
166
|
timeBreakNode,
|
|
154
167
|
_jsxs("div", { className: clsx("flex min-w-0 items-end gap-1", isMine ? "justify-end pl-12 pr-3" : "justify-start pl-3 pr-12"), children: [!isMine &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mediaSize.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/mediaSize.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,uBAAuB,GAAI,8CAIrC,2BAA2B;;;;
|
|
1
|
+
{"version":3,"file":"mediaSize.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/mediaSize.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,eAAO,MAAM,uBAAuB,GAAI,8CAIrC,2BAA2B;;;;CAmB7B,CAAC;AAEF,eAAO,MAAM,uBAAuB,iDArBjC,2BAA2B;;;;CAqBgC,CAAC"}
|
|
@@ -2,19 +2,19 @@ const IMAGE_MAX_WIDTH = 200;
|
|
|
2
2
|
export const getImageMessageMinStyle = ({ imageWidth, imageHeight, snapshotHeight, }) => {
|
|
3
3
|
if (!imageWidth || !imageHeight || imageWidth <= 0 || imageHeight <= 0) {
|
|
4
4
|
return {
|
|
5
|
-
minHeight:
|
|
6
|
-
minWidth:
|
|
5
|
+
minHeight: `${IMAGE_MAX_WIDTH}px`,
|
|
6
|
+
minWidth: `${IMAGE_MAX_WIDTH}px`,
|
|
7
7
|
width: IMAGE_MAX_WIDTH,
|
|
8
8
|
};
|
|
9
9
|
}
|
|
10
10
|
const snapshotMaxHeight = snapshotHeight !== null && snapshotHeight !== void 0 ? snapshotHeight : imageHeight;
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
11
|
+
const displayWidth = Math.min(imageWidth, IMAGE_MAX_WIDTH);
|
|
12
|
+
const aspectHeight = displayWidth * (imageHeight / imageWidth);
|
|
13
|
+
const displayHeight = Math.min(aspectHeight, snapshotMaxHeight);
|
|
14
14
|
return {
|
|
15
|
-
minHeight: `${
|
|
16
|
-
minWidth: `${
|
|
17
|
-
width:
|
|
15
|
+
minHeight: `${displayHeight}px`,
|
|
16
|
+
minWidth: `${displayWidth}px`,
|
|
17
|
+
width: displayWidth,
|
|
18
18
|
};
|
|
19
19
|
};
|
|
20
20
|
export const getVideoMessageMinStyle = getImageMessageMinStyle;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { MenuProps } from "antd";
|
|
2
|
+
import { MessageToolboxAction } from "./types";
|
|
3
|
+
export declare const MESSAGE_TOOLBOX_OVERLAY_CLASSNAME: string;
|
|
4
|
+
export declare const buildMessageToolboxMenuItems: (actions: MessageToolboxAction[]) => NonNullable<MenuProps["items"]>;
|
|
5
|
+
//# sourceMappingURL=MessageToolboxMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageToolboxMenu.d.ts","sourceRoot":"","sources":["../../../../src/components/message/toolbox/MessageToolboxMenu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAEtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE/C,eAAO,MAAM,iCAAiC,QAS7C,CAAC;AA0BF,eAAO,MAAM,4BAA4B,GACvC,SAAS,oBAAoB,EAAE,KAC9B,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAO5B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import clsx from "clsx";
|
|
3
|
+
import { Icon } from "../../../components/icon";
|
|
4
|
+
export const MESSAGE_TOOLBOX_OVERLAY_CLASSNAME = clsx("[&_.ant-dropdown-menu]:min-w-[200px]", "[&_.ant-dropdown-menu]:rounded-2xl", "[&_.ant-dropdown-menu]:p-0", "[&_.ant-dropdown-menu]:py-2", "[&_.ant-dropdown-menu]:shadow-message-toolbox", "[&_.ant-dropdown-menu-item]:rounded-none", "[&_.ant-dropdown-menu-item]:px-4", "[&_.ant-dropdown-menu-item]:py-1.5");
|
|
5
|
+
const ToolboxMenuRow = ({ icon, label, danger = false }) => (_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Icon, { icon: icon, size: 24, className: danger ? "text-danger-400" : "text-gray-900" }), _jsx("span", { className: clsx("text-base font-medium", danger ? "text-danger-400" : "text-gray-900"), children: label })] }));
|
|
6
|
+
export const buildMessageToolboxMenuItems = (actions) => actions.map((action) => ({
|
|
7
|
+
key: action.key,
|
|
8
|
+
label: (_jsx(ToolboxMenuRow, { icon: action.icon, label: action.label, danger: action.danger })),
|
|
9
|
+
onClick: action.onClick,
|
|
10
|
+
}));
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { MessageItem as MessageItemType, MessageType } from "@openim/wasm-client-sdk";
|
|
2
|
+
export declare const isCopyableMessageType: (contentType?: MessageType) => boolean;
|
|
3
|
+
export declare const getCopyableMessageText: (message: MessageItemType) => string;
|
|
4
|
+
//# sourceMappingURL=getCopyableMessageText.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getCopyableMessageText.d.ts","sourceRoot":"","sources":["../../../../src/components/message/toolbox/getCopyableMessageText.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,eAAe,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAUtF,eAAO,MAAM,qBAAqB,GAAI,cAAc,WAAW,KAAG,OACH,CAAC;AAEhE,eAAO,MAAM,sBAAsB,GAAI,SAAS,eAAe,KAAG,MAuBjE,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { MessageType } from "@openim/wasm-client-sdk";
|
|
2
|
+
import { htmlHasFormatting, stripHtml } from "../../../utils/common";
|
|
3
|
+
const COPYABLE_MESSAGE_TYPES = [
|
|
4
|
+
MessageType.TextMessage,
|
|
5
|
+
MessageType.QuoteMessage,
|
|
6
|
+
MessageType.UrlTextMessage,
|
|
7
|
+
];
|
|
8
|
+
export const isCopyableMessageType = (contentType) => !!contentType && COPYABLE_MESSAGE_TYPES.includes(contentType);
|
|
9
|
+
export const getCopyableMessageText = (message) => {
|
|
10
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
11
|
+
let extendMessageInfo = null;
|
|
12
|
+
try {
|
|
13
|
+
extendMessageInfo = JSON.parse((message === null || message === void 0 ? void 0 : message.ex) || "{}");
|
|
14
|
+
}
|
|
15
|
+
catch (_h) {
|
|
16
|
+
extendMessageInfo = {};
|
|
17
|
+
}
|
|
18
|
+
const richHtmlContent = ((_b = (_a = extendMessageInfo === null || extendMessageInfo === void 0 ? void 0 : extendMessageInfo.messageInfo) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.content) || "";
|
|
19
|
+
if (richHtmlContent && htmlHasFormatting(richHtmlContent)) {
|
|
20
|
+
return stripHtml(richHtmlContent);
|
|
21
|
+
}
|
|
22
|
+
return (((_c = message === null || message === void 0 ? void 0 : message.textElem) === null || _c === void 0 ? void 0 : _c.content) ||
|
|
23
|
+
((_d = message === null || message === void 0 ? void 0 : message.quoteElem) === null || _d === void 0 ? void 0 : _d.text) ||
|
|
24
|
+
((_e = message === null || message === void 0 ? void 0 : message.urlTextElem) === null || _e === void 0 ? void 0 : _e.content) ||
|
|
25
|
+
stripHtml(richHtmlContent) ||
|
|
26
|
+
((_g = (_f = message === null || message === void 0 ? void 0 : message.urlTextElem) === null || _f === void 0 ? void 0 : _f.urls) === null || _g === void 0 ? void 0 : _g[0]) ||
|
|
27
|
+
"");
|
|
28
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/message/toolbox/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare const MessageToolboxActionKey: {
|
|
2
|
+
readonly REPLY: "REPLY";
|
|
3
|
+
readonly PIN: "PIN";
|
|
4
|
+
readonly COPY_MESSAGE: "COPY_MESSAGE";
|
|
5
|
+
readonly REVOKE: "REVOKE";
|
|
6
|
+
};
|
|
7
|
+
export type MessageToolboxActionKey = (typeof MessageToolboxActionKey)[keyof typeof MessageToolboxActionKey];
|
|
8
|
+
export interface MessageToolboxAction {
|
|
9
|
+
key: MessageToolboxActionKey;
|
|
10
|
+
label: string;
|
|
11
|
+
icon: string;
|
|
12
|
+
danger?: boolean;
|
|
13
|
+
onClick: () => void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/message/toolbox/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB;;;;;CAK1B,CAAC;AAEX,MAAM,MAAM,uBAAuB,GACjC,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,OAAO,uBAAuB,CAAC,CAAC;AAEzE,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,uBAAuB,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { MessageItem as MessageItemType } from "@openim/wasm-client-sdk";
|
|
2
|
+
interface MessageToolboxVisibility {
|
|
3
|
+
isDeliveredForUi: boolean;
|
|
4
|
+
isMine: boolean;
|
|
5
|
+
isRevocable: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare const useMessageToolboxVisibility: (message: MessageItemType, userID?: string) => MessageToolboxVisibility;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=useMessageToolboxVisibility.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMessageToolboxVisibility.d.ts","sourceRoot":"","sources":["../../../../src/components/message/toolbox/useMessageToolboxVisibility.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,IAAI,eAAe,EAE/B,MAAM,yBAAyB,CAAC;AAIjC,UAAU,wBAAwB;IAChC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,eAAO,MAAM,2BAA2B,GACtC,SAAS,eAAe,EACxB,SAAS,MAAM,KACd,wBAcoB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { useMemo } from "react";
|
|
2
|
+
import dayjs from "dayjs";
|
|
3
|
+
import { MessageStatus, } from "@openim/wasm-client-sdk";
|
|
4
|
+
const REVOKE_WINDOW_DAYS = 1;
|
|
5
|
+
export const useMessageToolboxVisibility = (message, userID) => useMemo(() => {
|
|
6
|
+
const isMine = (message === null || message === void 0 ? void 0 : message.sendID) === userID;
|
|
7
|
+
const isOlderThanRevokeWindow = dayjs().diff(dayjs(message === null || message === void 0 ? void 0 : message.sendTime), "days", true) >= REVOKE_WINDOW_DAYS;
|
|
8
|
+
const isDeliveredForUi = (message === null || message === void 0 ? void 0 : message.status) !== MessageStatus.Sending &&
|
|
9
|
+
(message === null || message === void 0 ? void 0 : message.status) !== MessageStatus.Failed;
|
|
10
|
+
return {
|
|
11
|
+
isDeliveredForUi,
|
|
12
|
+
isMine,
|
|
13
|
+
isRevocable: isMine && isDeliveredForUi && !isOlderThanRevokeWindow,
|
|
14
|
+
};
|
|
15
|
+
}, [userID, message]);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface MoreOptionConfig {
|
|
2
|
+
icon: string;
|
|
3
|
+
labelKey: string;
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare const DEFAULT_MORE_OPTIONS: MoreOptionConfig[];
|
|
7
|
+
export declare function createMoreOptions(extraOptions?: MoreOptionConfig[]): MoreOptionConfig[];
|
|
8
|
+
export declare const MORE_OPTIONS: MoreOptionConfig[];
|
|
9
|
+
//# sourceMappingURL=moreOption.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moreOption.d.ts","sourceRoot":"","sources":["../../src/constants/moreOption.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,eAAO,MAAM,oBAAoB,EAAE,gBAAgB,EAgBlD,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,YAAY,GAAE,gBAAgB,EAAO,GACpC,gBAAgB,EAAE,CAEpB;AAED,eAAO,MAAM,YAAY,EAAE,gBAAgB,EAgBzC,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export const DEFAULT_MORE_OPTIONS = [
|
|
2
|
+
{
|
|
3
|
+
icon: "image-02-o",
|
|
4
|
+
labelKey: "thread_detail.more_option.media",
|
|
5
|
+
enabled: true,
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
icon: "camera-o",
|
|
9
|
+
labelKey: "thread_detail.more_option.camera",
|
|
10
|
+
enabled: false,
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
icon: "paperclip-o",
|
|
14
|
+
labelKey: "thread_detail.more_option.document",
|
|
15
|
+
enabled: true,
|
|
16
|
+
},
|
|
17
|
+
];
|
|
18
|
+
export function createMoreOptions(extraOptions = []) {
|
|
19
|
+
return [...DEFAULT_MORE_OPTIONS, ...extraOptions];
|
|
20
|
+
}
|
|
21
|
+
export const MORE_OPTIONS = createMoreOptions([
|
|
22
|
+
{
|
|
23
|
+
icon: "receipt-o",
|
|
24
|
+
labelKey: "thread_detail.more_option.order",
|
|
25
|
+
enabled: false,
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
icon: "shopping-basket-o",
|
|
29
|
+
labelKey: "thread_detail.more_option.product",
|
|
30
|
+
enabled: false,
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
icon: "calendar-active-o",
|
|
34
|
+
labelKey: "thread_detail.more_option.appointment",
|
|
35
|
+
enabled: false,
|
|
36
|
+
},
|
|
37
|
+
]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useActiveConversation.d.ts","sourceRoot":"","sources":["../../../src/hooks/conversation/useActiveConversation.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,eAAO,MAAM,qBAAqB,GAChC,mBAAmB,oBAAoB,EAAE,SAuC1C,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
import { useSearchParams } from "next/navigation";
|
|
4
|
+
import useConversationStore from "../../store/conversation";
|
|
5
|
+
export const useActiveConversation = (conversationItems) => {
|
|
6
|
+
const searchParams = useSearchParams();
|
|
7
|
+
const threadId = searchParams.get("threadId");
|
|
8
|
+
const setSelectedConversationId = useConversationStore((state) => state.setSelectedConversationId);
|
|
9
|
+
const setConversationData = useConversationStore((state) => state.setConversationData);
|
|
10
|
+
const clearSelectedConversation = useConversationStore((state) => state.clearSelectedConversation);
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
if (!threadId) {
|
|
13
|
+
clearSelectedConversation();
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
setSelectedConversationId(threadId);
|
|
17
|
+
const matchedThread = conversationItems.find((item) => item.conversationID === threadId);
|
|
18
|
+
if (!matchedThread)
|
|
19
|
+
return;
|
|
20
|
+
const currentData = useConversationStore.getState().conversationData;
|
|
21
|
+
if ((currentData === null || currentData === void 0 ? void 0 : currentData.conversationID) !== threadId) {
|
|
22
|
+
setConversationData(matchedThread);
|
|
23
|
+
}
|
|
24
|
+
}, [
|
|
25
|
+
threadId,
|
|
26
|
+
conversationItems,
|
|
27
|
+
setSelectedConversationId,
|
|
28
|
+
setConversationData,
|
|
29
|
+
clearSelectedConversation,
|
|
30
|
+
]);
|
|
31
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { BotConversationDetail } from "../../types/conversation";
|
|
2
|
+
export declare const useBotConversationDetail: (conversationId: string, enabled: boolean) => import("@tanstack/react-query").UseQueryResult<BotConversationDetail, Error>;
|
|
3
|
+
//# sourceMappingURL=useBotConversationDetail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useBotConversationDetail.d.ts","sourceRoot":"","sources":["../../../src/hooks/conversation/useBotConversationDetail.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAElE,eAAO,MAAM,wBAAwB,GACnC,gBAAgB,MAAM,EACtB,SAAS,OAAO,iFAejB,CAAC"}
|