Files
Genarrative/.hermes/skills/genarrative-profile-invite-flow/references/query-invite-code-flow-2026-05-07.md
历冰郁-hermes版 7e35231dfe
Some checks failed
CI / verify (pull_request) Has been cancelled
docs: sync genarrative shared skills
2026-05-08 17:39:49 +08:00

102 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
```