# Onboarding App Shell（任务清单）

> 说明：本清单根据 `plan.md` 拆解，要求“可执行、可验收、可标记”。  
> 标记规则：执行完成后将对应项从 `- [ ]` 改为 `- [x]`，并把“状态”改为 **已完成**；进行中改为 **进行中**；阻塞写明原因与解除条件。

## 0. 清单状态说明

- **状态**：未开始 / 进行中 / 已完成 / 阻塞
- **阻塞**：必须写明阻塞点与解除条件

## 1. 路由重构（不使用 Tabs）

- [ ] **移除 Tabs 导航结构，切换为 Stack + Header 入口**  
  - **状态**：未开始  
  - **范围**：`client/app/(tabs)/*`、`client/app/_layout.tsx`、新增 `client/app/(app)/*`、`client/app/(onboarding)/*`  
  - **要求**：
    - 首页为 `Home`（非 Tab）
    - 从 Home 的 Header 进入 `Favorites` 与 `Settings`
  - **验收**：启动后不出现 TabBar；可从 Home 进入收藏夹与设置

- [ ] **实现启动分发 `app/index.tsx`（按 onboarding 状态跳转）**  
  - **状态**：未开始  
  - **规则**：
    - `onboarding.completed=true`：进入 `/(app)/home`
    - 否则进入 `/(onboarding)/onboarding`
  - **验收**：首次启动进入 Onboarding；完成后重启直接进 Home

## 2. 本地存储与数据模型

- [ ] **封装 AsyncStorage 访问层（统一 key 与读写）**  
  - **状态**：未开始  
  - **Key**：
    - `onboarding.completed`
    - `push.promptState`
    - `content.reactions`
    - `favorites.items`
  - **验收**：读写都有类型约束；不会散落在 UI 代码里重复写 key

- [ ] **提供本地 mock 内容列表（带稳定 id）**  
  - **状态**：未开始  
  - **字段**：`id`、`text`  
  - **验收**：Home 可稳定渲染一条内容，并能切换到下一条（如实现）

## 3. Onboarding（3–5 页，全部可跳过）

- [ ] **实现 Onboarding 容器页（3–5 页）**  
  - **状态**：未开始  
  - **要求**：
    - 显示进度（例如 `2/4`）
    - 每页都有“下一步”与“跳过”
    - 任意页有“一键跳过整个 Onboarding”
  - **验收**：可从任意页跳过且不阻塞进入 PushPrompt

- [ ] **Onboarding 完成状态持久化**  
  - **状态**：未开始  
  - **要求**：完成或整体跳过时写入 `onboarding.completed=true`  
  - **验收**：重启 App 不再出现 Onboarding

## 4. PushPrompt（需要且可跳过）

- [ ] **实现 PushPrompt 页面**  
  - **状态**：未开始  
  - **按钮**：
    - 立即开启（触发系统权限申请）
    - 稍后（跳过）
  - **持久化**：
    - 立即开启：写入 `push.promptState=enabled`
    - 稍后：写入 `push.promptState=skipped`
  - **验收**：无论选择/权限结果如何，都能进入 Home

## 5. Home（点赞/讨厌）

- [ ] **实现 Home 页面（内容卡片 + Like/Dislike）**  
  - **状态**：未开始  
  - **要求**：
    - 展示一条 mock 内容
    - Like / Dislike 按钮明显
  - **验收**：点击 Like/Dislike 会写入本地记录

- [ ] **实现 Like=收藏规则**  
  - **状态**：未开始  
  - **规则**：
    - Like：记录 `content.reactions[id]='like'`
    - Like：将 `id` 追加到 `favorites.items`（去重）
    - Dislike：记录 `content.reactions[id]='dislike'`（不改变出现策略）
  - **验收**：Like 后收藏夹可见该内容；Dislike 仅记录不影响收藏

- [ ] **在 Home Header 加入入口：收藏夹、设置**  
  - **状态**：未开始  
  - **验收**：从 Home 可进入 Favorites 与 Settings

## 6. Favorites（仅展示，不可取消/清空）

- [ ] **实现 Favorites 页面（只读列表）**  
  - **状态**：未开始  
  - **要求**：
    - 展示 `favorites.items` 对应的内容
    - 不提供取消收藏/清空
  - **验收**：Like 的内容在此页可见；无取消入口

## 7. Settings（version + iOS 小组件说明文案）

- [ ] **实现 Settings 页面**  
  - **状态**：未开始  
  - **内容**：
    - version 信息行（仅 version）
    - iOS 小组件说明卡片（美观文案）
  - **验收**：页面可进入，信息展示正确，文案样式不突兀

## 8. i18n 文案补齐

- [ ] **补齐 Onboarding/Push/Home/Favorites/Settings 的 i18n key（至少 zh-CN/en）**  
  - **状态**：未开始  
  - **要求**：
    - key 点分层：`onboarding.*`、`push.*`、`home.*`、`favorites.*`、`settings.*`
    - 先覆盖 `zh-CN/en`，其余语言可后续逐步补齐
  - **验收**：页面不出现硬编码长句；主要文案可切换语言生效

## 9. 自测与验收

- [ ] **流程自测（首次/非首次）**  
  - **状态**：未开始  
  - **路径**：
    - 首次启动：Onboarding（逐页跳过/整体跳过）-> PushPrompt（开启/稍后）-> Home
    - 非首次：直接 Home
  - **验收**：与 `plan.md` 的验收清单一致

