Skip to content

fix(mobile): 恢复群聊正文原生局部文本选择 - #7911

Open
nanaco666 wants to merge 5 commits into
makecindy:mainfrom
nanaco666:fix-mobile-group-text-selection
Open

nanaco666 wants to merge 5 commits into
makecindy:mainfrom
nanaco666:fix-mobile-group-text-selection

Conversation

@nanaco666

@nanaco666 nanaco666 commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

手机群聊正文长按此前只弹出整段 Copy,无法选择部分文字。现在群聊复用任务内既有文本选择组件,iOS 显示系统选区、手柄和菜单,可以选中一小段再复制;Android 保留现有系统选择。

变更类型

  • feat 新功能
  • fix 缺陷修复
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护
  • 其他:

范围

  • 关联 Issue / 需求:用户在真实 Simulator 验收中反馈长按整段 Copy 抢夺局部选字,要求单独 PR 恢复与任务内一致的选择交互;尚未关联独立 Issue。
  • 本 PR 包含:抽出任务内既有 MarkdownSelectableText / MarkdownSelectableSpan,由任务与群消息正文共用;覆盖自己的点名消息、伙伴 Markdown、列表、代码和表格文字;更新选择高亮守卫、产品规则和生成台账。
  • 明确不包含:feat(mobile): 补齐话题浏览、关注与贴回群聊交互 #7847 的话题入口、消息操作栏、附件预览和分享调整;二期菜单功能;reaction 或额外按压反馈。
  • 用户可见变化:长按出现可拖动的系统选区,复制所选片段;既有消息操作不变。
  • 是否存在 breaking change:无。

UI 变化

当前主线同步实看(2026-10-30,60389700dd)

同步 main@694d5b5a,生产选字实现保持不变。下面为本地集成预览 preview/mobile-7847-selection@e13187449 的真实 Simulator 截图,仅裁剪到 QA 消息:系统菜单及双手柄只选中正文中的一个“群”字。本轮确认选区,未再次点击 Copy 或读取剪贴板。预览同时含 #7847,分支不推送,不进入本 PR。

当前集成预览:系统局部选字手柄

以下“我们”的复制验证与截图属于初始生产提交 7ad822c57 的历史验收:

iPhone 17 Pro / iOS 26.5 本地 Xcode Simulator,真实账号与群历史,Light;截图裁剪到 QA 演示消息的系统选区,没有使用 mock 页面。已确认仅复制选中的“我们”两个字。

群聊正文的原生局部选择

  • 引用的设计规范:DESIGN.md §14.5 保留正文既有可点性语义,群内链接仍为只读文字;§5 保留既有布局与点击目标;apps/mobile/docs/mobile-design-guide.md §3 沿用原字号、行高和主题颜色,选区高亮交给系统。docs/product-rules/bot-group-chat.md §5 已同步原生局部选择要求。没有新增控件、颜色、动效或原生依赖。

怎么验证的

当前主线同步验证(2026-10-30,60389700dd1beb583cbc8d0e17fba7725a8391fe)

  • 合入 main@694d5b5a;唯一冲突为生成设计台账,使用正式脚本重生成。生产选择实现自动合并,保持本 PR 范围;merge-only,不增加既有 3 轮修复计数。
  • 下列 8 文件定向测试重新执行,169 项通过,4.53s;Mobile 类型检查、scope、test-hygiene、DCO 与 diff 检查通过。
  • 当前 head 的 Greptile 已完成,明确 5/5,原 review 讨论均已解决:当前评分。完整 PR CI 仍在执行,旧 head Approve 不视为当前批准。
  • 兼容预览 e13187449:5 文件 296 项通过,5.43s,Mobile 类型检查通过;真实 Simulator 的 QA 正文局部选字、话题入口和详情已实看。
  • Metro 8081 当前归属 .worktrees/mobile-7847-selection-preview,实际来源及 DEV build label 为 preview/mobile-7847-selection@e13187449;iPhone 17 Pro / iOS 26.5 / Global / uiMock=false,原生指纹匹配。其他任务 Metro 和专用模拟器未动。
  • Dark 与 Android 实机本轮未验收,未补 canonical Issue;本地全量门禁未执行,等待 PR CI。下方旧分数、耗时和剪贴板结果均保留各自历史提交,不冒充当前重新执行。

自动验证(历史 5ed5b374,当前复跑见上节)

pnpm --filter mobile exec vitest run src/__tests__/BotGroupChatScreen.test.tsx src/__tests__/BotGroupMarkdownText.test.tsx src/__tests__/markdownBlockContent.test.tsx src/__tests__/messageHierarchyLayout.test.ts src/__tests__/selectionQuote.test.ts src/__tests__/messageSelectionHighlight.test.ts src/__tests__/userMessageCollapse.test.ts src/__tests__/messageNativeLifecycleContracts.test.ts
结果:8 文件、169 项通过,3.99s。
pnpm --filter mobile run --if-present typecheck
结果:通过。
pnpm --filter mobile run test:scope
pnpm check:dev-docs
pnpm check:design-inventory
pnpm check:test-hygiene
pnpm check:dco
git diff --check
结果:均通过。设计台账已重新生成。
node apps/mobile/scripts/ci-fingerprint.mjs compute + compare(改动前后同环境)
结果:iOS / Android 指纹均不变。

测试价值:

  • BotGroupChatScreen.test.tsx:真实群聊页面入口,保留既有 113 项交互测试;共享选字组件新增原生依赖后,缺失的 UITextView / StyleSheet / 字体缩放适配导致 Linux、Windows CI 在收集阶段抛出 Unexpected token typeof。本机复现失败后补齐 jsdom 原生表面,不 mock 群消息或共享选择组件,不新增或削弱断言。unit,单文件 3.39s。
  • BotGroupMarkdownText.test.tsx:生产入口为 BotGroupMarkdownText / BotGroupUserText。最小输入为带强调的正文与一条点名消息;旧版 iOS 走 RN Text,无法局部选择,原有测试只验证排版。以 native-carrier fake 验证 iOS 选择根和嵌套格式文本同属 UITextView、Android 保留 RN Text;实际手柄与复制由 Simulator 验收。unit,修复前 iOS 用例失败、修复后双端通过;单文件 1.20s。
  • userMessageCollapse.test.ts:直接导入真实共享组件,原生表面 fake;保留巨型长消息展开后 RN Text 回退、普通文字继续 UITextView 的已有生产行为回归。旧位置函数抽取在搬迁后加载失败,现已改为真实组件入口,没有新增用例或源码字面断言。unit,18 项、单文件 1.43s。
  • messageNativeLifecycleContracts.test.ts:原生选字、手势所有权等已有跨文件契约继续保留,选择组件相关检查读取新模块;Node 无法执行 UIKit,实际手柄由 Simulator 覆盖。guard,5 项、单文件 0.243s。
  • messageSelectionHighlight.test.ts:保留 fix(mobile): 消息文本选中高亮回归系统默认 #1427 的跨文件原生选择高亮契约,把原有守卫覆盖移到共享组件;禁止逐 view 覆写不透明选中色。guard,最小输入为任一生产选择载体覆盖 selectionColor;单文件 0.235s。

手工验证

  • 本地系统 Simulator F125D3B4-D465-4F9A-9F9E-E68770754604,com.xd.cindy,Global、真实账号、uiMock=false;生产 UI 在 7ad822c57 提交实看,后续三个提交只修正测试入口与原生表面适配,生产 UI 未变化。
  • QA 群自己的多行消息长按出现双手柄,仅选中“我们”,点击系统 Copy 后读取该模拟器剪贴板,精确等于两个字。
  • “X 推广”真实群伙伴 Markdown 正文长按,仅选中加粗文字中的 GA,系统双手柄及 Copy / Look Up 菜单正常;强调、代码和其余正文仍可读。
  • 新旧版本开发原生指纹匹配,复用已有安装包;无须冷更。

未执行的验证

  • Android 实机和 Dark 目检未执行;Android 选择载体未变,双端分流有组件用例覆盖,颜色沿用主题与系统选择高亮。
  • 本地全量门禁未执行,等待 PR CI。80618eb9 自动 review 为 5/5、原线程已回复并 Resolve,但该 head 的 Linux / Windows 群聊页面测试均在加载原生模块时失败;本轮已复现并修复测试适配。此历史轮次提交为 5ed5b374a872a3fe861e1c94d0817c4c6108de26;当前提交与评分见上节。
  • 额外兼容性预览:本地 preview/mobile-7847-selection@b74a94ae7 合并 feat(mobile): 补齐话题浏览、关注与贴回群聊交互 #7847 的话题和操作栏 UI 与本 PR 生产改动,真实 Simulator 已确认话题摘要、操作栏和原生选区共存;预览分支不推送、不进入本 PR,两个 PR 仍独立。
  • 工作分支 fix-mobile-group-text-selection,独立 worktree .worktrees/mobile-group-text-selection;生产改动曾以 fix-mobile-group-text-selection@7ad822c57 验证原生选择。当时 Metro 8081 为上述历史兼容性预览 preview/mobile-7847-selection@b74a94ae7;当前归属和实际验收见上节。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:

影响与回滚

  • 影响范围:Mobile 群正文选择;任务渲染器只移动既有实现,选择、引用菜单、字体缩放及垂直对齐代码保持一致。iOS 使用既有 UITextView,Android 保留原路径,无协议、依赖或原生指纹变化。原生文字测量差异仍以运行验收为准。
  • 回滚 / 降级方式:回退本 PR;群聊退回整段 Copy 的旧交互,不影响消息数据或服务端。存量插件影响:无。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s,见 DCO)
  • UI 改动已在「UI 变化」注明引用的设计规范章节(不涉及 UI 则跳过)
  • 未提交凭证、令牌或授权文件
  • 已核对受影响的文档,行为变化涉及的旧结论已同步修订(不涉及则无需修改文档)
  • 已确认测试结果或说明未执行原因

Signed-off-by: nana <823073145@qq.com>
@nanaco666
nanaco666 requested a review from a team as a code owner October 29, 2026 13:35
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ⚠️ Failed 2026-10-29T13:39:05.817106Z
We couldn’t complete this review. Comment @codex review to try again.
7ad822c PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@greptile-apps

greptile-apps Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] 未发现阻止合并的问题。

Summary

本 PR 抽出 MarkdownSelectableText 和 MarkdownSelectableSpan,让群聊与任务共用原生局部选字组件。

  • Group messages let people select just the words they want.

Reviews (4) · Last reviewed commit: "chore(mobile): 同步主线并保留群聊原生选字" · Reviewed by Greptile

Comment thread apps/mobile/src/session/MessageRenderer.tsx
nana added 2 commits October 29, 2026 21:43
Signed-off-by: nana <823073145@qq.com>
@nanaco666

Copy link
Copy Markdown
Contributor Author

@greptileai Please review the latest changes at commit 80618eb.

Signed-off-by: nana <823073145@qq.com>
@nanaco666

Copy link
Copy Markdown
Contributor Author

@greptileai Please review the latest changes at commit 5ed5b37.

@MagicLizi MagicLizi added status:conflict 与目标分支有冲突(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示) labels Oct 29, 2026
Signed-off-by: nana <823073145@qq.com>
@nanaco666

Copy link
Copy Markdown
Contributor Author

@greptileai Please review the latest changes at commit 6038970.

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

Labels

status:conflict 与目标分支有冲突(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants