(() => { 'use strict'; const SELECTORS = { section: '[data-pricing-section]', card: '.yaidel-pricing-card', toggle: '[data-pricing-toggle]', toggleButton: '[data-billing]', price: '.yaidel-pricing-price', value: '.yaidel-price-value', period: '.yaidel-price-period', billing: '.yaidel-price-billing', currency: '.yaidel-price-currency' }; const BILLING = { MONTHLY: 'monthly', ANNUAL: 'annual' }; const CURRENCY = { USD: 'USD', KES: 'KES' }; const CACHE_KEY = 'yaidel_pricing_currency_v3'; const CACHE_TTL_MS = 24 * 60 * 60 * 1000; const formatters = { USD: new Intl.NumberFormat('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 2 }), KES: new Intl.NumberFormat('en-KE', { minimumFractionDigits: 0, maximumFractionDigits: 0 }) }; function init() { const sections = document.querySelectorAll(SELECTORS.section); if (!sections.length) return; // default for non-KE sections.forEach((section) => initSection(section, CURRENCY.USD)); detectCurrencyFast().then((currency) => { sections.forEach((section) => { if (section.dataset.currency === currency) return; section.dataset.currency = currency; rerenderSection(section); }); }); } function initSection(section, defaultCurrency) { if (!section || section.dataset.pricingInitialized === 'true') return; section.dataset.currency = defaultCurrency; const cards = section.querySelectorAll(SELECTORS.card); if (!cards.length) return; cards.forEach((card) => { const toggle = card.querySelector(SELECTORS.toggle); const buttons = toggle ? toggle.querySelectorAll(SELECTORS.toggleButton) : []; if (!toggle || !buttons.length) return; buttons.forEach((button) => { button.addEventListener('click', () => { const billing = button.dataset.billing; if (billing !== BILLING.MONTHLY && billing !== BILLING.ANNUAL) return; setCardBilling(card, billing); }); }); setCardBilling(card, BILLING.MONTHLY); }); section.dataset.pricingInitialized = 'true'; } function setCardBilling(card, billing) { const buttons = card.querySelectorAll(`${SELECTORS.toggle} ${SELECTORS.toggleButton}`); buttons.forEach((button) => { const active = button.dataset.billing === billing; button.classList.toggle('active', active); button.setAttribute('aria-pressed', active ? 'true' : 'false'); }); card.dataset.billing = billing; updateCardPrice(card, billing); } function rerenderSection(section) { const cards = section.querySelectorAll(SELECTORS.card); cards.forEach((card) => { updateCardPrice(card, card.dataset.billing || BILLING.MONTHLY); }); } function updateCardPrice(card, billing) { const price = card.querySelector(SELECTORS.price); if (!price) return; const valueEl = price.querySelector(SELECTORS.value); const periodEl = price.querySelector(SELECTORS.period); const billingEl = price.querySelector(SELECTORS.billing); const currencyEl = price.querySelector(SELECTORS.currency); if (!valueEl || !periodEl || !billingEl || !currencyEl) return; const section = card.closest(SELECTORS.section); const currency = section?.dataset.currency === CURRENCY.KES ? CURRENCY.KES : CURRENCY.USD; const field = (name) => { // Prefer country-specific hardcoded values // e.g. data-monthly-kes, data-monthly-usd const specific = price.dataset[`${name}${currency}`]; // monthlyKES? no camel issue handled below if (specific != null) return specific; // explicit keys for safety const map = { monthlyUSD: price.dataset.monthlyUsd, monthlyKES: price.dataset.monthlyKes, annualMonthlyUSD: price.dataset.annualMonthlyUsd, annualMonthlyKES: price.dataset.annualMonthlyKes, annualTotalUSD: price.dataset.annualTotalUsd, annualTotalKES: price.dataset.annualTotalKes }; if (name === 'monthly' && currency === CURRENCY.USD) return map.monthlyUSD; if (name === 'monthly' && currency === CURRENCY.KES) return map.monthlyKES; if (name === 'annualMonthly' && currency === CURRENCY.USD) return map.annualMonthlyUSD; if (name === 'annualMonthly' && currency === CURRENCY.KES) return map.annualMonthlyKES; if (name === 'annualTotal' && currency === CURRENCY.USD) return map.annualTotalUSD; if (name === 'annualTotal' && currency === CURRENCY.KES) return map.annualTotalKES; // fallback (old generic data) return price.dataset[name]; }; if (billing === BILLING.MONTHLY) { const monthly = toNumber(field('monthly')); if (monthly === null) return; valueEl.textContent = formatNumber(monthly, currency); currencyEl.textContent = currency === CURRENCY.KES ? 'KSh' : '$'; periodEl.textContent = '/ month'; billingEl.textContent = 'Billed monthly'; billingEl.classList.remove('is-annual'); return; } const annualMonthly = toNumber(field('annualMonthly')); const annualTotal = toNumber(field('annualTotal')); if (annualMonthly === null || annualTotal === null) return; valueEl.textContent = formatNumber(annualMonthly, currency); currencyEl.textContent = currency === CURRENCY.KES ? 'KSh' : '$'; periodEl.textContent = '/ month'; billingEl.textContent = currency === CURRENCY.KES ? `KSh ${formatNumber(annualTotal, currency)} billed annually` : `$${formatNumber(annualTotal, currency)} billed annually`; billingEl.classList.add('is-annual'); } function toNumber(value) { if (value === undefined || value === null || value === '') return null; const n = Number(value); return Number.isFinite(n) ? n : null; } function formatNumber(value, currency) { return (currency === CURRENCY.KES ? formatters.KES : formatters.USD).format(value); } async function detectCurrencyFast() { const cached = readCurrencyCache(); if (cached) return cached; try { const res = await fetch('https://ipapi.co/json/', { method: 'GET', cache: 'no-store' }); if (!res.ok) { writeCurrencyCache(CURRENCY.USD); return CURRENCY.USD; } const data = await res.json(); const code = String(data?.country_code || '').toUpperCase(); const currency = code === 'KE' ? CURRENCY.KES : CURRENCY.USD; writeCurrencyCache(currency); return currency; } catch (_) { writeCurrencyCache(CURRENCY.USD); return CURRENCY.USD; } } function readCurrencyCache() { try { const raw = localStorage.getItem(CACHE_KEY); if (!raw) return null; const parsed = JSON.parse(raw); if (!parsed?.currency || !parsed?.timestamp) return null; if (Date.now() - parsed.timestamp > CACHE_TTL_MS) return null; if (parsed.currency !== CURRENCY.USD && parsed.currency !== CURRENCY.KES) return null; return parsed.currency; } catch (_) { return null; } } function writeCurrencyCache(currency) { try { localStorage.setItem(CACHE_KEY, JSON.stringify({ currency, timestamp: Date.now() })); } catch (_) {} } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init, { once: true }); } else { init(); } })();