@droppii-org/chat-sdk 0.8.1 → 0.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/canned-response/cannedTrigger.d.ts +2 -0
- package/dist/components/canned-response/cannedTrigger.d.ts.map +1 -0
- package/dist/components/canned-response/cannedTrigger.js +3 -0
- package/dist/components/canned-response/insertCannedContent.js +2 -2
- package/dist/components/conversation/ConversationByGroupItem.js +1 -1
- package/dist/components/conversation/ConversationBySessionItem.js +4 -4
- package/dist/components/conversation/DeskConversationList.d.ts.map +1 -1
- package/dist/components/conversation/DeskConversationList.js +6 -4
- package/dist/components/conversation/folderEmptyState.d.ts.map +1 -1
- package/dist/components/conversation/folderEmptyState.js +2 -0
- package/dist/components/conversation/internalNotePreview.d.ts +1 -1
- package/dist/components/conversation/internalNotePreview.d.ts.map +1 -1
- package/dist/components/conversation/internalNotePreview.js +22 -3
- package/dist/components/conversation/listHeading.d.ts +1 -1
- package/dist/components/conversation/listHeading.d.ts.map +1 -1
- package/dist/components/conversation/listHeading.js +7 -1
- package/dist/components/conversation/rowTime.d.ts +2 -2
- package/dist/components/conversation/rowTime.d.ts.map +1 -1
- package/dist/components/conversation/rowTime.js +2 -4
- package/dist/components/conversation-detail/ConversationDetailInput.d.ts.map +1 -1
- package/dist/components/conversation-detail/ConversationDetailInput.js +8 -3
- package/dist/components/conversation-detail/ConversationMessageList.d.ts.map +1 -1
- package/dist/components/conversation-detail/ConversationMessageList.js +6 -3
- package/dist/components/conversation-detail/bot/BotMenuSheet.d.ts.map +1 -1
- package/dist/components/conversation-detail/bot/BotMenuSheet.js +1 -1
- package/dist/components/conversation-inbox/ConversationInboxList.d.ts.map +1 -1
- package/dist/components/conversation-inbox/ConversationInboxList.js +4 -0
- package/dist/components/conversation-inbox/InboxBootStatus.d.ts.map +1 -1
- package/dist/components/conversation-inbox/InboxBootStatus.js +10 -2
- package/dist/components/group/CreateGroupForm.d.ts.map +1 -1
- package/dist/components/group/CreateGroupForm.js +2 -1
- package/dist/components/group/CreateGroupFormCrmView.d.ts.map +1 -1
- package/dist/components/group/CreateGroupFormCrmView.js +1 -1
- package/dist/components/group/GroupMemberPickerCrm.d.ts.map +1 -1
- package/dist/components/group/GroupMemberPickerCrm.js +1 -1
- package/dist/components/media-collection/FileCollection.d.ts.map +1 -1
- package/dist/components/media-collection/FileCollection.js +4 -3
- package/dist/components/media-collection/ImageCollection.d.ts.map +1 -1
- package/dist/components/media-collection/ImageCollection.js +2 -1
- package/dist/components/media-collection/LinkCollection.d.ts.map +1 -1
- package/dist/components/media-collection/LinkCollection.js +14 -26
- package/dist/components/media-collection/VideoCollection.d.ts.map +1 -1
- package/dist/components/media-collection/VideoCollection.js +2 -1
- package/dist/components/media-resources/FileResourceList.js +2 -2
- package/dist/components/media-resources/ResourceScrollContainer.d.ts.map +1 -1
- package/dist/components/media-resources/ResourceScrollContainer.js +34 -2
- package/dist/components/message/GroupMembersDrawer.d.ts.map +1 -1
- package/dist/components/message/GroupMembersDrawer.js +2 -3
- package/dist/components/message/MessageList.d.ts.map +1 -1
- package/dist/components/message/MessageList.js +15 -4
- package/dist/components/message/footer/ActionBar.d.ts.map +1 -1
- package/dist/components/message/footer/ActionBar.js +10 -44
- package/dist/components/message/footer/CannedResponsePlugin.d.ts.map +1 -1
- package/dist/components/message/footer/CannedResponsePlugin.js +3 -2
- package/dist/components/message/footer/EnterHandler.d.ts.map +1 -1
- package/dist/components/message/footer/EnterHandler.js +10 -47
- package/dist/components/message/footer/FilePreview.d.ts.map +1 -1
- package/dist/components/message/footer/FilePreview.js +2 -1
- package/dist/components/message/footer/LinkInputPreview.d.ts +1 -1
- package/dist/components/message/footer/LinkInputPreview.d.ts.map +1 -1
- package/dist/components/message/footer/LinkInputPreview.js +8 -1
- package/dist/components/message/footer/MediaUploadButtons.d.ts.map +1 -1
- package/dist/components/message/footer/MediaUploadButtons.js +4 -7
- package/dist/components/message/footer/index.d.ts.map +1 -1
- package/dist/components/message/footer/index.js +57 -16
- package/dist/components/message/footer/mention/useMentionOptions.d.ts.map +1 -1
- package/dist/components/message/footer/mention/useMentionOptions.js +2 -6
- package/dist/components/message/footer/resetEditorAfterSend.d.ts +7 -0
- package/dist/components/message/footer/resetEditorAfterSend.d.ts.map +1 -0
- package/dist/components/message/footer/resetEditorAfterSend.js +62 -0
- package/dist/components/message/groupMemberMenuCrm.d.ts +4 -4
- package/dist/components/message/groupMemberMenuCrm.d.ts.map +1 -1
- package/dist/components/message/groupMemberMenuCrm.js +73 -60
- package/dist/components/message/item/FileMessage.js +2 -2
- package/dist/components/message/item/SystemLogMessage.d.ts.map +1 -1
- package/dist/components/message/item/SystemLogMessage.js +5 -2
- package/dist/components/search-conversation/SearchConversationAsGroups.js +1 -1
- package/dist/components/search-conversation/SearchConversationAsMessages.js +1 -1
- package/dist/components/search-conversation/SearchConversationMyInbox.js +1 -1
- package/dist/components/session/SessionFolderList.d.ts +4 -3
- package/dist/components/session/SessionFolderList.d.ts.map +1 -1
- package/dist/components/session/SessionFolderList.js +14 -5
- package/dist/components/thread/GroupInfoBodyCrm.d.ts.map +1 -1
- package/dist/components/thread/GroupInfoBodyCrm.js +2 -2
- package/dist/components/thread/GroupThreadInfo.d.ts.map +1 -1
- package/dist/components/thread/GroupThreadInfo.js +2 -6
- package/dist/components/thread/ManualAssignPopover.d.ts.map +1 -1
- package/dist/components/thread/ManualAssignPopover.js +6 -8
- package/dist/components/thread/SessionDetailCard.d.ts.map +1 -1
- package/dist/components/thread/SessionDetailCard.js +3 -3
- package/dist/components/thread/SessionSection.d.ts.map +1 -1
- package/dist/components/thread/SessionSection.js +3 -9
- package/dist/components/thread/SessionTagPicker.d.ts +3 -1
- package/dist/components/thread/SessionTagPicker.d.ts.map +1 -1
- package/dist/components/thread/SessionTagPicker.js +2 -2
- package/dist/components/thread/sessionDateFormat.d.ts +2 -0
- package/dist/components/thread/sessionDateFormat.d.ts.map +1 -1
- package/dist/components/thread/sessionDateFormat.js +6 -0
- package/dist/constants/dateFormat.d.ts +2 -0
- package/dist/constants/dateFormat.d.ts.map +1 -0
- package/dist/constants/dateFormat.js +2 -0
- package/dist/hooks/common/useFetchUrlMetadata.d.ts +1 -0
- package/dist/hooks/common/useFetchUrlMetadata.d.ts.map +1 -1
- package/dist/hooks/conversation/useBotFlow.d.ts.map +1 -1
- package/dist/hooks/conversation/useBotFlow.js +64 -12
- package/dist/hooks/conversation/useCloseBotSession.d.ts +2 -0
- package/dist/hooks/conversation/useCloseBotSession.d.ts.map +1 -1
- package/dist/hooks/conversation/useCloseBotSession.js +17 -1
- package/dist/hooks/global/useGlobalEvent.d.ts.map +1 -1
- package/dist/hooks/global/useGlobalEvent.js +148 -16
- package/dist/hooks/global/useLoginHealth.d.ts +3 -0
- package/dist/hooks/global/useLoginHealth.d.ts.map +1 -0
- package/dist/hooks/global/useLoginHealth.js +55 -0
- package/dist/hooks/group/useCreateGroup.d.ts.map +1 -1
- package/dist/hooks/group/useCreateGroup.js +75 -6
- package/dist/hooks/init/useChatBootPhase.d.ts +2 -0
- package/dist/hooks/init/useChatBootPhase.d.ts.map +1 -1
- package/dist/hooks/init/useChatBootPhase.js +11 -6
- package/dist/hooks/message/useMessage.d.ts.map +1 -1
- package/dist/hooks/message/useMessage.js +97 -28
- package/dist/hooks/message/usePinnedMessages.d.ts.map +1 -1
- package/dist/hooks/message/usePinnedMessages.js +13 -2
- package/dist/hooks/message/useRevokeMessage.d.ts.map +1 -1
- package/dist/hooks/message/useRevokeMessage.js +25 -0
- package/dist/hooks/message/useSendMessage.d.ts +15 -12
- package/dist/hooks/message/useSendMessage.d.ts.map +1 -1
- package/dist/hooks/message/useSendMessage.js +199 -133
- package/dist/hooks/search/useSearchMessage.d.ts.map +1 -1
- package/dist/hooks/search/useSearchMessage.js +57 -3
- package/dist/hooks/session/useConversationSessionState.d.ts.map +1 -1
- package/dist/hooks/session/useConversationSessionState.js +4 -1
- package/dist/hooks/session/useGetSession.d.ts.map +1 -1
- package/dist/hooks/session/useGetSession.js +2 -0
- package/dist/hooks/session/useGetSessionList.d.ts +235 -0
- package/dist/hooks/session/useGetSessionList.d.ts.map +1 -0
- package/dist/hooks/session/useGetSessionList.js +23 -0
- package/dist/hooks/session/useSessionLatestPreview.d.ts.map +1 -1
- package/dist/hooks/session/useSessionLatestPreview.js +34 -4
- package/dist/hooks/user/useAuth.d.ts +1 -1
- package/dist/hooks/user/useAuth.d.ts.map +1 -1
- package/dist/hooks/user/useAuth.js +31 -15
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/locales/vi/boot.json +5 -1
- package/dist/locales/vi/common.json +35 -15
- package/dist/locales/vi/conversation-inbox.json +2 -1
- package/dist/screens/conversation-detail/index.d.ts.map +1 -1
- package/dist/screens/conversation-detail/index.js +6 -0
- package/dist/screens/desk-message/DeskBootCard.d.ts.map +1 -1
- package/dist/screens/desk-message/DeskBootCard.js +6 -4
- package/dist/store/boot.d.ts +5 -0
- package/dist/store/boot.d.ts.map +1 -1
- package/dist/store/boot.js +11 -1
- package/dist/store/conversation.d.ts.map +1 -1
- package/dist/store/conversation.js +5 -1
- package/dist/store/session.d.ts +1 -13
- package/dist/store/session.d.ts.map +1 -1
- package/dist/store/session.js +10 -9
- package/dist/store/sessionFolder.d.ts +2 -0
- package/dist/store/sessionFolder.d.ts.map +1 -1
- package/dist/store/sessionFolder.js +3 -1
- package/dist/store/type.d.ts +7 -1
- package/dist/store/type.d.ts.map +1 -1
- package/dist/styles/global.css +1 -1
- package/dist/types/chat.d.ts +1 -1
- package/dist/types/chat.d.ts.map +1 -1
- package/dist/utils/common.d.ts.map +1 -1
- package/dist/utils/common.js +4 -1
- package/dist/utils/download.d.ts +10 -0
- package/dist/utils/download.d.ts.map +1 -1
- package/dist/utils/download.js +51 -0
- package/dist/utils/fileValidation.d.ts +7 -0
- package/dist/utils/fileValidation.d.ts.map +1 -1
- package/dist/utils/fileValidation.js +37 -13
- package/dist/utils/latestMessagePreviewable.d.ts +2 -0
- package/dist/utils/latestMessagePreviewable.d.ts.map +1 -0
- package/dist/utils/latestMessagePreviewable.js +18 -0
- package/dist/utils/mentionMembers.d.ts +3 -0
- package/dist/utils/mentionMembers.d.ts.map +1 -0
- package/dist/utils/mentionMembers.js +29 -0
- package/dist/utils/messageLog.d.ts +2 -2
- package/dist/utils/messageLog.d.ts.map +1 -1
- package/dist/utils/messageLog.js +129 -40
- package/dist/utils/notifiableMessage.d.ts +7 -0
- package/dist/utils/notifiableMessage.d.ts.map +1 -0
- package/dist/utils/notifiableMessage.js +26 -0
- package/dist/utils/withSdkTimeout.d.ts +11 -0
- package/dist/utils/withSdkTimeout.d.ts.map +1 -0
- package/dist/utils/withSdkTimeout.js +30 -0
- package/package.json +1 -1
package/dist/types/chat.d.ts
CHANGED
|
@@ -145,7 +145,7 @@ export interface MessageFooterContextType {
|
|
|
145
145
|
type: "text" | "file";
|
|
146
146
|
isInternal: boolean;
|
|
147
147
|
mentions?: MentionSendPayload;
|
|
148
|
-
}) => boolean
|
|
148
|
+
}) => boolean | Promise<boolean>;
|
|
149
149
|
isInternal: boolean;
|
|
150
150
|
setIsInternal: (isInternal: boolean) => void;
|
|
151
151
|
listUploadFiles: UploadFile[];
|
package/dist/types/chat.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/types/chat.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../src/types/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/utils/common.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAEhB,WAAW,EACX,WAAW,EACZ,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,OAAO,EAAqB,eAAe,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAShD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD,eAAO,MAAM,iBAAiB,GAC5B,aAAa,MAAM,EACnB,WAAW,MAAM,KAChB,MAAmE,CAAC;AAEvE,eAAO,MAAM,mBAAmB,GAAI,CAAC,EAAE,UAAU,MAAM,KAAG,OAAO,CAAC,CAAC,CAQlE,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,KAAK,MAAM,KAAG,eAAe,GAAG,SAQhE,CAAC;AA+BF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/utils/common.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/common.js
CHANGED
|
@@ -48,6 +48,9 @@ const getSenderLabelForLatestPreview = (msgData, currentUserId, t, conversation)
|
|
|
48
48
|
};
|
|
49
49
|
const formatWithSender = (sender, content) => sender ? `${sender}: ${content}` : content;
|
|
50
50
|
export function formatDuration(seconds) {
|
|
51
|
+
// Streams without a known length report Infinity/NaN.
|
|
52
|
+
if (!Number.isFinite(seconds) || seconds < 0)
|
|
53
|
+
return "";
|
|
51
54
|
const minutes = Math.floor(seconds / 60);
|
|
52
55
|
const secs = Math.floor(seconds % 60);
|
|
53
56
|
return `${String(minutes).padStart(2, "0")}:${String(secs).padStart(2, "0")}`;
|
|
@@ -92,7 +95,7 @@ export const generateContentBasedOnMessageType = (contentType, plainText, t, med
|
|
|
92
95
|
case MessageType.MergeMessage:
|
|
93
96
|
return t ? t("msg_type_image") : "[Hình ảnh]";
|
|
94
97
|
case MessageType.StickerMessage:
|
|
95
|
-
return t ? t("msg_type_sticker") : "[
|
|
98
|
+
return t ? t("msg_type_sticker") : "[Sticker]";
|
|
96
99
|
case MessageType.VoiceMessage:
|
|
97
100
|
return t ? t("msg_type_voice") : "[Tin nhắn thoại]";
|
|
98
101
|
case MessageType.VideoMessage: {
|
package/dist/utils/download.d.ts
CHANGED
|
@@ -1,2 +1,12 @@
|
|
|
1
1
|
export declare const downloadFileFromUrl: (url: string, fileName?: string) => void;
|
|
2
|
+
export declare const getPreviewMimeType: (fileName?: string, url?: string) => string | undefined;
|
|
3
|
+
/**
|
|
4
|
+
* Open a file in a new tab when the browser can render it, download it otherwise.
|
|
5
|
+
*
|
|
6
|
+
* The storage answers `Content-Disposition: attachment`, so opening its URL
|
|
7
|
+
* always downloads. A previewable file is fetched and shown from a Blob URL typed
|
|
8
|
+
* with its real mime type; if that fetch fails (network, CORS) the file is
|
|
9
|
+
* downloaded instead. The tab is opened inside the click so popup blockers allow it.
|
|
10
|
+
*/
|
|
11
|
+
export declare const openFileOrDownload: (url: string, fileName?: string) => Promise<void>;
|
|
2
12
|
//# sourceMappingURL=download.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/utils/download.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,GAAI,KAAK,MAAM,EAAE,WAAW,MAAM,SAiBjE,CAAC"}
|
|
1
|
+
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/utils/download.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,GAAI,KAAK,MAAM,EAAE,WAAW,MAAM,SAiBjE,CAAC;AAYF,eAAO,MAAM,kBAAkB,GAC7B,WAAW,MAAM,EACjB,MAAM,MAAM,KACX,MAAM,GAAG,SACiE,CAAC;AAE9E;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,GAAU,KAAK,MAAM,EAAE,WAAW,MAAM,kBA6BtE,CAAC"}
|
package/dist/utils/download.js
CHANGED
|
@@ -14,3 +14,54 @@ export const downloadFileFromUrl = (url, fileName) => {
|
|
|
14
14
|
link.click();
|
|
15
15
|
link.remove();
|
|
16
16
|
};
|
|
17
|
+
/** File types a browser can render inline; anything else is only downloaded. */
|
|
18
|
+
const PREVIEWABLE_FILE_TYPES = {
|
|
19
|
+
pdf: "application/pdf",
|
|
20
|
+
};
|
|
21
|
+
const getFileExtension = (name) => {
|
|
22
|
+
var _a;
|
|
23
|
+
const match = /\.([a-z0-9]+)$/i.exec((_a = name === null || name === void 0 ? void 0 : name.split("?")[0]) !== null && _a !== void 0 ? _a : "");
|
|
24
|
+
return match ? match[1].toLowerCase() : "";
|
|
25
|
+
};
|
|
26
|
+
export const getPreviewMimeType = (fileName, url) => PREVIEWABLE_FILE_TYPES[getFileExtension(fileName) || getFileExtension(url)];
|
|
27
|
+
/**
|
|
28
|
+
* Open a file in a new tab when the browser can render it, download it otherwise.
|
|
29
|
+
*
|
|
30
|
+
* The storage answers `Content-Disposition: attachment`, so opening its URL
|
|
31
|
+
* always downloads. A previewable file is fetched and shown from a Blob URL typed
|
|
32
|
+
* with its real mime type; if that fetch fails (network, CORS) the file is
|
|
33
|
+
* downloaded instead. The tab is opened inside the click so popup blockers allow it.
|
|
34
|
+
*/
|
|
35
|
+
export const openFileOrDownload = async (url, fileName) => {
|
|
36
|
+
if (!url || typeof window === "undefined") {
|
|
37
|
+
downloadFileFromUrl(url, fileName);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const mimeType = getPreviewMimeType(fileName, url);
|
|
41
|
+
if (!mimeType) {
|
|
42
|
+
downloadFileFromUrl(url, fileName);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const previewTab = window.open("", "_blank");
|
|
46
|
+
if (previewTab)
|
|
47
|
+
previewTab.opener = null;
|
|
48
|
+
try {
|
|
49
|
+
const response = await fetch(url);
|
|
50
|
+
if (!response.ok)
|
|
51
|
+
throw new Error(`HTTP ${response.status}`);
|
|
52
|
+
const blob = new Blob([await response.arrayBuffer()], { type: mimeType });
|
|
53
|
+
const blobUrl = URL.createObjectURL(blob);
|
|
54
|
+
if (previewTab) {
|
|
55
|
+
previewTab.location.href = blobUrl;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
window.open(blobUrl, "_blank");
|
|
59
|
+
}
|
|
60
|
+
// Keep the URL alive while the tab loads it.
|
|
61
|
+
setTimeout(() => URL.revokeObjectURL(blobUrl), 60000);
|
|
62
|
+
}
|
|
63
|
+
catch (_a) {
|
|
64
|
+
previewTab === null || previewTab === void 0 ? void 0 : previewTab.close();
|
|
65
|
+
downloadFileFromUrl(url, fileName);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
@@ -2,9 +2,16 @@ import { UploadFile } from "antd";
|
|
|
2
2
|
import { TFunction } from "i18next";
|
|
3
3
|
export declare const ACCEPTED_IMAGE_TYPES: string[];
|
|
4
4
|
export declare const MAX_IMAGE_SIZE_MB = 15;
|
|
5
|
+
export declare const OBEFE_MAX_IMAGE_SIZE_MB = 5;
|
|
5
6
|
export declare const MAX_VIDEO_SIZE_MB = 200;
|
|
6
7
|
export declare const MAX_DOCUMENT_SIZE_MB = 20;
|
|
7
8
|
export declare const DOCUMENT_MIME_TYPES: string[];
|
|
9
|
+
export declare const getMaxImageSizeMB: () => 5 | 15;
|
|
10
|
+
export type AttachmentKind = "image" | "video" | "document";
|
|
11
|
+
export declare const getAttachmentSizeError: (t: TFunction, file: File, kind: AttachmentKind, maxSize: number) => string;
|
|
12
|
+
export declare const getDocumentFormatError: (t: TFunction, file: File) => string;
|
|
13
|
+
export declare const getImageFormatError: (t: TFunction, file: File) => string;
|
|
14
|
+
export declare const getMediaFormatError: (t: TFunction, file: File) => string;
|
|
8
15
|
export interface FileValidationOptions {
|
|
9
16
|
t: TFunction;
|
|
10
17
|
}
|
|
@@ -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;
|
|
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;AAIpC,eAAO,MAAM,oBAAoB,UAAyD,CAAC;AAC3F,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,mBAAmB,UAI/B,CAAC;AAYF,eAAO,MAAM,iBAAiB,cAGP,CAAC;AAExB,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;AAE5D,eAAO,MAAM,sBAAsB,GACjC,GAAG,SAAS,EACZ,MAAM,IAAI,EACV,MAAM,cAAc,EACpB,SAAS,MAAM,KACd,MAUI,CAAC;AAER,eAAO,MAAM,sBAAsB,GAAI,GAAG,SAAS,EAAE,MAAM,IAAI,KAAG,MAGP,CAAC;AAE5D,eAAO,MAAM,mBAAmB,GAAI,GAAG,SAAS,EAAE,MAAM,IAAI,KAAG,MAGP,CAAC;AAEzD,eAAO,MAAM,mBAAmB,GAAI,GAAG,SAAS,EAAE,MAAM,IAAI,KAAG,MAGR,CAAC;AAExD,MAAM,WAAW,qBAAqB;IACpC,CAAC,EAAE,SAAS,CAAC;CACd;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,eAAO,MAAM,gBAAgB,GAAI,MAAM,IAAI,KAAG,UAO5C,CAAC;AAEH,eAAO,MAAM,2BAA2B,GACtC,OAAO,IAAI,EAAE,EACb,GAAG,SAAS,KACX,UAAU,EAuBZ,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,GAClC,OAAO,IAAI,EAAE,EACb,SAAS,qBAAqB,KAC7B,UAAU,EAwBZ,CAAC"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { message as antdMessage } from "antd";
|
|
2
|
+
import useAuthStore from "../store/auth";
|
|
3
|
+
import { DChatApplicationType } from "../types/chat";
|
|
2
4
|
export const ACCEPTED_IMAGE_TYPES = ["image/jpeg", "image/png", "image/jpg", "image/webp"];
|
|
3
5
|
export const MAX_IMAGE_SIZE_MB = 15;
|
|
6
|
+
export const OBEFE_MAX_IMAGE_SIZE_MB = 5;
|
|
4
7
|
export const MAX_VIDEO_SIZE_MB = 200;
|
|
5
8
|
export const MAX_DOCUMENT_SIZE_MB = 20;
|
|
6
9
|
export const DOCUMENT_MIME_TYPES = [
|
|
@@ -8,6 +11,35 @@ export const DOCUMENT_MIME_TYPES = [
|
|
|
8
11
|
"application/msword",
|
|
9
12
|
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
10
13
|
];
|
|
14
|
+
// BIZ (seller) specs word these toasts without the file name; every other
|
|
15
|
+
// surface keeps the file-name wording. Read at validation time because the
|
|
16
|
+
// application type arrives after the SDK mounts.
|
|
17
|
+
const usesBizAttachmentWording = () => {
|
|
18
|
+
const { applicationType, isCrm } = useAuthStore.getState();
|
|
19
|
+
return applicationType === DChatApplicationType.DROPPII && !isCrm;
|
|
20
|
+
};
|
|
21
|
+
// Obefe limits images to 5MB. Read at validation time: the store holds the
|
|
22
|
+
// OBEFE default until ChatContext sets the host's real application type.
|
|
23
|
+
export const getMaxImageSizeMB = () => useAuthStore.getState().applicationType === DChatApplicationType.OBEFE
|
|
24
|
+
? OBEFE_MAX_IMAGE_SIZE_MB
|
|
25
|
+
: MAX_IMAGE_SIZE_MB;
|
|
26
|
+
export const getAttachmentSizeError = (t, file, kind, maxSize) => usesBizAttachmentWording()
|
|
27
|
+
? t(`biz_${kind}_size_exceeded`, { maxSize })
|
|
28
|
+
: t(
|
|
29
|
+
// The Obefe spec quotes the name only in the image size error.
|
|
30
|
+
kind === "image" &&
|
|
31
|
+
useAuthStore.getState().applicationType === DChatApplicationType.OBEFE
|
|
32
|
+
? "obefe_file_size_exceeded"
|
|
33
|
+
: "file_size_exceeded", { fileName: file.name, maxSize });
|
|
34
|
+
export const getDocumentFormatError = (t, file) => usesBizAttachmentWording()
|
|
35
|
+
? t("biz_document_invalid_format")
|
|
36
|
+
: t("invalid_document_format", { fileName: file.name });
|
|
37
|
+
export const getImageFormatError = (t, file) => usesBizAttachmentWording()
|
|
38
|
+
? t("biz_image_invalid_format")
|
|
39
|
+
: t("invalid_image_format", { fileName: file.name });
|
|
40
|
+
export const getMediaFormatError = (t, file) => usesBizAttachmentWording()
|
|
41
|
+
? t("biz_media_invalid_format")
|
|
42
|
+
: t("invalid_file_format", { fileName: file.name });
|
|
11
43
|
/**
|
|
12
44
|
* Validates a single file for type and size
|
|
13
45
|
*/
|
|
@@ -15,18 +47,13 @@ export const validateFile = (file, t) => {
|
|
|
15
47
|
const isImage = ACCEPTED_IMAGE_TYPES.includes(file.type);
|
|
16
48
|
const isVideo = file.type.startsWith("video/");
|
|
17
49
|
if (!isImage && !isVideo) {
|
|
18
|
-
const error = t
|
|
19
|
-
fileName: file.name,
|
|
20
|
-
});
|
|
50
|
+
const error = getMediaFormatError(t, file);
|
|
21
51
|
return { isValid: false, error };
|
|
22
52
|
}
|
|
23
|
-
const maxSize = isVideo ? MAX_VIDEO_SIZE_MB :
|
|
53
|
+
const maxSize = isVideo ? MAX_VIDEO_SIZE_MB : getMaxImageSizeMB();
|
|
24
54
|
const fileSizeMB = file.size / 1024 / 1024;
|
|
25
55
|
if (fileSizeMB > maxSize) {
|
|
26
|
-
const error = t
|
|
27
|
-
fileName: file.name,
|
|
28
|
-
maxSize,
|
|
29
|
-
});
|
|
56
|
+
const error = getAttachmentSizeError(t, file, isVideo ? "video" : "image", maxSize);
|
|
30
57
|
return { isValid: false, error };
|
|
31
58
|
}
|
|
32
59
|
return { isValid: true };
|
|
@@ -44,15 +71,12 @@ export const processAndValidateDocuments = (files, t) => {
|
|
|
44
71
|
return files
|
|
45
72
|
.filter((file) => {
|
|
46
73
|
if (!DOCUMENT_MIME_TYPES.includes(file.type)) {
|
|
47
|
-
antdMessage.error(t
|
|
74
|
+
antdMessage.error(getDocumentFormatError(t, file));
|
|
48
75
|
return false;
|
|
49
76
|
}
|
|
50
77
|
const fileSizeMB = file.size / 1024 / 1024;
|
|
51
78
|
if (fileSizeMB > MAX_DOCUMENT_SIZE_MB) {
|
|
52
|
-
antdMessage.error(t
|
|
53
|
-
fileName: file.name,
|
|
54
|
-
maxSize: MAX_DOCUMENT_SIZE_MB,
|
|
55
|
-
}));
|
|
79
|
+
antdMessage.error(getAttachmentSizeError(t, file, "document", MAX_DOCUMENT_SIZE_MB));
|
|
56
80
|
return false;
|
|
57
81
|
}
|
|
58
82
|
return true;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"latestMessagePreviewable.d.ts","sourceRoot":"","sources":["../../src/utils/latestMessagePreviewable.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,0BAA0B,GAAI,YAAY,MAAM,KAAG,OAGhB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { parseLatestMessage } from "../utils/common";
|
|
2
|
+
import { SESSION_END_MARKER, SESSION_START_MARKER } from "../utils/messageLog";
|
|
3
|
+
const isSessionMarker = (latestMsg) => {
|
|
4
|
+
var _a, _b;
|
|
5
|
+
try {
|
|
6
|
+
const data = (_b = (_a = JSON.parse(latestMsg)) === null || _a === void 0 ? void 0 : _a.customElem) === null || _b === void 0 ? void 0 : _b.data;
|
|
7
|
+
return data === SESSION_START_MARKER || data === SESSION_END_MARKER;
|
|
8
|
+
}
|
|
9
|
+
catch (_c) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
// Desk rows should show a real message. Logs, session markers and hidden
|
|
14
|
+
// customs parse to nothing (or only a marker line), so the row looks for an
|
|
15
|
+
// older message instead of reading "Chưa có tin nhắn".
|
|
16
|
+
export const isPreviewableLatestMessage = (latestMsg) => Boolean(latestMsg) &&
|
|
17
|
+
!isSessionMarker(latestMsg) &&
|
|
18
|
+
parseLatestMessage(latestMsg) !== "";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mentionMembers.d.ts","sourceRoot":"","sources":["../../src/utils/mentionMembers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAOvD,eAAO,MAAM,2BAA2B,GACtC,SAAS,MAAM,GAAG,SAAS,EAC3B,UAAU,kBAAkB,KAC3B,OAAO,CAAC,kBAAkB,CA6B5B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { DChatSDK } from "../constants/sdk";
|
|
2
|
+
import { withSdkTimeout } from "../utils/withSdkTimeout";
|
|
3
|
+
// Members can leave between picking an @mention and sending; core rejects or
|
|
4
|
+
// mis-tags the message when the list holds someone who is no longer in the group.
|
|
5
|
+
// An unknown answer (error, timeout, or core's nil result when the group is not
|
|
6
|
+
// in its local joined list yet) keeps the mentions as picked rather than blocking the send.
|
|
7
|
+
export const keepCurrentGroupMembersOnly = async (groupID, mentions) => {
|
|
8
|
+
if (!groupID || mentions.atUserIDList.length === 0)
|
|
9
|
+
return mentions;
|
|
10
|
+
let currentIDs;
|
|
11
|
+
try {
|
|
12
|
+
const { data } = await withSdkTimeout(DChatSDK.getSpecifiedGroupMembersInfo({
|
|
13
|
+
groupID,
|
|
14
|
+
userIDList: mentions.atUserIDList,
|
|
15
|
+
}), "getSpecifiedGroupMembersInfo");
|
|
16
|
+
if (data == null)
|
|
17
|
+
return mentions;
|
|
18
|
+
currentIDs = new Set(data.map((member) => member.userID));
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
console.warn("mention member lookup failed", error);
|
|
22
|
+
return mentions;
|
|
23
|
+
}
|
|
24
|
+
if (mentions.atUserIDList.every((id) => currentIDs.has(id)))
|
|
25
|
+
return mentions;
|
|
26
|
+
// "Tag all" offsets use the all-members sentinel as userID and are never stale.
|
|
27
|
+
const stale = new Set(mentions.atUserIDList.filter((id) => !currentIDs.has(id)));
|
|
28
|
+
return Object.assign(Object.assign({}, mentions), { atUserIDList: mentions.atUserIDList.filter((id) => !stale.has(id)), atUsersInfo: mentions.atUsersInfo.filter((info) => !stale.has(info.atUserID)), mentionOffsets: mentions.mentionOffsets.filter((offset) => !stale.has(offset.userID)) });
|
|
29
|
+
};
|
|
@@ -9,6 +9,6 @@ export declare const GROUP_NOTIFICATION_MESSAGE_TYPES: readonly [MessageType.Gro
|
|
|
9
9
|
export declare const isGroupNotificationMessageType: (contentType?: number) => boolean;
|
|
10
10
|
export declare const getGroupNotificationText: (contentType: number | undefined, detailJson: string | undefined, t?: TFunction, senderNickname?: string) => string;
|
|
11
11
|
export declare const isSystemLogMessageType: (contentType?: number) => contentType is MessageType.LogTextMessage;
|
|
12
|
-
export declare const getSystemLogMessageText: (message: Partial<MessageItem
|
|
13
|
-
export declare const getSystemLogMessageHtml: (message: Partial<MessageItem
|
|
12
|
+
export declare const getSystemLogMessageText: (message: Partial<MessageItem>, viewerId?: string, t?: TFunction) => string;
|
|
13
|
+
export declare const getSystemLogMessageHtml: (message: Partial<MessageItem>, viewerId?: string, t?: TFunction) => string;
|
|
14
14
|
//# sourceMappingURL=messageLog.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messageLog.d.ts","sourceRoot":"","sources":["../../src/utils/messageLog.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,WAAW,EACZ,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,eAAO,MAAM,wBAAwB,uCAAwC,CAAC;AAI9E,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AACvD,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AAKnD,eAAO,MAAM,qBAAqB,GAAI,UAAU,OAAO,CAAC,WAAW,CAAC,YAGf,CAAC;AAEtD,eAAO,MAAM,mBAAmB,GAC9B,SAAS,OAAO,CAAC,WAAW,CAAC,EAC7B,IAAI,SAAS,KACZ,MAQF,CAAC;AAEF,eAAO,MAAM,gCAAgC,6dAmBnC,CAAC;AAEX,eAAO,MAAM,8BAA8B,GAAI,cAAc,MAAM,YAGhE,CAAC;AAoDJ,eAAO,MAAM,wBAAwB,GACnC,aAAa,MAAM,GAAG,SAAS,EAC/B,YAAY,MAAM,GAAG,SAAS,EAC9B,IAAI,SAAS,EACb,iBAAiB,MAAM,KACtB,MAmJF,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,cAAc,MAAM,8CACf,CAAC;
|
|
1
|
+
{"version":3,"file":"messageLog.d.ts","sourceRoot":"","sources":["../../src/utils/messageLog.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,WAAW,EACZ,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,eAAO,MAAM,wBAAwB,uCAAwC,CAAC;AAI9E,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AACvD,eAAO,MAAM,kBAAkB,mBAAmB,CAAC;AAKnD,eAAO,MAAM,qBAAqB,GAAI,UAAU,OAAO,CAAC,WAAW,CAAC,YAGf,CAAC;AAEtD,eAAO,MAAM,mBAAmB,GAC9B,SAAS,OAAO,CAAC,WAAW,CAAC,EAC7B,IAAI,SAAS,KACZ,MAQF,CAAC;AAEF,eAAO,MAAM,gCAAgC,6dAmBnC,CAAC;AAEX,eAAO,MAAM,8BAA8B,GAAI,cAAc,MAAM,YAGhE,CAAC;AAoDJ,eAAO,MAAM,wBAAwB,GACnC,aAAa,MAAM,GAAG,SAAS,EAC/B,YAAY,MAAM,GAAG,SAAS,EAC9B,IAAI,SAAS,EACb,iBAAiB,MAAM,KACtB,MAmJF,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,cAAc,MAAM,8CACf,CAAC;AAsI7C,eAAO,MAAM,uBAAuB,GAClC,SAAS,OAAO,CAAC,WAAW,CAAC,EAC7B,WAAW,MAAM,EACjB,IAAI,SAAS,WAed,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,SAAS,OAAO,CAAC,WAAW,CAAC,EAC7B,WAAW,MAAM,EACjB,IAAI,SAAS,WASd,CAAC"}
|
package/dist/utils/messageLog.js
CHANGED
|
@@ -100,7 +100,7 @@ export const getGroupNotificationText = (contentType, detailJson, t, senderNickn
|
|
|
100
100
|
name: opUserName,
|
|
101
101
|
groupName: ((_b = detail.group) === null || _b === void 0 ? void 0 : _b.groupName) || "",
|
|
102
102
|
}))
|
|
103
|
-
: `${opUserName} đã đổi tên nhóm thành
|
|
103
|
+
: `${opUserName} đã đổi tên nhóm thành ${((_c = detail.group) === null || _c === void 0 ? void 0 : _c.groupName) || ""}`;
|
|
104
104
|
case MessageType.GroupAnnouncementUpdated:
|
|
105
105
|
return t
|
|
106
106
|
? String(t("group_notification_announcement_updated", { name: opUserName }))
|
|
@@ -117,7 +117,7 @@ export const getGroupNotificationText = (contentType, detailJson, t, senderNickn
|
|
|
117
117
|
name: opUserName,
|
|
118
118
|
newOwner: ((_f = detail.newGroupOwner) === null || _f === void 0 ? void 0 : _f.nickname) || "",
|
|
119
119
|
}))
|
|
120
|
-
: `${opUserName} đã chuyển quyền
|
|
120
|
+
: `${opUserName} đã chuyển quyền chủ nhóm cho ${((_g = detail.newGroupOwner) === null || _g === void 0 ? void 0 : _g.nickname) || ""}`;
|
|
121
121
|
case MessageType.MemberKicked:
|
|
122
122
|
return t
|
|
123
123
|
? String(t("group_notification_member_kicked", {
|
|
@@ -176,57 +176,146 @@ export const getGroupNotificationText = (contentType, detailJson, t, senderNickn
|
|
|
176
176
|
name: opUserName,
|
|
177
177
|
target: ((_r = detail.changedUser) === null || _r === void 0 ? void 0 : _r.nickname) || "",
|
|
178
178
|
}))
|
|
179
|
-
: `${opUserName} đã
|
|
179
|
+
: `${opUserName} đã đặt ${((_s = detail.changedUser) === null || _s === void 0 ? void 0 : _s.nickname) || ""} làm quản trị viên`;
|
|
180
180
|
default:
|
|
181
181
|
return "";
|
|
182
182
|
}
|
|
183
183
|
};
|
|
184
184
|
export const isSystemLogMessageType = (contentType) => contentType === MessageType.LogTextMessage;
|
|
185
|
-
|
|
185
|
+
const parseLogPayload = (message) => {
|
|
186
186
|
var _a;
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
return typeof (parsed === null || parsed === void 0 ? void 0 : parsed.message) === "string"
|
|
191
|
-
? parsed.message.trim()
|
|
192
|
-
: message.logTextElem.content.trim();
|
|
193
|
-
}
|
|
194
|
-
catch (_b) {
|
|
195
|
-
return message.logTextElem.content.trim();
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
if (!message.ex)
|
|
199
|
-
return "";
|
|
187
|
+
const raw = ((_a = message.logTextElem) === null || _a === void 0 ? void 0 : _a.content) || message.ex;
|
|
188
|
+
if (!raw)
|
|
189
|
+
return null;
|
|
200
190
|
try {
|
|
201
|
-
const parsed = JSON.parse(
|
|
202
|
-
return
|
|
191
|
+
const parsed = JSON.parse(raw);
|
|
192
|
+
return parsed && typeof parsed === "object" ? parsed : null;
|
|
203
193
|
}
|
|
204
|
-
catch (
|
|
205
|
-
return
|
|
194
|
+
catch (_b) {
|
|
195
|
+
return null;
|
|
206
196
|
}
|
|
207
197
|
};
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
}
|
|
217
|
-
|
|
198
|
+
// vi defaults mirror locales/vi/common.json so callers without `t` still read right.
|
|
199
|
+
const SESSION_LOG_TEMPLATES = {
|
|
200
|
+
ACTOR_REASSIGN_SUPPORTER: {
|
|
201
|
+
key: "system_log_actor_reassign",
|
|
202
|
+
text: "{{actor}} đã bỏ phân công {{old}} và phân công cho {{new}}",
|
|
203
|
+
},
|
|
204
|
+
ACTOR_FIRST_ASSIGN_SUPPORTER: {
|
|
205
|
+
key: "system_log_actor_first_assign",
|
|
206
|
+
text: "{{actor}} đã phân công cho {{new}}",
|
|
207
|
+
},
|
|
208
|
+
SYSTEM_AUTO_ASSIGN_SESSION: {
|
|
209
|
+
key: "system_log_auto_assign",
|
|
210
|
+
text: "Hệ thống đã phân công cho {{new}}",
|
|
211
|
+
},
|
|
212
|
+
SUPPORTER_JOIN_SESSION: {
|
|
213
|
+
key: "system_log_supporter_join",
|
|
214
|
+
text: "{{new}} đã tham gia nhóm",
|
|
215
|
+
},
|
|
216
|
+
SYSTEM_AUTO_REASSIGN_SESSION: {
|
|
217
|
+
key: "system_log_auto_reassign",
|
|
218
|
+
text: "Phân công tự động: hệ thống đã bỏ phân công {{old}} và phân công cho {{new}}",
|
|
219
|
+
},
|
|
220
|
+
SYSTEM_REMOVE_MEMBER_GROUP: {
|
|
221
|
+
key: "system_log_remove_member",
|
|
222
|
+
text: "Hệ thống đã xóa {{old}} khỏi nhóm",
|
|
223
|
+
},
|
|
224
|
+
SUPPORTER_LEAVE_GROUP: {
|
|
225
|
+
key: "system_log_supporter_leave",
|
|
226
|
+
text: "{{actor}} đã rời khỏi nhóm",
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
const escapeHtml = (value) => value
|
|
230
|
+
.replace(/&/g, "&")
|
|
231
|
+
.replace(/</g, "<")
|
|
232
|
+
.replace(/>/g, ">")
|
|
233
|
+
.replace(/"/g, """)
|
|
234
|
+
.replace(/'/g, "'");
|
|
235
|
+
const asId = (value) => typeof value === "string" && value ? value.toLowerCase() : "";
|
|
236
|
+
// Rebuilds the sentence for the viewer only when the viewer is a party to the
|
|
237
|
+
// event; otherwise (or with old logs lacking the fields) the BE text stays as is.
|
|
238
|
+
const buildViewerSessionLog = (payload, viewerId, t, html) => {
|
|
239
|
+
const template = typeof payload.type === "string"
|
|
240
|
+
? SESSION_LOG_TEMPLATES[payload.type]
|
|
241
|
+
: undefined;
|
|
242
|
+
const viewer = asId(viewerId);
|
|
243
|
+
if (!template || !viewer)
|
|
244
|
+
return null;
|
|
245
|
+
const actor = asId(payload.actorId);
|
|
246
|
+
const oldId = asId(payload.oldSupporterId);
|
|
247
|
+
const newId = asId(payload.newSupporterId);
|
|
248
|
+
if (viewer !== actor && viewer !== oldId && viewer !== newId)
|
|
249
|
+
return null;
|
|
250
|
+
const names = payload.names && typeof payload.names === "object"
|
|
251
|
+
? payload.names
|
|
252
|
+
: {};
|
|
253
|
+
const lookupName = (id) => {
|
|
254
|
+
var _a;
|
|
255
|
+
const hit = (_a = Object.entries(names).find(([key]) => asId(key) === id)) === null || _a === void 0 ? void 0 : _a[1];
|
|
256
|
+
return typeof hit === "string" && hit ? hit : "";
|
|
257
|
+
};
|
|
258
|
+
const wrap = (value) => html ? `<b>${escapeHtml(value)}</b>` : value;
|
|
259
|
+
const tr = (key, fallback) => t ? String(t(key)) : fallback;
|
|
260
|
+
// Self-assignment reads "chính mình" for everyone, matching the BE wording.
|
|
261
|
+
const resolve = (id, isActorSlot) => {
|
|
262
|
+
if (!id)
|
|
218
263
|
return "";
|
|
264
|
+
if (isActorSlot) {
|
|
265
|
+
return id === viewer
|
|
266
|
+
? wrap(tr("system_log_viewer_start", "Bạn"))
|
|
267
|
+
: wrap(lookupName(id));
|
|
219
268
|
}
|
|
269
|
+
if (actor && id === actor)
|
|
270
|
+
return tr("system_log_self", "chính mình");
|
|
271
|
+
return id === viewer
|
|
272
|
+
? wrap(tr("system_log_viewer", "bạn"))
|
|
273
|
+
: wrap(lookupName(id));
|
|
274
|
+
};
|
|
275
|
+
const params = {
|
|
276
|
+
actor: resolve(actor, true),
|
|
277
|
+
old: resolve(oldId, false),
|
|
278
|
+
new: resolve(newId, false),
|
|
279
|
+
};
|
|
280
|
+
// A slot the template uses must resolve to a real name.
|
|
281
|
+
const needs = (slot) => template.text.includes(`{{${slot}}}`);
|
|
282
|
+
if ((needs("actor") && (!actor || params.actor === wrap(""))) ||
|
|
283
|
+
(needs("old") && (!oldId || params.old === wrap(""))) ||
|
|
284
|
+
(needs("new") && (!newId || params.new === wrap("")))) {
|
|
285
|
+
return null;
|
|
220
286
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
const parsed = JSON.parse(message.ex);
|
|
225
|
-
return typeof (parsed === null || parsed === void 0 ? void 0 : parsed.messageHtml) === "string"
|
|
226
|
-
? parsed.messageHtml.trim()
|
|
227
|
-
: "";
|
|
287
|
+
// The start-of-sentence "Bạn" applies to the new-member slot of join logs too.
|
|
288
|
+
if (payload.type === "SUPPORTER_JOIN_SESSION" && newId === viewer) {
|
|
289
|
+
params.new = wrap(tr("system_log_viewer_start", "Bạn"));
|
|
228
290
|
}
|
|
229
|
-
|
|
230
|
-
|
|
291
|
+
const sentence = t
|
|
292
|
+
? String(t(template.key, params))
|
|
293
|
+
: template.text.replace(/\{\{(actor|old|new)\}\}/g, (_, slot) => { var _a; return (_a = params[slot]) !== null && _a !== void 0 ? _a : ""; });
|
|
294
|
+
return html ? `<span>${sentence}</span>` : sentence;
|
|
295
|
+
};
|
|
296
|
+
export const getSystemLogMessageText = (message, viewerId, t) => {
|
|
297
|
+
var _a;
|
|
298
|
+
const payload = parseLogPayload(message);
|
|
299
|
+
if (payload) {
|
|
300
|
+
const rebuilt = buildViewerSessionLog(payload, viewerId, t, false);
|
|
301
|
+
if (rebuilt)
|
|
302
|
+
return rebuilt;
|
|
303
|
+
}
|
|
304
|
+
if ((_a = message.logTextElem) === null || _a === void 0 ? void 0 : _a.content) {
|
|
305
|
+
return typeof (payload === null || payload === void 0 ? void 0 : payload.message) === "string"
|
|
306
|
+
? payload.message.trim()
|
|
307
|
+
: message.logTextElem.content.trim();
|
|
231
308
|
}
|
|
309
|
+
return typeof (payload === null || payload === void 0 ? void 0 : payload.message) === "string" ? payload.message.trim() : "";
|
|
310
|
+
};
|
|
311
|
+
export const getSystemLogMessageHtml = (message, viewerId, t) => {
|
|
312
|
+
const payload = parseLogPayload(message);
|
|
313
|
+
if (!payload)
|
|
314
|
+
return "";
|
|
315
|
+
const rebuilt = buildViewerSessionLog(payload, viewerId, t, true);
|
|
316
|
+
if (rebuilt)
|
|
317
|
+
return rebuilt;
|
|
318
|
+
return typeof payload.messageHtml === "string"
|
|
319
|
+
? payload.messageHtml.trim()
|
|
320
|
+
: "";
|
|
232
321
|
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether a conversation's latest message deserves a browser notification: a real
|
|
3
|
+
* message from someone else. Own sends, system logs, group notices and session
|
|
4
|
+
* markers stay silent.
|
|
5
|
+
*/
|
|
6
|
+
export declare const isNotifiableLatestMessage: (latestMsg: string | undefined, selfUserID: string | undefined) => boolean;
|
|
7
|
+
//# sourceMappingURL=notifiableMessage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notifiableMessage.d.ts","sourceRoot":"","sources":["../../src/utils/notifiableMessage.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GACpC,WAAW,MAAM,GAAG,SAAS,EAC7B,YAAY,MAAM,GAAG,SAAS,KAC7B,OAgBF,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { isEventCustomMessage } from "../utils/customMessage";
|
|
2
|
+
import { isGroupNotificationMessageType, isSessionEventMessage, isSystemLogMessageType, } from "../utils/messageLog";
|
|
3
|
+
/**
|
|
4
|
+
* Whether a conversation's latest message deserves a browser notification: a real
|
|
5
|
+
* message from someone else. Own sends, system logs, group notices and session
|
|
6
|
+
* markers stay silent.
|
|
7
|
+
*/
|
|
8
|
+
export const isNotifiableLatestMessage = (latestMsg, selfUserID) => {
|
|
9
|
+
if (!latestMsg)
|
|
10
|
+
return false;
|
|
11
|
+
let message;
|
|
12
|
+
try {
|
|
13
|
+
message = JSON.parse(latestMsg);
|
|
14
|
+
}
|
|
15
|
+
catch (_a) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
if (!(message === null || message === void 0 ? void 0 : message.contentType))
|
|
19
|
+
return false;
|
|
20
|
+
if (selfUserID && message.sendID === selfUserID)
|
|
21
|
+
return false;
|
|
22
|
+
return !(isSystemLogMessageType(message.contentType) ||
|
|
23
|
+
isGroupNotificationMessageType(message.contentType) ||
|
|
24
|
+
isSessionEventMessage(message) ||
|
|
25
|
+
isEventCustomMessage(message));
|
|
26
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const SDK_CALL_TIMEOUT_MS = 15000;
|
|
2
|
+
/** Failure of an SDK call, carrying core's error code when it sent one. */
|
|
3
|
+
export declare class SdkCallError extends Error {
|
|
4
|
+
readonly code?: number;
|
|
5
|
+
constructor(label: string, cause?: unknown);
|
|
6
|
+
}
|
|
7
|
+
export declare class SdkTimeoutError extends SdkCallError {
|
|
8
|
+
constructor(label: string, ms: number);
|
|
9
|
+
}
|
|
10
|
+
export declare const withSdkTimeout: <T>(promise: Promise<T>, label: string, ms?: number) => Promise<T>;
|
|
11
|
+
//# sourceMappingURL=withSdkTimeout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"withSdkTimeout.d.ts","sourceRoot":"","sources":["../../src/utils/withSdkTimeout.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAE1C,2EAA2E;AAC3E,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBAEX,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAO3C;AAED,qBAAa,eAAgB,SAAQ,YAAY;gBACnC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;CAKtC;AAED,eAAO,MAAM,cAAc,GAAI,CAAC,EAC9B,SAAS,OAAO,CAAC,CAAC,CAAC,EACnB,OAAO,MAAM,EACb,WAAwB,KACvB,OAAO,CAAC,CAAC,CAaR,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// A wasm call whose worker or connection stalled never settles (core's own RPC
|
|
2
|
+
// timeout is over an hour), which froze the composer and the group dialog.
|
|
3
|
+
export const SDK_CALL_TIMEOUT_MS = 15000;
|
|
4
|
+
/** Failure of an SDK call, carrying core's error code when it sent one. */
|
|
5
|
+
export class SdkCallError extends Error {
|
|
6
|
+
constructor(label, cause) {
|
|
7
|
+
const { errCode, errMsg } = (cause !== null && cause !== void 0 ? cause : {});
|
|
8
|
+
super(`${label} failed${errMsg ? `: ${errMsg}` : ""}`);
|
|
9
|
+
this.name = "SdkCallError";
|
|
10
|
+
this.code = errCode;
|
|
11
|
+
this.cause = cause;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export class SdkTimeoutError extends SdkCallError {
|
|
15
|
+
constructor(label, ms) {
|
|
16
|
+
super(label);
|
|
17
|
+
this.message = `${label} timed out after ${ms}ms`;
|
|
18
|
+
this.name = "SdkTimeoutError";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export const withSdkTimeout = (promise, label, ms = SDK_CALL_TIMEOUT_MS) => new Promise((resolve, reject) => {
|
|
22
|
+
const timer = setTimeout(() => reject(new SdkTimeoutError(label, ms)), ms);
|
|
23
|
+
promise.then((value) => {
|
|
24
|
+
clearTimeout(timer);
|
|
25
|
+
resolve(value);
|
|
26
|
+
}, (error) => {
|
|
27
|
+
clearTimeout(timer);
|
|
28
|
+
reject(error instanceof SdkCallError ? error : new SdkCallError(label, error));
|
|
29
|
+
});
|
|
30
|
+
});
|