fix: show bound invite referrer

This commit is contained in:
zhx 2026-07-01 14:37:24 +08:00
parent 224808a3e3
commit f7a3a68a1d
3 changed files with 136 additions and 19 deletions

View File

@ -313,9 +313,9 @@
})(); })();
</script> </script>
<script src="../../common/i18n.js?v=20260606-1"></script> <script src="../../common/i18n.js?v=20260606-1"></script>
<script src="../../common/api.js?v=20260630-invite-code"></script> <script src="../../common/api.js?v=20260701-invite-referrer"></script>
<script src="../../common/params.js?v=20260611-invite-referrer"></script> <script src="../../common/params.js?v=20260611-invite-referrer"></script>
<script src="../../common/toast.js"></script> <script src="../../common/toast.js"></script>
<script src="./script.js?v=20260630-bind-window"></script> <script src="./script.js?v=20260701-bound-referrer"></script>
</body> </body>
</html> </html>

View File

@ -33,12 +33,16 @@
serverTimeMS: 0, serverTimeMS: 0,
pendingInviteCode: '', pendingInviteCode: '',
searchedInviter: null, searchedInviter: null,
boundInviter: null,
boundInviterLoaded: false,
boundInviterLoading: null,
inviteRewardStatus: null, inviteRewardStatus: null,
rankRows: [], rankRows: [],
rankLoaded: false, rankLoaded: false,
rankLoading: false, rankLoading: false,
searchingInviter: false, searchingInviter: false,
bindingInviter: false, bindingInviter: false,
viewingBoundInviter: false,
claiming: {}, claiming: {},
}; };
@ -216,6 +220,7 @@
function canShowBindInviteButton() { function canShowBindInviteButton() {
var api = window.HyAppAPI || {}; var api = window.HyAppAPI || {};
var hasToken = api.getAccessToken && api.getAccessToken(); var hasToken = api.getAccessToken && api.getAccessToken();
if (state.boundInviter) return true;
if (hasToken && !state.currentUserTimingLoaded) return false; if (hasToken && !state.currentUserTimingLoaded) return false;
var current = state.currentUser || {}; var current = state.currentUser || {};
var createdAtMS = var createdAtMS =
@ -306,6 +311,53 @@
renderBindInviteVisibility(); renderBindInviteVisibility();
} }
function applyBoundInviteReferrer(payload) {
var invite = payload && (payload.invite || payload.Invite);
var inviter = normalizeInviter(payload, '');
if (!inviter) {
state.boundInviter = null;
renderBindInviteVisibility();
return;
}
inviter.inviteCode =
textValue(
firstObjectValue(invite, [
'invite_code',
'inviteCode',
'my_invite_code',
'myInviteCode',
])
) || inviter.inviteCode;
state.boundInviter = inviter;
state.searchedInviter = inviter;
renderBindInviteVisibility();
}
function loadBoundInviteReferrer() {
var api = window.HyAppAPI && window.HyAppAPI.user;
var rootAPI = window.HyAppAPI || {};
if (state.boundInviterLoading) return state.boundInviterLoading;
if (
!api ||
!api.getInviteReferrer ||
!rootAPI.getAccessToken ||
!rootAPI.getAccessToken()
) {
state.boundInviterLoaded = true;
return Promise.resolve();
}
// 已绑定关系必须每次从服务端读取;本地只缓存展示结果,避免刷新后重新进入搜索绑定流程。
state.boundInviterLoading = api
.getInviteReferrer()
.then(applyBoundInviteReferrer)
.catch(function () {})
.then(function () {
state.boundInviterLoaded = true;
state.boundInviterLoading = null;
});
return state.boundInviterLoading;
}
function loadCurrentUser() { function loadCurrentUser() {
var api = window.HyAppAPI || {}; var api = window.HyAppAPI || {};
var userAPI = api.user || api.users; var userAPI = api.user || api.users;
@ -943,16 +995,18 @@
return ''; return '';
} }
function openBindModal() { function showBoundInviterModal() {
if (!canShowBindInviteButton()) { if (state.boundInviter) {
renderBindInviteVisibility(); state.pendingInviteCode = '';
return; state.searchedInviter = state.boundInviter;
state.searchingInviter = false;
state.bindingInviter = false;
showBindResult(state.boundInviter, { bound: true });
$('#bindInviteModal').hidden = false;
} }
var api = window.HyAppAPI || {};
if (!api.getAccessToken || !api.getAccessToken()) {
toast(t('invite.loginRequired', 'Please log in first'));
return;
} }
function showBindSearchModal() {
state.pendingInviteCode = ''; state.pendingInviteCode = '';
state.searchedInviter = null; state.searchedInviter = null;
state.searchingInviter = false; state.searchingInviter = false;
@ -966,10 +1020,38 @@
}, 0); }, 0);
} }
function openBindModal() {
if (!canShowBindInviteButton()) {
renderBindInviteVisibility();
return;
}
var api = window.HyAppAPI || {};
if (!api.getAccessToken || !api.getAccessToken()) {
toast(t('invite.loginRequired', 'Please log in first'));
return;
}
if (state.boundInviter) {
showBoundInviterModal();
return;
}
if (!state.boundInviterLoaded) {
loadBoundInviteReferrer().then(function () {
if (state.boundInviter) {
showBoundInviterModal();
return;
}
showBindSearchModal();
});
return;
}
showBindSearchModal();
}
function closeBindModal() { function closeBindModal() {
$('#bindInviteModal').hidden = true; $('#bindInviteModal').hidden = true;
state.searchingInviter = false; state.searchingInviter = false;
state.bindingInviter = false; state.bindingInviter = false;
state.viewingBoundInviter = false;
renderBindActions(); renderBindActions();
} }
@ -977,10 +1059,11 @@
$('#bindInputCard').hidden = false; $('#bindInputCard').hidden = false;
$('#bindResultCard').hidden = true; $('#bindResultCard').hidden = true;
state.searchedInviter = null; state.searchedInviter = null;
state.viewingBoundInviter = false;
renderBindActions(); renderBindActions();
} }
function showBindResult(inviter) { function showBindResult(inviter, options) {
var avatar = $('#inviterAvatar'); var avatar = $('#inviterAvatar');
var name = $('#inviterName'); var name = $('#inviterName');
var displayID = $('#inviterDisplayId'); var displayID = $('#inviterDisplayId');
@ -995,6 +1078,7 @@
if (displayID) displayID.textContent = inviter.displayUserID || '--'; if (displayID) displayID.textContent = inviter.displayUserID || '--';
$('#bindInputCard').hidden = true; $('#bindInputCard').hidden = true;
$('#bindResultCard').hidden = false; $('#bindResultCard').hidden = false;
state.viewingBoundInviter = Boolean(options && options.bound);
renderBindActions(); renderBindActions();
} }
@ -1004,14 +1088,22 @@
var input = $('#bindInviteInput'); var input = $('#bindInviteInput');
var busy = state.searchingInviter || state.bindingInviter; var busy = state.searchingInviter || state.bindingInviter;
if (confirm) { if (confirm) {
confirm.disabled = busy; confirm.hidden = state.viewingBoundInviter;
confirm.disabled = state.viewingBoundInviter || busy;
if (!state.viewingBoundInviter) {
confirm.textContent = state.bindingInviter confirm.textContent = state.bindingInviter
? t('invite.binding', 'Binding...') ? t('invite.binding', 'Binding...')
: state.searchingInviter : state.searchingInviter
? t('invite.searchingInviter', 'Searching...') ? t('invite.searchingInviter', 'Searching...')
: t('invite.confirm', 'Confirm'); : t('invite.confirm', 'Confirm');
} }
if (cancel) cancel.disabled = busy; }
if (cancel) {
cancel.disabled = busy;
cancel.textContent = state.viewingBoundInviter
? t('invite.close', 'Close')
: t('invite.cancel', 'Cancel');
}
if (input) input.disabled = busy; if (input) input.disabled = busy;
} }
@ -1135,6 +1227,10 @@
} }
function confirmBindInviter() { function confirmBindInviter() {
if (state.viewingBoundInviter) {
closeBindModal();
return;
}
if (state.bindingInviter) return; if (state.bindingInviter) return;
var api = window.HyAppAPI && window.HyAppAPI.user; var api = window.HyAppAPI && window.HyAppAPI.user;
var inviter = state.searchedInviter; var inviter = state.searchedInviter;
@ -1154,9 +1250,24 @@
state.bindingInviter = false; state.bindingInviter = false;
renderBindActions(); renderBindActions();
if (invite && (invite.bound || invite.invite_code)) { if (invite && (invite.bound || invite.invite_code)) {
var boundInviter = normalizeInviter(response, '') || inviter;
boundInviter.inviteCode =
textValue(
firstObjectValue(invite, [
'invite_code',
'inviteCode',
])
) ||
inviter.inviteCode ||
state.pendingInviteCode;
state.boundInviter = boundInviter;
state.boundInviterLoaded = true;
state.searchedInviter = boundInviter;
renderBindInviteVisibility();
toast(t('invite.bindSuccess', 'Bound successfully')); toast(t('invite.bindSuccess', 'Bound successfully'));
closeBindModal(); closeBindModal();
loadCurrentUser().catch(function () {}); loadCurrentUser().catch(function () {});
loadBoundInviteReferrer();
loadInviteActivityReward(); loadInviteActivityReward();
return; return;
} }
@ -1218,6 +1329,7 @@
loadCurrentUser().catch(function () { loadCurrentUser().catch(function () {
renderInviteShare(); renderInviteShare();
}), }),
loadBoundInviteReferrer(),
loadInviteActivityReward(), loadInviteActivityReward(),
]); ]);
} }

View File

@ -556,6 +556,11 @@ var default_api = 'https://api.global-interaction.com/';
} }
); );
}, },
getInviteReferrer: function () {
return request('/api/v1/users/me/invite-referrer', {
method: 'GET',
});
},
searchInviteReferrer: function (inviteCode) { searchInviteReferrer: function (inviteCode) {
return request('/api/v1/users/me/invite-referrer/search', { return request('/api/v1/users/me/invite-referrer/search', {
method: 'GET', method: 'GET',