feat(webui): 打开即已读 + 回复即已读
用户:「现在邮件需要完全手动标记是否已读而不支持点进去自动已读或者回复自动已读」。
## 改法
- **打开即已读**:MailView 里加一个 effect —— 当前邮件是 unread 且**真正可见**时
调 `markRead`。两个刻意的细节:
1. 窄屏下 MailView 可能已经渲染但被列表覆盖层盖住(NarrowStack)⇒ 必须等到
`narrowPane === 'detail'` 才标,否则"滑过去但没看"的邮件也会被标已读;
2. 只对 `unread` 发请求(已读的再标一次是白跑,还会让接口日志一直响)。
- **回复即已读**:ReplyBar 发送**成功之后**才标(发送失败不该把"我处理过了"记下来)。
- 手动标记按钮保留(显式动作仍然有用)。
## 端到端验证(真浏览器 + 真库)
造一封未读 → 浏览器里展开会话分组、点开那封邮件 →
POST /read → 200
mail_reads 里出现 (reader=gui-lab)
冗余列 mails.status: unread → read
即"打开即已读"确实生效,而且是记在**读者维度**上(不会像旧的邮件级已读那样
被别人一标就没了)。
## 一个过程记录
前两次验证都"没有发出 /read 请求",我一度以为代码没生效。其实是**点错了对象**:
会话分组默认折叠,`button:has-text(主题)` 匹配到的是**分组那颗**,点它只展开、
不选中邮件(所以不触发已读 —— 这恰恰是正确行为)。展开后再点具体邮件行才触发。
判据必须点"用户真正会点的那一层",这句话这次又应验了。
套件:vitest 15 文件 / 258 用例全绿。
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
import { render, screen, fireEvent } from '@testing-library/react';
|
||||
import { render, fireEvent } from '@testing-library/react';
|
||||
import { beforeEach, describe, expect, it } from 'vitest';
|
||||
import Sidebar from '../../src/components/Sidebar';
|
||||
import { useUIStore } from '../../src/stores/uiStore';
|
||||
|
||||
Reference in New Issue
Block a user