Skip to content

Commit 26b1803

Browse files
authored
fix: stabilize miniapp transfer flow and UX consistency (#430)
1 parent 27d9c23 commit 26b1803

39 files changed

Lines changed: 73381 additions & 67840 deletions

AGENTS.md

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,15 @@ gh pr merge <pr#> --squash --delete-branch
115115

116116
> 目标:避免“围绕 DOM 修修补补”导致的路径爆炸;用可验证的状态机 + 纯函数绑定 DOM。
117117
118+
### 0) 开工前必读(强制)
119+
120+
- 涉及 **状态文案 / 错误文案 / i18n** 的任务,开始编码前必须先阅读:
121+
- `docs/white-book/09-i18n-Ref/03-Action-Status-Copy.md`
122+
- 不得依赖 CI 才发现“语义模糊”问题;开发阶段必须先做文案语义自检:
123+
- 当前文案是否准确反映真实阶段(签名 / 广播 / 上链确认)
124+
- UI 是否直接透出底层 `error.message`
125+
- 是否已有统一错误映射与最小回归测试
126+
118127
### 1) 状态机优先(State-first)
119128

120129
- 先把“控制层状态”定义清楚(例如:miniapp 是 `active/backgrounded`,sheet 是否 `pending/visible/resolved`)。
@@ -162,5 +171,3 @@ Use `@/openspec/AGENTS.md` to learn:
162171
- Project structure and guidelines
163172

164173
Keep this managed block so 'openspec update' can refresh the instructions.
165-
166-
<!-- OPENSPEC:END -->

docs/white-book/00-Manifesto/07-Best-Practices.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,5 @@
3030
- CSS Modules 与 Tailwind 混用:`className={cn(styles.header, 'sticky top-0 z-10 px-5')}`
3131
- 优先级:CSS Modules > globals.css,组件样式应内聚到组件目录
3232
- ❌ as TypeAssertion → ✅ z.looseObject().safeParse() 验证外部 API 响应
33+
-`确认中`(模糊状态) → ✅ 使用阶段化文案(`签名中/广播中/等待上链`),详见 `09-i18n-Ref/03-Action-Status-Copy.md`
3334
- ❌ z.record(z.record(...)) → ✅ z.record(z.string(), z.record(z.string(), schema))(Zod 4 嵌套 record 需显式 key 类型)
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
# 动作文案与状态语义规范
2+
3+
> 目标:减少“文案看起来通过了,但语义误导用户”的问题。
4+
5+
---
6+
7+
## 背景
8+
9+
在交易、签名、授权等高风险流程中,`确认中` 这类模糊文案会掩盖真实阶段(例如:实际处于广播中)。
10+
这类问题通常无法通过 lint / i18n key check 自动发现,必须在开发阶段做语义自检。
11+
12+
---
13+
14+
## 核心原则
15+
16+
### 1) 状态文案必须反映真实阶段
17+
18+
- ❌ 模糊:`确认中`
19+
- ✅ 明确:`广播中` / `等待上链` / `签名中`
20+
21+
**规则**:文案要回答两个问题:
22+
1. 当前动作是什么?(签名 / 广播 / 上链确认)
23+
2. 谁在执行?(本地钱包 / 链网络)
24+
25+
### 2) UI 不直接透出底层硬编码错误
26+
27+
- ❌ 直接显示:`Failed to broadcast transaction`
28+
- ✅ 映射到 i18n:`transaction:broadcast.failed`
29+
30+
**规则**:底层 `error.message` 仅用于日志;展示给用户时必须走错误映射层。
31+
32+
### 3) 一次异步动作只能有一个主状态文案
33+
34+
- 同一时刻只显示一个“主进度词”(例如 `广播中`)。
35+
- 不得在同一阶段混用 `确认中` + `广播中` 两套术语。
36+
37+
---
38+
39+
## 推荐状态词典(转账示例)
40+
41+
| 阶段 | 推荐 key | 说明 |
42+
|------|----------|------|
43+
| 本地签名 | `common:signing` | 钱包锁/私钥验证与签名中 |
44+
| 广播交易 | `transaction:txStatus.broadcasting` | 向网络广播交易 |
45+
| 等待区块确认 | `transaction:txStatus.confirming` | 广播成功后等待上链确认 |
46+
| 失败 | `transaction:broadcast.failed` / `transaction:broadcast.timeout` | 用户可理解并可行动 |
47+
48+
---
49+
50+
## 开发约束
51+
52+
### MUST
53+
54+
- 所有用户可见状态/错误文案必须可 i18n。
55+
- 交易类流程必须区分 `签名``广播``确认` 三阶段。
56+
- 对底层错误进行统一映射(code + message pattern)。
57+
58+
### SHOULD
59+
60+
- 使用纯函数做“错误 -> 文案 key”映射,便于测试。
61+
- 为映射层补单测(timeout、broadcast failed、unknown 等)。
62+
63+
### MUST NOT
64+
65+
- 在 UI 直接渲染英文异常文本。
66+
- 用“确认中”替代所有异步状态。
67+
68+
---
69+
70+
## AI 开发前自检清单
71+
72+
在改动任何状态文案/错误文案前,先逐条确认:
73+
74+
1. 该文案是否准确描述当前真实阶段?
75+
2. 是否存在更具体的阶段词可用(签名/广播/确认)?
76+
3. 是否仍有 `error.message` 直出到 UI?
77+
4. 是否为新增映射补了最小回归测试?
78+
5. 四语种(zh-CN/en/zh-TW/ar)是否补齐 key?
79+

docs/white-book/09-i18n-Ref/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
|------|------|
99
| [01-Language-Support](./01-Language-Support.md) | 支持语言、检测规范、翻译资源 |
1010
| [02-Localization](./02-Localization.md) | 数字/日期格式化、术语表 |
11+
| [03-Action-Status-Copy](./03-Action-Status-Copy.md) | 高风险动作文案与错误映射规范 |
1112

1213
---
1314

0 commit comments

Comments
 (0)