account: fix duplicate billing line + always show badge for founding members
Duplicate "Lifetime · Never billed again" was caused by
insertAdjacentHTML('afterend') appending another <p> on every
renderPlanCard call - and renderPlanCard runs both in init() and on
the onAuthStateChange INITIAL_SESSION event, so the line stacks.
Replaced with a dedicated #plan-billing-note-el container that
setHtml() replaces in place.
Badge: collapsed the two-branch fetch into one path. Founding
members now always see the badge; if member_number is set we render
"#N", otherwise we fall through to "Your number awaits" via the
existing n=0 endpoint behaviour.
This commit is contained in:
+8
-23
@@ -718,6 +718,7 @@ fn account_page(supabase_url: String, supabase_anon_key: String) -> String {
|
|||||||
<div>
|
<div>
|
||||||
<p class=\"plan-name\" id=\"plan-name-el\">Loading...</p>
|
<p class=\"plan-name\" id=\"plan-name-el\">Loading...</p>
|
||||||
<div id=\"plan-status-el\"></div>
|
<div id=\"plan-status-el\"></div>
|
||||||
|
<div id=\"plan-billing-note-el\"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class=\"plan-meta\" id=\"plan-meta-el\"></div>
|
<div class=\"plan-meta\" id=\"plan-meta-el\"></div>
|
||||||
@@ -1029,7 +1030,7 @@ fn account_page(supabase_url: String, supabase_anon_key: String) -> String {
|
|||||||
}
|
}
|
||||||
setHtml('plan-status-el', statusHtml);
|
setHtml('plan-status-el', statusHtml);
|
||||||
|
|
||||||
// Billing note below status
|
// Billing note (replaces, never appends - this function may run more than once on auth state changes)
|
||||||
var billingNote = '';
|
var billingNote = '';
|
||||||
if (plan === 'founding') {
|
if (plan === 'founding') {
|
||||||
billingNote = '<p class=\"plan-billing-note\">Lifetime · Never billed again</p>';
|
billingNote = '<p class=\"plan-billing-note\">Lifetime · Never billed again</p>';
|
||||||
@@ -1038,8 +1039,7 @@ fn account_page(supabase_url: String, supabase_anon_key: String) -> String {
|
|||||||
} else {
|
} else {
|
||||||
billingNote = '<p class=\"plan-billing-note\">On the waitlist</p>';
|
billingNote = '<p class=\"plan-billing-note\">On the waitlist</p>';
|
||||||
}
|
}
|
||||||
var statusEl = document.getElementById('plan-status-el');
|
setHtml('plan-billing-note-el', billingNote);
|
||||||
if (statusEl) statusEl.insertAdjacentHTML('afterend', billingNote);
|
|
||||||
|
|
||||||
// Meta
|
// Meta
|
||||||
var meta = '';
|
var meta = '';
|
||||||
@@ -1055,31 +1055,16 @@ fn account_page(supabase_url: String, supabase_anon_key: String) -> String {
|
|||||||
setHtml('plan-meta-el', meta);
|
setHtml('plan-meta-el', meta);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Founding badge
|
// Founding badge - always show for founding members, with member number if assigned
|
||||||
if (plan === 'founding' && memberNum) {
|
if (plan === 'founding') {
|
||||||
var badgeSection = document.getElementById('badge-section');
|
var badgeSection = document.getElementById('badge-section');
|
||||||
var badgeContainer = document.getElementById('badge-html-container');
|
var badgeContainer = document.getElementById('badge-html-container');
|
||||||
if (badgeSection && badgeContainer) {
|
|
||||||
badgeSection.style.display = '';
|
|
||||||
// Fetch badge HTML from server
|
|
||||||
fetch('/api/founding-badge?n=' + memberNum)
|
|
||||||
.then(function(r) { return r.text(); })
|
|
||||||
.then(function(html) {
|
|
||||||
badgeContainer.innerHTML = html;
|
|
||||||
})
|
|
||||||
.catch(function(e) {
|
|
||||||
console.error('Failed to load badge:', e);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else if (plan === 'founding') {
|
|
||||||
// Founding member but number not yet assigned
|
|
||||||
var badgeSection = document.getElementById('badge-section');
|
|
||||||
if (badgeSection) badgeSection.style.display = '';
|
if (badgeSection) badgeSection.style.display = '';
|
||||||
fetch('/api/founding-badge?n=0')
|
var badgeN = memberNum || 0;
|
||||||
|
fetch('/api/founding-badge?n=' + badgeN)
|
||||||
.then(function(r) { return r.text(); })
|
.then(function(r) { return r.text(); })
|
||||||
.then(function(html) {
|
.then(function(html) {
|
||||||
var c = document.getElementById('badge-html-container');
|
if (badgeContainer) badgeContainer.innerHTML = html;
|
||||||
if (c) c.innerHTML = html;
|
|
||||||
})
|
})
|
||||||
.catch(function() {});
|
.catch(function() {});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user