Skip to content

fix(diff): 首次打开 diff 预览自动定位到第一个变更行#1149

Open
david188888 wants to merge 1 commit into
proma-ai:mainfrom
david188888:fix/diff-autoscroll-to-change
Open

fix(diff): 首次打开 diff 预览自动定位到第一个变更行#1149
david188888 wants to merge 1 commit into
proma-ai:mainfrom
david188888:fix/diff-autoscroll-to-change

Conversation

@david188888

Copy link
Copy Markdown
Contributor

关联 Issue

Closes #1017

根因

DiffView.tsx:144-148 的滚动容器无 ref、无"首次打开自动定位"effect。DiffTabContent.tsx:801-840restoreScroll 只在有缓存滚动位置(restoreScrollRef.current === true)时触发;首次打开(无缓存)时在 :802 直接 return,视图停在 scrollTop=0(文件顶部),离实际变更可能隔着好几屏。

修复

DiffTabContent 新增独立的"首次打开自动定位"effect(:845-891):

  • 触发条件!previewOnly && !loading && !restoreScrollRef.current && !scrollPositionCache.has(scrollKey) && 未触发过
  • 等待异步渲染:复用现有 rAF 3 帧稳定模式(等 Shiki tokenize/ProseMirror mount 完成,与 restoreScroll 同模式)
  • 定位querySelector('[data-line-type=change-addition], [data-line-type=change-deletion]') + scrollIntoView({ block: 'center' })
  • 不破坏 restoreScroll:显式检查 restoreScrollRef.currentscrollPositionCache.has(scrollKey),有缓存位置时完全不介入
  • 防重复:触发后置标志位,[filePath, sessionId] 变化时重置
  • 多文件 diffquerySelector 命中第一个有变更的文件的第一个变更行
  • cleanup:unmount 时取消 rAF

采用 scrollIntoView 而非手动算 offsetTop,因为滚动容器嵌套(scrollContainerRef 的 overflow-auto div 与 @pierre/diffs 内部 [data-code] 滚动元素),浏览器自动滚动所有可滚动祖先,对单文件与多文件均生效。

验证

改动范围

  • apps/electron/src/renderer/components/diff/DiffTabContent.tsx:+50 行(auto-scroll effect + cleanup)
  • apps/electron/package.json:patch 版本递增

@climashscape

Copy link
Copy Markdown
Contributor

感谢解决issue问题~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Diff 预览打开后不自动定位到变更位置

2 participants