@droppii-org/chat-sdk 0.1.29 → 0.1.31

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 (93) hide show
  1. package/dist/assets/svg/index.ts +1 -1
  2. package/dist/components/biz-inbox/BizThreadAvatar.d.ts.map +1 -1
  3. package/dist/components/biz-inbox/BizThreadAvatar.js +6 -1
  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 +20 -8
  7. package/dist/components/biz-inbox/BizThreadList.d.ts +5 -4
  8. package/dist/components/biz-inbox/BizThreadList.d.ts.map +1 -1
  9. package/dist/components/biz-inbox/BizThreadList.js +29 -6
  10. package/dist/components/biz-inbox/BizThreadTitle.d.ts +2 -1
  11. package/dist/components/biz-inbox/BizThreadTitle.d.ts.map +1 -1
  12. package/dist/components/biz-inbox/BizThreadTitle.js +2 -1
  13. package/dist/components/biz-thread-detail/BizLinkInputPreview.d.ts +7 -0
  14. package/dist/components/biz-thread-detail/BizLinkInputPreview.d.ts.map +1 -0
  15. package/dist/components/biz-thread-detail/BizLinkInputPreview.js +16 -0
  16. package/dist/components/biz-thread-detail/BizLinkMessageCard.d.ts +6 -0
  17. package/dist/components/biz-thread-detail/BizLinkMessageCard.d.ts.map +1 -0
  18. package/dist/components/biz-thread-detail/BizLinkMessageCard.js +21 -0
  19. package/dist/components/biz-thread-detail/BizLinkTextContent.d.ts +6 -0
  20. package/dist/components/biz-thread-detail/BizLinkTextContent.d.ts.map +1 -0
  21. package/dist/components/biz-thread-detail/BizLinkTextContent.js +11 -0
  22. package/dist/components/biz-thread-detail/BizMessageBubble.d.ts +2 -1
  23. package/dist/components/biz-thread-detail/BizMessageBubble.d.ts.map +1 -1
  24. package/dist/components/biz-thread-detail/BizMessageBubble.js +1 -1
  25. package/dist/components/biz-thread-detail/BizMessageContent.d.ts +7 -0
  26. package/dist/components/biz-thread-detail/BizMessageContent.d.ts.map +1 -0
  27. package/dist/components/biz-thread-detail/BizMessageContent.js +23 -0
  28. package/dist/components/biz-thread-detail/BizMessageList.d.ts.map +1 -1
  29. package/dist/components/biz-thread-detail/BizMessageList.js +15 -7
  30. package/dist/components/biz-thread-detail/BizThreadDetailHeader.d.ts.map +1 -1
  31. package/dist/components/biz-thread-detail/BizThreadDetailHeader.js +3 -4
  32. package/dist/components/biz-thread-detail/BizThreadDetailInput.d.ts.map +1 -1
  33. package/dist/components/biz-thread-detail/BizThreadDetailInput.js +15 -4
  34. package/dist/components/biz-thread-detail/item/BizMessageItem.d.ts +2 -1
  35. package/dist/components/biz-thread-detail/item/BizMessageItem.d.ts.map +1 -1
  36. package/dist/components/biz-thread-detail/item/BizMessageItem.js +13 -6
  37. package/dist/components/message/MessageInfiniteScroll.d.ts +2 -1
  38. package/dist/components/message/MessageInfiniteScroll.d.ts.map +1 -1
  39. package/dist/components/message/MessageInfiniteScroll.js +2 -15
  40. package/dist/components/message/MessageList.d.ts.map +1 -1
  41. package/dist/components/message/MessageList.js +2 -2
  42. package/dist/hooks/biz/index.d.ts +4 -0
  43. package/dist/hooks/biz/index.d.ts.map +1 -1
  44. package/dist/hooks/biz/index.js +3 -0
  45. package/dist/hooks/biz/useBizActiveConversation.d.ts +3 -0
  46. package/dist/hooks/biz/useBizActiveConversation.d.ts.map +1 -0
  47. package/dist/hooks/biz/useBizActiveConversation.js +59 -0
  48. package/dist/hooks/biz/useBizConversationList.d.ts +3 -2
  49. package/dist/hooks/biz/useBizConversationList.d.ts.map +1 -1
  50. package/dist/hooks/biz/useBizConversationList.js +4 -1
  51. package/dist/hooks/biz/useBizConversationListItems.d.ts +8 -0
  52. package/dist/hooks/biz/useBizConversationListItems.d.ts.map +1 -0
  53. package/dist/hooks/biz/useBizConversationListItems.js +10 -0
  54. package/dist/hooks/biz/useBizGlobalEvent.d.ts +2 -0
  55. package/dist/hooks/biz/useBizGlobalEvent.d.ts.map +1 -0
  56. package/dist/hooks/biz/useBizGlobalEvent.js +44 -0
  57. package/dist/hooks/biz/useBizSendMessage.d.ts.map +1 -1
  58. package/dist/hooks/biz/useBizSendMessage.js +13 -8
  59. package/dist/hooks/common/useFetchUrlMetadata.d.ts +9 -0
  60. package/dist/hooks/common/useFetchUrlMetadata.d.ts.map +1 -0
  61. package/dist/hooks/common/useFetchUrlMetadata.js +21 -0
  62. package/dist/hooks/message/useMessageListScroll.d.ts.map +1 -1
  63. package/dist/hooks/message/useMessageListScroll.js +10 -0
  64. package/dist/locales/vi/biz-inbox.json +7 -1
  65. package/dist/screens/biz-message/index.d.ts.map +1 -1
  66. package/dist/screens/biz-message/index.js +7 -28
  67. package/dist/services/query.d.ts +1 -0
  68. package/dist/services/query.d.ts.map +1 -1
  69. package/dist/services/query.js +1 -0
  70. package/dist/services/routes.d.ts +1 -0
  71. package/dist/services/routes.d.ts.map +1 -1
  72. package/dist/services/routes.js +1 -0
  73. package/dist/store/bizConversation.d.ts +4 -0
  74. package/dist/store/bizConversation.d.ts.map +1 -1
  75. package/dist/store/bizConversation.js +9 -0
  76. package/dist/styles/global.css +1 -1
  77. package/dist/tsconfig.tsbuildinfo +1 -1
  78. package/dist/types/biz.d.ts +5 -2
  79. package/dist/types/biz.d.ts.map +1 -1
  80. package/dist/types/biz.js +2 -0
  81. package/dist/utils/bizConversation.d.ts +3 -5
  82. package/dist/utils/bizConversation.d.ts.map +1 -1
  83. package/dist/utils/bizConversation.js +18 -40
  84. package/dist/utils/bizLink.d.ts +13 -0
  85. package/dist/utils/bizLink.d.ts.map +1 -0
  86. package/dist/utils/bizLink.js +77 -0
  87. package/dist/utils/bizMessage.d.ts +8 -2
  88. package/dist/utils/bizMessage.d.ts.map +1 -1
  89. package/dist/utils/bizMessage.js +64 -4
  90. package/dist/utils/openBizLink.d.ts +3 -0
  91. package/dist/utils/openBizLink.d.ts.map +1 -0
  92. package/dist/utils/openBizLink.js +18 -0
  93. package/package.json +127 -126
@@ -8,17 +8,20 @@ export declare enum BizChatCategory {
8
8
  BIZ_BIZ = "BIZ_BIZ",
9
9
  BIZ_MALL = "BIZ_MALL",
10
10
  GROUP = "GROUP",
11
- BIZ_BOT_PDP = "BIZ_BOT_PDP"
11
+ BIZ_BOT_PDP = "BIZ_BOT_PDP",
12
+ BIZ_BOT_CRM = "BIZ_BOT_CRM"
12
13
  }
13
14
  export declare enum BizPeerType {
14
15
  USER = "USER",
15
- GROUP = "GROUP"
16
+ GROUP = "GROUP",
17
+ BOT = "BOT"
16
18
  }
17
19
  export interface BizConversationPeer {
18
20
  id: string | null;
19
21
  username: string | null;
20
22
  fullName: string | null;
21
23
  avatar: string | null;
24
+ botName?: string | null;
22
25
  type: BizPeerType;
23
26
  }
24
27
  export interface BizConversationItem {
@@ -1 +1 @@
1
- {"version":3,"file":"biz.d.ts","sourceRoot":"","sources":["../../src/types/biz.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAE/C,oBAAY,WAAW;IACrB,MAAM,WAAW;IACjB,KAAK,UAAU;CAChB;AAED,oBAAY,eAAe;IACzB,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,KAAK,UAAU;IACf,WAAW,gBAAgB;CAC5B;AAED,oBAAY,WAAW;IACrB,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,WAAW,CAAC;CACnB;AACD,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,eAAe,CAAC;IAC9B,QAAQ,EAAE,WAAW,CAAC;IACtB,eAAe,EAAE,oBAAoB,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,eAAe,CAAC;IAC9B,QAAQ,EAAE,WAAW,CAAC;IACtB,eAAe,EAAE,oBAAoB,CAAC;IACtC,OAAO,EAAE,qBAAqB,EAAE,CAAC;CAClC"}
1
+ {"version":3,"file":"biz.d.ts","sourceRoot":"","sources":["../../src/types/biz.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAE/C,oBAAY,WAAW;IACrB,MAAM,WAAW;IACjB,KAAK,UAAU;CAChB;AAED,oBAAY,eAAe;IACzB,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,KAAK,UAAU;IACf,WAAW,gBAAgB;IAC3B,WAAW,gBAAgB;CAC5B;AAED,oBAAY,WAAW;IACrB,IAAI,SAAS;IACb,KAAK,UAAU;IACf,GAAG,QAAQ;CACZ;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,WAAW,CAAC;CACnB;AACD,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,eAAe,CAAC;IAC9B,QAAQ,EAAE,WAAW,CAAC;IACtB,eAAe,EAAE,oBAAoB,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,eAAe,CAAC;IAC9B,QAAQ,EAAE,WAAW,CAAC;IACtB,eAAe,EAAE,oBAAoB,CAAC;IACtC,OAAO,EAAE,qBAAqB,EAAE,CAAC;CAClC"}
package/dist/types/biz.js CHANGED
@@ -9,9 +9,11 @@ export var BizChatCategory;
9
9
  BizChatCategory["BIZ_MALL"] = "BIZ_MALL";
10
10
  BizChatCategory["GROUP"] = "GROUP";
11
11
  BizChatCategory["BIZ_BOT_PDP"] = "BIZ_BOT_PDP";
12
+ BizChatCategory["BIZ_BOT_CRM"] = "BIZ_BOT_CRM";
12
13
  })(BizChatCategory || (BizChatCategory = {}));
13
14
  export var BizPeerType;
14
15
  (function (BizPeerType) {
15
16
  BizPeerType["USER"] = "USER";
16
17
  BizPeerType["GROUP"] = "GROUP";
18
+ BizPeerType["BOT"] = "BOT";
17
19
  })(BizPeerType || (BizPeerType = {}));
@@ -1,11 +1,9 @@
1
- import type { TFunction } from "i18next";
2
1
  import { BizChatCategory, type BizConversationItem } from "../types/biz";
3
- import { IPulledRawMessage } from "../types/dto";
4
- export declare const resolveBizDisplayName: (item: BizConversationItem, fallback: string) => string;
2
+ export declare const isBizBotCrmChat: (item: Pick<BizConversationItem, "chatCategory">) => boolean;
3
+ export declare const resolveBizDisplayName: (item: BizConversationItem, t: (key: string) => string) => string;
5
4
  export declare const resolveBizAvatarUrl: (item: BizConversationItem) => string | null;
6
5
  export declare const resolveBizBadgeLabel: (chatCategory: BizChatCategory, t: (key: string) => string) => string;
7
6
  export declare const resolveBizBadgeColor: (chatCategory: BizChatCategory) => "" | "bg-[#F28504]" | "bg-[#59ABFF]";
7
+ export declare const isBizGroupMessageTarget: (item: BizConversationItem) => boolean;
8
8
  export declare const isBizGroupChat: (item: BizConversationItem) => boolean;
9
- export declare const resolveBizLastMessagePreview: (lastMessage: IPulledRawMessage | null, t?: TFunction) => string;
10
- export declare const resolveBizLastMessageTime: (lastMessage: IPulledRawMessage | null) => number | null;
11
9
  //# sourceMappingURL=bizConversation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bizConversation.d.ts","sourceRoot":"","sources":["../../src/utils/bizConversation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,OAAO,EACL,eAAe,EAGf,KAAK,mBAAmB,EACzB,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAkBhD,eAAO,MAAM,qBAAqB,GAChC,MAAM,mBAAmB,EACzB,UAAU,MAAM,KACf,MAMF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,MAAM,mBAAmB,KAAG,MAAM,GAAG,IACvD,CAAC;AAEnB,eAAO,MAAM,oBAAoB,GAC/B,cAAc,eAAe,EAC7B,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,KACzB,MAUF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,cAAc,eAAe,yCAIjE,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,MAAM,mBAAmB,YAGlB,CAAC;AAEvC,eAAO,MAAM,4BAA4B,GACvC,aAAa,iBAAiB,GAAG,IAAI,EACrC,IAAI,SAAS,WAqBd,CAAC;AAEF,eAAO,MAAM,yBAAyB,GACpC,aAAa,iBAAiB,GAAG,IAAI,kBACL,CAAC"}
1
+ {"version":3,"file":"bizConversation.d.ts","sourceRoot":"","sources":["../../src/utils/bizConversation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAGf,KAAK,mBAAmB,EACzB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,eAAe,GAAI,MAAM,IAAI,CAAC,mBAAmB,EAAE,cAAc,CAAC,YAC5B,CAAC;AAEpD,eAAO,MAAM,qBAAqB,GAChC,MAAM,mBAAmB,EACzB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,KACzB,MAYF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,MAAM,mBAAmB,KAAG,MAAM,GAAG,IAGxE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,cAAc,eAAe,EAC7B,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,KACzB,MAUF,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,cAAc,eAAe,yCAIjE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,MAAM,mBAAmB,YAG3B,CAAC;AAEvC,eAAO,MAAM,cAAc,GAAI,MAAM,mBAAmB,YACC,CAAC"}
@@ -1,34 +1,26 @@
1
1
  import { BizChatCategory, BizChatType, BizPeerType, } from "../types/biz";
2
- import { generateContentBasedOnMessageType } from "./common";
3
- import { transformPulledMessage } from "./messageTransform";
4
- const stripHtml = (html) => html
5
- .replace(/<[^>]*>/g, " ")
6
- .replace(/\s+/g, " ")
7
- .trim();
8
- const parseRichTextFromEx = (ex) => {
9
- var _a, _b;
10
- if (!ex)
11
- return "";
12
- try {
13
- const parsed = JSON.parse(ex);
14
- const content = (_b = (_a = parsed === null || parsed === void 0 ? void 0 : parsed.messageInfo) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.content;
15
- return content ? stripHtml(content) : "";
16
- }
17
- catch (_c) {
18
- return "";
2
+ export const isBizBotCrmChat = (item) => item.chatCategory === BizChatCategory.BIZ_BOT_CRM;
3
+ export const resolveBizDisplayName = (item, t) => {
4
+ var _a, _b, _c;
5
+ if (isBizBotCrmChat(item)) {
6
+ const botName = (_a = item.peer.botName) === null || _a === void 0 ? void 0 : _a.trim();
7
+ if (botName)
8
+ return botName;
9
+ return t("thread_card.bot_crm_name");
19
10
  }
20
- };
21
- export const resolveBizDisplayName = (item, fallback) => {
22
- var _a, _b;
23
- const fullName = (_a = item.peer.fullName) === null || _a === void 0 ? void 0 : _a.trim();
11
+ const fullName = (_b = item.peer.fullName) === null || _b === void 0 ? void 0 : _b.trim();
24
12
  if (fullName)
25
13
  return fullName;
26
- const username = (_b = item.peer.username) === null || _b === void 0 ? void 0 : _b.trim();
14
+ const username = (_c = item.peer.username) === null || _c === void 0 ? void 0 : _c.trim();
27
15
  if (username)
28
16
  return username;
29
- return fallback;
17
+ return t("thread_card.fallback_name");
18
+ };
19
+ export const resolveBizAvatarUrl = (item) => {
20
+ if (isBizBotCrmChat(item))
21
+ return null;
22
+ return item.peer.avatar;
30
23
  };
31
- export const resolveBizAvatarUrl = (item) => item.peer.avatar;
32
24
  export const resolveBizBadgeLabel = (chatCategory, t) => {
33
25
  if (chatCategory === BizChatCategory.BIZ_MALL) {
34
26
  return t("thread_card.badge.mall");
@@ -45,21 +37,7 @@ export const resolveBizBadgeColor = (chatCategory) => {
45
37
  return "bg-[#59ABFF]";
46
38
  return "";
47
39
  };
48
- export const isBizGroupChat = (item) => item.chatCategory === BizChatCategory.GROUP ||
40
+ export const isBizGroupMessageTarget = (item) => item.chatCategory === BizChatCategory.GROUP ||
49
41
  item.chatType === BizChatType.GROUP ||
50
42
  item.peer.type === BizPeerType.GROUP;
51
- export const resolveBizLastMessagePreview = (lastMessage, t) => {
52
- var _a, _b, _c;
53
- if (!lastMessage)
54
- return "";
55
- const richText = parseRichTextFromEx(lastMessage.ex);
56
- if (richText)
57
- return richText;
58
- const transformed = transformPulledMessage(lastMessage);
59
- const plainText = ((_a = transformed.textElem) === null || _a === void 0 ? void 0 : _a.content) ||
60
- ((_b = transformed.quoteElem) === null || _b === void 0 ? void 0 : _b.text) ||
61
- ((_c = transformed.logTextElem) === null || _c === void 0 ? void 0 : _c.content) ||
62
- "";
63
- return generateContentBasedOnMessageType(lastMessage.contentType, plainText, t);
64
- };
65
- export const resolveBizLastMessageTime = (lastMessage) => { var _a; return (_a = lastMessage === null || lastMessage === void 0 ? void 0 : lastMessage.sendTime) !== null && _a !== void 0 ? _a : null; };
43
+ export const isBizGroupChat = (item) => isBizGroupMessageTarget(item) && !isBizBotCrmChat(item);
@@ -0,0 +1,13 @@
1
+ export declare const normalizeBizLinkUrl: (link: string) => string;
2
+ export declare const extractBizLinkUrls: (text: string) => string[];
3
+ export type BizTextSegment = {
4
+ type: "text";
5
+ value: string;
6
+ } | {
7
+ type: "link";
8
+ value: string;
9
+ url: string;
10
+ };
11
+ export declare const parseBizTextWithLinks: (text: string) => BizTextSegment[];
12
+ export declare const getHostLabel: (url: string) => string;
13
+ //# sourceMappingURL=bizLink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bizLink.d.ts","sourceRoot":"","sources":["../../src/utils/bizLink.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,KAAG,MAKlD,CAAC;AA+BF,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,KAAG,MAAM,EAYvD,CAAC;AAEF,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD,eAAO,MAAM,qBAAqB,GAAI,MAAM,MAAM,KAAG,cAAc,EAwBlE,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,KAAK,MAAM,KAAG,MAM1C,CAAC"}
@@ -0,0 +1,77 @@
1
+ const PROTOCOL_URL_REGEX = /\bhttps?:\/\/[^\s<>"']*[^\s<>"',.!?()[\]{}]/gi;
2
+ const BARE_DOMAIN_REGEX = /\b(?!(?:https?:\/\/))(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z][a-z0-9-]{0,62}(?:\/[^\s<>"',.!?()[\]{}]*)?\b/gi;
3
+ export const normalizeBizLinkUrl = (link) => {
4
+ const trimmed = link.trim();
5
+ if (!trimmed)
6
+ return trimmed;
7
+ if (/^https?:\/\//i.test(trimmed))
8
+ return trimmed;
9
+ return `https://${trimmed}`;
10
+ };
11
+ const findLinkRanges = (text) => {
12
+ const ranges = [];
13
+ const addMatches = (regex) => {
14
+ const re = new RegExp(regex.source, regex.flags);
15
+ let match;
16
+ while ((match = re.exec(text)) !== null) {
17
+ ranges.push({
18
+ text: match[0],
19
+ start: match.index,
20
+ end: match.index + match[0].length,
21
+ });
22
+ }
23
+ };
24
+ addMatches(PROTOCOL_URL_REGEX);
25
+ addMatches(BARE_DOMAIN_REGEX);
26
+ ranges.sort((a, b) => a.start - b.start);
27
+ const deduped = [];
28
+ for (const range of ranges) {
29
+ if (deduped.some((r) => range.start < r.end && r.start < range.end))
30
+ continue;
31
+ deduped.push(range);
32
+ }
33
+ return deduped;
34
+ };
35
+ export const extractBizLinkUrls = (text) => {
36
+ const seen = new Set();
37
+ const urls = [];
38
+ for (const { text: raw } of findLinkRanges(text)) {
39
+ const url = normalizeBizLinkUrl(raw);
40
+ if (seen.has(url))
41
+ continue;
42
+ seen.add(url);
43
+ urls.push(url);
44
+ }
45
+ return urls;
46
+ };
47
+ export const parseBizTextWithLinks = (text) => {
48
+ const ranges = findLinkRanges(text);
49
+ if (!ranges.length)
50
+ return [{ type: "text", value: text }];
51
+ const segments = [];
52
+ let cursor = 0;
53
+ for (const { text: raw, start, end } of ranges) {
54
+ if (start > cursor) {
55
+ segments.push({ type: "text", value: text.slice(cursor, start) });
56
+ }
57
+ segments.push({
58
+ type: "link",
59
+ value: raw,
60
+ url: normalizeBizLinkUrl(raw),
61
+ });
62
+ cursor = end;
63
+ }
64
+ if (cursor < text.length) {
65
+ segments.push({ type: "text", value: text.slice(cursor) });
66
+ }
67
+ return segments;
68
+ };
69
+ export const getHostLabel = (url) => {
70
+ var _a;
71
+ try {
72
+ return new URL(normalizeBizLinkUrl(url)).host;
73
+ }
74
+ catch (_b) {
75
+ return (_a = url.replace(/^https?:\/\//i, "").split("/")[0]) !== null && _a !== void 0 ? _a : url;
76
+ }
77
+ };
@@ -1,4 +1,10 @@
1
- import { MessageItem } from "@openim/wasm-client-sdk";
1
+ import { MessageItem, MessageType } from "@openim/wasm-client-sdk";
2
+ import type { TFunction } from "i18next";
3
+ export declare const shouldHideBizMessage: (message: {
4
+ contentType?: MessageType;
5
+ isInternal?: boolean;
6
+ }) => boolean;
7
+ export declare const parseBizLatestMessage: (latestMsg: string, currentUserId: string | undefined, t: TFunction, isGroupChat: boolean) => string;
2
8
  export declare const getBizMessageContent: (message: MessageItem) => string;
3
9
  export interface BizMessageDisplay {
4
10
  isMine: boolean;
@@ -11,5 +17,5 @@ export interface BizMessageDisplay {
11
17
  senderFaceUrl: string;
12
18
  sendTime: number;
13
19
  }
14
- export declare const getBizMessageDisplay: (message: MessageItem, allMessages: MessageItem[], userID: string) => BizMessageDisplay;
20
+ export declare const getBizMessageDisplay: (message: MessageItem, allMessages: MessageItem[], userID: string, isGroupChat?: boolean) => BizMessageDisplay;
15
21
  //# sourceMappingURL=bizMessage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bizMessage.d.ts","sourceRoot":"","sources":["../../src/utils/bizMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAItD,eAAO,MAAM,oBAAoB,GAAI,SAAS,WAAW,KAAG,MACR,CAAC;AAErD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,oBAAoB,GAC/B,SAAS,WAAW,EACpB,aAAa,WAAW,EAAE,EAC1B,QAAQ,MAAM,KACb,iBAqBF,CAAC"}
1
+ {"version":3,"file":"bizMessage.d.ts","sourceRoot":"","sources":["../../src/utils/bizMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAazC,eAAO,MAAM,oBAAoB,GAAI,SAAS;IAC5C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,YAKA,CAAC;AAuCF,eAAO,MAAM,qBAAqB,GAChC,WAAW,MAAM,EACjB,eAAe,MAAM,GAAG,SAAS,EACjC,GAAG,SAAS,EACZ,aAAa,OAAO,WAiBrB,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,SAAS,WAAW,KAAG,MAIxD,CAAC;AAEL,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,oBAAoB,GAC/B,SAAS,WAAW,EACpB,aAAa,WAAW,EAAE,EAC1B,QAAQ,MAAM,EACd,qBAAmB,KAClB,iBAqBF,CAAC"}
@@ -1,7 +1,67 @@
1
+ import { MessageType } from "@openim/wasm-client-sdk";
1
2
  import { getVisibleNeighbor } from "../hooks/message/useMessage";
2
3
  import dayjs from "dayjs";
3
- export const getBizMessageContent = (message) => { var _a, _b, _c; return (_c = (_b = (_a = message.textElem) === null || _a === void 0 ? void 0 : _a.content) !== null && _b !== void 0 ? _b : message.content) !== null && _c !== void 0 ? _c : ""; };
4
- export const getBizMessageDisplay = (message, allMessages, userID) => {
4
+ import { generateContentBasedOnMessageType } from "./common";
5
+ import { isSystemLogMessageType } from "./messageLog";
6
+ export const shouldHideBizMessage = (message) => {
7
+ if (message.isInternal)
8
+ return true;
9
+ if (isSystemLogMessageType(message.contentType))
10
+ return true;
11
+ if (message.contentType === MessageType.CustomMessage)
12
+ return true;
13
+ return false;
14
+ };
15
+ const getSenderLabel = (msgData, currentUserId, t) => {
16
+ var _a;
17
+ if (currentUserId && msgData.sendID === currentUserId) {
18
+ return String(t("you"));
19
+ }
20
+ const name = (_a = msgData.senderNickname) === null || _a === void 0 ? void 0 : _a.trim();
21
+ if (name)
22
+ return name;
23
+ return String(t("message_sender_unnamed"));
24
+ };
25
+ const getBizPreviewContent = (msgData, t) => {
26
+ var _a, _b;
27
+ switch (msgData.contentType) {
28
+ case MessageType.TextMessage:
29
+ case MessageType.QuoteMessage:
30
+ return generateContentBasedOnMessageType(msgData.contentType, ((_a = msgData.textElem) === null || _a === void 0 ? void 0 : _a.content) || ((_b = msgData.quoteElem) === null || _b === void 0 ? void 0 : _b.text) || "", t);
31
+ case MessageType.PictureMessage:
32
+ case MessageType.VoiceMessage:
33
+ case MessageType.VideoMessage:
34
+ case MessageType.FileMessage:
35
+ case MessageType.UrlTextMessage:
36
+ case MessageType.RevokeMessage:
37
+ return generateContentBasedOnMessageType(msgData.contentType, undefined, t);
38
+ default:
39
+ return "";
40
+ }
41
+ };
42
+ export const parseBizLatestMessage = (latestMsg, currentUserId, t, isGroupChat) => {
43
+ if (!latestMsg || !t)
44
+ return "";
45
+ try {
46
+ const msgData = JSON.parse(latestMsg);
47
+ if (shouldHideBizMessage(msgData))
48
+ return "";
49
+ const content = getBizPreviewContent(msgData, t);
50
+ if (!content)
51
+ return "";
52
+ if (!isGroupChat)
53
+ return content;
54
+ return `${getSenderLabel(msgData, currentUserId, t)}: ${content}`;
55
+ }
56
+ catch (_a) {
57
+ return "";
58
+ }
59
+ };
60
+ export const getBizMessageContent = (message) => {
61
+ var _a, _b, _c, _d, _e;
62
+ return (_e = (_d = (_b = (_a = message.textElem) === null || _a === void 0 ? void 0 : _a.content) !== null && _b !== void 0 ? _b : (_c = message.urlTextElem) === null || _c === void 0 ? void 0 : _c.content) !== null && _d !== void 0 ? _d : message.content) !== null && _e !== void 0 ? _e : "";
63
+ };
64
+ export const getBizMessageDisplay = (message, allMessages, userID, isGroupChat = false) => {
5
65
  const isMine = message.sendID === userID;
6
66
  const previousMessage = getVisibleNeighbor(allMessages, message, "prev");
7
67
  const nextMessage = getVisibleNeighbor(allMessages, message, "next");
@@ -11,8 +71,8 @@ export const getBizMessageDisplay = (message, allMessages, userID) => {
11
71
  !dayjs(message.sendTime).isSame(previousMessage.sendTime, "days");
12
72
  return {
13
73
  isMine,
14
- showAvatar: !isMine && !nextSameUser,
15
- showSenderName: !isMine && !prevSameUser,
74
+ showAvatar: isGroupChat && !isMine && !nextSameUser,
75
+ showSenderName: isGroupChat && !isMine && !prevSameUser,
16
76
  showTimeBreak,
17
77
  showTip: !nextSameUser,
18
78
  content: getBizMessageContent(message),
@@ -0,0 +1,3 @@
1
+ import type { TFunction } from "i18next";
2
+ export declare const openBizLink: (url: string, t: TFunction) => boolean;
3
+ //# sourceMappingURL=openBizLink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openBizLink.d.ts","sourceRoot":"","sources":["../../src/utils/openBizLink.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGzC,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,EAAE,GAAG,SAAS,KAAG,OAkBvD,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { message as antdMessage } from "antd";
2
+ import { normalizeBizLinkUrl } from "./bizLink";
3
+ export const openBizLink = (url, t) => {
4
+ if (!url || typeof window === "undefined")
5
+ return false;
6
+ try {
7
+ const opened = window.open(normalizeBizLinkUrl(url), "_blank", "noopener,noreferrer");
8
+ if (!opened) {
9
+ antdMessage.error(t("link_open_error"));
10
+ return false;
11
+ }
12
+ return true;
13
+ }
14
+ catch (_a) {
15
+ antdMessage.error(t("link_open_error"));
16
+ return false;
17
+ }
18
+ };
package/package.json CHANGED
@@ -1,126 +1,127 @@
1
- {
2
- "name": "@droppii-org/chat-sdk",
3
- "version": "0.1.29",
4
- "description": "Droppii React Chat SDK",
5
- "main": "./dist/index.js",
6
- "types": "./dist/index.d.ts",
7
- "exports": {
8
- ".": {
9
- "import": "./dist/index.js",
10
- "types": "./dist/index.d.ts"
11
- },
12
- "./components/*": {
13
- "import": "./dist/components/*.js",
14
- "types": "./dist/components/*.d.ts"
15
- },
16
- "./hooks/*": {
17
- "import": "./dist/hooks/*.js",
18
- "types": "./dist/hooks/*.d.ts"
19
- },
20
- "./context/*": {
21
- "import": "./dist/context/*.js",
22
- "types": "./dist/context/*.d.ts"
23
- },
24
- "./types/*": {
25
- "import": "./dist/types/*.js",
26
- "types": "./dist/types/*.d.ts"
27
- },
28
- "./screens/*": {
29
- "import": "./dist/screens/*.js",
30
- "types": "./dist/screens/*.d.ts"
31
- },
32
- "./assets/*": {
33
- "import": "./dist/assets/*.js",
34
- "types": "./dist/assets/*.d.ts"
35
- },
36
- "./constants/*": {
37
- "import": "./dist/constants/*.js",
38
- "types": "./dist/constants/*.d.ts"
39
- },
40
- "./layout/*": {
41
- "import": "./dist/layout/*.js",
42
- "types": "./dist/layout/*.d.ts"
43
- },
44
- "./utils/*": {
45
- "import": "./dist/utils/*.js",
46
- "types": "./dist/utils/*.d.ts"
47
- },
48
- "./services/*": {
49
- "import": "./dist/services/*.js",
50
- "types": "./dist/services/*.d.ts"
51
- },
52
- "./locales/*": "./dist/locales/*",
53
- "./styles/global.css": "./dist/styles/global.css"
54
- },
55
- "files": [
56
- "dist"
57
- ],
58
- "keywords": [
59
- "chat",
60
- "sdk",
61
- "react",
62
- "messenger-style"
63
- ],
64
- "author": "Garru",
65
- "license": "MIT",
66
- "publishConfig": {
67
- "access": "public"
68
- },
69
- "dependencies": {
70
- "@ant-design/icons": "^6.0.0",
71
- "@lexical/code": "^0.34.0",
72
- "@lexical/html": "^0.34.0",
73
- "@lexical/link": "^0.34.0",
74
- "@lexical/list": "^0.34.0",
75
- "@lexical/react": "^0.34.0",
76
- "@lexical/rich-text": "^0.34.0",
77
- "@openim/wasm-client-sdk": "3.8.3-patch.10",
78
- "@tailwindcss/postcss": "^4.1.12",
79
- "@tanstack/react-query": "^5.85.5",
80
- "ahooks": "^3.9.4",
81
- "antd": "^5.27.0",
82
- "axios": "^1.11.0",
83
- "clsx": "^2.0.0",
84
- "dayjs": "^1.11.13",
85
- "dompurify": "^3.3.1",
86
- "i18next": "^25.5.2",
87
- "jwt-decode": "^4.0.0",
88
- "lexical": "^0.34.0",
89
- "lodash": "^4.17.21",
90
- "lucide-react": "^0.263.1",
91
- "mitt": "^3.0.1",
92
- "postcss": "^8.5.6",
93
- "query-string": "^9.3.1",
94
- "react-i18next": "^15.7.3",
95
- "react-icomoon": "^2.6.1",
96
- "react-infinite-scroll-component": "^6.1.0",
97
- "react-sticky-box": "^2.0.5",
98
- "react-virtuoso": "^4.14.0",
99
- "tailwind-merge": "^2.0.0",
100
- "tailwindcss": "^3.3.0",
101
- "uuid": "^11.1.0",
102
- "zustand": "^5.0.7"
103
- },
104
- "peerDependencies": {
105
- "react": "^18.0.0",
106
- "react-dom": "^18.0.0"
107
- },
108
- "devDependencies": {
109
- "@types/dompurify": "^3.2.0",
110
- "@types/lodash": "^4.17.20",
111
- "@types/node": "^20.0.0",
112
- "@types/react": "^18.2.37",
113
- "@types/react-dom": "^18.2.15",
114
- "shx": "^0.4.0",
115
- "tsc-alias": "^1.8.17",
116
- "typescript": "^5.2.2"
117
- },
118
- "scripts": {
119
- "build": "pnpm build:css && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && pnpm copy-assets",
120
- "build:css": "tailwindcss -i ./src/styles/global.css -o ./dist/styles/global.css --minify",
121
- "dev": "tsc --noEmit --watch",
122
- "lint": "eslint src/",
123
- "type-check": "tsc --noEmit",
124
- "copy-assets": "shx cp -r src/assets dist && shx cp -r src/locales dist"
125
- }
126
- }
1
+ {
2
+ "name": "@droppii-org/chat-sdk",
3
+ "version": "0.1.31",
4
+ "description": "Droppii React Chat SDK",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./dist/index.js",
10
+ "types": "./dist/index.d.ts"
11
+ },
12
+ "./components/*": {
13
+ "import": "./dist/components/*.js",
14
+ "types": "./dist/components/*.d.ts"
15
+ },
16
+ "./hooks/*": {
17
+ "import": "./dist/hooks/*.js",
18
+ "types": "./dist/hooks/*.d.ts"
19
+ },
20
+ "./context/*": {
21
+ "import": "./dist/context/*.js",
22
+ "types": "./dist/context/*.d.ts"
23
+ },
24
+ "./types/*": {
25
+ "import": "./dist/types/*.js",
26
+ "types": "./dist/types/*.d.ts"
27
+ },
28
+ "./screens/*": {
29
+ "import": "./dist/screens/*.js",
30
+ "types": "./dist/screens/*.d.ts"
31
+ },
32
+ "./assets/*": {
33
+ "import": "./dist/assets/*.js",
34
+ "types": "./dist/assets/*.d.ts"
35
+ },
36
+ "./constants/*": {
37
+ "import": "./dist/constants/*.js",
38
+ "types": "./dist/constants/*.d.ts"
39
+ },
40
+ "./layout/*": {
41
+ "import": "./dist/layout/*.js",
42
+ "types": "./dist/layout/*.d.ts"
43
+ },
44
+ "./utils/*": {
45
+ "import": "./dist/utils/*.js",
46
+ "types": "./dist/utils/*.d.ts"
47
+ },
48
+ "./services/*": {
49
+ "import": "./dist/services/*.js",
50
+ "types": "./dist/services/*.d.ts"
51
+ },
52
+ "./locales/*": "./dist/locales/*",
53
+ "./styles/global.css": "./dist/styles/global.css"
54
+ },
55
+ "files": [
56
+ "dist"
57
+ ],
58
+ "scripts": {
59
+ "build": "pnpm build:css && tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && pnpm copy-assets",
60
+ "build:css": "tailwindcss -i ./src/styles/global.css -o ./dist/styles/global.css --minify",
61
+ "dev": "tsc --noEmit --watch",
62
+ "lint": "eslint src/",
63
+ "type-check": "tsc --noEmit",
64
+ "prepublishOnly": "pnpm build",
65
+ "copy-assets": "shx cp -r src/assets dist && shx cp -r src/locales dist"
66
+ },
67
+ "keywords": [
68
+ "chat",
69
+ "sdk",
70
+ "react",
71
+ "messenger-style"
72
+ ],
73
+ "author": "Garru",
74
+ "license": "MIT",
75
+ "publishConfig": {
76
+ "access": "public"
77
+ },
78
+ "dependencies": {
79
+ "@ant-design/icons": "^6.0.0",
80
+ "@lexical/code": "^0.34.0",
81
+ "@lexical/html": "^0.34.0",
82
+ "@lexical/link": "^0.34.0",
83
+ "@lexical/list": "^0.34.0",
84
+ "@lexical/react": "^0.34.0",
85
+ "@lexical/rich-text": "^0.34.0",
86
+ "@openim/wasm-client-sdk": "3.8.3-patch.10",
87
+ "@tailwindcss/postcss": "^4.1.12",
88
+ "@tanstack/react-query": "^5.85.5",
89
+ "ahooks": "^3.9.4",
90
+ "antd": "^5.27.0",
91
+ "axios": "^1.11.0",
92
+ "clsx": "^2.0.0",
93
+ "dayjs": "^1.11.13",
94
+ "dompurify": "^3.3.1",
95
+ "i18next": "^25.5.2",
96
+ "jwt-decode": "^4.0.0",
97
+ "lexical": "^0.34.0",
98
+ "lodash": "^4.17.21",
99
+ "lucide-react": "^0.263.1",
100
+ "mitt": "^3.0.1",
101
+ "postcss": "^8.5.6",
102
+ "query-string": "^9.3.1",
103
+ "react-i18next": "^15.7.3",
104
+ "react-icomoon": "^2.6.1",
105
+ "react-infinite-scroll-component": "^6.1.0",
106
+ "react-sticky-box": "^2.0.5",
107
+ "react-virtuoso": "^4.14.0",
108
+ "tailwind-merge": "^2.0.0",
109
+ "tailwindcss": "^3.3.0",
110
+ "uuid": "^11.1.0",
111
+ "zustand": "^5.0.7"
112
+ },
113
+ "peerDependencies": {
114
+ "react": "^18.0.0",
115
+ "react-dom": "^18.0.0"
116
+ },
117
+ "devDependencies": {
118
+ "@types/dompurify": "^3.2.0",
119
+ "@types/lodash": "^4.17.20",
120
+ "@types/node": "^20.0.0",
121
+ "@types/react": "^18.2.37",
122
+ "@types/react-dom": "^18.2.15",
123
+ "shx": "^0.4.0",
124
+ "tsc-alias": "^1.8.17",
125
+ "typescript": "^5.2.2"
126
+ }
127
+ }