This commit is contained in:
2025-12-05 13:13:12 +08:00
parent 8010d1d8a5
commit c259092b5a
18 changed files with 2800 additions and 124 deletions

138
src/utils/messageTypes.ts Normal file
View 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)
}