Files
digital-pilates/docs/cancel-chat-implementation.md
richarjiang d52981ab29 feat: 实现聊天取消功能,提升用户交互体验
- 在教练页面中添加用户取消发送或终止回复的能力
- 更新发送按钮状态,支持发送和取消状态切换
- 在流式回复中显示取消按钮,允许用户中断助手的生成
- 增强请求管理,添加请求序列号和有效性验证,防止延迟响应影响用户体验
- 优化错误处理,区分用户主动取消和网络错误,提升系统稳定性
- 更新相关文档,详细描述取消功能的实现和用户体验设计
2025-08-18 18:59:23 +08:00

138 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 取消聊天功能实现文档
## 功能概述
为 AI 教练聊天界面添加了用户可以取消发送或终止回复的能力,参照业内最佳实践(如 ChatGPT、Claude 等)实现。
## 主要功能
### 1. 发送按钮状态切换
- **发送状态**: 绿色背景,显示上箭头图标
- **取消状态**: 红色背景 (#FF4444),显示停止图标
- 根据 `isSending``isStreaming` 状态自动切换
### 2. 流式回复中的取消按钮
- 在助手正在思考时显示"正在思考…"和取消按钮
- 在助手正在输出文本时显示"停止生成"按钮
- 取消按钮采用红色主题,与停止操作语义一致
### 3. 取消逻辑处理
- 调用 `streamAbortRef.current.abort()` 中断 XMLHttpRequest
- 清理状态:`isSending``isStreaming``pendingAssistantIdRef`
- 移除正在生成中的助手消息
- 提供触觉反馈Warning 类型)
### 4. 错误处理优化
- 区分用户主动取消和网络错误
- 对于 AbortError 不进行错误提示和降级处理
- 避免在取消操作后显示"请求失败"等错误信息
## 技术实现
### 关键函数
```typescript
function cancelCurrentRequest() {
// 中断流式请求
if (streamAbortRef.current) {
streamAbortRef.current.abort();
streamAbortRef.current = null;
}
// 清理状态
setIsSending(false);
setIsStreaming(false);
// 移除正在生成的消息
if (pendingAssistantIdRef.current) {
setMessages(prev => prev.filter(msg => msg.id !== pendingAssistantIdRef.current));
pendingAssistantIdRef.current = null;
}
// 用户反馈
Haptics.notificationAsync(Haptics.NotificationFeedbackType.Warning);
}
```
### UI 状态管理
1. **发送按钮**:
- 背景色:发送时为主题色,取消时为红色
- 图标:发送时为上箭头,取消时为停止图标
- 禁用状态:只在无内容且非发送状态时禁用
2. **流式消息气泡**:
- 思考阶段:显示"正在思考…"和取消按钮
- 输出阶段:在消息下方显示"停止生成"按钮
### 边界情况处理
1. **组件卸载**: 自动清理未完成的请求
2. **新建会话**: 如果有进行中的请求,先取消再创建
3. **切换历史会话**: 取消当前请求后再加载历史会话
4. **多次点击**: 防止重复发送,支持随时取消
## 用户体验设计
### 视觉反馈
- 按钮颜色变化(绿色→红色)
- 图标变化(发送→停止)
- 取消按钮采用一致的红色主题
### 交互反馈
- 触觉反馈:取消时提供 Warning 类型震动
- 即时响应:点击取消后立即停止生成
- 状态清理:取消后界面回到可输入状态
### 语义化设计
- "正在思考…" + "取消":在等待响应阶段
- "停止生成":在文本输出阶段
- 红色主题:与停止操作的通用语义保持一致
## 业内最佳实践对比
### ChatGPT
- ✅ 发送按钮变为停止按钮
- ✅ 红色停止图标
- ✅ 即时响应
### Claude
- ✅ 流式输出过程中显示停止按钮
- ✅ 取消后清理当前消息
- ✅ 明确的视觉区分
### 我们的实现
- ✅ 发送/取消按钮一体化设计
- ✅ 双重取消入口(发送按钮 + 消息内按钮)
- ✅ 完整的状态管理和错误处理
- ✅ 触觉反馈增强用户体验
## 测试建议
1. **基本功能测试**:
- 发送消息后立即点击取消
- 在流式输出过程中点击停止
- 连续发送多条消息并取消
2. **边界情况测试**:
- 网络异常时的取消行为
- 快速切换会话时的状态清理
- 组件卸载时的资源清理
3. **用户体验测试**:
- 按钮状态变化的流畅性
- 触觉反馈的适当性
- 界面响应的即时性
## 总结
本实现参照业内主流 AI 聊天应用的最佳实践,提供了完整的取消/终止功能,包括:
- 直观的 UI 状态切换
- 完善的取消逻辑处理
- 良好的用户反馈机制
- 健壮的错误处理
- 一致的设计语言
功能实现既保证了技术的正确性,也注重了用户体验的完整性。