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

4.2 KiB
Raw Blame History

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 预填。

当前行为:只预填,不自动弹出“填邀请码”面板;用户仍需在“我的”页签点击“填邀请码”。

验证测试:

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 同步调整为直接断言自动打开后的输入值。

验证命令仍为:

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