102 lines
4.2 KiB
Markdown
102 lines
4.2 KiB
Markdown
# 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 <repo-root>
|
||
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 <repo-root>
|
||
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
|
||
```
|