mdm-im-v3 2.0.3 → 2.1.2
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 +22 -0
- package/README.md +69 -0
- package/dist/{FilePreview-CqsQCI87.js → FilePreview-Cz0KMA_m.js} +2 -2
- package/dist/assets/extracted/bc26358d.woff +0 -0
- package/dist/assets/extracted/be398edc.ttf +0 -0
- package/dist/assets/extracted/de12ee92.woff2 +0 -0
- package/dist/core.es.js +2 -2
- package/dist/{index-C4_SSULD.js → index-C8koozDu.js} +697 -47
- package/dist/{index-B3MeQmIL.js → index-GiaKeCU7.js} +1550 -3296
- package/dist/{index-D8yaC3ve.js → index-P9_HILzo.js} +3700 -480
- package/dist/index.es.js +1 -1
- package/dist/style/index.css +1 -1
- package/dist-h5/{ChatHistoryH5-Deqlnw3u.js → ChatHistoryH5-CKDqKPl-.js} +2 -2
- package/dist-h5/{ChatPageH5-wyLGmPhW.js → ChatPageH5-FXZxtcQr.js} +975 -164
- package/dist-h5/{ChatSettingsH5-DD3dnI-H.js → ChatSettingsH5-PackrlPt.js} +169 -27
- package/dist-h5/{CreateGroupH5-3LIujy3_.js → CreateGroupH5-CO_ZH36_.js} +2 -2
- package/dist-h5/{GroupAnnouncementH5-5EpXQs5V.js → GroupAnnouncementH5-yUDR5kYW.js} +1 -1
- package/dist-h5/{GroupInfoDialogH5-fgcrbRyp.js → GroupInfoDialogH5-BRk-_mEn.js} +1 -1
- package/dist-h5/{GroupMembersH5-DX2lxrLB.js → GroupMembersH5-BVHUF2mG.js} +1 -1
- package/dist-h5/{GroupNoticeH5-DVXrcmP9.js → GroupNoticeH5-KA-L2h9r.js} +1 -1
- package/dist-h5/{MemberDetailH5-DAVUVr30.js → MemberDetailH5-BfAE0nx-.js} +2 -2
- package/dist-h5/{SearchPageH5-BiGhJF4U.js → SearchPageH5-B6B_U4hW.js} +2 -2
- package/dist-h5/{SelectMembersH5-DbrSnTg3.js → SelectMembersH5-CrPoBnYp.js} +2 -2
- package/dist-h5/assets/extracted/bc26358d.woff +0 -0
- package/dist-h5/assets/extracted/be398edc.ttf +0 -0
- package/dist-h5/assets/extracted/de12ee92.woff2 +0 -0
- package/dist-h5/{imChat-Cz45JFEl.js → imChat-pGlpr8Vj.js} +40 -7
- package/dist-h5/index.es.js +2 -2
- package/dist-h5/{indexH5-Cx3l8YDq.js → indexH5-CCvF1MV7.js} +3591 -329
- package/dist-h5/{indexH5-BZ77bUNH.js → indexH5-sKvS7t3k.js} +101 -69
- package/dist-h5/style/index-h5.css +1 -1
- package/package.json +72 -70
- package/dist-h5/request-rky8JSGo.js +0 -44
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { ref, computed, openBlock, createElementBlock, Fragment, createVNode, unref, normalizeClass, withCtx, createElementVNode, toDisplayString, withModifiers, createTextVNode, inject, normalizeStyle, createCommentVNode, renderList, watch, nextTick, onMounted, onBeforeUnmount, createBlock, withDirectives, vShow, vModelText, resolveComponent } from "vue";
|
|
2
2
|
import { useRouter, useRoute } from "vue-router";
|
|
3
|
-
import { NavBar, Icon, ActionSheet, Loading, Checkbox, Popup, Empty, Button, showToast, showImagePreview, showDialog, Search, List } from "vant";
|
|
4
|
-
import { l as IM_LOGIN_PLATFORM,
|
|
5
|
-
import { u as uploadFiles } from "./imChat-
|
|
3
|
+
import { NavBar, Icon, ActionSheet, Loading, Checkbox, Popup, Empty, Button, showToast, showImagePreview, showDialog, Overlay, Search, List } from "vant";
|
|
4
|
+
import { o as isNoticeAgentConversation, l as IM_LOGIN_PLATFORM, q as formatFileSize, r as handleLinks, t as IM_MSG_TYPE, u as useChatStore, I as IM_CVS_TYPE, v as useDate, c as cloneDeep, i as isDefaultAvatar, n as handleUrl, a as getAvatarBg, b as getAvatarText, w as isBurnMessage, x as formatBurnRemain, y as isBurned, z as getJsonDetail, A as useBurnAfterReading, j as useMsgList, B as dedupeMessages, C as getDefaultExportFromCjs, D as getMediaDuration, E as getReplyDetail, F as IM_FONT_FAMILY, G as IM_FONT_SIZE, H as IM_FONT_STYLE, f as useUsers, h as useConversations, m as mittBus, g as getGroupAvatarBg, J as IM_GROUP_STATUS, d as getConversationBurnSetting, p as preserveBurnInEx, K as uuidv4 } from "./indexH5-CCvF1MV7.js";
|
|
5
|
+
import { u as uploadFiles } from "./imChat-pGlpr8Vj.js";
|
|
6
6
|
import { _ as _export_sfc } from "./_plugin-vue_export-helper-1tPrXgE0.js";
|
|
7
7
|
import { ElMessage } from "element-plus";
|
|
8
8
|
import axios from "axios";
|
|
9
9
|
import { f as fileIcon, a as fileWordIcon, b as filePdfIcon, c as fileExcelIcon, d as fileVideoIcon, e as fileMusicIcon } from "./file_excel_icon-dlT1dWlt.js";
|
|
10
10
|
import { d as defaultAvatar } from "./default_avatar-BE2kit_X.js";
|
|
11
|
-
import { J as JoinGroupDialogH5, G as GroupInfoDialogH5 } from "./GroupInfoDialogH5-
|
|
11
|
+
import { J as JoinGroupDialogH5, G as GroupInfoDialogH5 } from "./GroupInfoDialogH5-BRk-_mEn.js";
|
|
12
12
|
const uploadQueue = ref({});
|
|
13
13
|
const useUploadQueue = () => {
|
|
14
14
|
const addPendingMessage = (conversationID, message) => {
|
|
@@ -27,7 +27,7 @@ const useUploadQueue = () => {
|
|
|
27
27
|
const getPendingMessages = (conversationID) => {
|
|
28
28
|
return uploadQueue.value[conversationID] ? [...uploadQueue.value[conversationID]] : [];
|
|
29
29
|
};
|
|
30
|
-
const
|
|
30
|
+
const updatePendingMessage = (conversationID, clientMsgID, updates) => {
|
|
31
31
|
const list = uploadQueue.value[conversationID];
|
|
32
32
|
if (!list) return;
|
|
33
33
|
const idx = list.findIndex((item) => item.clientMsgID === clientMsgID);
|
|
@@ -39,7 +39,7 @@ const useUploadQueue = () => {
|
|
|
39
39
|
addPendingMessage,
|
|
40
40
|
removePendingMessage,
|
|
41
41
|
getPendingMessages,
|
|
42
|
-
updatePendingMessage
|
|
42
|
+
updatePendingMessage
|
|
43
43
|
};
|
|
44
44
|
};
|
|
45
45
|
const setting = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAAAXNSR0IArs4c6QAABIRJREFUWEfdWNFx2zgQfUvnP0oFSSqIXEHkCo76vYkYXQWBKohcgeAKTqEy90umgrMqiFxB7Api/1vcmwVIGKQJkrJ8N5nDl8cCF49vd98+gvCLL/rF8eH/BzCeqxH2WIEQA7hGgUX+VV+2ZSKeqzfl3jEYlzjBeb7W14dkbTCDBliBTwAUASP/EAapPF1d+P+LP6gYEf709zJwC0AjwkW+1vJ37xoEcJosPjJYN4HVQDIuiWgN4JaZYyLMQ6cLUAKpLF196UPYCzBO1JKAz3XG8AURligwb/7WPJDh9kqcj40453mql10ghwD8QcAbE4SxZcbSr7n4g5oQYQnC+9pBjBsGlvlGC6tmxb+rMZ1AV3sZuM5T/fYogNOZunQBI7wK1Y4ARYSJOazALv+q80DjjKjAz+qFs422zwTWEAZdirnAWahj+2rJsSiMR/jbJgTPkOKZUkRYmYCMP/yUDQXl74sPjDeEQelekRf8Cwxe5KlWT05xqX3SJEb3uKMGh7IpMasaNLoY4W2XJgYZLCdGRmQLX+QiT3VQ22yH0kuz94RvuiZGrfHshJmGQNYAymiigt4xeNyYGHccYdx2aDkxVk6KSipZDmactzWVPQc7APaFyglDoB1HfOWf4wAaPSu7q5GuO77HJP9LS8DaimdqRYTOGgo1lmH8BWSGG5D+4nucVuc9AEzUuqn0YHzjE6gQcxQhc4FFmMkcCGJMQHhd/RZqLsPk3gj3bzWAXjk5gLW6KHCGF9h1FW+cqJ+ueew4kxcxBqBsLul+M9ok3flGn4Uayey/x9hlkLGtBPwBYKK4CpClEju8pO4ce4ybbKPtKPSW6dY9dhWTbLu102pNWzA8BuihD76xZyAYCGpZnKiDNNTPYkXScwAMjivfCQ0R+UEApeXzVL8ammIGdnmqT9v2x4n6ToBIFvzO7MiMq+vHDM6U1Ms7ebi3Bu00kHqqdGyZp/q8VoOJ+kyA9XqBOm0CdTXIuMo22ryY38W53+7i1QDSTStfBW0aWSPMpcyAIR7R2SguMA3ar2TxCWD5jHhoNMa3bKPlm+cBYK0zvVeTFCLCWZvkxG3a2aAl1ETmg6pAVpVATQe9F6qPOvuhMyHG2HfIhs0IpwGQ4hdlmjQnwh0XmLcxV+qk1KfP2tYIfcPshs2Ctefrqi67zEIptOKoTd10OWoj5D7zjCveY942Smspbu1COy+/DxXwrs53tevZrSHdPcSwuhk9RMv6QPqmpM/C9TJo0nGgRe8FWI+3yDdadz0zhMHn/mhyc5wZxwOczpTTx66BP50t3jPxBKBb3PM2VPSlWf1RCrjTuxCLvQxOEyUWyk2M5r1K+T0sdzA1R2OEe4+FD7S63zlkwvQCbIqxf69yiKNuu995niaxt1rOfFapsEC9Wy57LSLueGSEu5zrdhTj+hHDDZP75BQ7/Wrcq3gBWydG26VTWXdb3kOFarQJtDfFzQfKyyKZMK/FpfAecbAhZmpOBJGRl5CJwVCHXp0cDLBP51on0lyNhl5YHs3gUwAe88x/wuAxAP8BS+SlR9q0RzUAAAAASUVORK5CYII=";
|
|
@@ -62,21 +62,25 @@ const icons = {
|
|
|
62
62
|
board,
|
|
63
63
|
speaker
|
|
64
64
|
};
|
|
65
|
-
const _hoisted_1$
|
|
65
|
+
const _hoisted_1$6 = {
|
|
66
66
|
key: 0,
|
|
67
67
|
class: "header-title"
|
|
68
68
|
};
|
|
69
|
-
const _hoisted_2$
|
|
70
|
-
const _hoisted_3$
|
|
71
|
-
const _hoisted_4$
|
|
72
|
-
const _hoisted_5$
|
|
69
|
+
const _hoisted_2$6 = { class: "title-row" };
|
|
70
|
+
const _hoisted_3$6 = { class: "title-name" };
|
|
71
|
+
const _hoisted_4$6 = ["src"];
|
|
72
|
+
const _hoisted_5$6 = {
|
|
73
73
|
key: 1,
|
|
74
74
|
class: "header-title"
|
|
75
75
|
};
|
|
76
76
|
const _hoisted_6$5 = { class: "title-row" };
|
|
77
77
|
const _hoisted_7$4 = { class: "title-name" };
|
|
78
|
-
const _hoisted_8$4 = {
|
|
79
|
-
|
|
78
|
+
const _hoisted_8$4 = {
|
|
79
|
+
key: 0,
|
|
80
|
+
class: "title-notice-tag"
|
|
81
|
+
};
|
|
82
|
+
const _hoisted_9$4 = { class: "online-text" };
|
|
83
|
+
const _sfc_main$6 = {
|
|
80
84
|
__name: "ChatHeaderH5",
|
|
81
85
|
props: {
|
|
82
86
|
chatInfo: {
|
|
@@ -110,6 +114,7 @@ const _sfc_main$5 = {
|
|
|
110
114
|
const info = props.chatInfo || {};
|
|
111
115
|
return info.onlineStatus === 1 || info.platformIDs && info.platformIDs.length > 0;
|
|
112
116
|
});
|
|
117
|
+
const isNoticeAgent = computed(() => isNoticeAgentConversation(props.chatInfo));
|
|
113
118
|
const onlineText = computed(() => {
|
|
114
119
|
const info = props.chatInfo || {};
|
|
115
120
|
if (!isOnline.value) return "离线";
|
|
@@ -191,9 +196,9 @@ const _sfc_main$5 = {
|
|
|
191
196
|
title: withCtx(() => {
|
|
192
197
|
var _a, _b;
|
|
193
198
|
return [
|
|
194
|
-
__props.isGroup ? (openBlock(), createElementBlock("div", _hoisted_1$
|
|
195
|
-
createElementVNode("div", _hoisted_2$
|
|
196
|
-
createElementVNode("div", _hoisted_3$
|
|
199
|
+
__props.isGroup ? (openBlock(), createElementBlock("div", _hoisted_1$6, [
|
|
200
|
+
createElementVNode("div", _hoisted_2$6, [
|
|
201
|
+
createElementVNode("div", _hoisted_3$6, toDisplayString(((_a = __props.chatInfo) == null ? void 0 : _a.showName) || "群聊"), 1),
|
|
197
202
|
createElementVNode("div", {
|
|
198
203
|
class: "title-sub",
|
|
199
204
|
onClick: withModifiers(onViewGroupMembers, ["stop"])
|
|
@@ -202,17 +207,19 @@ const _sfc_main$5 = {
|
|
|
202
207
|
class: "group-icon",
|
|
203
208
|
src: unref(icons).groupUser,
|
|
204
209
|
alt: ""
|
|
205
|
-
}, null, 8, _hoisted_4$
|
|
210
|
+
}, null, 8, _hoisted_4$6),
|
|
206
211
|
createTextVNode(" " + toDisplayString(memberCountText.value), 1)
|
|
207
212
|
])
|
|
208
213
|
])
|
|
209
|
-
])) : (openBlock(), createElementBlock("div", _hoisted_5$
|
|
214
|
+
])) : (openBlock(), createElementBlock("div", _hoisted_5$6, [
|
|
210
215
|
createElementVNode("div", _hoisted_6$5, [
|
|
211
216
|
createElementVNode("span", _hoisted_7$4, toDisplayString(((_b = __props.chatInfo) == null ? void 0 : _b.showName) || "聊天"), 1),
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
217
|
+
isNoticeAgent.value ? (openBlock(), createElementBlock("span", _hoisted_8$4, "通知")) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
|
|
218
|
+
createElementVNode("span", {
|
|
219
|
+
class: normalizeClass(["online-dot", { online: isOnline.value, offline: !isOnline.value }])
|
|
220
|
+
}, null, 2),
|
|
221
|
+
createElementVNode("span", _hoisted_9$4, toDisplayString(onlineText.value), 1)
|
|
222
|
+
], 64))
|
|
216
223
|
])
|
|
217
224
|
]))
|
|
218
225
|
];
|
|
@@ -238,7 +245,7 @@ const _sfc_main$5 = {
|
|
|
238
245
|
};
|
|
239
246
|
}
|
|
240
247
|
};
|
|
241
|
-
const ChatHeaderH5 = /* @__PURE__ */ _export_sfc(_sfc_main$
|
|
248
|
+
const ChatHeaderH5 = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-170f3859"]]);
|
|
242
249
|
let activeAudioMsg = null;
|
|
243
250
|
let activeVideoEl = null;
|
|
244
251
|
const audioPlayers = /* @__PURE__ */ new Map();
|
|
@@ -261,7 +268,10 @@ const pauseActiveVideo = () => {
|
|
|
261
268
|
const useAudioPlayer = () => {
|
|
262
269
|
const playAudio = async (msg) => {
|
|
263
270
|
var _a, _b;
|
|
271
|
+
if (!msg) return;
|
|
272
|
+
if (msg.status !== void 0 && msg.status !== 2) return;
|
|
264
273
|
const msgId = msg.clientMsgID;
|
|
274
|
+
if (!msgId) return;
|
|
265
275
|
if ((activeAudioMsg == null ? void 0 : activeAudioMsg.clientMsgID) === msgId) {
|
|
266
276
|
const player = audioPlayers.get(msgId);
|
|
267
277
|
if (player) {
|
|
@@ -357,14 +367,14 @@ const useAudioPlayer = () => {
|
|
|
357
367
|
};
|
|
358
368
|
const speakImg1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAATCAYAAACdkl3yAAAAAXNSR0IArs4c6QAAAZNJREFUOE+tk8+LjmEUhq9rxzALSXbCRiI/VhYWLJSdZjtJlJgsbOyMssH8AWz8KnZkM9mQZG8jolhokpUwsbAgxe19pufV6/OZ753y7J7zPOfqPvc5R/7TsS8nyVpgq/poWM5SQNPABWBKvToIWwpoBfAY2ARsV191YYuCkuwA5tQvJSnJZuAZcF+d6AVKsqYp4x1wr0meUH9W2EXgJLBNfdHCRik6A5wHJtXbFVRUPgVm1PK+cEZ6lOQ18EHd3SYlmQPm1V1DQUn2A8eAE+rHqmAGOA2MqV9rbBbYq676C5RkGbDwEbjbmpnkCHCjie1sYsXoYvpN4LD6u6I/SkvyFlgHnGvMPVuTWtBG9U2N3aoNWP6v0oqqMi+fO1261ozAoRJXf1TQE2C1ur6X2UnGgeLVrDpZISX2CbijHuwLegjsA7aoLyvoOHClOxKLtj/JWNO998C0eqlCVgLPgeLNBvVbX0Xj7XpU0HXg6LDFHTmQnSGcAi4DD4AD6vdeu9b9VNXsAU4VRer84HtvRYOJg/dfqOihFK69gr0AAAAASUVORK5CYII=";
|
|
359
369
|
const speakImg2 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAMAAAD04JH5AAAACGFjVEwAAAAVAAAAACFN2OIAAAMAUExURQAAAP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wc9CwgAAAD/dFJOUwABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6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";
|
|
360
|
-
const _hoisted_1$
|
|
361
|
-
const _hoisted_2$
|
|
362
|
-
const _hoisted_3$
|
|
363
|
-
const _hoisted_4$
|
|
370
|
+
const _hoisted_1$5 = ["innerHTML"];
|
|
371
|
+
const _hoisted_2$5 = ["innerHTML"];
|
|
372
|
+
const _hoisted_3$5 = ["innerHTML"];
|
|
373
|
+
const _hoisted_4$5 = {
|
|
364
374
|
key: 3,
|
|
365
375
|
class: "msg-con-img"
|
|
366
376
|
};
|
|
367
|
-
const _hoisted_5$
|
|
377
|
+
const _hoisted_5$5 = ["src"];
|
|
368
378
|
const _hoisted_6$4 = {
|
|
369
379
|
key: 0,
|
|
370
380
|
class: "name-txt"
|
|
@@ -399,7 +409,7 @@ const videoExtensions = ".mp4.avi.mov.wmv.flv.webm.mkv.mpeg.mpg";
|
|
|
399
409
|
const wordExtensions = ".doc.docx";
|
|
400
410
|
const pdfExtensions = ".pdf";
|
|
401
411
|
const excelExtensions = ".xlsx.xls.xlsm.xlsb.xltx.xltm";
|
|
402
|
-
const _sfc_main$
|
|
412
|
+
const _sfc_main$5 = {
|
|
403
413
|
__name: "MessageItemH5",
|
|
404
414
|
props: {
|
|
405
415
|
msgInfo: {
|
|
@@ -554,24 +564,24 @@ const _sfc_main$4 = {
|
|
|
554
564
|
class: normalizeClass(["msg-con-txt", { "is-reply": props.isReply, "is-self": msg.value.isSelf }]),
|
|
555
565
|
style: normalizeStyle(msgStyle.value),
|
|
556
566
|
innerHTML: handleLinks$1(msg.value.textElem.content)
|
|
557
|
-
}, null, 14, _hoisted_1$
|
|
567
|
+
}, null, 14, _hoisted_1$5)) : msg.value.atTextElem ? (openBlock(), createElementBlock("div", {
|
|
558
568
|
key: 1,
|
|
559
569
|
class: normalizeClass(["msg-con-txt", { "is-reply": props.isReply, "is-self": msg.value.isSelf }]),
|
|
560
570
|
style: normalizeStyle(msgStyle.value),
|
|
561
571
|
innerHTML: handleAtMessage(msg.value.atTextElem)
|
|
562
|
-
}, null, 14, _hoisted_2$
|
|
572
|
+
}, null, 14, _hoisted_2$5)) : msg.value.quoteElem ? (openBlock(), createElementBlock("div", {
|
|
563
573
|
key: 2,
|
|
564
574
|
class: normalizeClass(["msg-con-txt", { "is-reply": props.isReply, "is-self": msg.value.isSelf }]),
|
|
565
575
|
style: normalizeStyle(msgStyle.value),
|
|
566
576
|
innerHTML: handleLinks$1((_a = msg.value.quoteElem) == null ? void 0 : _a.text)
|
|
567
|
-
}, null, 14, _hoisted_3$
|
|
577
|
+
}, null, 14, _hoisted_3$5)) : msg.value.pictureElem ? (openBlock(), createElementBlock("div", _hoisted_4$5, [
|
|
568
578
|
createElementVNode("img", {
|
|
569
579
|
src: ((_b = msg.value.pictureElem.snapshotPicture) == null ? void 0 : _b.url) || ((_c = msg.value.pictureElem.sourcePicture) == null ? void 0 : _c.url),
|
|
570
580
|
style: normalizeStyle(imageStyle.value),
|
|
571
581
|
class: "img-content",
|
|
572
582
|
onClick: withModifiers(onClickImage, ["stop"]),
|
|
573
583
|
alt: ""
|
|
574
|
-
}, null, 12, _hoisted_5$
|
|
584
|
+
}, null, 12, _hoisted_5$5)
|
|
575
585
|
])) : msg.value.fileElem ? (openBlock(), createElementBlock("div", {
|
|
576
586
|
key: 4,
|
|
577
587
|
class: normalizeClass(["msg-con-file", { "is-reply": props.isReply, "is-self": msg.value.isSelf }])
|
|
@@ -671,18 +681,18 @@ const _sfc_main$4 = {
|
|
|
671
681
|
};
|
|
672
682
|
}
|
|
673
683
|
};
|
|
674
|
-
const MessageItemH5 = /* @__PURE__ */ _export_sfc(_sfc_main$
|
|
675
|
-
const _hoisted_1$
|
|
684
|
+
const MessageItemH5 = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-c2f5294e"]]);
|
|
685
|
+
const _hoisted_1$4 = {
|
|
676
686
|
key: 0,
|
|
677
687
|
class: "loading-area"
|
|
678
688
|
};
|
|
679
|
-
const _hoisted_2$
|
|
680
|
-
const _hoisted_3$
|
|
689
|
+
const _hoisted_2$4 = ["id", "onClick"];
|
|
690
|
+
const _hoisted_3$4 = {
|
|
681
691
|
key: 0,
|
|
682
692
|
class: "tips-box"
|
|
683
693
|
};
|
|
684
|
-
const _hoisted_4$
|
|
685
|
-
const _hoisted_5$
|
|
694
|
+
const _hoisted_4$4 = { class: "tips-time" };
|
|
695
|
+
const _hoisted_5$4 = { class: "tips-txt" };
|
|
686
696
|
const _hoisted_6$3 = {
|
|
687
697
|
key: 0,
|
|
688
698
|
class: "check-box"
|
|
@@ -701,28 +711,32 @@ const _hoisted_13$2 = {
|
|
|
701
711
|
class: "msg-status"
|
|
702
712
|
};
|
|
703
713
|
const _hoisted_14$2 = { class: "quote-con-txt" };
|
|
704
|
-
const _hoisted_15$2 =
|
|
705
|
-
|
|
706
|
-
|
|
714
|
+
const _hoisted_15$2 = {
|
|
715
|
+
key: 0,
|
|
716
|
+
class: "msg-burn-count"
|
|
717
|
+
};
|
|
718
|
+
const _hoisted_16$1 = ["src", "onClick"];
|
|
719
|
+
const _hoisted_17$1 = ["onClick"];
|
|
720
|
+
const _hoisted_18$1 = {
|
|
707
721
|
key: 1,
|
|
708
722
|
class: "empty-msg"
|
|
709
723
|
};
|
|
710
|
-
const
|
|
711
|
-
const
|
|
712
|
-
const
|
|
713
|
-
const
|
|
714
|
-
const
|
|
715
|
-
const
|
|
716
|
-
const
|
|
717
|
-
const
|
|
718
|
-
const
|
|
719
|
-
const
|
|
720
|
-
const
|
|
721
|
-
const
|
|
722
|
-
const
|
|
723
|
-
const
|
|
724
|
+
const _hoisted_19$1 = { class: "action-sheet-list" };
|
|
725
|
+
const _hoisted_20$1 = ["onClick"];
|
|
726
|
+
const _hoisted_21$1 = { class: "action-name" };
|
|
727
|
+
const _hoisted_22$1 = { class: "merge-msg-popup" };
|
|
728
|
+
const _hoisted_23$1 = { class: "merge-msg-popup__header" };
|
|
729
|
+
const _hoisted_24$1 = { class: "merge-msg-popup__title" };
|
|
730
|
+
const _hoisted_25$1 = { class: "merge-msg-popup__list" };
|
|
731
|
+
const _hoisted_26$1 = ["src"];
|
|
732
|
+
const _hoisted_27$1 = { class: "merge-msg-item__info" };
|
|
733
|
+
const _hoisted_28$1 = { class: "merge-msg-item__head" };
|
|
734
|
+
const _hoisted_29$1 = { class: "merge-msg-item__name" };
|
|
735
|
+
const _hoisted_30$1 = { class: "merge-msg-item__time" };
|
|
736
|
+
const _hoisted_31$1 = { class: "merge-msg-item__content" };
|
|
737
|
+
const _hoisted_32$1 = { class: "merge-msg-popup__footer" };
|
|
724
738
|
const maxSelectCount = 20;
|
|
725
|
-
const _sfc_main$
|
|
739
|
+
const _sfc_main$4 = {
|
|
726
740
|
__name: "MessageListH5",
|
|
727
741
|
props: {
|
|
728
742
|
imInstance: {
|
|
@@ -761,6 +775,7 @@ const _sfc_main$3 = {
|
|
|
761
775
|
const chatMessage = useChatStore();
|
|
762
776
|
computed(() => chatMessage.getUserInfo);
|
|
763
777
|
const baseUrl = computed(() => chatMessage.getBaseUrl);
|
|
778
|
+
const { scheduleBurn, burnRemain } = useBurnAfterReading();
|
|
764
779
|
const messageContainer = ref(null);
|
|
765
780
|
const listContainer = ref(null);
|
|
766
781
|
const localMsgList = ref([]);
|
|
@@ -1012,36 +1027,46 @@ const _sfc_main$3 = {
|
|
|
1012
1027
|
const onResendMsg = (msg) => {
|
|
1013
1028
|
showToast("重发功能开发中");
|
|
1014
1029
|
};
|
|
1015
|
-
const handleNotificationDetail = (jsonObj, type) => {
|
|
1016
|
-
|
|
1030
|
+
const handleNotificationDetail = (jsonObj, type, msg) => {
|
|
1031
|
+
var _a;
|
|
1032
|
+
return jsonObj ? getJsonDetail(jsonObj, type, msg, (_a = props.chatInfo) == null ? void 0 : _a.showName) : "";
|
|
1017
1033
|
};
|
|
1018
1034
|
let isLoadingMoreAhead = false;
|
|
1019
1035
|
const loadMore = async (direction) => {
|
|
1036
|
+
var _a, _b;
|
|
1020
1037
|
if (!props.imInstance) return;
|
|
1021
1038
|
const cvs = props.chatInfo;
|
|
1022
1039
|
const cvsID = (cvs == null ? void 0 : cvs.conversationID) || "";
|
|
1023
1040
|
if (!cvsID) return;
|
|
1024
1041
|
if (direction === "ahead") {
|
|
1025
1042
|
if (isFirstMessage.value || isLoadingMoreAhead) return;
|
|
1043
|
+
if (localMsgList.value.length === 0) return;
|
|
1026
1044
|
isLoadingMoreAhead = true;
|
|
1027
1045
|
isLoadingMore.value = true;
|
|
1028
1046
|
try {
|
|
1029
|
-
const startID = localMsgList.value
|
|
1047
|
+
const startID = localMsgList.value[0].clientMsgID;
|
|
1030
1048
|
const { list, isEnd } = await props.imInstance.getAdvancedHistoryMessageList({
|
|
1031
1049
|
conversationID: cvsID,
|
|
1032
1050
|
startClientMsgID: startID,
|
|
1033
1051
|
count: pageCount.value
|
|
1034
1052
|
});
|
|
1053
|
+
if (((_a = props.chatInfo) == null ? void 0 : _a.conversationID) !== cvsID) return;
|
|
1035
1054
|
isFirstMessage.value = isEnd;
|
|
1036
1055
|
if (list.length > 0) {
|
|
1037
1056
|
const { handleMessageList } = useMsgList();
|
|
1038
|
-
const
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
if (
|
|
1044
|
-
container
|
|
1057
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1058
|
+
localMsgList.value.forEach((item) => {
|
|
1059
|
+
if (item == null ? void 0 : item.clientMsgID) seen.add(item.clientMsgID);
|
|
1060
|
+
});
|
|
1061
|
+
const newList = dedupeMessages(handleMessageList(list), seen);
|
|
1062
|
+
if (newList.length > 0) {
|
|
1063
|
+
const container = messageContainer.value;
|
|
1064
|
+
const oldHeight = (container == null ? void 0 : container.scrollHeight) || 0;
|
|
1065
|
+
localMsgList.value = [...newList, ...localMsgList.value];
|
|
1066
|
+
await nextTick();
|
|
1067
|
+
if (container) {
|
|
1068
|
+
container.scrollTop = container.scrollHeight - oldHeight;
|
|
1069
|
+
}
|
|
1045
1070
|
}
|
|
1046
1071
|
}
|
|
1047
1072
|
} catch (e) {
|
|
@@ -1059,11 +1084,18 @@ const _sfc_main$3 = {
|
|
|
1059
1084
|
startClientMsgID: startID,
|
|
1060
1085
|
count: pageCount.value
|
|
1061
1086
|
});
|
|
1087
|
+
if (((_b = props.chatInfo) == null ? void 0 : _b.conversationID) !== cvsID) return;
|
|
1062
1088
|
isLastMessage.value = isEnd;
|
|
1063
1089
|
if (list.length > 0) {
|
|
1064
1090
|
const { handleMessageList } = useMsgList();
|
|
1065
|
-
const
|
|
1066
|
-
localMsgList.value
|
|
1091
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1092
|
+
localMsgList.value.forEach((item) => {
|
|
1093
|
+
if (item == null ? void 0 : item.clientMsgID) seen.add(item.clientMsgID);
|
|
1094
|
+
});
|
|
1095
|
+
const newList = dedupeMessages(handleMessageList(list.slice(1)), seen);
|
|
1096
|
+
if (newList.length > 0) {
|
|
1097
|
+
localMsgList.value = [...localMsgList.value, ...newList];
|
|
1098
|
+
}
|
|
1067
1099
|
}
|
|
1068
1100
|
} catch (e) {
|
|
1069
1101
|
console.error("加载更多新消息失败:", e);
|
|
@@ -1129,6 +1161,30 @@ const _sfc_main$3 = {
|
|
|
1129
1161
|
selectMsgs.value = [];
|
|
1130
1162
|
closeMenu();
|
|
1131
1163
|
};
|
|
1164
|
+
const burnCvsID = computed(() => {
|
|
1165
|
+
var _a;
|
|
1166
|
+
return ((_a = props.chatInfo) == null ? void 0 : _a.conversationID) || "";
|
|
1167
|
+
});
|
|
1168
|
+
const scheduleCurrentBurns = () => {
|
|
1169
|
+
const cvsID = burnCvsID.value;
|
|
1170
|
+
if (!cvsID) return;
|
|
1171
|
+
const focused = chatMessage.getIsFocused;
|
|
1172
|
+
[...props.messageList].forEach((msg) => {
|
|
1173
|
+
if (!isBurnMessage(msg)) return;
|
|
1174
|
+
if (isBurned(msg)) {
|
|
1175
|
+
scheduleBurn(cvsID, msg, 0);
|
|
1176
|
+
return;
|
|
1177
|
+
}
|
|
1178
|
+
if (msg.isSelf && !msg.isRead) return;
|
|
1179
|
+
if (!msg.isSelf && !focused) return;
|
|
1180
|
+
scheduleBurn(cvsID, msg);
|
|
1181
|
+
});
|
|
1182
|
+
};
|
|
1183
|
+
onMounted(scheduleCurrentBurns);
|
|
1184
|
+
watch(() => props.messageList, scheduleCurrentBurns, { deep: true });
|
|
1185
|
+
watch(burnCvsID, () => {
|
|
1186
|
+
scheduleCurrentBurns();
|
|
1187
|
+
});
|
|
1132
1188
|
__expose({ resetMessageList, closeMultiSelect });
|
|
1133
1189
|
return (_ctx, _cache) => {
|
|
1134
1190
|
return openBlock(), createElementBlock("div", {
|
|
@@ -1142,7 +1198,7 @@ const _sfc_main$3 = {
|
|
|
1142
1198
|
ref: messageContainer,
|
|
1143
1199
|
onClick: closeMenu
|
|
1144
1200
|
}, [
|
|
1145
|
-
isLoadingMore.value ? (openBlock(), createElementBlock("div", _hoisted_1$
|
|
1201
|
+
isLoadingMore.value ? (openBlock(), createElementBlock("div", _hoisted_1$4, [
|
|
1146
1202
|
createVNode(unref(Loading), {
|
|
1147
1203
|
size: "20",
|
|
1148
1204
|
color: "var(--chat-theme-color, #1989fa)",
|
|
@@ -1162,9 +1218,9 @@ const _sfc_main$3 = {
|
|
|
1162
1218
|
key: item.clientMsgID || item.seq || index,
|
|
1163
1219
|
onClick: ($event) => onMsgItemClick(item)
|
|
1164
1220
|
}, [
|
|
1165
|
-
item.contentType > 200 ? (openBlock(), createElementBlock("div", _hoisted_3$
|
|
1166
|
-
createElementVNode("div", _hoisted_4$
|
|
1167
|
-
createElementVNode("div", _hoisted_5$
|
|
1221
|
+
item.contentType > 200 ? (openBlock(), createElementBlock("div", _hoisted_3$4, [
|
|
1222
|
+
createElementVNode("div", _hoisted_4$4, toDisplayString(item.showSendTime || item.showCreateTime), 1),
|
|
1223
|
+
createElementVNode("div", _hoisted_5$4, toDisplayString(handleNotificationDetail((_a = item.notificationElem) == null ? void 0 : _a.detail, item.contentType, item)), 1)
|
|
1168
1224
|
])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
|
|
1169
1225
|
isMultiSelect.value ? (openBlock(), createElementBlock("div", _hoisted_6$3, [
|
|
1170
1226
|
createVNode(unref(Checkbox), {
|
|
@@ -1237,7 +1293,15 @@ const _sfc_main$3 = {
|
|
|
1237
1293
|
!isGroupChat.value && item.isSelf && item.status === 2 ? (openBlock(), createElementBlock("div", {
|
|
1238
1294
|
key: 1,
|
|
1239
1295
|
class: normalizeClass(["msg-read", { "no-read": !item.isRead }])
|
|
1240
|
-
}, toDisplayString(item.isRead ? "已读" : "未读"), 3)) : createCommentVNode("", true)
|
|
1296
|
+
}, toDisplayString(item.isRead ? "已读" : "未读"), 3)) : createCommentVNode("", true),
|
|
1297
|
+
unref(isBurnMessage)(item) ? (openBlock(), createElementBlock("div", {
|
|
1298
|
+
key: 2,
|
|
1299
|
+
class: normalizeClass(["msg-burn", { self: item.isSelf }])
|
|
1300
|
+
}, [
|
|
1301
|
+
_cache[6] || (_cache[6] = createElementVNode("span", { class: "msg-burn-icon" }, "🔥", -1)),
|
|
1302
|
+
_cache[7] || (_cache[7] = createElementVNode("span", { class: "msg-burn-label" }, "阅后即焚", -1)),
|
|
1303
|
+
unref(burnRemain)(item, burnCvsID.value) > 0 ? (openBlock(), createElementBlock("span", _hoisted_15$2, toDisplayString(unref(formatBurnRemain)(unref(burnRemain)(item, burnCvsID.value))), 1)) : createCommentVNode("", true)
|
|
1304
|
+
], 2)) : createCommentVNode("", true)
|
|
1241
1305
|
], 32),
|
|
1242
1306
|
item.isSelf && !unref(isDefaultAvatar)(item.senderFaceUrl) ? (openBlock(), createElementBlock("img", {
|
|
1243
1307
|
key: 3,
|
|
@@ -1245,16 +1309,16 @@ const _sfc_main$3 = {
|
|
|
1245
1309
|
src: unref(handleUrl)(item.senderFaceUrl, baseUrl.value),
|
|
1246
1310
|
alt: "",
|
|
1247
1311
|
onClick: withModifiers(($event) => onViewMember(item), ["stop"])
|
|
1248
|
-
}, null, 8,
|
|
1312
|
+
}, null, 8, _hoisted_16$1)) : item.isSelf ? (openBlock(), createElementBlock("div", {
|
|
1249
1313
|
key: 4,
|
|
1250
1314
|
class: "msg-avatar avatar-text",
|
|
1251
1315
|
style: normalizeStyle({ background: unref(getAvatarBg)(item.sendID) }),
|
|
1252
1316
|
onClick: withModifiers(($event) => onViewMember(item), ["stop"])
|
|
1253
|
-
}, toDisplayString(unref(getAvatarText)(item.senderNickname, 2)), 13,
|
|
1317
|
+
}, toDisplayString(unref(getAvatarText)(item.senderNickname, 2)), 13, _hoisted_17$1)) : createCommentVNode("", true)
|
|
1254
1318
|
], 64))
|
|
1255
|
-
], 10, _hoisted_2$
|
|
1319
|
+
], 10, _hoisted_2$4);
|
|
1256
1320
|
}), 128)),
|
|
1257
|
-
localMsgList.value.length === 0 && !isLoadingMore.value ? (openBlock(), createElementBlock("div",
|
|
1321
|
+
localMsgList.value.length === 0 && !isLoadingMore.value ? (openBlock(), createElementBlock("div", _hoisted_18$1, [..._cache[8] || (_cache[8] = [
|
|
1258
1322
|
createElementVNode("span", null, "暂无消息,发送第一条消息吧", -1)
|
|
1259
1323
|
])])) : createCommentVNode("", true)
|
|
1260
1324
|
], 512),
|
|
@@ -1277,7 +1341,7 @@ const _sfc_main$3 = {
|
|
|
1277
1341
|
onCancel: _cache[3] || (_cache[3] = ($event) => showLongPressMenu.value = false)
|
|
1278
1342
|
}, {
|
|
1279
1343
|
default: withCtx(() => [
|
|
1280
|
-
createElementVNode("div",
|
|
1344
|
+
createElementVNode("div", _hoisted_19$1, [
|
|
1281
1345
|
(openBlock(true), createElementBlock(Fragment, null, renderList(longPressActions.value, (action) => {
|
|
1282
1346
|
return openBlock(), createElementBlock("div", {
|
|
1283
1347
|
key: action.key,
|
|
@@ -1290,8 +1354,8 @@ const _sfc_main$3 = {
|
|
|
1290
1354
|
size: "20px",
|
|
1291
1355
|
class: "action-icon"
|
|
1292
1356
|
}, null, 8, ["name"]),
|
|
1293
|
-
createElementVNode("span",
|
|
1294
|
-
], 12,
|
|
1357
|
+
createElementVNode("span", _hoisted_21$1, toDisplayString(action.name), 1)
|
|
1358
|
+
], 12, _hoisted_20$1);
|
|
1295
1359
|
}), 128))
|
|
1296
1360
|
])
|
|
1297
1361
|
]),
|
|
@@ -1308,11 +1372,11 @@ const _sfc_main$3 = {
|
|
|
1308
1372
|
onClose: onCloseMergeMsg
|
|
1309
1373
|
}, {
|
|
1310
1374
|
default: withCtx(() => [
|
|
1311
|
-
createElementVNode("div",
|
|
1312
|
-
createElementVNode("div",
|
|
1313
|
-
createElementVNode("span",
|
|
1375
|
+
createElementVNode("div", _hoisted_22$1, [
|
|
1376
|
+
createElementVNode("div", _hoisted_23$1, [
|
|
1377
|
+
createElementVNode("span", _hoisted_24$1, toDisplayString(mergeMsgTitle.value), 1)
|
|
1314
1378
|
]),
|
|
1315
|
-
createElementVNode("div",
|
|
1379
|
+
createElementVNode("div", _hoisted_25$1, [
|
|
1316
1380
|
(openBlock(true), createElementBlock(Fragment, null, renderList(mergeMsgList.value, (item, idx) => {
|
|
1317
1381
|
return openBlock(), createElementBlock("div", {
|
|
1318
1382
|
key: item.clientMsgID || idx,
|
|
@@ -1324,17 +1388,17 @@ const _sfc_main$3 = {
|
|
|
1324
1388
|
src: unref(handleUrl)(item.senderFaceUrl, baseUrl.value),
|
|
1325
1389
|
alt: "",
|
|
1326
1390
|
onError: onMergeMsgAvatarError
|
|
1327
|
-
}, null, 40,
|
|
1391
|
+
}, null, 40, _hoisted_26$1)) : (openBlock(), createElementBlock("div", {
|
|
1328
1392
|
key: 1,
|
|
1329
1393
|
class: "merge-msg-item__avatar merge-msg-item__avatar--text",
|
|
1330
1394
|
style: normalizeStyle({ background: unref(getAvatarBg)(item.sendID) })
|
|
1331
1395
|
}, toDisplayString(unref(getAvatarText)(item.senderNickname, 2)), 5)),
|
|
1332
|
-
createElementVNode("div",
|
|
1333
|
-
createElementVNode("div",
|
|
1334
|
-
createElementVNode("span",
|
|
1335
|
-
createElementVNode("span",
|
|
1396
|
+
createElementVNode("div", _hoisted_27$1, [
|
|
1397
|
+
createElementVNode("div", _hoisted_28$1, [
|
|
1398
|
+
createElementVNode("span", _hoisted_29$1, toDisplayString(item.senderNickname), 1),
|
|
1399
|
+
createElementVNode("span", _hoisted_30$1, toDisplayString(item.showSendTime), 1)
|
|
1336
1400
|
]),
|
|
1337
|
-
createElementVNode("div",
|
|
1401
|
+
createElementVNode("div", _hoisted_31$1, [
|
|
1338
1402
|
createVNode(MessageItemH5, {
|
|
1339
1403
|
"msg-info": item,
|
|
1340
1404
|
"is-group-chat": true,
|
|
@@ -1349,14 +1413,14 @@ const _sfc_main$3 = {
|
|
|
1349
1413
|
description: "暂无消息"
|
|
1350
1414
|
})) : createCommentVNode("", true)
|
|
1351
1415
|
]),
|
|
1352
|
-
createElementVNode("div",
|
|
1416
|
+
createElementVNode("div", _hoisted_32$1, [
|
|
1353
1417
|
createVNode(unref(Button), {
|
|
1354
1418
|
class: "merge-msg-popup__close-btn",
|
|
1355
1419
|
block: "",
|
|
1356
1420
|
round: "",
|
|
1357
1421
|
onClick: onCloseMergeMsg
|
|
1358
1422
|
}, {
|
|
1359
|
-
default: withCtx(() => [..._cache[
|
|
1423
|
+
default: withCtx(() => [..._cache[9] || (_cache[9] = [
|
|
1360
1424
|
createTextVNode(" 关闭 ", -1)
|
|
1361
1425
|
])]),
|
|
1362
1426
|
_: 1
|
|
@@ -1370,18 +1434,18 @@ const _sfc_main$3 = {
|
|
|
1370
1434
|
};
|
|
1371
1435
|
}
|
|
1372
1436
|
};
|
|
1373
|
-
const MessageListH5 = /* @__PURE__ */ _export_sfc(_sfc_main$
|
|
1437
|
+
const MessageListH5 = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-828967da"]]);
|
|
1374
1438
|
const emojis = /* @__PURE__ */ JSON.parse(`[{"annotation":"嘿嘿","name":"GRINNING FACE","hexcode":"1F600","shortcodes":["gleeful"],"tags":["笑脸","脸"],"emoji":"😀","text":"","type":1,"order":1,"group":0,"subgroup":0,"version":1,"emoticon":":D"},{"annotation":"哈哈","name":"SMILING FACE WITH OPEN MOUTH","hexcode":"1F603","shortcodes":["glad","smile"],"tags":["开口笑","笑脸","脸"],"emoji":"😃","text":"","type":1,"order":2,"group":0,"subgroup":0,"version":0.6},{"annotation":"大笑","name":"SMILING FACE WITH OPEN MOUTH AND SMILING EYES","hexcode":"1F604","shortcodes":["happy"],"tags":["哈哈","开心","笑","脸","高兴"],"emoji":"😄","text":"","type":1,"order":3,"group":0,"subgroup":0,"version":0.6},{"annotation":"嘻嘻","name":"GRINNING FACE WITH SMILING EYES","hexcode":"1F601","shortcodes":["blissful","grin"],"tags":["笑脸","脸"],"emoji":"😁","text":"","type":1,"order":4,"group":0,"subgroup":0,"version":0.6},{"annotation":"斜眼笑","name":"SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES","hexcode":"1F606","shortcodes":["amused","laugh","lol"],"tags":["开心","眯眼","笑","脸","高兴"],"emoji":"😆","text":"","type":1,"order":5,"group":0,"subgroup":0,"version":0.6,"emoticon":"xD"},{"annotation":"苦笑","name":"SMILING FACE WITH OPEN MOUTH AND COLD SWEAT","hexcode":"1F605","shortcodes":["embarassed","sweat_smile"],"tags":["冷汗","汗","脸"],"emoji":"😅","text":"","type":1,"order":6,"group":0,"subgroup":0,"version":0.6},{"annotation":"笑得满地打滚","name":"ROLLING ON THE FLOOR LAUGHING","hexcode":"1F923","shortcodes":["entertained","rofl"],"tags":["地板","打滚","笑","脸"],"emoji":"🤣","text":"","type":1,"order":7,"group":0,"subgroup":0,"version":3,"emoticon":":'D"},{"annotation":"笑哭了","name":"FACE WITH TEARS OF JOY","hexcode":"1F602","shortcodes":["joyful","haha"],"tags":["眼泪","笑","脸"],"emoji":"😂","text":"","type":1,"order":8,"group":0,"subgroup":0,"version":0.6,"emoticon":":')"},{"annotation":"呵呵","name":"SLIGHTLY SMILING FACE","hexcode":"1F642","shortcodes":["pleased","slight_smile"],"tags":["开心","笑","脸"],"emoji":"🙂","text":"","type":1,"order":9,"group":0,"subgroup":0,"version":1,"emoticon":":)"},{"annotation":"倒脸","name":"UPSIDE-DOWN FACE","hexcode":"1F643","shortcodes":["ecstatic","upside_down"],"tags":["脸","颠倒","颠倒的脸"],"emoji":"🙃","text":"","type":1,"order":10,"group":0,"subgroup":0,"version":1},{"annotation":"眨眼","name":"WINKING FACE","hexcode":"1F609","shortcodes":["coy","wink"],"tags":["媚眼","笑"],"emoji":"😉","text":"","type":1,"order":11,"group":0,"subgroup":0,"version":0.6,"emoticon":";)"},{"annotation":"羞涩微笑","name":"SMILING FACE WITH SMILING EYES","hexcode":"1F60A","shortcodes":["blush"],"tags":["害羞","微笑","羞涩","脸","脸红"],"emoji":"😊","text":"","type":1,"order":12,"group":0,"subgroup":0,"version":0.6,"emoticon":":>"},{"annotation":"微笑天使","name":"SMILING FACE WITH HALO","hexcode":"1F607","shortcodes":["innocent","halo"],"tags":["光环","天使","天真","幻想","微笑","脸"],"emoji":"😇","text":"","type":1,"order":13,"group":0,"subgroup":0,"version":1,"emoticon":"o:)"},{"annotation":"喜笑颜开","name":"SMILING FACE WITH SMILING EYES AND THREE HEARTS","hexcode":"1F970","shortcodes":["love"],"tags":["心","爱慕","迷恋","陷入爱河"],"emoji":"🥰","text":"","type":1,"order":14,"group":0,"subgroup":1,"version":11},{"annotation":"花痴","name":"SMILING FACE WITH HEART-SHAPED EYES","hexcode":"1F60D","shortcodes":["lovestruck"],"tags":["爱","红心","脸"],"emoji":"😍","text":"","type":1,"order":15,"group":0,"subgroup":1,"version":0.6},{"annotation":"好崇拜哦","name":"GRINNING FACE WITH STAR EYES","hexcode":"1F929","shortcodes":["starstruck"],"tags":["咧嘴笑","脸","露齿笑"],"emoji":"🤩","text":"","type":1,"order":16,"group":0,"subgroup":1,"version":5},{"annotation":"飞吻","name":"FACE THROWING A KISS","hexcode":"1F618","shortcodes":["flirty"],"tags":["亲亲","眨眼","脸"],"emoji":"😘","text":"","type":1,"order":17,"group":0,"subgroup":1,"version":0.6,"emoticon":":x"},{"annotation":"亲亲","name":"KISSING FACE","hexcode":"1F617","shortcodes":["kiss"],"tags":["吻","脸"],"emoji":"😗","text":"","type":1,"order":18,"group":0,"subgroup":1,"version":1},{"annotation":"微笑","name":"WHITE SMILING FACE","hexcode":"263A","shortcodes":["relaxed"],"tags":["呵呵","开心","放松","笑","脸"],"emoji":"☺️","text":"☺︎","type":0,"order":20,"group":0,"subgroup":1,"version":0.6},{"annotation":"羞涩亲亲","name":"KISSING FACE WITH CLOSED EYES","hexcode":"1F61A","shortcodes":["loving_kiss"],"tags":["亲亲","吻","羞涩","脸","闭眼"],"emoji":"😚","text":"","type":1,"order":21,"group":0,"subgroup":1,"version":0.6,"emoticon":":*"},{"annotation":"微笑亲亲","name":"KISSING FACE WITH SMILING EYES","hexcode":"1F619","shortcodes":["happy_kiss"],"tags":["亲亲","吻","微笑","脸"],"emoji":"😙","text":"","type":1,"order":22,"group":0,"subgroup":1,"version":1},{"annotation":"含泪的笑脸","name":"SMILING FACE WITH TEAR","hexcode":"1F972","shortcodes":["tear_smile"],"tags":["微笑的","感动的","感恩的","眼泪","释怀的","骄傲的"],"emoji":"🥲","text":"","type":1,"order":23,"group":0,"subgroup":1,"version":13},{"annotation":"好吃","name":"FACE SAVOURING DELICIOUS FOOD","hexcode":"1F60B","shortcodes":["yum","savour"],"tags":["津津有味","美味","脸"],"emoji":"😋","text":"","type":1,"order":24,"group":0,"subgroup":2,"version":0.6},{"annotation":"吐舌","name":"FACE WITH STUCK-OUT TONGUE","hexcode":"1F61B","shortcodes":["playful","tongue_out"],"tags":["脸","舌头","调皮"],"emoji":"😛","text":"","type":1,"order":25,"group":0,"subgroup":2,"version":1,"emoticon":":p"},{"annotation":"单眼吐舌","name":"FACE WITH STUCK-OUT TONGUE AND WINKING EYE","hexcode":"1F61C","shortcodes":["mischievous"],"tags":["单眼","吐舌","开玩笑","脸"],"emoji":"😜","text":"","type":1,"order":26,"group":0,"subgroup":2,"version":0.6,"emoticon":";p"},{"annotation":"滑稽","name":"GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE","hexcode":"1F92A","shortcodes":["crazy"],"tags":["大眼","小眼","滑稽的脸","疯狂的脸","脸"],"emoji":"🤪","text":"","type":1,"order":27,"group":0,"subgroup":2,"version":5},{"annotation":"眯眼吐舌","name":"FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES","hexcode":"1F61D","shortcodes":["facetious","lmao"],"tags":["可怕","吐舌","眯眼","眼睛","脸"],"emoji":"😝","text":"","type":1,"order":28,"group":0,"subgroup":2,"version":0.6,"emoticon":"xp"},{"annotation":"发财","name":"MONEY-MOUTH FACE","hexcode":"1F911","shortcodes":["pretentious","money_mouth"],"tags":["拜金","脸","见钱眼开","钱"],"emoji":"🤑","text":"","type":1,"order":29,"group":0,"subgroup":2,"version":1},{"annotation":"抱抱","name":"HUGGING FACE","hexcode":"1F917","shortcodes":["hugging"],"tags":["抱","拥抱","笑","脸"],"emoji":"🤗","text":"","type":1,"order":30,"group":0,"subgroup":3,"version":1},{"annotation":"不说","name":"SMILING FACE WITH SMILING EYES AND HAND COVERING MOUTH","hexcode":"1F92D","shortcodes":["gasp"],"tags":["哎呀","脸"],"emoji":"🤭","text":"","type":1,"order":31,"group":0,"subgroup":3,"version":5},{"annotation":"安静的脸","name":"FACE WITH FINGER COVERING CLOSED LIPS","hexcode":"1F92B","shortcodes":["shushing"],"tags":["嘘","安静"],"emoji":"🤫","text":"","type":1,"order":32,"group":0,"subgroup":3,"version":5},{"annotation":"想一想","name":"THINKING FACE","hexcode":"1F914","shortcodes":["curious","thinking"],"tags":["思考","想","脸"],"emoji":"🤔","text":"","type":1,"order":33,"group":0,"subgroup":3,"version":1,"emoticon":":l"},{"annotation":"闭嘴","name":"ZIPPER-MOUTH FACE","hexcode":"1F910","shortcodes":["silenced","zipper_mouth"],"tags":["嘴","脸"],"emoji":"🤐","text":"","type":1,"order":34,"group":0,"subgroup":4,"version":1,"emoticon":":z"},{"annotation":"挑眉","name":"FACE WITH ONE EYEBROW RAISED","hexcode":"1F928","shortcodes":["contempt"],"tags":["不信任","怀疑","眉毛上挑的脸","脸"],"emoji":"🤨","text":"","type":1,"order":35,"group":0,"subgroup":4,"version":5},{"annotation":"冷漠","name":"NEUTRAL FACE","hexcode":"1F610","shortcodes":["indifferent","neutral"],"tags":["脸","面无表情"],"emoji":"😐️","text":"😐︎","type":1,"order":36,"group":0,"subgroup":4,"version":0.7,"emoticon":":|"},{"annotation":"无语","name":"EXPRESSIONLESS FACE","hexcode":"1F611","shortcodes":["apathetic","expressionless"],"tags":["脸","茫然","面无表情"],"emoji":"😑","text":"","type":1,"order":37,"group":0,"subgroup":4,"version":1},{"annotation":"沉默","name":"FACE WITHOUT MOUTH","hexcode":"1F636","shortcodes":["vacant","no_mouth"],"tags":["嘴","安静","脸"],"emoji":"😶","text":"","type":1,"order":38,"group":0,"subgroup":4,"version":1,"emoticon":":#"},{"annotation":"得意","name":"SMIRKING FACE","hexcode":"1F60F","shortcodes":["cocky","smirk"],"tags":["假笑"],"emoji":"😏","text":"","type":1,"order":39,"group":0,"subgroup":4,"version":0.6,"emoticon":":j"},{"annotation":"不高兴","name":"UNAMUSED FACE","hexcode":"1F612","shortcodes":["unamused"],"tags":["不屑","不服","脸","郁闷","鄙视"],"emoji":"😒","text":"","type":1,"order":40,"group":0,"subgroup":4,"version":0.6,"emoticon":":?"},{"annotation":"翻白眼","name":"FACE WITH ROLLING EYES","hexcode":"1F644","shortcodes":["disbelief"],"tags":["无语","白眼","脸"],"emoji":"🙄","text":"","type":1,"order":41,"group":0,"subgroup":4,"version":1},{"annotation":"龇牙咧嘴","name":"GRIMACING FACE","hexcode":"1F62C","shortcodes":["grimaced"],"tags":["咬牙切齿","脸","露齿","鬼脸"],"emoji":"😬","text":"","type":1,"order":42,"group":0,"subgroup":4,"version":1,"emoticon":"8D"},{"annotation":"说谎","name":"LYING FACE","hexcode":"1F925","shortcodes":["lying"],"tags":["匹诺曹","脸","长鼻子"],"emoji":"🤥","text":"","type":1,"order":43,"group":0,"subgroup":4,"version":3},{"annotation":"松了口气","name":"RELIEVED FACE","hexcode":"1F60C","shortcodes":["relieved"],"tags":["如释重负","松口气","脸"],"emoji":"😌","text":"","type":1,"order":44,"group":0,"subgroup":5,"version":0.6},{"annotation":"沉思","name":"PENSIVE FACE","hexcode":"1F614","shortcodes":["pensive"],"tags":["心事重重","脸"],"emoji":"😔","text":"","type":1,"order":45,"group":0,"subgroup":5,"version":0.6},{"annotation":"困","name":"SLEEPY FACE","hexcode":"1F62A","shortcodes":["sleepy"],"tags":["睡觉","瞌睡","脸"],"emoji":"😪","text":"","type":1,"order":46,"group":0,"subgroup":5,"version":0.6},{"annotation":"流口水","name":"DROOLING FACE","hexcode":"1F924","shortcodes":["drooling"],"tags":["口水","垂涎三尺","脸"],"emoji":"🤤","text":"","type":1,"order":47,"group":0,"subgroup":5,"version":3},{"annotation":"睡着了","name":"SLEEPING FACE","hexcode":"1F634","shortcodes":["exhausted","sleeping"],"tags":["呼噜","打呼","脸"],"emoji":"😴","text":"","type":1,"order":48,"group":0,"subgroup":5,"version":1},{"annotation":"感冒","name":"FACE WITH MEDICAL MASK","hexcode":"1F637","shortcodes":["ill","mask"],"tags":["医生","口罩","生病","脸"],"emoji":"😷","text":"","type":1,"order":49,"group":0,"subgroup":6,"version":0.6},{"annotation":"发烧","name":"FACE WITH THERMOMETER","hexcode":"1F912","shortcodes":["sick"],"tags":["体温计","温度计","生病","脸"],"emoji":"🤒","text":"","type":1,"order":50,"group":0,"subgroup":6,"version":1},{"annotation":"受伤","name":"FACE WITH HEAD-BANDAGE","hexcode":"1F915","shortcodes":["injured"],"tags":["打绷带","脸"],"emoji":"🤕","text":"","type":1,"order":51,"group":0,"subgroup":6,"version":1},{"annotation":"恶心","name":"NAUSEATED FACE","hexcode":"1F922","shortcodes":["nauseated"],"tags":["吐","呕","脸"],"emoji":"🤢","text":"","type":1,"order":52,"group":0,"subgroup":6,"version":3,"emoticon":"%("},{"annotation":"呕吐","name":"FACE WITH OPEN MOUTH VOMITING","hexcode":"1F92E","shortcodes":["vomiting"],"tags":["不舒服","脸"],"emoji":"🤮","text":"","type":1,"order":53,"group":0,"subgroup":6,"version":5},{"annotation":"打喷嚏","name":"SNEEZING FACE","hexcode":"1F927","shortcodes":["sneezing"],"tags":["喷嚏","脸","鼻涕"],"emoji":"🤧","text":"","type":1,"order":54,"group":0,"subgroup":6,"version":3},{"annotation":"脸发烧","name":"OVERHEATED FACE","hexcode":"1F975","shortcodes":["overheating"],"tags":["出汗","发烧","发热","心狂跳","脸红"],"emoji":"🥵","text":"","type":1,"order":55,"group":0,"subgroup":6,"version":11},{"annotation":"冷脸","name":"FREEZING FACE","hexcode":"1F976","shortcodes":["freezing"],"tags":["冷","冷冰冰","冻僵","满面寒霜"],"emoji":"🥶","text":"","type":1,"order":56,"group":0,"subgroup":6,"version":11},{"annotation":"头昏眼花","name":"FACE WITH UNEVEN EYES AND WAVY MOUTH","hexcode":"1F974","shortcodes":["woozy"],"tags":["嘴唇颤抖","头晕眼花","微醺","眼花","醉醺醺"],"emoji":"🥴","text":"","type":1,"order":57,"group":0,"subgroup":6,"version":11,"emoticon":":&"},{"annotation":"晕头转向","name":"DIZZY FACE","hexcode":"1F635","shortcodes":["dizzy"],"tags":["头晕","头晕眼花","晕头","脸"],"emoji":"😵","text":"","type":1,"order":58,"group":0,"subgroup":6,"version":0.6,"emoticon":"xo"},{"annotation":"爆炸头","name":"SHOCKED FACE WITH EXPLODING HEAD","hexcode":"1F92F","shortcodes":["shocked","exploding_head"],"tags":["震惊"],"emoji":"🤯","text":"","type":1,"order":59,"group":0,"subgroup":6,"version":5},{"annotation":"牛仔帽脸","name":"FACE WITH COWBOY HAT","hexcode":"1F920","shortcodes":["cowboy"],"tags":["帽","牛仔","脸"],"emoji":"🤠","text":"","type":1,"order":60,"group":0,"subgroup":7,"version":3},{"annotation":"聚会笑脸","name":"FACE WITH PARTY HORN AND PARTY HAT","hexcode":"1F973","shortcodes":["partying","celebrating"],"tags":["号角","帽子","庆祝","聚会"],"emoji":"🥳","text":"","type":1,"order":61,"group":0,"subgroup":7,"version":11},{"annotation":"伪装的脸","name":"DISGUISED FACE","hexcode":"1F978","shortcodes":["disguised_face"],"tags":["伪装","眼镜","脸","隐瞒身份","鼻子"],"emoji":"🥸","text":"","type":1,"order":62,"group":0,"subgroup":7,"version":13},{"annotation":"墨镜笑脸","name":"SMILING FACE WITH SUNGLASSES","hexcode":"1F60E","shortcodes":["confident"],"tags":["墨镜","太阳镜","眼镜","酷"],"emoji":"😎","text":"","type":1,"order":63,"group":0,"subgroup":8,"version":1,"emoticon":"8)"},{"annotation":"书呆子脸","name":"NERD FACE","hexcode":"1F913","shortcodes":["nerd"],"tags":["奇葩","脸"],"emoji":"🤓","text":"","type":1,"order":64,"group":0,"subgroup":8,"version":1,"emoticon":":B"},{"annotation":"带单片眼镜的脸","name":"FACE WITH MONOCLE","hexcode":"1F9D0","shortcodes":["monocle"],"tags":["古板"],"emoji":"🧐","text":"","type":1,"order":65,"group":0,"subgroup":8,"version":5},{"annotation":"困扰","name":"CONFUSED FACE","hexcode":"1F615","shortcodes":["confused"],"tags":["不懂","困惑","疑惑","脸"],"emoji":"😕","text":"","type":1,"order":66,"group":0,"subgroup":9,"version":1,"emoticon":":/"},{"annotation":"担心","name":"WORRIED FACE","hexcode":"1F61F","shortcodes":["worried"],"tags":["不高兴","伤心","担忧","焦虑","脸"],"emoji":"😟","text":"","type":1,"order":67,"group":0,"subgroup":9,"version":1},{"annotation":"微微不满","name":"SLIGHTLY FROWNING FACE","hexcode":"1F641","shortcodes":["cheerless","slight_frown"],"tags":["不开心","不高兴","委屈","心情不好","脸"],"emoji":"🙁","text":"","type":1,"order":68,"group":0,"subgroup":9,"version":1},{"annotation":"不满","name":"WHITE FROWNING FACE","hexcode":"2639","shortcodes":["sad","frowning"],"tags":["不爽","不高兴","皱眉","脸"],"emoji":"☹️","text":"☹︎","type":0,"order":70,"group":0,"subgroup":9,"version":0.7,"emoticon":":("},{"annotation":"吃惊","name":"FACE WITH OPEN MOUTH","hexcode":"1F62E","shortcodes":["surprised"],"tags":["同情","啊","脸"],"emoji":"😮","text":"","type":1,"order":71,"group":0,"subgroup":9,"version":1},{"annotation":"缄默","name":"HUSHED FACE","hexcode":"1F62F","shortcodes":["hushed"],"tags":["吃惊","脸"],"emoji":"😯","text":"","type":1,"order":72,"group":0,"subgroup":9,"version":1},{"annotation":"震惊","name":"ASTONISHED FACE","hexcode":"1F632","shortcodes":["astonished"],"tags":["惊","惊讶","脸"],"emoji":"😲","text":"","type":1,"order":73,"group":0,"subgroup":9,"version":0.6,"emoticon":":o"},{"annotation":"脸红","name":"FLUSHED FACE","hexcode":"1F633","shortcodes":["flushed"],"tags":["困惑","害羞","羞涩","脸","茫然","迷茫"],"emoji":"😳","text":"","type":1,"order":74,"group":0,"subgroup":9,"version":0.6,"emoticon":":$"},{"annotation":"恳求的脸","name":"FACE WITH PLEADING EYES","hexcode":"1F97A","shortcodes":["pleading"],"tags":["可怜兮兮的眼神","怜悯","祈求"],"emoji":"🥺","text":"","type":1,"order":75,"group":0,"subgroup":9,"version":11},{"annotation":"啊","name":"FROWNING FACE WITH OPEN MOUTH","hexcode":"1F626","shortcodes":["bored"],"tags":["惊讶","目瞪口呆","脸"],"emoji":"😦","text":"","type":1,"order":76,"group":0,"subgroup":9,"version":1},{"annotation":"极度痛苦","name":"ANGUISHED FACE","hexcode":"1F627","shortcodes":["anguished","wtf"],"tags":["痛","脸","难受"],"emoji":"😧","text":"","type":1,"order":77,"group":0,"subgroup":9,"version":1,"emoticon":":s"},{"annotation":"害怕","name":"FEARFUL FACE","hexcode":"1F628","shortcodes":["fearful"],"tags":["怕","恐怖","恐惧","脸"],"emoji":"😨","text":"","type":1,"order":78,"group":0,"subgroup":9,"version":0.6},{"annotation":"冷汗","name":"FACE WITH OPEN MOUTH AND COLD SWEAT","hexcode":"1F630","shortcodes":["cold_sweat","anxious","frustrated"],"tags":["无语","汗","焦虑","紧张","脸"],"emoji":"😰","text":"","type":1,"order":79,"group":0,"subgroup":9,"version":0.6},{"annotation":"失望但如释重负","name":"DISAPPOINTED BUT RELIEVED FACE","hexcode":"1F625","shortcodes":["hopeful"],"tags":["失望","如释重负","脸"],"emoji":"😥","text":"","type":1,"order":80,"group":0,"subgroup":9,"version":0.6},{"annotation":"哭","name":"CRYING FACE","hexcode":"1F622","shortcodes":["upset","cry"],"tags":["伤心","泪","脸"],"emoji":"😢","text":"","type":1,"order":81,"group":0,"subgroup":9,"version":0.6,"emoticon":":'("},{"annotation":"放声大哭","name":"LOUDLY CRYING FACE","hexcode":"1F62D","shortcodes":["distressed","sob"],"tags":["哭","大哭","泪","痛哭","脸"],"emoji":"😭","text":"","type":1,"order":82,"group":0,"subgroup":9,"version":0.6,"emoticon":":'o"},{"annotation":"吓死了","name":"FACE SCREAMING IN FEAR","hexcode":"1F631","shortcodes":["frightened","scream"],"tags":["吓死","害怕","尖叫","恐怖","脸"],"emoji":"😱","text":"","type":1,"order":83,"group":0,"subgroup":9,"version":0.6,"emoticon":"Dx"},{"annotation":"困惑","name":"CONFOUNDED FACE","hexcode":"1F616","shortcodes":["confounded"],"tags":["焦头烂额","纠结","脸"],"emoji":"😖","text":"","type":1,"order":84,"group":0,"subgroup":9,"version":0.6,"emoticon":"x("},{"annotation":"痛苦","name":"PERSEVERING FACE","hexcode":"1F623","shortcodes":["persevered"],"tags":["忍耐","脸","难受"],"emoji":"😣","text":"","type":1,"order":85,"group":0,"subgroup":9,"version":0.6},{"annotation":"失望","name":"DISAPPOINTED FACE","hexcode":"1F61E","shortcodes":["disappointed"],"tags":["不高兴","脸","难过"],"emoji":"😞","text":"","type":1,"order":86,"group":0,"subgroup":9,"version":0.6},{"annotation":"汗","name":"FACE WITH COLD SWEAT","hexcode":"1F613","shortcodes":["shamed"],"tags":["冷","尴尬","脸"],"emoji":"😓","text":"","type":1,"order":87,"group":0,"subgroup":9,"version":0.6,"emoticon":":<"},{"annotation":"累死了","name":"WEARY FACE","hexcode":"1F629","shortcodes":["weary"],"tags":["疲倦","疲劳","疲惫","累","脸"],"emoji":"😩","text":"","type":1,"order":88,"group":0,"subgroup":9,"version":0.6,"emoticon":"D:"},{"annotation":"累","name":"TIRED FACE","hexcode":"1F62B","shortcodes":["tired"],"tags":["疲倦","疲劳","疲惫","脸"],"emoji":"😫","text":"","type":1,"order":89,"group":0,"subgroup":9,"version":0.6,"emoticon":":c"},{"annotation":"打呵欠","name":"YAWNING FACE","hexcode":"1F971","shortcodes":["yawn"],"tags":["呵欠","哈欠","困","无聊","累"],"emoji":"🥱","text":"","type":1,"order":90,"group":0,"subgroup":9,"version":12},{"annotation":"傲慢","name":"FACE WITH LOOK OF TRIUMPH","hexcode":"1F624","shortcodes":["annoyed","hrmph"],"tags":["胜利","自负","赢","趾高气昂"],"emoji":"😤","text":"","type":1,"order":91,"group":0,"subgroup":10,"version":0.6},{"annotation":"怒火中烧","name":"POUTING FACE","hexcode":"1F621","shortcodes":["enraged","pout"],"tags":["发火","发飙","怒","生气","脸"],"emoji":"😡","text":"","type":1,"order":92,"group":0,"subgroup":10,"version":0.6,"emoticon":">:/"},{"annotation":"生气","name":"ANGRY FACE","hexcode":"1F620","shortcodes":["angry"],"tags":["怒","愤怒","脸"],"emoji":"😠","text":"","type":1,"order":93,"group":0,"subgroup":10,"version":0.6},{"annotation":"嘴上有符号的脸","name":"SERIOUS FACE WITH SYMBOLS COVERING MOUTH","hexcode":"1F92C","shortcodes":["censored"],"tags":["发誓","咒骂","脸"],"emoji":"🤬","text":"","type":1,"order":94,"group":0,"subgroup":10,"version":5,"emoticon":":@"},{"annotation":"恶魔微笑","name":"SMILING FACE WITH HORNS","hexcode":"1F608","shortcodes":["imp"],"tags":["幻想","犄角","神话故事","脸"],"emoji":"😈","text":"","type":1,"order":95,"group":0,"subgroup":10,"version":1,"emoticon":">:)"},{"annotation":"生气的恶魔","name":"IMP","hexcode":"1F47F","shortcodes":["angry_imp"],"tags":["幻想","顽童"],"emoji":"👿","text":"","type":1,"order":96,"group":0,"subgroup":10,"version":0.6,"emoticon":">:("},{"annotation":"头骨","name":"SKULL","hexcode":"1F480","shortcodes":["skull"],"tags":["妖怪","死亡","神话故事","脸"],"emoji":"💀","text":"","type":1,"order":97,"group":0,"subgroup":10,"version":0.6},{"annotation":"骷髅","name":"SKULL AND CROSSBONES","hexcode":"2620","shortcodes":["crossbones"],"tags":["头骨","妖怪","死亡","脸","骨头"],"emoji":"☠️","text":"☠︎","type":0,"order":99,"group":0,"subgroup":10,"version":1},{"annotation":"大便","name":"PILE OF POO","hexcode":"1F4A9","shortcodes":["poop"],"tags":["屎","怪物","粑粑","脸"],"emoji":"💩","text":"","type":1,"order":100,"group":0,"subgroup":11,"version":0.6},{"annotation":"小丑脸","name":"CLOWN FACE","hexcode":"1F921","shortcodes":["clown"],"tags":["小丑","脸"],"emoji":"🤡","text":"","type":1,"order":101,"group":0,"subgroup":11,"version":3},{"annotation":"食人魔","name":"JAPANESE OGRE","hexcode":"1F479","shortcodes":["ogre"],"tags":["妖怪","幻想","神话故事","脸","鬼"],"emoji":"👹","text":"","type":1,"order":102,"group":0,"subgroup":11,"version":0.6,"emoticon":">0)"},{"annotation":"小妖精","name":"JAPANESE GOBLIN","hexcode":"1F47A","shortcodes":["goblin"],"tags":["妖怪","幻想","神话故事","脸"],"emoji":"👺","text":"","type":1,"order":103,"group":0,"subgroup":11,"version":0.6},{"annotation":"鬼","name":"GHOST","hexcode":"1F47B","shortcodes":["ghost"],"tags":["妖怪","幻想","幽灵","神话故事","脸"],"emoji":"👻","text":"","type":1,"order":104,"group":0,"subgroup":11,"version":0.6},{"annotation":"外星人","name":"EXTRATERRESTRIAL ALIEN","hexcode":"1F47D","shortcodes":["alien"],"tags":["ufo","外星","太空","幻想","星际","脸"],"emoji":"👽️","text":"👽︎","type":1,"order":105,"group":0,"subgroup":11,"version":0.6},{"annotation":"外星怪物","name":"ALIEN MONSTER","hexcode":"1F47E","shortcodes":["alien_monster","space_invader"],"tags":["ufo","外星","太空","怪物","星际","脸","飞碟"],"emoji":"👾","text":"","type":1,"order":106,"group":0,"subgroup":11,"version":0.6},{"annotation":"机器人","name":"ROBOT FACE","hexcode":"1F916","shortcodes":["robot"],"tags":["怪物"],"emoji":"🤖","text":"","type":1,"order":107,"group":0,"subgroup":11,"version":1},{"annotation":"大笑的猫","name":"SMILING CAT FACE WITH OPEN MOUTH","hexcode":"1F63A","shortcodes":["smiling_cat"],"tags":["哈哈","猫脸","笑","脸"],"emoji":"😺","text":"","type":1,"order":108,"group":0,"subgroup":12,"version":0.6},{"annotation":"微笑的猫","name":"GRINNING CAT FACE WITH SMILING EYES","hexcode":"1F638","shortcodes":["grinning_cat"],"tags":["呵呵","猫脸","笑","脸"],"emoji":"😸","text":"","type":1,"order":109,"group":0,"subgroup":12,"version":0.6},{"annotation":"笑出眼泪的猫","name":"CAT FACE WITH TEARS OF JOY","hexcode":"1F639","shortcodes":["joyful_cat"],"tags":["喜极而泣","快乐","猫脸","眼泪","脸"],"emoji":"😹","text":"","type":1,"order":110,"group":0,"subgroup":12,"version":0.6},{"annotation":"花痴的猫","name":"SMILING CAT FACE WITH HEART-SHAPED EYES","hexcode":"1F63B","shortcodes":["lovestruck_cat"],"tags":["喜欢","心","猫脸","脸","花痴"],"emoji":"😻","text":"","type":1,"order":111,"group":0,"subgroup":12,"version":0.6},{"annotation":"奸笑的猫","name":"CAT FACE WITH WRY SMILE","hexcode":"1F63C","shortcodes":["smirking_cat"],"tags":["奸笑","猫脸","脸","讽刺"],"emoji":"😼","text":"","type":1,"order":112,"group":0,"subgroup":12,"version":0.6},{"annotation":"亲亲猫","name":"KISSING CAT FACE WITH CLOSED EYES","hexcode":"1F63D","shortcodes":["kissing_cat"],"tags":["亲亲","吻","猫脸","脸"],"emoji":"😽","text":"","type":1,"order":113,"group":0,"subgroup":12,"version":0.6,"emoticon":":3"},{"annotation":"疲倦的猫","name":"WEARY CAT FACE","hexcode":"1F640","shortcodes":["weary_cat"],"tags":["惊讶","猫脸","疲倦","累","脸"],"emoji":"🙀","text":"","type":1,"order":114,"group":0,"subgroup":12,"version":0.6},{"annotation":"哭泣的猫","name":"CRYING CAT FACE","hexcode":"1F63F","shortcodes":["crying_cat"],"tags":["哭","猫脸","眼泪","脸","难过"],"emoji":"😿","text":"","type":1,"order":115,"group":0,"subgroup":12,"version":0.6},{"annotation":"生气的猫","name":"POUTING CAT FACE","hexcode":"1F63E","shortcodes":["pouting_cat"],"tags":["猫脸","生气","脸"],"emoji":"😾","text":"","type":1,"order":116,"group":0,"subgroup":12,"version":0.6},{"annotation":"非礼勿视","name":"SEE-NO-EVIL MONKEY","hexcode":"1F648","shortcodes":["see_no_evil"],"tags":["脸","蒙住眼睛","蒙眼"],"emoji":"🙈","text":"","type":1,"order":117,"group":0,"subgroup":13,"version":0.6},{"annotation":"非礼勿听","name":"HEAR-NO-EVIL MONKEY","hexcode":"1F649","shortcodes":["hear_no_evil"],"tags":["堵上耳朵","堵耳","脸"],"emoji":"🙉","text":"","type":1,"order":118,"group":0,"subgroup":13,"version":0.6},{"annotation":"非礼勿言","name":"SPEAK-NO-EVIL MONKEY","hexcode":"1F64A","shortcodes":["speak_no_evil"],"tags":["捂上嘴巴","捂嘴","脸"],"emoji":"🙊","text":"","type":1,"order":119,"group":0,"subgroup":13,"version":0.6},{"annotation":"唇印","name":"KISS MARK","hexcode":"1F48B","shortcodes":["kiss_lips"],"tags":["吻","唇","浪漫"],"emoji":"💋","text":"","type":1,"order":120,"group":0,"subgroup":14,"version":0.6},{"annotation":"情书","name":"LOVE LETTER","hexcode":"1F48C","shortcodes":["love_letter"],"tags":["信","邮件"],"emoji":"💌","text":"","type":1,"order":121,"group":0,"subgroup":14,"version":0.6},{"annotation":"心中箭了","name":"HEART WITH ARROW","hexcode":"1F498","shortcodes":["cupid"],"tags":["丘比特","浪漫","爱情","箭","红心"],"emoji":"💘","text":"","type":1,"order":122,"group":0,"subgroup":14,"version":0.6},{"annotation":"系有缎带的心","name":"HEART WITH RIBBON","hexcode":"1F49D","shortcodes":["heart_ribbon"],"tags":["爱的礼物","送你一颗心"],"emoji":"💝","text":"","type":1,"order":123,"group":0,"subgroup":14,"version":0.6},{"annotation":"闪亮的心","name":"SPARKLING HEART","hexcode":"1F496","shortcodes":["sparkling_heart"],"tags":["激动","红心","闪亮"],"emoji":"💖","text":"","type":1,"order":124,"group":0,"subgroup":14,"version":0.6},{"annotation":"搏动的心","name":"GROWING HEART","hexcode":"1F497","shortcodes":["heartpulse"],"tags":["搏动","激动","紧张","红心"],"emoji":"💗","text":"","type":1,"order":125,"group":0,"subgroup":14,"version":0.6},{"annotation":"心跳","name":"BEATING HEART","hexcode":"1F493","shortcodes":["heartbeat"],"tags":["心动","爱"],"emoji":"💓","text":"","type":1,"order":126,"group":0,"subgroup":14,"version":0.6},{"annotation":"舞动的心","name":"REVOLVING HEARTS","hexcode":"1F49E","shortcodes":["revolving_hearts"],"tags":["旋转","涌动","跃动"],"emoji":"💞","text":"","type":1,"order":127,"group":0,"subgroup":14,"version":0.6},{"annotation":"两颗心","name":"TWO HEARTS","hexcode":"1F495","shortcodes":["two_hearts"],"tags":["爱情"],"emoji":"💕","text":"","type":1,"order":128,"group":0,"subgroup":14,"version":0.6},{"annotation":"心型装饰","name":"HEART DECORATION","hexcode":"1F49F","shortcodes":["heart_decoration"],"tags":["装饰"],"emoji":"💟","text":"","type":1,"order":129,"group":0,"subgroup":14,"version":0.6},{"annotation":"心叹号","name":"HEAVY HEART EXCLAMATION MARK ORNAMENT","hexcode":"2763","shortcodes":["heart_exclamation"],"tags":["叹号","心动"],"emoji":"❣️","text":"❣︎","type":0,"order":131,"group":0,"subgroup":14,"version":1},{"annotation":"心碎","name":"BROKEN HEART","hexcode":"1F494","shortcodes":["broken_heart"],"tags":["伤心"],"emoji":"💔","text":"","type":1,"order":132,"group":0,"subgroup":14,"version":0.6,"emoticon":"</3"},{"annotation":"红心","name":"HEAVY BLACK HEART","hexcode":"2764","shortcodes":["heart"],"tags":["心","爱"],"emoji":"❤️","text":"❤︎","type":0,"order":134,"group":0,"subgroup":14,"version":0.6,"emoticon":"<3"},{"annotation":"橙心","name":"ORANGE HEART","hexcode":"1F9E1","shortcodes":["orange_heart"],"tags":["橙"],"emoji":"🧡","text":"","type":1,"order":135,"group":0,"subgroup":14,"version":5},{"annotation":"黄心","name":"YELLOW HEART","hexcode":"1F49B","shortcodes":["yellow_heart"],"tags":["黄"],"emoji":"💛","text":"","type":1,"order":136,"group":0,"subgroup":14,"version":0.6},{"annotation":"绿心","name":"GREEN HEART","hexcode":"1F49A","shortcodes":["green_heart"],"tags":["绿"],"emoji":"💚","text":"","type":1,"order":137,"group":0,"subgroup":14,"version":0.6},{"annotation":"蓝心","name":"BLUE HEART","hexcode":"1F499","shortcodes":["blue_heart"],"tags":["蓝"],"emoji":"💙","text":"","type":1,"order":138,"group":0,"subgroup":14,"version":0.6},{"annotation":"紫心","name":"PURPLE HEART","hexcode":"1F49C","shortcodes":["purple_heart"],"tags":["紫"],"emoji":"💜","text":"","type":1,"order":139,"group":0,"subgroup":14,"version":0.6},{"annotation":"棕心","name":"BROWN HEART","hexcode":"1F90E","shortcodes":["brown_heart"],"tags":["心","心形","棕"],"emoji":"🤎","text":"","type":1,"order":140,"group":0,"subgroup":14,"version":12},{"annotation":"黑心","name":"BLACK HEART","hexcode":"1F5A4","shortcodes":["black_heart"],"tags":["心","邪恶","黑色"],"emoji":"🖤","text":"","type":1,"order":141,"group":0,"subgroup":14,"version":3},{"annotation":"白心","name":"WHITE HEART","hexcode":"1F90D","shortcodes":["white_heart"],"tags":["心","心形","白"],"emoji":"🤍","text":"","type":1,"order":142,"group":0,"subgroup":14,"version":12},{"annotation":"一百分","name":"HUNDRED POINTS SYMBOL","hexcode":"1F4AF","shortcodes":["100"],"tags":["满分","考试"],"emoji":"💯","text":"","type":1,"order":143,"group":0,"subgroup":14,"version":0.6},{"annotation":"怒","name":"ANGER SYMBOL","hexcode":"1F4A2","shortcodes":["anger"],"tags":["火大","生气","青筋"],"emoji":"💢","text":"","type":1,"order":144,"group":0,"subgroup":14,"version":0.6},{"annotation":"爆炸","name":"COLLISION SYMBOL","hexcode":"1F4A5","shortcodes":["boom","collision"],"tags":["炸","爆"],"emoji":"💥","text":"","type":1,"order":145,"group":0,"subgroup":14,"version":0.6},{"annotation":"头晕","name":"DIZZY SYMBOL","hexcode":"1F4AB","shortcodes":["dizzy_star"],"tags":["头晕目眩"],"emoji":"💫","text":"","type":1,"order":146,"group":0,"subgroup":14,"version":0.6},{"annotation":"汗滴","name":"SPLASHING SWEAT SYMBOL","hexcode":"1F4A6","shortcodes":["sweat_drops"],"tags":["汗"],"emoji":"💦","text":"","type":1,"order":147,"group":0,"subgroup":14,"version":0.6},{"annotation":"尾气","name":"DASH SYMBOL","hexcode":"1F4A8","shortcodes":["dash"],"tags":["疾驰而去","飞奔而去"],"emoji":"💨","text":"","type":1,"order":148,"group":0,"subgroup":14,"version":0.6},{"annotation":"洞","name":"HOLE","hexcode":"1F573","shortcodes":["hole"],"tags":["坑","陷阱"],"emoji":"🕳️","text":"🕳︎","type":0,"order":150,"group":0,"subgroup":14,"version":0.7},{"annotation":"炸弹","name":"BOMB","hexcode":"1F4A3","shortcodes":["bomb"],"tags":["爆炸"],"emoji":"💣️","text":"💣︎","type":1,"order":151,"group":0,"subgroup":14,"version":0.6},{"annotation":"话语气泡","name":"SPEECH BALLOON","hexcode":"1F4AC","shortcodes":["speech"],"tags":["发言","对话框","气泡"],"emoji":"💬","text":"","type":1,"order":152,"group":0,"subgroup":14,"version":0.6},{"annotation":"眼睛对话框","name":"EYE, LEFT SPEECH BUBBLE","hexcode":"1F441-FE0F-200D-1F5E8-FE0F","shortcodes":["eye_bubble"],"tags":["对话框","眼睛"],"emoji":"👁️🗨️","text":"","type":1,"order":153,"group":0,"subgroup":14,"version":2},{"annotation":"朝左的话语气泡","name":"LEFT SPEECH BUBBLE","hexcode":"1F5E8","shortcodes":["left_speech"],"tags":["对话框","话语"],"emoji":"🗨️","text":"🗨︎","type":0,"order":158,"group":0,"subgroup":14,"version":2},{"annotation":"愤怒话语气泡","name":"RIGHT ANGER BUBBLE","hexcode":"1F5EF","shortcodes":["right_anger_speech"],"tags":["对话框","愤怒"],"emoji":"🗯️","text":"🗯︎","type":0,"order":160,"group":0,"subgroup":14,"version":0.7},{"annotation":"内心活动气泡","name":"THOUGHT BALLOON","hexcode":"1F4AD","shortcodes":["thought"],"tags":["对话框","思想活动","气泡"],"emoji":"💭","text":"","type":1,"order":161,"group":0,"subgroup":14,"version":1},{"annotation":"睡着","name":"SLEEPING SYMBOL","hexcode":"1F4A4","shortcodes":["zzz"],"tags":["呼噜","打呼"],"emoji":"💤","text":"","type":1,"order":162,"group":0,"subgroup":14,"version":0.6},{"annotation":"挥手","name":"WAVING HAND SIGN","hexcode":"1F44B","shortcodes":["wave"],"tags":["你好","再见"],"emoji":"👋","text":"","type":1,"order":163,"group":1,"subgroup":15,"version":0.6,"skins":[{"annotation":"挥手: 较浅肤色","name":"WAVING HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F44B-1F3FB","shortcodes":["wave_tone1"],"emoji":"👋🏻","text":"","type":1,"order":164,"group":1,"subgroup":15,"version":1,"tone":1},{"annotation":"挥手: 中等-浅肤色","name":"WAVING HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F44B-1F3FC","shortcodes":["wave_tone2"],"emoji":"👋🏼","text":"","type":1,"order":165,"group":1,"subgroup":15,"version":1,"tone":2},{"annotation":"挥手: 中等肤色","name":"WAVING HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F44B-1F3FD","shortcodes":["wave_tone3"],"emoji":"👋🏽","text":"","type":1,"order":166,"group":1,"subgroup":15,"version":1,"tone":3},{"annotation":"挥手: 中等-深肤色","name":"WAVING HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F44B-1F3FE","shortcodes":["wave_tone4"],"emoji":"👋🏾","text":"","type":1,"order":167,"group":1,"subgroup":15,"version":1,"tone":4},{"annotation":"挥手: 较深肤色","name":"WAVING HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F44B-1F3FF","shortcodes":["wave_tone5"],"emoji":"👋🏿","text":"","type":1,"order":168,"group":1,"subgroup":15,"version":1,"tone":5}]},{"annotation":"立起的手背","name":"RAISED BACK OF HAND","hexcode":"1F91A","shortcodes":["raised_backhand"],"tags":["手","手背","立起"],"emoji":"🤚","text":"","type":1,"order":169,"group":1,"subgroup":15,"version":3,"skins":[{"annotation":"立起的手背: 较浅肤色","name":"RAISED BACK OF HAND, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F91A-1F3FB","shortcodes":["raised_backhand_tone1"],"emoji":"🤚🏻","text":"","type":1,"order":170,"group":1,"subgroup":15,"version":3,"tone":1},{"annotation":"立起的手背: 中等-浅肤色","name":"RAISED BACK OF HAND, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F91A-1F3FC","shortcodes":["raised_backhand_tone2"],"emoji":"🤚🏼","text":"","type":1,"order":171,"group":1,"subgroup":15,"version":3,"tone":2},{"annotation":"立起的手背: 中等肤色","name":"RAISED BACK OF HAND, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F91A-1F3FD","shortcodes":["raised_backhand_tone3"],"emoji":"🤚🏽","text":"","type":1,"order":172,"group":1,"subgroup":15,"version":3,"tone":3},{"annotation":"立起的手背: 中等-深肤色","name":"RAISED BACK OF HAND, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F91A-1F3FE","shortcodes":["raised_backhand_tone4"],"emoji":"🤚🏾","text":"","type":1,"order":173,"group":1,"subgroup":15,"version":3,"tone":4},{"annotation":"立起的手背: 较深肤色","name":"RAISED BACK OF HAND, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F91A-1F3FF","shortcodes":["raised_backhand_tone5"],"emoji":"🤚🏿","text":"","type":1,"order":174,"group":1,"subgroup":15,"version":3,"tone":5}]},{"annotation":"手掌","name":"RAISED HAND WITH FINGERS SPLAYED","hexcode":"1F590","shortcodes":["splayed_hand"],"tags":["击掌","布","手","禁止"],"emoji":"🖐️","text":"🖐︎","type":0,"order":176,"group":1,"subgroup":15,"version":0.7,"skins":[{"annotation":"手掌: 较浅肤色","name":"RAISED HAND WITH FINGERS SPLAYED, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F590-1F3FB","shortcodes":["splayed_hand_tone1"],"emoji":"🖐🏻","text":"","type":1,"order":177,"group":1,"subgroup":15,"version":1,"tone":1},{"annotation":"手掌: 中等-浅肤色","name":"RAISED HAND WITH FINGERS SPLAYED, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F590-1F3FC","shortcodes":["splayed_hand_tone2"],"emoji":"🖐🏼","text":"","type":1,"order":178,"group":1,"subgroup":15,"version":1,"tone":2},{"annotation":"手掌: 中等肤色","name":"RAISED HAND WITH FINGERS SPLAYED, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F590-1F3FD","shortcodes":["splayed_hand_tone3"],"emoji":"🖐🏽","text":"","type":1,"order":179,"group":1,"subgroup":15,"version":1,"tone":3},{"annotation":"手掌: 中等-深肤色","name":"RAISED HAND WITH FINGERS SPLAYED, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F590-1F3FE","shortcodes":["splayed_hand_tone4"],"emoji":"🖐🏾","text":"","type":1,"order":180,"group":1,"subgroup":15,"version":1,"tone":4},{"annotation":"手掌: 较深肤色","name":"RAISED HAND WITH FINGERS SPLAYED, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F590-1F3FF","shortcodes":["splayed_hand_tone5"],"emoji":"🖐🏿","text":"","type":1,"order":181,"group":1,"subgroup":15,"version":1,"tone":5}]},{"annotation":"举起手","name":"RAISED HAND","hexcode":"270B","shortcodes":["raised_hand"],"tags":["举手","手"],"emoji":"✋","text":"","type":1,"order":182,"group":1,"subgroup":15,"version":0.6,"skins":[{"annotation":"举起手: 较浅肤色","name":"RAISED HAND, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"270B-1F3FB","shortcodes":["raised_hand_tone1"],"emoji":"✋🏻","text":"","type":1,"order":183,"group":1,"subgroup":15,"version":1,"tone":1},{"annotation":"举起手: 中等-浅肤色","name":"RAISED HAND, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"270B-1F3FC","shortcodes":["raised_hand_tone2"],"emoji":"✋🏼","text":"","type":1,"order":184,"group":1,"subgroup":15,"version":1,"tone":2},{"annotation":"举起手: 中等肤色","name":"RAISED HAND, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"270B-1F3FD","shortcodes":["raised_hand_tone3"],"emoji":"✋🏽","text":"","type":1,"order":185,"group":1,"subgroup":15,"version":1,"tone":3},{"annotation":"举起手: 中等-深肤色","name":"RAISED HAND, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"270B-1F3FE","shortcodes":["raised_hand_tone4"],"emoji":"✋🏾","text":"","type":1,"order":186,"group":1,"subgroup":15,"version":1,"tone":4},{"annotation":"举起手: 较深肤色","name":"RAISED HAND, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"270B-1F3FF","shortcodes":["raised_hand_tone5"],"emoji":"✋🏿","text":"","type":1,"order":187,"group":1,"subgroup":15,"version":1,"tone":5}]},{"annotation":"瓦肯举手礼","name":"RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS","hexcode":"1F596","shortcodes":["vulcan"],"tags":["手","敬礼","斯波克","星际迷航","瓦肯"],"emoji":"🖖","text":"","type":1,"order":188,"group":1,"subgroup":15,"version":1,"skins":[{"annotation":"瓦肯举手礼: 较浅肤色","name":"RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F596-1F3FB","shortcodes":["vulcan_tone1"],"emoji":"🖖🏻","text":"","type":1,"order":189,"group":1,"subgroup":15,"version":1,"tone":1},{"annotation":"瓦肯举手礼: 中等-浅肤色","name":"RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F596-1F3FC","shortcodes":["vulcan_tone2"],"emoji":"🖖🏼","text":"","type":1,"order":190,"group":1,"subgroup":15,"version":1,"tone":2},{"annotation":"瓦肯举手礼: 中等肤色","name":"RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F596-1F3FD","shortcodes":["vulcan_tone3"],"emoji":"🖖🏽","text":"","type":1,"order":191,"group":1,"subgroup":15,"version":1,"tone":3},{"annotation":"瓦肯举手礼: 中等-深肤色","name":"RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F596-1F3FE","shortcodes":["vulcan_tone4"],"emoji":"🖖🏾","text":"","type":1,"order":192,"group":1,"subgroup":15,"version":1,"tone":4},{"annotation":"瓦肯举手礼: 较深肤色","name":"RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F596-1F3FF","shortcodes":["vulcan_tone5"],"emoji":"🖖🏿","text":"","type":1,"order":193,"group":1,"subgroup":15,"version":1,"tone":5}]},{"annotation":"OK","name":"OK HAND SIGN","hexcode":"1F44C","shortcodes":["ok_hand"],"tags":["ok","手"],"emoji":"👌","text":"","type":1,"order":194,"group":1,"subgroup":16,"version":0.6,"skins":[{"annotation":"OK: 较浅肤色","name":"OK HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F44C-1F3FB","shortcodes":["ok_hand_tone1"],"emoji":"👌🏻","text":"","type":1,"order":195,"group":1,"subgroup":16,"version":1,"tone":1},{"annotation":"OK: 中等-浅肤色","name":"OK HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F44C-1F3FC","shortcodes":["ok_hand_tone2"],"emoji":"👌🏼","text":"","type":1,"order":196,"group":1,"subgroup":16,"version":1,"tone":2},{"annotation":"OK: 中等肤色","name":"OK HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F44C-1F3FD","shortcodes":["ok_hand_tone3"],"emoji":"👌🏽","text":"","type":1,"order":197,"group":1,"subgroup":16,"version":1,"tone":3},{"annotation":"OK: 中等-深肤色","name":"OK HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F44C-1F3FE","shortcodes":["ok_hand_tone4"],"emoji":"👌🏾","text":"","type":1,"order":198,"group":1,"subgroup":16,"version":1,"tone":4},{"annotation":"OK: 较深肤色","name":"OK HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F44C-1F3FF","shortcodes":["ok_hand_tone5"],"emoji":"👌🏿","text":"","type":1,"order":199,"group":1,"subgroup":16,"version":1,"tone":5}]},{"annotation":"捏手指","name":"PINCHED FINGERS","hexcode":"1F90C","shortcodes":["pinched_fingers"],"tags":["匮乏","审讯","手势","手指","挖苦"],"emoji":"🤌","text":"","type":1,"order":200,"group":1,"subgroup":16,"version":13,"skins":[{"annotation":"捏手指: 较浅肤色","name":"PINCHED FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F90C-1F3FB","shortcodes":["pinched_fingers_tone1"],"emoji":"🤌🏻","text":"","type":1,"order":201,"group":1,"subgroup":16,"version":13,"tone":1},{"annotation":"捏手指: 中等-浅肤色","name":"PINCHED FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F90C-1F3FC","shortcodes":["pinched_fingers_tone2"],"emoji":"🤌🏼","text":"","type":1,"order":202,"group":1,"subgroup":16,"version":13,"tone":2},{"annotation":"捏手指: 中等肤色","name":"PINCHED FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F90C-1F3FD","shortcodes":["pinched_fingers_tone3"],"emoji":"🤌🏽","text":"","type":1,"order":203,"group":1,"subgroup":16,"version":13,"tone":3},{"annotation":"捏手指: 中等-深肤色","name":"PINCHED FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F90C-1F3FE","shortcodes":["pinched_fingers_tone4"],"emoji":"🤌🏾","text":"","type":1,"order":204,"group":1,"subgroup":16,"version":13,"tone":4},{"annotation":"捏手指: 较深肤色","name":"PINCHED FINGERS, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F90C-1F3FF","shortcodes":["pinched_fingers_tone5"],"emoji":"🤌🏿","text":"","type":1,"order":205,"group":1,"subgroup":16,"version":13,"tone":5}]},{"annotation":"捏合的手势","name":"PINCHING HAND","hexcode":"1F90F","shortcodes":["pinch"],"tags":["一点","小","少量"],"emoji":"🤏","text":"","type":1,"order":206,"group":1,"subgroup":16,"version":12,"skins":[{"annotation":"捏合的手势: 较浅肤色","name":"PINCHING HAND, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F90F-1F3FB","shortcodes":["pinch_tone1"],"emoji":"🤏🏻","text":"","type":1,"order":207,"group":1,"subgroup":16,"version":12,"tone":1},{"annotation":"捏合的手势: 中等-浅肤色","name":"PINCHING HAND, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F90F-1F3FC","shortcodes":["pinch_tone2"],"emoji":"🤏🏼","text":"","type":1,"order":208,"group":1,"subgroup":16,"version":12,"tone":2},{"annotation":"捏合的手势: 中等肤色","name":"PINCHING HAND, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F90F-1F3FD","shortcodes":["pinch_tone3"],"emoji":"🤏🏽","text":"","type":1,"order":209,"group":1,"subgroup":16,"version":12,"tone":3},{"annotation":"捏合的手势: 中等-深肤色","name":"PINCHING HAND, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F90F-1F3FE","shortcodes":["pinch_tone4"],"emoji":"🤏🏾","text":"","type":1,"order":210,"group":1,"subgroup":16,"version":12,"tone":4},{"annotation":"捏合的手势: 较深肤色","name":"PINCHING HAND, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F90F-1F3FF","shortcodes":["pinch_tone5"],"emoji":"🤏🏿","text":"","type":1,"order":211,"group":1,"subgroup":16,"version":12,"tone":5}]},{"annotation":"胜利手势","name":"VICTORY HAND","hexcode":"270C","shortcodes":["victory"],"tags":["v","成功","手","胜利"],"emoji":"✌️","text":"✌︎","type":0,"order":213,"group":1,"subgroup":16,"version":0.6,"skins":[{"annotation":"胜利手势: 较浅肤色","name":"VICTORY HAND, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"270C-1F3FB","shortcodes":["victory_tone1"],"emoji":"✌🏻","text":"","type":1,"order":214,"group":1,"subgroup":16,"version":1,"tone":1},{"annotation":"胜利手势: 中等-浅肤色","name":"VICTORY HAND, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"270C-1F3FC","shortcodes":["victory_tone2"],"emoji":"✌🏼","text":"","type":1,"order":215,"group":1,"subgroup":16,"version":1,"tone":2},{"annotation":"胜利手势: 中等肤色","name":"VICTORY HAND, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"270C-1F3FD","shortcodes":["victory_tone3"],"emoji":"✌🏽","text":"","type":1,"order":216,"group":1,"subgroup":16,"version":1,"tone":3},{"annotation":"胜利手势: 中等-深肤色","name":"VICTORY HAND, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"270C-1F3FE","shortcodes":["victory_tone4"],"emoji":"✌🏾","text":"","type":1,"order":217,"group":1,"subgroup":16,"version":1,"tone":4},{"annotation":"胜利手势: 较深肤色","name":"VICTORY HAND, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"270C-1F3FF","shortcodes":["victory_tone5"],"emoji":"✌🏿","text":"","type":1,"order":218,"group":1,"subgroup":16,"version":1,"tone":5}]},{"annotation":"交叉的手指","name":"HAND WITH INDEX AND MIDDLE FINGERS CROSSED","hexcode":"1F91E","shortcodes":["fingers_crossed"],"tags":["交叉","幸运","手","手指"],"emoji":"🤞","text":"","type":1,"order":219,"group":1,"subgroup":16,"version":3,"skins":[{"annotation":"交叉的手指: 较浅肤色","name":"HAND WITH INDEX AND MIDDLE FINGERS CROSSED, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F91E-1F3FB","shortcodes":["fingers_crossed_tone1"],"emoji":"🤞🏻","text":"","type":1,"order":220,"group":1,"subgroup":16,"version":3,"tone":1},{"annotation":"交叉的手指: 中等-浅肤色","name":"HAND WITH INDEX AND MIDDLE FINGERS CROSSED, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F91E-1F3FC","shortcodes":["fingers_crossed_tone2"],"emoji":"🤞🏼","text":"","type":1,"order":221,"group":1,"subgroup":16,"version":3,"tone":2},{"annotation":"交叉的手指: 中等肤色","name":"HAND WITH INDEX AND MIDDLE FINGERS CROSSED, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F91E-1F3FD","shortcodes":["fingers_crossed_tone3"],"emoji":"🤞🏽","text":"","type":1,"order":222,"group":1,"subgroup":16,"version":3,"tone":3},{"annotation":"交叉的手指: 中等-深肤色","name":"HAND WITH INDEX AND MIDDLE FINGERS CROSSED, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F91E-1F3FE","shortcodes":["fingers_crossed_tone4"],"emoji":"🤞🏾","text":"","type":1,"order":223,"group":1,"subgroup":16,"version":3,"tone":4},{"annotation":"交叉的手指: 较深肤色","name":"HAND WITH INDEX AND MIDDLE FINGERS CROSSED, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F91E-1F3FF","shortcodes":["fingers_crossed_tone5"],"emoji":"🤞🏿","text":"","type":1,"order":224,"group":1,"subgroup":16,"version":3,"tone":5}]},{"annotation":"爱你的手势","name":"I LOVE YOU HAND SIGN","hexcode":"1F91F","shortcodes":["love_you_gesture"],"tags":["我爱你","手"],"emoji":"🤟","text":"","type":1,"order":225,"group":1,"subgroup":16,"version":5,"skins":[{"annotation":"爱你的手势: 较浅肤色","name":"I LOVE YOU HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F91F-1F3FB","shortcodes":["love_you_gesture_tone1"],"emoji":"🤟🏻","text":"","type":1,"order":226,"group":1,"subgroup":16,"version":5,"tone":1},{"annotation":"爱你的手势: 中等-浅肤色","name":"I LOVE YOU HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F91F-1F3FC","shortcodes":["love_you_gesture_tone2"],"emoji":"🤟🏼","text":"","type":1,"order":227,"group":1,"subgroup":16,"version":5,"tone":2},{"annotation":"爱你的手势: 中等肤色","name":"I LOVE YOU HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F91F-1F3FD","shortcodes":["love_you_gesture_tone3"],"emoji":"🤟🏽","text":"","type":1,"order":228,"group":1,"subgroup":16,"version":5,"tone":3},{"annotation":"爱你的手势: 中等-深肤色","name":"I LOVE YOU HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F91F-1F3FE","shortcodes":["love_you_gesture_tone4"],"emoji":"🤟🏾","text":"","type":1,"order":229,"group":1,"subgroup":16,"version":5,"tone":4},{"annotation":"爱你的手势: 较深肤色","name":"I LOVE YOU HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F91F-1F3FF","shortcodes":["love_you_gesture_tone5"],"emoji":"🤟🏿","text":"","type":1,"order":230,"group":1,"subgroup":16,"version":5,"tone":5}]},{"annotation":"摇滚","name":"SIGN OF THE HORNS","hexcode":"1F918","shortcodes":["metal"],"tags":["手","角","金属礼"],"emoji":"🤘","text":"","type":1,"order":231,"group":1,"subgroup":16,"version":1,"emoticon":"\\\\m/","skins":[{"annotation":"摇滚: 较浅肤色","name":"SIGN OF THE HORNS, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F918-1F3FB","shortcodes":["metal_tone1"],"emoji":"🤘🏻","text":"","type":1,"order":232,"group":1,"subgroup":16,"version":1,"tone":1},{"annotation":"摇滚: 中等-浅肤色","name":"SIGN OF THE HORNS, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F918-1F3FC","shortcodes":["metal_tone2"],"emoji":"🤘🏼","text":"","type":1,"order":233,"group":1,"subgroup":16,"version":1,"tone":2},{"annotation":"摇滚: 中等肤色","name":"SIGN OF THE HORNS, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F918-1F3FD","shortcodes":["metal_tone3"],"emoji":"🤘🏽","text":"","type":1,"order":234,"group":1,"subgroup":16,"version":1,"tone":3},{"annotation":"摇滚: 中等-深肤色","name":"SIGN OF THE HORNS, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F918-1F3FE","shortcodes":["metal_tone4"],"emoji":"🤘🏾","text":"","type":1,"order":235,"group":1,"subgroup":16,"version":1,"tone":4},{"annotation":"摇滚: 较深肤色","name":"SIGN OF THE HORNS, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F918-1F3FF","shortcodes":["metal_tone5"],"emoji":"🤘🏿","text":"","type":1,"order":236,"group":1,"subgroup":16,"version":1,"tone":5}]},{"annotation":"给我打电话","name":"CALL ME HAND","hexcode":"1F919","shortcodes":["call_me"],"tags":["手","电话"],"emoji":"🤙","text":"","type":1,"order":237,"group":1,"subgroup":16,"version":3,"skins":[{"annotation":"给我打电话: 较浅肤色","name":"CALL ME HAND, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F919-1F3FB","shortcodes":["call_me_tone1"],"emoji":"🤙🏻","text":"","type":1,"order":238,"group":1,"subgroup":16,"version":3,"tone":1},{"annotation":"给我打电话: 中等-浅肤色","name":"CALL ME HAND, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F919-1F3FC","shortcodes":["call_me_tone2"],"emoji":"🤙🏼","text":"","type":1,"order":239,"group":1,"subgroup":16,"version":3,"tone":2},{"annotation":"给我打电话: 中等肤色","name":"CALL ME HAND, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F919-1F3FD","shortcodes":["call_me_tone3"],"emoji":"🤙🏽","text":"","type":1,"order":240,"group":1,"subgroup":16,"version":3,"tone":3},{"annotation":"给我打电话: 中等-深肤色","name":"CALL ME HAND, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F919-1F3FE","shortcodes":["call_me_tone4"],"emoji":"🤙🏾","text":"","type":1,"order":241,"group":1,"subgroup":16,"version":3,"tone":4},{"annotation":"给我打电话: 较深肤色","name":"CALL ME HAND, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F919-1F3FF","shortcodes":["call_me_tone5"],"emoji":"🤙🏿","text":"","type":1,"order":242,"group":1,"subgroup":16,"version":3,"tone":5}]},{"annotation":"反手食指向左指","name":"WHITE LEFT POINTING BACKHAND INDEX","hexcode":"1F448","shortcodes":["point_left"],"tags":["反手","向左指","手","指左","食指"],"emoji":"👈️","text":"👈︎","type":1,"order":243,"group":1,"subgroup":17,"version":0.6,"skins":[{"annotation":"反手食指向左指: 较浅肤色","name":"WHITE LEFT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F448-1F3FB","shortcodes":["point_left_tone1"],"emoji":"👈🏻","text":"","type":1,"order":244,"group":1,"subgroup":17,"version":1,"tone":1},{"annotation":"反手食指向左指: 中等-浅肤色","name":"WHITE LEFT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F448-1F3FC","shortcodes":["point_left_tone2"],"emoji":"👈🏼","text":"","type":1,"order":245,"group":1,"subgroup":17,"version":1,"tone":2},{"annotation":"反手食指向左指: 中等肤色","name":"WHITE LEFT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F448-1F3FD","shortcodes":["point_left_tone3"],"emoji":"👈🏽","text":"","type":1,"order":246,"group":1,"subgroup":17,"version":1,"tone":3},{"annotation":"反手食指向左指: 中等-深肤色","name":"WHITE LEFT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F448-1F3FE","shortcodes":["point_left_tone4"],"emoji":"👈🏾","text":"","type":1,"order":247,"group":1,"subgroup":17,"version":1,"tone":4},{"annotation":"反手食指向左指: 较深肤色","name":"WHITE LEFT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F448-1F3FF","shortcodes":["point_left_tone5"],"emoji":"👈🏿","text":"","type":1,"order":248,"group":1,"subgroup":17,"version":1,"tone":5}]},{"annotation":"反手食指向右指","name":"WHITE RIGHT POINTING BACKHAND INDEX","hexcode":"1F449","shortcodes":["point_right"],"tags":["反手","向右指","手","指右","食指"],"emoji":"👉️","text":"👉︎","type":1,"order":249,"group":1,"subgroup":17,"version":0.6,"skins":[{"annotation":"反手食指向右指: 较浅肤色","name":"WHITE RIGHT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F449-1F3FB","shortcodes":["point_right_tone1"],"emoji":"👉🏻","text":"","type":1,"order":250,"group":1,"subgroup":17,"version":1,"tone":1},{"annotation":"反手食指向右指: 中等-浅肤色","name":"WHITE RIGHT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F449-1F3FC","shortcodes":["point_right_tone2"],"emoji":"👉🏼","text":"","type":1,"order":251,"group":1,"subgroup":17,"version":1,"tone":2},{"annotation":"反手食指向右指: 中等肤色","name":"WHITE RIGHT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F449-1F3FD","shortcodes":["point_right_tone3"],"emoji":"👉🏽","text":"","type":1,"order":252,"group":1,"subgroup":17,"version":1,"tone":3},{"annotation":"反手食指向右指: 中等-深肤色","name":"WHITE RIGHT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F449-1F3FE","shortcodes":["point_right_tone4"],"emoji":"👉🏾","text":"","type":1,"order":253,"group":1,"subgroup":17,"version":1,"tone":4},{"annotation":"反手食指向右指: 较深肤色","name":"WHITE RIGHT POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F449-1F3FF","shortcodes":["point_right_tone5"],"emoji":"👉🏿","text":"","type":1,"order":254,"group":1,"subgroup":17,"version":1,"tone":5}]},{"annotation":"反手食指向上指","name":"WHITE UP POINTING BACKHAND INDEX","hexcode":"1F446","shortcodes":["backhand_point_up"],"tags":["反手","向上指","手","指上","食指"],"emoji":"👆️","text":"👆︎","type":1,"order":255,"group":1,"subgroup":17,"version":0.6,"skins":[{"annotation":"反手食指向上指: 较浅肤色","name":"WHITE UP POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F446-1F3FB","shortcodes":["backhand_point_up_tone1"],"emoji":"👆🏻","text":"","type":1,"order":256,"group":1,"subgroup":17,"version":1,"tone":1},{"annotation":"反手食指向上指: 中等-浅肤色","name":"WHITE UP POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F446-1F3FC","shortcodes":["backhand_point_up_tone2"],"emoji":"👆🏼","text":"","type":1,"order":257,"group":1,"subgroup":17,"version":1,"tone":2},{"annotation":"反手食指向上指: 中等肤色","name":"WHITE UP POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F446-1F3FD","shortcodes":["backhand_point_up_tone3"],"emoji":"👆🏽","text":"","type":1,"order":258,"group":1,"subgroup":17,"version":1,"tone":3},{"annotation":"反手食指向上指: 中等-深肤色","name":"WHITE UP POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F446-1F3FE","shortcodes":["backhand_point_up_tone4"],"emoji":"👆🏾","text":"","type":1,"order":259,"group":1,"subgroup":17,"version":1,"tone":4},{"annotation":"反手食指向上指: 较深肤色","name":"WHITE UP POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F446-1F3FF","shortcodes":["backhand_point_up_tone5"],"emoji":"👆🏿","text":"","type":1,"order":260,"group":1,"subgroup":17,"version":1,"tone":5}]},{"annotation":"竖中指","name":"REVERSED HAND WITH MIDDLE FINGER EXTENDED","hexcode":"1F595","shortcodes":["middle_finger"],"tags":["中指","反手","手"],"emoji":"🖕","text":"","type":1,"order":261,"group":1,"subgroup":17,"version":1,"skins":[{"annotation":"竖中指: 较浅肤色","name":"REVERSED HAND WITH MIDDLE FINGER EXTENDED, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F595-1F3FB","shortcodes":["middle_finger_tone1"],"emoji":"🖕🏻","text":"","type":1,"order":262,"group":1,"subgroup":17,"version":1,"tone":1},{"annotation":"竖中指: 中等-浅肤色","name":"REVERSED HAND WITH MIDDLE FINGER EXTENDED, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F595-1F3FC","shortcodes":["middle_finger_tone2"],"emoji":"🖕🏼","text":"","type":1,"order":263,"group":1,"subgroup":17,"version":1,"tone":2},{"annotation":"竖中指: 中等肤色","name":"REVERSED HAND WITH MIDDLE FINGER EXTENDED, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F595-1F3FD","shortcodes":["middle_finger_tone3"],"emoji":"🖕🏽","text":"","type":1,"order":264,"group":1,"subgroup":17,"version":1,"tone":3},{"annotation":"竖中指: 中等-深肤色","name":"REVERSED HAND WITH MIDDLE FINGER EXTENDED, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F595-1F3FE","shortcodes":["middle_finger_tone4"],"emoji":"🖕🏾","text":"","type":1,"order":265,"group":1,"subgroup":17,"version":1,"tone":4},{"annotation":"竖中指: 较深肤色","name":"REVERSED HAND WITH MIDDLE FINGER EXTENDED, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F595-1F3FF","shortcodes":["middle_finger_tone5"],"emoji":"🖕🏿","text":"","type":1,"order":266,"group":1,"subgroup":17,"version":1,"tone":5}]},{"annotation":"反手食指向下指","name":"WHITE DOWN POINTING BACKHAND INDEX","hexcode":"1F447","shortcodes":["point_down"],"tags":["反手","向下指","手","指下","食指"],"emoji":"👇️","text":"👇︎","type":1,"order":267,"group":1,"subgroup":17,"version":0.6,"skins":[{"annotation":"反手食指向下指: 较浅肤色","name":"WHITE DOWN POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F447-1F3FB","shortcodes":["point_down_tone1"],"emoji":"👇🏻","text":"","type":1,"order":268,"group":1,"subgroup":17,"version":1,"tone":1},{"annotation":"反手食指向下指: 中等-浅肤色","name":"WHITE DOWN POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F447-1F3FC","shortcodes":["point_down_tone2"],"emoji":"👇🏼","text":"","type":1,"order":269,"group":1,"subgroup":17,"version":1,"tone":2},{"annotation":"反手食指向下指: 中等肤色","name":"WHITE DOWN POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F447-1F3FD","shortcodes":["point_down_tone3"],"emoji":"👇🏽","text":"","type":1,"order":270,"group":1,"subgroup":17,"version":1,"tone":3},{"annotation":"反手食指向下指: 中等-深肤色","name":"WHITE DOWN POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F447-1F3FE","shortcodes":["point_down_tone4"],"emoji":"👇🏾","text":"","type":1,"order":271,"group":1,"subgroup":17,"version":1,"tone":4},{"annotation":"反手食指向下指: 较深肤色","name":"WHITE DOWN POINTING BACKHAND INDEX, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F447-1F3FF","shortcodes":["point_down_tone5"],"emoji":"👇🏿","text":"","type":1,"order":272,"group":1,"subgroup":17,"version":1,"tone":5}]},{"annotation":"食指向上指","name":"WHITE UP POINTING INDEX","hexcode":"261D","shortcodes":["point_up"],"tags":["向上指","手","指上","食指"],"emoji":"☝️","text":"☝︎","type":0,"order":274,"group":1,"subgroup":17,"version":0.6,"skins":[{"annotation":"食指向上指: 较浅肤色","name":"WHITE UP POINTING INDEX, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"261D-1F3FB","shortcodes":["point_up_tone1"],"emoji":"☝🏻","text":"","type":1,"order":275,"group":1,"subgroup":17,"version":1,"tone":1},{"annotation":"食指向上指: 中等-浅肤色","name":"WHITE UP POINTING INDEX, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"261D-1F3FC","shortcodes":["point_up_tone2"],"emoji":"☝🏼","text":"","type":1,"order":276,"group":1,"subgroup":17,"version":1,"tone":2},{"annotation":"食指向上指: 中等肤色","name":"WHITE UP POINTING INDEX, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"261D-1F3FD","shortcodes":["point_up_tone3"],"emoji":"☝🏽","text":"","type":1,"order":277,"group":1,"subgroup":17,"version":1,"tone":3},{"annotation":"食指向上指: 中等-深肤色","name":"WHITE UP POINTING INDEX, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"261D-1F3FE","shortcodes":["point_up_tone4"],"emoji":"☝🏾","text":"","type":1,"order":278,"group":1,"subgroup":17,"version":1,"tone":4},{"annotation":"食指向上指: 较深肤色","name":"WHITE UP POINTING INDEX, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"261D-1F3FF","shortcodes":["point_up_tone5"],"emoji":"☝🏿","text":"","type":1,"order":279,"group":1,"subgroup":17,"version":1,"tone":5}]},{"annotation":"拇指向上","name":"THUMBS UP SIGN","hexcode":"1F44D","shortcodes":["thumbsup","+1","yes"],"tags":["同意","手","真棒","赞成","顶一下"],"emoji":"👍️","text":"👍︎","type":1,"order":280,"group":1,"subgroup":18,"version":0.6,"skins":[{"annotation":"拇指向上: 较浅肤色","name":"THUMBS UP SIGN, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F44D-1F3FB","shortcodes":["thumbsup_tone1","+1_tone1","yes_tone1"],"emoji":"👍🏻","text":"","type":1,"order":281,"group":1,"subgroup":18,"version":1,"tone":1},{"annotation":"拇指向上: 中等-浅肤色","name":"THUMBS UP SIGN, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F44D-1F3FC","shortcodes":["thumbsup_tone2","+1_tone2","yes_tone2"],"emoji":"👍🏼","text":"","type":1,"order":282,"group":1,"subgroup":18,"version":1,"tone":2},{"annotation":"拇指向上: 中等肤色","name":"THUMBS UP SIGN, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F44D-1F3FD","shortcodes":["thumbsup_tone3","+1_tone3","yes_tone3"],"emoji":"👍🏽","text":"","type":1,"order":283,"group":1,"subgroup":18,"version":1,"tone":3},{"annotation":"拇指向上: 中等-深肤色","name":"THUMBS UP SIGN, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F44D-1F3FE","shortcodes":["thumbsup_tone4","+1_tone4","yes_tone4"],"emoji":"👍🏾","text":"","type":1,"order":284,"group":1,"subgroup":18,"version":1,"tone":4},{"annotation":"拇指向上: 较深肤色","name":"THUMBS UP SIGN, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F44D-1F3FF","shortcodes":["thumbsup_tone5","+1_tone5","yes_tone5"],"emoji":"👍🏿","text":"","type":1,"order":285,"group":1,"subgroup":18,"version":1,"tone":5}]},{"annotation":"拇指向下","name":"THUMBS DOWN SIGN","hexcode":"1F44E","shortcodes":["thumbsdown","-1","no"],"tags":["不赞成","反对","手","责备"],"emoji":"👎️","text":"👎︎","type":1,"order":286,"group":1,"subgroup":18,"version":0.6,"skins":[{"annotation":"拇指向下: 较浅肤色","name":"THUMBS DOWN SIGN, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F44E-1F3FB","shortcodes":["thumbsdown_tone1","-1_tone1","no_tone1"],"emoji":"👎🏻","text":"","type":1,"order":287,"group":1,"subgroup":18,"version":1,"tone":1},{"annotation":"拇指向下: 中等-浅肤色","name":"THUMBS DOWN SIGN, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F44E-1F3FC","shortcodes":["thumbsdown_tone2","-1_tone2","no_tone2"],"emoji":"👎🏼","text":"","type":1,"order":288,"group":1,"subgroup":18,"version":1,"tone":2},{"annotation":"拇指向下: 中等肤色","name":"THUMBS DOWN SIGN, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F44E-1F3FD","shortcodes":["thumbsdown_tone3","-1_tone3","no_tone3"],"emoji":"👎🏽","text":"","type":1,"order":289,"group":1,"subgroup":18,"version":1,"tone":3},{"annotation":"拇指向下: 中等-深肤色","name":"THUMBS DOWN SIGN, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F44E-1F3FE","shortcodes":["thumbsdown_tone4","-1_tone4","no_tone4"],"emoji":"👎🏾","text":"","type":1,"order":290,"group":1,"subgroup":18,"version":1,"tone":4},{"annotation":"拇指向下: 较深肤色","name":"THUMBS DOWN SIGN, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F44E-1F3FF","shortcodes":["thumbsdown_tone5","-1_tone5","no_tone5"],"emoji":"👎🏿","text":"","type":1,"order":291,"group":1,"subgroup":18,"version":1,"tone":5}]},{"annotation":"举起拳头","name":"RAISED FIST","hexcode":"270A","shortcodes":["fist"],"tags":["手","拳头","握拳"],"emoji":"✊","text":"","type":1,"order":292,"group":1,"subgroup":18,"version":0.6,"skins":[{"annotation":"举起拳头: 较浅肤色","name":"RAISED FIST, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"270A-1F3FB","shortcodes":["fist_tone1"],"emoji":"✊🏻","text":"","type":1,"order":293,"group":1,"subgroup":18,"version":1,"tone":1},{"annotation":"举起拳头: 中等-浅肤色","name":"RAISED FIST, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"270A-1F3FC","shortcodes":["fist_tone2"],"emoji":"✊🏼","text":"","type":1,"order":294,"group":1,"subgroup":18,"version":1,"tone":2},{"annotation":"举起拳头: 中等肤色","name":"RAISED FIST, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"270A-1F3FD","shortcodes":["fist_tone3"],"emoji":"✊🏽","text":"","type":1,"order":295,"group":1,"subgroup":18,"version":1,"tone":3},{"annotation":"举起拳头: 中等-深肤色","name":"RAISED FIST, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"270A-1F3FE","shortcodes":["fist_tone4"],"emoji":"✊🏾","text":"","type":1,"order":296,"group":1,"subgroup":18,"version":1,"tone":4},{"annotation":"举起拳头: 较深肤色","name":"RAISED FIST, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"270A-1F3FF","shortcodes":["fist_tone5"],"emoji":"✊🏿","text":"","type":1,"order":297,"group":1,"subgroup":18,"version":1,"tone":5}]},{"annotation":"出拳","name":"FISTED HAND SIGN","hexcode":"1F44A","shortcodes":["punch"],"tags":["手","打","拳"],"emoji":"👊","text":"","type":1,"order":298,"group":1,"subgroup":18,"version":0.6,"skins":[{"annotation":"出拳: 较浅肤色","name":"FISTED HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F44A-1F3FB","shortcodes":["punch_tone1"],"emoji":"👊🏻","text":"","type":1,"order":299,"group":1,"subgroup":18,"version":1,"tone":1},{"annotation":"出拳: 中等-浅肤色","name":"FISTED HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F44A-1F3FC","shortcodes":["punch_tone2"],"emoji":"👊🏼","text":"","type":1,"order":300,"group":1,"subgroup":18,"version":1,"tone":2},{"annotation":"出拳: 中等肤色","name":"FISTED HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F44A-1F3FD","shortcodes":["punch_tone3"],"emoji":"👊🏽","text":"","type":1,"order":301,"group":1,"subgroup":18,"version":1,"tone":3},{"annotation":"出拳: 中等-深肤色","name":"FISTED HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F44A-1F3FE","shortcodes":["punch_tone4"],"emoji":"👊🏾","text":"","type":1,"order":302,"group":1,"subgroup":18,"version":1,"tone":4},{"annotation":"出拳: 较深肤色","name":"FISTED HAND SIGN, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F44A-1F3FF","shortcodes":["punch_tone5"],"emoji":"👊🏿","text":"","type":1,"order":303,"group":1,"subgroup":18,"version":1,"tone":5}]},{"annotation":"朝左的拳头","name":"LEFT-FACING FIST","hexcode":"1F91B","shortcodes":["left_facing_fist"],"tags":["拳头","朝左"],"emoji":"🤛","text":"","type":1,"order":304,"group":1,"subgroup":18,"version":3,"skins":[{"annotation":"朝左的拳头: 较浅肤色","name":"LEFT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F91B-1F3FB","shortcodes":["left_facing_fist_tone1"],"emoji":"🤛🏻","text":"","type":1,"order":305,"group":1,"subgroup":18,"version":3,"tone":1},{"annotation":"朝左的拳头: 中等-浅肤色","name":"LEFT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F91B-1F3FC","shortcodes":["left_facing_fist_tone2"],"emoji":"🤛🏼","text":"","type":1,"order":306,"group":1,"subgroup":18,"version":3,"tone":2},{"annotation":"朝左的拳头: 中等肤色","name":"LEFT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F91B-1F3FD","shortcodes":["left_facing_fist_tone3"],"emoji":"🤛🏽","text":"","type":1,"order":307,"group":1,"subgroup":18,"version":3,"tone":3},{"annotation":"朝左的拳头: 中等-深肤色","name":"LEFT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F91B-1F3FE","shortcodes":["left_facing_fist_tone4"],"emoji":"🤛🏾","text":"","type":1,"order":308,"group":1,"subgroup":18,"version":3,"tone":4},{"annotation":"朝左的拳头: 较深肤色","name":"LEFT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F91B-1F3FF","shortcodes":["left_facing_fist_tone5"],"emoji":"🤛🏿","text":"","type":1,"order":309,"group":1,"subgroup":18,"version":3,"tone":5}]},{"annotation":"朝右的拳头","name":"RIGHT-FACING FIST","hexcode":"1F91C","shortcodes":["right_facing_fist"],"tags":["手","拳头","朝右"],"emoji":"🤜","text":"","type":1,"order":310,"group":1,"subgroup":18,"version":3,"skins":[{"annotation":"朝右的拳头: 较浅肤色","name":"RIGHT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F91C-1F3FB","shortcodes":["right_facing_fist_tone1"],"emoji":"🤜🏻","text":"","type":1,"order":311,"group":1,"subgroup":18,"version":3,"tone":1},{"annotation":"朝右的拳头: 中等-浅肤色","name":"RIGHT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F91C-1F3FC","shortcodes":["right_facing_fist_tone2"],"emoji":"🤜🏼","text":"","type":1,"order":312,"group":1,"subgroup":18,"version":3,"tone":2},{"annotation":"朝右的拳头: 中等肤色","name":"RIGHT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F91C-1F3FD","shortcodes":["right_facing_fist_tone3"],"emoji":"🤜🏽","text":"","type":1,"order":313,"group":1,"subgroup":18,"version":3,"tone":3},{"annotation":"朝右的拳头: 中等-深肤色","name":"RIGHT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F91C-1F3FE","shortcodes":["right_facing_fist_tone4"],"emoji":"🤜🏾","text":"","type":1,"order":314,"group":1,"subgroup":18,"version":3,"tone":4},{"annotation":"朝右的拳头: 较深肤色","name":"RIGHT-FACING FIST, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F91C-1F3FF","shortcodes":["right_facing_fist_tone5"],"emoji":"🤜🏿","text":"","type":1,"order":315,"group":1,"subgroup":18,"version":3,"tone":5}]},{"annotation":"鼓掌","name":"CLAPPING HANDS SIGN","hexcode":"1F44F","shortcodes":["clap"],"tags":["拍手"],"emoji":"👏","text":"","type":1,"order":316,"group":1,"subgroup":19,"version":0.6,"skins":[{"annotation":"鼓掌: 较浅肤色","name":"CLAPPING HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F44F-1F3FB","shortcodes":["clap_tone1"],"emoji":"👏🏻","text":"","type":1,"order":317,"group":1,"subgroup":19,"version":1,"tone":1},{"annotation":"鼓掌: 中等-浅肤色","name":"CLAPPING HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F44F-1F3FC","shortcodes":["clap_tone2"],"emoji":"👏🏼","text":"","type":1,"order":318,"group":1,"subgroup":19,"version":1,"tone":2},{"annotation":"鼓掌: 中等肤色","name":"CLAPPING HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F44F-1F3FD","shortcodes":["clap_tone3"],"emoji":"👏🏽","text":"","type":1,"order":319,"group":1,"subgroup":19,"version":1,"tone":3},{"annotation":"鼓掌: 中等-深肤色","name":"CLAPPING HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F44F-1F3FE","shortcodes":["clap_tone4"],"emoji":"👏🏾","text":"","type":1,"order":320,"group":1,"subgroup":19,"version":1,"tone":4},{"annotation":"鼓掌: 较深肤色","name":"CLAPPING HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F44F-1F3FF","shortcodes":["clap_tone5"],"emoji":"👏🏿","text":"","type":1,"order":321,"group":1,"subgroup":19,"version":1,"tone":5}]},{"annotation":"举双手","name":"PERSON RAISING BOTH HANDS IN CELEBRATION","hexcode":"1F64C","shortcodes":["raised_hands"],"tags":["击掌","双手","庆祝"],"emoji":"🙌","text":"","type":1,"order":322,"group":1,"subgroup":19,"version":0.6,"skins":[{"annotation":"举双手: 较浅肤色","name":"PERSON RAISING BOTH HANDS IN CELEBRATION, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F64C-1F3FB","shortcodes":["raised_hands_tone1"],"emoji":"🙌🏻","text":"","type":1,"order":323,"group":1,"subgroup":19,"version":1,"tone":1},{"annotation":"举双手: 中等-浅肤色","name":"PERSON RAISING BOTH HANDS IN CELEBRATION, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F64C-1F3FC","shortcodes":["raised_hands_tone2"],"emoji":"🙌🏼","text":"","type":1,"order":324,"group":1,"subgroup":19,"version":1,"tone":2},{"annotation":"举双手: 中等肤色","name":"PERSON RAISING BOTH HANDS IN CELEBRATION, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F64C-1F3FD","shortcodes":["raised_hands_tone3"],"emoji":"🙌🏽","text":"","type":1,"order":325,"group":1,"subgroup":19,"version":1,"tone":3},{"annotation":"举双手: 中等-深肤色","name":"PERSON RAISING BOTH HANDS IN CELEBRATION, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F64C-1F3FE","shortcodes":["raised_hands_tone4"],"emoji":"🙌🏾","text":"","type":1,"order":326,"group":1,"subgroup":19,"version":1,"tone":4},{"annotation":"举双手: 较深肤色","name":"PERSON RAISING BOTH HANDS IN CELEBRATION, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F64C-1F3FF","shortcodes":["raised_hands_tone5"],"emoji":"🙌🏿","text":"","type":1,"order":327,"group":1,"subgroup":19,"version":1,"tone":5}]},{"annotation":"张开双手","name":"OPEN HANDS SIGN","hexcode":"1F450","shortcodes":["open_hands"],"tags":["双手","摊手"],"emoji":"👐","text":"","type":1,"order":328,"group":1,"subgroup":19,"version":0.6,"skins":[{"annotation":"张开双手: 较浅肤色","name":"OPEN HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F450-1F3FB","shortcodes":["open_hands_tone1"],"emoji":"👐🏻","text":"","type":1,"order":329,"group":1,"subgroup":19,"version":1,"tone":1},{"annotation":"张开双手: 中等-浅肤色","name":"OPEN HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F450-1F3FC","shortcodes":["open_hands_tone2"],"emoji":"👐🏼","text":"","type":1,"order":330,"group":1,"subgroup":19,"version":1,"tone":2},{"annotation":"张开双手: 中等肤色","name":"OPEN HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F450-1F3FD","shortcodes":["open_hands_tone3"],"emoji":"👐🏽","text":"","type":1,"order":331,"group":1,"subgroup":19,"version":1,"tone":3},{"annotation":"张开双手: 中等-深肤色","name":"OPEN HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F450-1F3FE","shortcodes":["open_hands_tone4"],"emoji":"👐🏾","text":"","type":1,"order":332,"group":1,"subgroup":19,"version":1,"tone":4},{"annotation":"张开双手: 较深肤色","name":"OPEN HANDS SIGN, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F450-1F3FF","shortcodes":["open_hands_tone5"],"emoji":"👐🏿","text":"","type":1,"order":333,"group":1,"subgroup":19,"version":1,"tone":5}]},{"annotation":"掌心向上托起","name":"PALMS UP TOGETHER","hexcode":"1F932","shortcodes":["palms_up"],"tags":["祷告"],"emoji":"🤲","text":"","type":1,"order":334,"group":1,"subgroup":19,"version":5,"skins":[{"annotation":"掌心向上托起: 较浅肤色","name":"PALMS UP TOGETHER, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F932-1F3FB","shortcodes":["palms_up_tone1"],"emoji":"🤲🏻","text":"","type":1,"order":335,"group":1,"subgroup":19,"version":5,"tone":1},{"annotation":"掌心向上托起: 中等-浅肤色","name":"PALMS UP TOGETHER, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F932-1F3FC","shortcodes":["palms_up_tone2"],"emoji":"🤲🏼","text":"","type":1,"order":336,"group":1,"subgroup":19,"version":5,"tone":2},{"annotation":"掌心向上托起: 中等肤色","name":"PALMS UP TOGETHER, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F932-1F3FD","shortcodes":["palms_up_tone3"],"emoji":"🤲🏽","text":"","type":1,"order":337,"group":1,"subgroup":19,"version":5,"tone":3},{"annotation":"掌心向上托起: 中等-深肤色","name":"PALMS UP TOGETHER, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F932-1F3FE","shortcodes":["palms_up_tone4"],"emoji":"🤲🏾","text":"","type":1,"order":338,"group":1,"subgroup":19,"version":5,"tone":4},{"annotation":"掌心向上托起: 较深肤色","name":"PALMS UP TOGETHER, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F932-1F3FF","shortcodes":["palms_up_tone5"],"emoji":"🤲🏿","text":"","type":1,"order":339,"group":1,"subgroup":19,"version":5,"tone":5}]},{"annotation":"握手","name":"HANDSHAKE","hexcode":"1F91D","shortcodes":["handshake"],"tags":["会面","协议"],"emoji":"🤝","text":"","type":1,"order":340,"group":1,"subgroup":19,"version":3},{"annotation":"双手合十","name":"PERSON WITH FOLDED HANDS","hexcode":"1F64F","shortcodes":["pray"],"tags":["拜托","祈求","祈祷","祝福"],"emoji":"🙏","text":"","type":1,"order":341,"group":1,"subgroup":19,"version":0.6,"skins":[{"annotation":"双手合十: 较浅肤色","name":"PERSON WITH FOLDED HANDS, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"1F64F-1F3FB","shortcodes":["pray_tone1"],"emoji":"🙏🏻","text":"","type":1,"order":342,"group":1,"subgroup":19,"version":1,"tone":1},{"annotation":"双手合十: 中等-浅肤色","name":"PERSON WITH FOLDED HANDS, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"1F64F-1F3FC","shortcodes":["pray_tone2"],"emoji":"🙏🏼","text":"","type":1,"order":343,"group":1,"subgroup":19,"version":1,"tone":2},{"annotation":"双手合十: 中等肤色","name":"PERSON WITH FOLDED HANDS, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"1F64F-1F3FD","shortcodes":["pray_tone3"],"emoji":"🙏🏽","text":"","type":1,"order":344,"group":1,"subgroup":19,"version":1,"tone":3},{"annotation":"双手合十: 中等-深肤色","name":"PERSON WITH FOLDED HANDS, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"1F64F-1F3FE","shortcodes":["pray_tone4"],"emoji":"🙏🏾","text":"","type":1,"order":345,"group":1,"subgroup":19,"version":1,"tone":4},{"annotation":"双手合十: 较深肤色","name":"PERSON WITH FOLDED HANDS, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"1F64F-1F3FF","shortcodes":["pray_tone5"],"emoji":"🙏🏿","text":"","type":1,"order":346,"group":1,"subgroup":19,"version":1,"tone":5}]},{"annotation":"写字","name":"WRITING HAND","hexcode":"270D","shortcodes":["writing_hand"],"tags":["写","笔"],"emoji":"✍️","text":"✍︎","type":0,"order":348,"group":1,"subgroup":20,"version":0.7,"skins":[{"annotation":"写字: 较浅肤色","name":"WRITING HAND, EMOJI MODIFIER FITZPATRICK TYPE-1-2","hexcode":"270D-1F3FB","shortcodes":["writing_hand_tone1"],"emoji":"✍🏻","text":"","type":1,"order":349,"group":1,"subgroup":20,"version":1,"tone":1},{"annotation":"写字: 中等-浅肤色","name":"WRITING HAND, EMOJI MODIFIER FITZPATRICK TYPE-3","hexcode":"270D-1F3FC","shortcodes":["writing_hand_tone2"],"emoji":"✍🏼","text":"","type":1,"order":350,"group":1,"subgroup":20,"version":1,"tone":2},{"annotation":"写字: 中等肤色","name":"WRITING HAND, EMOJI MODIFIER FITZPATRICK TYPE-4","hexcode":"270D-1F3FD","shortcodes":["writing_hand_tone3"],"emoji":"✍🏽","text":"","type":1,"order":351,"group":1,"subgroup":20,"version":1,"tone":3},{"annotation":"写字: 中等-深肤色","name":"WRITING HAND, EMOJI MODIFIER FITZPATRICK TYPE-5","hexcode":"270D-1F3FE","shortcodes":["writing_hand_tone4"],"emoji":"✍🏾","text":"","type":1,"order":352,"group":1,"subgroup":20,"version":1,"tone":4},{"annotation":"写字: 较深肤色","name":"WRITING HAND, EMOJI MODIFIER FITZPATRICK TYPE-6","hexcode":"270D-1F3FF","shortcodes":["writing_hand_tone5"],"emoji":"✍🏿","text":"","type":1,"order":353,"group":1,"subgroup":20,"version":1,"tone":5}]}]`);
|
|
1375
|
-
const _hoisted_1$
|
|
1376
|
-
const _hoisted_2$
|
|
1377
|
-
const _hoisted_3$
|
|
1378
|
-
const _hoisted_4$
|
|
1379
|
-
const _hoisted_5$
|
|
1439
|
+
const _hoisted_1$3 = { class: "emoji-panel-h5" };
|
|
1440
|
+
const _hoisted_2$3 = { class: "emoji-tabs" };
|
|
1441
|
+
const _hoisted_3$3 = ["onClick"];
|
|
1442
|
+
const _hoisted_4$3 = { class: "tab-icon" };
|
|
1443
|
+
const _hoisted_5$3 = {
|
|
1380
1444
|
class: "emoji-grid",
|
|
1381
1445
|
ref: "emojiGrid"
|
|
1382
1446
|
};
|
|
1383
1447
|
const _hoisted_6$2 = ["title", "onClick"];
|
|
1384
|
-
const _sfc_main$
|
|
1448
|
+
const _sfc_main$3 = {
|
|
1385
1449
|
__name: "EmojiPanelH5",
|
|
1386
1450
|
props: {
|
|
1387
1451
|
modelValue: {
|
|
@@ -1433,19 +1497,19 @@ const _sfc_main$2 = {
|
|
|
1433
1497
|
emit("select", emoji);
|
|
1434
1498
|
};
|
|
1435
1499
|
return (_ctx, _cache) => {
|
|
1436
|
-
return withDirectives((openBlock(), createElementBlock("div", _hoisted_1$
|
|
1437
|
-
createElementVNode("div", _hoisted_2$
|
|
1500
|
+
return withDirectives((openBlock(), createElementBlock("div", _hoisted_1$3, [
|
|
1501
|
+
createElementVNode("div", _hoisted_2$3, [
|
|
1438
1502
|
(openBlock(true), createElementBlock(Fragment, null, renderList(groups.value, (grp) => {
|
|
1439
1503
|
return openBlock(), createElementBlock("div", {
|
|
1440
1504
|
key: grp.key,
|
|
1441
1505
|
class: normalizeClass(["emoji-tab", { active: activeGroup.value === grp.key }]),
|
|
1442
1506
|
onClick: ($event) => activeGroup.value = grp.key
|
|
1443
1507
|
}, [
|
|
1444
|
-
createElementVNode("span", _hoisted_4$
|
|
1445
|
-
], 10, _hoisted_3$
|
|
1508
|
+
createElementVNode("span", _hoisted_4$3, toDisplayString(grp.icon), 1)
|
|
1509
|
+
], 10, _hoisted_3$3);
|
|
1446
1510
|
}), 128))
|
|
1447
1511
|
]),
|
|
1448
|
-
createElementVNode("div", _hoisted_5$
|
|
1512
|
+
createElementVNode("div", _hoisted_5$3, [
|
|
1449
1513
|
(openBlock(true), createElementBlock(Fragment, null, renderList(currentEmojis.value, (item) => {
|
|
1450
1514
|
return openBlock(), createElementBlock("span", {
|
|
1451
1515
|
key: item.hexcode,
|
|
@@ -1461,7 +1525,603 @@ const _sfc_main$2 = {
|
|
|
1461
1525
|
};
|
|
1462
1526
|
}
|
|
1463
1527
|
};
|
|
1464
|
-
const EmojiPanelH5 = /* @__PURE__ */ _export_sfc(_sfc_main$
|
|
1528
|
+
const EmojiPanelH5 = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-f5207080"]]);
|
|
1529
|
+
var recorder$1 = { exports: {} };
|
|
1530
|
+
/*!
|
|
1531
|
+
*
|
|
1532
|
+
* js-audio-recorder - js audio recorder plugin
|
|
1533
|
+
*
|
|
1534
|
+
* @version v1.0.7
|
|
1535
|
+
* @homepage https://github.com/2fps/recorder
|
|
1536
|
+
* @author 2fps <echoweb@126.com> (https://www.zhuyuntao.cn)
|
|
1537
|
+
* @license MIT
|
|
1538
|
+
*
|
|
1539
|
+
*/
|
|
1540
|
+
var recorder = recorder$1.exports;
|
|
1541
|
+
var hasRequiredRecorder;
|
|
1542
|
+
function requireRecorder() {
|
|
1543
|
+
if (hasRequiredRecorder) return recorder$1.exports;
|
|
1544
|
+
hasRequiredRecorder = 1;
|
|
1545
|
+
(function(module, exports) {
|
|
1546
|
+
!(function(t, e) {
|
|
1547
|
+
module.exports = e();
|
|
1548
|
+
})(recorder, function() {
|
|
1549
|
+
return (function(t) {
|
|
1550
|
+
var e = {};
|
|
1551
|
+
function n(i) {
|
|
1552
|
+
if (e[i]) return e[i].exports;
|
|
1553
|
+
var o = e[i] = { i, l: false, exports: {} };
|
|
1554
|
+
return t[i].call(o.exports, o, o.exports, n), o.l = true, o.exports;
|
|
1555
|
+
}
|
|
1556
|
+
return n.m = t, n.c = e, n.d = function(t2, e2, i) {
|
|
1557
|
+
n.o(t2, e2) || Object.defineProperty(t2, e2, { enumerable: true, get: i });
|
|
1558
|
+
}, n.r = function(t2) {
|
|
1559
|
+
"undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(t2, Symbol.toStringTag, { value: "Module" }), Object.defineProperty(t2, "__esModule", { value: true });
|
|
1560
|
+
}, n.t = function(t2, e2) {
|
|
1561
|
+
if (1 & e2 && (t2 = n(t2)), 8 & e2) return t2;
|
|
1562
|
+
if (4 & e2 && "object" == typeof t2 && t2 && t2.__esModule) return t2;
|
|
1563
|
+
var i = /* @__PURE__ */ Object.create(null);
|
|
1564
|
+
if (n.r(i), Object.defineProperty(i, "default", { enumerable: true, value: t2 }), 2 & e2 && "string" != typeof t2) for (var o in t2) n.d(i, o, (function(e3) {
|
|
1565
|
+
return t2[e3];
|
|
1566
|
+
}).bind(null, o));
|
|
1567
|
+
return i;
|
|
1568
|
+
}, n.n = function(t2) {
|
|
1569
|
+
var e2 = t2 && t2.__esModule ? function() {
|
|
1570
|
+
return t2.default;
|
|
1571
|
+
} : function() {
|
|
1572
|
+
return t2;
|
|
1573
|
+
};
|
|
1574
|
+
return n.d(e2, "a", e2), e2;
|
|
1575
|
+
}, n.o = function(t2, e2) {
|
|
1576
|
+
return Object.prototype.hasOwnProperty.call(t2, e2);
|
|
1577
|
+
}, n.p = "", n(n.s = 1);
|
|
1578
|
+
})([function(t, e, n) {
|
|
1579
|
+
function i(t2, e2, n2) {
|
|
1580
|
+
for (var i2 = 0; i2 < n2.length; i2++) t2.setUint8(e2 + i2, n2.charCodeAt(i2));
|
|
1581
|
+
}
|
|
1582
|
+
Object.defineProperty(e, "__esModule", { value: true }), e.compress = function(t2, e2, n2) {
|
|
1583
|
+
for (var i2 = e2 / n2, o = Math.max(i2, 1), r = t2.left, a = t2.right, s = Math.floor((r.length + a.length) / i2), u = new Float32Array(s), c = 0, l = 0; c < s; ) {
|
|
1584
|
+
var f = Math.floor(l);
|
|
1585
|
+
u[c] = r[f], c++, a.length && (u[c] = a[f], c++), l += o;
|
|
1586
|
+
}
|
|
1587
|
+
return u;
|
|
1588
|
+
}, e.encodePCM = function(t2, e2, n2) {
|
|
1589
|
+
void 0 === n2 && (n2 = true);
|
|
1590
|
+
var i2 = 0, o = t2.length * (e2 / 8), r = new ArrayBuffer(o), a = new DataView(r);
|
|
1591
|
+
if (8 === e2) for (var s = 0; s < t2.length; s++, i2++) {
|
|
1592
|
+
var u = (c = Math.max(-1, Math.min(1, t2[s]))) < 0 ? 128 * c : 127 * c;
|
|
1593
|
+
u = +u + 128, a.setInt8(i2, u);
|
|
1594
|
+
}
|
|
1595
|
+
else for (s = 0; s < t2.length; s++, i2 += 2) {
|
|
1596
|
+
var c = Math.max(-1, Math.min(1, t2[s]));
|
|
1597
|
+
a.setInt16(i2, c < 0 ? 32768 * c : 32767 * c, n2);
|
|
1598
|
+
}
|
|
1599
|
+
return a;
|
|
1600
|
+
}, e.encodeWAV = function(t2, e2, n2, o, r, a) {
|
|
1601
|
+
void 0 === a && (a = true);
|
|
1602
|
+
var s = n2 > e2 ? e2 : n2, u = r, c = new ArrayBuffer(44 + t2.byteLength), l = new DataView(c), f = o, p = 0;
|
|
1603
|
+
i(l, p, "RIFF"), p += 4, l.setUint32(p, 36 + t2.byteLength, a), i(l, p += 4, "WAVE"), i(l, p += 4, "fmt "), p += 4, l.setUint32(p, 16, a), p += 4, l.setUint16(p, 1, a), p += 2, l.setUint16(p, f, a), p += 2, l.setUint32(p, s, a), p += 4, l.setUint32(p, f * s * (u / 8), a), p += 4, l.setUint16(p, f * (u / 8), a), p += 2, l.setUint16(p, u, a), i(l, p += 2, "data"), p += 4, l.setUint32(p, t2.byteLength, a), p += 4;
|
|
1604
|
+
for (var d = 0; d < t2.byteLength; ) l.setUint8(p, t2.getUint8(d)), p++, d++;
|
|
1605
|
+
return l;
|
|
1606
|
+
};
|
|
1607
|
+
}, function(t, e, n) {
|
|
1608
|
+
var i, o = this && this.__extends || (i = function(t2, e2) {
|
|
1609
|
+
return (i = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(t3, e3) {
|
|
1610
|
+
t3.__proto__ = e3;
|
|
1611
|
+
} || function(t3, e3) {
|
|
1612
|
+
for (var n2 in e3) e3.hasOwnProperty(n2) && (t3[n2] = e3[n2]);
|
|
1613
|
+
})(t2, e2);
|
|
1614
|
+
}, function(t2, e2) {
|
|
1615
|
+
function n2() {
|
|
1616
|
+
this.constructor = t2;
|
|
1617
|
+
}
|
|
1618
|
+
i(t2, e2), t2.prototype = null === e2 ? Object.create(e2) : (n2.prototype = e2.prototype, new n2());
|
|
1619
|
+
});
|
|
1620
|
+
Object.defineProperty(e, "__esModule", { value: true });
|
|
1621
|
+
var r = n(2), a = n(0), s = n(3), u = (function(t2) {
|
|
1622
|
+
function e2(e3) {
|
|
1623
|
+
void 0 === e3 && (e3 = {});
|
|
1624
|
+
var n2 = t2.call(this, e3) || this;
|
|
1625
|
+
return n2.isrecording = false, n2.ispause = false, n2.isplaying = false, n2;
|
|
1626
|
+
}
|
|
1627
|
+
return o(e2, t2), e2.prototype.setOption = function(t3) {
|
|
1628
|
+
void 0 === t3 && (t3 = {}), this.setNewOption(t3);
|
|
1629
|
+
}, e2.prototype.start = function() {
|
|
1630
|
+
return this.isrecording ? Promise.reject() : (this.isrecording = true, this.startRecord());
|
|
1631
|
+
}, e2.prototype.pause = function() {
|
|
1632
|
+
this.isrecording && !this.ispause && (this.ispause = true, this.pauseRecord());
|
|
1633
|
+
}, e2.prototype.resume = function() {
|
|
1634
|
+
this.isrecording && this.ispause && (this.ispause = false, this.resumeRecord());
|
|
1635
|
+
}, e2.prototype.stop = function() {
|
|
1636
|
+
this.isrecording && (this.isrecording = false, this.ispause = false, this.stopRecord());
|
|
1637
|
+
}, e2.prototype.play = function() {
|
|
1638
|
+
this.stop(), this.isplaying = true, this.onplay && this.onplay(), s.default.addPlayEnd(this.onplayend);
|
|
1639
|
+
var t3 = this.getWAV();
|
|
1640
|
+
t3.byteLength > 44 && s.default.play(t3.buffer);
|
|
1641
|
+
}, e2.prototype.getPlayTime = function() {
|
|
1642
|
+
return s.default.getPlayTime();
|
|
1643
|
+
}, e2.prototype.pausePlay = function() {
|
|
1644
|
+
!this.isrecording && this.isplaying && (this.isplaying = false, this.onpauseplay && this.onpauseplay(), s.default.pausePlay());
|
|
1645
|
+
}, e2.prototype.resumePlay = function() {
|
|
1646
|
+
this.isrecording || this.isplaying || (this.isplaying = true, this.onresumeplay && this.onresumeplay(), s.default.resumePlay());
|
|
1647
|
+
}, e2.prototype.stopPlay = function() {
|
|
1648
|
+
this.isrecording || (this.isplaying = false, this.onstopplay && this.onstopplay(), s.default.stopPlay());
|
|
1649
|
+
}, e2.prototype.destroy = function() {
|
|
1650
|
+
return s.default.destroyPlay(), this.destroyRecord();
|
|
1651
|
+
}, e2.prototype.getRecordAnalyseData = function() {
|
|
1652
|
+
return this.getAnalyseData();
|
|
1653
|
+
}, e2.prototype.getPlayAnalyseData = function() {
|
|
1654
|
+
return s.default.getAnalyseData();
|
|
1655
|
+
}, e2.prototype.getPCM = function() {
|
|
1656
|
+
this.stop();
|
|
1657
|
+
var t3 = this.getData();
|
|
1658
|
+
return t3 = a.compress(t3, this.inputSampleRate, this.outputSampleRate), a.encodePCM(t3, this.oututSampleBits, this.littleEdian);
|
|
1659
|
+
}, e2.prototype.getPCMBlob = function() {
|
|
1660
|
+
return new Blob([this.getPCM()]);
|
|
1661
|
+
}, e2.prototype.downloadPCM = function(t3) {
|
|
1662
|
+
void 0 === t3 && (t3 = "recorder");
|
|
1663
|
+
var e3 = this.getPCMBlob();
|
|
1664
|
+
r.downloadPCM(e3, t3);
|
|
1665
|
+
}, e2.prototype.getWAV = function() {
|
|
1666
|
+
var t3 = this.getPCM();
|
|
1667
|
+
return a.encodeWAV(t3, this.inputSampleRate, this.outputSampleRate, this.config.numChannels, this.oututSampleBits, this.littleEdian);
|
|
1668
|
+
}, e2.prototype.getWAVBlob = function() {
|
|
1669
|
+
return new Blob([this.getWAV()], { type: "audio/wav" });
|
|
1670
|
+
}, e2.prototype.downloadWAV = function(t3) {
|
|
1671
|
+
void 0 === t3 && (t3 = "recorder");
|
|
1672
|
+
var e3 = this.getWAVBlob();
|
|
1673
|
+
r.downloadWAV(e3, t3);
|
|
1674
|
+
}, e2.prototype.download = function(t3, e3, n2) {
|
|
1675
|
+
r.download(t3, e3, n2);
|
|
1676
|
+
}, e2.prototype.getChannelData = function() {
|
|
1677
|
+
var t3 = this.getPCM(), e3 = t3.byteLength, n2 = this.littleEdian, i2 = { left: null, right: null };
|
|
1678
|
+
if (2 === this.config.numChannels) {
|
|
1679
|
+
var o2 = new DataView(new ArrayBuffer(e3 / 2)), r2 = new DataView(new ArrayBuffer(e3 / 2));
|
|
1680
|
+
if (16 === this.config.sampleBits) for (var a2 = 0; a2 < e3 / 2; a2 += 2) o2.setInt16(a2, t3.getInt16(2 * a2, n2), n2), r2.setInt16(a2, t3.getInt16(2 * a2 + 2, n2), n2);
|
|
1681
|
+
else for (a2 = 0; a2 < e3 / 2; a2 += 2) o2.setInt8(a2, t3.getInt8(2 * a2)), r2.setInt8(a2, t3.getInt8(2 * a2 + 1));
|
|
1682
|
+
i2.left = o2, i2.right = r2;
|
|
1683
|
+
} else i2.left = t3;
|
|
1684
|
+
return i2;
|
|
1685
|
+
}, e2;
|
|
1686
|
+
})(n(5).default);
|
|
1687
|
+
e.default = u;
|
|
1688
|
+
}, function(t, e, n) {
|
|
1689
|
+
function i(t2, e2, n2) {
|
|
1690
|
+
var i2 = document.createElement("a");
|
|
1691
|
+
i2.href = window.URL.createObjectURL(t2), i2.download = e2 + "." + n2, i2.click();
|
|
1692
|
+
}
|
|
1693
|
+
Object.defineProperty(e, "__esModule", { value: true }), e.downloadWAV = function(t2, e2) {
|
|
1694
|
+
void 0 === e2 && (e2 = "recorder"), i(t2, e2, "wav");
|
|
1695
|
+
}, e.downloadPCM = function(t2, e2) {
|
|
1696
|
+
void 0 === e2 && (e2 = "recorder"), i(t2, e2, "pcm");
|
|
1697
|
+
}, e.download = function(t2, e2, n2) {
|
|
1698
|
+
return i(t2, e2, n2);
|
|
1699
|
+
};
|
|
1700
|
+
}, function(t, e, n) {
|
|
1701
|
+
Object.defineProperty(e, "__esModule", { value: true });
|
|
1702
|
+
var i = n(4), o = null, r = 0, a = 0, s = null, u = null, c = null, l = false, f = 0, p = function() {
|
|
1703
|
+
};
|
|
1704
|
+
function d() {
|
|
1705
|
+
return l = false, s.decodeAudioData(c.slice(0), function(t2) {
|
|
1706
|
+
(o = s.createBufferSource()).onended = function() {
|
|
1707
|
+
l || (f = s.currentTime - a + r, p());
|
|
1708
|
+
}, o.buffer = t2, o.connect(u), u.connect(s.destination), o.start(0, r), a = s.currentTime;
|
|
1709
|
+
}, function(t2) {
|
|
1710
|
+
i.throwError(t2);
|
|
1711
|
+
});
|
|
1712
|
+
}
|
|
1713
|
+
function h() {
|
|
1714
|
+
o && (o.stop(), o = null);
|
|
1715
|
+
}
|
|
1716
|
+
var y = (function() {
|
|
1717
|
+
function t2() {
|
|
1718
|
+
}
|
|
1719
|
+
return t2.play = function(t3) {
|
|
1720
|
+
return s || (s = new (window.AudioContext || window.webkitAudioContext)(), (u = s.createAnalyser()).fftSize = 2048), this.stopPlay(), c = t3, f = 0, d();
|
|
1721
|
+
}, t2.pausePlay = function() {
|
|
1722
|
+
h(), r += s.currentTime - a, l = true;
|
|
1723
|
+
}, t2.resumePlay = function() {
|
|
1724
|
+
return d();
|
|
1725
|
+
}, t2.stopPlay = function() {
|
|
1726
|
+
r = 0, c = null, h();
|
|
1727
|
+
}, t2.destroyPlay = function() {
|
|
1728
|
+
this.stopPlay();
|
|
1729
|
+
}, t2.getAnalyseData = function() {
|
|
1730
|
+
var t3 = new Uint8Array(u.frequencyBinCount);
|
|
1731
|
+
return u.getByteTimeDomainData(t3), t3;
|
|
1732
|
+
}, t2.addPlayEnd = function(t3) {
|
|
1733
|
+
void 0 === t3 && (t3 = function() {
|
|
1734
|
+
}), p = t3;
|
|
1735
|
+
}, t2.getPlayTime = function() {
|
|
1736
|
+
var t3 = l ? r : s.currentTime - a + r;
|
|
1737
|
+
return f || t3;
|
|
1738
|
+
}, t2;
|
|
1739
|
+
})();
|
|
1740
|
+
e.default = y;
|
|
1741
|
+
}, function(t, e, n) {
|
|
1742
|
+
Object.defineProperty(e, "__esModule", { value: true }), e.throwError = function(t2) {
|
|
1743
|
+
throw new Error(t2);
|
|
1744
|
+
};
|
|
1745
|
+
}, function(t, e, n) {
|
|
1746
|
+
Object.defineProperty(e, "__esModule", { value: true });
|
|
1747
|
+
var i = n(0), o = (function() {
|
|
1748
|
+
function t2(e2) {
|
|
1749
|
+
void 0 === e2 && (e2 = {}), this.size = 0, this.lBuffer = [], this.rBuffer = [], this.tempPCM = [], this.inputSampleBits = 16, this.fileSize = 0, this.duration = 0, this.needRecord = true;
|
|
1750
|
+
var n2, i2 = new (window.AudioContext || window.webkitAudioContext)();
|
|
1751
|
+
this.inputSampleRate = i2.sampleRate, this.setNewOption(e2), this.littleEdian = (n2 = new ArrayBuffer(2), new DataView(n2).setInt16(0, 256, true), 256 === new Int16Array(n2)[0]), t2.initUserMedia();
|
|
1752
|
+
}
|
|
1753
|
+
return t2.prototype.setNewOption = function(t3) {
|
|
1754
|
+
void 0 === t3 && (t3 = {}), this.config = { sampleBits: ~[8, 16].indexOf(t3.sampleBits) ? t3.sampleBits : 16, sampleRate: ~[8e3, 11025, 16e3, 22050, 24e3, 44100, 48e3].indexOf(t3.sampleRate) ? t3.sampleRate : this.inputSampleRate, numChannels: ~[1, 2].indexOf(t3.numChannels) ? t3.numChannels : 1 }, this.outputSampleRate = this.config.sampleRate, this.oututSampleBits = this.config.sampleBits;
|
|
1755
|
+
}, t2.prototype.startRecord = function() {
|
|
1756
|
+
var t3 = this;
|
|
1757
|
+
return this.context && this.destroyRecord(), this.initRecorder(), navigator.mediaDevices.getUserMedia({ audio: true }).then(function(e2) {
|
|
1758
|
+
t3.audioInput = t3.context.createMediaStreamSource(e2), t3.stream = e2;
|
|
1759
|
+
}).then(function() {
|
|
1760
|
+
t3.audioInput.connect(t3.analyser), t3.analyser.connect(t3.recorder), t3.recorder.connect(t3.context.destination);
|
|
1761
|
+
});
|
|
1762
|
+
}, t2.prototype.pauseRecord = function() {
|
|
1763
|
+
this.needRecord = false;
|
|
1764
|
+
}, t2.prototype.resumeRecord = function() {
|
|
1765
|
+
this.needRecord = true;
|
|
1766
|
+
}, t2.prototype.stopRecord = function() {
|
|
1767
|
+
this.audioInput && this.audioInput.disconnect(), this.source && this.source.stop(), this.recorder.disconnect(), this.analyser.disconnect(), this.needRecord = true;
|
|
1768
|
+
}, t2.prototype.destroyRecord = function() {
|
|
1769
|
+
return this.clearRecordStatus(), this.stopStream(), this.closeAudioContext();
|
|
1770
|
+
}, t2.prototype.getAnalyseData = function() {
|
|
1771
|
+
var t3 = new Uint8Array(this.analyser.frequencyBinCount);
|
|
1772
|
+
return this.analyser.getByteTimeDomainData(t3), t3;
|
|
1773
|
+
}, t2.prototype.getData = function() {
|
|
1774
|
+
return this.flat();
|
|
1775
|
+
}, t2.prototype.clearRecordStatus = function() {
|
|
1776
|
+
this.lBuffer.length = 0, this.rBuffer.length = 0, this.size = 0, this.fileSize = 0, this.PCM = null, this.audioInput = null, this.duration = 0;
|
|
1777
|
+
}, t2.prototype.flat = function() {
|
|
1778
|
+
var t3 = null, e2 = new Float32Array(0);
|
|
1779
|
+
1 === this.config.numChannels ? t3 = new Float32Array(this.size) : (t3 = new Float32Array(this.size / 2), e2 = new Float32Array(this.size / 2));
|
|
1780
|
+
for (var n2 = 0, i2 = 0; i2 < this.lBuffer.length; i2++) t3.set(this.lBuffer[i2], n2), n2 += this.lBuffer[i2].length;
|
|
1781
|
+
n2 = 0;
|
|
1782
|
+
for (i2 = 0; i2 < this.rBuffer.length; i2++) e2.set(this.rBuffer[i2], n2), n2 += this.rBuffer[i2].length;
|
|
1783
|
+
return { left: t3, right: e2 };
|
|
1784
|
+
}, t2.prototype.initRecorder = function() {
|
|
1785
|
+
var t3 = this;
|
|
1786
|
+
this.clearRecordStatus(), this.context = new (window.AudioContext || window.webkitAudioContext)(), this.analyser = this.context.createAnalyser(), this.analyser.fftSize = 2048;
|
|
1787
|
+
var e2 = this.context.createScriptProcessor || this.context.createJavaScriptNode;
|
|
1788
|
+
this.recorder = e2.apply(this.context, [4096, this.config.numChannels, this.config.numChannels]), this.recorder.onaudioprocess = function(e3) {
|
|
1789
|
+
if (t3.needRecord) {
|
|
1790
|
+
var n2, i2 = e3.inputBuffer.getChannelData(0), o2 = null;
|
|
1791
|
+
t3.lBuffer.push(new Float32Array(i2)), t3.size += i2.length, 2 === t3.config.numChannels && (o2 = e3.inputBuffer.getChannelData(1), t3.rBuffer.push(new Float32Array(o2)), t3.size += o2.length), t3.fileSize = Math.floor(t3.size / Math.max(t3.inputSampleRate / t3.outputSampleRate, 1)) * (t3.oututSampleBits / 8), n2 = 100 * Math.max.apply(Math, i2), t3.duration += 4096 / t3.inputSampleRate, t3.onprocess && t3.onprocess(t3.duration), t3.onprogress && t3.onprogress({ duration: t3.duration, fileSize: t3.fileSize, vol: n2 });
|
|
1792
|
+
}
|
|
1793
|
+
};
|
|
1794
|
+
}, t2.prototype.stopStream = function() {
|
|
1795
|
+
this.stream && this.stream.getTracks && (this.stream.getTracks().forEach(function(t3) {
|
|
1796
|
+
return t3.stop();
|
|
1797
|
+
}), this.stream = null);
|
|
1798
|
+
}, t2.prototype.closeAudioContext = function() {
|
|
1799
|
+
return this.context && this.context.close && "closed" !== this.context.state ? this.context.close() : new Promise(function(t3) {
|
|
1800
|
+
t3();
|
|
1801
|
+
});
|
|
1802
|
+
}, t2.initUserMedia = function() {
|
|
1803
|
+
void 0 === navigator.mediaDevices && (navigator.mediaDevices = {}), void 0 === navigator.mediaDevices.getUserMedia && (navigator.mediaDevices.getUserMedia = function(t3) {
|
|
1804
|
+
var e2 = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
|
|
1805
|
+
return e2 ? new Promise(function(n2, i2) {
|
|
1806
|
+
e2.call(navigator, t3, n2, i2);
|
|
1807
|
+
}) : Promise.reject(new Error("浏览器不支持 getUserMedia !"));
|
|
1808
|
+
});
|
|
1809
|
+
}, t2.prototype.transformIntoPCM = function(t3, e2) {
|
|
1810
|
+
var n2 = new Float32Array(t3), o2 = new Float32Array(e2), r = i.compress({ left: n2, right: o2 }, this.inputSampleRate, this.outputSampleRate);
|
|
1811
|
+
return i.encodePCM(r, this.oututSampleBits, this.littleEdian);
|
|
1812
|
+
}, t2.getPermission = function() {
|
|
1813
|
+
return this.initUserMedia(), navigator.mediaDevices.getUserMedia({ audio: true }).then(function(t3) {
|
|
1814
|
+
t3 && t3.getTracks().forEach(function(t4) {
|
|
1815
|
+
return t4.stop();
|
|
1816
|
+
});
|
|
1817
|
+
});
|
|
1818
|
+
}, t2;
|
|
1819
|
+
})();
|
|
1820
|
+
e.default = o;
|
|
1821
|
+
}]).default;
|
|
1822
|
+
});
|
|
1823
|
+
})(recorder$1);
|
|
1824
|
+
return recorder$1.exports;
|
|
1825
|
+
}
|
|
1826
|
+
var jsAudioRecorder;
|
|
1827
|
+
var hasRequiredJsAudioRecorder;
|
|
1828
|
+
function requireJsAudioRecorder() {
|
|
1829
|
+
if (hasRequiredJsAudioRecorder) return jsAudioRecorder;
|
|
1830
|
+
hasRequiredJsAudioRecorder = 1;
|
|
1831
|
+
jsAudioRecorder = requireRecorder();
|
|
1832
|
+
return jsAudioRecorder;
|
|
1833
|
+
}
|
|
1834
|
+
var jsAudioRecorderExports = requireJsAudioRecorder();
|
|
1835
|
+
const Recorder = /* @__PURE__ */ getDefaultExportFromCjs(jsAudioRecorderExports);
|
|
1836
|
+
const VOICE_SAMPLE_BITS = 16;
|
|
1837
|
+
const VOICE_SAMPLE_RATE = 16e3;
|
|
1838
|
+
const VOICE_CHANNELS = 1;
|
|
1839
|
+
const VOICE_MIN_DURATION = 1;
|
|
1840
|
+
const VOICE_MAX_DURATION = 60;
|
|
1841
|
+
const VOICE_CANCEL_DISTANCE = 80;
|
|
1842
|
+
let activeRecorder = null;
|
|
1843
|
+
const now = () => Date.now();
|
|
1844
|
+
const useVoiceRecorder = () => {
|
|
1845
|
+
const instanceId = Symbol("voice-recorder");
|
|
1846
|
+
const isRecording = ref(false);
|
|
1847
|
+
const canceling = ref(false);
|
|
1848
|
+
const elapsed = ref(0);
|
|
1849
|
+
let recorder2 = null;
|
|
1850
|
+
let tickTimer = null;
|
|
1851
|
+
let startAt = 0;
|
|
1852
|
+
let onTimeoutCb = null;
|
|
1853
|
+
let starting = false;
|
|
1854
|
+
let canceledDuringStart = false;
|
|
1855
|
+
const remaining = computed(() => Math.max(0, VOICE_MAX_DURATION - elapsed.value));
|
|
1856
|
+
const countdown = computed(() => remaining.value <= 10 ? remaining.value : 0);
|
|
1857
|
+
const clearTick = () => {
|
|
1858
|
+
if (tickTimer) {
|
|
1859
|
+
clearInterval(tickTimer);
|
|
1860
|
+
tickTimer = null;
|
|
1861
|
+
}
|
|
1862
|
+
};
|
|
1863
|
+
const removeVisibilityListener = () => {
|
|
1864
|
+
var _a;
|
|
1865
|
+
(_a = document.removeEventListener) == null ? void 0 : _a.call(document, "visibilitychange", handleVisibilityChange);
|
|
1866
|
+
};
|
|
1867
|
+
const handleVisibilityChange = () => {
|
|
1868
|
+
if (document.visibilityState === "hidden" && isRecording.value) {
|
|
1869
|
+
cancel();
|
|
1870
|
+
}
|
|
1871
|
+
};
|
|
1872
|
+
const cleanup = () => {
|
|
1873
|
+
var _a;
|
|
1874
|
+
clearTick();
|
|
1875
|
+
removeVisibilityListener();
|
|
1876
|
+
canceledDuringStart = true;
|
|
1877
|
+
isRecording.value = false;
|
|
1878
|
+
canceling.value = false;
|
|
1879
|
+
elapsed.value = 0;
|
|
1880
|
+
if (recorder2) {
|
|
1881
|
+
try {
|
|
1882
|
+
recorder2.stop();
|
|
1883
|
+
} catch (error) {
|
|
1884
|
+
}
|
|
1885
|
+
const destroying = recorder2;
|
|
1886
|
+
recorder2 = null;
|
|
1887
|
+
try {
|
|
1888
|
+
(_a = destroying.destroy) == null ? void 0 : _a.call(destroying);
|
|
1889
|
+
} catch (error) {
|
|
1890
|
+
}
|
|
1891
|
+
}
|
|
1892
|
+
if (activeRecorder === instanceId) activeRecorder = null;
|
|
1893
|
+
};
|
|
1894
|
+
const start = async ({ onTimeout } = {}) => {
|
|
1895
|
+
var _a, _b;
|
|
1896
|
+
if (starting) return false;
|
|
1897
|
+
if (activeRecorder && activeRecorder !== instanceId) return false;
|
|
1898
|
+
if (isRecording.value) return false;
|
|
1899
|
+
if (typeof navigator === "undefined" || !((_a = navigator.mediaDevices) == null ? void 0 : _a.getUserMedia)) {
|
|
1900
|
+
throw new Error("当前环境不支持录音");
|
|
1901
|
+
}
|
|
1902
|
+
starting = true;
|
|
1903
|
+
canceledDuringStart = false;
|
|
1904
|
+
try {
|
|
1905
|
+
await Recorder.getPermission();
|
|
1906
|
+
if (canceledDuringStart) return false;
|
|
1907
|
+
recorder2 = new Recorder({
|
|
1908
|
+
sampleBits: VOICE_SAMPLE_BITS,
|
|
1909
|
+
sampleRate: VOICE_SAMPLE_RATE,
|
|
1910
|
+
numChannels: VOICE_CHANNELS
|
|
1911
|
+
});
|
|
1912
|
+
const startResult = recorder2.start();
|
|
1913
|
+
if (startResult == null ? void 0 : startResult.catch) {
|
|
1914
|
+
startResult.catch((error) => {
|
|
1915
|
+
console.error("[Voice] 录音启动失败:", error);
|
|
1916
|
+
cleanup();
|
|
1917
|
+
});
|
|
1918
|
+
}
|
|
1919
|
+
activeRecorder = instanceId;
|
|
1920
|
+
onTimeoutCb = onTimeout || null;
|
|
1921
|
+
isRecording.value = true;
|
|
1922
|
+
canceling.value = false;
|
|
1923
|
+
elapsed.value = 0;
|
|
1924
|
+
startAt = now();
|
|
1925
|
+
(_b = document.addEventListener) == null ? void 0 : _b.call(document, "visibilitychange", handleVisibilityChange);
|
|
1926
|
+
tickTimer = setInterval(async () => {
|
|
1927
|
+
elapsed.value = Math.floor((now() - startAt) / 1e3);
|
|
1928
|
+
if (elapsed.value >= VOICE_MAX_DURATION) {
|
|
1929
|
+
const cb = onTimeoutCb;
|
|
1930
|
+
onTimeoutCb = null;
|
|
1931
|
+
const result = await stop();
|
|
1932
|
+
cb == null ? void 0 : cb(result);
|
|
1933
|
+
}
|
|
1934
|
+
}, 250);
|
|
1935
|
+
return true;
|
|
1936
|
+
} finally {
|
|
1937
|
+
starting = false;
|
|
1938
|
+
}
|
|
1939
|
+
};
|
|
1940
|
+
const setCanceling = (value) => {
|
|
1941
|
+
canceling.value = !!value;
|
|
1942
|
+
};
|
|
1943
|
+
const stop = async () => {
|
|
1944
|
+
var _a;
|
|
1945
|
+
if (!recorder2 || !isRecording.value) return null;
|
|
1946
|
+
const recordedSeconds = (now() - startAt) / 1e3;
|
|
1947
|
+
const current = recorder2;
|
|
1948
|
+
const wasCanceling = canceling.value;
|
|
1949
|
+
clearTick();
|
|
1950
|
+
removeVisibilityListener();
|
|
1951
|
+
isRecording.value = false;
|
|
1952
|
+
onTimeoutCb = null;
|
|
1953
|
+
let blob = null;
|
|
1954
|
+
try {
|
|
1955
|
+
current.stop();
|
|
1956
|
+
blob = current.getWAVBlob();
|
|
1957
|
+
} catch (error) {
|
|
1958
|
+
console.warn("录音结束失败:", error);
|
|
1959
|
+
} finally {
|
|
1960
|
+
recorder2 = null;
|
|
1961
|
+
if (activeRecorder === instanceId) activeRecorder = null;
|
|
1962
|
+
try {
|
|
1963
|
+
(_a = current.destroy) == null ? void 0 : _a.call(current);
|
|
1964
|
+
} catch (error) {
|
|
1965
|
+
}
|
|
1966
|
+
}
|
|
1967
|
+
canceling.value = false;
|
|
1968
|
+
if (wasCanceling || !blob) return null;
|
|
1969
|
+
if (recordedSeconds < VOICE_MIN_DURATION) return { tooShort: true };
|
|
1970
|
+
const file = new File([blob], `voice_${Date.now()}.wav`, { type: "audio/wav" });
|
|
1971
|
+
let duration = 0;
|
|
1972
|
+
try {
|
|
1973
|
+
duration = await getMediaDuration(file);
|
|
1974
|
+
} catch (error) {
|
|
1975
|
+
duration = 0;
|
|
1976
|
+
}
|
|
1977
|
+
if (!duration) duration = Number(current.duration) || 0;
|
|
1978
|
+
if (!duration) duration = recordedSeconds;
|
|
1979
|
+
return {
|
|
1980
|
+
file,
|
|
1981
|
+
size: file.size,
|
|
1982
|
+
duration: Math.max(VOICE_MIN_DURATION, Math.round(duration))
|
|
1983
|
+
};
|
|
1984
|
+
};
|
|
1985
|
+
const cancel = () => {
|
|
1986
|
+
canceledDuringStart = true;
|
|
1987
|
+
canceling.value = true;
|
|
1988
|
+
return stop();
|
|
1989
|
+
};
|
|
1990
|
+
onBeforeUnmount(() => cleanup());
|
|
1991
|
+
return {
|
|
1992
|
+
isRecording,
|
|
1993
|
+
canceling,
|
|
1994
|
+
elapsed,
|
|
1995
|
+
remaining,
|
|
1996
|
+
countdown,
|
|
1997
|
+
start,
|
|
1998
|
+
stop,
|
|
1999
|
+
cancel,
|
|
2000
|
+
setCanceling,
|
|
2001
|
+
cleanup
|
|
2002
|
+
};
|
|
2003
|
+
};
|
|
2004
|
+
const _hoisted_1$2 = { class: "voice-recorder" };
|
|
2005
|
+
const _hoisted_2$2 = { class: "voice-wave" };
|
|
2006
|
+
const _hoisted_3$2 = { class: "voice-time" };
|
|
2007
|
+
const _hoisted_4$2 = {
|
|
2008
|
+
key: 0,
|
|
2009
|
+
class: "voice-tip countdown"
|
|
2010
|
+
};
|
|
2011
|
+
const _hoisted_5$2 = { class: "voice-tip cancel-tip" };
|
|
2012
|
+
const _sfc_main$2 = {
|
|
2013
|
+
__name: "VoiceRecorderH5",
|
|
2014
|
+
props: {
|
|
2015
|
+
disabled: {
|
|
2016
|
+
type: Boolean,
|
|
2017
|
+
default: false
|
|
2018
|
+
}
|
|
2019
|
+
},
|
|
2020
|
+
emits: ["record-start", "record-complete", "record-cancel"],
|
|
2021
|
+
setup(__props, { emit: __emit }) {
|
|
2022
|
+
const props = __props;
|
|
2023
|
+
const emit = __emit;
|
|
2024
|
+
const { isRecording, canceling, elapsed, countdown, start, stop, setCanceling } = useVoiceRecorder();
|
|
2025
|
+
const startY = ref(0);
|
|
2026
|
+
let starting = false;
|
|
2027
|
+
let pressing = false;
|
|
2028
|
+
const onTouchStart = async (e) => {
|
|
2029
|
+
var _a, _b;
|
|
2030
|
+
if (props.disabled || isRecording.value || starting) return;
|
|
2031
|
+
starting = true;
|
|
2032
|
+
pressing = true;
|
|
2033
|
+
startY.value = ((_b = (_a = e.touches) == null ? void 0 : _a[0]) == null ? void 0 : _b.clientY) || 0;
|
|
2034
|
+
try {
|
|
2035
|
+
const ok = await start({
|
|
2036
|
+
onTimeout: (result) => {
|
|
2037
|
+
if (result == null ? void 0 : result.file) emit("record-complete", result);
|
|
2038
|
+
else emit("record-cancel");
|
|
2039
|
+
}
|
|
2040
|
+
});
|
|
2041
|
+
if (ok && pressing) {
|
|
2042
|
+
emit("record-start");
|
|
2043
|
+
} else if (ok) {
|
|
2044
|
+
await stop();
|
|
2045
|
+
emit("record-cancel");
|
|
2046
|
+
}
|
|
2047
|
+
} catch (error) {
|
|
2048
|
+
console.error("[Voice] 录音启动失败:", error);
|
|
2049
|
+
showToast((error == null ? void 0 : error.message) || "无法录音,请检查麦克风权限");
|
|
2050
|
+
} finally {
|
|
2051
|
+
starting = false;
|
|
2052
|
+
}
|
|
2053
|
+
};
|
|
2054
|
+
const onTouchMove = (e) => {
|
|
2055
|
+
var _a, _b;
|
|
2056
|
+
if (!isRecording.value) return;
|
|
2057
|
+
const diff = startY.value - (((_b = (_a = e.touches) == null ? void 0 : _a[0]) == null ? void 0 : _b.clientY) || startY.value);
|
|
2058
|
+
setCanceling(diff > VOICE_CANCEL_DISTANCE);
|
|
2059
|
+
};
|
|
2060
|
+
const onTouchEnd = async () => {
|
|
2061
|
+
pressing = false;
|
|
2062
|
+
if (!isRecording.value) return;
|
|
2063
|
+
const result = await stop();
|
|
2064
|
+
if (!result) {
|
|
2065
|
+
emit("record-cancel");
|
|
2066
|
+
return;
|
|
2067
|
+
}
|
|
2068
|
+
if (result.tooShort) {
|
|
2069
|
+
showToast("录音时间太短");
|
|
2070
|
+
emit("record-cancel");
|
|
2071
|
+
return;
|
|
2072
|
+
}
|
|
2073
|
+
emit("record-complete", result);
|
|
2074
|
+
};
|
|
2075
|
+
return (_ctx, _cache) => {
|
|
2076
|
+
return openBlock(), createElementBlock("div", _hoisted_1$2, [
|
|
2077
|
+
createElementVNode("div", {
|
|
2078
|
+
class: normalizeClass(["voice-hold-btn", { recording: unref(isRecording), canceling: unref(canceling), disabled: props.disabled }]),
|
|
2079
|
+
onTouchstart: withModifiers(onTouchStart, ["prevent"]),
|
|
2080
|
+
onTouchmove: withModifiers(onTouchMove, ["prevent"]),
|
|
2081
|
+
onTouchend: withModifiers(onTouchEnd, ["prevent"]),
|
|
2082
|
+
onTouchcancel: withModifiers(onTouchEnd, ["prevent"])
|
|
2083
|
+
}, toDisplayString(unref(isRecording) ? unref(canceling) ? "松开 取消" : "松开 发送" : "按住 说话"), 35),
|
|
2084
|
+
createVNode(unref(Overlay), {
|
|
2085
|
+
show: unref(isRecording),
|
|
2086
|
+
"z-index": 3e3
|
|
2087
|
+
}, {
|
|
2088
|
+
default: withCtx(() => [
|
|
2089
|
+
createElementVNode("div", {
|
|
2090
|
+
class: normalizeClass(["voice-mask", { canceling: unref(canceling) }]),
|
|
2091
|
+
onTouchstart: _cache[0] || (_cache[0] = withModifiers(() => {
|
|
2092
|
+
}, ["prevent", "stop"])),
|
|
2093
|
+
onTouchmove: _cache[1] || (_cache[1] = withModifiers(() => {
|
|
2094
|
+
}, ["prevent", "stop"])),
|
|
2095
|
+
onTouchend: _cache[2] || (_cache[2] = withModifiers(() => {
|
|
2096
|
+
}, ["prevent", "stop"]))
|
|
2097
|
+
}, [
|
|
2098
|
+
createElementVNode("div", _hoisted_2$2, [
|
|
2099
|
+
(openBlock(), createElementBlock(Fragment, null, renderList(5, (n) => {
|
|
2100
|
+
return createElementVNode("span", {
|
|
2101
|
+
key: n,
|
|
2102
|
+
class: "wave-bar",
|
|
2103
|
+
style: normalizeStyle({ animationDelay: `${n * 0.1}s` })
|
|
2104
|
+
}, null, 4);
|
|
2105
|
+
}), 64))
|
|
2106
|
+
]),
|
|
2107
|
+
createElementVNode("div", _hoisted_3$2, toDisplayString(unref(elapsed)) + "s", 1),
|
|
2108
|
+
unref(countdown) > 0 ? (openBlock(), createElementBlock("div", _hoisted_4$2, toDisplayString(unref(countdown)) + " 秒后自动结束", 1)) : createCommentVNode("", true),
|
|
2109
|
+
createElementVNode("div", _hoisted_5$2, [
|
|
2110
|
+
createVNode(unref(Icon), {
|
|
2111
|
+
name: unref(canceling) ? "cross" : "upgrade",
|
|
2112
|
+
size: "14"
|
|
2113
|
+
}, null, 8, ["name"]),
|
|
2114
|
+
createTextVNode(" " + toDisplayString(unref(canceling) ? "松开手指,取消发送" : "手指上滑,取消发送"), 1)
|
|
2115
|
+
])
|
|
2116
|
+
], 34)
|
|
2117
|
+
]),
|
|
2118
|
+
_: 1
|
|
2119
|
+
}, 8, ["show"])
|
|
2120
|
+
]);
|
|
2121
|
+
};
|
|
2122
|
+
}
|
|
2123
|
+
};
|
|
2124
|
+
const VoiceRecorderH5 = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-75dca338"]]);
|
|
1465
2125
|
const _hoisted_1$1 = {
|
|
1466
2126
|
key: 0,
|
|
1467
2127
|
class: "disabled-box"
|
|
@@ -1553,6 +2213,7 @@ const _sfc_main$1 = {
|
|
|
1553
2213
|
emits: [
|
|
1554
2214
|
"send-message",
|
|
1555
2215
|
"send-file",
|
|
2216
|
+
"send-sound",
|
|
1556
2217
|
"clear-reply",
|
|
1557
2218
|
"merge-forward",
|
|
1558
2219
|
"delete-selected",
|
|
@@ -1564,6 +2225,7 @@ const _sfc_main$1 = {
|
|
|
1564
2225
|
const emit = __emit;
|
|
1565
2226
|
const chatMessage = useChatStore();
|
|
1566
2227
|
computed(() => chatMessage.getUserInfo);
|
|
2228
|
+
const { stopAllAudio } = useAudioPlayer();
|
|
1567
2229
|
const inputText = ref("");
|
|
1568
2230
|
const textareaRef = ref(null);
|
|
1569
2231
|
const showEmojiPanel = ref(false);
|
|
@@ -1584,6 +2246,41 @@ const _sfc_main$1 = {
|
|
|
1584
2246
|
const placeholder = computed(() => {
|
|
1585
2247
|
return "输入消息...";
|
|
1586
2248
|
});
|
|
2249
|
+
const voiceMode = ref(false);
|
|
2250
|
+
const onToggleVoiceMode = () => {
|
|
2251
|
+
var _a;
|
|
2252
|
+
if (isDisabled.value) {
|
|
2253
|
+
showToast(disabledText.value || "当前无法录音");
|
|
2254
|
+
return;
|
|
2255
|
+
}
|
|
2256
|
+
(_a = textareaRef.value) == null ? void 0 : _a.blur();
|
|
2257
|
+
voiceMode.value = !voiceMode.value;
|
|
2258
|
+
showEmojiPanel.value = false;
|
|
2259
|
+
showPlusPanel.value = false;
|
|
2260
|
+
};
|
|
2261
|
+
const onRecordStart = () => {
|
|
2262
|
+
stopAllAudio();
|
|
2263
|
+
};
|
|
2264
|
+
const onRecordComplete = (payload) => {
|
|
2265
|
+
if (isDisabled.value) return;
|
|
2266
|
+
emit("send-sound", payload);
|
|
2267
|
+
};
|
|
2268
|
+
const onRecordCancel = () => {
|
|
2269
|
+
};
|
|
2270
|
+
watch(
|
|
2271
|
+
() => {
|
|
2272
|
+
var _a;
|
|
2273
|
+
return (_a = props.chatInfo) == null ? void 0 : _a.conversationID;
|
|
2274
|
+
},
|
|
2275
|
+
(id, oldID) => {
|
|
2276
|
+
if (id && id !== oldID) {
|
|
2277
|
+
voiceMode.value = false;
|
|
2278
|
+
}
|
|
2279
|
+
}
|
|
2280
|
+
);
|
|
2281
|
+
watch(isDisabled, (disabled) => {
|
|
2282
|
+
if (disabled) voiceMode.value = false;
|
|
2283
|
+
});
|
|
1587
2284
|
const replyMsgStr = ref("");
|
|
1588
2285
|
watch(
|
|
1589
2286
|
() => props.msgItem,
|
|
@@ -1868,48 +2565,66 @@ const _sfc_main$1 = {
|
|
|
1868
2565
|
})
|
|
1869
2566
|
])) : createCommentVNode("", true),
|
|
1870
2567
|
createElementVNode("div", _hoisted_6$1, [
|
|
1871
|
-
createElementVNode("div", _hoisted_7$1, [
|
|
1872
|
-
withDirectives(createElementVNode("textarea", {
|
|
1873
|
-
ref_key: "textareaRef",
|
|
1874
|
-
ref: textareaRef,
|
|
1875
|
-
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => inputText.value = $event),
|
|
1876
|
-
class: "input-textarea",
|
|
1877
|
-
placeholder: placeholder.value,
|
|
1878
|
-
rows: 1,
|
|
1879
|
-
onKeydown: onKeyDown,
|
|
1880
|
-
onFocus,
|
|
1881
|
-
onBlur
|
|
1882
|
-
}, null, 40, _hoisted_8$1), [
|
|
1883
|
-
[vModelText, inputText.value]
|
|
1884
|
-
])
|
|
1885
|
-
]),
|
|
1886
2568
|
createElementVNode("div", {
|
|
1887
|
-
class: normalizeClass(["action-btn
|
|
1888
|
-
onClick:
|
|
2569
|
+
class: normalizeClass(["action-btn voice-toggle", { active: voiceMode.value }]),
|
|
2570
|
+
onClick: onToggleVoiceMode
|
|
1889
2571
|
}, [
|
|
1890
2572
|
createVNode(unref(Icon), {
|
|
1891
|
-
name: "
|
|
2573
|
+
name: voiceMode.value ? "edit" : "audio",
|
|
1892
2574
|
size: "22",
|
|
1893
2575
|
color: "var(--chat-tip-font-color, #999)"
|
|
1894
|
-
})
|
|
2576
|
+
}, null, 8, ["name"])
|
|
1895
2577
|
], 2),
|
|
1896
|
-
|
|
2578
|
+
voiceMode.value ? (openBlock(), createBlock(VoiceRecorderH5, {
|
|
1897
2579
|
key: 0,
|
|
1898
|
-
|
|
1899
|
-
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
])
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
2580
|
+
disabled: isDisabled.value,
|
|
2581
|
+
onRecordStart,
|
|
2582
|
+
onRecordComplete,
|
|
2583
|
+
onRecordCancel
|
|
2584
|
+
}, null, 8, ["disabled"])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
|
|
2585
|
+
createElementVNode("div", _hoisted_7$1, [
|
|
2586
|
+
withDirectives(createElementVNode("textarea", {
|
|
2587
|
+
ref_key: "textareaRef",
|
|
2588
|
+
ref: textareaRef,
|
|
2589
|
+
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => inputText.value = $event),
|
|
2590
|
+
class: "input-textarea",
|
|
2591
|
+
placeholder: placeholder.value,
|
|
2592
|
+
rows: 1,
|
|
2593
|
+
onKeydown: onKeyDown,
|
|
2594
|
+
onFocus,
|
|
2595
|
+
onBlur
|
|
2596
|
+
}, null, 40, _hoisted_8$1), [
|
|
2597
|
+
[vModelText, inputText.value]
|
|
2598
|
+
])
|
|
2599
|
+
]),
|
|
2600
|
+
createElementVNode("div", {
|
|
2601
|
+
class: normalizeClass(["action-btn emoji-btn", { active: showEmojiPanel.value }]),
|
|
2602
|
+
onClick: onToggleEmoji
|
|
2603
|
+
}, [
|
|
2604
|
+
createVNode(unref(Icon), {
|
|
2605
|
+
name: "smile-o",
|
|
2606
|
+
size: "22",
|
|
2607
|
+
color: "var(--chat-tip-font-color, #999)"
|
|
2608
|
+
})
|
|
2609
|
+
], 2),
|
|
2610
|
+
inputText.value.trim() ? (openBlock(), createElementBlock("div", {
|
|
2611
|
+
key: 0,
|
|
2612
|
+
class: "action-btn send-btn",
|
|
2613
|
+
onClick: onSend
|
|
2614
|
+
}, [..._cache[10] || (_cache[10] = [
|
|
2615
|
+
createElementVNode("span", null, "发送", -1)
|
|
2616
|
+
])])) : (openBlock(), createElementBlock("div", {
|
|
2617
|
+
key: 1,
|
|
2618
|
+
class: normalizeClass(["action-btn plus-btn", { active: showPlusPanel.value }]),
|
|
2619
|
+
onClick: onTogglePlus
|
|
2620
|
+
}, [
|
|
2621
|
+
createVNode(unref(Icon), {
|
|
2622
|
+
name: "plus",
|
|
2623
|
+
size: "22",
|
|
2624
|
+
color: "var(--chat-tip-font-color, #999)"
|
|
2625
|
+
})
|
|
2626
|
+
], 2))
|
|
2627
|
+
], 64))
|
|
1913
2628
|
])
|
|
1914
2629
|
], 64)),
|
|
1915
2630
|
withDirectives(createElementVNode("div", _hoisted_9$1, [
|
|
@@ -2088,7 +2803,7 @@ const _sfc_main$1 = {
|
|
|
2088
2803
|
};
|
|
2089
2804
|
}
|
|
2090
2805
|
};
|
|
2091
|
-
const ChatInputH5 = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-
|
|
2806
|
+
const ChatInputH5 = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-d9bf64c5"]]);
|
|
2092
2807
|
const _hoisted_1 = { class: "notice-bar-text-wrap" };
|
|
2093
2808
|
const _hoisted_2 = { class: "notice-bar-text notice-bar-scroll" };
|
|
2094
2809
|
const _hoisted_3 = { class: "forward-popup" };
|
|
@@ -2131,7 +2846,7 @@ const _sfc_main = {
|
|
|
2131
2846
|
updateMessageList,
|
|
2132
2847
|
handleMessage
|
|
2133
2848
|
} = useMsgList();
|
|
2134
|
-
const { addPendingMessage, removePendingMessage, getPendingMessages } = useUploadQueue();
|
|
2849
|
+
const { addPendingMessage, removePendingMessage, getPendingMessages, updatePendingMessage } = useUploadQueue();
|
|
2135
2850
|
let imInstance = null;
|
|
2136
2851
|
const baseUrl = computed(() => chatMessage.getBaseUrl);
|
|
2137
2852
|
const localUser = computed(() => chatMessage.getUserInfo);
|
|
@@ -2148,6 +2863,7 @@ const _sfc_main = {
|
|
|
2148
2863
|
var _a;
|
|
2149
2864
|
return ((_a = currentConversation.value) == null ? void 0 : _a.conversationType) === IM_CVS_TYPE.Group;
|
|
2150
2865
|
});
|
|
2866
|
+
const isNoticeAgentChat = computed(() => isNoticeAgentConversation(currentConversation.value));
|
|
2151
2867
|
const isMuted = ref(false);
|
|
2152
2868
|
const selfMuted = ref(false);
|
|
2153
2869
|
const isDismissed = ref(false);
|
|
@@ -2250,19 +2966,24 @@ const _sfc_main = {
|
|
|
2250
2966
|
selfMuted.value = (self == null ? void 0 : self.muteEndTime) && self.muteEndTime > Date.now();
|
|
2251
2967
|
};
|
|
2252
2968
|
const loadMessages = async () => {
|
|
2969
|
+
var _a, _b;
|
|
2253
2970
|
if (!imInstance) return;
|
|
2254
2971
|
const cvs = currentConversation.value;
|
|
2255
2972
|
const cvsID = (cvs == null ? void 0 : cvs.conversationID) || route.query.conversationID;
|
|
2256
2973
|
if (!cvsID) return;
|
|
2257
2974
|
try {
|
|
2258
|
-
const
|
|
2975
|
+
const res = await imInstance.getAdvancedHistoryMessageList({
|
|
2259
2976
|
conversationID: cvsID,
|
|
2260
2977
|
count: pageCount.value,
|
|
2261
2978
|
startClientMsgID: ""
|
|
2262
2979
|
});
|
|
2980
|
+
if (res == null ? void 0 : res.error) {
|
|
2981
|
+
console.warn("[IM] 会话历史消息拉取失败,保留当前展示:", cvsID, ((_a = res.error) == null ? void 0 : _a.errMsg) || ((_b = res.error) == null ? void 0 : _b.errCode));
|
|
2982
|
+
return;
|
|
2983
|
+
}
|
|
2263
2984
|
isLastMessage.value = true;
|
|
2264
2985
|
isFirstMessage.value = false;
|
|
2265
|
-
updateMessageList(list || [], "init");
|
|
2986
|
+
updateMessageList((res == null ? void 0 : res.list) || [], "init");
|
|
2266
2987
|
} catch (err) {
|
|
2267
2988
|
console.error("加载消息列表失败:", err);
|
|
2268
2989
|
}
|
|
@@ -2863,6 +3584,7 @@ const _sfc_main = {
|
|
|
2863
3584
|
(_a = msgListRef.value) == null ? void 0 : _a.closeMultiSelect();
|
|
2864
3585
|
};
|
|
2865
3586
|
const addExInfo = (msg = {}) => {
|
|
3587
|
+
var _a, _b;
|
|
2866
3588
|
const tenantID = chatMessage.getTenantID || "1";
|
|
2867
3589
|
const imFontStyle = localStorage.getItem("IM_FONT_STYLE") || "";
|
|
2868
3590
|
let msgStyle = null;
|
|
@@ -2872,7 +3594,22 @@ const _sfc_main = {
|
|
|
2872
3594
|
} catch (e) {
|
|
2873
3595
|
}
|
|
2874
3596
|
}
|
|
2875
|
-
|
|
3597
|
+
const burnSetting = getConversationBurnSetting(currentConversation.value, (_a = chatMessage.getUserInfo) == null ? void 0 : _a.userID);
|
|
3598
|
+
let exInfo = {};
|
|
3599
|
+
if (msg.ex) {
|
|
3600
|
+
try {
|
|
3601
|
+
exInfo = JSON.parse(msg.ex) || {};
|
|
3602
|
+
} catch {
|
|
3603
|
+
exInfo = {};
|
|
3604
|
+
}
|
|
3605
|
+
}
|
|
3606
|
+
if (burnSetting.enabled && burnSetting.duration > 0) {
|
|
3607
|
+
exInfo.burnBySender = true;
|
|
3608
|
+
exInfo.burnDuration = burnSetting.duration;
|
|
3609
|
+
exInfo.burnFromUserID = burnSetting.fromUserID;
|
|
3610
|
+
exInfo.burnToUserID = burnSetting.toUserID || ((_b = currentConversation.value) == null ? void 0 : _b.userID) || "";
|
|
3611
|
+
}
|
|
3612
|
+
msg.ex = JSON.stringify({ ...exInfo, tenantID, msgStyle });
|
|
2876
3613
|
};
|
|
2877
3614
|
const sendTextMessage = async (content) => {
|
|
2878
3615
|
if (!content || !imInstance) return;
|
|
@@ -2983,6 +3720,7 @@ const _sfc_main = {
|
|
|
2983
3720
|
}
|
|
2984
3721
|
};
|
|
2985
3722
|
const uploadMsgFile = async ({ type, info }) => {
|
|
3723
|
+
var _a, _b;
|
|
2986
3724
|
if (!imInstance) return;
|
|
2987
3725
|
const FILE_CREATORS = {
|
|
2988
3726
|
video: () => imInstance.createVideoMessageByURL({
|
|
@@ -3001,11 +3739,12 @@ const _sfc_main = {
|
|
|
3001
3739
|
snapShotType: "png"
|
|
3002
3740
|
}),
|
|
3003
3741
|
audio: () => imInstance.createSoundMessageByURL({
|
|
3004
|
-
|
|
3742
|
+
// 语音时长必须 ≥1 秒,否则气泡显示 0"
|
|
3743
|
+
duration: Math.max(1, Math.round(info.duration || 0)),
|
|
3005
3744
|
soundPath: info.path,
|
|
3006
3745
|
sourceUrl: info.path,
|
|
3007
3746
|
dataSize: info.size,
|
|
3008
|
-
soundType: info.type
|
|
3747
|
+
soundType: info.type || "wav"
|
|
3009
3748
|
}),
|
|
3010
3749
|
file: () => imInstance.createFileMessageByURL({
|
|
3011
3750
|
fileName: info.name,
|
|
@@ -3028,18 +3767,17 @@ const _sfc_main = {
|
|
|
3028
3767
|
const formData = new FormData();
|
|
3029
3768
|
formData.append("files", info.file);
|
|
3030
3769
|
const { data: res } = await uploadFiles(baseUrl.value, formData);
|
|
3031
|
-
|
|
3032
|
-
|
|
3033
|
-
|
|
3034
|
-
|
|
3035
|
-
|
|
3036
|
-
|
|
3037
|
-
|
|
3038
|
-
|
|
3039
|
-
|
|
3040
|
-
|
|
3041
|
-
|
|
3042
|
-
}
|
|
3770
|
+
const resFile = ((_b = (_a = res == null ? void 0 : res.data) == null ? void 0 : _a.successFiles) == null ? void 0 : _b[0]) || {};
|
|
3771
|
+
if ((res == null ? void 0 : res.code) !== 200 || !resFile.fileID) throw new Error((res == null ? void 0 : res.msg) || "upload failed");
|
|
3772
|
+
const path = `/api/v1/auth/reviewFile/${resFile.fileID}`;
|
|
3773
|
+
if (data.fileElem) {
|
|
3774
|
+
data.fileElem.sourceUrl = path;
|
|
3775
|
+
} else if (data.videoElem) {
|
|
3776
|
+
data.videoElem.videoPath = path;
|
|
3777
|
+
data.videoElem.videoUrl = path;
|
|
3778
|
+
} else if (data.soundElem) {
|
|
3779
|
+
data.soundElem.soundPath = path;
|
|
3780
|
+
data.soundElem.sourceUrl = path;
|
|
3043
3781
|
}
|
|
3044
3782
|
}
|
|
3045
3783
|
const result = await imInstance.sendMessageNotOss({
|
|
@@ -3062,6 +3800,68 @@ const _sfc_main = {
|
|
|
3062
3800
|
updatePendingMessage(cvs.conversationID, msgItem.clientMsgID, { status: 3 });
|
|
3063
3801
|
}
|
|
3064
3802
|
};
|
|
3803
|
+
const sendVoiceMessage = async ({ file, duration } = {}) => {
|
|
3804
|
+
var _a, _b;
|
|
3805
|
+
if (!imInstance || !file) return;
|
|
3806
|
+
const cvs = currentConversation.value;
|
|
3807
|
+
if (!(cvs == null ? void 0 : cvs.conversationID) && !(cvs == null ? void 0 : cvs.userID) && !(cvs == null ? void 0 : cvs.groupID)) return;
|
|
3808
|
+
const formData = new FormData();
|
|
3809
|
+
formData.append("files", file);
|
|
3810
|
+
let path = "";
|
|
3811
|
+
try {
|
|
3812
|
+
const { data: res } = await uploadFiles(baseUrl.value, formData);
|
|
3813
|
+
const resFile = ((_b = (_a = res == null ? void 0 : res.data) == null ? void 0 : _a.successFiles) == null ? void 0 : _b[0]) || {};
|
|
3814
|
+
if ((res == null ? void 0 : res.code) !== 200 || !resFile.fileID) throw new Error((res == null ? void 0 : res.msg) || "upload failed");
|
|
3815
|
+
path = `/api/v1/auth/reviewFile/${resFile.fileID}`;
|
|
3816
|
+
} catch (error) {
|
|
3817
|
+
console.error("[Voice] 语音上传失败:", error);
|
|
3818
|
+
showToast("语音上传失败,请重试");
|
|
3819
|
+
return;
|
|
3820
|
+
}
|
|
3821
|
+
const data = await imInstance.createSoundMessageByURL({
|
|
3822
|
+
duration: Math.max(1, Math.round(duration || 0)),
|
|
3823
|
+
soundPath: path,
|
|
3824
|
+
sourceUrl: path,
|
|
3825
|
+
dataSize: file.size,
|
|
3826
|
+
soundType: "wav"
|
|
3827
|
+
});
|
|
3828
|
+
if (!data) {
|
|
3829
|
+
showToast("语音发送失败");
|
|
3830
|
+
return;
|
|
3831
|
+
}
|
|
3832
|
+
addExInfo(data);
|
|
3833
|
+
const msgItem = {
|
|
3834
|
+
...data,
|
|
3835
|
+
sessionType: cvs.conversationType,
|
|
3836
|
+
recvID: cvs.conversationType === IM_CVS_TYPE.Single ? cvs.userID : "",
|
|
3837
|
+
groupID: cvs.conversationType === IM_CVS_TYPE.Group ? cvs.groupID : "",
|
|
3838
|
+
status: 1
|
|
3839
|
+
};
|
|
3840
|
+
if (!cvs.conversationID) await createConversation();
|
|
3841
|
+
updateMessageList([msgItem], "add");
|
|
3842
|
+
addPendingMessage(cvs.conversationID, msgItem);
|
|
3843
|
+
try {
|
|
3844
|
+
const result = await imInstance.sendMessageNotOss({
|
|
3845
|
+
recvID: cvs.conversationType === IM_CVS_TYPE.Single ? cvs.userID : "",
|
|
3846
|
+
groupID: cvs.conversationType === IM_CVS_TYPE.Group ? cvs.groupID : "",
|
|
3847
|
+
message: data
|
|
3848
|
+
});
|
|
3849
|
+
if (result) {
|
|
3850
|
+
updateMessageList([result], "update");
|
|
3851
|
+
removePendingMessage(cvs.conversationID, msgItem.clientMsgID);
|
|
3852
|
+
if (!cvs.isCustom) {
|
|
3853
|
+
updateConversationLatestMessage(cvs.conversationID, result, handleMessage(result));
|
|
3854
|
+
}
|
|
3855
|
+
} else {
|
|
3856
|
+
updateMessageList([{ ...msgItem, status: 3 }], "update");
|
|
3857
|
+
updatePendingMessage(cvs.conversationID, msgItem.clientMsgID, { status: 3 });
|
|
3858
|
+
}
|
|
3859
|
+
} catch (error) {
|
|
3860
|
+
console.error("[Voice] 语音发送失败:", error);
|
|
3861
|
+
updateMessageList([{ ...msgItem, status: 3 }], "update");
|
|
3862
|
+
updatePendingMessage(cvs.conversationID, msgItem.clientMsgID, { status: 3 });
|
|
3863
|
+
}
|
|
3864
|
+
};
|
|
3065
3865
|
const createConversation = async (msg) => {
|
|
3066
3866
|
const cvs = currentConversation.value;
|
|
3067
3867
|
const sourceID = cvs.conversationType === IM_CVS_TYPE.Single ? cvs.userID : cvs.groupID;
|
|
@@ -3076,7 +3876,9 @@ const _sfc_main = {
|
|
|
3076
3876
|
}
|
|
3077
3877
|
currentConversation.value = info;
|
|
3078
3878
|
if (info.ex) {
|
|
3079
|
-
|
|
3879
|
+
const clearedEx = preserveBurnInEx("", info.ex);
|
|
3880
|
+
await (imInstance == null ? void 0 : imInstance.setConversation({ conversationID: info.conversationID, ex: clearedEx }));
|
|
3881
|
+
info.ex = clearedEx;
|
|
3080
3882
|
}
|
|
3081
3883
|
handleConversationList([info], "add", handleMessage);
|
|
3082
3884
|
}
|
|
@@ -3143,6 +3945,13 @@ const _sfc_main = {
|
|
|
3143
3945
|
duration: 0,
|
|
3144
3946
|
file
|
|
3145
3947
|
};
|
|
3948
|
+
if (msgType === "audio" || msgType === "video") {
|
|
3949
|
+
try {
|
|
3950
|
+
info.duration = Math.max(1, Math.round(await getMediaDuration(file)));
|
|
3951
|
+
} catch {
|
|
3952
|
+
info.duration = 1;
|
|
3953
|
+
}
|
|
3954
|
+
}
|
|
3146
3955
|
await uploadMsgFile({ type: msgType, info });
|
|
3147
3956
|
}
|
|
3148
3957
|
}
|
|
@@ -3351,7 +4160,8 @@ const _sfc_main = {
|
|
|
3351
4160
|
"im-instance": unref(imInstance),
|
|
3352
4161
|
onApplied: onGroupJoinApplied
|
|
3353
4162
|
}, null, 8, ["im-instance"]),
|
|
3354
|
-
|
|
4163
|
+
!isNoticeAgentChat.value ? (openBlock(), createBlock(ChatInputH5, {
|
|
4164
|
+
key: 1,
|
|
3355
4165
|
ref_key: "msgInputRef",
|
|
3356
4166
|
ref: msgInputRef,
|
|
3357
4167
|
"chat-info": unref(currentConversation),
|
|
@@ -3365,17 +4175,18 @@ const _sfc_main = {
|
|
|
3365
4175
|
"is-multi-select": isMultiSelect.value,
|
|
3366
4176
|
onSendMessage: onSendTextMessage,
|
|
3367
4177
|
onSendFile,
|
|
4178
|
+
onSendSound: sendVoiceMessage,
|
|
3368
4179
|
onClearReply,
|
|
3369
4180
|
onMergeForward,
|
|
3370
4181
|
onDeleteSelected,
|
|
3371
4182
|
onCancelSelect,
|
|
3372
4183
|
onTriggerCall
|
|
3373
|
-
}, null, 8, ["chat-info", "msg-item", "members", "group-info", "is-muted", "self-muted", "is-dismissed", "is-not-in-group", "is-multi-select"])
|
|
4184
|
+
}, null, 8, ["chat-info", "msg-item", "members", "group-info", "is-muted", "self-muted", "is-dismissed", "is-not-in-group", "is-multi-select"])) : createCommentVNode("", true)
|
|
3374
4185
|
], 2);
|
|
3375
4186
|
};
|
|
3376
4187
|
}
|
|
3377
4188
|
};
|
|
3378
|
-
const ChatPageH5 = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-
|
|
4189
|
+
const ChatPageH5 = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-cb2e4389"]]);
|
|
3379
4190
|
export {
|
|
3380
4191
|
ChatPageH5 as default
|
|
3381
4192
|
};
|