Files
mindfulness/spec_kit/Splash Consent/plan.md
2026-01-29 23:31:12 +08:00

113 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Splash Consent技术计划
## 1. 计划目标
实现客户端开屏页Splash/Welcome与首次协议同意逻辑
- 使用 `client/assets/images/index/` 的图片作为主视觉(例如 `index_flowers.png`
- 底部渐变按钮颜色:`#F69F7B → #F99CC0`
- 按钮下方提供「隐私协议」「用户使用协议」外部链接入口(先用占位链接)
- **仅首次出现按钮**:当 `consent.accepted=true` 后不再展示同意按钮与协议入口
- 同意后进入现有启动分发:`app/index.tsx`(继续走 Onboarding/App Shell
## 2. 默认技术决策
- **路由**:沿用 `expo-router`
- **持久化**:沿用 `AsyncStorage`
- **协议打开方式**:外部链接(`expo-web-browser``Linking.openURL`
- **渐变实现**:使用 `expo-linear-gradient`Expo 官方)
## 3. 路由与流程设计
### 3.1 新增路由
- `app/(splash)/splash.tsx`:开屏页(图片 + 首次同意按钮/协议入口)
- `app/(splash)/_layout.tsx`:可选(一般无需 header
### 3.2 启动分发逻辑(与现有流程集成)
当前已存在启动分发 `app/index.tsx`(根据 `onboarding.completed` 跳转)。
本需求将启动分发扩展为两段判断:
1.`consent.accepted !== true`:跳转到 `/(splash)/splash`
2.`consent.accepted === true`:沿用原逻辑(进入 Onboarding 或 `/(app)/home`
> 注意:你确认的是“隐藏按钮而不是隐藏页面”。因此当 `consent.accepted=true` 时,开屏页不需要停留;可直接跳过该页进入原启动分发。
## 4. 数据与持久化
### 4.1 Key
- `consent.accepted`: boolean
### 4.2 存储封装
在现有 `src/storage/appStorage.ts` 中补充:
- `getConsentAccepted(): Promise<boolean>`
- `setConsentAccepted(accepted: boolean): Promise<void>`
并确保所有 UI 不直接硬编码 key。
## 5. UI 细节与交互
### 5.1 开屏布局(建议)
- 主视觉图片:
- 使用 `index_flowers.png`
- 适配:`resizeMode="contain"` 或按实际视觉调整(不裁切关键内容)
- 底部区域(贴近安全区):
- 渐变按钮(圆角、阴影/投影轻微)
- 协议入口(两段文字按钮,左右排列或一行内间隔)
### 5.2 渐变按钮(仅首次出现)
- 展示条件:`consent.accepted !== true`
- 点击行为:
- 写入 `consent.accepted=true`
- 跳转到 `/`(触发 `app/index.tsx` 继续分发)
### 5.3 协议入口(外部链接,先占位)
- 「隐私协议」:`https://example.com/privacy`
- 「用户使用协议」:`https://example.com/terms`
打开方式:
- 优先:`expo-web-browser` 打开外部链接
- 兜底:`Linking.openURL`
## 6. i18n 文案
新增 key至少 `zh-CN/en`,其余语言可逐步补齐):
- `consent.title`(可选)
- `consent.agree`(按钮文案:同意并继续)
- `consent.privacy`(隐私协议)
- `consent.terms`(用户使用协议)
## 7. 实施步骤
1. 新增 `consent.accepted` 的存储读写方法
2. 新增 `/(splash)/splash` 页面(图片 + 渐变按钮 + 协议入口)
3. 修改 `app/index.tsx`:在 onboarding 分发前插入 consent gate
4. 接入 `expo-linear-gradient` 并完成按钮 UI
5. 接入外部链接打开(先占位 URL
6. 补齐 i18n key至少 zh-CN/en
7. 自测:
- 首次启动:显示按钮与入口;同意后进入 Onboarding/App
- 再次启动:不再出现同意按钮,直接进入后续流程
## 8. 验收标准
- 首次启动:
- 展示开屏图片
- 渐变按钮颜色正确(`#F69F7B → #F99CC0`
- 协议入口可点击并打开外部链接
- 点击同意后进入后续流程
- 非首次启动:
- 不再出现同意按钮与协议入口
- 直接进入后续流程Onboarding/App Shell