// Velo code (Wix Studio)
// IDs used below:
// Desktop button: #ctaDesktop
// Mobile button: #ctaMobile
// Username labels: #usernameText (desktop), #usernameTextm (mobile)
// Feel free to rename; just keep them consistent here.
import wixLocation from 'wix-location';
import wixWindow from 'wix-window';
$w.onReady(function () {
const q = wixLocation.query || {};
// Normalize query values (support both r and R, and username aliases if you ever change)
const ref = (q.r || q.R || '').toString().trim();
const username = (q.username || q.user || '').toString().trim();
console.log("r = " + ref);
console.log("username = " + username);
// --- Utilities -------------------------------------------------------------
// Safe element getter (won't throw if element ID not on the page)
const maybe = (id) => { try { return $w(id); } catch (e) { return null; } };
// Merge params into a base URL (keeps existing query if present)
const buildUrl = (base, params = {}) => {
// Handle relative bases (rare here, but safe)
const u = base.startsWith('http') ? new URL(base) : new URL(base, 'https://dummy.local');
Object.entries(params).forEach(([k, v]) => {
if (v !== undefined && v !== null && v !== '') u.searchParams.set(k, v);
});
const out = u.toString();
// Strip dummy origin if we used one
return base.startsWith('http') ? out : out.replace('https://dummy.local', '');
};
// Collect & pass through any optional trackers you care about
const collectOptional = (keys) => {
const obj = {};
keys.forEach((k) => { if (q[k]) obj[k] = q[k]; });
return obj;
};
// --- Visual username fill (optional) --------------------------------------
// If you show the username on page, populate either/both text elements if present
const usernameTargets = ['#usernameText', '#usernameTextm']
.map(maybe)
.filter(Boolean);
usernameTargets.forEach(el => {
if (username) el.text = username;
});
// --- DESTINATIONS ----------------------------------------------------------
// Change these two bases only:
const WEB_SIGNUP_BASE = 'https://app.ownersbox.com/wfs/signup'; // desktop web signup page
const ONELINK_BASE = 'https://ownersbox.onelink.me/1fLb/rirl6tr4'; // replace XXXX/landing with your real OneLink path
// (A) DESKTOP BUTTON: add ?r= to the web signup URL
const desktopBtn = maybe('#ctaDesktop');
if (desktopBtn) {
const desktopParams = ref ? { r: ref } : {};
// If you also want to propagate other trackers on web:
Object.assign(desktopParams, collectOptional(['btag','mbsy','utm_source','utm_medium','utm_campaign']));
const desktopUrl = buildUrl(WEB_SIGNUP_BASE, desktopParams);
// Either set the .link or force navigation on click; using .link lets it behave like a normal anchor.
desktopBtn.link = desktopUrl;
// Optional: ensure most up-to-date link at click time (helpful if you later add dynamic changes)
desktopBtn.onClick(() => wixLocation.to(desktopBtn.link));
}
// (B) MOBILE BUTTON via AppsFlyer OneLink:
// Goal: maintain attribution through install and still deliver `r` into the app and web fallback.
// Best practice:
// - Put `r` as a regular param AND in af_sub1 (passthrough).
// - Put `r` inside your deep link (af_dp) so the app gets it on open.
// - Provide af_ios_url / af_android_url fallbacks WITH ?r for users who don’t have the app.
// - Keep your deep_link_value consistent with the app routing (“signup” here).
const mobileBtn = maybe('#ctaMobile');
if (mobileBtn) {
const baseWebWithRef = buildUrl(WEB_SIGNUP_BASE, ref ? { r: ref } : {});
const mobileParams = {
// Custom + passthrough values:
...(ref ? { r: ref, af_sub1: ref } : {}),
// App deep link (your app must route this; example scheme below)
...(ref ? { af_dp: `ownersbox://signup?r=ref` } : {}),
// Deep link routing hint (depends on your app’s logic)
deep_link_value: 'signup',
// Attribution & fallback safety:
af_ios_url: baseWebWithRef,
af_android_url: baseWebWithRef,
// Optional settings you might already use:
// af_xp: 'custom',
// pid, c, af_channel, af_ad, etc. can live in your OneLink template, or pass them from q if present.
...collectOptional(['pid','c','af_channel','af_ad','btag','mbsy','utm_source','utm_medium','utm_campaign'])
};
const oneLinkUrl = buildUrl(ONELINK_BASE, mobileParams);
// As above, set .link and also navigate on click for freshness
mobileBtn.link = oneLinkUrl;
mobileBtn.onClick(() => wixLocation.to(mobileBtn.link));
}
// Optional: Choose which button to show based on form factor.
// If you keep both on the page, you can auto-hide the "other" one:
const isMobile = wixWindow.formFactor === 'Mobile';
if (desktopBtn) desktopBtn.hidden = isMobile;
if (mobileBtn) mobileBtn.hidden = !isMobile;
});
Daily Fantasy Sports | OwnersBox
For a limited time only, the first 1,000 entrants into the '$250K NFL Kickoff Special ($50K to 1st)' will receive a FREE $5 ticket to another NFL Salary Cap contest of their choosing!
Terms & conditions apply. If you or someone you know has a gambling problem, help is available. Call (1-800-GAMBLER).
OUR GAMES
PLAYER
PICKS
Pick "More" or "Less" on your favorite players, and benefit from our industry-leading payouts.