ConversationListView | 会话列表 | 排序:置顶优先,其余按 updatedAt 倒序;未读角标:unreadCount>0 显示;>99 显示 99+;mention count 独立角标;免打扰(notificationLevel=2)显示静音图标且不显示红点(保留数字可选);空闲(无会话)显示空态;加载中显示骨架;点击会话触发 select,宿主负责跳转 ChatView | IMLib.getConversationList / CONVERSATION 事件增量更新 |
ChatView | 会话详情(消息流 + 输入区) | 倒序渲染(最新在底部);新消息到达自动滚底(用户上翻时给出“有新消息”提示);按 messageId 去重;本地先显示 pending 气泡,ack 后替换为服务端消息;时间分隔:同一会话间隔 >5 分钟显示时间条;撤回消息渲染为占位文案“消息已撤回”,不显示原文;引用消息渲染引用块;@提及在文本中高亮;已读回执:发送者可见已读人数/状态(群聊按 readCounts/totalMembers);翻页加载历史,beforeSeq 游标,hasMore=false 时显示“没有更多”;向每个消息气泡透传 message.reactions / message.expansion,并转发 onReactionClick / onReactionLongPress(setMessages / appendMessages / 宿主变更消息后始终取最新值) | — |
MessageBubble | 消息气泡(按内容类型渲染) | 回应 chip 按 reactionTime 升序排列(同值保持输入顺序);hasCurrentUserReacted=true 的 chip 高亮为 active 态(主题色描边 + aria-pressed=true);chip 计数 >99 显示 99+;计数<=0 或 reactionId 空的 chip 不渲染;消息扩展徽标按 key:value 渲染,最多 3 对,超出部分显示 +N(N=未展示对数);气泡长按(pointerdown >=500ms)或右键触发 reaction_longpress(message) / onReactionLongPress,由宿主打开回应选择器;streaming=true 时 content.type=stream 渲染增量文本 + 生成中光标;complete 后收敛为普通文本气泡(streaming:false 可关闭) | — |
MessageInput | 输入区 | 输入时 500ms 防抖触发 typing(true),3s 无输入触发 typing(false);被禁言(muted=true)禁用发送并提示;仍可查看;草稿自动保存(IMLib.saveTextMessageDraft),发送成功后清空;群聊支持 @ 选择器(全员/指定成员),生成 mentionedInfo | — |
Avatar | 头像 | url 缺失或加载失败时显示姓名首字/末字,背景色由 userId 哈希稳定生成 | — |
UnreadBadge | 未读/提及角标 | 0 隐藏;>99 显示 99+;muted 用灰点;提及用 @ 角标 | — |
TimeSeparator | 时间分隔/格式化 | 当天 HH:mm;昨天“昨天 HH:mm”;7 天内“周X HH:mm”;更早 YYYY-MM-DD HH:mm | — |
MessageStatusIndicator | 发送状态 | sending 转圈;failed 显示重发;单聊显示已读/未读;群聊显示 n/m | — |
Theme | 主题令牌 | 默认跟随系统;宿主可覆盖令牌;暗色对比度满足可读性 | — |
IMKitFacade | 组件门面/挂载入口 | mount/update/destroy 生命周期幂等;同一容器重复 mount 复用实例;组件销毁释放监听 | — |