// assets/fanfare-integration.js
(function () {
// Wait for SDK to load
function initFanfare() {
if (typeof Fanfare === "undefined") {
setTimeout(initFanfare, 100);
return;
}
// Get organization ID from theme settings
const orgId = window.FanfareConfig?.organizationId;
if (!orgId) {
console.error("Fanfare: Missing organization ID");
return;
}
Fanfare.init({
organizationId: orgId,
environment: "production",
});
// Initialize all experience containers on page
document.querySelectorAll(".fanfare-experience").forEach(initExperience);
}
function initExperience(container) {
const experienceId = container.dataset.experienceId;
if (!experienceId) return;
const config = {
experienceId: experienceId,
displayMode: container.dataset.displayMode || "inline",
productId: container.dataset.productId,
variantId: container.dataset.variantId,
};
Fanfare.renderExperience(container, {
...config,
onStateChange: function (state) {
handleStateChange(container, state);
},
onAdmitted: function (admission) {
handleAdmission(container, admission);
},
onError: function (error) {
handleError(container, error);
},
});
}
function handleStateChange(container, state) {
// Update UI based on state
const statusEl = container.querySelector(".fanfare-status");
if (statusEl) {
statusEl.textContent = getStatusText(state);
}
}
function handleAdmission(container, admission) {
const autoRedirect = container.dataset.autoRedirect === "true";
const variantId = container.dataset.variantId;
if (autoRedirect && variantId) {
// Add to cart and redirect to checkout
addToCartAndCheckout(variantId, admission.token);
} else {
// Show checkout button
showCheckoutButton(container, admission);
}
}
function addToCartAndCheckout(variantId, admissionToken) {
// Add item to Shopify cart
fetch("/cart/add.js", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
items: [
{
id: variantId,
quantity: 1,
properties: {
_fanfare_token: admissionToken,
_fanfare_admitted_at: new Date().toISOString(),
},
},
],
}),
})
.then(function (response) {
if (response.ok) {
// Redirect to checkout
window.location.href = "/checkout";
} else {
throw new Error("Failed to add to cart");
}
})
.catch(function (error) {
console.error("Cart error:", error);
alert("Failed to add item to cart. Please try again.");
});
}
function showCheckoutButton(container, admission) {
const button = document.createElement("button");
button.className = "fanfare-checkout-btn";
button.textContent = "Complete Purchase";
button.onclick = function () {
addToCartAndCheckout(container.dataset.variantId, admission.token);
};
container.appendChild(button);
}
function handleError(container, error) {
console.error("Fanfare error:", error);
const errorEl = document.createElement("div");
errorEl.className = "fanfare-error";
errorEl.textContent = "Unable to load experience. Please refresh the page.";
container.appendChild(errorEl);
}
function getStatusText(state) {
const statusMap = {
not_started: "Experience not started",
entering: "Joining...",
routing: "Finding your place...",
waiting: "You're in the queue",
admitted: "You're in! Complete your purchase",
completed: "Purchase complete",
expired: "Session expired",
};
return statusMap[state.stage] || state.stage;
}
// Start initialization
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", initFanfare);
} else {
initFanfare();
}
})();