已关闭
PDF阅读器删除批注后,阅读区依然存在。 #8
cnzen创建于  9月19日关闭于  9月19日
cnzen
cnzen成员
9月19日 创建

本条由数友社区的帖子转入(单向镜像)。讨论请在本 issue 进行;
社区那边只作为入口与检索面,状态以本 issue 为准。
来源帖:https://community.shuyo.cn/post/pdf阅读器删除批注后阅读区依然存在该批注

版本 / 平台

  • 版本:1.91.9
  • 平台:windows 11

复现步骤

点击画笔按钮,然后在阅读区勾画;然后在右侧栏点击按钮删除。

期望

勾画在侧边栏和阅读区同时没有

实际

侧边栏的没了,阅读区还有。

likedislike
fjtfjt成员
9月19日 修改标题为 “PDF阅读器删除批注后,阅读区依然存在。”,原标题为“PDF阅读器删除批注后,阅读区依然存在该批注。”
cnzen
cnzen成员
9月19日 评论:

根因:删除动作没有跨过组件边界,不是"画布不刷新"

PdfReader.tsx 的 onSidebarDelete() 只做三件事:把父级 annRecords 里那条过滤掉 → savePdfAnnotations() 落库 → toast「已删除批注」。

但阅读区里那条勾画,是每一页自己持有的一份状态画出来的(PdfAnnotationCanvas 的 annotations),
而这份状态只在 attachmentId / pageIndex 变化时才重新加载:

// PdfAnnotationCanvas.tsx
useEffect(() => { /* loadPage(attachmentId, pageIndex) */ }, [attachmentId, pageIndex]);

⇒ 删除只改了「父级的清单 + 服务端记录」,页内那份快照没变,画布继续按旧快照画;
顶部工具栏的「批注数」同理要等下一次刷新才更新。所以现象正好是你看到的:侧栏立刻没了,阅读区还在。

已修(分支,基于 dev)

分支 fix/pdf-sidebar-delete-refresh(已推)。做法与既有的「侧栏点击跳转」完全同形
——一次性 target + 消费回调,只有页码匹配的那一页消费它:

文件 改动
PdfReader.tsx onSidebarDelete() 在 setAnnRecords(updated) 之后 setDeleteTarget({ pageIndex, annId }),并透传给页块 → 画布
PdfAnnotationCanvas.tsx 新增一条 effect 消费它:用已有的、被单测覆盖的纯函数 removeAnnotation()(src/lib/pdfAnnotation.test.ts 的 "annotation CRUD")把该条从本页状态里去掉,并清掉选中态;计数由既有的 [annotations, …] effect 自动刷新

判据(本机)

  • npx tsc --noEmit → exit 0
  • 全量 vitest → 1315 passed / 1 failed;那 1 条是 scripts/check-crypto-backend.test.mjs 在 Windows 上的既有失败
    (把工作区 stash 回纯 dev 后同样红:expected 'C:\home\tester\shuyonote-target' to be '/home/tester/shuyonote-target'
    —— 门禁自测拿 POSIX 绝对路径去喂 path.resolve),与本改动无关。

⚠️ 真机 UI 复验没做:这一条(画笔勾画 → 侧栏删除 → 阅读区也立刻消失)需要能开 app 的机器点一遍,
我这台机器跑不了 Tauri UI。要按你们的复验流程走,我可以补;或者你直接在 1.91.9 上验。

基线说明

线上 1.91.9 在 main、此修复基于 dev;这两个文件在 dev 与 main 之间逐字节相同
(git diff origin/dev origin/main -- src/components/PdfReader.tsx src/components/PdfAnnotationCanvas.tsx 为空),
所以修法对两条线都成立。要不要 cherry-pick 到 main 做小版本热修,由你定。
issue 先不关:还没合入 dev / 发版。

likedislike
cnzen
cnzen成员
9月19日 评论:

已随 v1.91.10 发布 —— 这条关闭

修复已合入 dev → main 并完成发版(pnpm check:release-state 21/21 通过)。

改了什么是这样:侧栏删除批注后,除了更新父级清单与落库,还会**通知「那一页」**把这条从页内状态里去掉 —— 阅读区不再残留那条勾画,顶部工具栏的计数同时跟上。实现复用已被单测覆盖的纯函数 removeAnnotation,没有另写一份过滤逻辑。

判据:npx tsc --noEmit 0 错;全量 vitest 1315 通过 / 1 失败(那 1 条是 scripts/check-crypto-backend.test.mjs 在 Windows 上的既有失败,把工作区 stash 回纯 dev 后同样红,与本改动无关);通道自检 21/21。

⚠️ 如实说明一条边界:真机 UI 复验我这边做不了(本机跑不了 Tauri UI)——"点一下:勾画 → 侧栏删除 → 阅读区也立刻消失"这步请你在 1.91.10 上确认。若还有残留,把复现步骤贴回来我继续查。

likedislike
cnzencnzen成员
9月19日 关闭了 issue