wallet-notice: show only once per page (was repeating under every gated training video)

This commit is contained in:
martbost
2026-08-26 06:21:37 -05:00
parent cffaf4ffc0
commit ced4bec462
+13 -8
View File
@@ -7,26 +7,31 @@
fetch('/api/public/config').then(function (r) { return r.json(); }).then(function (c) { fetch('/api/public/config').then(function (r) { return r.json(); }).then(function (c) {
var msg = (c && c.walletNotice || '').trim(); var msg = (c && c.walletNotice || '').trim();
if (!msg) return; if (!msg) return;
var placed = false;
function attach() { function attach() {
if (placed) return true;
// The training page has a connect/unlock button under EVERY gated video —
// show the notice only ONCE (above the first one), never per-video.
var btns = [].slice.call(document.querySelectorAll('button, a.btn')); var btns = [].slice.call(document.querySelectorAll('button, a.btn'));
btns.filter(function (b) { return /connect|unlock/i.test(b.textContent || ''); }).forEach(function (btn) { var btn = btns.filter(function (b) { return /connect|unlock/i.test(b.textContent || ''); })[0];
if (btn.dataset.wnDone) return; btn.dataset.wnDone = '1'; if (!btn) return false;
placed = true;
var n = document.createElement('div'); var n = document.createElement('div');
n.className = 'callout'; n.className = 'callout';
n.style.cssText = 'margin:0 0 12px;font-size:13px;line-height:1.5;border-color:rgba(243,190,67,.5)'; n.style.cssText = 'margin:0 0 12px;font-size:13px;line-height:1.5;border-color:rgba(243,190,67,.5)';
n.innerHTML = 'ℹ️ ' + msg; // admin-authored, same trust level as other config-injected copy n.innerHTML = 'ℹ️ ' + msg; // admin-authored, same trust level as other config-injected copy
btn.parentNode.insertBefore(n, btn); btn.parentNode.insertBefore(n, btn);
}); return true;
} }
attach(); if (attach()) return;
// Connect/unlock buttons on /my and /training are injected AFTER async // Connect/unlock buttons on /my and /training are injected AFTER async data
// data loads — watch the DOM so the notice still lands on them. // loads — watch the DOM until the first one appears, then stop.
if (window.MutationObserver) { if (window.MutationObserver) {
var mo = new MutationObserver(function () { attach(); }); var mo = new MutationObserver(function () { if (attach()) mo.disconnect(); });
mo.observe(document.body, { childList: true, subtree: true }); mo.observe(document.body, { childList: true, subtree: true });
setTimeout(function () { mo.disconnect(); }, 12000); setTimeout(function () { mo.disconnect(); }, 12000);
} else { } else {
var t = 0, iv = setInterval(function () { attach(); if (++t > 12) clearInterval(iv); }, 800); var t = 0, iv = setInterval(function () { if (attach() || ++t > 12) clearInterval(iv); }, 800);
} }
}).catch(function () {}); }).catch(function () {});
})(); })();