@droppii-org/chat-sdk 0.1.50 → 0.1.52

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 (99) hide show
  1. package/dist/assets/svg/index.d.ts +0 -1
  2. package/dist/assets/svg/index.d.ts.map +1 -1
  3. package/dist/assets/svg/index.js +0 -1
  4. package/dist/assets/svg/index.ts +1 -2
  5. package/dist/components/biz-inbox/BizInboxHeader.js +1 -1
  6. package/dist/components/biz-inbox/BizThreadAvatar.js +2 -2
  7. package/dist/components/biz-inbox/BizThreadCard.d.ts.map +1 -1
  8. package/dist/components/biz-inbox/BizThreadCard.js +3 -11
  9. package/dist/components/biz-inbox/BizThreadTitle.js +1 -1
  10. package/dist/components/biz-thread-detail/BizMessageList.js +2 -2
  11. package/dist/components/biz-thread-detail/BizMoreOptionItem.js +2 -2
  12. package/dist/components/biz-thread-detail/BizThreadDetailHeader.js +2 -2
  13. package/dist/components/biz-thread-detail/BizThreadDetailInput.d.ts.map +1 -1
  14. package/dist/components/biz-thread-detail/BizThreadDetailInput.js +12 -21
  15. package/dist/components/biz-thread-detail/index.d.ts +0 -4
  16. package/dist/components/biz-thread-detail/index.d.ts.map +1 -1
  17. package/dist/components/biz-thread-detail/index.js +0 -2
  18. package/dist/components/conversation/ConversationBySessionItem.d.ts.map +1 -1
  19. package/dist/components/conversation/ConversationBySessionItem.js +6 -5
  20. package/dist/components/conversation/ThreadCard.d.ts +14 -0
  21. package/dist/components/conversation/ThreadCard.d.ts.map +1 -0
  22. package/dist/components/conversation/ThreadCard.js +16 -0
  23. package/dist/components/media-collection/ImageCollection.d.ts.map +1 -1
  24. package/dist/components/media-collection/ImageCollection.js +3 -17
  25. package/dist/components/message/MessageList.d.ts.map +1 -1
  26. package/dist/components/message/MessageList.js +1 -7
  27. package/dist/components/message/footer/ComposerTextSyncPlugin.d.ts +6 -0
  28. package/dist/components/message/footer/ComposerTextSyncPlugin.d.ts.map +1 -0
  29. package/dist/components/message/footer/ComposerTextSyncPlugin.js +16 -0
  30. package/dist/components/message/footer/FilePreview.d.ts +3 -2
  31. package/dist/components/message/footer/FilePreview.d.ts.map +1 -1
  32. package/dist/components/message/footer/FilePreview.js +61 -21
  33. package/dist/components/message/footer/LinkInputPreview.d.ts +7 -0
  34. package/dist/components/message/footer/LinkInputPreview.d.ts.map +1 -0
  35. package/dist/components/message/footer/LinkInputPreview.js +16 -0
  36. package/dist/components/message/footer/MediaActions.d.ts.map +1 -1
  37. package/dist/components/message/footer/MediaActions.js +8 -5
  38. package/dist/components/message/footer/index.d.ts.map +1 -1
  39. package/dist/components/message/footer/index.js +48 -35
  40. package/dist/components/message/item/FileMessage.d.ts +2 -2
  41. package/dist/components/message/item/FileMessage.d.ts.map +1 -1
  42. package/dist/components/message/item/FileMessage.js +20 -12
  43. package/dist/components/message/item/ImageMessage.d.ts.map +1 -1
  44. package/dist/components/message/item/ImageMessage.js +17 -15
  45. package/dist/components/message/item/LinkCard.d.ts +7 -0
  46. package/dist/components/message/item/LinkCard.d.ts.map +1 -0
  47. package/dist/components/message/item/LinkCard.js +17 -0
  48. package/dist/components/message/item/LinkText.d.ts +6 -0
  49. package/dist/components/message/item/LinkText.d.ts.map +1 -0
  50. package/dist/components/message/item/LinkText.js +13 -0
  51. package/dist/components/message/item/MergeImageMessage.d.ts +7 -0
  52. package/dist/components/message/item/MergeImageMessage.d.ts.map +1 -0
  53. package/dist/components/message/item/MergeImageMessage.js +30 -0
  54. package/dist/components/message/item/MessageBubble.d.ts +13 -0
  55. package/dist/components/message/item/MessageBubble.d.ts.map +1 -0
  56. package/dist/components/message/item/MessageBubble.js +23 -0
  57. package/dist/components/message/item/RevokeMessage.js +1 -1
  58. package/dist/components/message/item/TextMessage.d.ts.map +1 -1
  59. package/dist/components/message/item/TextMessage.js +20 -9
  60. package/dist/components/message/item/UrlTextMessage.d.ts.map +1 -1
  61. package/dist/components/message/item/UrlTextMessage.js +19 -17
  62. package/dist/components/message/item/VideoMessage.d.ts.map +1 -1
  63. package/dist/components/message/item/VideoMessage.js +10 -12
  64. package/dist/components/message/item/imagePreviewToolbar.d.ts +5 -0
  65. package/dist/components/message/item/imagePreviewToolbar.d.ts.map +1 -0
  66. package/dist/components/message/item/imagePreviewToolbar.js +14 -0
  67. package/dist/components/message/item/index.d.ts +2 -1
  68. package/dist/components/message/item/index.d.ts.map +1 -1
  69. package/dist/components/message/item/index.js +40 -44
  70. package/dist/components/message/item/mediaSize.d.ts +16 -0
  71. package/dist/components/message/item/mediaSize.d.ts.map +1 -0
  72. package/dist/components/message/item/mediaSize.js +20 -0
  73. package/dist/components/message/item/textStyle.d.ts +2 -0
  74. package/dist/components/message/item/textStyle.d.ts.map +1 -0
  75. package/dist/components/message/item/textStyle.js +1 -0
  76. package/dist/components/thread/ManualAssignPopover.js +1 -1
  77. package/dist/hooks/message/useSendMessage.d.ts +3 -10
  78. package/dist/hooks/message/useSendMessage.d.ts.map +1 -1
  79. package/dist/hooks/message/useSendMessage.js +27 -44
  80. package/dist/styles/global.css +1 -1
  81. package/dist/tsconfig.tsbuildinfo +1 -1
  82. package/dist/utils/bizConversation.d.ts +1 -1
  83. package/dist/utils/bizConversation.js +2 -2
  84. package/dist/utils/bizMessage.d.ts +1 -14
  85. package/dist/utils/bizMessage.d.ts.map +1 -1
  86. package/dist/utils/bizMessage.js +0 -26
  87. package/dist/utils/common.d.ts +2 -1
  88. package/dist/utils/common.d.ts.map +1 -1
  89. package/dist/utils/common.js +9 -3
  90. package/dist/utils/fileValidation.d.ts +1 -0
  91. package/dist/utils/fileValidation.d.ts.map +1 -1
  92. package/dist/utils/fileValidation.js +10 -17
  93. package/dist/utils/link.d.ts +13 -0
  94. package/dist/utils/link.d.ts.map +1 -0
  95. package/dist/utils/link.js +77 -0
  96. package/dist/utils/openLink.d.ts +3 -0
  97. package/dist/utils/openLink.d.ts.map +1 -0
  98. package/dist/utils/openLink.js +19 -0
  99. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"TextMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/TextMessage.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAe,MAAM,yBAAyB,CAAC;AAKnE,UAAU,oBAAoB;IAC5B,OAAO,EAAE,WAAW,CAAC;CACtB;AACD,QAAA,MAAM,eAAe,GAAI,OAAO,oBAAoB,mDAoCnD,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"TextMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/TextMessage.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAe,MAAM,yBAAyB,CAAC;AAQnE,UAAU,oBAAoB;IAC5B,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,QAAA,MAAM,eAAe,GAAI,OAAO,oBAAoB,mDAiDnD,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -1,10 +1,14 @@
1
1
  "use client";
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
+ import clsx from "clsx";
3
4
  import { MessageType } from "@openim/wasm-client-sdk";
4
5
  import useAuthStore from "../../../store/auth";
5
- import { sanitizeHtml } from "../../../utils/common";
6
+ import { htmlHasFormatting, sanitizeHtml, stripHtml } from "../../../utils/common";
7
+ import { extractLinkUrls } from "../../../utils/link";
8
+ import LinkText from "./LinkText";
9
+ import { MESSAGE_TEXT_CLASS } from "./textStyle";
6
10
  const TextMessageItem = (props) => {
7
- var _a, _b, _c;
11
+ var _a, _b, _c, _d;
8
12
  const { message } = props;
9
13
  const isCrm = useAuthStore((state) => state.isCrm);
10
14
  let extendMessageInfo = null;
@@ -18,13 +22,20 @@ const TextMessageItem = (props) => {
18
22
  if ((message === null || message === void 0 ? void 0 : message.contentType) === MessageType.CustomMessage && !isCrm) {
19
23
  return null;
20
24
  }
21
- if (Object.keys(extendMessageInfo).length > 0 &&
22
- (extendMessageInfo === null || extendMessageInfo === void 0 ? void 0 : extendMessageInfo.messageInfo)) {
23
- const htmlContent = ((_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) || "";
24
- // 🔒 Sanitize HTML to prevent XSS attacks
25
- const sanitizedContent = sanitizeHtml(htmlContent);
26
- return (_jsx("div", { className: "!text-sm sm:text-base break-normal whitespace-pre-line flex-1", style: { overflowWrap: "anywhere" }, dangerouslySetInnerHTML: { __html: sanitizedContent } }));
25
+ 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) || "";
26
+ if (richHtmlContent && htmlHasFormatting(richHtmlContent)) {
27
+ const sanitizedContent = sanitizeHtml(richHtmlContent);
28
+ return (_jsx("div", { className: clsx("break-normal whitespace-pre-line flex-1", MESSAGE_TEXT_CLASS), style: { overflowWrap: "anywhere" }, dangerouslySetInnerHTML: { __html: sanitizedContent } }));
27
29
  }
28
- return (_jsx("span", { className: "!text-sm sm:text-base whitespace-pre-wrap", children: ((_c = message === null || message === void 0 ? void 0 : message.textElem) === null || _c === void 0 ? void 0 : _c.content) || "" }));
30
+ const text = ((_c = message === null || message === void 0 ? void 0 : message.textElem) === null || _c === void 0 ? void 0 : _c.content) ||
31
+ ((_d = message === null || message === void 0 ? void 0 : message.quoteElem) === null || _d === void 0 ? void 0 : _d.text) ||
32
+ stripHtml(richHtmlContent) ||
33
+ "";
34
+ if (!text)
35
+ return null;
36
+ if (extractLinkUrls(text).length > 0) {
37
+ return _jsx(LinkText, { text: text });
38
+ }
39
+ return (_jsx("p", { className: clsx("whitespace-pre-wrap break-words", MESSAGE_TEXT_CLASS), children: text }));
29
40
  };
30
41
  export default TextMessageItem;
@@ -1 +1 @@
1
- {"version":3,"file":"UrlTextMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/UrlTextMessage.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAUtD,UAAU,uBAAuB;IAC/B,OAAO,EAAE,WAAW,CAAC;CACtB;AACD,QAAA,MAAM,kBAAkB,GAAI,OAAO,uBAAuB,4CAwEzD,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"UrlTextMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/UrlTextMessage.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAatD,UAAU,uBAAuB;IAC/B,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,QAAA,MAAM,kBAAkB,GAAI,OAAO,uBAAuB,4CA6DzD,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -1,18 +1,14 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { getHostFromUrl, wrapLinksInHtml, sanitizeHtml, } from "../../../utils/common";
4
- import { useFetchExternalLink } from "../../../hooks/common/useFetchExternalLink";
5
- import { Image } from "antd";
3
+ import { wrapLinksInHtml, sanitizeHtml, htmlHasFormatting, stripHtml, } from "../../../utils/common";
4
+ import clsx from "clsx";
5
+ import LinkText from "./LinkText";
6
+ import LinkCard from "./LinkCard";
7
+ import { MESSAGE_TEXT_CLASS } from "./textStyle";
6
8
  const UrlTextMessageItem = (props) => {
7
- var _a, _b, _c, _d, _e, _f, _g, _h;
9
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
8
10
  const { message } = props;
9
- const { data: externalLinkData } = useFetchExternalLink(((_b = (_a = message === null || message === void 0 ? void 0 : message.urlTextElem) === null || _a === void 0 ? void 0 : _a.urls) === null || _b === void 0 ? void 0 : _b[0]) || "");
10
11
  let extendMessageInfo = null;
11
- const onPressExternalLink = (url) => {
12
- if (!url)
13
- return;
14
- window.open(url, "_blank", "noopener,noreferrer");
15
- };
16
12
  try {
17
13
  extendMessageInfo = JSON.parse((message === null || message === void 0 ? void 0 : message.ex) || "{}");
18
14
  }
@@ -20,13 +16,19 @@ const UrlTextMessageItem = (props) => {
20
16
  extendMessageInfo = {};
21
17
  console.error("Failed to parse extendMessageInfo", error);
22
18
  }
23
- if (Object.keys(extendMessageInfo).length > 0 &&
24
- (extendMessageInfo === null || extendMessageInfo === void 0 ? void 0 : extendMessageInfo.messageInfo)) {
25
- const htmlContent = ((_d = (_c = extendMessageInfo === null || extendMessageInfo === void 0 ? void 0 : extendMessageInfo.messageInfo) === null || _c === void 0 ? void 0 : _c.data) === null || _d === void 0 ? void 0 : _d.content) || "";
26
- // 🔒 Sanitize HTML to prevent XSS attacks
27
- const sanitizedContent = sanitizeHtml(wrapLinksInHtml(htmlContent));
28
- return (_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx("div", { className: "!text-sm sm:text-base break-normal whitespace-pre-line flex-1", style: { overflowWrap: "anywhere" }, dangerouslySetInnerHTML: { __html: sanitizedContent } }), !!externalLinkData && (_jsxs("div", { className: "flex items-center rounded-md px-3 py-2 border-l-4 border-l-blue-500 bg-blue-50 gap-2 cursor-pointer overflow-hidden", style: { wordBreak: "break-word", overflowWrap: "anywhere" }, onClick: () => onPressExternalLink((externalLinkData === null || externalLinkData === void 0 ? void 0 : externalLinkData.url) || ""), children: [_jsxs("div", { className: "flex flex-1 flex-col gap-1", children: [(externalLinkData === null || externalLinkData === void 0 ? void 0 : externalLinkData.title) && (_jsx("span", { className: "!text-sm font-semibold truncate break-normal", children: externalLinkData === null || externalLinkData === void 0 ? void 0 : externalLinkData.title })), (externalLinkData === null || externalLinkData === void 0 ? void 0 : externalLinkData.description) && (_jsx("span", { className: "!text-sm text-gray-500 line-clamp-2", children: externalLinkData === null || externalLinkData === void 0 ? void 0 : externalLinkData.description })), (externalLinkData === null || externalLinkData === void 0 ? void 0 : externalLinkData.url) && (_jsx("span", { className: "!text-sm font-medium text-blue-500", children: getHostFromUrl(externalLinkData === null || externalLinkData === void 0 ? void 0 : externalLinkData.url) }))] }), ((_e = externalLinkData === null || externalLinkData === void 0 ? void 0 : externalLinkData.logo) === null || _e === void 0 ? void 0 : _e.url) && (_jsx(Image, { src: (_f = externalLinkData === null || externalLinkData === void 0 ? void 0 : externalLinkData.logo) === null || _f === void 0 ? void 0 : _f.url, width: 48, height: 48 }))] }))] }));
19
+ 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) || "";
20
+ if (richHtmlContent && htmlHasFormatting(richHtmlContent)) {
21
+ const sanitizedContent = sanitizeHtml(wrapLinksInHtml(richHtmlContent));
22
+ return (_jsx("div", { className: clsx("break-normal whitespace-pre-line flex-1", MESSAGE_TEXT_CLASS), style: { overflowWrap: "anywhere" }, dangerouslySetInnerHTML: { __html: sanitizedContent } }));
29
23
  }
30
- return (_jsx("span", { className: "!text-sm sm:text-base break-normal whitespace-pre-line flex-1", style: { overflowWrap: "anywhere" }, children: ((_h = (_g = message === null || message === void 0 ? void 0 : message.urlTextElem) === null || _g === void 0 ? void 0 : _g.urls) === null || _h === void 0 ? void 0 : _h[0]) || "" }));
24
+ const text = (_h = (_g = (_f = (_d = (_c = message === null || message === void 0 ? void 0 : message.textElem) === null || _c === void 0 ? void 0 : _c.content) !== null && _d !== void 0 ? _d : (_e = message === null || message === void 0 ? void 0 : message.urlTextElem) === null || _e === void 0 ? void 0 : _e.content) !== null && _f !== void 0 ? _f : message === null || message === void 0 ? void 0 : message.content) !== null && _g !== void 0 ? _g : stripHtml(richHtmlContent)) !== null && _h !== void 0 ? _h : "";
25
+ const urlMetadata = extendMessageInfo === null || extendMessageInfo === void 0 ? void 0 : extendMessageInfo.urlMetadata;
26
+ if (urlMetadata === null || urlMetadata === void 0 ? void 0 : urlMetadata.url) {
27
+ return (_jsxs("div", { className: "flex max-w-[292px] flex-col gap-2", children: [text && _jsx(LinkText, { text: text }), _jsx(LinkCard, { metadata: urlMetadata })] }));
28
+ }
29
+ if (text) {
30
+ return _jsx(LinkText, { text: text });
31
+ }
32
+ return (_jsx("span", { className: clsx("break-normal whitespace-pre-line flex-1", MESSAGE_TEXT_CLASS), style: { overflowWrap: "anywhere" }, children: ((_k = (_j = message === null || message === void 0 ? void 0 : message.urlTextElem) === null || _j === void 0 ? void 0 : _j.urls) === null || _k === void 0 ? void 0 : _k[0]) || "" }));
31
33
  };
32
34
  export default UrlTextMessageItem;
@@ -1 +1 @@
1
- {"version":3,"file":"VideoMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/VideoMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiB,MAAM,yBAAyB,CAAC;AAGrE,UAAU,qBAAqB;IAC7B,OAAO,EAAE,WAAW,CAAC;CACtB;AAID,QAAA,MAAM,gBAAgB,GAAI,OAAO,qBAAqB,4CAsBrD,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"VideoMessage.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/VideoMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAiB,MAAM,yBAAyB,CAAC;AAIrE,UAAU,qBAAqB;IAC7B,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,QAAA,MAAM,gBAAgB,GAAI,OAAO,qBAAqB,4CAyBrD,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -1,20 +1,18 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { MessageStatus } from "@openim/wasm-client-sdk";
3
3
  import { Spin } from "antd";
4
- const min = (a, b) => (a > b ? b : a);
4
+ import { getVideoMessageMinStyle } from "./mediaSize";
5
5
  const VideoMessageItem = (props) => {
6
6
  const { message } = props;
7
- const imageHeight = message.videoElem.snapshotHeight;
8
- const imageWidth = message.videoElem.snapshotWidth;
9
- const minHeight = min(200, imageWidth) * (imageHeight / imageWidth) + 2;
10
- const adaptedHight = min(minHeight, imageHeight) + 10;
11
- const adaptedWidth = min(imageWidth, 200) + 10;
12
- const sourceUrl = message.videoElem.videoUrl;
7
+ const videoElem = message.videoElem;
8
+ const videoUrl = (videoElem === null || videoElem === void 0 ? void 0 : videoElem.videoUrl) || "";
9
+ const posterUrl = (videoElem === null || videoElem === void 0 ? void 0 : videoElem.snapshotUrl) || "";
10
+ const minStyle = getVideoMessageMinStyle({
11
+ imageWidth: videoElem === null || videoElem === void 0 ? void 0 : videoElem.snapshotWidth,
12
+ imageHeight: videoElem === null || videoElem === void 0 ? void 0 : videoElem.snapshotHeight,
13
+ snapshotHeight: videoElem === null || videoElem === void 0 ? void 0 : videoElem.snapshotHeight,
14
+ });
13
15
  const isSending = message.status === MessageStatus.Sending;
14
- const minStyle = {
15
- minHeight: `${adaptedHight}px`,
16
- minWidth: `${adaptedWidth}px`,
17
- };
18
- return (_jsx(Spin, { spinning: isSending, children: _jsx("div", { className: "relative max-w-[200px]", style: minStyle, children: _jsx("video", { className: "rounded-md", src: sourceUrl, controls: true }) }) }));
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 } }) }) }));
19
17
  };
20
18
  export default VideoMessageItem;
@@ -0,0 +1,5 @@
1
+ import type { ReactNode } from "react";
2
+ import type { TFunction } from "i18next";
3
+ export declare const downloadImage: (imageUrl?: string) => void;
4
+ export declare const renderImagePreviewToolbar: (originalNode: ReactNode, imageUrl: string | undefined, t: TFunction) => ReactNode;
5
+ //# sourceMappingURL=imagePreviewToolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imagePreviewToolbar.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/imagePreviewToolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAIzC,eAAO,MAAM,aAAa,GAAI,WAAW,MAAM,SAQ9C,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,cAAc,SAAS,EACvB,UAAU,MAAM,GAAG,SAAS,EAC5B,GAAG,SAAS,KACX,SAcF,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button } from "antd";
3
+ import { Icon } from "../../../components/icon";
4
+ export const downloadImage = (imageUrl) => {
5
+ if (!imageUrl)
6
+ return;
7
+ const link = document.createElement("a");
8
+ link.href = imageUrl;
9
+ link.download = imageUrl.substring(imageUrl.lastIndexOf("/") + 1);
10
+ document.body.appendChild(link);
11
+ link.click();
12
+ document.body.removeChild(link);
13
+ };
14
+ export const renderImagePreviewToolbar = (originalNode, imageUrl, t) => (_jsxs("div", { className: "flex flex-col justify-center gap-2", children: [originalNode, imageUrl && (_jsx(Button, { type: "primary", icon: _jsx(Icon, { icon: "download-o", size: 16, className: "text-white" }), className: "self-center", onClick: () => downloadImage(imageUrl), children: t("download") }))] }));
@@ -2,12 +2,13 @@ import { MessageItem as MessageItemType } from "@openim/wasm-client-sdk";
2
2
  interface MessageItemProps {
3
3
  message: MessageItemType;
4
4
  allMessages: MessageItemType[];
5
+ isGroupChat?: boolean;
5
6
  contextMenuOpen?: boolean;
6
7
  onContextMenuOpenChange?: (open: boolean) => void;
7
8
  onRevokeMessage?: (clientMsgID: string) => void;
8
9
  onQuoteMessage?: (message: MessageItemType) => void;
9
10
  onPressQuoteMessage?: (clientMsgID: string) => void;
10
11
  }
11
- declare const MessageItem: ({ message, allMessages, contextMenuOpen, onContextMenuOpenChange, onRevokeMessage, onQuoteMessage, onPressQuoteMessage, }: MessageItemProps) => import("react/jsx-runtime").JSX.Element | null;
12
+ declare const MessageItem: ({ message, allMessages, isGroupChat, contextMenuOpen, onContextMenuOpenChange, onRevokeMessage, onQuoteMessage, onPressQuoteMessage, }: MessageItemProps) => import("react/jsx-runtime").JSX.Element | null;
12
13
  export default MessageItem;
13
14
  //# 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,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,2HAQlB,gBAAgB,mDA6RlB,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;AA6BjC,UAAU,gBAAgB;IACxB,OAAO,EAAE,eAAe,CAAC;IACzB,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,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,wIASlB,gBAAgB,mDA+QlB,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -1,13 +1,15 @@
1
1
  import { createElement as _createElement } from "react";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
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 { Avatar, Dropdown } from "antd";
5
+ import { Dropdown } from "antd";
6
6
  import { MessageStatus, MessageType, } from "@openim/wasm-client-sdk";
7
7
  import TextMessageItem from "./TextMessage";
8
8
  import ImageMessageItem from "./ImageMessage";
9
9
  import FileMessageItem from "./FileMessage";
10
10
  import VideoMessageItem from "./VideoMessage";
11
+ import MergeImageMessageItem from "./MergeImageMessage";
12
+ import MessageBubble from "./MessageBubble";
11
13
  import { getVisibleNeighbor, visibleTypeMessage, } from "../../../hooks/message/useMessage";
12
14
  import { MSG_ITEM_CONTENT_PREFIX, MSG_ITEM_PREFIX } from "../../../constants";
13
15
  import { formatTimestamp } from "../../../utils/common";
@@ -23,35 +25,37 @@ import RevokeMessageItem from "./RevokeMessage";
23
25
  import QuoteMessageItem from "./QuoteMessage";
24
26
  import SystemLogMessageItem from "./SystemLogMessage";
25
27
  import { isSystemLogMessageType } from "../../../utils/messageLog";
26
- const ICON_COLOR = "#3278f7";
27
- const MessageItem = ({ message, allMessages, contextMenuOpen, onContextMenuOpenChange, onRevokeMessage, onQuoteMessage, onPressQuoteMessage, }) => {
28
- var _a, _b, _c, _d, _e;
28
+ 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, contextMenuOpen, onContextMenuOpenChange, onRevokeMessage, onQuoteMessage, onPressQuoteMessage, }) => {
30
+ var _a;
29
31
  const { t } = useTranslation();
30
32
  const { resendMessage } = useSendMessage();
31
33
  const userID = useAuthStore((state) => state.userID);
32
34
  const isCrm = useAuthStore((state) => state.isCrm);
33
35
  const conversationData = useConversationStore((state) => state.conversationData);
34
- const renderMessageByType = useCallback((message) => {
35
- switch (message === null || message === void 0 ? void 0 : message.contentType) {
36
+ const renderMessageByType = useCallback((item) => {
37
+ switch (item === null || item === void 0 ? void 0 : item.contentType) {
36
38
  case MessageType.TextMessage:
37
39
  case MessageType.QuoteMessage:
38
- return _jsx(TextMessageItem, { message: message });
40
+ return _jsx(TextMessageItem, { message: item });
39
41
  case MessageType.PictureMessage:
40
- return _jsx(ImageMessageItem, { message: message });
42
+ return _jsx(ImageMessageItem, { message: item });
41
43
  case MessageType.FileMessage:
42
- return _jsx(FileMessageItem, { message: message });
44
+ return _jsx(FileMessageItem, { message: item });
43
45
  case MessageType.VideoMessage:
44
- return _jsx(VideoMessageItem, { message: message });
46
+ return _jsx(VideoMessageItem, { message: item });
47
+ case MessageType.MergeMessage:
48
+ return _jsx(MergeImageMessageItem, { message: item });
45
49
  case MessageType.UrlTextMessage:
46
- return _jsx(UrlTextMessageItem, { message: message });
50
+ return _jsx(UrlTextMessageItem, { message: item });
47
51
  case MessageType.LogTextMessage:
48
- return _jsx(SystemLogMessageItem, { message: message });
52
+ return _jsx(SystemLogMessageItem, { message: item });
49
53
  case MessageType.RevokeMessage:
50
54
  return _jsx(RevokeMessageItem, {});
51
55
  default:
52
- return _jsx(TextMessageItem, { message: message });
56
+ return _jsx(TextMessageItem, { message: item });
53
57
  }
54
- }, [message]);
58
+ }, []);
55
59
  const { isReplyable, isRevocable, isMine } = useMemo(() => {
56
60
  const isMyMessage = (message === null || message === void 0 ? void 0 : message.sendID) === userID;
57
61
  const isOlderThanOneDay = dayjs().diff(dayjs(message === null || message === void 0 ? void 0 : message.sendTime), "days", true) >= 1;
@@ -69,22 +73,22 @@ const MessageItem = ({ message, allMessages, contextMenuOpen, onContextMenuOpenC
69
73
  return [];
70
74
  }
71
75
  return [
72
- ...(isReplyable
76
+ ...(isReplyable && onQuoteMessage
73
77
  ? [
74
78
  {
75
79
  key: "TB01",
76
80
  label: t("context_menu_reply"),
77
- icon: (_jsx(Icon, { icon: "arrow-reply-alt-o", size: 18, color: ICON_COLOR })),
81
+ icon: (_jsx(Icon, { icon: "arrow-reply-alt-o", size: 18, className: "text-chat-focus" })),
78
82
  onClick: () => onQuoteMessage === null || onQuoteMessage === void 0 ? void 0 : onQuoteMessage(message),
79
83
  },
80
84
  ]
81
85
  : []),
82
- ...(isRevocable
86
+ ...(isRevocable && onRevokeMessage
83
87
  ? [
84
88
  {
85
89
  key: "TB05",
86
90
  label: t("context_menu_revoke"),
87
- icon: _jsx(Icon, { icon: "arrow-reload-o", size: 18, color: ICON_COLOR }),
91
+ icon: (_jsx(Icon, { icon: "arrow-reload-o", size: 18, className: "text-chat-focus" })),
88
92
  onClick: () => onRevokeMessage === null || onRevokeMessage === void 0 ? void 0 : onRevokeMessage((message === null || message === void 0 ? void 0 : message.clientMsgID) || ""),
89
93
  },
90
94
  ]
@@ -95,20 +99,20 @@ const MessageItem = ({ message, allMessages, contextMenuOpen, onContextMenuOpenC
95
99
  isRevocable,
96
100
  t,
97
101
  onRevokeMessage,
98
- message === null || message === void 0 ? void 0 : message.contentType,
99
- message === null || message === void 0 ? void 0 : message.clientMsgID,
102
+ message,
100
103
  onQuoteMessage,
101
104
  ]);
102
105
  const showSenderInfo = useMemo(() => {
103
106
  var _a, _b, _c;
104
107
  try {
105
108
  const isChatSupport = (_c = (_b = (_a = JSON.parse((conversationData === null || conversationData === void 0 ? void 0 : conversationData.ex) || "{}")) === null || _a === void 0 ? void 0 : _a.sessionInfo) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.botId;
106
- return isChatSupport && isCrm && !isMine;
109
+ return Boolean(isChatSupport && isCrm && (message === null || message === void 0 ? void 0 : message.sendID) !== userID);
107
110
  }
108
111
  catch (_d) {
109
112
  console.log("Failed to parse conversationData.ex");
113
+ return false;
110
114
  }
111
- }, [conversationData === null || conversationData === void 0 ? void 0 : conversationData.ex, isCrm, isMine]);
115
+ }, [conversationData === null || conversationData === void 0 ? void 0 : conversationData.ex, isCrm, message === null || message === void 0 ? void 0 : message.sendID, userID]);
112
116
  const isInternalMessage = Boolean(message === null || message === void 0 ? void 0 : message.isInternal);
113
117
  const isSystemLogMessage = isSystemLogMessageType(message === null || message === void 0 ? void 0 : message.contentType);
114
118
  const hasContextMenu = contextMenuItems.length > 0;
@@ -118,11 +122,12 @@ const MessageItem = ({ message, allMessages, contextMenuOpen, onContextMenuOpenC
118
122
  const nextMessage = getVisibleNeighbor(allMessages, message, "next");
119
123
  const prevSameUser = (previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.sendID) === (message === null || message === void 0 ? void 0 : message.sendID);
120
124
  const nextSameUser = (nextMessage === null || nextMessage === void 0 ? void 0 : nextMessage.sendID) === (message === null || message === void 0 ? void 0 : message.sendID);
121
- const prevTimeBreak = !previousMessage ||
125
+ const showTimeBreak = !previousMessage ||
122
126
  !dayjs(message.sendTime).isSame(previousMessage.sendTime, "days");
123
- const showTimeBreak = prevTimeBreak;
124
- const showSenderAvatar = !nextSameUser;
125
- const showSenderName = !prevSameUser && !isMine;
127
+ const showPeerInfo = isGroupChat || showSenderInfo;
128
+ const showAvatar = showPeerInfo && !isMine && !nextSameUser;
129
+ const showSenderName = showPeerInfo && !isMine && !prevSameUser;
130
+ const showTip = !nextSameUser;
126
131
  if (!isCrm && isInternalMessage) {
127
132
  return null;
128
133
  }
@@ -136,29 +141,20 @@ const MessageItem = ({ message, allMessages, contextMenuOpen, onContextMenuOpenC
136
141
  className: "flex flex-col gap-2 py-1 px-3 sm:px-4 min-w-0",
137
142
  id: `${MSG_ITEM_PREFIX}${message === null || message === void 0 ? void 0 : message.clientMsgID}`,
138
143
  };
139
- const timeBreakNode = showTimeBreak ? (_jsx("div", { className: "flex justify-center", children: _jsx("span", { className: "text-xs text-gray-600 text-center bg-neutral-100 px-2 py-1 rounded-full", children: formatTimestamp(message.sendTime, {
140
- dateMonthFormat: "DD MMMM",
141
- }) }) })) : null;
144
+ const timeBreakNode = showTimeBreak ? (_jsx("div", { className: "flex justify-center", children: _jsx("span", { className: "rounded-full bg-neutral-100 px-2 py-1 text-center text-xs text-gray-600", children: formatTimestamp(message.sendTime, { hasTime: true }) }) })) : null;
142
145
  if (isSystemLogMessage) {
143
146
  return (_createElement("div", Object.assign({}, messageContainerProps, { key: message === null || message === void 0 ? void 0 : message.clientMsgID }),
144
147
  timeBreakNode,
145
148
  _jsx(SystemLogMessageItem, { message: message })));
146
149
  }
150
+ 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);
147
152
  return (_createElement("div", Object.assign({}, messageContainerProps, { key: message === null || message === void 0 ? void 0 : message.clientMsgID }),
148
153
  timeBreakNode,
149
- _jsx("div", { className: clsx("flex min-w-0", isMine ? "justify-end" : "justify-start"), children: _jsxs("div", { className: clsx("flex flex-1 items-end gap-2 min-w-0", isMine ? "justify-end" : "justify-start"), children: [showSenderInfo && (_jsx("div", { className: "flex items-center justify-center w-[32px] h-[32px]", children: showSenderAvatar && (_jsx(Avatar, { src: message === null || message === void 0 ? void 0 : message.senderFaceUrl, children: ((_c = (_b = message === null || message === void 0 ? void 0 : message.senderNickname) === null || _b === void 0 ? void 0 : _b.charAt) === null || _c === void 0 ? void 0 : _c.call(_b, 0)) || "A" })) })), _jsxs("div", { className: clsx("flex flex-col max-w-[75%] min-w-0", isMine ? "items-end" : "items-start"), children: [showSenderName && showSenderInfo && (_jsx("span", { className: "text-xs font-bold mb-1 px-3 mt-2", children: message === null || message === void 0 ? void 0 : message.senderNickname })), _jsxs("div", { className: clsx("flex flex-col flex-1 w-full", isMine ? "items-end" : "items-start"), children: [(message === null || message === void 0 ? void 0 : message.quoteElem) && (_jsx(QuoteMessageItem, { message: message, isMine: isMine, onPressQuoteMessage: onPressQuoteMessage })), _jsxs("div", { className: "flex items-end gap-1.5", children: [isMine && (_jsx(MessageStatusIndicator, { message: message, isLatest: isLatestMine })), _jsx(Dropdown, { menu: { items: contextMenuItems }, trigger: hasContextMenu ? ["contextMenu"] : [], open: contextMenuOpen, onOpenChange: onContextMenuOpenChange, children: _jsxs("div", { className: clsx("px-3 py-2 rounded-2xl max-w-full min-w-0 break-normal flex flex-col flex-1 text-gray-900 gap-1 w-fit", isMine
150
- ? isInternalMessage
151
- ? "bg-orange-100"
152
- : "bg-blue-100"
153
- : isInternalMessage
154
- ? "bg-orange-100"
155
- : "bg-white"), style: {
156
- wordBreak: "break-word",
157
- overflowWrap: "anywhere",
158
- }, id: `${MSG_ITEM_CONTENT_PREFIX}${message === null || message === void 0 ? void 0 : message.clientMsgID}`, children: [(message === null || message === void 0 ? void 0 : message.contentType) === MessageType.MergeMessage ? (_jsxs("div", { children: [(_e = (_d = message === null || message === void 0 ? void 0 : message.mergeElem) === null || _d === void 0 ? void 0 : _d.multiMessage) === null || _e === void 0 ? void 0 : _e.map((item) => {
159
- return renderMessageByType(item);
160
- }), (message === null || message === void 0 ? void 0 : message.textElem) && (_jsx(TextMessageItem, { message: message }))] })) : (renderMessageByType(message)), _jsx("span", { className: clsx("text-xs text-gray-500 text-right"), children: dayjs(message === null || message === void 0 ? void 0 : message.sendTime).format("HH:mm") })] }) })] })] }), isMine && message.status === MessageStatus.Failed && (_jsx("span", { className: "text-red-500 text-xs mt-1", children: isMediaResendable(message) ? (_jsx(Trans, { i18nKey: "message_send_failed", components: {
161
- bold: (_jsx("strong", { className: "cursor-pointer", onClick: () => resendMessage(message) })),
162
- } })) : (t("message_send_failed_no_retry")) }))] })] }) })));
154
+ _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 &&
155
+ showPeerInfo &&
156
+ (showAvatar ? (_jsx(MessageAvatar, { avatarUrl: message === null || message === void 0 ? void 0 : message.senderFaceUrl })) : (_jsx("div", { className: "h-6 w-6 shrink-0 self-end" }))), _jsxs("div", { className: clsx("flex min-w-0 max-w-[75%] flex-col gap-1", isMine ? "items-end" : "items-start"), children: [(message === null || message === void 0 ? void 0 : message.quoteElem) && (_jsx(QuoteMessageItem, { message: message, isMine: isMine, onPressQuoteMessage: onPressQuoteMessage })), _jsxs("div", { className: "flex items-end gap-1.5", children: [isMine && (_jsx(MessageStatusIndicator, { message: message, isLatest: isLatestMine })), wrappedBubble] }), isMine && message.status === MessageStatus.Failed && (_jsx("span", { className: "mt-1 text-xs text-red-500", children: isMediaResendable(message) ? (_jsx(Trans, { i18nKey: "message_send_failed", components: {
157
+ bold: (_jsx("strong", { className: "cursor-pointer", onClick: () => resendMessage(message) })),
158
+ } })) : (t("message_send_failed_no_retry")) }))] })] })));
163
159
  };
164
160
  export default MessageItem;
@@ -0,0 +1,16 @@
1
+ export interface ImageMessageMinStyleOptions {
2
+ imageWidth?: number;
3
+ imageHeight?: number;
4
+ snapshotHeight?: number;
5
+ }
6
+ export declare const getImageMessageMinStyle: ({ imageWidth, imageHeight, snapshotHeight, }: ImageMessageMinStyleOptions) => {
7
+ minHeight: string;
8
+ minWidth: string;
9
+ width: number;
10
+ };
11
+ export declare const getVideoMessageMinStyle: ({ imageWidth, imageHeight, snapshotHeight, }: ImageMessageMinStyleOptions) => {
12
+ minHeight: string;
13
+ minWidth: string;
14
+ width: number;
15
+ };
16
+ //# sourceMappingURL=mediaSize.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,20 @@
1
+ const IMAGE_MAX_WIDTH = 200;
2
+ export const getImageMessageMinStyle = ({ imageWidth, imageHeight, snapshotHeight, }) => {
3
+ if (!imageWidth || !imageHeight || imageWidth <= 0 || imageHeight <= 0) {
4
+ return {
5
+ minHeight: "210px",
6
+ minWidth: "210px",
7
+ width: IMAGE_MAX_WIDTH,
8
+ };
9
+ }
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;
14
+ return {
15
+ minHeight: `${adaptedHeight}px`,
16
+ minWidth: `${adaptedWidth}px`,
17
+ width: Math.min(imageWidth, IMAGE_MAX_WIDTH),
18
+ };
19
+ };
20
+ export const getVideoMessageMinStyle = getImageMessageMinStyle;
@@ -0,0 +1,2 @@
1
+ export declare const MESSAGE_TEXT_CLASS = "text-[16px] leading-[160%] tracking-[0.16px] text-gray-900";
2
+ //# sourceMappingURL=textStyle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textStyle.d.ts","sourceRoot":"","sources":["../../../../src/components/message/item/textStyle.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,+DAC+B,CAAC"}
@@ -0,0 +1 @@
1
+ export const MESSAGE_TEXT_CLASS = "text-[16px] leading-[160%] tracking-[0.16px] text-gray-900";
@@ -94,7 +94,7 @@ const ManualAssignPopover = ({ sessionId, supporter, teamId: propTeamId, childre
94
94
  };
95
95
  const popoverContent = (_jsxs("div", { className: "w-64", children: [_jsxs("button", { type: "button", className: clsx("flex w-full items-center gap-3 rounded-md px-3 py-2 text-left text-sm transition-colors", isAutoAssignDisabled
96
96
  ? "cursor-not-allowed text-gray-400"
97
- : "text-gray-700 hover:bg-gray-50"), onClick: handleAutoAssign, disabled: isAutoAssignDisabled, children: [isAutoAssigning ? (_jsx(Spin, { size: "small" })) : (_jsx("span", { className: "text-blue-500", children: _jsx(Icon, { icon: "refresh-b", size: 20 }) })), _jsx("span", { children: t("manual_assign_button_auto_reassign") })] }), _jsx(Divider, { className: "my-2" }), _jsx("div", { className: "mb-2", children: _jsx(Input, { autoFocus: true, placeholder: t("manual_assign_search_placeholder"), value: searchText, onChange: (e) => setSearchText(e.target.value), prefix: _jsx(Icon, { icon: "search-o", size: 16, className: "text-gray-400" }), className: "rounded-lg border-gray-300 focus-within:border-[#3278f7] focus-within:shadow-[0_0_0_2px_rgba(50,120,247,0.12)]", allowClear: true }) }), _jsx("div", { className: "max-h-72 overflow-y-auto", role: "listbox", children: isLoading ? (_jsx("div", { className: "flex items-center justify-center py-8", children: _jsx(Spin, {}) })) : supporters && supporters.length > 0 ? (_jsx("div", { className: clsx("flex flex-col transition-opacity duration-200", isFetching && "opacity-50 pointer-events-none"), children: [...supporters]
97
+ : "text-gray-700 hover:bg-gray-50"), onClick: handleAutoAssign, disabled: isAutoAssignDisabled, children: [isAutoAssigning ? (_jsx(Spin, { size: "small" })) : (_jsx("span", { className: "text-blue-500", children: _jsx(Icon, { icon: "refresh-b", size: 20 }) })), _jsx("span", { children: t("manual_assign_button_auto_reassign") })] }), _jsx(Divider, { className: "my-2" }), _jsx("div", { className: "mb-2", children: _jsx(Input, { autoFocus: true, placeholder: t("manual_assign_search_placeholder"), value: searchText, onChange: (e) => setSearchText(e.target.value), prefix: _jsx(Icon, { icon: "search-o", size: 16, className: "text-gray-400" }), className: "rounded-lg border-gray-300 focus-within:border-chat-focus focus-within:shadow-chat-focus-ring", allowClear: true }) }), _jsx("div", { className: "max-h-72 overflow-y-auto", role: "listbox", children: isLoading ? (_jsx("div", { className: "flex items-center justify-center py-8", children: _jsx(Spin, {}) })) : supporters && supporters.length > 0 ? (_jsx("div", { className: clsx("flex flex-col transition-opacity duration-200", isFetching && "opacity-50 pointer-events-none"), children: [...supporters]
98
98
  .filter((item) => item.memberId !== (supporter === null || supporter === void 0 ? void 0 : supporter.id))
99
99
  .filter((item) => !excludeCurrentUser || item.memberId !== authUserID)
100
100
  .sort((supporterA, supporterB) => {
@@ -20,27 +20,20 @@ export interface OfflinePushMeta {
20
20
  conversationId: string;
21
21
  }
22
22
  export interface UseSendMessageOptions {
23
- extractUrls?: (text: string) => string[];
24
23
  scrollEvent?: SendMessageScrollEvent;
25
24
  resolveOfflinePushMeta?: (params: {
26
25
  desc: string;
27
26
  }) => OfflinePushMeta;
28
27
  }
29
28
  export declare const useSendMessage: (options?: UseSendMessageOptions) => {
30
- sendTextMessage: ({ plainText, richText, currentSession, isInternal, urlMetadata, }: {
31
- plainText: string;
29
+ sendMergeMessage: ({ richText, plainText, files, currentSession, isInternal, urlMetadata, }: {
32
30
  richText: string;
31
+ plainText: string;
32
+ files?: UploadFile[];
33
33
  currentSession?: ISessionResponse;
34
34
  isInternal: boolean;
35
35
  urlMetadata?: UrlMetadataInfo;
36
36
  }) => Promise<boolean>;
37
- sendMergeMessage: ({ richText, plainText, files, currentSession, isInternal, }: {
38
- richText: string;
39
- plainText: string;
40
- files: UploadFile[];
41
- currentSession?: ISessionResponse;
42
- isInternal: boolean;
43
- }) => Promise<void>;
44
37
  resendMessage: (failedMessage: MessageItem) => Promise<void>;
45
38
  };
46
39
  export declare const generateExtendMessageInfo: ({ richText, urlMetadata, currentSession, }: {
@@ -1 +1 @@
1
- {"version":3,"file":"useSendMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useSendMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,WAAW,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACrB,MAAM,cAAc,CAAC;AAWtB,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAUlC,OAAO,EAAgB,gBAAgB,EAAyB,MAAM,aAAa,CAAC;AAkBpF,eAAO,MAAM,iBAAiB,GAAI,SAAS;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,YAE0C,CAAC;AAE5C,eAAO,MAAM,iBAAiB,GAAU,MAAM,MAAM,gCAanD,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,MAAM,oBAAoB,gCAaxE,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,iBAAiB,eAAe,gCAazE,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,MAAM,oBAAoB,gCAaxE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,MAAM,mBAAmB,gCAatE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAU,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,gCActE,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,MAAM,MAAM,EACZ,eAAe,WAAW,gCAc3B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAC9B,4BAA4B,GAC5B,wCAAwC,CAAC;AAE7C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACzC,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,eAAe,CAAC;CACxE;AAED,eAAO,MAAM,cAAc,GAAI,UAAU,qBAAqB;yFAgPvD;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,CAAC,EAAE,gBAAgB,CAAC;QAClC,UAAU,EAAE,OAAO,CAAC;QACpB,WAAW,CAAC,EAAE,eAAe,CAAC;KAC/B,KAAG,OAAO,CAAC,OAAO,CAAC;oFA6CjB;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,UAAU,EAAE,CAAC;QACpB,cAAc,CAAC,EAAE,gBAAgB,CAAC;QAClC,UAAU,EAAE,OAAO,CAAC;KACrB;mCAvKqB,WAAW;CA0UpC,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,4CAIvC;IACD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,cAAc,CAAC,EAAE,gBAAgB,CAAC;CACnC,sBAuBA,CAAC"}
1
+ {"version":3,"file":"useSendMessage.d.ts","sourceRoot":"","sources":["../../../src/hooks/message/useSendMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,WAAW,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,oBAAoB,EACrB,MAAM,cAAc,CAAC;AAWtB,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAQlC,OAAO,EAAgB,gBAAgB,EAAyB,MAAM,aAAa,CAAC;AAkBpF,eAAO,MAAM,iBAAiB,GAAI,SAAS;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB,YAE0C,CAAC;AAE5C,eAAO,MAAM,iBAAiB,GAAU,MAAM,MAAM,gCAanD,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,MAAM,oBAAoB,gCAaxE,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,iBAAiB,eAAe,gCAazE,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,MAAM,oBAAoB,gCAaxE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAU,MAAM,mBAAmB,gCAatE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAU,MAAM,MAAM,EAAE,MAAM,MAAM,EAAE,gCActE,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,MAAM,MAAM,EACZ,eAAe,WAAW,gCAc3B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAC9B,4BAA4B,GAC5B,wCAAwC,CAAC;AAE7C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,eAAe,CAAC;CACxE;AAED,eAAO,MAAM,cAAc,GAAI,UAAU,qBAAqB;iGAgPvD;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;QACrB,cAAc,CAAC,EAAE,gBAAgB,CAAC;QAClC,UAAU,EAAE,OAAO,CAAC;QACpB,WAAW,CAAC,EAAE,eAAe,CAAC;KAC/B,KAAG,OAAO,CAAC,OAAO,CAAC;mCAtHE,WAAW;CA2SpC,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,4CAIvC;IACD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,cAAc,CAAC,EAAE,gBAAgB,CAAC;CACnC,sBAuBA,CAAC"}