fix(mobile): 修复 iOS 左滑「选项」里删除与重命名无响应 - #4071
Conversation
iOS 上左滑任务行 →「选项」→「删除任务」点了没有任何反应,确认弹窗不出现;
「重命名任务」同样无响应。置顶 / 归档正常,会话详情页的删除也正常。
根因是 `@expo/ui` 两个同名 `onDismiss` 的语义差异。iOS 不允许在 Sheet 关闭
过程中 present 系统 Alert,所以 useSessionListActions 把删除 / 重命名拆成两拍:
先关 Sheet,把后续弹窗存进 pendingSheetActionRef,等 Sheet 报告关闭完成
(onClosed)再弹。而通用 `@expo/ui` BottomSheet 的 onDismiss 只由原生
onIsPresentedChange 派生,原生 BottomSheetView.swift 里有防回环 guard:
if props.isPresented == newIsPresented { return }
用户下拉 / 点背板时 SwiftUI 先改本地 state、与 props 不一致,事件照常派发;
而点菜单项是 JS 把 isPresented 置 false,props 先变再驱动本地 state,两者
一致 → 事件被 guard 吞掉。onClosed 永不触发,存好的确认弹窗永远不弹,且
不抛错、无日志,typecheck 与单测都看不见。置顶 / 归档不走延迟路径,所以幸存。
改为直接使用 `@expo/ui/swift-ui` 的 BottomSheet,它把两个信号分开暴露:
onIsPresentedChange 表示用户主动关闭(驱动 onClose),onDismiss 对应 SwiftUI
`.sheet(onDismiss:)`,两种关闭方式都在 Sheet 完全消失后触发,才是 onClosed
的正确挂点。内容 modifier(frame / padding / 把手 / fitToContents)与通用封装
保持一致,视觉不变。
Signed-off-by: Yecheng Fu <yechengfu1987@gmail.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
| Filename | Overview |
|---|---|
| apps/mobile/src/session/SessionOptionsExpoSheet.tsx | 改用 swift-ui BottomSheet,并将状态关闭与完全消失回调分别接入 onClose 和 onClosed。 |
| apps/mobile/src/tests/sessionOptionsExpoSheet.test.ts | 新增生命周期回归锚点,但基于源码字符串的断言较脆弱,无法验证运行时回调传递。 |
Sequence Diagram
sequenceDiagram
participant U as 用户
participant S as SessionOptionsExpoSheet
participant C as 调用方状态
participant P as pendingSheetActionRef
participant A as Alert/重命名弹窗
U->>S: 点击删除或重命名
S->>P: 保存待执行操作
S->>C: "设置 visible=false"
C->>S: "isPresented=false"
S-->>S: Sheet 完全消失
S->>C: onDismiss → onClosed
C->>P: 取出并清空待执行操作
P->>A: 展示后续弹窗
Prompt To Fix All With AI
### Issue 1
apps/mobile/src/__tests__/sessionOptionsExpoSheet.test.ts:21-31
这个回归测试只检查 import 和 JSX 的文本形状,没有渲染组件或调用传给 BottomSheet 的回调。因此,即使运行时 props 接错,只要文本仍匹配,测试也可能通过;而抽取等价的命名回调、调整 JSX 包装或改用单引号却可能导致测试失败。建议 mock swift-ui BottomSheet,渲染 SessionOptionsPresenter,并直接断言 onDismiss 只触发 onClosed、onIsPresentedChange(false) 触发 onClose。
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.Reviews (1): Last reviewed commit: "fix(mobile): 修复 iOS 左滑「选项」里删除与重命名无响应" | Re-trigger Greptile
|
@cofyc 👋 这个 PR 还有 1 条 review conversation 没 resolve(apps/mobile/src/tests/sessionOptionsExpoSheet.test.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
|
命中 UI 路径(apps/mobile/src/session/SessionOptionsExpoSheet.tsx)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(```html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范 |
review 反馈:原测试只匹配源码文本形状,运行期接错 props 也可能通过, 而等价重构(抽命名回调 / 调整 JSX 包装 / 改引号)反而会误报。 改为直接调用组件函数、在真实元素树上断言传给 BottomSheet 的 props 与 回调语义:onDismiss 只触发 onClosed、onIsPresentedChange(false) 只触发 onClose、onIsPresentedChange(true) 两者都不触发、程序化关闭(visible=false) 后 onDismiss 仍触发 onClosed,并补上菜单项 action 透传与 Android 平台分流。 「没退回通用 @expo/ui 封装」用两个不同的 mock 标记来判定,不再依赖字符串。 mobile 无 react renderer 依赖(加 devDependency 会改 apps/mobile/package.json → 变动 runtime fingerprint → 触发冷更,不值得);组件是纯函数且只用到已 mock 的 useTheme,手动展开函数组件即可。 负向对照:把组件还原成 main 版本后本文件 8 条中 6 条失败, 仍通过的 2 条(菜单接线 / 平台分流)本就与该 bug 无关。 Signed-off-by: Yecheng Fu <yechengfu1987@gmail.com>
界面效果证据(回应 UI evidence 提示)本 PR 只改 Sheet 的关闭事件接线,不改布局、尺寸、颜色与文案 —— 内容 modifier <!doctype html><html lang="zh-CN"><meta charset="utf-8">
<title>iOS 左滑「选项」Sheet — 改动后界面证据</title>
<style>
body{margin:0;padding:24px;background:#f6f7f8;color:#1f2328;
font:14px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}
h1{font-size:18px;margin:0 0 4px}
p.sub{margin:0 0 20px;color:#59636e}
.grid{display:flex;flex-wrap:wrap;gap:16px}
figure{margin:0;background:#fff;border:1px solid #d1d9e0;border-radius:10px;
padding:12px;max-width:392px}
figure.dark{background:#0d1117;border-color:#3d444d;color:#e6edf3}
img{width:100%;display:block;border-radius:8px}
figcaption{margin-top:10px;font-size:12px;color:#59636e}
figure.dark figcaption{color:#9198a1}
.note{margin-top:20px;padding:12px 14px;background:#fff8c5;
border:1px solid #d4a72c66;border-radius:8px;font-size:12px}
</style>
<h1>iOS 左滑「选项」Sheet — 改动后实机界面</h1>
<p class="sub">iPhone 17 Pro 模拟器 / iOS 26.5 / development client。本次只改关闭事件接线,
不改布局、尺寸、颜色与文案,外观与改动前一致。</p>
<div class="grid">
<figure><img alt="Light 模式下的选项 Sheet" src="data:image/jpeg;base64,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">
<figcaption><b>Light</b> — 常规操作分组(重命名任务 / 取消置顶 / 归档)与危险操作
(删除任务)分组,圆角卡片 + 分隔线,删除项用 destructive 语义色。</figcaption></figure>
<figure class="dark"><img alt="Dark 模式下的选项 Sheet" src="data:image/jpeg;base64,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">
<figcaption><b>Dark</b> — 同一套布局与间距,颜色走语义 token,
destructive 红在深色背景下对比度可读。</figcaption></figure>
<figure><img alt="删除确认弹窗" src="data:image/jpeg;base64,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">
<figcaption><b>删除确认</b>(本 PR 修复的正是这一步)— 点「删除任务」后系统 Alert
正常弹出并指名目标任务;改动前此弹窗永不出现。图中为本次端到端验证新建的一次性任务。</figcaption></figure>
</div>
<div class="note">截图已裁剪到 Sheet / 弹窗本体:本仓为公开仓库,背景中的真实任务标题与消息预览
属于个人数据,不适合公开,故未附整屏截图。</div>
</html>关于截图范围:本仓是公开仓库,而实机截图的背景里是我本机的真实任务标题与消息 对照 |
MagicLizi
left a comment
There was a problem hiding this comment.
独立审查通过:iOS 选项 Sheet 改用 swift-ui BottomSheet,程序化关闭也能走到 onClosed,删除/重命名确认才能弹出。没有 P0/P1。
|
iOS 左滑「选项」里点删除像没反应,其实确认弹窗卡在 Sheet 关完的回调上。换成 swift-ui 的 onDismiss 之后,程序化关闭也能把球传下去。 |
这次改了什么
摘要
iOS 上左滑任务行 →「选项」→「删除任务」点了没有任何反应,确认弹窗不出现;
同一个 Sheet 里的「重命名任务」同样无响应。置顶 / 归档正常,会话详情页「…」里的
删除也正常,所以问题一直被当成偶发。
根因是
@expo/ui里两个都叫onDismiss的回调语义不同,代码接错了那个。iOS 不允许在 Sheet 关闭过程中 present 系统 Alert(会被吞掉),所以
useSessionListActions.ts刻意把删除 / 重命名拆成两拍:先关 Sheet,把后续弹窗存进
pendingSheetActionRef,等 Sheet 报告"我关完了"(onClosed)再弹。onClosed不触发 = 什么都不发生。而通用
@expo/uiBottomSheet 的onDismiss只由原生onIsPresentedChange派生,原生
BottomSheetView.swift里有一个防回环 guard:onClosedvisible=false)点「删除任务」永远走第二行,所以 Sheet 滑走了、确认弹窗永远躺在 ref 里。
这不是 Expo 的 bug——guard 是防回环的,那个
onDismiss语义就是"用户关的",不是"关完了"。纯回调不触发,不抛错、无日志,typecheck 和单测都看不见。
改法:直接用
@expo/ui/swift-ui的 BottomSheet,它把两个信号分开暴露:onIsPresentedChange→ 用户主动关闭,驱动onCloseonDismiss→ 对应 SwiftUI.sheet(onDismiss:),两种关闭方式都在 Sheet完全消失后触发,才是
onClosed的正确挂点内容 modifier(frame / padding / 拖拽把手 / fitToContents)与通用封装逐条对齐,视觉不变。
引入于 #3500——该 commit 同时把 iOS Sheet 换成
@expo/ui,又把删除从立即弹Alert 挪进了延迟路径,两个改动叠加才暴露。
变更类型
fix缺陷修复范围
SessionOptionsExpoSheet.tsx的 iOS Sheet 关闭时序修复 + 回归测试SessionActionSheet,本来就正常)、会话详情页SessionMenuSheet(走 RNSheetModal,不受影响)、device-link / 被控端写库链路(
invoke往右全程正常,请求压根没离开手机)UI 变化
尺寸、颜色与文案。内容 modifier(
frame/padding/presentationDragIndicator/fitToContents)按通用封装的原值逐条复刻,渲染结果与改动前一致。已在模拟器 Light / Dark 双模式实机目检确认外观未变。
怎么验证的
自动验证
新增回归测试
apps/mobile/src/__tests__/sessionOptionsExpoSheet.test.ts:钉死 iOS 路径必须用 swift-ui BottomSheet,且
onClosed由onDismiss驱动、不再挂在
onIsPresentedChange上。改前该测试失败,改后通过。手工验证
平台:iOS 26.5 iPhone 17 Pro 模拟器,iOS development client(非 Expo Go、
非分发包),bundle id
com.xd.cindy(Global)。pnpm mobile:sim:whoami -- --region=global→ PASS:booted dev client、本 worktree 的8081 Metro、源码指纹三者一致(
fix/mobile-ios-session-options-dismiss@77ccdc239+68f7b40dde)。worktree:
.cindy-worktrees/mobile-ios-delete-session;新建 dev client 由pnpm mobile:sim:rebuild产出(原装机为 7 月构建,缺ExpoNetwork原生模块)。A/B 对照(同一台设备、同一条 Maestro flow、同一个任务行):
端到端真实删除(不碰任何真实数据): 在手机端新建一次性任务
「throwaway session delete test」(
7c9e8853),左滑 →「选项」→「删除任务」→确认弹窗指名该任务 → 点「删除」→ 列表行消失。被控端数据库核对:
即写入真的落到了被控端,不只是控制端的乐观更新。
重命名:改后同一个 Sheet 里点「重命名任务」可正常打开
home.renameSession.modal(改前的负向对照未单独跑,见下)。双模式:Light / Dark 均实机目检 Sheet 外观,布局与危险色一致。
未执行的验证
pendingSheetActionRef延迟路径(代码层面同因),但我只验证了"改后可用"。pnpm test:all/ E2E 全量:改动只落在一个 iOS-only 展示组件,最终以 CI 门禁为准。
SessionActionSheet,本 PR 未触碰其代码路径。风险
风险分类
影响与回滚
SessionOptionsExpoSheet)。Android 分支提前 return 到
SessionActionSheet,零改动。apps/mobile/package.json依赖与 scripts、app.json/app.config.js、eas.jsonproduction 段、plugins/、modules/。@expo/ui版本未变,只是从包内
.子路径改用./swift-ui子路径导入,不改变 runtimefingerprint,存量装机可经 OTA 拿到。已按规则实测比对(
ci-fingerprint.mjs compute改动前后各跑一次),两次逐字节一致:
ios b69c311c6098a3adc4fc67bc0d9ef3410619ea05/android eded6b21982ef138c322702a95d8ec7b534de4d6。git revert单个 commit 即可,无数据迁移、无持久化状态。提交前检查
git commit -s)