/**
* HAIQ embedded checkout widget.
* Expects wp_localize_script object `haiqCheckout`:
* stripePublishableKey, edgeCreateCheckoutUrl, optional defaultPartner ('sac' | 'msc' | 'pdr').
*/
;(function () {
'use strict'
var localized =
typeof window.haiqCheckout !== 'undefined' && window.haiqCheckout !== null
? window.haiqCheckout
: {}
var STRIPE_PUBLISHABLE_KEY = localized.stripePublishableKey || ''
var EDGE_FUNCTION_URL = localized.edgeCreateCheckoutUrl || ''
if (window.createHaiqWidget) return
window.__HAIQ_WIDGETS = []
window.__HAIQ_EMBEDDED_CHECKOUT__ = null
window.destroyAllHaiqCheckouts = function () {
if (window.__HAIQ_EMBEDDED_CHECKOUT__) {
try {
window.__HAIQ_EMBEDDED_CHECKOUT__.destroy()
} catch (err) {
/* ignore */
}
window.__HAIQ_EMBEDDED_CHECKOUT__ = null
}
window.__HAIQ_WIDGETS.forEach(function (w) {
w.reset()
})
}
window.createHaiqWidget = function (config) {
var matchingElements = document.querySelectorAll('#' + config.containerId)
var root = null
for (var i = 0; i < matchingElements.length; i++) {
if (!matchingElements[i].getAttribute('data-haiq-built')) {
root = matchingElements[i]
root.setAttribute('data-haiq-built', 'true')
break
}
}
if (!root) return
var subtitleRaw =
config.subtitle != null && String(config.subtitle).trim() !== ''
? String(config.subtitle).trim()
: ''
var subtitleBlock =
subtitleRaw === ''
? ''
: '
' + escapeHtml(subtitleRaw) + '
'
root.innerHTML =
'' +
'
' +
'
' +
'' +
'' +
'
' +
'
' +
'
' +
escapeHtml(config.title) +
'
' +
subtitleBlock +
'
' +
'
' +
escapeHtml(config.monthlyPrice) +
'
' +
'
Every month
' +
'
' +
'
' +
escapeHtml(config.description) +
'
' +
'
' +
'' +
'
' +
'
' +
'
Opening secure checkout...
' +
'
' +
'
' +
'' +
'
' +
'
' +
'
'
var activePlan = 'monthly'
var PRODUCTS = {
monthly: {
priceText: config.monthlyPrice,
suffix: 'Every month',
term: 1,
},
two_month: {
priceText: config.twoMonthPrice,
suffix: 'Every 2 months',
term: 2,
},
}
var planBtns = root.querySelectorAll('.haiq-plan-btn')
var priceEl = root.querySelector('.haiq-price')
var suffixEl = root.querySelector('.haiq-price-suffix')
var subscribeBtn = root.querySelector('.haiq-subscribe-btn')
var checkoutSection = root.querySelector('.haiq-checkout-section')
var loadingText = root.querySelector('.haiq-loading-text')
var checkoutMountEl = root.querySelector('.haiq-checkout-container')
var cancelBtn = root.querySelector('.haiq-cancel-btn')
window.__HAIQ_WIDGETS.push({
reset: function () {
checkoutSection.style.display = 'none'
subscribeBtn.disabled = false
subscribeBtn.style.opacity = '1'
checkoutMountEl.innerHTML = ''
},
})
function scrollCheckoutSectionIntoView(opts) {
var snap = opts && opts.snap === true
var b = snap ? 'auto' : 'smooth'
window.requestAnimationFrame(function () {
checkoutSection.scrollIntoView({
behavior: b,
block: 'center',
inline: 'nearest',
})
})
}
function renderPlan() {
var cfg = PRODUCTS[activePlan]
priceEl.textContent = cfg.priceText
suffixEl.textContent = cfg.suffix
planBtns.forEach(function (b) {
var isActive = b.getAttribute('data-plan') === activePlan
b.classList.toggle('is-active', isActive)
b.setAttribute('aria-pressed', isActive ? 'true' : 'false')
})
}
function getPartner(config) {
var partnerRaw = (
(config.partner != null ? String(config.partner) : '') ||
(localized.defaultPartner != null ? String(localized.defaultPartner) : '')
)
.trim()
.toLowerCase()
if (partnerRaw === 'msc' || partnerRaw === 'sac' || partnerRaw === 'pdr') {
return partnerRaw
}
return ''
}
async function openCheckout() {
if (!STRIPE_PUBLISHABLE_KEY || !EDGE_FUNCTION_URL) {
checkoutSection.style.display = 'block'
loadingText.style.display = 'block'
loadingText.textContent =
'Checkout is not configured. Please contact the site administrator.'
subscribeBtn.disabled = false
subscribeBtn.style.opacity = '1'
scrollCheckoutSectionIntoView()
return
}
window.destroyAllHaiqCheckouts()
subscribeBtn.disabled = true
subscribeBtn.style.opacity = '0.7'
checkoutSection.style.display = 'block'
loadingText.style.display = 'block'
loadingText.textContent = 'Opening secure checkout...'
scrollCheckoutSectionIntoView()
try {
if (!window.__HAIQ_SHARED_STRIPE__) {
window.__HAIQ_SHARED_STRIPE__ = window.Stripe(STRIPE_PUBLISHABLE_KEY)
}
var stripe = window.__HAIQ_SHARED_STRIPE__
var requestPayload = {
productKey: config.productKey,
term: PRODUCTS[activePlan].term,
source_url: window.location.href,
source_page_title: document.title,
}
var partner = getPartner(config)
if (partner !== '') {
requestPayload.partner = partner
}
var response = await fetch(EDGE_FUNCTION_URL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(requestPayload),
})
var data = await response.json().catch(function () {
return {}
})
if (!response.ok) {
throw new Error(data && data.error ? data.error : 'Failed to create checkout.')
}
var checkout = await stripe.initEmbeddedCheckout({
clientSecret: data.clientSecret,
})
window.__HAIQ_EMBEDDED_CHECKOUT__ = checkout
loadingText.style.display = 'none'
checkout.mount(checkoutMountEl)
scrollCheckoutSectionIntoView()
window.setTimeout(function () {
scrollCheckoutSectionIntoView({ snap: true })
}, 400)
} catch (err) {
console.error(err)
loadingText.textContent =
err && err.message ? String(err.message) : 'Checkout unavailable right now.'
subscribeBtn.disabled = false
subscribeBtn.style.opacity = '1'
scrollCheckoutSectionIntoView()
}
}
planBtns.forEach(function (btn) {
btn.addEventListener('click', function () {
var newPlan = btn.getAttribute('data-plan')
if (activePlan === newPlan) return
activePlan = newPlan
renderPlan()
if (checkoutSection.style.display === 'block') {
openCheckout()
}
})
})
subscribeBtn.addEventListener('click', function (e) {
e.preventDefault()
openCheckout()
})
if (cancelBtn) {
cancelBtn.addEventListener('click', function (e) {
e.preventDefault()
window.destroyAllHaiqCheckouts()
root.scrollIntoView({ behavior: 'smooth', block: 'center' })
})
}
renderPlan()
}
function escapeHtml(text) {
if (text == null) return ''
var div = document.createElement('div')
div.textContent = String(text)
return div.innerHTML
}
function bootWidgets() {
var mounts = document.querySelectorAll('[data-haiq-widget]')
mounts.forEach(function (el) {
var raw = el.getAttribute('data-haiq-config')
if (!raw) return
try {
var cfg = JSON.parse(raw)
if (!cfg.containerId && el.id) {
cfg.containerId = el.id
}
if (window.createHaiqWidget) {
window.createHaiqWidget(cfg)
}
} catch (e) {
console.error('HAIQ Checkout: invalid data-haiq-config', e)
}
})
}
function runBoot() {
bootWidgets()
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', runBoot, { once: true })
} else {
runBoot()
}
})()