Files
TIMSDK/MiniProgram/TUIKit/miniprogram/components/base/message-facade.js
T
chenximo 87e0eec7e4 TUIKit 1.0 (#1040)
Co-authored-by: chenximo <chenximo@tencent.com>
2021-09-13 01:06:25 +08:00

193 lines
5.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { emojiMap, emojiUrl } from './emojiMap'
/** 传入message.element(群系统消息SystemMessage,群提示消息GroupTip除外)
* content = {
* type: 'TIMTextElem',
* content: {
* text: 'AAA[龇牙]AAA[龇牙]AAA[龇牙AAA]'
* }
*}
**/
// 群提示消息的含义 (opType)
const GROUP_TIP_TYPE = {
MEMBER_JOIN: 1,
MEMBER_QUIT: 2,
MEMBER_KICKED_OUT: 3,
MEMBER_SET_ADMIN: 4, // 被设置为管理员
MEMBER_CANCELED_ADMIN: 5, // 被取消管理员
GROUP_INFO_MODIFIED: 6, // 修改群资料,转让群组为该类型,msgBody.msgGroupNewInfo.ownerAccount表示新群主的ID
MEMBER_INFO_MODIFIED: 7, // 修改群成员信息
}
// 解析小程序text, 表情信息也是[嘻嘻]文本
export function parseText(message) {
const renderDom = []
let temp = message.payload.text
let left = -1
let right = -1
while (temp !== '') {
left = temp.indexOf('[')
right = temp.indexOf(']')
switch (left) {
case 0:
if (right === -1) {
renderDom.push({
name: 'span',
text: temp,
})
temp = ''
} else {
const _emoji = temp.slice(0, right + 1)
if (emojiMap[_emoji]) {
renderDom.push({
name: 'img',
src: emojiUrl + emojiMap[_emoji],
})
temp = temp.substring(right + 1)
} else {
renderDom.push({
name: 'span',
text: '[',
})
temp = temp.slice(1)
}
}
break
case -1:
renderDom.push({
name: 'span',
text: temp,
})
temp = ''
break
default:
renderDom.push({
name: 'span',
text: temp.slice(0, left),
})
temp = temp.substring(left)
break
}
}
return renderDom
}
// 解析群系统消息
export function parseGroupSystemNotice(message) {
const { payload } = message
const groupName = payload.groupProfile.name || payload.groupProfile.groupID
const { groupID } = payload.groupProfile
let text
switch (payload.operationType) {
case 1:
text = `${payload.operatorID} 申请加入群组:${groupName}(群ID:${groupID})`
break
case 2:
text = `成功加入群组:${groupName} (群ID:${groupID})`
break
case 3:
text = `申请加入群组:${groupName} (群ID:${groupID})被拒绝`
break
case 4:
text = `被管理员${payload.operatorID}踢出群组:${groupName}(群ID:${groupID})`
break
case 5:
text = `群:${groupName} (群ID:${groupID})已被${payload.operatorID}解散`
break
case 6:
text = `我(用户ID:${payload.operatorID})成功创建群聊:${groupName}(群ID:${groupID})`
break
case 7:
text = `用户ID:${payload.operatorID}邀请你加群:${groupName}(群ID:${groupID})`
break
case 8:
text = `你退出群组:${groupName}(群ID:${groupID})`
break
case 9:
text = `你被${payload.operatorID}设置为群:${groupName}(群ID:${groupID})的管理员`
break
case 10:
text = `你被${payload.operatorID}撤销群:${groupName} (群ID:${groupID})的管理员身份`
break
case 255:
text = `自定义群系统通知: ${payload.userDefinedField}`
break
}
return text
}
// 解析群提示消息
export function parseGroupTip(message) {
const { payload } = message
const userName = message.nick || payload.userIDList.join(',')
let tip
let user
switch (payload.operationType) {
case GROUP_TIP_TYPE.MEMBER_JOIN:
tip = `${userName} 加入群聊`
break
case GROUP_TIP_TYPE.MEMBER_QUIT:
tip = `群成员退群:${userName}`
break
case GROUP_TIP_TYPE.MEMBER_KICKED_OUT:
tip = `群成员被踢:${userName}`
break
case GROUP_TIP_TYPE.MEMBER_SET_ADMIN:
tip = `${payload.operatorID}将 ${userName}设置为管理员`
break
case GROUP_TIP_TYPE.MEMBER_CANCELED_ADMIN:
tip = `${payload.operatorID}将 ${userName}取消作为管理员`
break
case GROUP_TIP_TYPE.GROUP_INFO_MODIFIED:
tip = '群资料修改'
break
case GROUP_TIP_TYPE.MEMBER_INFO_MODIFIED:
for (const member of payload.memberList) {
if (member.muteTime > 0) {
tip = `群成员:${member.userID}被禁言${member.muteTime}秒`
} else {
tip = `群成员:${member.userID}被取消禁言`
}
}
break
case 256:
user = message.nick || message.from
if (payload.text === '无应答') {
user = payload.userIDList.join(',')
}
tip = payload.text === '结束群聊' ? '结束群聊' : `"${user}" ${payload.text}`
break
}
return [{
name: 'groupTip',
text: tip,
}]
}
// 解析图片消息
export function parseImage(message) {
const renderDom = [{
name: 'image',
// 这里默认渲染的是 1080P 的图片
src: message.payload.imageInfoArray[0].url,
}]
return renderDom
}
// 解析视频消息
export function parseVideo(message) {
const renderDom = [{
name: 'video',
src: message.payload.videoUrl,
}]
return renderDom
}
// 解析语音消息
export function parseAudio(message) {
const renderDom = [{
name: 'audio',
src: message.payload.url,
second: message.payload.second === 0 ? 1 : message.payload.second,
}]
return renderDom
}