# 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）

