@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.
Files changed (173) hide show
  1. package/dist/components/biz-inbox/BizThreadAvatar.d.ts +3 -3
  2. package/dist/components/biz-inbox/BizThreadAvatar.d.ts.map +1 -1
  3. package/dist/components/biz-inbox/BizThreadAvatar.js +5 -5
  4. package/dist/components/biz-inbox/BizThreadCard.d.ts +3 -3
  5. package/dist/components/biz-inbox/BizThreadCard.d.ts.map +1 -1
  6. package/dist/components/biz-inbox/BizThreadCard.js +7 -8
  7. package/dist/components/biz-inbox/BizThreadList.d.ts +3 -3
  8. package/dist/components/biz-inbox/BizThreadList.d.ts.map +1 -1
  9. package/dist/components/biz-inbox/BizThreadList.js +4 -8
  10. package/dist/components/biz-inbox/BizThreadTitle.d.ts +3 -3
  11. package/dist/components/biz-inbox/BizThreadTitle.d.ts.map +1 -1
  12. package/dist/components/biz-inbox/BizThreadTitle.js +5 -5
  13. package/dist/components/biz-thread-detail/BizMessageList.d.ts.map +1 -1
  14. package/dist/components/biz-thread-detail/BizMessageList.js +4 -5
  15. package/dist/components/biz-thread-detail/BizThreadDetailHeader.d.ts +2 -2
  16. package/dist/components/biz-thread-detail/BizThreadDetailHeader.d.ts.map +1 -1
  17. package/dist/components/biz-thread-detail/BizThreadDetailHeader.js +7 -5
  18. package/dist/components/biz-thread-detail/BizThreadDetailInput.d.ts.map +1 -1
  19. package/dist/components/biz-thread-detail/BizThreadDetailInput.js +8 -13
  20. package/dist/components/biz-thread-detail/bot/BotButtonMessage.d.ts +1 -1
  21. package/dist/components/biz-thread-detail/bot/BotButtonMessage.d.ts.map +1 -1
  22. package/dist/components/conversation-detail/ConversationDetailHeader.d.ts +8 -0
  23. package/dist/components/conversation-detail/ConversationDetailHeader.d.ts.map +1 -0
  24. package/dist/components/conversation-detail/ConversationDetailHeader.js +18 -0
  25. package/dist/components/conversation-detail/ConversationDetailInput.d.ts +8 -0
  26. package/dist/components/conversation-detail/ConversationDetailInput.d.ts.map +1 -0
  27. package/dist/components/conversation-detail/ConversationDetailInput.js +258 -0
  28. package/dist/components/conversation-detail/ConversationMessageList.d.ts +7 -0
  29. package/dist/components/conversation-detail/ConversationMessageList.d.ts.map +1 -0
  30. package/dist/components/conversation-detail/ConversationMessageList.js +42 -0
  31. package/dist/components/conversation-detail/ConversationMoreOptionItem.d.ts +8 -0
  32. package/dist/components/conversation-detail/ConversationMoreOptionItem.d.ts.map +1 -0
  33. package/dist/components/conversation-detail/ConversationMoreOptionItem.js +19 -0
  34. package/dist/components/conversation-detail/ConversationMoreOptionPanel.d.ts +10 -0
  35. package/dist/components/conversation-detail/ConversationMoreOptionPanel.d.ts.map +1 -0
  36. package/dist/components/conversation-detail/ConversationMoreOptionPanel.js +20 -0
  37. package/dist/components/conversation-detail/bot/BotButtonMessage.d.ts +10 -0
  38. package/dist/components/conversation-detail/bot/BotButtonMessage.d.ts.map +1 -0
  39. package/dist/components/conversation-detail/bot/BotButtonMessage.js +30 -0
  40. package/dist/components/conversation-detail/bot/BotStartButton.d.ts +8 -0
  41. package/dist/components/conversation-detail/bot/BotStartButton.d.ts.map +1 -0
  42. package/dist/components/conversation-detail/bot/BotStartButton.js +11 -0
  43. package/dist/components/conversation-detail/bot/BotSuggest.d.ts +7 -0
  44. package/dist/components/conversation-detail/bot/BotSuggest.d.ts.map +1 -0
  45. package/dist/components/conversation-detail/bot/BotSuggest.js +11 -0
  46. package/dist/components/conversation-detail/bot/index.d.ts +7 -0
  47. package/dist/components/conversation-detail/bot/index.d.ts.map +1 -0
  48. package/dist/components/conversation-detail/bot/index.js +3 -0
  49. package/dist/components/conversation-detail/index.d.ts +10 -0
  50. package/dist/components/conversation-detail/index.d.ts.map +1 -0
  51. package/dist/components/conversation-detail/index.js +5 -0
  52. package/dist/components/conversation-inbox/ConversationInboxHeader.d.ts +3 -0
  53. package/dist/components/conversation-inbox/ConversationInboxHeader.d.ts.map +1 -0
  54. package/dist/components/conversation-inbox/ConversationInboxHeader.js +8 -0
  55. package/dist/components/conversation-inbox/ConversationInboxItem.d.ts +8 -0
  56. package/dist/components/conversation-inbox/ConversationInboxItem.d.ts.map +1 -0
  57. package/dist/components/conversation-inbox/ConversationInboxItem.js +30 -0
  58. package/dist/components/conversation-inbox/ConversationInboxList.d.ts +12 -0
  59. package/dist/components/conversation-inbox/ConversationInboxList.d.ts.map +1 -0
  60. package/dist/components/conversation-inbox/ConversationInboxList.js +36 -0
  61. package/dist/components/conversation-inbox/ConversationInboxTitle.d.ts +9 -0
  62. package/dist/components/conversation-inbox/ConversationInboxTitle.d.ts.map +1 -0
  63. package/dist/components/conversation-inbox/ConversationInboxTitle.js +7 -0
  64. package/dist/components/conversation-inbox/ConversationPeerAvatar.d.ts +10 -0
  65. package/dist/components/conversation-inbox/ConversationPeerAvatar.d.ts.map +1 -0
  66. package/dist/components/conversation-inbox/ConversationPeerAvatar.js +10 -0
  67. package/dist/components/conversation-inbox/index.d.ts +10 -0
  68. package/dist/components/conversation-inbox/index.d.ts.map +1 -0
  69. package/dist/components/conversation-inbox/index.js +5 -0
  70. package/dist/components/message/footer/LinkInputPreview.js +1 -1
  71. package/dist/components/message/item/ImageMessage.js +1 -1
  72. package/dist/components/message/item/LinkCard.js +1 -1
  73. package/dist/components/message/item/LinkText.js +1 -1
  74. package/dist/components/message/item/VideoMessage.js +1 -1
  75. package/dist/components/message/item/index.d.ts +2 -1
  76. package/dist/components/message/item/index.d.ts.map +1 -1
  77. package/dist/components/message/item/index.js +51 -38
  78. package/dist/components/message/item/mediaSize.d.ts.map +1 -1
  79. package/dist/components/message/item/mediaSize.js +8 -8
  80. package/dist/components/message/toolbox/MessageToolboxMenu.d.ts +5 -0
  81. package/dist/components/message/toolbox/MessageToolboxMenu.d.ts.map +1 -0
  82. package/dist/components/message/toolbox/MessageToolboxMenu.js +10 -0
  83. package/dist/components/message/toolbox/getCopyableMessageText.d.ts +4 -0
  84. package/dist/components/message/toolbox/getCopyableMessageText.d.ts.map +1 -0
  85. package/dist/components/message/toolbox/getCopyableMessageText.js +28 -0
  86. package/dist/components/message/toolbox/index.d.ts +5 -0
  87. package/dist/components/message/toolbox/index.d.ts.map +1 -0
  88. package/dist/components/message/toolbox/index.js +4 -0
  89. package/dist/components/message/toolbox/types.d.ts +15 -0
  90. package/dist/components/message/toolbox/types.d.ts.map +1 -0
  91. package/dist/components/message/toolbox/types.js +6 -0
  92. package/dist/components/message/toolbox/useMessageToolboxVisibility.d.ts +9 -0
  93. package/dist/components/message/toolbox/useMessageToolboxVisibility.d.ts.map +1 -0
  94. package/dist/components/message/toolbox/useMessageToolboxVisibility.js +15 -0
  95. package/dist/constants/moreOption.d.ts +9 -0
  96. package/dist/constants/moreOption.d.ts.map +1 -0
  97. package/dist/constants/moreOption.js +37 -0
  98. package/dist/hooks/conversation/useActiveConversation.d.ts +3 -0
  99. package/dist/hooks/conversation/useActiveConversation.d.ts.map +1 -0
  100. package/dist/hooks/conversation/useActiveConversation.js +31 -0
  101. package/dist/hooks/conversation/useBotConversationDetail.d.ts +3 -0
  102. package/dist/hooks/conversation/useBotConversationDetail.d.ts.map +1 -0
  103. package/dist/hooks/conversation/useBotConversationDetail.js +18 -0
  104. package/dist/hooks/conversation/useBotFlow.d.ts +18 -0
  105. package/dist/hooks/conversation/useBotFlow.d.ts.map +1 -0
  106. package/dist/hooks/conversation/useBotFlow.js +150 -0
  107. package/dist/hooks/conversation/useConversationList.d.ts +15 -0
  108. package/dist/hooks/conversation/useConversationList.d.ts.map +1 -0
  109. package/dist/hooks/conversation/useConversationList.js +70 -0
  110. package/dist/hooks/conversation/useCreateConversation.d.ts +8 -0
  111. package/dist/hooks/conversation/useCreateConversation.d.ts.map +1 -0
  112. package/dist/hooks/conversation/useCreateConversation.js +15 -0
  113. package/dist/hooks/conversation/useResetBotFlow.d.ts +3 -0
  114. package/dist/hooks/conversation/useResetBotFlow.d.ts.map +1 -0
  115. package/dist/hooks/conversation/useResetBotFlow.js +14 -0
  116. package/dist/hooks/conversation/useRunBotFlow.d.ts +7 -0
  117. package/dist/hooks/conversation/useRunBotFlow.d.ts.map +1 -0
  118. package/dist/hooks/conversation/useRunBotFlow.js +14 -0
  119. package/dist/hooks/global/useGlobalEvent.d.ts.map +1 -1
  120. package/dist/hooks/global/useGlobalEvent.js +15 -7
  121. package/dist/hooks/message/useSendMessage.d.ts +1 -1
  122. package/dist/hooks/message/useSendMessage.d.ts.map +1 -1
  123. package/dist/hooks/user/useAuth.js +2 -2
  124. package/dist/index.d.ts +12 -11
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +7 -6
  127. package/dist/locales/i18n.js +3 -3
  128. package/dist/locales/i18n.ts +3 -3
  129. package/dist/locales/vi/biz-inbox.json +39 -39
  130. package/dist/locales/vi/common.json +3 -0
  131. package/dist/locales/vi/conversation-inbox.json +39 -0
  132. package/dist/screens/biz-message/index.d.ts +3 -4
  133. package/dist/screens/biz-message/index.d.ts.map +1 -1
  134. package/dist/screens/biz-message/index.js +5 -9
  135. package/dist/screens/biz-thread-detail/index.js +6 -6
  136. package/dist/screens/conversation-detail/index.d.ts +9 -0
  137. package/dist/screens/conversation-detail/index.d.ts.map +1 -0
  138. package/dist/screens/conversation-detail/index.js +53 -0
  139. package/dist/screens/conversation-inbox/index.d.ts +8 -0
  140. package/dist/screens/conversation-inbox/index.d.ts.map +1 -0
  141. package/dist/screens/conversation-inbox/index.js +30 -0
  142. package/dist/services/query.d.ts +0 -1
  143. package/dist/services/query.d.ts.map +1 -1
  144. package/dist/services/query.js +0 -1
  145. package/dist/services/routes.d.ts +0 -1
  146. package/dist/services/routes.d.ts.map +1 -1
  147. package/dist/services/routes.js +0 -1
  148. package/dist/store/conversation.d.ts.map +1 -1
  149. package/dist/store/conversation.js +14 -5
  150. package/dist/store/messageDraft.d.ts +9 -0
  151. package/dist/store/messageDraft.d.ts.map +1 -0
  152. package/dist/store/messageDraft.js +35 -0
  153. package/dist/store/type.d.ts +6 -1
  154. package/dist/store/type.d.ts.map +1 -1
  155. package/dist/styles/global.css +1 -1
  156. package/dist/tsconfig.tsbuildinfo +1 -1
  157. package/dist/types/conversation.d.ts +116 -0
  158. package/dist/types/conversation.d.ts.map +1 -0
  159. package/dist/types/conversation.js +33 -0
  160. package/dist/utils/common.d.ts +1 -1
  161. package/dist/utils/common.d.ts.map +1 -1
  162. package/dist/utils/common.js +5 -3
  163. package/dist/utils/conversation.d.ts +12 -0
  164. package/dist/utils/conversation.d.ts.map +1 -0
  165. package/dist/utils/conversation.js +53 -0
  166. package/dist/utils/events.d.ts +1 -1
  167. package/dist/utils/events.d.ts.map +1 -1
  168. package/dist/utils/fileValidation.d.ts +2 -1
  169. package/dist/utils/fileValidation.d.ts.map +1 -1
  170. package/dist/utils/fileValidation.js +10 -1
  171. package/dist/utils/imCommon.d.ts +1 -0
  172. package/dist/utils/imCommon.d.ts.map +1 -1
  173. 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("biz-inbox");
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-contain", preview: {
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("biz-inbox");
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("biz-inbox");
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;AA6BjC,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;CACrD;AAeD,QAAA,MAAM,WAAW,GAAI,sJAUlB,gBAAgB,mDA+QlB,CAAC;AAEF,eAAe,WAAW,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 { isReplyable, isRevocable, isMine } = useMemo(() => {
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
- return [
76
- ...(isReplyable && onQuoteMessage
77
- ? [
78
- {
79
- key: "TB01",
80
- label: t("context_menu_reply"),
81
- icon: (_jsx(Icon, { icon: "arrow-reply-alt-o", size: 18, className: "text-chat-focus" })),
82
- onClick: () => onQuoteMessage === null || onQuoteMessage === void 0 ? void 0 : onQuoteMessage(message),
83
- },
84
- ]
85
- : []),
86
- ...(isRevocable && onRevokeMessage
87
- ? [
88
- {
89
- key: "TB05",
90
- label: t("context_menu_revoke"),
91
- icon: (_jsx(Icon, { icon: "arrow-reload-o", size: 18, className: "text-chat-focus" })),
92
- onClick: () => onRevokeMessage === null || onRevokeMessage === void 0 ? void 0 : onRevokeMessage((message === null || message === void 0 ? void 0 : message.clientMsgID) || ""),
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
- isReplyable,
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;;;;CAoB7B,CAAC;AAEF,eAAO,MAAM,uBAAuB,iDAtBjC,2BAA2B;;;;CAsBgC,CAAC"}
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: "210px",
6
- minWidth: "210px",
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 minHeight = Math.min(IMAGE_MAX_WIDTH, imageWidth) * (imageHeight / imageWidth) + 2;
12
- const adaptedHeight = Math.min(minHeight, snapshotMaxHeight) + 10;
13
- const adaptedWidth = Math.min(imageWidth, IMAGE_MAX_WIDTH) + 10;
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: `${adaptedHeight}px`,
16
- minWidth: `${adaptedWidth}px`,
17
- width: Math.min(imageWidth, IMAGE_MAX_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,5 @@
1
+ export * from "./types";
2
+ export * from "./MessageToolboxMenu";
3
+ export * from "./useMessageToolboxVisibility";
4
+ export * from "./getCopyableMessageText";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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,4 @@
1
+ export * from "./types";
2
+ export * from "./MessageToolboxMenu";
3
+ export * from "./useMessageToolboxVisibility";
4
+ export * from "./getCopyableMessageText";
@@ -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,6 @@
1
+ export const MessageToolboxActionKey = {
2
+ REPLY: "REPLY",
3
+ PIN: "PIN",
4
+ COPY_MESSAGE: "COPY_MESSAGE",
5
+ REVOKE: "REVOKE",
6
+ };
@@ -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,3 @@
1
+ import type { ConversationListItem } from "../../types/conversation";
2
+ export declare const useActiveConversation: (conversationItems: ConversationListItem[]) => void;
3
+ //# sourceMappingURL=useActiveConversation.d.ts.map
@@ -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"}