/** * Cookie utility functions for Growi affiliate tracking * @version 1.0.0 */ // Generate a UUID for visitor tracking function generateUUID() { return "10000000-1000-4000-8000-100000000000".replace( /[018]/g, (c) => ( c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4))) ).toString(16) ); } // Get URL parameter value function getQueryParam(param) { const urlParams = new URLSearchParams(window.location.search); const value = urlParams.get(param); return value === "" ? null : value; } // Get cookie value function getCookie(name) { const value = `; ${document.cookie}`; const parts = value.split(`; ${name}=`); if (parts.length === 2) return parts.pop().split(';').shift(); } // Set cookie with expiration function setCookie(name, value, days = 365) { const expires = new Date(); expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000); document.cookie = `${name}=${value};expires=${expires.toUTCString()};path=/;SameSite=Lax`; } // Check and manage affiliate cookies function manageAffiliateCookies() { // Get stored affiliate ID const storedAffiliateId = getCookie("growi_affiliate_id"); // Check if affiliate parameter is in URL const incomingAffiliateId = getQueryParam("a") || getQueryParam("snowball"); // Set affiliate ID cookie if needed if (incomingAffiliateId && (!storedAffiliateId || incomingAffiliateId !== storedAffiliateId)) { setCookie("growi_affiliate_id", incomingAffiliateId); } // Create visitor UID if needed const storedVisitorUid = getCookie("growi_visitor_uid"); if (!storedVisitorUid) { setCookie("growi_visitor_uid", generateUUID()); } return { affiliateId: getCookie("growi_affiliate_id"), visitorUid: getCookie("growi_visitor_uid") }; } // Update cart with affiliate information function updateCartAttributes() { const affiliateId = getCookie("growi_affiliate_id"); const visitorUid = getCookie("growi_visitor_uid"); if (affiliateId && visitorUid) { fetch('/cart/update.js', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ attributes: { __growi_affiliate_id: affiliateId, __growi_visitor_uid: visitorUid, }, }), }) .then((res) => res.json()) .then((data) => { console.log('✅ Cart attributes updated with affiliate & visitor ID', data); }) .catch((err) => { console.error('❌ Failed to update cart attributes', err); }); } } console.log("cookie-utils.js, v.5.13.25"); // Make functions globally available window.growiCookieUtils = { getCookie, setCookie, getQueryParam, generateUUID, manageAffiliateCookies, updateCartAttributes };