@tencentcloud/chat-cs-uniapp
Version:
TCCC uniapp UIKit
314 lines (299 loc) • 9.61 kB
text/typescript
import { formatTime } from "./date.ts";
import { decodeText } from "./decodeText";
import { bigEmojiList } from "./emojiMap";
// 处理头像
export function handleAvatar(item: any) {
let avatar = "";
if (item.type === uni.$TIM.TYPES.CONV_C2C) {
avatar =
item?.userProfile?.avatar ||
"https://web.sdk.qcloud.com/component/TUIKit/assets/avatar_21.png";
} else {
avatar =
item?.groupProfile?.avatar ||
"https://web.sdk.qcloud.com/component/TUIKit/assets/group_avatar.png";
}
return avatar;
}
// 处理昵称
export function handleName(item: any) {
let name = "";
switch (item.type) {
case uni.$TIM.TYPES.CONV_C2C:
name = item?.userProfile.nick || item?.userProfile?.userID || "";
break;
case uni.$TIM.TYPES.CONV_GROUP:
name = item.groupProfile.name || item?.groupProfile?.groupID || "";
break;
case uni.$TIM.TYPES.CONV_SYSTEM:
name = "系统通知";
break;
}
return name;
}
// 处理系统提示消息展示
export function handleTipMessageShowContext(message: any) {
const options: any = {
message,
text: "",
};
const userName = message.nick || message.payload.userIDList.join(",");
switch (message.payload.operationType) {
case uni.$TIM.TYPES.GRP_TIP_MBR_JOIN:
options.text = `群成员:${userName} 加入群组`;
break;
case uni.$TIM.TYPES.GRP_TIP_MBR_QUIT:
options.text = `群成员:${userName} 退出群组`;
break;
case uni.$TIM.TYPES.GRP_TIP_MBR_KICKED_OUT:
options.text = `群成员:${userName} 被 ${message.payload.operatorID} 踢出群组`;
break;
case uni.$TIM.TYPES.GRP_TIP_MBR_SET_ADMIN:
options.text = `群成员:${userName} 成为管理员`;
break;
case uni.$TIM.TYPES.GRP_TIP_MBR_CANCELED_ADMIN:
options.text = `群成员:${userName} 被撤销管理员`;
break;
case uni.$TIM.TYPES.GRP_TIP_GRP_PROFILE_UPDATED:
// options.text = `${userName} 修改群组资料`;
options.text = handleTipGrpUpdated(message);
break;
case uni.$TIM.TYPES.GRP_TIP_MBR_PROFILE_UPDATED:
for (const member of message.payload.memberList) {
if (member.muteTime > 0) {
// options.text = `群成员:${member.userID}被禁言${member.muteTime}秒`;
options.text = `群成员:${member.userID} 被禁言`;
} else {
options.text = `群成员:${member.userID} 被取消禁言`;
}
}
break;
default:
options.text = `[群提示消息]`;
break;
}
return options;
}
function handleTipGrpUpdated(message: any) {
const { payload } = message;
const { newGroupProfile } = payload;
const { operatorID } = payload;
let text = "";
const name = Object.keys(newGroupProfile)[0];
switch (name) {
case "ownerID":
text = `${newGroupProfile[name]} 成为新的群主`;
break;
case "groupName":
text = `${operatorID} 修改群名为 ${newGroupProfile[name]}`;
break;
case "notification":
text = `${operatorID} 发布新公告`;
break;
default:
break;
}
return text;
}
// 解析处理文本消息展示
export function handleTextMessageShowContext(item: any) {
const options: any = {
text: decodeText(item.payload),
};
return options;
}
// 解析处理表情消息展示
export function handleFaceMessageShowContext(item: any) {
const face: any = {
message: item,
name: "",
url: "",
};
const currentEmojiList = bigEmojiList.filter(
(emoItem: any) => emoItem.icon === item.payload.data
);
if (currentEmojiList.length > 0) {
face.name = currentEmojiList[0].list[item.payload.index];
}
// 与native 互通兼容
if (item.payload.data.indexOf("@2x") > 0) {
face.name = item.payload.data;
} else {
face.name = `${item.payload.data}@2x`;
}
face.url = `https://web.sdk.qcloud.com/im/assets/face-elem/${face.name}.png`;
return face;
}
// 解析处理位置消息展示
export function handleLocationMessageShowContext(item: any) {
const location: any = {
lon: "",
lat: "",
href: "",
url: "",
description: "",
message: item,
};
location.lon = item.payload.longitude.toFixed(6);
location.lat = item.payload.latitude.toFixed(6);
location.href =
"https://map.qq.com/?type=marker&isopeninfowin=1&markertype=1&" +
`pointx=${location.lon}&pointy=${location.lat}&name=${item.payload.description}`;
location.url =
"https://apis.map.qq.com/ws/staticmap/v2/?" +
`center=${location.lat},${location.lon}&zoom=10&size=300*150&maptype=roadmap&` +
`markers=size:large|color:0xFFCCFF|label:k|${location.lat},${location.lon}&` +
"key=UBNBZ-PTP3P-TE7DB-LHRTI-Y4YLE-VWBBD";
location.description = item.payload.description;
return location;
}
// 解析处理图片消息展示
export function handleImageMessageShowContext(item: any) {
return {
progress: item?.status === "unSend" && item.progress,
info: item.payload.imageInfoArray,
message: item,
};
}
// 解析处理视频消息展示
export function handleVideoMessageShowContext(item: any) {
return {
progress: item?.status === "unSend" && item?.progress,
url: item?.payload?.videoUrl,
snapshotUrl: item?.payload?.snapshotUrl,
message: item,
};
}
// 解析处理语音消息展示
export function handleAudioMessageShowContext(item: any) {
return {
progress: item?.status === "unSend" && item.progress,
url: item.payload.url,
message: item,
second: item.payload.second,
};
}
// 解析处理文件消息展示
export function handleFileMessageShowContext(item: any) {
let size = "";
if (item.payload.fileSize >= 1024 * 1024) {
size = `${(item.payload.fileSize / (1024 * 1024)).toFixed(2)} Mb`;
} else if (item.payload.fileSize >= 1024) {
size = `${(item.payload.fileSize / 1024).toFixed(2)} Kb`;
} else {
size = `${item.payload.fileSize.toFixed(2)}B`;
}
return {
progress: item?.status === "unSend" && item.progress,
url: item.payload.fileUrl,
message: item,
name: item.payload.fileName,
size,
};
}
// 解析处理合并消息展示
export function handleMergerMessageShowContext(item: any) {
return { message: item, ...item.payload };
}
// 解析音视频通话消息
export function extractCallingInfoFromMessage(message: any) {
let callingmessage: any = {};
let objectData: any = {};
try {
callingmessage = JSON.parse(message.payload.data);
} catch (error) {
callingmessage = {};
}
if (callingmessage.businessID !== 1) {
return "";
}
try {
objectData = JSON.parse(callingmessage.data);
} catch (error) {
objectData = {};
}
switch (callingmessage.actionType) {
case 1: {
if (objectData.call_end >= 0 && !callingmessage.groupID) {
return `通话时长 :${formatTime(objectData.call_end)}`;
}
if (callingmessage.groupID) {
return `结束群聊`;
}
if (objectData.data && objectData.data.cmd === "switchToAudio") {
return `切换语音通话`;
}
if (objectData.data && objectData.data.cmd === "switchToVideo") {
return `切换视频通话`;
}
return `发起通话`;
}
case 2:
return `取消通话`;
case 3:
if (objectData.data && objectData.data.cmd === "switchToAudio") {
return `切换语音通话`;
}
if (objectData.data && objectData.data.cmd === "switchToVideo") {
return `切换视频通话`;
}
return `已接听`;
case 4:
return `拒绝通话`;
case 5:
if (objectData.data && objectData.data.cmd === "switchToAudio") {
return `切换语音通话`;
}
if (objectData.data && objectData.data.cmd === "switchToVideo") {
return `切换视频通话`;
}
return `无应答`;
default:
return "";
}
}
// 解析处理自定义消息展示
export function handleCustomMessageShowContext(item: any) {
return {
message: item,
custom:
extractCallingInfoFromMessage(item) ||
item?.payload?.extension ||
`[自定义消息]`,
};
}
// 解析处理系统消息
export function translateGroupSystemNotice(message: any) {
const groupName =
message.payload.groupProfile?.name || message.payload.groupProfile?.groupID;
switch (message.payload.operationType) {
case 1:
return `${message.payload.operatorID} 申请加入群组:${groupName}`;
case 2:
return `成功加入群组:${groupName}`;
case 3:
return `申请加入群组:${groupName} 被拒绝`;
case 4:
return `你被管理员 ${message.payload.operatorID} 踢出群组:${groupName}`;
case 5:
return `群:${groupName} 被 ${message.payload.operatorID} 解散`;
case 6:
return `${message.payload.operatorID} 创建群:${groupName}`;
case 7:
return `${message.payload.operatorID} 邀请你加群:${groupName}`;
case 8:
return `你退出群组:${groupName}`;
case 9:
return `你被${message.payload.operatorID} 设置为群:${groupName} 的管理员`;
case 10:
return `你被 ${message.payload.operatorID} 撤销群:${groupName} 的管理员身份`;
case 12:
return `${message.payload.operatorID} 邀请你加群:${groupName}`;
case 13:
return `${message.payload.operatorID} 同意加群 :${groupName}`;
case 14:
return `${message.payload.operatorID} 拒接加群 :${groupName}`;
case 255:
return `自定义群系统通知: ${message.payload.userDefinedField}`;
}
}