群聊
This commit is contained in:
138
src/utils/messageTypes.ts
Normal file
138
src/utils/messageTypes.ts
Normal file
@@ -0,0 +1,138 @@
|
||||
/**
|
||||
* 消息类型映射工具
|
||||
* 统一管理消息类型的显示文案、图标和摘要生成逻辑
|
||||
*/
|
||||
|
||||
import type { ChatMessage } from '@/types/api'
|
||||
import { MessageType } from '@/types/message'
|
||||
|
||||
export interface MessageTypeConfig {
|
||||
label: string
|
||||
icon: string
|
||||
summaryFn: (msg: ChatMessage) => string
|
||||
}
|
||||
|
||||
/**
|
||||
* 消息类型配置映射表
|
||||
*/
|
||||
export const messageTypeConfigs: Record<number, MessageTypeConfig> = {
|
||||
[MessageType.TEXT]: {
|
||||
label: '文本消息',
|
||||
icon: 'fas fa-comment',
|
||||
summaryFn: (msg) => msg.content || ''
|
||||
},
|
||||
[MessageType.IMAGE]: {
|
||||
label: '图片',
|
||||
icon: 'fas fa-image',
|
||||
summaryFn: () => '[图片]'
|
||||
},
|
||||
[MessageType.AUDIO]: {
|
||||
label: '语音',
|
||||
icon: 'fas fa-microphone',
|
||||
summaryFn: () => '[语音]'
|
||||
},
|
||||
[MessageType.VIDEO]: {
|
||||
label: '视频',
|
||||
icon: 'fas fa-video',
|
||||
summaryFn: () => '[视频]'
|
||||
},
|
||||
[MessageType.SYSTEM]: {
|
||||
label: '系统消息',
|
||||
icon: 'fas fa-info-circle',
|
||||
summaryFn: (msg) => {
|
||||
const extra = typeof msg.extra === 'string' ? JSON.parse(msg.extra || '{}') : (msg.extra || {})
|
||||
return extra.title || msg.content || '[系统消息]'
|
||||
}
|
||||
},
|
||||
[MessageType.FRIEND_NOTIFY]: {
|
||||
label: '好友通知',
|
||||
icon: 'fas fa-user-plus',
|
||||
summaryFn: (msg) => {
|
||||
const extra = typeof msg.extra === 'string' ? JSON.parse(msg.extra || '{}') : (msg.extra || {})
|
||||
return extra.title || msg.content || '[好友通知]'
|
||||
}
|
||||
},
|
||||
[MessageType.SIGNAL]: {
|
||||
label: '通话',
|
||||
icon: 'fas fa-phone',
|
||||
summaryFn: () => '[通话]'
|
||||
},
|
||||
[MessageType.GROUP_NOTIFY]: {
|
||||
label: '群通知',
|
||||
icon: 'fas fa-users',
|
||||
summaryFn: (msg) => {
|
||||
const extra = typeof msg.extra === 'string' ? JSON.parse(msg.extra || '{}') : (msg.extra || {})
|
||||
// 根据事件类型生成更具体的文案
|
||||
if (extra.event === 'member_join') {
|
||||
return `用户加入了群聊`
|
||||
} else if (extra.event === 'member_leave') {
|
||||
return `用户退出了群聊`
|
||||
} else if (extra.event === 'member_remove') {
|
||||
return `用户被移出群聊`
|
||||
} else if (extra.event === 'group_update') {
|
||||
return `群信息已更新`
|
||||
} else if (extra.event === 'role_change') {
|
||||
return `成员角色已变更`
|
||||
}
|
||||
return extra.title || msg.content || '[群通知]'
|
||||
}
|
||||
},
|
||||
[MessageType.FILE]: {
|
||||
label: '文件',
|
||||
icon: 'fas fa-file',
|
||||
summaryFn: (msg) => {
|
||||
const extra = typeof msg.extra === 'string' ? JSON.parse(msg.extra || '{}') : (msg.extra || {})
|
||||
return extra.name ? `[文件] ${extra.name}` : '[文件]'
|
||||
}
|
||||
},
|
||||
[MessageType.MOMENTS_NOTIFY]: {
|
||||
label: '朋友圈通知',
|
||||
icon: 'fas fa-heart',
|
||||
summaryFn: (msg) => {
|
||||
const extra = typeof msg.extra === 'string' ? JSON.parse(msg.extra || '{}') : (msg.extra || {})
|
||||
return extra.title || msg.content || '[朋友圈通知]'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取消息摘要
|
||||
*/
|
||||
export function getMessageSummary(msg: ChatMessage): string {
|
||||
const config = messageTypeConfigs[msg.message_type]
|
||||
if (config) {
|
||||
return config.summaryFn(msg)
|
||||
}
|
||||
return msg.content || '[未知消息]'
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取消息类型标签
|
||||
*/
|
||||
export function getMessageTypeLabel(messageType: number): string {
|
||||
return messageTypeConfigs[messageType]?.label || '未知消息'
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取消息类型图标
|
||||
*/
|
||||
export function getMessageTypeIcon(messageType: number): string {
|
||||
return messageTypeConfigs[messageType]?.icon || 'fas fa-question-circle'
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断是否为系统/通知类消息(需要特殊样式)
|
||||
*/
|
||||
export function isSystemOrNotifyMessage(messageType: number): boolean {
|
||||
return [
|
||||
MessageType.SYSTEM,
|
||||
MessageType.FRIEND_NOTIFY,
|
||||
MessageType.GROUP_NOTIFY,
|
||||
MessageType.MOMENTS_NOTIFY
|
||||
].includes(messageType)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user