# Query 邀请码与新版 profile referral 入口关系(2026-05-07) ## 会话结论 用户指出:邀请码填写流程已经修改,登录窗口目前填写不了邀请码;邀请码填写被挪到了第一次登录后以及“我的”页签中。 因此后续回答或修改时不能只根据 `AuthGate` 里的旧逻辑判断“已支持”。 ## 当前代码观察 ### 旧 AuthGate 逻辑 文件:`src/components/auth/AuthGate.tsx` - `readInviteCodeFromLocation()` 读取 `window.location.search`。 - 支持 `inviteCode` / `invite_code`。 - 会 normalize 为大写字母数字。 - 写入 `pendingInviteCode`,传给 `RegistrationInviteModal`。 这只能说明“旧层仍有 query 读取”。 ### 新版 profile referral 入口 文件:`src/components/rpg-entry/RpgEntryHomeView.tsx` - “我的”页签标签为 `profile`。 - 兑换输入状态:`referralRedeemCode`。 - 打开填邀请码面板:`openProfilePopupPanel('redeem')`。 - 提交兑换:`submitReferralRedeemCode()`。 - 可显示快捷入口受 `canShowReferralRedeemShortcut` 控制。 文件:`src/services/rpg-entry/rpgProfileClient.ts` - `getRpgProfileReferralInviteCenter()` -> `GET /profile/referrals/invite-center` - `redeemRpgProfileReferralInviteCode(inviteCode)` -> `POST /profile/referrals/redeem-code` ## 回答口径 如果被问“是否支持 query 参数读取邀请码”,应回答: - 代码里仍有 query 读取,支持 `inviteCode` / `invite_code`。 - 但登录窗口不再填写邀请码。 - 新版入口在第一次登录后 / 我的页签;需要检查 `referralRedeemCode` 是否从 query 初始化。 - 若没有该连接,就不能说新版流程完整支持 query 预填。 ## 本次实现后的状态 已将 query 邀请码读取接入新版 `RpgEntryHomeView`: - `PROFILE_INVITE_QUERY_KEYS = ['inviteCode', 'invite_code']` - `normalizeProfileInviteQueryCode()`:去除非字母数字并转大写。 - `readProfileInviteCodeFromLocationSearch(window.location.search)`:读取 query 邀请码。 - `pendingProfileInviteCode`:组件初始化时读取 query。 - `referralRedeemCode`:用 `pendingProfileInviteCode` 初始化。 - `openProfilePopupPanel('redeem')`:打开“填邀请码”时重新写入 `pendingProfileInviteCode`,避免首次打开或重新打开时丢失 query 预填。 当前行为:只预填,不自动弹出“填邀请码”面板;用户仍需在“我的”页签点击“填邀请码”。 验证测试: ```bash cd npm test -- --run src/components/rpg-entry/RpgEntryHomeView.recharge.test.tsx npx eslint src/components/rpg-entry/RpgEntryHomeView.tsx src/components/rpg-entry/RpgEntryHomeView.recharge.test.tsx --max-warnings=0 node scripts/check-encoding.mjs ``` 测试用例:`profile redeem invite modal reads query invite code after login` 覆盖 `/?inviteCode=spring-2026` 预填为 `SPRING2026`。 ## 后续调整:带邀请码链接自动开窗 用户进一步明确期望: - 如果用户未登录,直接打开登录窗口。 - 如果用户已登录,直接打开邀请码填写窗口。 实现要点: - 在 `RpgEntryHomeView.tsx` 中保留 `pendingProfileInviteCode` 作为 query 邀请码来源。 - 新增 `autoOpenedInviteQueryRef = useRef(false)`,防止 effect 重复触发弹窗。 - 新增 `useEffect`: - 无 query 邀请码或已处理过则 return。 - 未登录:调用 `authUi?.openLoginModal()`。 - 已登录:设置 `referralRedeemCode`、清空 referral 错误/成功提示、`setProfilePopupPanel('redeem')`。 - 登录窗口仍不接收邀请码;邀请码只在登录后的 profile referral redeem 面板显示。 - 仍然只自动打开和预填,不自动提交兑换。 补充测试: - `invite query opens login modal for logged out users` - `invite query opens redeem modal directly for logged in users` - 原 `profile redeem invite modal reads query invite code after login` 同步调整为直接断言自动打开后的输入值。 验证命令仍为: ```bash cd npm test -- --run src/components/rpg-entry/RpgEntryHomeView.recharge.test.tsx npx eslint src/components/rpg-entry/RpgEntryHomeView.tsx src/components/rpg-entry/RpgEntryHomeView.recharge.test.tsx --max-warnings=0 node scripts/check-encoding.mjs ```