@tencentcloud/ai-desk-customer-vue 1.5.2 → 1.5.4
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/CHANGELOG.md +18 -0
- package/README.md +316 -71
- package/assets/language_arrow_down.svg +3 -0
- package/assets/language_check.svg +3 -0
- package/components/CustomerServiceChat/chat-header/index-web.vue +215 -13
- package/components/CustomerServiceChat/emoji-config/index.ts +3 -2
- package/components/CustomerServiceChat/index-web.vue +87 -25
- package/components/CustomerServiceChat/message-input/index-web.vue +9 -2
- package/components/CustomerServiceChat/message-input/message-input-editor-web.vue +11 -0
- package/components/CustomerServiceChat/message-input/message-input-quote/index.vue +31 -6
- package/components/CustomerServiceChat/message-input-toolbar/file-upload/index.vue +14 -4
- package/components/CustomerServiceChat/message-input-toolbar/image-upload/index.vue +19 -16
- package/components/CustomerServiceChat/message-input-toolbar/index-web.vue +4 -4
- package/components/CustomerServiceChat/message-input-toolbar/video-upload/index.vue +10 -3
- package/components/CustomerServiceChat/message-list/index-web.vue +27 -14
- package/components/CustomerServiceChat/message-list/message-elements/message-desk/message-desk-elements/message-desk.vue +6 -1
- package/components/CustomerServiceChat/message-list/message-elements/message-desk/message-desk-elements/message-multi-branch/branch-pc.vue +20 -13
- package/components/CustomerServiceChat/message-list/message-elements/message-desk/message-desk-elements/message-multi-branch/index.vue +1 -0
- package/components/CustomerServiceChat/message-list/message-elements/message-desk/message-desk-elements/message-robot-welcome.vue +73 -29
- package/components/CustomerServiceChat/message-list/message-elements/message-desk/message-desk-elements/message-transfer-with-desc.vue +51 -0
- package/components/CustomerServiceChat/message-list/message-elements/message-quote/index-web.vue +18 -9
- package/components/CustomerServiceChat/message-toolbar-button/index.vue +13 -2
- package/components/CustomerServiceChat/style/web.scss +2 -0
- package/components/CustomerServiceChat/utils/sendMessage.ts +5 -0
- package/constant.ts +21 -1
- package/interface.ts +16 -3
- package/locales/en/TUIChat.ts +2 -1
- package/locales/en/aidesk.ts +4 -4
- package/locales/en/index.ts +2 -2
- package/locales/en/time.ts +2 -2
- package/locales/fil/TUIChat.ts +1 -0
- package/locales/fil/index.ts +2 -2
- package/locales/fil/time.ts +2 -2
- package/locales/id/TUIChat.ts +161 -160
- package/locales/id/index.ts +2 -2
- package/locales/id/time.ts +2 -2
- package/locales/ja/TUIChat.ts +162 -161
- package/locales/ja/index.ts +2 -2
- package/locales/ja/time.ts +2 -2
- package/locales/ms/TUIChat.ts +162 -161
- package/locales/ms/index.ts +2 -2
- package/locales/ms/time.ts +2 -2
- package/locales/ru/TUIChat.ts +155 -154
- package/locales/ru/index.ts +2 -2
- package/locales/ru/time.ts +2 -2
- package/locales/th/TUIChat.ts +162 -161
- package/locales/th/index.ts +2 -2
- package/locales/th/time.ts +2 -2
- package/locales/vi/TUIChat.ts +153 -152
- package/locales/vi/index.ts +2 -2
- package/locales/vi/time.ts +2 -2
- package/locales/zh_cn/TUIChat.ts +1 -0
- package/locales/zh_cn/aidesk.ts +1 -1
- package/locales/zh_cn/index.ts +2 -2
- package/locales/zh_cn/time.ts +2 -2
- package/locales/zh_tw/TUIChat.ts +1 -0
- package/locales/zh_tw/aidesk.ts +1 -1
- package/locales/zh_tw/index.ts +2 -2
- package/locales/zh_tw/time.ts +2 -2
- package/package.json +5 -6
- package/server.ts +63 -10
- package/utils/index.ts +6 -13
- package/utils/utils.ts +96 -2
package/utils/index.ts
CHANGED
|
@@ -43,6 +43,12 @@ export const isThinkingMessage = (message: IMessageModel): boolean => {
|
|
|
43
43
|
return isCustomerMessage && customerServicePayload?.src === CUSTOM_MESSAGE_SRC.THINKING && customerServicePayload?.thinkingStatus === 0;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
+
export const isTransferMessageWithoutDesc = (message: IMessageModel): boolean => {
|
|
47
|
+
const isCustomerMessage = message.type === TYPES.MSG_CUSTOM;
|
|
48
|
+
const customerServicePayload: customerServicePayloadType = JSONToObject(message?.payload?.data);
|
|
49
|
+
return isCustomerMessage && (customerServicePayload.src === CUSTOM_MESSAGE_SRC.TRANSFER_TO_TASK_FLOW || customerServicePayload.src === CUSTOM_MESSAGE_SRC.TRANSFER_TO_HUMAN) && !customerServicePayload.description;
|
|
50
|
+
}
|
|
51
|
+
|
|
46
52
|
export const isThinkingMessageOverTime = (message: IMessageModel): boolean => {
|
|
47
53
|
const messageTime = message.time * 1000;
|
|
48
54
|
const minute = 60 * 1000;
|
|
@@ -64,19 +70,6 @@ export const isMessageInvisible = (message: IMessageModel): boolean => {
|
|
|
64
70
|
return (isCustomerMessage && (isCustomerInvisible || isRobot || isMultiFormMessage)) || isGroupTipMessage;
|
|
65
71
|
};
|
|
66
72
|
|
|
67
|
-
export const isSupportedLang = (lang: string): boolean => {
|
|
68
|
-
return [
|
|
69
|
-
'zh', // Simplified Chinese中文简体:zh
|
|
70
|
-
'zh-TW', // Traditional Chinese中文繁体:zh-TW
|
|
71
|
-
'en', // English英语:en
|
|
72
|
-
'id', // Indonesian印度尼西亚语:id
|
|
73
|
-
'vi', // Vietnamese越南语:vi
|
|
74
|
-
'ja', // Japanese日语:ja
|
|
75
|
-
'fil', // Filipino菲律宾语:fil
|
|
76
|
-
'ru', // Russian俄语:ru
|
|
77
|
-
].indexOf(lang) !== -1;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
73
|
// 如果用户选择 block cookies,此时访问 localStorage 浏览器会抛错
|
|
81
74
|
// Uncaught SecurityError: Failed to read the 'localStorage' property from 'Window': Access is denied for this document
|
|
82
75
|
// 通过 navigator.cookieEnabled 短路逻辑规避
|
package/utils/utils.ts
CHANGED
|
@@ -5,8 +5,12 @@ import TUIChatEngine, {
|
|
|
5
5
|
IMessageModel,
|
|
6
6
|
TUIUserService,
|
|
7
7
|
IConversationModel,
|
|
8
|
+
TUIChatService,
|
|
8
9
|
} from '@tencentcloud/chat-uikit-engine';
|
|
9
10
|
import Log from './logger';
|
|
11
|
+
import { isCustomerServiceMessage, JSONToObject } from './index';
|
|
12
|
+
import { CUSTOM_MESSAGE_SRC } from '../constant';
|
|
13
|
+
import { Marked } from 'marked';
|
|
10
14
|
|
|
11
15
|
export function deepCopy(data: any, hash = new WeakMap()) {
|
|
12
16
|
if (typeof data !== 'object' || data === null || data === undefined) {
|
|
@@ -135,7 +139,7 @@ export function calculateTimestamp(timestamp: number): string {
|
|
|
135
139
|
return `${formatNum(target.getHours())}:${formatNum(target.getMinutes())}`;
|
|
136
140
|
} else if (diff <= oneDay) {
|
|
137
141
|
// yesterday, display yesterday:hour:minute
|
|
138
|
-
return `${TUITranslateService.t('
|
|
142
|
+
return `${TUITranslateService.t('time.昨天')} ${formatNum(
|
|
139
143
|
target.getHours(),
|
|
140
144
|
)}:${formatNum(target.getMinutes())}`;
|
|
141
145
|
} else if (diff <= oneWeek - oneDay) {
|
|
@@ -150,7 +154,7 @@ export function calculateTimestamp(timestamp: number): string {
|
|
|
150
154
|
'星期六',
|
|
151
155
|
];
|
|
152
156
|
const weekday = weekdays[target.getDay()];
|
|
153
|
-
return `${TUITranslateService.t('
|
|
157
|
+
return `${TUITranslateService.t('time.' + weekday)} ${formatNum(
|
|
154
158
|
target.getHours(),
|
|
155
159
|
)}:${formatNum(target.getMinutes())}`;
|
|
156
160
|
} else if (target.getTime() >= thisYear) {
|
|
@@ -213,3 +217,93 @@ export function isNonEmptyObject(obj: any): boolean {
|
|
|
213
217
|
}
|
|
214
218
|
return false;
|
|
215
219
|
}
|
|
220
|
+
|
|
221
|
+
export function getQuoteContentForDesk(message: IMessageModel): string {
|
|
222
|
+
let result = TUITranslateService.t('TUIChat.自定义');
|
|
223
|
+
if (isCustomerServiceMessage(message)) {
|
|
224
|
+
const payload = JSONToObject(message.payload.data);
|
|
225
|
+
const src = payload.src;
|
|
226
|
+
if (src === CUSTOM_MESSAGE_SRC.BRANCH || src === CUSTOM_MESSAGE_SRC.BRANCH_NUMBER) {
|
|
227
|
+
result = payload.content.header;
|
|
228
|
+
} else if (src === CUSTOM_MESSAGE_SRC.RICH_TEXT) {
|
|
229
|
+
result = parseQuoteMarkdown(payload.content);
|
|
230
|
+
} else if (src === CUSTOM_MESSAGE_SRC.STREAM_TEXT) {
|
|
231
|
+
const chunks = Array.isArray(payload.chunks) ? payload.chunks.join('') : payload.chunks;
|
|
232
|
+
result = parseQuoteMarkdown(chunks);
|
|
233
|
+
} else if (src === CUSTOM_MESSAGE_SRC.MULTI_BRANCH) {
|
|
234
|
+
result = payload.content.header;
|
|
235
|
+
} else if (src === CUSTOM_MESSAGE_SRC.MULTI_FORM) {
|
|
236
|
+
result = payload.content.tip;
|
|
237
|
+
} else if (src === CUSTOM_MESSAGE_SRC.ROBOT_MSG) {
|
|
238
|
+
result = payload.content.title;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return result;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const quoteMarked = new Marked(
|
|
246
|
+
{mangle: false, headerIds: false},
|
|
247
|
+
{
|
|
248
|
+
renderer: {
|
|
249
|
+
image(this: any, href: string | null, title: string | null, text: string) {
|
|
250
|
+
return TUITranslateService.t('TUIChat.图片');
|
|
251
|
+
},
|
|
252
|
+
link(this: any, href: string | null, title: string | null, text: string) {
|
|
253
|
+
if (href) {
|
|
254
|
+
return TUITranslateService.t('TUIChat.链接');
|
|
255
|
+
}
|
|
256
|
+
return text;
|
|
257
|
+
},
|
|
258
|
+
},
|
|
259
|
+
},
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
function parseQuoteMarkdown(content: string): string {
|
|
263
|
+
let result = quoteMarked.parse(content);
|
|
264
|
+
result = typeof result === 'string' ? result : '';
|
|
265
|
+
result = result.replace(/\n+/g, ' ').trim()
|
|
266
|
+
.replace(/\*\*|\*|_|`|#/g, '')
|
|
267
|
+
.replace(/<[^>]+>/g, '');
|
|
268
|
+
return result;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export function transferToTaskFlow(conversationID: string, taskFlowID: number, description?: string) {
|
|
272
|
+
if (!taskFlowID) {
|
|
273
|
+
Log.w(`taskFlowID is required`);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
TUIChatService.sendCustomMessage({
|
|
277
|
+
to: conversationID,
|
|
278
|
+
conversationType: TUIChatEngine.TYPES.CONV_C2C,
|
|
279
|
+
payload: {
|
|
280
|
+
data: JSON.stringify({
|
|
281
|
+
src: CUSTOM_MESSAGE_SRC.TRANSFER_TO_TASK_FLOW,
|
|
282
|
+
customerServicePlugin: 0,
|
|
283
|
+
taskId: taskFlowID,
|
|
284
|
+
env: 'production',
|
|
285
|
+
description: description || '',
|
|
286
|
+
})
|
|
287
|
+
}
|
|
288
|
+
},{ onlineUserOnly: description ? false : true });
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
export function transferToHuman(conversationID: string, groupID?: string, specificMemberList?: Array<string>, description?: string) {
|
|
292
|
+
if (!groupID && (!specificMemberList || specificMemberList.length === 0)) {
|
|
293
|
+
Log.w(`groupID or specificMemberList is required`);
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
TUIChatService.sendCustomMessage({
|
|
297
|
+
to: conversationID,
|
|
298
|
+
conversationType: TUIChatEngine.TYPES.CONV_C2C,
|
|
299
|
+
payload: {
|
|
300
|
+
data: JSON.stringify({
|
|
301
|
+
src: CUSTOM_MESSAGE_SRC.TRANSFER_TO_HUMAN,
|
|
302
|
+
customerServicePlugin: 0,
|
|
303
|
+
groupId: groupID || 0,
|
|
304
|
+
specificMemberList: specificMemberList || [],
|
|
305
|
+
description: description || '',
|
|
306
|
+
})
|
|
307
|
+
}
|
|
308
|
+
},{ onlineUserOnly: description ? false : true });
|
|
309
|
+
}
|