@tencentcloud/ai-desk-customer-vue 1.6.0 → 1.6.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/CHANGELOG.md +19 -0
- package/assets/arrow_down_icon.svg +1 -0
- package/assets/arrow_down_icon_white.svg +1 -0
- package/components/CustomerServiceChat/chat-header/index-web.vue +1 -5
- package/components/CustomerServiceChat/customer-queue-page/index.vue +138 -0
- package/components/CustomerServiceChat/emoji-config/default-emoji.ts +11 -0
- package/components/CustomerServiceChat/emoji-config/index.ts +14 -1
- package/components/CustomerServiceChat/index-web.vue +29 -7
- package/components/CustomerServiceChat/message-input/index-web.vue +38 -0
- package/components/CustomerServiceChat/message-input/message-input-button.vue +5 -0
- package/components/CustomerServiceChat/message-input/message-input-editor-web.vue +13 -9
- package/components/CustomerServiceChat/message-input-toolbar/emoji-dialog-mobile/emoji-dialog-mobile.vue +26 -46
- package/components/CustomerServiceChat/message-input-toolbar/emoji-picker/emoji-picker-dialog.vue +8 -38
- package/components/CustomerServiceChat/message-list/bottom-quick-order/index.vue +1 -0
- package/components/CustomerServiceChat/message-list/index-web.vue +7 -1
- package/components/CustomerServiceChat/message-list/message-elements/message-bubble-web.vue +33 -15
- package/components/CustomerServiceChat/message-list/message-elements/message-desk/message-desk-elements/marked.ts +7 -6
- package/components/CustomerServiceChat/message-list/message-elements/message-desk/message-desk-elements/message-stream.vue +1 -0
- package/components/CustomerServiceChat/message-list/scroll-button/index.vue +17 -9
- package/locales/en/TUIChat.ts +1 -1
- package/locales/en/aidesk.ts +4 -1
- package/locales/fil/TUIChat.ts +1 -1
- package/locales/fil/aidesk.ts +4 -1
- package/locales/id/TUIChat.ts +1 -1
- package/locales/id/aidesk.ts +4 -1
- package/locales/ja/TUIChat.ts +1 -1
- package/locales/ja/aidesk.ts +4 -1
- package/locales/ms/TUIChat.ts +1 -1
- package/locales/ms/aidesk.ts +4 -1
- package/locales/ru/TUIChat.ts +1 -1
- package/locales/ru/aidesk.ts +4 -1
- package/locales/th/TUIChat.ts +1 -1
- package/locales/th/aidesk.ts +4 -1
- package/locales/vi/TUIChat.ts +1 -1
- package/locales/vi/aidesk.ts +4 -1
- package/locales/zh_cn/aidesk.ts +4 -1
- package/locales/zh_tw/aidesk.ts +4 -1
- package/package.json +1 -1
- package/utils/utils.ts +1 -1
- package/assets/double-arrow.svg +0 -1
package/components/CustomerServiceChat/message-input-toolbar/emoji-picker/emoji-picker-dialog.vue
CHANGED
|
@@ -17,9 +17,8 @@
|
|
|
17
17
|
@click="select(childrenItem, childrenIndex)"
|
|
18
18
|
>
|
|
19
19
|
<img
|
|
20
|
-
v-if="currentTabItem.type === EMOJI_TYPE.BASIC"
|
|
21
20
|
class="emoji"
|
|
22
|
-
:src="
|
|
21
|
+
:src="BASIC_EMOJI_URL + BASIC_EMOJI_URL_MAPPING[childrenItem]"
|
|
23
22
|
>
|
|
24
23
|
<!-- <img-->
|
|
25
24
|
<!-- v-else-if="currentTabItem.type === EMOJI_TYPE.BIG"-->
|
|
@@ -76,9 +75,6 @@ import {
|
|
|
76
75
|
SendMessageParams,
|
|
77
76
|
TUITranslateService
|
|
78
77
|
} from '@tencentcloud/chat-uikit-engine';
|
|
79
|
-
import Icon from '../../../common/Icon.vue';
|
|
80
|
-
import faceIcon from '../../../../assets/face.svg';
|
|
81
|
-
import { EMOJI_TYPE } from '.././../../../constant';
|
|
82
78
|
import { isPC, isH5 } from '../../../../utils/env';
|
|
83
79
|
import { IEmojiGroupList, IEmojiGroup } from '../../../../interface';
|
|
84
80
|
import { isEnabledMessageReadReceiptGlobal } from '../../../../utils/utils';
|
|
@@ -86,22 +82,23 @@ import {
|
|
|
86
82
|
EMOJI_GROUP_LIST,
|
|
87
83
|
BASIC_EMOJI_URL_MAPPING,
|
|
88
84
|
convertKeyToEmojiName,
|
|
85
|
+
BASIC_EMOJI_URL,
|
|
86
|
+
filterEmojisInNonChineseEnv,
|
|
89
87
|
} from '../../emoji-config';
|
|
90
88
|
const { ref, onMounted, onUnmounted } = vue;
|
|
91
89
|
|
|
92
90
|
const emits = defineEmits(['insertEmoji', 'onClose', 'sendMessage']);
|
|
93
|
-
const currentTabIndex = ref<number>(0);
|
|
94
91
|
const currentConversation = ref();
|
|
95
92
|
const emojiPickerDialog = ref();
|
|
96
93
|
const emojiPickerListRef = ref();
|
|
97
|
-
const list = ref<IEmojiGroupList>(
|
|
98
|
-
const currentTabItem = ref<IEmojiGroup>(list?.value[0]);
|
|
94
|
+
const list = ref<IEmojiGroupList>(EMOJI_GROUP_LIST);
|
|
99
95
|
const currentEmojiList = ref<string[]>(list?.value[0]?.list);
|
|
100
96
|
|
|
101
97
|
onMounted(() => {
|
|
102
98
|
TUIStore.watch(StoreName.CONV, {
|
|
103
99
|
currentConversation: onCurrentConversationUpdate,
|
|
104
100
|
});
|
|
101
|
+
currentEmojiList.value = filterEmojisInNonChineseEnv(list.value[0].list);
|
|
105
102
|
});
|
|
106
103
|
|
|
107
104
|
onUnmounted(() => {
|
|
@@ -110,35 +107,13 @@ onUnmounted(() => {
|
|
|
110
107
|
});
|
|
111
108
|
});
|
|
112
109
|
|
|
113
|
-
const toggleEmojiTab = (index: number) => {
|
|
114
|
-
currentTabIndex.value = index;
|
|
115
|
-
currentTabItem.value = list?.value[index];
|
|
116
|
-
currentEmojiList.value = list?.value[index]?.list;
|
|
117
|
-
// web & h5 side scroll to top
|
|
118
|
-
emojiPickerListRef?.value && (emojiPickerListRef.value.scrollTop = 0);
|
|
119
|
-
|
|
120
|
-
};
|
|
121
|
-
|
|
122
110
|
const select = (item: any, index: number) => {
|
|
123
111
|
const options: any = {
|
|
124
112
|
emoji: { key: item, name: convertKeyToEmojiName(item) },
|
|
125
|
-
type:
|
|
113
|
+
type: 'basic',
|
|
126
114
|
};
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
options.url = currentTabItem?.value?.url + BASIC_EMOJI_URL_MAPPING[item];
|
|
130
|
-
emits('insertEmoji', options);
|
|
131
|
-
|
|
132
|
-
break;
|
|
133
|
-
case EMOJI_TYPE.BIG:
|
|
134
|
-
sendFaceMessage(index, currentTabItem.value);
|
|
135
|
-
break;
|
|
136
|
-
case EMOJI_TYPE.CUSTOM:
|
|
137
|
-
sendFaceMessage(index, currentTabItem.value);
|
|
138
|
-
break;
|
|
139
|
-
default:
|
|
140
|
-
break;
|
|
141
|
-
}
|
|
115
|
+
options.url = BASIC_EMOJI_URL + BASIC_EMOJI_URL_MAPPING[item];
|
|
116
|
+
emits('insertEmoji', options);
|
|
142
117
|
isPC && emits('onClose');
|
|
143
118
|
};
|
|
144
119
|
|
|
@@ -159,16 +134,11 @@ const sendFaceMessage = (index: number, listItem: IEmojiGroup) => {
|
|
|
159
134
|
|
|
160
135
|
function sendMessage() {
|
|
161
136
|
emits('sendMessage');
|
|
162
|
-
|
|
163
137
|
}
|
|
164
138
|
|
|
165
139
|
function onCurrentConversationUpdate(conversation: IConversationModel) {
|
|
166
140
|
currentConversation.value = conversation;
|
|
167
141
|
}
|
|
168
|
-
|
|
169
|
-
function initEmojiList() {
|
|
170
|
-
return EMOJI_GROUP_LIST;
|
|
171
|
-
}
|
|
172
142
|
</script>
|
|
173
143
|
|
|
174
144
|
<style lang="scss" scoped src="./style/index.scss"></style>
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
@click="onMessageListBackgroundClick"
|
|
17
17
|
>
|
|
18
18
|
<p
|
|
19
|
-
v-if="!isCompleted"
|
|
19
|
+
v-if="!isCompleted && messageList && messageList.length"
|
|
20
20
|
class="message-more"
|
|
21
21
|
@click="getHistoryMessageList"
|
|
22
22
|
>
|
|
@@ -382,6 +382,11 @@ function onNewMessageList(list: IMessageModel[]) {
|
|
|
382
382
|
} else if (data.src === CUSTOM_MESSAGE_SRC.SEAT_STATUS) {
|
|
383
383
|
updateCustomStore("canEndConversation", { conversationID, value: true });
|
|
384
384
|
if (data.content.command === "updateSeatStatus") {
|
|
385
|
+
if (data.content.content === 'queuing') {
|
|
386
|
+
updateCustomStore("isQueuing", { conversationID, value: data.content.waitingQueueLength });
|
|
387
|
+
} else if (data.content.content !== 'WaitingForAgentAnswering') {
|
|
388
|
+
updateCustomStore("isQueuing", { conversationID, value: -1 });
|
|
389
|
+
}
|
|
385
390
|
if (data.content.content === 'inSeat') {
|
|
386
391
|
updateCustomStore("isInHumanService", { conversationID, value: true });
|
|
387
392
|
} else if (data.content.content === 'outSeat') {
|
|
@@ -396,6 +401,7 @@ function onNewMessageList(list: IMessageModel[]) {
|
|
|
396
401
|
}
|
|
397
402
|
} else if (data.src === CUSTOM_MESSAGE_SRC.NO_SEAT_ONLINE || data.src === CUSTOM_MESSAGE_SRC.TIMEOUT || data.src === CUSTOM_MESSAGE_SRC.END) {
|
|
398
403
|
updateCustomStore("canEndConversation", { conversationID, value: false });
|
|
404
|
+
updateCustomStore("isQueuing", { conversationID, value: -1 });
|
|
399
405
|
} else if (data.src === CUSTOM_MESSAGE_SRC.GET_FEEDBACK_MENU) {
|
|
400
406
|
TUIStore.update(StoreName.CUSTOM, "feedbackTags", data.content.menu);
|
|
401
407
|
}
|
|
@@ -207,13 +207,24 @@ const {
|
|
|
207
207
|
showAvatar,
|
|
208
208
|
showNickName,
|
|
209
209
|
robotAvatar,
|
|
210
|
-
|
|
210
|
+
memberAvatar,
|
|
211
211
|
userAvatar,
|
|
212
212
|
robotNickName,
|
|
213
|
-
|
|
213
|
+
memberNickName,
|
|
214
214
|
userNickName,
|
|
215
|
+
enableUnifiedMemberProfile,
|
|
215
216
|
} = state.get('avatarNickName');
|
|
216
217
|
let prevStatus = ReadState.Unread;
|
|
218
|
+
|
|
219
|
+
const getCloudCustomData = () => {
|
|
220
|
+
try {
|
|
221
|
+
return JSONToObject(message.value.cloudCustomData);
|
|
222
|
+
} catch (e) {
|
|
223
|
+
return {};
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
let cloudCustomData = getCloudCustomData();
|
|
227
|
+
|
|
217
228
|
const isDisplayUnplayMark = computed<boolean>(() => {
|
|
218
229
|
return (
|
|
219
230
|
message.value.flow === 'in'
|
|
@@ -252,22 +263,23 @@ const computedShowAINote = computed(() => {
|
|
|
252
263
|
return props.enableAINote === 1 && (state.get('currentLanguage') === 'zh' || state.get('currentLanguage') === 'en') && canShowAINote(message.value.cloudCustomData);
|
|
253
264
|
});
|
|
254
265
|
|
|
255
|
-
function
|
|
256
|
-
|
|
257
|
-
const jsonObj = JSONToObject(cloudCustomData);
|
|
258
|
-
return jsonObj.hasOwnProperty("role") && jsonObj.role === "robot";
|
|
259
|
-
} catch (e) {
|
|
260
|
-
return false;
|
|
261
|
-
}
|
|
266
|
+
function isFromSeat() {
|
|
267
|
+
return cloudCustomData.hasOwnProperty("role") && cloudCustomData.role === "seat";
|
|
262
268
|
}
|
|
263
269
|
|
|
264
270
|
const avatarUrl = computed(() => {
|
|
265
271
|
let url = '';
|
|
266
272
|
if (message.value.flow === 'in') {
|
|
267
|
-
if (
|
|
268
|
-
|
|
273
|
+
if (isFromSeat()) {
|
|
274
|
+
if (enableUnifiedMemberProfile) {
|
|
275
|
+
url = memberAvatar || message.value.avatar;
|
|
276
|
+
} else if (cloudCustomData.memberInfo && cloudCustomData.memberInfo.memberAvatar) {
|
|
277
|
+
url = cloudCustomData.memberInfo.memberAvatar
|
|
278
|
+
} else {
|
|
279
|
+
url = message.value.avatar;
|
|
280
|
+
}
|
|
269
281
|
} else {
|
|
270
|
-
url =
|
|
282
|
+
url = robotAvatar || message.value.avatar;
|
|
271
283
|
}
|
|
272
284
|
} else {
|
|
273
285
|
url = userAvatar || message.value.avatar || '';
|
|
@@ -278,10 +290,16 @@ const avatarUrl = computed(() => {
|
|
|
278
290
|
const nickName = computed(() => {
|
|
279
291
|
let nick = '';
|
|
280
292
|
if (message.value.flow === 'in') {
|
|
281
|
-
if (
|
|
282
|
-
|
|
293
|
+
if (isFromSeat()) {
|
|
294
|
+
if (enableUnifiedMemberProfile) {
|
|
295
|
+
nick = memberNickName || props.content.showName;
|
|
296
|
+
} else if (cloudCustomData.memberInfo && cloudCustomData.memberInfo.memberNickName) {
|
|
297
|
+
nick = cloudCustomData.memberInfo.memberNickName;
|
|
298
|
+
} else {
|
|
299
|
+
nick = props.content.showName;
|
|
300
|
+
}
|
|
283
301
|
} else {
|
|
284
|
-
nick =
|
|
302
|
+
nick = robotNickName || props.content.showName;
|
|
285
303
|
}
|
|
286
304
|
} else {
|
|
287
305
|
nick = userNickName || props.content.showName;
|
|
@@ -2,7 +2,7 @@ import {Marked} from 'marked';
|
|
|
2
2
|
import Log from '../../../../../../utils/logger';
|
|
3
3
|
|
|
4
4
|
export const marked = new Marked(
|
|
5
|
-
{mangle: false, headerIds: false, breaks: true},
|
|
5
|
+
{mangle: false, headerIds: false, breaks: true, gfm: false, smartLists: true,},
|
|
6
6
|
{
|
|
7
7
|
renderer: {
|
|
8
8
|
image(this: any, href: string | null, title: string | null, text: string) {
|
|
@@ -11,7 +11,7 @@ export const marked = new Marked(
|
|
|
11
11
|
class="image-container"
|
|
12
12
|
onclick="onMarkdownImageClicked('${safeHref}')"
|
|
13
13
|
style="cursor:pointer;" >
|
|
14
|
-
<img src="${href}" alt="${text}" onload="onMarkdownMediaLoad()"/>
|
|
14
|
+
<img src="${href}" alt="${text}" onload="onMarkdownMediaLoad()" style="max-width: 100%; height: auto; max-height: 300px; object-fit: contain; margin: 8px 0;"/>
|
|
15
15
|
</div>
|
|
16
16
|
`;
|
|
17
17
|
},
|
|
@@ -24,9 +24,10 @@ export const marked = new Marked(
|
|
|
24
24
|
<video class="message-img video-web" src="${videoSrc}" onloadeddata="onMarkdownMediaLoad()" preload="auto" controls/>
|
|
25
25
|
</div>
|
|
26
26
|
</div>`;
|
|
27
|
+
}
|
|
27
28
|
}
|
|
28
|
-
|
|
29
|
-
return text
|
|
29
|
+
// 在段落中用 p 包裹,避免 \n\n 无法换行
|
|
30
|
+
return `<p>${text}</p>`;
|
|
30
31
|
},
|
|
31
32
|
link(this: any, href: string | null, title: string | null, text: string) {
|
|
32
33
|
if (href) {
|
|
@@ -57,7 +58,7 @@ const extractVideoSrc = (text: string) => {
|
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
export const parseMarkdown = (text: string) => {
|
|
60
|
-
//
|
|
61
|
-
let ret = marked.parse(text
|
|
61
|
+
// 不要手动替换,如把 \n\n 替换成 p 或者 <br/>,否则可能会导致Markdown结构被破坏,进而导致 bad case
|
|
62
|
+
let ret = marked.parse(text);
|
|
62
63
|
return typeof ret === 'string' ? ret : '';
|
|
63
64
|
};
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div
|
|
3
3
|
v-if="isScrollButtonVisible"
|
|
4
|
-
class="scroll-button"
|
|
4
|
+
:class="['scroll-button', isPC ? 'scroll-button-pc' : '']"
|
|
5
5
|
@click="scrollToMessageListBottom"
|
|
6
6
|
>
|
|
7
7
|
<Icon
|
|
8
|
-
width="
|
|
9
|
-
height="
|
|
10
|
-
:file="
|
|
8
|
+
width="15px"
|
|
9
|
+
height="15px"
|
|
10
|
+
:file="isPC ? arrowDownIconWhite : arrowDownIcon"
|
|
11
11
|
/>
|
|
12
|
-
<div class="scroll-button-text">
|
|
12
|
+
<div v-if="scrollButtonContent" :class="isPC ? 'scroll-button-text-pc' : 'scroll-button-text'">
|
|
13
13
|
{{ scrollButtonContent }}
|
|
14
14
|
</div>
|
|
15
15
|
</div>
|
|
@@ -26,10 +26,11 @@ import {
|
|
|
26
26
|
TUITranslateService,
|
|
27
27
|
} from '@tencentcloud/chat-uikit-engine';
|
|
28
28
|
import Icon from '../../../common/Icon.vue';
|
|
29
|
-
import
|
|
29
|
+
import arrowDownIcon from '../../../../assets/arrow_down_icon.svg';
|
|
30
|
+
import arrowDownIconWhite from '../../../../assets/arrow_down_icon_white.svg';
|
|
30
31
|
import { getBoundingClientRect } from '@tencentcloud/universal-api';
|
|
31
32
|
import { JSONToObject } from '../../../../utils';
|
|
32
|
-
|
|
33
|
+
import { isPC } from '../../../../utils/env';
|
|
33
34
|
|
|
34
35
|
interface IEmits {
|
|
35
36
|
(key: 'scrollToLatestMessage'): void;
|
|
@@ -197,7 +198,6 @@ defineExpose({
|
|
|
197
198
|
bottom: 10px;
|
|
198
199
|
right: 10px;
|
|
199
200
|
width: auto;
|
|
200
|
-
height: 28px;
|
|
201
201
|
background: #fff;
|
|
202
202
|
border: 1px solid #e0e0e0;
|
|
203
203
|
box-shadow: 0 4px 12px -5px rgba(0, 0, 0, 0.1);
|
|
@@ -205,7 +205,8 @@ defineExpose({
|
|
|
205
205
|
flex-direction: row;
|
|
206
206
|
align-items: center;
|
|
207
207
|
justify-content: center;
|
|
208
|
-
border-radius:
|
|
208
|
+
border-radius: 20px;
|
|
209
|
+
padding: 8px;
|
|
209
210
|
cursor: pointer;
|
|
210
211
|
-webkit-tap-highlight-color: transparent;
|
|
211
212
|
|
|
@@ -216,4 +217,11 @@ defineExpose({
|
|
|
216
217
|
margin-right: 3px;
|
|
217
218
|
}
|
|
218
219
|
}
|
|
220
|
+
.scroll-button-pc {
|
|
221
|
+
background: #1c66e5;
|
|
222
|
+
}
|
|
223
|
+
.scroll-button-text-pc {
|
|
224
|
+
color: #ffffff;
|
|
225
|
+
font-size: 10px;
|
|
226
|
+
}
|
|
219
227
|
</style>
|
package/locales/en/TUIChat.ts
CHANGED
|
@@ -20,7 +20,7 @@ const TUIChat = {
|
|
|
20
20
|
'关闭阅读状态': 'Read status closed',
|
|
21
21
|
'管理员开启全员禁言': 'The admin enables Mute All',
|
|
22
22
|
'欢迎使用TUICallKit': 'Welcome to TUICallKit',
|
|
23
|
-
'回到最新位置': '
|
|
23
|
+
'回到最新位置': '',
|
|
24
24
|
'回复': 'Reply',
|
|
25
25
|
'回复详情': 'Replies',
|
|
26
26
|
'集成TUICallKit': ' Integrate TUICallKit ',
|
package/locales/en/aidesk.ts
CHANGED
|
@@ -7,7 +7,6 @@ const AIDesk = {
|
|
|
7
7
|
"提交": "Submit",
|
|
8
8
|
"查看内容": "View content",
|
|
9
9
|
"请填写必填项": "Please fill in the required fields",
|
|
10
|
-
"Hi,我是": "Hi, I'm ",
|
|
11
10
|
"请输入内容":"Please enter the content",
|
|
12
11
|
"如果满意请给好评哦~":"If you're satisfied, please give a good review~",
|
|
13
12
|
"请对本次服务进行评价": "Please rate this service",
|
|
@@ -36,5 +35,9 @@ const AIDesk = {
|
|
|
36
35
|
"userID 长度不能超过45字节": "The length of the userID cannot exceed 45 bytes",
|
|
37
36
|
"我们想知道你对此回答不满意的原因,你认为更好的回答是什么?": "We appreciate your feedback. Please share any suggestions to help us improve.",
|
|
38
37
|
"该回复由AI生成,内容仅供参考": "AI-Generated Content",
|
|
38
|
+
"排队等待中": "In Queue",
|
|
39
|
+
"排队等待话术": "We apologize for the wait. All agents are currently assisting other customers. You will be connected shortly. Thank you for your patience.",
|
|
40
|
+
"当前前方排队人数": "Queue Position",
|
|
41
|
+
"结束排队": "Exit Queue"
|
|
39
42
|
}
|
|
40
43
|
export default AIDesk;
|
package/locales/fil/TUIChat.ts
CHANGED
|
@@ -42,7 +42,7 @@ const TUIChat = {
|
|
|
42
42
|
'该消息不存在': 'Ang mensaheng ito ay hindi umiiral',
|
|
43
43
|
'无法定位到原消息': 'Hindi mahanap ang orihinal na mensahe',
|
|
44
44
|
'对方正在输入': 'Ang kabilang panig ay nagta-type...',
|
|
45
|
-
'回到最新位置': '
|
|
45
|
+
'回到最新位置': '',
|
|
46
46
|
'条新消息': 'bagong mensahe',
|
|
47
47
|
'点此投诉': 'I-click dito para magreklamo',
|
|
48
48
|
'语音通话': 'Voice Call',
|
package/locales/fil/aidesk.ts
CHANGED
|
@@ -7,7 +7,6 @@ const AIDesk = {
|
|
|
7
7
|
"提交": "Isumite",
|
|
8
8
|
"查看内容": "Tingnan ang Nilalaman",
|
|
9
9
|
"请填写必填项": "Mangyaring punan ang mga kinakailangang field",
|
|
10
|
-
"Hi,我是": "Hi, ako ",
|
|
11
10
|
"请输入内容":"Pakilagay ang nilalaman",
|
|
12
11
|
"如果满意请给好评哦~":"Kung nasiyahan ka, mangyaring magbigay ng magandang pagsusuri~",
|
|
13
12
|
"请对本次服务进行评价": "Mangyaring suriin ang serbisyong ito",
|
|
@@ -35,5 +34,9 @@ const AIDesk = {
|
|
|
35
34
|
"userID 不能包含'administrator'": "Ang UserID ay hindi dapat maglaman ng 'administrator'",
|
|
36
35
|
"userID 长度不能超过45字节": "Ang haba ng UserID ay hindi dapat lumampas sa 45 bytes",
|
|
37
36
|
"我们想知道你对此回答不满意的原因,你认为更好的回答是什么?": "Pinahahalagahan namin ang iyong feedback. Mangyaring ibahagi ang anumang mga mungkahi upang matulungan kaming mapabuti.",
|
|
37
|
+
"排队等待中": "Nasa pila na",
|
|
38
|
+
"排队等待话术": "Paumanhin, puno na ang aming mga customer service. Mangyaring maghintay nang matiisin, tutulungan ka namin agad. Salamat sa iyong pag-unawa.",
|
|
39
|
+
"当前前方排队人数": "Bilang ng mga tao sa unahan sa pila",
|
|
40
|
+
"结束排队": "Umalis sa pila",
|
|
38
41
|
}
|
|
39
42
|
export default AIDesk;
|
package/locales/id/TUIChat.ts
CHANGED
package/locales/id/aidesk.ts
CHANGED
|
@@ -7,7 +7,6 @@ const AIDesk = {
|
|
|
7
7
|
"提交": "Kirim",
|
|
8
8
|
"查看内容": "Lihat konten",
|
|
9
9
|
"请填写必填项": "Harap isi bidang yang wajib diisi",
|
|
10
|
-
"Hi,我是": "Hai, saya adalah ",
|
|
11
10
|
"请输入内容":"Silakan masukkan konten",
|
|
12
11
|
"如果满意请给好评哦~":"Jika Anda puas, silakan berikan ulasan yang bagus~",
|
|
13
12
|
"请对本次服务进行评价": "Silakan beri penilaian untuk layanan ini",
|
|
@@ -35,5 +34,9 @@ const AIDesk = {
|
|
|
35
34
|
"userID 不能包含'administrator'": "UserID tidak boleh mengandung 'administrator'",
|
|
36
35
|
"userID 长度不能超过45字节": "Panjang UserID tidak boleh melebihi 45 byte",
|
|
37
36
|
"我们想知道你对此回答不满意的原因,你认为更好的回答是什么?": "Kami menghargai masukan Anda. Silakan bagikan saran apa pun untuk membantu kami meningkatkan layanan.",
|
|
37
|
+
"排队等待中": "Sedang antre",
|
|
38
|
+
"排队等待话术": "Mohon maaf, seluruh customer service kami sedang sibuk. Silakan tunggu dengan sabar, kami akan segera membantu Anda. Terima kasih atas pengertiannya.",
|
|
39
|
+
"当前前方排队人数": "Jumlah orang di depan antrian saat ini",
|
|
40
|
+
"结束排队": "Keluar dari antrian",
|
|
38
41
|
}
|
|
39
42
|
export default AIDesk;
|
package/locales/ja/TUIChat.ts
CHANGED
package/locales/ja/aidesk.ts
CHANGED
|
@@ -7,7 +7,6 @@ const AIDesk = {
|
|
|
7
7
|
"提交": "提出する",
|
|
8
8
|
"查看内容": "内容を表示",
|
|
9
9
|
"请填写必填项":"必須項目を入力してください",
|
|
10
|
-
"Hi,我是": "こんにちは、私は",
|
|
11
10
|
"请输入内容":"内容を入力してください",
|
|
12
11
|
"如果满意请给好评哦~":"ご満足いただけましたら、ぜひ良いレビューをお願いします〜",
|
|
13
12
|
"请对本次服务进行评价": "このサービスについて評価をお願いします",
|
|
@@ -35,5 +34,9 @@ const AIDesk = {
|
|
|
35
34
|
"userID 不能包含'administrator'": "UserIDに'administrator'を含めることはできません",
|
|
36
35
|
"userID 长度不能超过45字节": "UserIDの長さは45バイトを超えてはいけません",
|
|
37
36
|
"我们想知道你对此回答不满意的原因,你认为更好的回答是什么?": "皆様からのフィードバックをお待ちしております。改善に役立つご提案がございましたら、ぜひお聞かせください。",
|
|
37
|
+
"排队等待中": "ただいま待機中",
|
|
38
|
+
"排队等待话术": "申し訳ございません、現在すべてのカスタマーサービスが対応中です。しばらくお待ちください。ご理解いただきありがとうございます。",
|
|
39
|
+
"当前前方排队人数": "現在の前方待機人数",
|
|
40
|
+
"结束排队": "待機を終了する",
|
|
38
41
|
}
|
|
39
42
|
export default AIDesk;
|
package/locales/ms/TUIChat.ts
CHANGED
|
@@ -47,7 +47,7 @@ const TUIChat = {
|
|
|
47
47
|
'该消息不存在': 'Mesej Ini Tidak Wujud',
|
|
48
48
|
'无法定位到原消息': 'Tidak Dapat Menemukan Mesej Asal',
|
|
49
49
|
'对方正在输入': 'Pihak Lain Sedang Menulis...',
|
|
50
|
-
'回到最新位置': '
|
|
50
|
+
'回到最新位置': '',
|
|
51
51
|
'条新消息': 'Mesej Baru',
|
|
52
52
|
'点此投诉': 'Klik Sini Untuk Aduan',
|
|
53
53
|
'语音通话': 'Panggilan Suara',
|
package/locales/ms/aidesk.ts
CHANGED
|
@@ -7,7 +7,6 @@ const AIDesk = {
|
|
|
7
7
|
"提交": "Hantar",
|
|
8
8
|
"查看内容": "Lihat Kandungan",
|
|
9
9
|
"请填写必填项": "Sila isi ruangan yang wajib",
|
|
10
|
-
"Hi,我是": "Hai, saya ",
|
|
11
10
|
"请输入内容":"Sila masukkan kandungan",
|
|
12
11
|
"如果满意请给好评哦~":"Jika anda berpuas hati, sila berikan ulasan yang baik~",
|
|
13
12
|
"请对本次服务进行评价": "Sila beri penilaian untuk perkhidmatan ini",
|
|
@@ -35,5 +34,9 @@ const AIDesk = {
|
|
|
35
34
|
"userID 不能包含'administrator'": "UserID tidak boleh mengandung 'administrator'",
|
|
36
35
|
"userID 长度不能超过45字节": "Panjang UserID tidak boleh melebihi 45 bait",
|
|
37
36
|
"我们想知道你对此回答不满意的原因,你认为更好的回答是什么?": "Kami menghargai maklum balas anda. Sila kongsi sebarang cadangan untuk membantu kami menambah baik.",
|
|
37
|
+
"排队等待中": "Sedang beratur",
|
|
38
|
+
"排队等待话术": "Maaf, semua wakil khidmat pelanggan kami sedang sibuk. Sila tunggu sebentar, kami akan membantu anda tidak lama lagi. Terima kasih atas pemahaman anda.",
|
|
39
|
+
"当前前方排队人数": "Bilangan orang di hadapan dalam barisan sekarang",
|
|
40
|
+
"结束排队": "Tinggalkan barisan",
|
|
38
41
|
}
|
|
39
42
|
export default AIDesk;
|
package/locales/ru/TUIChat.ts
CHANGED
|
@@ -20,7 +20,7 @@ const TUIChat = {
|
|
|
20
20
|
'关闭阅读状态': 'Отключить статус прочтения',
|
|
21
21
|
'管理员开启全员禁言': 'Админ включил режим "Только чтение"',
|
|
22
22
|
'欢迎使用TUICallKit': 'Добро пожаловать в TUICallKit',
|
|
23
|
-
'回到最新位置': '
|
|
23
|
+
'回到最新位置': '',
|
|
24
24
|
'回复': 'Ответить',
|
|
25
25
|
'回复详情': 'Детали ответа',
|
|
26
26
|
'集成TUICallKit': 'Интеграция TUICallKit',
|
package/locales/ru/aidesk.ts
CHANGED
|
@@ -7,7 +7,6 @@ const AIDesk = {
|
|
|
7
7
|
"提交": "Отправить",
|
|
8
8
|
"查看内容": "Просмотреть содержимое",
|
|
9
9
|
"请填写必填项": "Пожалуйста, заполните обязательные поля",
|
|
10
|
-
"Hi,我是": "Привет, я ",
|
|
11
10
|
"请输入内容":"Пожалуйста, введите содержание",
|
|
12
11
|
"如果满意请给好评哦~":"Если вы удовлетворены, пожалуйста, оставьте хороший отзыв~",
|
|
13
12
|
"请对本次服务进行评价": "Оцените обслуживание",
|
|
@@ -35,5 +34,9 @@ const AIDesk = {
|
|
|
35
34
|
"userID 不能包含'administrator'": "UserID не должен содержать 'administrator'",
|
|
36
35
|
"userID 长度不能超过45字节": "Длина UserID не должна превышать 45 байт",
|
|
37
36
|
"我们想知道你对此回答不满意的原因,你认为更好的回答是什么?": "Мы ценим ваши отзывы. Пожалуйста, поделитесь предложениями, которые помогут нам стать лучше.",
|
|
37
|
+
"排队等待中": "В ожидании в очереди",
|
|
38
|
+
"排队等待话术": "Извините, все наши операторы сейчас заняты. Пожалуйста, ожидайте, мы скоро будем с вами. Благодарим за понимание.",
|
|
39
|
+
"当前前方排队人数": "Текущее количество человек впереди в очереди",
|
|
40
|
+
"结束排队": "Выйти из очереди",
|
|
38
41
|
}
|
|
39
42
|
export default AIDesk;
|
package/locales/th/TUIChat.ts
CHANGED
|
@@ -47,7 +47,7 @@ const TUIChat = {
|
|
|
47
47
|
'该消息不存在': 'ข้อความนี้ไม่มีอยู่',
|
|
48
48
|
'无法定位到原消息': 'ไม่สามารถระบุตำแหน่งข้อความต้นฉบับได้',
|
|
49
49
|
'对方正在输入': 'อีกฝ่ายกำลังพิมพ์...',
|
|
50
|
-
'回到最新位置': '
|
|
50
|
+
'回到最新位置': '',
|
|
51
51
|
'条新消息': 'ข้อความใหม่',
|
|
52
52
|
'点此投诉': 'คลิกที่นี่เพื่อร้องเรียน',
|
|
53
53
|
'语音通话': 'การโทรด้วยเสียง',
|
package/locales/th/aidesk.ts
CHANGED
|
@@ -7,7 +7,6 @@ const AIDesk = {
|
|
|
7
7
|
"提交": "เสนอ",
|
|
8
8
|
"查看内容": "ดูเนื้อหา",
|
|
9
9
|
"请填写必填项": "โปรดกรอกข้อมูลที่จำเป็น",
|
|
10
|
-
"Hi,我是": "สวัสดี ฉันเป็น ",
|
|
11
10
|
"请输入内容": "กรุณากรอกเนื้อหา",
|
|
12
11
|
"如果满意请给好评哦~": "หากพอใจแล้วก็อย่าลืมรีวิวให้ด้วยนะ~",
|
|
13
12
|
"请对本次服务进行评价": "กรุณาประเมินบริการครั้งนี้",
|
|
@@ -35,5 +34,9 @@ const AIDesk = {
|
|
|
35
34
|
"userID 不能包含'administrator'": "UserID ห้ามมี 'administrator'",
|
|
36
35
|
"userID 长度不能超过45字节": "ความยาว UserID ต้องไม่เกิน 45 ไบต์",
|
|
37
36
|
"我们想知道你对此回答不满意的原因,你认为更好的回答是什么?": "เราขอขอบคุณสำหรับความคิดเห็นของคุณ โปรดแบ่งปันข้อเสนอแนะใดๆ เพื่อช่วยเราปรับปรุง",
|
|
37
|
+
"排队等待中": "กำลังรอคิว",
|
|
38
|
+
"排队等待话术": "ขออภัย เจ้าหน้าที่ให้บริการลูกค้าทุกคนกำลังให้บริการเต็มประสิทธิภาพ กรุณารอคอยอย่างอดทน เราจะให้บริการคุณในไม่ช้า ขอบคุณสำหรับความเข้าใจ",
|
|
39
|
+
"当前前方排队人数": "จำนวนผู้รอคิวด้านหน้าในขณะนี้",
|
|
40
|
+
"结束排队": "ออกจากคิว",
|
|
38
41
|
}
|
|
39
42
|
export default AIDesk;
|
package/locales/vi/TUIChat.ts
CHANGED
package/locales/vi/aidesk.ts
CHANGED
|
@@ -7,7 +7,6 @@ const AIDesk = {
|
|
|
7
7
|
"提交": "Gửi",
|
|
8
8
|
"查看内容": "Xem nội dung",
|
|
9
9
|
"请填写必填项": "Vui lòng điền vào các mục bắt buộc",
|
|
10
|
-
"Hi,我是": "Xin chào, tôi là ",
|
|
11
10
|
"请输入内容":"Vui lòng nhập nội dung",
|
|
12
11
|
"如果满意请给好评哦~":"Nếu bạn hài lòng, hãy cho chúng tôi một đánh giá tốt nhé~",
|
|
13
12
|
"请对本次服务进行评价": "Vui lòng đánh giá dịch vụ này",
|
|
@@ -35,5 +34,9 @@ const AIDesk = {
|
|
|
35
34
|
"userID 不能包含'administrator'": "UserID không được chứa 'administrator'",
|
|
36
35
|
"userID 长度不能超过45字节": "Độ dài UserID không được vượt quá 45 byte",
|
|
37
36
|
"我们想知道你对此回答不满意的原因,你认为更好的回答是什么?": "Chúng tôi rất cảm kích phản hồi của bạn. Vui lòng chia sẻ bất kỳ đề xuất nào để giúp chúng tôi cải thiện.",
|
|
37
|
+
"排队等待中": "Đang chờ trong hàng",
|
|
38
|
+
"排队等待话术": "Xin lỗi, tất cả nhân viên chăm sóc khách hàng hiện đang bận. Vui lòng chờ đợi, chúng tôi sẽ phục vụ bạn sớm nhất có thể. Cảm ơn bạn đã thông cảm.",
|
|
39
|
+
"当前前方排队人数": "Số người đang chờ trước bạn trong hàng",
|
|
40
|
+
"结束排队": "Rời khỏi hàng",
|
|
38
41
|
}
|
|
39
42
|
export default AIDesk;
|
package/locales/zh_cn/aidesk.ts
CHANGED
|
@@ -7,7 +7,6 @@ const AIDesk = {
|
|
|
7
7
|
"提交": "提交",
|
|
8
8
|
"查看内容": "查看内容",
|
|
9
9
|
"请填写必填项": "请填写必填项",
|
|
10
|
-
"Hi,我是": "Hi,我是",
|
|
11
10
|
"请输入内容": "请输入内容",
|
|
12
11
|
"如果满意请给好评哦~": "如果满意请给好评哦~",
|
|
13
12
|
"请对本次服务进行评价": "请对本次服务进行评价",
|
|
@@ -36,5 +35,9 @@ const AIDesk = {
|
|
|
36
35
|
"userID 长度不能超过45字节": "userID 长度不能超过45字节",
|
|
37
36
|
"我们想知道你对此回答不满意的原因,你认为更好的回答是什么?": "我们想知道你对此回答不满意的原因,你认为更好的回答是什么?",
|
|
38
37
|
"该回复由AI生成,内容仅供参考": "该回复由AI生成,内容仅供参考",
|
|
38
|
+
"排队等待中": "排队等待中",
|
|
39
|
+
"排队等待话术": "抱歉,当前所有人工客服已达到服务上限,请耐心等待,我们很快就来接待您,感谢您的理解。",
|
|
40
|
+
"当前前方排队人数": "当前前方排队人数",
|
|
41
|
+
"结束排队": "结束排队",
|
|
39
42
|
}
|
|
40
43
|
export default AIDesk;
|
package/locales/zh_tw/aidesk.ts
CHANGED
|
@@ -7,7 +7,6 @@ const AIDesk = {
|
|
|
7
7
|
"提交": "提交",
|
|
8
8
|
"查看内容": "查看內容",
|
|
9
9
|
"请填写必填项": "請填寫必填項",
|
|
10
|
-
"Hi,我是": "Hi,我是",
|
|
11
10
|
"请输入内容": "請輸入內容",
|
|
12
11
|
"如果满意请给好评哦~": "如果滿意請給好評哦~",
|
|
13
12
|
"请对本次服务进行评价": "請對本次服務進行評價",
|
|
@@ -35,5 +34,9 @@ const AIDesk = {
|
|
|
35
34
|
"userID 不能包含'administrator'": "userID 不能包含'administrator'",
|
|
36
35
|
"userID 长度不能超过45字节": "userID 長度不能超過45位元組",
|
|
37
36
|
"我们想知道你对此回答不满意的原因,你认为更好的回答是什么?": "我們想知道你對此回答不滿意的原因,你認為更好的答案是什麼?",
|
|
37
|
+
"排队等待中": "排隊等待中",
|
|
38
|
+
"排队等待话术": "抱歉,目前所有人工客服已達到服務上限,請耐心等待,我們很快就來接待您,感謝您的理解。",
|
|
39
|
+
"当前前方排队人数": "目前前方排隊人數",
|
|
40
|
+
"结束排队": "結束排隊",
|
|
38
41
|
}
|
|
39
42
|
export default AIDesk;
|
package/package.json
CHANGED
package/utils/utils.ts
CHANGED
|
@@ -361,7 +361,7 @@ export function validateUserID(userID: string) {
|
|
|
361
361
|
return ret;
|
|
362
362
|
}
|
|
363
363
|
|
|
364
|
-
export function updateCustomStore(key: string, data: {conversationID: string, value:
|
|
364
|
+
export function updateCustomStore(key: string, data: {conversationID: string, value: any}) {
|
|
365
365
|
TUIStore.update(StoreName.CUSTOM, key, data);
|
|
366
366
|
}
|
|
367
367
|
|
package/assets/double-arrow.svg
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<svg t="1660053550964" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3181" width="200" height="200"><path d="M95.658667 461.354667a71.637333 71.637333 0 0 0 0 101.290666l365.696 365.696a71.637333 71.637333 0 0 0 101.290666 0l365.696-365.696a71.637333 71.637333 0 1 0-101.248-101.290666L512 776.448l-315.093333-315.093333a71.594667 71.594667 0 0 0-101.248 0z" p-id="3182" fill="#bfbfbf"></path><path d="M95.658667 95.658667a71.637333 71.637333 0 0 0 0 101.248l365.696 365.738666a71.594667 71.594667 0 0 0 101.290666 0l365.696-365.738666a71.637333 71.637333 0 0 0-101.248-101.248L512 410.709333 196.906667 95.658667a71.637333 71.637333 0 0 0-101.248 0z" p-id="3183" fill="#bfbfbf"></path></svg>
|