Skip to content

feat(mobile): 置顶任务使用绿色圆角分区并修复刷新状态回退 - #5208

Open
guyi-dit wants to merge 3 commits into
makecindy:mainfrom
guyi-dit:feat/mobile-pinned-section
Open

guyi-dit wants to merge 3 commits into
makecindy:mainfrom
guyi-dit:feat/mobile-pinned-section

Conversation

@guyi-dit

@guyi-dit guyi-dit commented Sep 28, 2026 •

Copy link
Copy Markdown

这次改了什么

摘要

手机端置顶任务此前主要依赖行尾小图标,与普通任务区分不够明显。现在置顶任务共享绿色圆角分区,收起后只保留绿色标题栏、数量和展开入口,支持深浅主题。

同时修复验收中发现的两个问题:模拟标签接口返回不完整导致「更多」菜单崩溃;取消置顶完成后,较早的列表响应可能覆盖新状态。

评审修正:mock 元数据修改保留 updatedAt,旧标签颜色 none 在创建/更新时归一为 white 且不列入 supportedColors;收起置顶栏的无障碍名称包含正在运行的任务数。

变更类型

  • feat 新功能
  • fix 缺陷修复
  • docs / test 文档与测试

范围

  • 关联需求:手机端置顶分区明显区分,支持收起、展开和深浅主题。
  • 包含:首页/任务侧栏置顶样式、滑动操作底色、主题 token、五种语言文案、设计规范、模拟标签与元数据接口、旧快照覆盖回归修复。
  • 不包含:服务端变更、原生依赖变更、发布或合并。
  • breaking change:无。

UI 变化

  • 引用的设计规范:docs/design-rules/DESIGN.md §2 “Mobile pinned task group (user-approved 2026-09-28)”及 §5 交互约束。独立语义 token 同时定义深浅色;展开/收起圆角限定在置顶分区,标题点击区域至少 44px,收起高度 52px;保留虚拟列表与滑动操作,普通任务背景不变。
  • iOS 27.0 / iPhone 17 Pro 模拟器截图(合成验收数据),作为 PR 附件保存,当前代码树不含截图文件。
浅色收起 深色展开
浅色收起 深色展开

怎么验证的

自动验证

  • corepack pnpm --filter mobile typecheck:通过。
  • 本轮 corepack pnpm --filter mobile exec vitest run src/__tests__/visualMock.test.ts src/__tests__/homeSections.test.ts src/__tests__/remoteSessionStore.test.ts:298 项通过(含 updatedAt 保持不变、none 创建/更新/关联读取归一化回归)。
  • 提取实际 JSX 无障碍名称表达式,检查收起/展开 × 有/无运行任务共 4 种状态:通过;不等同于 VoiceOver 实机验证。
  • 置顶视觉改动前一轮定向验证:128 项通过,包含主题与滑动行相关检查。
  • node scripts/check-dco.mjs --base origin/main --head HEAD:三个 commit 均通过签名检查。
  • git diff --check:通过。

手工验证

  • iOS Debug 0.1.0 (2026072301):深浅主题、展开/收起、多条/单条/零条置顶、左右滑动、更多菜单、创建绿色标签并关联、取消置顶 7→6 与重新置顶 6→7、归档/筛选/恢复、重命名均实测通过。
  • 生产数据验收:需求方于 2026-09-28 明确确认“生产数据验收通过”;此项为用户确认,不冒充 Agent 独立复验。
  • 本地分支 feat/mobile-pinned-section;Metro 8081 属于当前 checkout,验收源码标识为 f0fa3f763+7839e5d2a0,修改后确认新 iOS Bundled。该记录对应此前视觉验收;2026-09-29 的 P2 修正完成自动验证,未重新进行模拟器完整走查。
  • Baguette 专用模拟器安装指纹与当前开发指纹一致:b9981f81167645b5a76b397e422cd492e20ba6a7。标准 whoami 只枚举默认设备集合,因此单独核验专用设备原生安装;Metro 检查为 target-fresh。

未执行的验证

  • 未运行整仓测试;完整门禁由 CI 执行。
  • Android、iPad、横屏未人工复验;Android 滑动底色使用相同语义 token。
  • 未单独留存新建任务页 DEV build label 截图;源码归属使用标准 Metro 身份检查与新 bundle 日志核对。
  • 标签编辑/解除关联/删除及冲突由接口回归测试覆盖,未逐项人工点按。

风险

风险分类

  • 跨平台差异
  • 其他:会话列表元数据写入与刷新同步

影响与回滚

  • 影响范围:Mobile 置顶列表与本地元数据写入后的快照失效判断;模拟接口只在开发模拟模式使用,重载后重置。
  • 无 SQLite migration、wire protocol、权限或原生配置改动,不改变 runtime fingerprint。
  • 回滚:回退本 PR 的三个 commit;无数据迁移。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名
  • UI 变化已引用设计规范
  • 未提交凭证、令牌或授权文件;截图仅含合成数据,当前代码树无截图文件
  • 已同步相关设计文档
  • 已记录验证结果与未执行项

@guyi-dit
guyi-dit requested a review from a team as a code owner September 28, 2026 15:39
@greptile-apps

greptile-apps Bot commented Sep 28, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 4/5

[Medium risk] Adds pinned task group styling and fixes refresh state handling.

本 PR 没有发现阻止合并的生产路径缺陷,但建议修正模拟验收偏差和收起态无障碍摘要。

Findings

  1. P2 模拟写入改变任务排序 ▶
  2. P2 模拟标签颜色与真实接口不一致 ▶
  3. P2 运行摘要未进入无障碍标签 ▶
Fix with agent prompt
### Issue 1
apps/mobile/src/debug/visualMockSessionState.ts:43
模拟端执行 `patch-meta` 时,总会把 `updatedAt` 改成当前时间;真实桌面端的这条写入路径不更新时间。仅取消置顶或重命名一个旧任务,就会让它在模拟列表中变成最近活动任务,影响列表排序的验收结果。

```suggestion
    const updated = { ...current, ...patch };
```

### Issue 2
apps/mobile/src/debug/visualMockSessionState.ts:78
使用合法的 `none` 颜色创建或修改标签时,模拟接口会原样保存并返回 `none`,还将它列入 `supportedColors`。真实接口会将它转为 `white`,且不会将 `none` 列为可用颜色。这使模拟模式无法可靠验收白色标签的行为。

### Issue 3
apps/mobile/src/session/HomeSurface.tsx:2706-2709
收起时新增的“运行中”数量只显示在标题栏内,但标题栏是一个带有显式 `accessibilityLabel` 的按钮,该标签仍只包含置顶总数。屏幕阅读器访问按钮时无法获知运行中数量;请将该摘要加入收起态的无障碍标签。

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.
Summary

本 PR 为手机端首页及常驻任务侧栏增加深浅主题下的绿色置顶分区、收起态摘要和滑动底色,并为模拟标签与会话元数据接口增加可变状态,同时调整列表刷新失效栅栏。

  • 模拟接口有两处与真实桌面接口不一致的行为,会影响验收结果。
  • 收起态新增的运行摘要尚未体现在标题栏无障碍标签中。
Diagram
%%{init: {'theme': 'neutral'}}%%
flowchart LR
  A[置顶任务数据] --> B[首页分区]
  B --> C[绿色标题栏与会话行]
  C --> D[展开、收起及滑动操作]
  E[元数据写入] --> F[列表变更 epoch]
  F --> G[丢弃旧列表响应并重新读取]
Loading

Reviews (1) · Last reviewed commit: "fix(mobile): preserve pinned mutations a..."

(patch.title !== undefined && (!patch.title.trim() || patch.title.length > 500)) ||
(patch.status !== undefined && !["active", "archived", "deleted"].includes(patch.status)) ||
(patch.pinnedAt != null && !Number.isFinite(Date.parse(patch.pinnedAt)))) fail("INVALID_PARAMS");
const updated = { ...current, ...patch, updatedAt: new Date().toISOString() };

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 模拟写入改变任务排序
模拟端执行 patch-meta 时,总会把 updatedAt 改成当前时间;真实桌面端的这条写入路径不更新时间。仅取消置顶或重命名一个旧任务,就会让它在模拟列表中变成最近活动任务,影响列表排序的验收结果。

Suggested change
const updated = { ...current, ...patch, updatedAt: new Date().toISOString() };
const updated = { ...current, ...patch };
Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/mobile/src/debug/visualMockSessionState.ts
Line: 43

Comment:
**模拟写入改变任务排序**
模拟端执行 `patch-meta` 时,总会把 `updatedAt` 改成当前时间;真实桌面端的这条写入路径不更新时间。仅取消置顶或重命名一个旧任务,就会让它在模拟列表中变成最近活动任务,影响列表排序的验收结果。

```suggestion
    const updated = { ...current, ...patch };
```

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

do { id = "visual-tag-" + ++this.nextTagId; } while (this.tags.some((t) => t.id === id));
id = request.presetId ?? id;
if (this.tags.some((t) => t.id === id)) fail("ALREADY_EXISTS");
this.tags.push({ id, name: request.name.trim(), color: request.color, favoriteOrder: order,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 模拟标签颜色与真实接口不一致
使用合法的 none 颜色创建或修改标签时,模拟接口会原样保存并返回 none,还将它列入 supportedColors。真实接口会将它转为 white,且不会将 none 列为可用颜色。这使模拟模式无法可靠验收白色标签的行为。

Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/mobile/src/debug/visualMockSessionState.ts
Line: 78

Comment:
**模拟标签颜色与真实接口不一致**
使用合法的 `none` 颜色创建或修改标签时,模拟接口会原样保存并返回 `none`,还将它列入 `supportedColors`。真实接口会将它转为 `white`,且不会将 `none` 列为可用颜色。这使模拟模式无法可靠验收白色标签的行为。

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Comment on lines +2706 to +2709
{pinnedCollapsed && pinnedRunningCount > 0 ? (
<Text style={styles.pinnedCount} numberOfLines={1}>
{t('session.row.pinnedRunning', { count: pinnedRunningCount })}
</Text>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 运行摘要未进入无障碍标签
收起时新增的“运行中”数量只显示在标题栏内,但标题栏是一个带有显式 accessibilityLabel 的按钮,该标签仍只包含置顶总数。屏幕阅读器访问按钮时无法获知运行中数量;请将该摘要加入收起态的无障碍标签。

Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/mobile/src/session/HomeSurface.tsx
Line: 2706-2709

Comment:
**运行摘要未进入无障碍标签**
收起时新增的“运行中”数量只显示在标题栏内,但标题栏是一个带有显式 `accessibilityLabel` 的按钮,该标签仍只包含置顶总数。屏幕阅读器访问按钮时无法获知运行中数量;请将该摘要加入收起态的无障碍标签。

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@MagicLizi

Copy link
Copy Markdown
Contributor

本 PR 命中维护者确认门(产品 / UI 变更 + 审查规则文档变更),需要维护者确认后才能继续走自动审查与合并流程。

  • 改动摘要:手机端置顶任务改用绿色圆角分区(新语义 token、收起 / 展开交互、深浅主题、滑动操作底色),并修复模拟标签接口返回不完整导致的「更多」菜单崩溃、取消置顶后旧列表响应覆盖新状态两个问题;同时在 docs/design-rules/DESIGN.md 新增对应的 Mobile pinned task group 规则段落。
  • 为何需确认:这是新增产品 UI 行为 + 审查判据(设计规则文档)变更,不属于既有语义下的 bugfix / 纯技术改动,因此不做语义豁免。

讨论 issue:#5209

确认方式:请维护者直接在本 PR 上 Approve;如需修改请 Request Changes,作者改完后再 Approve。

@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示) labels Sep 28, 2026
Signed-off-by: VUVUDOG <gtan2008@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting-discussion 等待维护者讨论(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