refactor(chat): extract profile onboarding and rectification surface hooks

Close the home-page split by moving account/onboarding and rectification glue out of page.tsx without relocating React state, keeping the route static and hook order intact.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-02 05:56:47 +08:00
parent fbb80fa376
commit bf6989eccf
15 changed files with 920 additions and 527 deletions
+92
View File
@@ -0,0 +1,92 @@
# PROGRESS · 拆分首页巨石组件·第三批:onboarding/profile 与校正胶水(2026-09-01
工作树:`.worktrees/home-split-batch3-20260901`
分支:`codex/home-split-batch3-20260901`
基线:`origin/staging` @ `80e77361`(含报告语气 PR #48 与出生精度 PR #49)。`551d6317` 之后 **没有** 未验收的 `page.tsx` 改动:`git log 551d6317..origin/staging -- frontend/src/app/page.tsx` 为空。
不要写成 `PROGRESS.md`。本轮未提交、未推送。
React Compiler 仍关。未引入 context/store。无手写 `useCallback`/`useMemo`。自定义 hook 内部 **0**`useState` / `useRef` / `useEffect``site-styles` import 仍在 `page.tsx` 顶。`const BirthTimeRectification = dynamic(...)` 未动。
脏树未碰:`yinduzhanxing` @ `codex/minute-rectification-p0``.worktrees/fix-general-daily-20260815` 仍有本地 `page.tsx` 残留。
## 度量
| 项 | 拆前(第二批后 2445 / staging 同文件) | 拆后 | 说明 |
| --- | ---: | ---: | --- |
| `frontend/src/app/page.tsx` 行数 | 2445 | 1997 | 目标 ≤2000,达标 |
| `useState(` Home / profile hook / rectification hook | 26 / — / — | 26 / 0 / 0 | 独占 state 未下移 |
| `useRef(` Home / profile / rectification | 19 / — / — | 19 / 0 / 0 | 同上 |
| `useEffect(` Home / profile / rectification | 20 / — / — | 20 / 0 / 0 | 拉取/恢复 effect 仍在 Home |
| `/` 路由 | `○ Static` | `○ Static` | webpack `next build --webpack` |
| 首屏 JS gzip -9 | 第二批 501104 B | 503980 B = 492.2 KB | +2876 B / **+0.57%**(±2% 内) |
| 前端测试 | staging 高于 2428 | **2460** | fail=0 skipped=0 |
gzip 相对第二批的 +0.57% 含 `80e77361` 已合入的语气/精度前端,不单是本次搬家。同 SHA 干净树未再打一份对照包。
本批按任务书收官:starter 三函数、合盘起草、composer 小函数仍留在 `Home`
## Hook 调用顺序(红线 1
`useRouter``useState`×26 → `useRef`×19 → `useBirthTimeGuidedJourney``useSessionManagement``useProfileOnboarding``useRectificationSurface``useEffect`×8 → `useConversationScrollAnchor``useConsultationRun` → 其余 `useEffect`
新增的两个 hook **内部零 React hook**`useState`/`useRef`/`useEffect` 在 Home 里的相对次序与搬前相同。
| 调用点 | 位置 | 原因 |
| --- | --- | --- |
| `useSessionManagement` | `useBirthTimeGuidedJourney` 之后 | 第二批已定;`openRectificationSession` 经模块级 holder 转发给尚未声明的校正 hook |
| `useProfileOnboarding` | session hook 之后、第一条 `useEffect` 之前 | 账户/引导函数要给校正 hook 与咨询 hook |
| `useRectificationSurface` | profile hook 之后、第一条 `useEffect` 之前 | `persistSession` / `updateSession` / `refreshAccount` / `openAccountDialog` 已齐 |
依赖方向:session → Home → profile / rectification / consult。四个 hook 文件 **不得、也没有** 互相 import。
跨声明顺序的回调用 **模块级 `{ current }` 对象**,不是新的 `useRef`(避免改变 Home hook 数量):
- `rectificationSessionOpener`session hook 的 `openRectificationSession` 转发到校正 hook
- `guidedBirthTimeReady` / `editDeclaredBirthTimeDetailsHolder``useBirthTimeGuidedJourney` 早于 profile hook,原函数声明提升不再可用
`setDraft` 等仍是 `Home` 内 function declarationJS 提升),可出现在 hook 参数里。
## 任务 12 · 搬家
函数体相对 `80e77361:frontend/src/app/page.tsx` 去缩进后逐行 **IDENTICAL**22/22):
| 文件 | 行 | 内容 |
| --- | ---: | ---: |
| `frontend/src/hooks/use-profile-onboarding.ts` | 424 | `refreshAccount``signOut` |
| `frontend/src/hooks/use-rectification-surface.ts` | 306 | `refreshRectificationEntrySummary``handleRectificationMessagesChange`(含 `resumeRectificationSession.current =` |
公证抽样(全部 22 个,不少于 4):`refreshAccount` 19、`persistProfile` 41、`saveOnboardingName` 22、`openRectificationCase` 105、以及其余 18 个均为 IDENTICAL。改名清单:**零**。
仍留在 Home`chooseSuggestedQuestion` / `startSuggestedConsultation` / `startDailyStarlanguageConsultation``draftSynastryQuestionFromChart` 及之后、`copyAssistantMessage` / `handleComposerKeyDown``send`/`submit` 已在第二批进咨询 hook。
## 合同测试路径(同一 token,只换读取面)
拼接件扩容:可选 `use-profile-onboarding.ts` / `use-rectification-surface.ts`
| 测试 | 原路径 | 新路径 |
| --- | --- | --- |
| `profile-state.test.ts` `refreshAccount` 切片 | 已是 `homeSurface` | 仍 `homeSurface`(函数已进 profile hook;去掉未用的 `readFileSync` |
| `profile-persistence.test.ts` `persistProfile` | 已是 `homeSurface` | 仍 `homeSurface` |
| `birth-time-assessment-loading.test.ts` `saveOnboardingBirth`/`Place` | `page.tsx` + overlay | `homeSurface` + overlay |
| `birth-time-guided-review-fixes.test.ts` 终端 CJK | `homeSurface` | 仍 `homeSurface` |
| `chat-navigation-a11y` sign-out 切片 | `homeSurface`,终点 `chooseSuggestedQuestion`(仍在 page,拼在 hook **之前** | 终点改为 profile hook 的 `return { refreshAccount`(断言内容未改) |
| `rectification-agentic-entry` `handleRectificationProfileIncomplete` | 终点 `draftSynastryQuestionFromChart`(仍在 page) | 终点改为仍相邻的 `handleRectificationMessagesChange` |
| `tests/test_daily_and_rectification_entrypoints.py` `openRectificationFromHomepage` | `PAGE`+starter+cloud | 若存在则拼接 rectification hook |
| 三个 Python `_home_surface()` | 可选 session/consult hook | 再列入两个新 hook |
## 验证
- `./node_modules/.bin/tsc --noEmit`:通过。
- 全量 `npm test`**2460 pass / 0 fail / 0 skipped**。
- Python`test_session_management_entrypoints.py``test_supabase_user_data_contract.py``test_birth_time_journey_contract.py``test_daily_and_rectification_entrypoints.py` 全绿。
- `./node_modules/.bin/next build --webpack``┌ ○ /` Static。首屏 JS gzip-9 503980 B vs 第二批 501104 B+0.57%)。
- 行为抽查:无登录态浏览器点选会话 / 发送咨询。搬家由源码合同锁住。
未改 `.gitea/workflows/**`。未动数据库。未提升 `main`。未重开 React Compiler。未提交。
## 明确未做
- 合盘起草与 composer 小函数(任务书本批不动)。
- 未把 onboarding/profile/rectification **state** 下移进 hook。
- 引擎运行时治理在独立 worktree `engine-runtime-hygiene-20260901`,不碰 `page.tsx`