Commit 16e2134b by luoqi

fix(登录): 带 code 进 /plans 时卡在「正在进入召回工作台…」

复现条件:localStorage **已经有票**(第二次进来)+ URL 带 ?code=。
干净浏览器不复现,所以第一次测没发现。

时序:
  ① store 反水合 → isAuthenticated 立刻 true → AuthGate 放行 children
  ② /plans 落地解析器跑起来 → 主管 → router.replace('/supervisor')
  ③ `await exchangeCode()` 才回来,然后 replaceState 把地址写回 /plans

③ 把 ② 那次跳转冲掉了 —— Next 的路由树被拉回 plans(实测 history.state 里
`__PRIVATE_NEXTJS_INTERNALS_TREE` 停在 plans),而解析器已经 return、不会再试,
于是永远停在占位文案上。

⇒ 剥 code 与 exchange 成不成功无关,提到 await **之前**做。本 effect 跑在首次提交上
(那时 mounted 还是 false、children 尚未挂载),任何页面的落地跳转都必然在它之后,
不会再被回写覆盖。
️ replaceState 第二个参数改传 window.history.state 而不是 `{}` ——
   App Router 的路由树就存在 history state 里,传空对象等于把它抹掉。

实测三种都过:
  已登录 + /plans?code=        → 落 /supervisor
  已登录 + /plans?exec=1&code= → 走执行页(exec=1 没被剥 code 时一起吃掉)
  清空 storage + /plans?code=  → 落 /supervisor

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
parent 2aedd46d
Pipeline #3556 failed in 0 seconds