PolHunter in the member menu from launch morning (the Overview reveal still waits for launchAt); Promo tools > PolHunter kit: share link, posts, swipe, banners, both videos; reveal card says tap to copy

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
martbost
2026-09-21 07:36:37 -05:00
parent e5cbecbdb2
commit c6c26b8073
3 changed files with 46 additions and 5 deletions
+3 -3
View File
@@ -1426,12 +1426,12 @@
let phShown = false; let phShown = false;
async function launchReveal() { async function launchReveal() {
try { try {
const nav = $('polhunterNav'); if (nav) nav.hidden = false; // listed in the menu from launch morning (Marty, 2026-09-21); the card below is the announcement and waits for launchAt
const cfg = await IAP.getConfig(); const at = cfg.launchAt ? new Date(cfg.launchAt).getTime() : 0; const cfg = await IAP.getConfig(); const at = cfg.launchAt ? new Date(cfg.launchAt).getTime() : 0;
if (!at || Date.now() < at) return; if (!at || Date.now() < at) return;
const nav = $('polhunterNav'); if (nav) nav.hidden = false;
const card = $('phLaunch'); if (!card || phShown) return; phShown = true; card.hidden = false; const card = $('phLaunch'); if (!card || phShown) return; phShown = true; card.hidden = false;
card.innerHTML = '<div class="card-head"><h3>\u{1F3AF} New today: PolHunter</h3><span class="sub">Launch-day surprise</span></div>' card.innerHTML = '<div class="card-head"><h3>\u{1F3AF} New today: PolHunter</h3><span class="sub">Launch-day surprise</span></div>'
+ '<p>Missions across our sites. Visit the site, find your personal code on the page, type it in, and a random drip of POL lands in the wallet on this account, on chain, with a link to prove it. Three missions a day, a leaderboard with weekly POL prizes, and badge cards you can share. Your PolHunter share link puts sign-ups on your InstantAdPay line.</p>' + '<p>Missions across our sites. Visit the site, find your personal code on the page, tap it to copy, paste it on your board, and a random drip of POL lands in the wallet on this account, on chain, with a link to prove it. Three missions a day, a leaderboard with weekly POL prizes, and badge cards you can share. Your PolHunter share link puts sign-ups on your InstantAdPay line.</p>'
+ '<a class="btn" href="/api/my/polhunter">Open my PolHunter board</a> <button class="btn sec" type="button" id="phTrain">Watch: how it feeds your line (70 s)</button> <a class="btn sec" href="https://polhunter.com/" target="_blank" rel="noopener">The teaser</a>'; + '<a class="btn" href="/api/my/polhunter">Open my PolHunter board</a> <button class="btn sec" type="button" id="phTrain">Watch: how it feeds your line (70 s)</button> <a class="btn sec" href="https://polhunter.com/" target="_blank" rel="noopener">The teaser</a>';
const tb = $('phTrain'); if (tb) tb.addEventListener('click', () => { const m = document.querySelector('.bo-menu [data-pane="training"]'); if (m) m.click(); }); const tb = $('phTrain'); if (tb) tb.addEventListener('click', () => { const m = document.querySelector('.bo-menu [data-pane="training"]'); if (m) m.click(); });
} catch (e) {} } catch (e) {}
@@ -1887,7 +1887,7 @@
if ($('tkGo')) { $('tkGo').addEventListener('click', tkGenerate); $('tkAgain').addEventListener('click', tkGenerate); $('tkCopy').addEventListener('click', async () => { try { await navigator.clipboard.writeText($('tkText').value); IAP.status('Copied.', 'ok'); } catch (e) { $('tkText').select(); } }); $('tkSendBc').addEventListener('click', tkSendBroadcast); } if ($('tkGo')) { $('tkGo').addEventListener('click', tkGenerate); $('tkAgain').addEventListener('click', tkGenerate); $('tkCopy').addEventListener('click', async () => { try { await navigator.clipboard.writeText($('tkText').value); IAP.status('Copied.', 'ok'); } catch (e) { $('tkText').select(); } }); $('tkSendBc').addEventListener('click', tkSendBroadcast); }
// promo tools: pill menu switches between posts / swipes / banners / wall / videos // promo tools: pill menu switches between posts / swipes / banners / wall / videos
function setPromoSub(name) { function setPromoSub(name) {
const ids = ['toolkit', 'posts', 'text', 'swipe', 'banners', 'wall', 'objections', 'videos', 'viral']; const ids = ['toolkit', 'posts', 'text', 'swipe', 'banners', 'wall', 'objections', 'videos', 'viral', 'polhunter'];
if (name === 'toolkit') loadToolkit(); if (name === 'toolkit') loadToolkit();
if (!ids.includes(name)) name = 'posts'; if (!ids.includes(name)) name = 'posts';
ids.forEach(id => { const el = $('promo-' + id); if (el) el.hidden = id !== name; }); ids.forEach(id => { const el = $('promo-' + id); if (el) el.hidden = id !== name; });
+24
View File
@@ -222,6 +222,30 @@ window.IAPPromo = (function () {
vp.onchange = render; vp.onchange = render;
$('viralCopy').onclick = async () => { const l = $('viralLink').textContent; if (!/^https:/.test(l)) return; try { await navigator.clipboard.writeText(l); status('Link copied.', 'ok'); } catch (e) { status('Copy failed.', 'bad'); } }; $('viralCopy').onclick = async () => { const l = $('viralLink').textContent; if (!/^https:/.test(l)) return; try { await navigator.clipboard.writeText(l); status('Link copied.', 'ok'); } catch (e) { status('Copy failed.', 'bad'); } };
} }
// PolHunter, the feeder program: the member's PolHunter link (their IAP username, so sign-ups land on their line)
const phl = $('phLink');
if (phl && token && phl.dataset.filled !== token) {
phl.dataset.filled = token;
const enc = encodeURIComponent, pl = 'https://polhunter.com/?r=' + enc(token);
phl.textContent = pl;
$('phLinkCopy').onclick = async () => { try { await navigator.clipboard.writeText(pl); status('Link copied.', 'ok'); } catch (e) { status('Copy failed.', 'bad'); } };
const sh = $('phShare'); sh.innerHTML = '';
const hook = 'PolHunter: find a code on one of our sites and a drip of POL lands in your wallet, on chain. Free to start.';
[linkBtn('https://x.com/intent/tweet?url=' + enc(pl) + '&text=' + enc(hook), 'X'), linkBtn('https://www.facebook.com/sharer/sharer.php?u=' + enc(pl), 'Facebook'), linkBtn('https://t.me/share/url?url=' + enc(pl) + '&text=' + enc(hook), 'Telegram'), linkBtn('https://wa.me/?text=' + enc(hook + ' ' + pl), 'WhatsApp'), linkBtn('mailto:?subject=' + enc('A scavenger hunt that pays in POL') + '&body=' + enc(hook + '\n\n' + pl), 'Email')].forEach(b => sh.appendChild(b));
const PH_POSTS = [
{ name: 'Short post', text: 'New thing I am playing with: PolHunter. You visit a site, find your code on the page, tap it to copy, paste it on your board, and a random drip of POL lands in your wallet. On chain, with a link to prove it. ' + pl },
{ name: 'Story post', text: 'I spent two minutes on a training page tonight, found a little glass coin at the bottom, tapped the code, and 0.26 POL showed up in my wallet a minute later. That is PolHunter. Small drips, real chain, no catch beyond actually visiting the site. Free to start, you just need an InstantAdPay account and a wallet. ' + pl },
{ name: 'Telegram or WhatsApp', text: '\u{1F3AF} PolHunter is live. Missions across our sites, one code to find per site, random POL drips paid straight to your wallet. The hiding place moves every day. Start here: ' + pl },
{ name: 'Email swipe', subject: 'A scavenger hunt that pays in POL', text: 'Hey,\n\nQuick one. I have been testing something called PolHunter.\n\nYou pick a mission, spend a couple of minutes on the site it names, and your personal code appears somewhere on the page. Tap it to copy, paste it on your board, and a random drip of POL goes to your wallet, on chain, with a link to prove it. Three missions a day, a leaderboard with weekly prizes, and the hiding place moves every day.\n\nIt is free to start. You need an InstantAdPay account (also free) and a wallet, and the site walks you through both.\n\nStart here: ' + pl + '\n\nTell me what your first find pays.' },
];
const pp = $('phPosts'); pp.innerHTML = '';
for (const p of PH_POSTS) { const extras = p.subject ? [] : [linkBtn('https://x.com/intent/tweet?text=' + enc(p.text), 'X'), linkBtn('https://t.me/share/url?url=' + enc(pl) + '&text=' + enc(p.text.replace(pl, '').trim()), 'Telegram')]; pp.appendChild(block(p.text, '<span class="lab">' + esc(p.name) + '</span>' + (p.subject ? ' <span class="muted small">Subject: ' + esc(p.subject) + '</span>' : ''), extras)); }
const sizes = [['728x90', 'Leaderboard'], ['468x60', 'Mobile leaderboard'], ['300x250', 'Medium rectangle'], ['250x250', 'Square'], ['125x125', 'Button'], ['160x600', 'Skyscraper'], ['1200x630', 'Social card'], ['1080x1080', 'Instagram square']];
const bg = $('phBanners'); bg.innerHTML = '';
for (const [s, n] of sizes) { const w = s.split('x')[0], h = s.split('x')[1]; const src = 'https://polhunter.com/promo/polhunter-' + s + (Number(w) >= 300 ? '.jpg' : '.png'); const code = '<a href="' + pl + '" target="_blank" rel="noopener"><img src="' + src + '" width="' + w + '" height="' + h + '" alt="PolHunter"></a>';
const d = document.createElement('div'); d.className = 'promo-block'; d.innerHTML = '<div class="pb-head"><span class="lab">' + s + '</span> <span class="muted small">' + esc(n) + '</span></div><div style="overflow:auto;margin:8px 0"><img src="' + src + '" alt="' + s + '" style="max-width:100%;height:auto;border-radius:8px"></div><div class="pb-text mono small" style="overflow-wrap:anywhere">' + esc(code) + '</div>';
const row = document.createElement('div'); row.className = 'pb-actions'; row.appendChild(copyBtn(code, 'Copy embed code')); row.appendChild(linkBtn(src, 'Open image')); d.appendChild(row); bg.appendChild(d); }
}
// objections // objections
const ob = $('promoObjections'); const ob = $('promoObjections');
if (ob && ob.dataset.filled !== link) { if (ob && ob.dataset.filled !== link) {
+19 -2
View File
@@ -745,6 +745,23 @@
<button class="chip-t" data-promo="objections" type="button" role="tab">Objections</button> <button class="chip-t" data-promo="objections" type="button" role="tab">Objections</button>
<button class="chip-t" data-promo="videos" type="button" role="tab">Videos</button> <button class="chip-t" data-promo="videos" type="button" role="tab">Videos</button>
<button class="chip-t" data-promo="viral" type="button" role="tab">Viral links</button> <button class="chip-t" data-promo="viral" type="button" role="tab">Viral links</button>
<button class="chip-t" data-promo="polhunter" type="button" role="tab">🎯 PolHunter</button>
</div>
<div class="card promo-sec" id="promo-polhunter" hidden>
<div class="card-head"><h3>PolHunter: your feeder program</h3><span class="sub">free to play, pays in POL, every sign-up lands on your line</span></div>
<p class="muted small" style="margin:0 0 10px">PolHunter is the easy front door. A person visits one of our sites, finds their code, taps it, and a drip of POL lands in their wallet. To play they need a free InstantAdPay account with a wallet switched on, so everyone you send in is set up and on your line before they ever see an ad package.</p>
<div class="promo-strip" style="padding:0 0 12px"><div><span class="eyebrow" style="margin:0 0 4px">Your PolHunter link</span><div class="mono small" id="phLink" style="overflow-wrap:anywhere">…</div></div><span><button class="btn small" id="phLinkCopy" type="button">Copy link</button> <a class="btn small sec" href="/api/my/polhunter">Open my board</a></span></div>
<div id="phShare" class="angle-btns" style="margin:0 0 14px"></div>
<div class="card-head"><h3>Videos</h3><span class="sub">the 30-second teaser and the 100-second explainer</span></div>
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px;margin:0 0 16px">
<div><video controls playsinline preload="metadata" poster="https://polhunter.com/video/polhunter-teaser-poster.jpg" src="https://polhunter.com/video/polhunter-teaser.mp4?v=20260921a" style="width:100%;border-radius:12px"></video><p class="small" style="margin:6px 0 0"><a href="https://polhunter.com/video/polhunter-teaser.mp4?v=20260921a" download="polhunter-teaser.mp4">Download the teaser</a></p></div>
<div><video controls playsinline preload="metadata" poster="https://coolify-saasytop.nyc3.digitaloceanspaces.com/training/polhunter-feeder.jpg?v=20260921a" src="https://coolify-saasytop.nyc3.digitaloceanspaces.com/training/polhunter-feeder.mp4?v=20260921a" style="width:100%;border-radius:12px"></video><p class="small" style="margin:6px 0 0"><a href="https://coolify-saasytop.nyc3.digitaloceanspaces.com/training/polhunter-feeder.mp4?v=20260921a" download="polhunter-feeder.mp4">Download the explainer</a></p></div>
</div>
<div class="card-head"><h3>Posts and a swipe</h3><span class="sub">your link is already in them</span></div>
<div id="phPosts"></div>
<div class="card-head" style="margin-top:14px"><h3>Banners</h3><span class="sub">eight sizes, each linked to you</span></div>
<div id="phBanners" class="banner-grid"></div>
<p class="small" style="margin:14px 0 0"><a class="btn small sec" href="https://polhunter.com/promo" target="_blank" rel="noopener">Open the full PolHunter kit</a> <span class="muted">The leaderboard, badge cards and objection answers live there too.</span></p>
</div> </div>
<div class="card promo-sec" id="promo-viral" hidden> <div class="card promo-sec" id="promo-viral" hidden>
<div class="card-head"><h3>Viral link builder</h3><span class="sub">any page on the site becomes your link</span></div> <div class="card-head"><h3>Viral link builder</h3><span class="sub">any page on the site becomes your link</span></div>
@@ -1049,8 +1066,8 @@
</div> </div>
<script src="/assets/common.js?v=20260916a"></script> <script src="/assets/common.js?v=20260916a"></script>
<script src="/assets/wallet.js?v=20260911a"></script> <script src="/assets/wallet.js?v=20260911a"></script>
<script src="/assets/promo.js?v=20260921b"></script> <script src="/assets/promo.js?v=20260921c"></script>
<script src="/assets/my.js?v=20260924b"></script> <script src="/assets/my.js?v=20260924c"></script>
<script src="/assets/chat.js?v=20260907l"></script> <script src="/assets/chat.js?v=20260907l"></script>
</body> </body>
</html> </html>