Direct link option: opt out of moving-link rotation to build personal spillover (Team link default, Direct link alternate)
This commit is contained in:
+3
-1
@@ -78,7 +78,9 @@
|
||||
{k:['30 positions','goal','milestone','matrix','how many people','team size'],
|
||||
a:()=>`The first major team goal is <strong>30 properly placed positions</strong>: 2 → 4 → 8 → 16 across the first four generations. Then we keep going — 32, 64, 128 and beyond.`},
|
||||
{k:['moving link','why not my link','own link','my referral','use my link','extra legs'],
|
||||
a:()=>`We use a <strong>moving-link strategy — and it's automatic</strong>: every member's invite link self-rotates. While a position still needs directs, its link credits it; the moment it's qualified, the same link starts routing new signups to the next position in that leg that needs help. Nobody retires anything and nobody stops promoting — the link hunts for the next spot on its own. Joining fresh? The <a href="/start">Getting Started page</a> always shows the current team placement. (A signup straight to a qualified position's raw ID is a harmless bonus — it pays that member and spills downward as depth — but spillover alone never qualifies anyone.)`},
|
||||
a:()=>`We use a <strong>moving-link strategy — and it's automatic</strong>: every member's invite link self-rotates. While a position still needs directs, its link credits it; the moment it's qualified, the same link starts routing new signups to the next position in that leg that needs help. Nobody retires anything and nobody stops promoting — the link hunts for the next spot on its own. <strong>Prefer new people to land under YOU instead of rotating?</strong> Your dashboard also gives you a <strong>Direct link</strong> (adds ?direct=1) that places every join directly under your position as spillover. Team link (default) = help your team qualify; Direct link = build your own depth. Joining fresh? The <a href="/start">Getting Started page</a> always shows the current team placement.`},
|
||||
{k:['direct link','team link','keep my link','spillover under me','stop rotating','not rotate','build my own','two links','which link','sticky link'],
|
||||
a:()=>`Your dashboard gives you <strong>two links</strong> under "Share this position": <strong>Team link</strong> (the default /join/<id>) — once you're qualified it routes new joins to the next teammate who needs directs, building your team in order; and <strong>Direct link</strong> (/join/<id>?direct=1) — every join lands <strong>directly under you</strong> as spillover, building your own depth. Both credit you the entry reward on anyone you personally bring. Team link is recommended (it grows the whole leg), but the Direct link is there if you'd rather stack spillover under yourself. Copy either from your <a href="/my">dashboard</a>.`},
|
||||
{k:['risk','safe','scam','lose money','guarantee','guaranteed','income','earnings','legit'],
|
||||
a:()=>`Straight answer: participation involves cryptocurrency and smart-contract risk, and <strong>no income is guaranteed</strong>. Results depend on team effort, duplication, upgrades, smart-contract rules, and POL's market value. Only use funds you can afford to lose.`},
|
||||
{k:['video','videos','training','watch','tutorial','learn','how to'],
|
||||
|
||||
+7
-1
@@ -46,7 +46,13 @@ fetch('/api/public/config').then(function(r){return r.json()}).then(function(c){
|
||||
async function loadSponsor(){
|
||||
try{
|
||||
// personal invite: ?ref=<id> -> place in that member's leg via the site's moving-link joinTarget
|
||||
var ref=new URLSearchParams(location.search).get('ref');
|
||||
var qp=new URLSearchParams(location.search);
|
||||
var ref=qp.get('ref');
|
||||
// Direct link (?direct=1): opt out of rotation — register straight under
|
||||
// the inviter (spillover in their team), never the next-to-qualify member.
|
||||
if(ref&&/^\d{1,15}$/.test(ref)&&qp.get('direct')==='1'){
|
||||
sponsorId=String(ref); $('sponsorLine').innerHTML='You’ll join <strong>directly under #'+ref+'</strong> — a spillover placement in their team.'; return;
|
||||
}
|
||||
if(ref&&/^\d{1,15}$/.test(ref)){
|
||||
try{ var rm=await (await fetch('/api/public/member?id='+ref)).json(); var t=rm&&rm.joinTarget;
|
||||
if(t&&t.id){ sponsorId=String(t.id); $('sponsorLine').innerHTML='You’ll join under <strong>#'+t.id+'</strong>'+(String(t.id)!==String(ref)?' — the next open spot in #'+ref+'’s team':'')+'.'; return; }
|
||||
|
||||
+10
-4
@@ -10,6 +10,10 @@
|
||||
|
||||
function pathId(){const m=location.pathname.match(/^\/join\/(\d+)$/);return m?m[1]:''}
|
||||
const id=pathId();
|
||||
// Direct link (?direct=1): opt out of moving-link rotation — new joins land
|
||||
// directly under THIS position (spillover in their team), instead of routing
|
||||
// to the next-to-qualify member. Default (no flag) = the Team/moving link.
|
||||
const direct=new URLSearchParams(location.search).get('direct')==='1';
|
||||
let joinTargetId=id; // where the entry actually lands after moving-link routing
|
||||
|
||||
function setIds(idStr){
|
||||
@@ -53,10 +57,10 @@
|
||||
// Moving-link routing: the entry lands on whoever the smart link resolves to.
|
||||
// A qualified inviter's link routes to the next-to-qualify in their leg, so
|
||||
// the join builds the team down in order instead of spilling onto the inviter.
|
||||
const t=d.joinTarget||{id:d.id,referralUrl:d.referralUrl,reason:'self'};
|
||||
const t=direct?{id:id,reason:'direct'}:(d.joinTarget||{id:d.id,referralUrl:d.referralUrl,reason:'self'});
|
||||
joinTargetId=t.id;
|
||||
const jb=document.getElementById('joinBtn');
|
||||
jb.href='/join-now?ref='+id; jb.removeAttribute('target'); // self-enroll page, placed in this leg
|
||||
jb.href='/join-now?ref='+id+(direct?'&direct=1':''); jb.removeAttribute('target'); // self-enroll page, placed in this leg
|
||||
// the join CTA + "join under" header + dApp-sponsor mentions reflect the
|
||||
// ACTUAL sponsor the entry lands on, not the inviter (only the top
|
||||
// "invited by #X" line keeps the inviter's id)
|
||||
@@ -64,7 +68,9 @@
|
||||
document.getElementById('invIdJoin').textContent='#'+t.id;
|
||||
document.querySelectorAll('.inv-id-inline').forEach(el=>el.textContent='#'+t.id);
|
||||
const note=document.getElementById('invQualNote');
|
||||
if(t.reason==='leg'||t.reason==='global'){
|
||||
if(direct){
|
||||
note.innerHTML=`<div class="callout" style="margin-top:14px">You're joining <strong>directly under Member #${esc(id)}</strong> — a spillover placement in their team. Enter sponsor <strong>#${esc(id)}</strong> in the dApp.</div>`;
|
||||
}else if(t.reason==='leg'||t.reason==='global'){
|
||||
note.innerHTML=`<div class="callout" style="margin-top:14px">You were invited by <strong>Member #${esc(d.id)}</strong>, who's already <strong>qualified</strong>. So your entry goes to <strong>Member #${esc(t.id)}</strong> — the next spot in the team that needs its 2 — and you'll join directly under them. Same team, filling the next open position in order (no spillover). Enter sponsor <strong>#${esc(t.id)}</strong> in the dApp.</div>`;
|
||||
}else if(d.directCount>=2){
|
||||
note.innerHTML=`<div class="callout" style="margin-top:14px">This position is already <strong>qualified</strong> — joining here still works: your entry pays them and you're placed in their team leg as depth.</div>`;
|
||||
@@ -129,7 +135,7 @@
|
||||
s.innerHTML='<h1 style="margin-top:10px">'+a.h+'</h1>'+
|
||||
'<div class="video-card" style="max-width:860px;margin:22px auto 0">'+
|
||||
'<video id="hookPlayer" class="video-frame" style="display:block;width:100%;height:auto;aspect-ratio:16/9" controls preload="metadata" poster="'+a.p+'" src="'+a.v+'"></video></div>'+
|
||||
'<div class="hero-actions" style="margin-top:26px"><a id="hookCta" class="btn btn-primary" style="font-size:19px;padding:16px 34px;font-weight:800" href="'+location.pathname+'">Show me how it works →</a></div>'+
|
||||
'<div class="hero-actions" style="margin-top:26px"><a id="hookCta" class="btn btn-primary" style="font-size:19px;padding:16px 34px;font-weight:800" href="'+location.pathname+(new URLSearchParams(location.search).get('direct')==='1'?'?direct=1':'')+'">Show me how it works →</a></div>'+
|
||||
'<div class="micro" style="margin-top:14px">Independent team training resource • Participation involves risk • No income is guaranteed</div>';
|
||||
main.appendChild(s);
|
||||
var hp=document.getElementById('hookPlayer'),cta=document.getElementById('hookCta');
|
||||
|
||||
@@ -537,6 +537,7 @@
|
||||
const el=document.getElementById('dShare');
|
||||
if(!el)return;
|
||||
const dashUrl=`https://rmcircle.team/join/${d.id}`;
|
||||
const directUrl=`${dashUrl}?direct=1`;
|
||||
const q2=d.directCount>=2, nx=d.nextInLine;
|
||||
// The personal QR is ALWAYS shown: /join/<id> self-rotates via the moving
|
||||
// link, so a scan is always placed correctly — even after 2/2. This is the
|
||||
@@ -555,6 +556,12 @@
|
||||
<div style="display:flex;gap:8px;flex-wrap:wrap"><button id="copyShare" class="btn btn-secondary btn-sm">Copy my page link</button><a class="btn btn-teal btn-sm" href="${esc(dashUrl)}" target="_blank" rel="noopener">Preview my page →</a></div>
|
||||
<p class="micro" style="margin:10px 0 0;word-break:break-all">${esc(dashUrl)}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div style="margin-top:16px;padding-top:14px;border-top:1px solid var(--line)">
|
||||
<div style="font-weight:800;font-size:14px;margin-bottom:4px">🔀 Two ways to share</div>
|
||||
<p class="micro" style="margin:0 0 8px">The link above is your <strong style="color:var(--text)">Team link</strong> ${q2?'— now that you’re qualified it routes new joins to the next teammate who needs directs, building your team in order (recommended).':'— it credits you and builds your first two.'} Want new people to land <strong style="color:var(--text)">under YOU</strong> as spillover instead? Use your <strong style="color:var(--text)">Direct link</strong>:</p>
|
||||
<div style="display:flex;gap:8px;flex-wrap:wrap;align-items:center"><button id="copyDirect" class="btn btn-secondary btn-sm">Copy Direct link</button><span class="micro" style="word-break:break-all;color:var(--muted)">${esc(directUrl)}</span></div>
|
||||
<p class="micro" style="margin:8px 0 0"><strong style="color:var(--text)">Team link</strong> helps your team qualify. <strong style="color:var(--text)">Direct link</strong> places every join under you (own spillover). Either way you keep the entry reward on anyone you personally bring.</p>
|
||||
</div>`;
|
||||
const qr=document.getElementById('dQr');if(qr)qr.innerHTML=qrSvg(dashUrl);
|
||||
const qb=document.getElementById('dQrBtn');
|
||||
@@ -576,6 +583,8 @@
|
||||
});
|
||||
const cp=document.getElementById('copyShare');
|
||||
if(cp)cp.addEventListener('click',async()=>{try{await navigator.clipboard.writeText(dashUrl);cp.textContent='Copied ✓';setTimeout(()=>cp.textContent='Copy my page link',1400)}catch(e){}});
|
||||
const cd=document.getElementById('copyDirect');
|
||||
if(cd)cd.addEventListener('click',async()=>{try{await navigator.clipboard.writeText(directUrl);cd.textContent='Copied ✓';setTimeout(()=>cd.textContent='Copy Direct link',1400)}catch(e){}});
|
||||
}
|
||||
|
||||
async function load(id){
|
||||
|
||||
Reference in New Issue
Block a user