157 lines
6.2 KiB
TypeScript
157 lines
6.2 KiB
TypeScript
/** IM 消息类型枚举(对齐后端 ImMessageTypeEnum) */
|
||
export const ImMessageType = {
|
||
TEXT: 0, // 文本
|
||
IMAGE: 1, // 图片
|
||
FILE: 2, // 文件
|
||
VOICE: 3, // 语音
|
||
VIDEO: 4, // 视频
|
||
RECALL: 10, // 撤回
|
||
READ: 11, // 已读
|
||
RECEIPT: 12, // 回执
|
||
TIP_TEXT: 21, // 提示文本(撤回提示等)
|
||
// ========== 好友通知(1201-1210 直接复用 OpenIM 段位编号) ==========
|
||
FRIEND_REQUEST_APPROVED: 1201, // 好友申请被同意
|
||
FRIEND_REQUEST_REJECTED: 1202, // 好友申请被拒绝
|
||
FRIEND_APPLICATION: 1203, // 收到新的好友申请
|
||
FRIEND_ADD: 1204, // 新增好友(双方建立关系)
|
||
FRIEND_DELETE: 1205, // 好友被删除
|
||
// 1206 对应 OpenIM FriendRemarkSetNotification;本系统并入 FRIEND_UPDATE(1210) 统一推送,单一字段变更不再独立通道
|
||
FRIEND_BLOCK: 1207, // 加入黑名单
|
||
FRIEND_UNBLOCK: 1208, // 移出黑名单
|
||
FRIEND_INFO_UPDATED: 1209, // 好友资料变更(昵称 / 头像)
|
||
FRIEND_UPDATE: 1210, // 好友信息批量更新(muted / pinned)
|
||
// ========== 群事件(1501-1520 直接复用 OpenIM 段位编号;1530+ 自有扩展段) ==========
|
||
GROUP_CREATE: 1501, // 群创建
|
||
GROUP_INFO_UPDATE: 1502, // 群信息变更(NAME / NOTICE 之外字段兜底)
|
||
// 1503 GROUP_JOIN_APPLICATION TODO 未实现:入群申请
|
||
GROUP_MEMBER_QUIT: 1504, // 成员退群
|
||
// 1505 GROUP_APPLICATION_ACCEPTED TODO 未实现:入群申请通过
|
||
// 1506 GROUP_APPLICATION_REJECTED TODO 未实现:入群申请拒绝
|
||
GROUP_OWNER_TRANSFER: 1507, // 群主转让
|
||
GROUP_MEMBER_KICK: 1508, // 成员被移出
|
||
GROUP_MEMBER_INVITE: 1509, // 成员加入
|
||
// 1510 GROUP_MEMBER_ENTER TODO 未实现:自由进群
|
||
GROUP_DISSOLVE: 1511, // 群解散
|
||
// 1512 GROUP_MEMBER_MUTED TODO 未实现:单成员禁言
|
||
// 1513 GROUP_MEMBER_CANCEL_MUTED TODO 未实现:单成员取消禁言
|
||
// 1514 GROUP_MUTED TODO 未实现:全群禁言
|
||
// 1515 GROUP_CANCEL_MUTED TODO 未实现:全群取消禁言
|
||
GROUP_MEMBER_NICKNAME_UPDATE: 1516, // 成员昵称变更(窄化到 displayUserName)
|
||
GROUP_ADMIN_ADD: 1517, // 添加管理员
|
||
GROUP_ADMIN_REMOVE: 1518, // 撤销管理员
|
||
GROUP_NOTICE_UPDATE: 1519, // 群公告变更
|
||
GROUP_NAME_UPDATE: 1520, // 群名变更
|
||
// ========== 自有扩展段(1530+,OpenIM 1500-1520 段位无对应物) ==========
|
||
GROUP_MEMBER_SETTING_UPDATE: 1530, // 群成员个人设置变更:muted / groupRemark 个人多端同步
|
||
GROUP_MESSAGE_PIN: 1531, // 群消息置顶(自有扩展,OpenIM 无)
|
||
GROUP_MESSAGE_UNPIN: 1532 // 群消息取消置顶(自有扩展,OpenIM 无)
|
||
} as const
|
||
|
||
/** 判断是否「群广播事件」:[GROUP_CREATE, GROUP_MESSAGE_UNPIN] 段位都算,仅 GROUP_MEMBER_SETTING_UPDATE 是个人信号排除 */
|
||
export function isGroupNotification(type: number): boolean {
|
||
return (
|
||
type >= ImMessageType.GROUP_CREATE
|
||
&& type <= ImMessageType.GROUP_MESSAGE_UNPIN
|
||
&& type !== ImMessageType.GROUP_MEMBER_SETTING_UPDATE
|
||
)
|
||
}
|
||
|
||
/** 判断是否「好友通知事件」:1201-1210 段位 */
|
||
export function isFriendNotification(type: number): boolean {
|
||
return type >= ImMessageType.FRIEND_REQUEST_APPROVED && type <= ImMessageType.FRIEND_UPDATE
|
||
}
|
||
|
||
/** IM 普通消息类型集合(聊天气泡中显示,并作为会话最后一条摘要) */
|
||
const ImMessageTypeNormals: number[] = [
|
||
ImMessageType.TEXT,
|
||
ImMessageType.IMAGE,
|
||
ImMessageType.FILE,
|
||
ImMessageType.VOICE,
|
||
ImMessageType.VIDEO
|
||
]
|
||
|
||
/** 判断是否"普通消息" */
|
||
export function isNormalMessage(type: number): boolean {
|
||
return ImMessageTypeNormals.includes(type)
|
||
}
|
||
|
||
/**
|
||
* IM 消息状态枚举(对齐后端 ImMessageStatusEnum,前端扩展 SENDING + FAILED)
|
||
*
|
||
* 生命周期:FAILED(-2) → SENDING(-1) → UNREAD(0) → READ(3) / RECALL(2)
|
||
*/
|
||
export const ImMessageStatus = {
|
||
FAILED: -2, // 发送失败(前端独有)
|
||
SENDING: -1, // 发送中(前端独有)
|
||
UNREAD: 0, // 未读
|
||
RECALL: 2, // 已撤回
|
||
READ: 3 // 已读
|
||
} as const
|
||
|
||
/** IM 会话类型枚举 */
|
||
export const ImConversationType = {
|
||
PRIVATE: 1, // 私聊
|
||
GROUP: 2 // 群聊
|
||
} as const
|
||
|
||
/** IM WebSocket 外层帧类型(对齐后端 ImPrivateMessageDTO.TYPE / ImGroupMessageDTO.TYPE) */
|
||
export const ImWebSocketMessageType = {
|
||
PRIVATE_MESSAGE: 'im-private-message', // 私聊通道
|
||
GROUP_MESSAGE: 'im-group-message' // 群聊通道
|
||
} as const
|
||
|
||
/** IM 群回执状态枚举(对齐后端 ImGroupMessageReceiptStatusEnum) */
|
||
export const ImGroupReceiptStatus = {
|
||
NO_RECEIPT: 0, // 不需要回执
|
||
PENDING: 1, // 待完成
|
||
DONE: 2 // 已完成
|
||
} as const
|
||
|
||
/** 群成员角色(对齐后端 ImGroupMemberRoleEnum) */
|
||
export const ImGroupMemberRole = {
|
||
OWNER: 1, // 群主
|
||
ADMIN: 2, // 管理员
|
||
NORMAL: 3 // 普通成员
|
||
} as const
|
||
|
||
/** 好友添加来源(对齐后端 ImFriendAddSourceEnum) */
|
||
export const ImFriendAddSource = {
|
||
SEARCH: 1, // 搜索
|
||
GROUP: 2, // 群聊
|
||
QR_CODE: 3, // 扫码
|
||
CARD: 4 // 名片
|
||
} as const
|
||
|
||
/** 好友申请处理结果(对齐后端 ImFriendRequestHandleResultEnum) */
|
||
export const ImFriendRequestHandleResult = {
|
||
UNHANDLED: 0, // 未处理
|
||
AGREED: 1, // 同意
|
||
REFUSED: 2 // 拒绝
|
||
} as const
|
||
|
||
/** 群管理员人数上限(对齐后端 GROUP_ADMIN_MAX_COUNT) */
|
||
export const GROUP_ADMIN_MAX_COUNT = 3
|
||
|
||
/** 群置顶消息条数上限(对齐后端 GROUP_PIN_MAX_COUNT) */
|
||
export const GROUP_PIN_MAX_COUNT = 5
|
||
|
||
/** 每次拉取私聊消息的最大条数(后端上限 1000,前端取保守值 100) */
|
||
export const PRIVATE_MESSAGE_PULL_SIZE = 100
|
||
|
||
/** 每次拉取群聊消息的最大条数(后端上限 1000,前端取保守值 100) */
|
||
export const GROUP_MESSAGE_PULL_SIZE = 100
|
||
|
||
/** 消息之间渲染「时间分隔条」的阈值:10 分钟 */
|
||
export const TIME_TIP_GAP_MS = 10 * 60 * 1000
|
||
|
||
/**
|
||
* @全体成员 的特殊 userId 标识:atUserIds 中包含 -1 表示 @ 全体成员
|
||
*
|
||
* 与后端约定:群消息 atUserIds 数组里出现 -1 时,所有成员都收到提醒
|
||
* MentionPicker 渲染虚拟项 + conversationStore.applyAt 判定 atAll 都靠这个值
|
||
*/
|
||
export const IM_AT_ALL_USER_ID = -1
|
||
|
||
/** @全体成员 的展示名(对齐微信 PC) */
|
||
export const IM_AT_ALL_NICKNAME = '所有人'
|