| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| app | ||
| components | ||
| ds | ||
| hooks | ||
| lib | ||
| stores | ||
| instrumentation-client.ts | ||
| instrumentation.ts | ||
| sentry.edge.config.ts | ||
| sentry.server.config.ts |
复现条件: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>
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| app | Loading commit data... | |
| components | Loading commit data... | |
| ds | Loading commit data... | |
| hooks | Loading commit data... | |
| lib | Loading commit data... | |
| stores | Loading commit data... | |
| instrumentation-client.ts | Loading commit data... | |
| instrumentation.ts | Loading commit data... | |
| sentry.edge.config.ts | Loading commit data... | |
| sentry.server.config.ts | Loading commit data... |