Files
eryao/.trellis/tasks/archive/2026-05/05-09-settings-page-interaction-optimization/prd.md
T

95 lines
3.6 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.
# 优化设置页面交互:返回逻辑与保存等待机制
## Goal
优化设置相关二级页面的交互体验:
1. 二级页面返回按钮应返回其隶属的一级页面,而非路由栈上一页
2. 通用设置页面的开关切换应等待后端成功响应后再更新 UI,不使用乐观更新
## What I already know
**现有实现问题:**
### 返回逻辑
- `GeneralSettingsPage.tsx` 第 145-149 行:使用 `navigate(-1)` 返回路由栈上一页
- `FeedbackPage.tsx` 第 113-117 行:同样使用 `navigate(-1)`
- 这意味着如果用户从设置页进入通用设置,再进入语言选择弹窗,返回时会回到语言弹窗而非设置页
### 保存逻辑
- `GeneralSettingsPage.tsx` 第 103-128 行:`handleToggleChange` 函数先调用 `setSettings(newSettings)` 乐观更新 UI,再调用 `saveSettings`
- 用户看不到保存过程,失败时也没有明确的错误反馈
**页面层级关系:**
- 一级页面:SettingsPage (`/settings`)
- 二级页面:
- GeneralSettingsPage (`/settings/general`)
- FeedbackPage (`/settings/feedback`)
## Requirements
### R1: 二级页面返回逻辑
- 点击返回按钮时,导航到隶属的一级页面(`/${locale}/settings`),而非路由栈上一页
- 涉及页面:GeneralSettingsPage、FeedbackPage
### R2: 通用设置保存等待机制
- 开关切换时显示 loading 状态
- 等待后端成功响应后再更新 UI 状态
- 保存失败时显示 toast 错误提示,开关状态保持不变
- 保存成功时不显示 toast
- 涉及设置项:canSell(隐私设置)、allowNotifications(通知设置)
### R3: 删除硬编码默认值
- SettingsPage: 删除 displayName 默认值 `'User'` 和 email 默认值 `'user@example.com'`
- ProfileDetailPage: 删除 email 默认值 `'user@example.com'`
- AppShell 侧边栏: 显示真实头像和用户名,而非邮箱前缀
- 邮箱从 auth token 获取(后端 profile API 不返回 email
### R4: 语言 URL 同步
- 页面加载时检查 URL 语言与用户偏好是否一致
- 不一致则重定向到用户偏好的语言 URL
- 防止用户手动修改 URL 导致语言不一致
## Acceptance Criteria
- [ ] GeneralSettingsPage 返回按钮点击后导航到 `/settings`
- [ ] FeedbackPage 返回按钮点击后导航到 `/settings`
- [ ] 切换 canSell 开关时,开关显示 loading 状态,后端成功后才切换
- [ ] 切换 allowNotifications 开关时,开关显示 loading 状态,后端成功后才切换
- [ ] 保存失败时显示 toast 错误提示,开关状态回滚
- [ ] SettingsPage 无硬编码用户名/邮箱默认值
- [ ] ProfileDetailPage 无硬编码邮箱默认值
- [ ] AppShell 侧边栏显示真实头像和用户名
- [ ] URL 语言与用户偏好不一致时自动重定向
## Definition of Done
- 功能测试通过
- 代码 lint 无错误
## Out of Scope
- 语言选择的保存逻辑(已有页面刷新机制,不在本次修改范围)
- 其他页面的返回逻辑
- 后端 API 修改
## Technical Notes
**涉及文件:**
- `web/src/components/GeneralSettingsPage.tsx`
- `web/src/components/FeedbackPage.tsx`
- `web/src/components/SettingsPage.tsx`
- `web/src/components/ProfileDetailPage.tsx`
- `web/src/components/AppShell.tsx`
**修改方案:**
### 返回逻辑
`navigate(-1)` 改为 `navigate('/${locale}/settings')`
### 保存等待机制
1. 移除乐观更新 `setSettings(newSettings)`
2. 保存开始时设置 `saving: true`(已有)
3. 保存成功后调用 `setSettings(newSettings)`
4. 保存失败时显示 toast 错误提示
5. 需要 props 传入 toast 相关文案(saveSuccess、saveFailed