@droppii-org/chat-sdk 0.1.50 → 0.1.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/svg/index.d.ts +0 -1
- package/dist/assets/svg/index.d.ts.map +1 -1
- package/dist/assets/svg/index.js +0 -1
- package/dist/assets/svg/index.ts +1 -2
- package/dist/components/biz-inbox/BizThreadCard.d.ts.map +1 -1
- package/dist/components/biz-inbox/BizThreadCard.js +3 -11
- package/dist/components/biz-thread-detail/BizMessageList.js +2 -2
- package/dist/components/biz-thread-detail/BizThreadDetailInput.d.ts.map +1 -1
- package/dist/components/biz-thread-detail/BizThreadDetailInput.js +10 -19
- package/dist/components/biz-thread-detail/index.d.ts +0 -4
- package/dist/components/biz-thread-detail/index.d.ts.map +1 -1
- package/dist/components/biz-thread-detail/index.js +0 -2
- package/dist/components/conversation/ConversationBySessionItem.d.ts.map +1 -1
- package/dist/components/conversation/ConversationBySessionItem.js +6 -5
- package/dist/components/conversation/ThreadCard.d.ts +14 -0
- package/dist/components/conversation/ThreadCard.d.ts.map +1 -0
- package/dist/components/conversation/ThreadCard.js +16 -0
- package/dist/components/media-collection/ImageCollection.d.ts.map +1 -1
- package/dist/components/media-collection/ImageCollection.js +3 -17
- package/dist/components/message/MessageList.d.ts.map +1 -1
- package/dist/components/message/MessageList.js +1 -7
- package/dist/components/message/footer/ComposerTextSyncPlugin.d.ts +6 -0
- package/dist/components/message/footer/ComposerTextSyncPlugin.d.ts.map +1 -0
- package/dist/components/message/footer/ComposerTextSyncPlugin.js +16 -0
- package/dist/components/message/footer/FilePreview.d.ts +3 -2
- package/dist/components/message/footer/FilePreview.d.ts.map +1 -1
- package/dist/components/message/footer/FilePreview.js +61 -21
- package/dist/components/message/footer/LinkInputPreview.d.ts +7 -0
- package/dist/components/message/footer/LinkInputPreview.d.ts.map +1 -0
- package/dist/components/message/footer/LinkInputPreview.js +16 -0
- package/dist/components/message/footer/MediaActions.d.ts.map +1 -1
- package/dist/components/message/footer/MediaActions.js +8 -5
- package/dist/components/message/footer/index.d.ts.map +1 -1
- package/dist/components/message/footer/index.js +48 -35
- package/dist/components/message/item/FileMessage.d.ts +2 -2
- package/dist/components/message/item/FileMessage.d.ts.map +1 -1
- package/dist/components/message/item/FileMessage.js +20 -12
- package/dist/components/message/item/ImageMessage.d.ts.map +1 -1
- package/dist/components/message/item/ImageMessage.js +11 -15
- package/dist/components/message/item/LinkCard.d.ts +7 -0
- package/dist/components/message/item/LinkCard.d.ts.map +1 -0
- package/dist/components/message/item/LinkCard.js +17 -0
- package/dist/components/message/item/LinkText.d.ts +6 -0
- package/dist/components/message/item/LinkText.d.ts.map +1 -0
- package/dist/components/message/item/LinkText.js +13 -0
- package/dist/components/message/item/MergeImageMessage.d.ts +7 -0
- package/dist/components/message/item/MergeImageMessage.d.ts.map +1 -0
- package/dist/components/message/item/MergeImageMessage.js +30 -0
- package/dist/components/message/item/MessageBubble.d.ts +13 -0
- package/dist/components/message/item/MessageBubble.d.ts.map +1 -0
- package/dist/components/message/item/MessageBubble.js +19 -0
- package/dist/components/message/item/RevokeMessage.js +1 -1
- package/dist/components/message/item/TextMessage.d.ts.map +1 -1
- package/dist/components/message/item/TextMessage.js +20 -9
- package/dist/components/message/item/UrlTextMessage.d.ts.map +1 -1
- package/dist/components/message/item/UrlTextMessage.js +19 -17
- package/dist/components/message/item/VideoMessage.d.ts.map +1 -1
- package/dist/components/message/item/VideoMessage.js +4 -12
- package/dist/components/message/item/imagePreviewToolbar.d.ts +5 -0
- package/dist/components/message/item/imagePreviewToolbar.d.ts.map +1 -0
- package/dist/components/message/item/imagePreviewToolbar.js +14 -0
- package/dist/components/message/item/index.d.ts +2 -1
- package/dist/components/message/item/index.d.ts.map +1 -1
- package/dist/components/message/item/index.js +38 -41
- package/dist/components/message/item/textStyle.d.ts +2 -0
- package/dist/components/message/item/textStyle.d.ts.map +1 -0
- package/dist/components/message/item/textStyle.js +1 -0
- package/dist/hooks/message/useSendMessage.d.ts +3 -10
- package/dist/hooks/message/useSendMessage.d.ts.map +1 -1
- package/dist/hooks/message/useSendMessage.js +27 -44
- package/dist/styles/global.css +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/bizMessage.d.ts +1 -14
- package/dist/utils/bizMessage.d.ts.map +1 -1
- package/dist/utils/bizMessage.js +0 -26
- package/dist/utils/common.d.ts +2 -1
- package/dist/utils/common.d.ts.map +1 -1
- package/dist/utils/common.js +9 -3
- package/dist/utils/fileValidation.d.ts +1 -0
- package/dist/utils/fileValidation.d.ts.map +1 -1
- package/dist/utils/fileValidation.js +10 -17
- package/dist/utils/link.d.ts +13 -0
- package/dist/utils/link.d.ts.map +1 -0
- package/dist/utils/link.js +77 -0
- package/dist/utils/openLink.d.ts +3 -0
- package/dist/utils/openLink.d.ts.map +1 -0
- package/dist/utils/openLink.js +19 -0
- package/package.json +126 -127
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ConversationItem,
|
|
1
|
+
import { ConversationItem, MessageType } from "@openim/wasm-client-sdk";
|
|
2
2
|
import type { TFunction } from "i18next";
|
|
3
3
|
import type { IPulledRawMessage } from "../types/dto";
|
|
4
4
|
export declare const shouldHideBizMessage: (message: {
|
|
@@ -12,17 +12,4 @@ export declare const resolveBizLatestPreview: (lastMessage: IPulledRawMessage |
|
|
|
12
12
|
latestMsgSendTime: number;
|
|
13
13
|
};
|
|
14
14
|
export declare const parseBizLatestMessage: (latestMsg: string, currentUserId: string | undefined, t: TFunction, peerFullName?: string | null) => string;
|
|
15
|
-
export declare const getBizMessageContent: (message: MessageItem) => string;
|
|
16
|
-
export interface BizMessageDisplay {
|
|
17
|
-
isMine: boolean;
|
|
18
|
-
showAvatar: boolean;
|
|
19
|
-
showSenderName: boolean;
|
|
20
|
-
showTimeBreak: boolean;
|
|
21
|
-
showTip: boolean;
|
|
22
|
-
content: string;
|
|
23
|
-
senderName: string;
|
|
24
|
-
senderFaceUrl: string;
|
|
25
|
-
sendTime: number;
|
|
26
|
-
}
|
|
27
|
-
export declare const getBizMessageDisplay: (message: MessageItem, allMessages: MessageItem[], userID: string, isGroupChat?: boolean) => BizMessageDisplay;
|
|
28
15
|
//# 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,gBAAgB,
|
|
1
|
+
{"version":3,"file":"bizMessage.d.ts","sourceRoot":"","sources":["../../src/utils/bizMessage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAe,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAarD,eAAO,MAAM,oBAAoB,GAAI,SAAS;IAC5C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,YAKA,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,WAAW,MAAM,KAAG,OAQ5D,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,aAAa,iBAAiB,GAAG,IAAI,KACpC,MAGF,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,aAAa,iBAAiB,GAAG,IAAI,EACrC,iBAAiB,gBAAgB,GAAG,SAAS,EAC7C,gBAAgB,OAAO;;;CAoBxB,CAAC;AAgDF,eAAO,MAAM,qBAAqB,GAChC,WAAW,MAAM,EACjB,eAAe,MAAM,GAAG,SAAS,EACjC,GAAG,SAAS,EACZ,eAAe,MAAM,GAAG,IAAI,WAe7B,CAAC"}
|
package/dist/utils/bizMessage.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import { MessageType } from "@openim/wasm-client-sdk";
|
|
2
|
-
import { getVisibleNeighbor } from "../hooks/message/useMessage";
|
|
3
|
-
import dayjs from "dayjs";
|
|
4
2
|
import { generateContentBasedOnMessageType } from "./common";
|
|
5
3
|
import { isSystemLogMessageType } from "./messageLog";
|
|
6
4
|
import { transformPulledMessage } from "./messageTransform";
|
|
@@ -93,27 +91,3 @@ export const parseBizLatestMessage = (latestMsg, currentUserId, t, peerFullName)
|
|
|
93
91
|
return "";
|
|
94
92
|
}
|
|
95
93
|
};
|
|
96
|
-
export const getBizMessageContent = (message) => {
|
|
97
|
-
var _a, _b, _c, _d, _e;
|
|
98
|
-
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 : "";
|
|
99
|
-
};
|
|
100
|
-
export const getBizMessageDisplay = (message, allMessages, userID, isGroupChat = false) => {
|
|
101
|
-
const isMine = message.sendID === userID;
|
|
102
|
-
const previousMessage = getVisibleNeighbor(allMessages, message, "prev");
|
|
103
|
-
const nextMessage = getVisibleNeighbor(allMessages, message, "next");
|
|
104
|
-
const prevSameUser = (previousMessage === null || previousMessage === void 0 ? void 0 : previousMessage.sendID) === message.sendID;
|
|
105
|
-
const nextSameUser = (nextMessage === null || nextMessage === void 0 ? void 0 : nextMessage.sendID) === message.sendID;
|
|
106
|
-
const showTimeBreak = !previousMessage ||
|
|
107
|
-
!dayjs(message.sendTime).isSame(previousMessage.sendTime, "days");
|
|
108
|
-
return {
|
|
109
|
-
isMine,
|
|
110
|
-
showAvatar: isGroupChat && !isMine && !nextSameUser,
|
|
111
|
-
showSenderName: isGroupChat && !isMine && !prevSameUser,
|
|
112
|
-
showTimeBreak,
|
|
113
|
-
showTip: !nextSameUser,
|
|
114
|
-
content: getBizMessageContent(message),
|
|
115
|
-
senderName: message.senderNickname,
|
|
116
|
-
senderFaceUrl: message.senderFaceUrl,
|
|
117
|
-
sendTime: message.sendTime,
|
|
118
|
-
};
|
|
119
|
-
};
|
package/dist/utils/common.d.ts
CHANGED
|
@@ -11,9 +11,10 @@ interface FormatOptions {
|
|
|
11
11
|
}
|
|
12
12
|
export declare function formatTimestamp(timestamp: number, options?: FormatOptions): string;
|
|
13
13
|
export declare const urlRegex: RegExp;
|
|
14
|
-
export declare function extractLinks(text: string): string[];
|
|
15
14
|
export declare function wrapLinksInHtml(htmlContent: string): string;
|
|
16
15
|
export declare const getHostFromUrl: (url: string) => string | null;
|
|
16
|
+
export declare const htmlHasFormatting: (html: string) => boolean;
|
|
17
|
+
export declare const stripHtml: (html: string) => string;
|
|
17
18
|
/**
|
|
18
19
|
* Sanitizes HTML content to prevent XSS attacks
|
|
19
20
|
* Uses DOMPurify to remove all potentially malicious code
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/utils/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAkBpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAItD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAapD;AAED,eAAO,MAAM,iCAAiC,GAC5C,aAAa,WAAW,EACxB,YAAY,MAAM,EAClB,IAAI,SAAS,WAuBd,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,WAAW,MAAM,EACjB,gBAAgB,MAAM,EACtB,IAAI,SAAS,WAkDd,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,MAAM,MAAM,EACZ,SAAS,MAAM,EACf,kBAAc,WA2Cf,CAAC;AAEF,UAAU,aAAa;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CAqBR;AAED,eAAO,MAAM,QAAQ,QAAkD,CAAC;AAExE,wBAAgB,
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/utils/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAkBpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAItD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAapD;AAED,eAAO,MAAM,iCAAiC,GAC5C,aAAa,WAAW,EACxB,YAAY,MAAM,EAClB,IAAI,SAAS,WAuBd,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAC7B,WAAW,MAAM,EACjB,gBAAgB,MAAM,EACtB,IAAI,SAAS,WAkDd,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,MAAM,MAAM,EACZ,SAAS,MAAM,EACf,kBAAc,WA2Cf,CAAC;AAEF,UAAU,aAAa;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CAqBR;AAED,eAAO,MAAM,QAAQ,QAAkD,CAAC;AAExE,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAqC3D;AAED,eAAO,MAAM,cAAc,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,IAOrD,CAAC;AAKF,eAAO,MAAM,iBAAiB,GAAI,MAAM,MAAM,KAAG,OACf,CAAC;AAEnC,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,MAO9B,CAAC;AAEZ;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAgEjD"}
|
package/dist/utils/common.js
CHANGED
|
@@ -147,9 +147,6 @@ export function formatTimestamp(timestamp, options) {
|
|
|
147
147
|
: date.format(`${dateMonthFormat} YYYY`);
|
|
148
148
|
}
|
|
149
149
|
export const urlRegex = /\bhttps?:\/\/[^\s<>"']*[^\s<>"',.!?()\[\]{}]/g;
|
|
150
|
-
export function extractLinks(text) {
|
|
151
|
-
return text.match(urlRegex) || [];
|
|
152
|
-
}
|
|
153
150
|
export function wrapLinksInHtml(htmlContent) {
|
|
154
151
|
var _a;
|
|
155
152
|
// Regex để kiểm tra xem link có nằm trong thẻ <a> không
|
|
@@ -188,6 +185,15 @@ export const getHostFromUrl = (url) => {
|
|
|
188
185
|
return null;
|
|
189
186
|
}
|
|
190
187
|
};
|
|
188
|
+
const HTML_FORMATTING_REGEX = /<(strong|b|em|i|u|s|del|ins|mark|ul|ol|li|a|blockquote|h[1-6]|code|pre|table)\b/i;
|
|
189
|
+
export const htmlHasFormatting = (html) => HTML_FORMATTING_REGEX.test(html);
|
|
190
|
+
export const stripHtml = (html) => html
|
|
191
|
+
.replace(/<[^>]*>/g, "")
|
|
192
|
+
.replace(/ /g, " ")
|
|
193
|
+
.replace(/&/g, "&")
|
|
194
|
+
.replace(/</g, "<")
|
|
195
|
+
.replace(/>/g, ">")
|
|
196
|
+
.trim();
|
|
191
197
|
/**
|
|
192
198
|
* Sanitizes HTML content to prevent XSS attacks
|
|
193
199
|
* Uses DOMPurify to remove all potentially malicious code
|
|
@@ -20,6 +20,7 @@ export declare const validateFile: (file: File, t: TFunction) => FileValidationR
|
|
|
20
20
|
* Validates video count limit (max 1 video)
|
|
21
21
|
*/
|
|
22
22
|
export declare const validateVideoLimit: (newFiles: File[], currentUploadedFiles: UploadFile[], t: TFunction) => FileValidationResult;
|
|
23
|
+
export declare const createUploadFile: (file: File) => UploadFile;
|
|
23
24
|
export declare const processAndValidateDocuments: (files: File[], t: TFunction) => UploadFile[];
|
|
24
25
|
/**
|
|
25
26
|
* Process and validate multiple files, converting to UploadFile format
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileValidation.d.ts","sourceRoot":"","sources":["../../src/utils/fileValidation.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,UAAU,EAAE,MAAM,MAAM,CAAC;AAE1D,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,eAAO,MAAM,oBAAoB,UAA2C,CAAC;AAC7E,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,mBAAmB,UAI/B,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,CAAC,EAAE,SAAS,CAAC;IACb,oBAAoB,CAAC,EAAE,UAAU,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,IAAI,EACV,GAAG,SAAS,KACX,oBAuBF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAC7B,UAAU,IAAI,EAAE,EAChB,sBAAsB,UAAU,EAAE,EAClC,GAAG,SAAS,KACX,oBAYF,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,OAAO,IAAI,EAAE,EACb,GAAG,SAAS,KACX,UAAU,
|
|
1
|
+
{"version":3,"file":"fileValidation.d.ts","sourceRoot":"","sources":["../../src/utils/fileValidation.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,UAAU,EAAE,MAAM,MAAM,CAAC;AAE1D,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,eAAO,MAAM,oBAAoB,UAA2C,CAAC;AAC7E,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,mBAAmB,UAI/B,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,CAAC,EAAE,SAAS,CAAC;IACb,oBAAoB,CAAC,EAAE,UAAU,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,IAAI,EACV,GAAG,SAAS,KACX,oBAuBF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAC7B,UAAU,IAAI,EAAE,EAChB,sBAAsB,UAAU,EAAE,EAClC,GAAG,SAAS,KACX,oBAYF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,MAAM,IAAI,KAAG,UAO5C,CAAC;AAEH,eAAO,MAAM,2BAA2B,GACtC,OAAO,IAAI,EAAE,EACb,GAAG,SAAS,KACX,UAAU,EAkBZ,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAClC,OAAO,IAAI,EAAE,EACb,SAAS,qBAAqB,KAC7B,UAAU,EA+BZ,CAAC"}
|
|
@@ -42,6 +42,14 @@ export const validateVideoLimit = (newFiles, currentUploadedFiles, t) => {
|
|
|
42
42
|
}
|
|
43
43
|
return { isValid: true };
|
|
44
44
|
};
|
|
45
|
+
export const createUploadFile = (file) => ({
|
|
46
|
+
uid: `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`,
|
|
47
|
+
name: file.name,
|
|
48
|
+
status: "done",
|
|
49
|
+
type: file.type,
|
|
50
|
+
size: file.size,
|
|
51
|
+
originFileObj: file,
|
|
52
|
+
});
|
|
45
53
|
export const processAndValidateDocuments = (files, t) => {
|
|
46
54
|
try {
|
|
47
55
|
return files
|
|
@@ -52,14 +60,7 @@ export const processAndValidateDocuments = (files, t) => {
|
|
|
52
60
|
}
|
|
53
61
|
return true;
|
|
54
62
|
})
|
|
55
|
-
.map(
|
|
56
|
-
uid: `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`,
|
|
57
|
-
name: file.name,
|
|
58
|
-
status: "done",
|
|
59
|
-
type: file.type,
|
|
60
|
-
size: file.size,
|
|
61
|
-
originFileObj: file,
|
|
62
|
-
}));
|
|
63
|
+
.map(createUploadFile);
|
|
63
64
|
}
|
|
64
65
|
catch (error) {
|
|
65
66
|
console.error("Error processing documents:", error);
|
|
@@ -84,15 +85,7 @@ export const processAndValidateFiles = (files, options) => {
|
|
|
84
85
|
files.forEach((file) => {
|
|
85
86
|
const validation = validateFile(file, t);
|
|
86
87
|
if (validation.isValid) {
|
|
87
|
-
|
|
88
|
-
uid: `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`,
|
|
89
|
-
name: file.name,
|
|
90
|
-
status: "done",
|
|
91
|
-
type: file.type,
|
|
92
|
-
size: file.size,
|
|
93
|
-
originFileObj: file,
|
|
94
|
-
};
|
|
95
|
-
validFiles.push(uploadFile);
|
|
88
|
+
validFiles.push(createUploadFile(file));
|
|
96
89
|
}
|
|
97
90
|
else {
|
|
98
91
|
antdMessage.error(validation.error);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const normalizeLinkUrl: (link: string) => string;
|
|
2
|
+
export declare const extractLinkUrls: (text: string) => string[];
|
|
3
|
+
export type TextSegment = {
|
|
4
|
+
type: "text";
|
|
5
|
+
value: string;
|
|
6
|
+
} | {
|
|
7
|
+
type: "link";
|
|
8
|
+
value: string;
|
|
9
|
+
url: string;
|
|
10
|
+
};
|
|
11
|
+
export declare const parseTextWithLinks: (text: string) => TextSegment[];
|
|
12
|
+
export declare const getHostLabel: (url: string) => string;
|
|
13
|
+
//# sourceMappingURL=link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/utils/link.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,MAK/C,CAAC;AA+BF,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,KAAG,MAAM,EAYpD,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB;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,kBAAkB,GAAI,MAAM,MAAM,KAAG,WAAW,EAwB5D,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 normalizeLinkUrl = (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 extractLinkUrls = (text) => {
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
const urls = [];
|
|
38
|
+
for (const { text: raw } of findLinkRanges(text)) {
|
|
39
|
+
const url = normalizeLinkUrl(raw);
|
|
40
|
+
if (seen.has(url))
|
|
41
|
+
continue;
|
|
42
|
+
seen.add(url);
|
|
43
|
+
urls.push(url);
|
|
44
|
+
}
|
|
45
|
+
return urls;
|
|
46
|
+
};
|
|
47
|
+
export const parseTextWithLinks = (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: normalizeLinkUrl(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(normalizeLinkUrl(url)).host;
|
|
73
|
+
}
|
|
74
|
+
catch (_b) {
|
|
75
|
+
return (_a = url.replace(/^https?:\/\//i, "").split("/")[0]) !== null && _a !== void 0 ? _a : url;
|
|
76
|
+
}
|
|
77
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openLink.d.ts","sourceRoot":"","sources":["../../src/utils/openLink.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGzC,eAAO,MAAM,QAAQ,GAAI,KAAK,MAAM,EAAE,GAAG,SAAS,KAAG,OAepD,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { message as antdMessage } from "antd";
|
|
2
|
+
import { normalizeLinkUrl } from "./link";
|
|
3
|
+
export const openLink = (url, t) => {
|
|
4
|
+
if (!url || typeof window === "undefined")
|
|
5
|
+
return false;
|
|
6
|
+
try {
|
|
7
|
+
const opened = window.open(normalizeLinkUrl(url), "_blank");
|
|
8
|
+
if (!opened) {
|
|
9
|
+
antdMessage.error(t("link_open_error"));
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
opened.opener = null;
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
catch (_a) {
|
|
16
|
+
antdMessage.error(t("link_open_error"));
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
};
|
package/package.json
CHANGED
|
@@ -1,127 +1,126 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@droppii-org/chat-sdk",
|
|
3
|
-
"version": "0.1.
|
|
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
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
"
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
"@
|
|
80
|
-
"
|
|
81
|
-
"
|
|
82
|
-
"
|
|
83
|
-
"
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
"
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
"
|
|
90
|
-
"
|
|
91
|
-
"
|
|
92
|
-
"
|
|
93
|
-
"
|
|
94
|
-
"
|
|
95
|
-
"
|
|
96
|
-
"
|
|
97
|
-
"
|
|
98
|
-
"
|
|
99
|
-
"
|
|
100
|
-
"
|
|
101
|
-
"
|
|
102
|
-
"
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
"react
|
|
106
|
-
"react-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
"
|
|
110
|
-
"
|
|
111
|
-
"
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
"
|
|
115
|
-
"
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
"
|
|
120
|
-
"
|
|
121
|
-
"
|
|
122
|
-
"
|
|
123
|
-
"
|
|
124
|
-
"
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@droppii-org/chat-sdk",
|
|
3
|
+
"version": "0.1.51",
|
|
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
|
+
}
|