# 前端 UX 改进分析计划
## 问题概述
对 void-chat 前端代码进行了全面分析,涵盖页面路由、聊天组件、共享UI组件、状态管理、CSS样式、工具库等6大模块。以下按优先级整理待改进项。
---
## 🔴 P0 — 关键体验问题(影响核心功能使用)
### 1. 消息输入无草稿持久化
- **问题**: 用户刷新或断开连接时,正在输入的消息丢失
- **位置**: `MessageInput.tsx`, `PrivateChat.tsx`
- **建议**: 基于 localStorage 实现自动保存草稿,按 roomId 分隔
### 2. WebSocket 断连无用户反馈
- **问题**: 连接丢失时仅内部状态变化,用户看不到明确的"连接已断开/正在重连"提示;重连失败后仅显示通用 toast
- **位置**: `useBaseWebSocket.ts` (lines 77, 107, 110)
- **建议**: 在聊天界面顶部显示持续性连接状态条(非 toast),包含重连倒计时和重试次数;恢复连接后显示"已恢复"成功提示
### 3. 消息发送无确认反馈
- **问题**: 发送消息后无"发送中/已发送/失败"状态指示,用户不确定消息是否到达服务器
- **位置**: `useMessageComposer.ts`, `chatStore.ts`
- **建议**: 实现乐观更新——消息立即追加到列表(带 pending 状态),收到服务器确认后更新;失败时显示重试按钮
### 4. 移动端触控目标过小
- **问题**: 多个按钮触控面积不足 44×44px(iOS/Android 最低推荐值)
- `.icon-btn`: padding 6px ≈ 20×20px
- `.msg-action-btn`: padding 4px×10px ≈ 20×22px
- `.modal-close-btn`: padding 2px×6px ≈ 14×14px
- `.kick-btn`: padding 3px ≈ 13×13px
- `.dm-btn`: padding 4px ≈ 16×16px
- **位置**: `responsive.css`, `messages.css`, `modals.css`, `sidebar.css`
- **建议**: 为移动端增加 `min-width/min-height: 44px` 或增大 padding
### 5. 移动端消息操作按钮不可见
- **问题**: 编辑/删除等操作按钮仅 hover 时显示,触屏设备无 hover
- **位置**: `MessageItem.tsx`, `messages.css`
- **建议**: 移动端改为长按菜单或在消息右侧显示 "⋯" 更多按钮
### 6. 应用初始化无加载状态
- **问题**: `checkAuth()` 执行期间无 loading UI,用户可能看到页面闪跳(先显示错误页面再重定向)
- **位置**: `App.tsx` (lines 24-26)
- **建议**: 添加全屏 loading 指示器,auth check 完成前不渲染路由
### 7. 无错误边界
- **问题**: 任何组件渲染错误都会导致白屏,无 fallback UI
- **位置**: `App.tsx`
- **建议**: 在 Routes 外层添加 React ErrorBoundary,提供友好的错误页面和重试按钮
---
## 🟠 P1 — 重要体验改进(影响使用效率)
### 8. Emoji 选择器功能缺失
- **问题**: 仅 31 个固定 emoji,无搜索、无分类、无最近使用、无键盘导航、无肤色变体
- **位置**: `EmojiPicker.tsx`, `emojis.ts`
- **建议**: 扩展 emoji 数据集,添加搜索过滤、分类标签页、最近使用记录、键盘方向键导航
### 9. Toast 通知体验不足
- **问题**: 固定 4 秒消失无法定制(错误类信息消失太快);无手动关闭按钮;无堆叠逻辑(多条可能重叠);无 aria-live 无障碍支持
- **位置**: `Toast.tsx`, `uiStore.ts` (line 75)
- **建议**: 错误类 toast 延长到 8 秒或需手动关闭;添加关闭按钮和堆叠排队;添加 `role="alert"` 和 `aria-live`
### 10. 表单验证反馈缺失(全局性问题)
- **问题**: 所有表单(登录/注册/创建房间/编辑资料)均仅在提交时验证,无实时反馈
- 密码不匹配只有提交后才提示
- 房间容量范围无即时校验
- 缺少字段级 required/optional 标记
- **位置**: `AuthPage.tsx`, `CreateRoomDialog.tsx`, `EditRoomDialog.tsx`, `ProfileModal.tsx`
- **建议**: 添加 inline 实时校验提示、字段必填标记、字符计数器
### 11. 搜索面板 UX 欠缺
- **问题**: 必须手动按 Enter 才搜索(无实时搜索);无结果分页;点击结果跳转后搜索面板仍然打开遮挡视线;搜索结果缺少键盘导航(↑↓)
- **位置**: `SearchPanel.tsx`
- **建议**: 添加防抖实时搜索;结果项点击后自动收起面板或半透明化;支持键盘导航
### 12. 私信体验不完整
- **问题**:
- 无已读标记(仅关闭时才发 mark_read,阅读中不标记)
- 无输入中指示器(主聊天有,私信没有)
- 手动滚动用三重 `requestAnimationFrame`(性能隐患)
- 私信不支持 @mention 和 emoji 快捷插入
- 无法删除/归档旧对话
- **位置**: `PrivateChat.tsx`
- **建议**: 查看消息时即标记已读;复用主聊天的 typing indicator;使用虚拟列表替代手动滚动;共享输入组件能力
### 13. Markdown 渲染缺失功能
- **问题**: 链接无 `target="_blank"`(用户点击后离开聊天);无代码块复制按钮;无语法高亮
- **位置**: `lib/markdown.ts`
- **建议**: 配置 marked renderer 为链接添加 `target="_blank" rel="noopener noreferrer"`;代码块添加复制按钮;考虑集成轻量语法高亮
### 14. 空状态/加载状态处理不足
- **问题**: 多处缺少有意义的空状态提示
- "No Rooms Available" 无引导操作(如"立即创建一个")
- "No Private Conversations Yet" 无开始对话入口
- 房间加载中无骨架屏
- 私信列表无 loading 指示器
- **位置**: `LobbyPage.tsx`, `MailboxPage.tsx`, `ChatPage.tsx`, `chatStore.ts`
- **建议**: 所有空状态添加引导 CTA;loading 使用骨架屏而非纯文字
### 15. 文件上传无进度指示
- **问题**: 上传仅显示 "Uploading..." 文字,无进度条或百分比
- **位置**: `MessageInputBar.tsx` (lines 82-87)
- **建议**: 使用 XMLHttpRequest 或 fetch + ReadableStream 实现上传进度条
### 16. Admin 面板缺少分页和排序
- **问题**: 用户列表一次性渲染全部(千级用户时性能问题);无表头排序;无批量操作
- **位置**: `AdminUserManagementTab.tsx` (lines 210-305)
- **建议**: 实现分页或虚拟滚动;添加表头排序(用户名/注册时间/角色);添加多选批量禁用/禁言
### 17. Admin 角色变更无确认对话框
- **问题**: 角色变更立即执行,无二次确认(disable/mute 有确认,role 没有)
- **位置**: `AdminUserManagementTab.tsx` (lines 60-79)
- **建议**: 添加确认对话框,防止意外操作
---
## 🟡 P2 — 体验优化(提升精致感)
### 18. 键盘快捷键和无障碍
- **问题**:
- 搜索输入框 `outline: none` 导致键盘焦点不可见
- 多个按钮缺少 focus-visible 样式(emoji-btn, kick-btn, dm-btn)
- Admin tab panel 缺少 `role="tabpanel"`
- 未读 badge 缺少 aria-label(屏幕阅读器无法感知)
- 缺少全局快捷键帮助(如 `?` 弹出快捷键列表)
- **位置**: CSS 多处, `AdminPage.tsx`, `LobbyPage.tsx`, `ChatView.tsx`
- **建议**: 修复所有 `outline: none`;补全 focus-visible 样式;添加 ARIA 角色和标签
### 19. TypingIndicator 过渡生硬
- **问题**: 输入中指示器突然出现/消失,无动画过渡;用户断连后可能残留"正在输入"状态
- **位置**: `TypingIndicator.tsx`
- **建议**: 添加 fade-in/fade-out 动画;客户端设置输入状态超时自动清除
### 20. 图片查看器体验
- **问题**: 占位尺寸硬编码 800×600 导致加载时视觉跳动;图片加载期间无 loading 指示;alt 文本使用通用 "Shared image"
- **位置**: `ImageViewer.tsx`, `MessageContent.tsx`
- **建议**: 使用实际比例占位;添加加载动画;生成有意义的 alt 文本
### 21. Matrix Rain 移动端电池消耗
- **问题**: 即使标签页不可见时也持续运行动画,不响应 Page Visibility API
- **位置**: `MatrixRain.tsx`
- **建议**: 监听 `document.visibilitychange`,标签页隐藏时暂停 canvas 动画
### 22. CSS 层级和性能问题
- **问题**:
- `noise-overlay` z-index: 9999 过高
- modal(1000) vs sidebar(1001) z-index 可能冲突
- noise 动画 0.2s infinite(每秒 40+ 帧重绘)影响低端设备
- 多处 `backdrop-filter: blur()` 在低端设备卡顿
- 滚动条样式不一致(部分隐藏、部分自定义、部分原生)
- **位置**: `effects.css`, `responsive.css`, `modals.css`
- **建议**: 统一 z-index 层级体系(用 CSS 变量);移动端禁用 noise 动画;统一滚动条策略
### 23. 响应式断点不足
- **问题**: 仅一个 768px 断点,缺少 480px(小手机)、1024px(平板)、1440px(大桌面)
- **位置**: `responsive.css`
- **建议**: 至少增加 480px 和 1024px 两个断点
### 24. 低对比度文本可能不符 WCAG AA
- **问题**: `--color-text-muted: #2d5f3a` 在深色背景上对比度约 35%,可能不满足 WCAG AA 4.5:1 最低要求
- **位置**: `tokens.css`
- **建议**: 提高 muted 文本亮度;`.role-badge` 9px 字号也需增大到至少 11px
### 25. HTML 缺少 PWA/SEO 基础
- **问题**: 无 favicon、无 `<meta name="description">`、无 `<meta name="theme-color">`、无 PWA manifest、无 Open Graph 标签
- **位置**: `index.html`
- **建议**: 添加基础 meta 标签和 favicon
### 26. 密码房间交互细节
- **问题**: 密码输入无显示/隐藏切换;回车键不能提交;私有房间可不设密码就创建
- **位置**: `RoomPasswordModal.tsx`, `CreateRoomDialog.tsx`
- **建议**: 添加密码可见性切换;表单支持 Enter 提交;私有房间强制要求密码
### 27. 本地化问题
- **问题**: `ProfileModal.tsx` line 36 硬编码中文 "头像上传失败",与其他英文错误提示不一致
- **位置**: `ProfileModal.tsx`
- **建议**: 替换为英文或建立统一的 i18n 机制
### 28. UserCard 的 DOM 操作反模式
- **问题**: 直接操作 DOM 的 `Object.getOwnPropertyDescriptor` 方式在 textarea 中插入 mention,不符合 React 范式
- **位置**: `UserCard.tsx` (lines 115-129)
- **建议**: 使用 React ref 和 state 驱动的方式插入
### 29. Mention 下拉框缺少键盘确认和关闭
- **问题**: 高亮项无法用 Enter/Space 选择(仅支持点击);无 Escape 关闭;无点击外部关闭
- **位置**: `MentionDropdown.tsx`
- **建议**: 支持 Enter 确认选择、Escape 关闭、点击外部关闭
### 30. 邀请链接管理 UX
- **问题**: 创建后显示邀请码但无自动复制提示;列表仅显示截断预览;单条邀请无复制按钮
- **位置**: `AdminControlTab.tsx`
- **建议**: 创建后自动复制到剪贴板并提示;每条邀请添加复制按钮
---
## 改进优先级总览
| 优先级 | 编号 | 改进项 | 影响范围 |
|--------|------|--------|---------|
| 🔴 P0 | 1 | 消息草稿持久化 | 所有聊天场景 |
| 🔴 P0 | 2 | WebSocket 断连反馈 | 所有聊天场景 |
| 🔴 P0 | 3 | 消息发送确认状态 | 所有聊天场景 |
| 🔴 P0 | 4 | 移动端触控目标 | 移动端全局 |
| 🔴 P0 | 5 | 移动端消息操作 | 移动端聊天 |
| 🔴 P0 | 6 | 初始化加载状态 | 所有页面 |
| 🔴 P0 | 7 | 错误边界 | 所有页面 |
| 🟠 P1 | 8 | Emoji 选择器 | 聊天输入 |
| 🟠 P1 | 9 | Toast 通知改进 | 全局 |
| 🟠 P1 | 10 | 表单验证反馈 | 所有表单 |
| 🟠 P1 | 11 | 搜索面板 UX | 聊天搜索 |
| 🟠 P1 | 12 | 私信体验完善 | 私信 |
| 🟠 P1 | 13 | Markdown 渲染增强 | 消息展示 |
| 🟠 P1 | 14 | 空状态/加载状态 | 多处 |
| 🟠 P1 | 15 | 文件上传进度 | 文件上传 |
| 🟠 P1 | 16 | Admin 分页排序 | 管理面板 |
| 🟠 P1 | 17 | Admin 角色确认 | 管理面板 |
| 🟡 P2 | 18-30 | 见上文详细列表 | 各模块 |