customerio-gist-web 3.18.1 → 3.18.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/gist.min.js CHANGED
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Gist=t():e.Gist=t()}(this,(()=>(()=>{var e={595:(e,t,n)=>{"use strict";n.d(t,{A:()=>tt});class s{on(e,t){var n=this[e];n?n.push(t):this[e]=[t]}off(e,t){var n=this[e];if(n)if(t){var s=n.indexOf(t);-1!==s&&n.splice(s,1),0===n.length&&delete this[e]}else delete this[e]}dispatch(e,t){var n=this[e];n&&n.forEach((e=>e(t)))}}function i(e){tt.config&&tt.config.logging&&console.log(`Gist: ${e}`)}const a=365,o="gist.web.isPersistingSession";function r(e,t,n=null){var s=n;s||(s=new Date).setDate(s.getDate()+a);const i={value:t,expiry:s};l().setItem(e,JSON.stringify(i))}function c(e){return g(e)}function u(e){l().removeItem(e)}function d(){const e=sessionStorage.getItem(o);return null===e?(sessionStorage.setItem(o,"true"),!0):"true"===e}function l(){return d()?localStorage:sessionStorage}function g(e){if(!e)return null;try{const t=l().getItem(e);if(!t)return null;const n=JSON.parse(t);if(!n.expiry)return n.value;const s=new Date,i=new Date(n.expiry),a=e.startsWith("gist.web.message.broadcasts")&&!e.endsWith("shouldShow")&&!e.endsWith("numberOfTimesShown")||e.startsWith("gist.web.message.user")&&!e.endsWith("seen")&&!e.endsWith("state"),o=new Date(s.getTime()+366e4);return a&&i.getTime()>o.getTime()||s.getTime()>i.getTime()?(u(e),null):n.value}catch(t){i(`Error checking key ${e} for expiry: ${t}`)}return null}var m,p=new Uint8Array(16);function f(){if(!m&&!(m="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return m(p)}const h=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;for(var w=[],v=0;v<256;++v)w.push((v+256).toString(16).substr(1));const y=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(w[e[t+0]]+w[e[t+1]]+w[e[t+2]]+w[e[t+3]]+"-"+w[e[t+4]]+w[e[t+5]]+"-"+w[e[t+6]]+w[e[t+7]]+"-"+w[e[t+8]]+w[e[t+9]]+"-"+w[e[t+10]]+w[e[t+11]]+w[e[t+12]]+w[e[t+13]]+w[e[t+14]]+w[e[t+15]]).toLowerCase();if(!function(e){return"string"==typeof e&&h.test(e)}(n))throw TypeError("Stringified UUID is invalid");return n},b=function(e,t,n){var s=(e=e||{}).random||(e.rng||f)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,t){n=n||0;for(var i=0;i<16;++i)t[n+i]=s[i];return t}return y(s)},S="gist.web.userQueueUseSSE",I="gist.web.activeSSEConnection";let x,$=30;const E={RENDERER_HOST:"https://code.gist.build",ENGINE_API_ENDPOINT:{prod:"https://engine.api.gist.build",dev:"https://engine.api.dev.gist.build",local:"http://engine.api.local.gist.build:82"},GIST_QUEUE_API_ENDPOINT:{prod:"https://consumer.cloud.gist.build",dev:"https://consumer.cloud.dev.gist.build",local:"http://api.local.gist.build:86"},GIST_QUEUE_REALTIME_API_ENDPOINT:{prod:"https://realtime.cloud.gist.build",dev:"https://realtime.cloud.dev.gist.build",local:"http://api.local.gist.build:3000"},GIST_VIEW_ENDPOINT:{prod:"https://renderer.gist.build/3.0",dev:"https://renderer.gist.build/3.0",local:"http://app.local.gist.build:8080/web"},getSdkId:function(){return x||(x=b()),x},useSSE:function(){return c(S)??!1},setUseSSEFlag:function(e){r(S,e,new Date((new Date).getTime()+6e4)),i(`Set user uses SSE to "${e}"`)},removeActiveSSEConnection:function(){u(I)},setActiveSSEConnection:function(){r(I,E.getSdkId(),new Date((new Date).getTime()+E.getSSEHeartbeat()))},hasActiveSSEConnection:function(){return c(I)??!1},isSSEConnectionManagedBySDK:function(){return c(I)===E.getSdkId()},getSSEHeartbeat:function(){return 1e3*($+5)},setSSEHeartbeat:function(e){e&&e>0&&($=e)}};function C(){const e=E.GIST_QUEUE_API_ENDPOINT[tt.config.env],t={"X-CIO-Site-Id":tt.config.siteId,"X-CIO-Client-Platform":"web"},n=_();async function s(n,s={}){const i=e+n,a=new AbortController,o=setTimeout((()=>a.abort()),5e3);try{const e=await fetch(i,{method:s.method||"GET",headers:{...t,...s.headers||{}},body:s.method&&"GET"!==s.method.toUpperCase()?s.body:void 0,signal:a.signal});clearTimeout(o);const n=e.headers.get("content-type")?.includes("application/json"),r=n?await e.json():await e.text(),c=Object.fromEntries(e.headers.entries());if(e.status<200||e.status>=400)throw{response:{status:e.status,data:r,headers:c}};return{status:e.status,headers:c,data:r}}catch(e){throw clearTimeout(o),e.response||(e.response={status:0,data:e.message||"Unknown error"}),e}}return null!=n&&(t["X-Gist-Encoded-User-Token"]=n),s.post=(e,t={},n={})=>s(e,{method:"POST",body:JSON.stringify(t),headers:{"Content-Type":"application/json",...n.headers||{}}}),s}const D="gist.web.userLocale";var T=600,k=!1;const M="gist.web.userQueueNextPullCheck",q="gist.web.sessionId";function P(){var e=c(q);return e||(e=b()),r(q,e,new Date((new Date).getTime()+18e5)),e}const R="gist.web.userToken",L="gist.web.usingGuestUserToken",A="gist.web.guestUserToken";function N(){return null!==c(L)}function W(){return c(R)}function O(){if(null===W()){var e=c(A);null==e&&(e=b(),r(A,e),i(`Set guest user token "${e}" with expiry date set to 1 year from today`)),r(R,e),r(L,!0),i(`Using anonymous session with token: "${e}"`)}}async function U(){var e=W();return null===e?null:await async function(e){const t=(new TextEncoder).encode(e),n=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(n)).map((e=>e.toString(16).padStart(2,"0"))).join("")}(e)}function _(){var e=W();return null===e?null:btoa(e)}async function H(e){try{return await C().post(`/api/v1/logs/queue/${e}`)}catch(e){return e.response}}function j(e){const t={isEmbedded:!1,elementId:"",hasRouteRule:!1,routeRule:"",position:"",hasPosition:!1,shouldScale:!1,campaignId:null,messageWidth:414,overlayColor:"#00000033",persistent:!1,exitClick:!1,hasCustomWidth:!1},n=e?.properties?.gist;return n?{isEmbedded:!!n.elementId,elementId:n.elementId||"",hasRouteRule:!!n.routeRuleWeb,routeRule:n.routeRuleWeb||"",position:n.position||"",hasPosition:!!n.position,shouldScale:!!n.scale,campaignId:n.campaignId??null,messageWidth:n.messageWidth>0?n.messageWidth:t.messageWidth,hasCustomWidth:n.messageWidth>0,overlayColor:n.overlayColor||t.overlayColor,persistent:!!n.persistent,exitClick:!!n.exitClick}:t}var G=["x-gist-top","x-gist-floating-top","x-gist-bottom","x-gist-floating-bottom","x-gist-floating-bottom-left","x-gist-floating-bottom-right","x-gist-floating-top-left","x-gist-floating-top-right"];function V(e){if(document.getElementById(e))return;const t=document.createElement("div");t.id=e,"x-gist-top"===e?document.body.insertBefore(t,document.body.firstChild):document.body.insertAdjacentElement("beforeend",t),i("Top & bottom elements injected into page")}const z=["x-gist-top","x-gist-bottom","x-gist-floating-top","x-gist-floating-bottom"];function F(e){return tt.currentMessages.find((t=>t.instanceId===e))}function B(e){return!!e&&tt.currentMessages.some((t=>t.queueId===e))}function J(e){return e?tt.currentMessages.find((t=>t.elementId===e)):null}function Q(e){tt.currentMessages=tt.currentMessages.filter((t=>t.instanceId!==e))}function X(e,t){Q(e),tt.currentMessages.push(t)}function K(e){const t={topLeft:"x-gist-floating-top-left",topCenter:"x-gist-floating-top",topRight:"x-gist-floating-top-right",bottomLeft:"x-gist-floating-bottom-left",bottomCenter:"x-gist-floating-bottom",bottomRight:"x-gist-floating-bottom-right"};return e&&t[e]?t[e]:(i(`Invalid overlay position "${e}", defaulting to "topCenter"`),t.topCenter)}function Y(e,t){if(e.properties||(e.properties={}),e.properties.gist||(e.properties.gist={}),"modal"===t.displayType)e.overlay=!0,e.elementId=null,e.properties.gist.elementId=null,e.position=t.modalPosition||"center",e.properties.gist.position=t.modalPosition||"center";else if("overlay"===t.displayType){e.overlay=!1;const n=K(t.overlayPosition);e.elementId=n,e.properties.gist.elementId=n,e.position=null,e.properties.gist.position=null}else"inline"===t.displayType&&(e.overlay=!1,e.elementId=t.elementSelector,e.properties.gist.elementId=t.elementSelector,e.position=null,e.properties.gist.position=null);e.elementId&&z.includes(e.elementId)?delete e.properties.gist.messageWidth:void 0!==t.maxWidth&&t.maxWidth>0?e.properties.gist.messageWidth=t.maxWidth:delete e.properties.gist.messageWidth,void 0!==t.overlayColor?e.properties.gist.overlayColor=t.overlayColor:delete e.properties.gist.overlayColor,void 0!==t.dismissOutsideClick?e.properties.gist.exitClick=t.dismissOutsideClick:delete e.properties.gist.exitClick}const Z=e=>new Promise((t=>setTimeout(t,e)));function ee(e){var t=ce(e);t&&(t.classList.remove("gist-visible"),Array.from(t.classList).filter((e=>e.startsWith("gist-"))).forEach((e=>t.classList.remove(e))),t.style.removeProperty("height"),t.style.removeProperty("width"),t.innerHTML="")}function te(e){var t=ce(e);if(t)return t.style&&t.style.height&&"0px"!=t.style.height}function ne(e,t,n=null){const s=document.getElementById(e);s&&(s.onload=function(){!function(e,t,n=null){const s=document.getElementById(e);if(s&&s.contentWindow){const e={options:t,capabilities:se};n&&(t.stepId=n),s.contentWindow.postMessage(e,"*")}}(e,t,n)})}const se=["MultiStepDisplayTypes"];async function ie(){var e=document.querySelector(".gist-message");e&&(e.classList.remove("gist-visible"),await Z(300)),ae()}function ae(){var e=document.querySelector("#gist-embed-message");e&&e.parentNode.removeChild(e)}function oe(e){return`gist-${e}`}function re(){var e=document.querySelector(".gist-message");e&&e.classList.add("gist-visible")}function ce(e){try{return document.querySelector(`#${e}`)||null}catch{return null}}const ue="gist.web.customAttributes";let de=new Map;function le(){const e=Array.from(de.entries()),t=new Date;t.setDate(t.getDate()+30),r(ue,e,t),i(`Saved ${de.size} custom attributes to storage with TTL of 30 days`)}!function(){const e=c(ue);if(e)try{de=new Map(e)}catch{de=new Map}else de=new Map}();const ge="gist.web.message.broadcasts",me=60;async function pe(e){const t=await ve();if(!t)return;const n=new Date;n.setMinutes(n.getMinutes()+me),r(t,e.filter(he),n)}async function fe(e,t){return c(e).find((e=>e.queueId===t))}function he(e){return e.properties&&e.properties.gist&&e.properties.gist.broadcast}function we(e){if(!he(e))return!1;const{broadcast:t}=e.properties.gist;return 0===t.frequency.delay&&0===t.frequency.count}async function ve(){const e=await U();return e?`${ge}.${e}`:null}function ye(e,t){return`${e}.${t}.numberOfTimesShown`}function be(e,t){return`${e}.${t}.shouldShow`}const Se="gist.web.message.user",Ie=60;async function xe(e){const t=await $e();if(!t)return;const n=e.filter((e=>!(e.properties&&e.properties.gist&&e.properties.gist.broadcast))),s=new Date;s.setMinutes(s.getMinutes()+Ie),r(t,n,s)}async function $e(){const e=await U();return e?`${Se}.${e}`:null}async function Ee(){const e=await U();return e?`${Se}.${e}.seen`:null}async function Ce(e){const t=await U();return t?`${Se}.${t}.message.${e}.loading`:null}async function De(e){const t=await U();return t?`${Se}.${t}.message.${e}.state`:null}async function Te(e){const t=await De(e);t&&(u(t),i(`Cleared message state for queueId: ${e}`))}async function ke(e){if(tt.isDocumentVisible){if(B(e.queueId))return i(`Message with queueId ${e.queueId} is already showing.`),null;if(tt.overlayInstanceId)return i(`Message ${tt.overlayInstanceId} already showing.`),null;var t=j(e);return e.instanceId=b(),e.overlay=!0,e.firstLoad=!0,e.shouldResizeHeight=!0,e.shouldScale=t.shouldScale,e.renderStartTime=(new Date).getTime(),tt.overlayInstanceId=e.instanceId,tt.currentMessages.push(e),Ae(e,null,e.savedStepName||null)}return i("Document hidden, not showing message now."),null}function Me(e,t){return tt.isDocumentVisible?B(e.queueId)?(i(`Message with queueId ${e.queueId} is already showing.`),null):J(t)?(i(`Message with elementId ${t} already has a message.`),null):(e.instanceId=b(),e.overlay=!1,e.firstLoad=!0,e.shouldScale=!1,e.elementId=t,e.shouldResizeHeight=!te(t),e.renderStartTime=(new Date).getTime(),tt.currentMessages.push(e),Ae(e,t,e.savedStepName||null)):(i("Document hidden, not showing message now."),null)}async function qe(e){e?(tt.messageDismissed(e),e.overlay?await Le(!0,e):Re(e)):i(`Message with instance id: ${e.instanceId} not found`)}async function Pe(e){var t=j(e);e?t.persistent&&(i("Persistent message dismissed, logging view"),await Ue(e),await Ne(e),await Te(e.queueId)):i(`Message with instance id: ${e.instanceId} not found`)}function Re(e){Q(e.instanceId),ee(e.elementId)}async function Le(e,t){e?await ie():ae(),0==tt.currentMessages.length&&(window.removeEventListener("message",Oe),window.removeEventListener("touchstart",We)),Q(t.instanceId),tt.overlayInstanceId=null}function Ae(e,t=null,n=null){var s={endpoint:E.ENGINE_API_ENDPOINT[tt.config.env],siteId:tt.config.siteId,dataCenter:tt.config.dataCenter,messageId:e.messageId,instanceId:e.instanceId,livePreview:!1,properties:e.properties,customAttributes:Object.fromEntries(new Map(de))},a=`${E.GIST_VIEW_ENDPOINT[tt.config.env]}/index.html`;return window.addEventListener("message",Oe),window.addEventListener("touchstart",We),t?(G.includes(t)&&V(t),function(e,t,n,s,a=null){var o=ce(e);if(o){var r=oe(n.instanceId);o.classList.add(r);var c=j(n),u=c.messageWidth+"px";z.includes(e)&&!c.hasCustomWidth&&(u="100%"),G.includes(e)&&(o.style.width=u),te(e)||(o.style.height="0px"),o.innerHTML=function(e,t,n){var s=function(e,t,n){var s=800;return t.messageWidth>s&&(s=t.messageWidth),`\n <div id="gist-embed">\n <style>\n #x-gist-floating-top, #x-gist-floating-top-left, #x-gist-floating-top-right {\n position: fixed;\n top: 0px;\n z-index: 1000000;\n }\n #x-gist-floating-bottom, #x-gist-floating-bottom-left, #x-gist-floating-bottom-right {\n position: fixed;\n bottom: 0px;\n z-index: 1000000;\n }\n #x-gist-bottom, #x-gist-top, #x-gist-floating-top, #x-gist-floating-bottom {\n left: 50%;\n transform: translate(-50%, 0%);\n }\n #x-gist-floating-top-right, #x-gist-floating-bottom-right {\n right: 0px;\n }\n #gist-embed {\n position: relative;\n height: 100%;\n width: 100%;\n }\n #gist-embed-container {\n position: relative;\n height: 100%;\n width: 100%;\n }\n #gist-embed-container .gist-frame {\n height: 100%;\n width: 100%;\n border: none;\n }\n #x-gist-top.${e},\n #x-gist-bottom.${e},\n #x-gist-floating-top.${e},\n #x-gist-floating-bottom.${e},\n #x-gist-floating-top-left.${e},\n #x-gist-floating-top-right.${e},\n #x-gist-floating-bottom-left.${e},\n #x-gist-floating-bottom-right.${e} {\n transition: height 0.1s ease-in-out;\n }\n @media (max-width: ${s}px) {\n #x-gist-top.${e},\n #x-gist-bottom.${e},\n #x-gist-floating-top.${e},\n #x-gist-floating-bottom.${e},\n #x-gist-floating-top-left.${e},\n #x-gist-floating-top-right.${e},\n #x-gist-floating-bottom-left.${e},\n #x-gist-floating-bottom-right.${e} {\n width: 100% !important;\n }\n }\n </style>\n <div id="gist-embed-container">\n <iframe id="${e}" class="gist-frame" src="${n}"></iframe>\n </div>\n </div>`}(oe(t.instanceId),n,e);return s}(t,n,c),ne(r,s,a)}else i(`Message could not be embedded, elementId ${e} not found.`)}(t,a,e,s,n)):function(e,t,n,s=null){document.body.insertAdjacentHTML("afterbegin",function(e,t){var n=j(t),s=function(e,t,n){var s=600;return t.messageWidth>s&&(s=t.messageWidth),`\n <div id="gist-embed-message">\n <style>\n #gist-overlay.gist-background {\n position: fixed;\n z-index: 9999999998;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background-color: ${t.overlayColor};\n visibility: hidden;\n }\n #gist-overlay.gist-background.gist-visible {\n visibility: visible;\n }\n .gist-message {\n width: ${t.messageWidth}px;\n position: absolute;\n border: none;\n opacity: 0;\n transition: opacity 0.3s ease-in-out, height 0.1s ease-in-out;\n z-index: 9999999999;\n left: 50%;\n transform: translateX(-50%);\n }\n .gist-message.gist-visible {\n opacity: 1;\n pointer-events: auto;\n }\n .gist-message.gist-center {\n transform: translate(-50%, -50%);\n top: 50%;\n }\n .gist-message.gist-bottom {\n bottom: 0;\n }\n .gist-message.gist-top {\n top: 0;\n }\n @media (max-width: ${s}px) {\n .gist-message {\n width: 100%;\n }\n }\n </style>\n <div id="gist-overlay" class="gist-background">\n <iframe id="${e}" class="gist-message" src="${n}"></iframe>\n </div>\n </div>`}(oe(t.instanceId),n,e);return s}(e,t)),ne(oe(t.instanceId),n,s)}(a,e,s,n),e}async function Ne(e){i(`Message shown, logging view for: ${e.messageId}`);var t={};null!=e.queueId?(await Ue(e),t=await H(e.queueId)):t=await async function(e){try{return await C().post(`/api/v1/logs/message/${e}`)}catch(e){return e.response}}(e.messageId),200===t.status?i("Message view logged"):i(`Problem logging message: ${t.status}`)}function We(){}async function Oe(e){if(e.data.gist&&e.origin===E.RENDERER_HOST){var t=e.data.gist.instanceId,n=F(t);if(!n)return;var s=j(n);switch(e.data.gist.method){case"routeLoaded":var a=.001*((new Date).getTime()-n.renderStartTime);i(`Engine render for message: ${n.messageId} timer elapsed in ${a.toFixed(3)} seconds`),async function(e){const t=await Ce(e);if(!t)return!1;u(t)}(n.queueId),n.currentRoute=e.data.gist.parameters.route,(n.firstLoad||n.isDisplayChange)&&(n.overlay?function(e){var t=j(e),n=document.querySelector("#gist-overlay");if(n){n.classList.add("gist-visible");var s=document.querySelector(".gist-message");e.position?s.classList.add("gist-"+e.position):s.classList.add("gist-center"),setTimeout(re,100),t.exitClick&&setTimeout((()=>function(e){var t=document.querySelector("#gist-overlay");t&&t.addEventListener("click",(function(){tt.dismissMessage(e)}))}(e.instanceId)),1e3)}else ae()}(n):(h=ce(n.elementId))&&h.classList.add("gist-visible"),n.firstLoad&&!n.isDisplayChange&&(tt.messageShown(n),s.persistent?i("Persistent message shown, skipping logging view"):await Ne(n)),n.firstLoad=!1,n.isDisplayChange=!1),X(t,n);break;case"tap":var o=e.data.gist.parameters.action,d=e.data.gist.parameters.name;if(tt.messageAction(n,o,d),e.data.gist.parameters.system&&!s.persistent){await qe(n);break}try{var l=new URL(o);if(l&&"gist:"===l.protocol)switch(l.href.replace("gist://","").split("?")[0]){case"close":await qe(n),await Pe(n),await _e(n),await Ke();break;case"showMessage":var g=l.searchParams.get("messageId"),m=l.searchParams.get("properties");g&&(m&&(m=JSON.parse(atob(m))),await tt.showMessage({messageId:g,properties:m}));break;case"loadPage":(l=l.href.substring(l.href.indexOf("?url=")+5))&&(l.startsWith("mailto:")||l.startsWith("https://")||l.startsWith("http://")||l.startsWith("/")?window.location.href=l:window.location.href=window.location+l)}}catch{}break;case"changeMessageStep":var p=e.data.gist.parameters.displaySettings,f=e.data.gist.parameters.messageStepName;(s.persistent||we(n))&&await async function(e,t,n){const s=await De(e);if(!s)return;const a=c(s)||{},o={stepName:void 0!==t?t:a.stepName,displaySettings:void 0!==n?n:a.displaySettings},u=new Date;u.setDate(u.getDate()+30),r(s,o,u),i(`Saved message state for queueId: ${e}`)}(n.queueId,f,p),p&&function(e,t){const n=(s=e).overlay?"modal":s.elementId&&G.includes(s.elementId)?"overlay":s.elementId?"inline":"modal";var s;const i=t.displayType;if(void 0===i)return!1;if(n!==i)return!0;const a=j(e);switch(i){case"modal":if((e.position||"center")!==(t.modalPosition||"center"))return!0;if(void 0!==t.dismissOutsideClick&&a.exitClick!==t.dismissOutsideClick)return!0;if(void 0!==t.overlayColor&&a.overlayColor!==t.overlayColor)return!0;break;case"overlay":{const n=K(t.overlayPosition);if(e.elementId!==n)return!0;break}case"inline":if(e.elementId!==t.elementSelector)return!0}return void 0!==t.maxWidth&&a.messageWidth!==t.maxWidth}(n,p)&&(i("Display settings changed, reloading message"),await async function(e){e.overlay?await ie():ee(e.elementId)}(n),Y(n,p),await async function(e,t){e.isDisplayChange=!0,e.renderStartTime=(new Date).getTime();var n=e.elementId||null;if(n){const t=J(n);t&&t.instanceId!==e.instanceId&&(i(`Dismissing existing message at ${n} to make room for multi-step message`),await qe(t))}if(e.overlay){tt.overlayInstanceId=e.instanceId;var s=j(e);e.shouldScale=s.shouldScale,e.shouldResizeHeight=!0}else tt.overlayInstanceId=null,e.shouldScale=!1,e.shouldResizeHeight=!te(n);n&&G.includes(n)&&V(n),Ae(e,n,t)}(n,f));break;case"routeChanged":n.currentRoute=e.data.gist.parameters.route,n.renderStartTime=(new Date).getTime(),X(t,n),i(`Route changed to: ${n.currentRoute}`);break;case"sizeChanged":i(`Size Changed Width: ${e.data.gist.parameters.width} - Height: ${e.data.gist.parameters.height}`),n.elementId&&!n.shouldResizeHeight||function(e,t){var n=ce(e.elementId?e.elementId:oe(e.instanceId));if(n){var s=n.style;if(t.height>0)if(t.height>window.innerHeight){var i=1-(t.height/window.innerHeight-1);e.shouldScale&&i>=.4?(s.height=`${t.height}px`,s.transform=`translateX(-50%) translateY(-50%) scale(${i})`):s.height=`${window.innerHeight}px`}else s.height=`${t.height}px`}}(n,e.data.gist.parameters);break;case"titleChanged":i(`Overlay title changed to: ${e.data.gist.parameters.title}`),function(e,t){var n=ce(oe(e));n&&(n.title=t)}(t,e.data.gist.parameters.title);break;case"eventDispatched":tt.events.dispatch("eventDispatched",{name:e.data.gist.parameters.name,payload:e.data.gist.parameters.payload});break;case"error":case"routeError":tt.messageError(n),tt.overlayInstanceId?Le(!1,n):Re(n)}}var h}async function Ue(e){i(`Logging user message view locally for: ${e.queueId}`),he(e)?await async function(e){i(`Marking broadcast ${e} as seen.`);const t=await ve();if(!t)return;const n=await fe(t,e);if(!n)return;const{broadcast:s}=n.properties.gist,a=ye(t,e),o=be(t,e);let u=c(a)||0;if(r(a,u+1),1===s.frequency.count)r(o,!1),i(`Marked broadcast ${e} as seen.`);else{let t=new Date;t.setSeconds(t.getSeconds()+s.frequency.delay),r(o,!1,t),i(`Marked broadcast ${e} as seen, broadcast was seen ${u+1} times, next show date is ${t}.`)}}(e.queueId):await async function(e){const t=await Ee();if(!t)return;const n=c(t)??[];n.push(e),r(t,n)}(e.queueId)}async function _e(e){he(e)&&(i(`Logging broadcast dismissed locally for: ${e.queueId}`),await async function(e){i(`Marking broadcast ${e} as dismissed.`);const t=await ve();if(!t)return;const n=await fe(t,e);if(!n)return;const{broadcast:s}=n.properties.gist;!0!==s.frequency.ignoreDismiss?(r(be(t,e),!1),i(`Marked broadcast ${e} as dismissed and will not show again.`)):i(`Broadcast ${e} is set to ignore dismiss.`)}(e.queueId),await Te(e.queueId))}const He="messageInboxUpdated",je="gist.web.inbox.messages",Ge=60;async function Ve(e){const t=await Fe();if(!t)return;const n=new Date;n.setMinutes(n.getMinutes()+Ge),r(t,e,n),tt.events.dispatch(He,e)}async function ze(){const e=await Fe();if(!e)return[];const t=c(e)??[],n=new Date;return t.filter((e=>!e.expiry||new Date(e.expiry)>n))}async function Fe(){const e=await U();return e?`${je}.${e}`:null}var Be=(e,t)=>e().then((e=>new Promise((t=>setTimeout(t,e))))(t).then((()=>Be(e,t)))),Je=!1;let Qe=null;async function Xe(){Je?await Ke():W()?(i("Queue watcher started"),Je=!0,Be((()=>new Promise((()=>async function(){if(E.hasActiveSSEConnection())return!E.isSSEConnectionManagedBySDK()&&Qe&&(i("Not the main instance, closing our SSE connection."),et()),void await Ke();Qe&&(i("SSE connection not active, closing it."),et()),!E.useSSE()||N()?await Ze():await async function(){et();const e=null===(t=_())?(i("No user token available for SSE endpoint."),null):E.GIST_QUEUE_REALTIME_API_ENDPOINT[tt.config.env]+`/api/v3/sse?userToken=${t}&siteId=${tt.config.siteId}&sessionId=${P()}`;var t;if(null===e)return i("SSE endpoint not available, falling back to polling."),void await Ze();i(`Starting SSE queue listener on ${e}`),Qe=new EventSource(e),E.setActiveSSEConnection(),Qe.addEventListener("connected",(async e=>{try{i("SSE connection received:"),E.setUseSSEFlag(!0);var t=JSON.parse(e.data);t.heartbeat&&(E.setSSEHeartbeat(t.heartbeat),i(`SSE heartbeat set to ${t.heartbeat} seconds`)),E.setActiveSSEConnection()}catch(e){i(`Failed to parse SSE settings: ${e}`)}u(M),await Ze()})),Qe.addEventListener("messages",(async e=>{try{var t=JSON.parse(e.data);i("SSE message received:"),await xe(t),await pe(t),await Ke()}catch(e){i("Failed to parse SSE message"),et()}})),Qe.addEventListener("inbox_messages",(async e=>{try{var t=JSON.parse(e.data);i("SSE inbox messages received:"),await Ve(t)}catch(e){i("Failed to parse SSE inbox messages")}})),Qe.addEventListener("error",(async e=>{i("SSE error received:"),et()})),Qe.addEventListener("heartbeat",(async e=>{i("SSE heartbeat received:"),E.setActiveSSEConnection(),E.setUseSSEFlag(!0)}))}()}()))),1e3)):i("User token not setup, queue not started.")}async function Ke(){var e=await async function(){const e=await ve();return e?(c(e)??[]).filter((t=>{const{broadcast:n}=t.properties.gist,s=c(be(e,t.queueId))??!0,i=c(ye(e,t.queueId))||0,a=0===n.frequency.count;return s&&(a||i<n.frequency.count)})):[]}(),t=await async function(){const e=await $e();if(!e)return[];const t=c(e)??[],n=await async function(){const e=await Ee();return e?c(e)??[]:[]}();return t.filter((e=>!n.includes(e.queueId)))}(),n=e.concat(t);i(`Messages in local queue: ${n.length}`);var s=n.sort(((e,t)=>e.priority-t.priority));for(const e of s)await Ye(e)}async function Ye(e){var t=j(e);if(t.hasRouteRule){var n=tt.currentRoute;null==n&&(n=new URL(window.location.href).pathname);var s=t.routeRule;if(i(`Verifying route ${n} against rule: ${s}`),!new RegExp(s).test(n))return i(`Route ${n} does not match rule.`),!1}if(t.hasPosition&&(e.position=t.position),t.persistent||we(e)){const n=await async function(e){const t=await De(e);return t?c(t):null}(e.queueId);n&&(i(`Restoring saved state for queueId ${e.queueId}`),n.displaySettings&&(Y(e,n.displaySettings),t=j(e)),e.savedStepName=n.stepName)}if(t.persistent||we(e)||!await async function(e){const t=await Ce(e);return!!t&&null!==c(t)}(e.queueId)){var a;return(a=t.isEmbedded?Me(e,t.elementId):await ke(e))&&async function(e){const t=await Ce(e);if(!t)return!1;r(t,!0,new Date(Date.now()+5e3))}(e.queueId),a}return i(`Not showing message with queueId ${e.queueId} because its already loading.`),!1}async function Ze(){if(W())if(tt.isDocumentVisible)if(null===c(M)){var e=await async function(){var e;try{if(!k){k=!0;var t={"X-Gist-User-Anonymous":N(),"Content-Language":null!==c(D)?c(D):navigator.language};e=await C().post(`/api/v4/users?sessionId=${P()}`,{},{headers:t})}}catch(t){t.response?e=t.response:i(`Error getting user queue: ${t}`)}finally{k=!1,function(e){if(e&&e.headers){var t=e.headers["x-gist-queue-polling-interval"];t&&t>0&&(T=t)}var n=new Date((new Date).getTime()+1e3*T);r(M,T,n)}(e),function(e){const t="true"===e?.headers?.["x-cio-use-sse"]?.toLowerCase();E.setUseSSEFlag(t)}(e)}return e}();if(e){if(200===e.status||204===e.status){i("200 response, updating local store.");var t=e.data?.inAppMessages||[],n=e.data?.inboxMessages||[];xe(t),pe(t),Ve(n)}else 304===e.status&&i("304 response, using local store.");await Ke()}else i("There was an error while checking message queue.")}else i("Next queue pull scheduled for later.");else i("Document not visible, skipping queue check.");else i("User token reset, skipping queue check.")}function et(e=!1){e&&E.removeActiveSSEConnection(),(e||E.isSSEConnectionManagedBySDK())&&E.setUseSSEFlag(!1),Qe&&(i("Stopping SSE queue listener..."),Qe.close(),Qe=null)}const tt=class{static async setup(e){this.events=new s,this.config={useAnonymousSession:void 0!==e.useAnonymousSession&&e.useAnonymousSession,siteId:e.siteId,dataCenter:e.dataCenter,env:void 0===e.env?"prod":e.env,logging:void 0!==e.logging&&e.logging,experiments:void 0!==e.experiments&&e.experiments},this.currentMessages=[],this.overlayInstanceId=null,this.currentRoute=null,this.isDocumentVisible=!0,this.config.isPreviewSession=function(){const e=new URLSearchParams(window.location.search).get("cioPreviewId");return e&&(sessionStorage.setItem(o,!1),tt.setUserToken(e),i(`Preview mode enabled with user token: ${e}`)),!d()}(),function(){const e=l();for(let t=e.length-1;t>=0;t--)g(e.key(t))}(),i(`Setup complete on ${this.config.env} environment.`),!this.config.isPreviewSession&&this.config.useAnonymousSession&&O(),await Xe(),document.addEventListener("visibilitychange",(async()=>{"hidden"===document.visibilityState?this.isDocumentVisible=!1:(this.isDocumentVisible=!0,await Ke())}),!1)}static async setCurrentRoute(e){this.currentRoute=e,i(`Current route set to: ${e}`),await Ke()}static async setUserToken(e,t){this.config.isPreviewSession||(function(e,t){void 0===t&&(t=new Date).setDate(t.getDate()+30),r(R,e,t),N()&&(u(M),u(L)),i(`Set user token "${e}" with expiry date set to ${t}`)}(e,t),et(!0),await Xe())}static setUserLocale(e){var t;r(D,t=e),i(`Set user locate to "${t}"`)}static setCustomAttribute(e,t){return function(e,t){return e&&"string"==typeof e?(de.set(e,t),le(),i(`Set custom attribute "${e}" to "${t}"`),!0):(i(`Invalid key for custom attribute: ${e}`),!1)}(e,t)}static clearCustomAttributes(){de.clear(),u(ue),i("Cleared all custom attributes")}static removeCustomAttribute(e){return function(e){if(!e||"string"!=typeof e)return i(`Invalid key for custom attribute: ${e}`),!1;const t=de.has(e);return de.delete(e),de.size>0?le():u(ue),i(`Removed custom attribute "${e}"`),t}(e)}static async clearUserToken(){this.config.isPreviewSession||(u(R),i("Cleared user token"),this.config.useAnonymousSession&&O(),et(!0),await Xe())}static async dismissMessage(e){var t=F(e);await qe(t),await Pe(t),await _e(t),await Ke()}static async embedMessage(e,t){var n=Me(e,t);return n?n.instanceId:null}static async showMessage(e){var t=await ke(e);return t?t.instanceId:null}static messageShown(e){i(`Message shown: ${e.messageId}`),this.events.dispatch("messageShown",e)}static messageDismissed(e){null!==e&&(i(`Message dismissed: ${e.messageId}`),this.events.dispatch("messageDismissed",e))}static messageError(e){i(`Message error: ${e.messageId}`),this.events.dispatch("messageError",e)}static messageAction(e,t,n){i(`Message action: ${e.currentRoute}, ${t} with name ${n} on ${e.instanceId}`),this.events.dispatch("messageAction",{message:e,action:t,name:n})}static async getInboxUnopenedCount(){return(await ze()).filter((e=>!e.opened)).length}static async getInboxMessages(){return await ze()}static async updateInboxMessageOpenState(e,t){return await async function(e,t){const n=await Fe();if(!n)return;const s=await async function(e,t){try{return await C()(`/api/v1/messages/${e}`,{method:"PATCH",body:JSON.stringify(t),headers:{"Content-Type":"application/json"}})}catch(e){return e.response}}(e,{opened:t});if(!s||s.status<200||s.status>=300){const e=`Failed to mark inbox message opened: ${s?.status||"unknown error"}`;throw i(e),new Error(e)}const a=await ze();let o=null;const c=a.map((n=>n.queueId===e?(n.opened=t,o=n,{...n}):n)),u=new Date;if(u.setMinutes(u.getMinutes()+Ge),r(n,c,u),o){const e=t?"opened":"unopened";tt.events.dispatch("inboxMessageAction",{message:o,action:e})}tt.events.dispatch(He,await ze())}(e,t)}static async removeInboxMessage(e){return await async function(e){const t=await Fe();if(!t)return;const n=await H(e);if(!n||n.status<200||n.status>=300){const e=`Failed to remove inbox message: ${n?.status||"unknown error"}`;throw i(e),new Error(e)}const s=(await ze()).filter((t=>t.queueId!==e)),a=new Date;a.setMinutes(a.getMinutes()+Ge),r(t,s,a),tt.events.dispatch(He,await ze())}(e)}}},44:(e,t,n)=>{const s=n(595).A;e.exports=s}},t={};function n(s){var i=t[s];if(void 0!==i)return i.exports;var a=t[s]={exports:{}};return e[s](a,a.exports,n),a.exports}return n.d=(e,t)=>{for(var s in t)n.o(t,s)&&!n.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n(44)})()));
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Gist=t():e.Gist=t()}(this,(()=>(()=>{var e={595:(e,t,n)=>{"use strict";n.d(t,{A:()=>nt});class s{on(e,t){var n=this[e];n?n.push(t):this[e]=[t]}off(e,t){var n=this[e];if(n)if(t){var s=n.indexOf(t);-1!==s&&n.splice(s,1),0===n.length&&delete this[e]}else delete this[e]}dispatch(e,t){var n=this[e];n&&n.forEach((e=>e(t)))}}function i(e){nt.config&&nt.config.logging&&console.log(`Gist: ${e}`)}const a=365,o="gist.web.isPersistingSession";function r(e,t,n=null){var s=n;s||(s=new Date).setDate(s.getDate()+a);const i={value:t,expiry:s};l().setItem(e,JSON.stringify(i))}function c(e){return g(e)}function u(e){l().removeItem(e)}function d(){const e=sessionStorage.getItem(o);return null===e?(sessionStorage.setItem(o,"true"),!0):"true"===e}function l(){return d()?localStorage:sessionStorage}function g(e){if(!e)return null;try{const t=l().getItem(e);if(!t)return null;const n=JSON.parse(t);if(!n.expiry)return n.value;const s=new Date,i=new Date(n.expiry),a=e.startsWith("gist.web.message.broadcasts")&&!e.endsWith("shouldShow")&&!e.endsWith("numberOfTimesShown")||e.startsWith("gist.web.message.user")&&!e.endsWith("seen")&&!e.endsWith("state"),o=new Date(s.getTime()+366e4);return a&&i.getTime()>o.getTime()||s.getTime()>i.getTime()?(u(e),null):n.value}catch(t){i(`Error checking key ${e} for expiry: ${t}`)}return null}var m,p=new Uint8Array(16);function f(){if(!m&&!(m="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return m(p)}const h=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;for(var y=[],w=0;w<256;++w)y.push((w+256).toString(16).substr(1));const v=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(y[e[t+0]]+y[e[t+1]]+y[e[t+2]]+y[e[t+3]]+"-"+y[e[t+4]]+y[e[t+5]]+"-"+y[e[t+6]]+y[e[t+7]]+"-"+y[e[t+8]]+y[e[t+9]]+"-"+y[e[t+10]]+y[e[t+11]]+y[e[t+12]]+y[e[t+13]]+y[e[t+14]]+y[e[t+15]]).toLowerCase();if(!function(e){return"string"==typeof e&&h.test(e)}(n))throw TypeError("Stringified UUID is invalid");return n},b=function(e,t,n){var s=(e=e||{}).random||(e.rng||f)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,t){n=n||0;for(var i=0;i<16;++i)t[n+i]=s[i];return t}return v(s)},S="gist.web.userQueueUseSSE",I="gist.web.activeSSEConnection";let x,$=30;const E={RENDERER_HOST:"https://code.gist.build",ENGINE_API_ENDPOINT:{prod:"https://engine.api.gist.build",dev:"https://engine.api.dev.gist.build",local:"http://engine.api.local.gist.build:82"},GIST_QUEUE_API_ENDPOINT:{prod:"https://consumer.cloud.gist.build",dev:"https://consumer.cloud.dev.gist.build",local:"http://api.local.gist.build:86"},GIST_QUEUE_REALTIME_API_ENDPOINT:{prod:"https://realtime.cloud.gist.build",dev:"https://realtime.cloud.dev.gist.build",local:"http://api.local.gist.build:3000"},GIST_VIEW_ENDPOINT:{prod:"https://renderer.gist.build/3.0",dev:"https://renderer.gist.build/3.0",local:"http://app.local.gist.build:8080/web"},getSdkId:function(){return x||(x=b()),x},useSSE:function(){return c(S)??!1},setUseSSEFlag:function(e){r(S,e,new Date((new Date).getTime()+6e4)),i(`Set user uses SSE to "${e}"`)},removeActiveSSEConnection:function(){u(I)},setActiveSSEConnection:function(){r(I,E.getSdkId(),new Date((new Date).getTime()+E.getSSEHeartbeat()))},hasActiveSSEConnection:function(){return c(I)??!1},isSSEConnectionManagedBySDK:function(){return c(I)===E.getSdkId()},getSSEHeartbeat:function(){return 1e3*($+5)},setSSEHeartbeat:function(e){e&&e>0&&($=e)}};function C(){const e=E.GIST_QUEUE_API_ENDPOINT[nt.config.env],t={"X-CIO-Site-Id":nt.config.siteId,"X-CIO-Client-Platform":"web"},n=_();async function s(n,s={}){const i=e+n,a=new AbortController,o=setTimeout((()=>a.abort()),5e3);try{const e=await fetch(i,{method:s.method||"GET",headers:{...t,...s.headers||{}},body:s.method&&"GET"!==s.method.toUpperCase()?s.body:void 0,signal:a.signal});clearTimeout(o);const n=e.headers.get("content-type")?.includes("application/json"),r=n?await e.json():await e.text(),c=Object.fromEntries(e.headers.entries());if(e.status<200||e.status>=400)throw{response:{status:e.status,data:r,headers:c}};return{status:e.status,headers:c,data:r}}catch(e){throw clearTimeout(o),e.response||(e.response={status:0,data:e.message||"Unknown error"}),e}}return null!=n&&(t["X-Gist-Encoded-User-Token"]=n),s.post=(e,t={},n={})=>s(e,{method:"POST",body:JSON.stringify(t),headers:{"Content-Type":"application/json",...n.headers||{}}}),s}const D="gist.web.userLocale";var k=600,T=!1;const M="gist.web.userQueueNextPullCheck",q="gist.web.sessionId";function P(){var e=c(q);return e||(e=b()),r(q,e,new Date((new Date).getTime()+18e5)),e}const R="gist.web.userToken",L="gist.web.usingGuestUserToken",A="gist.web.guestUserToken";function N(){return null!==c(L)}function W(){return c(R)}function U(){if(null===W()){var e=c(A);null==e&&(e=b(),r(A,e),i(`Set guest user token "${e}" with expiry date set to 1 year from today`)),r(R,e),r(L,!0),i(`Using anonymous session with token: "${e}"`)}}async function O(){var e=W();return null===e?null:await async function(e){const t=(new TextEncoder).encode(e),n=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(n)).map((e=>e.toString(16).padStart(2,"0"))).join("")}(e)}function _(){var e=W();return null===e?null:btoa(e)}async function H(e){try{return await C().post(`/api/v1/logs/queue/${e}`)}catch(e){return e.response}}function j(e){const t={isEmbedded:!1,elementId:"",hasRouteRule:!1,routeRule:"",position:"",hasPosition:!1,shouldScale:!1,campaignId:null,messageWidth:414,overlayColor:"#00000033",persistent:!1,exitClick:!1,hasCustomWidth:!1},n=e?.properties?.gist;return n?{isEmbedded:!!n.elementId,elementId:n.elementId||"",hasRouteRule:!!n.routeRuleWeb,routeRule:n.routeRuleWeb||"",position:n.position||"",hasPosition:!!n.position,shouldScale:!!n.scale,campaignId:n.campaignId??null,messageWidth:n.messageWidth>0?n.messageWidth:t.messageWidth,hasCustomWidth:n.messageWidth>0,overlayColor:n.overlayColor||t.overlayColor,persistent:!!n.persistent,exitClick:!!n.exitClick}:t}var G=["x-gist-top","x-gist-floating-top","x-gist-bottom","x-gist-floating-bottom","x-gist-floating-bottom-left","x-gist-floating-bottom-right","x-gist-floating-top-left","x-gist-floating-top-right"];function z(e){if(document.getElementById(e))return;const t=document.createElement("div");t.id=e,"x-gist-top"===e?document.body.insertBefore(t,document.body.firstChild):document.body.insertAdjacentElement("beforeend",t),i("Top & bottom elements injected into page")}const V=["x-gist-top","x-gist-bottom","x-gist-floating-top","x-gist-floating-bottom"];function F(e){return nt.currentMessages.find((t=>t.instanceId===e))}function B(e){return!!e&&nt.currentMessages.some((t=>t.queueId===e))}function J(e){return e?nt.currentMessages.find((t=>t.elementId===e)):null}function Q(e){nt.currentMessages=nt.currentMessages.filter((t=>t.instanceId!==e))}function X(e,t){Q(e),nt.currentMessages.push(t)}function K(e){const t={topLeft:"x-gist-floating-top-left",topCenter:"x-gist-floating-top",topRight:"x-gist-floating-top-right",bottomLeft:"x-gist-floating-bottom-left",bottomCenter:"x-gist-floating-bottom",bottomRight:"x-gist-floating-bottom-right"};return e&&t[e]?t[e]:(i(`Invalid overlay position "${e}", defaulting to "topCenter"`),t.topCenter)}function Y(e,t){if(e.properties||(e.properties={}),e.properties.gist||(e.properties.gist={}),"modal"===t.displayType)e.overlay=!0,e.elementId=null,e.properties.gist.elementId=null,e.position=t.modalPosition||"center",e.properties.gist.position=t.modalPosition||"center";else if("overlay"===t.displayType){e.overlay=!1;const n=K(t.overlayPosition);e.elementId=n,e.properties.gist.elementId=n,e.position=null,e.properties.gist.position=null}else"inline"===t.displayType&&(e.overlay=!1,e.elementId=t.elementSelector,e.properties.gist.elementId=t.elementSelector,e.position=null,e.properties.gist.position=null);e.elementId&&V.includes(e.elementId)?delete e.properties.gist.messageWidth:void 0!==t.maxWidth&&t.maxWidth>0?e.properties.gist.messageWidth=t.maxWidth:delete e.properties.gist.messageWidth,void 0!==t.overlayColor?e.properties.gist.overlayColor=t.overlayColor:delete e.properties.gist.overlayColor,void 0!==t.dismissOutsideClick?e.properties.gist.exitClick=t.dismissOutsideClick:delete e.properties.gist.exitClick}const Z=e=>new Promise((t=>setTimeout(t,e)));function ee(e){var t=ue(e);t&&(t.classList.remove("gist-visible"),Array.from(t.classList).filter((e=>e.startsWith("gist-"))).forEach((e=>t.classList.remove(e))),t.style.removeProperty("height"),t.style.removeProperty("width"),t.innerHTML="")}function te(e){var t=ue(e);if(t)return t.style&&t.style.height&&"0px"!=t.style.height}function ne(e,t,n=null){const s=document.getElementById(e);s&&(s.onload=function(){!function(e,t,n=null){const s=document.getElementById(e);if(s&&s.contentWindow){const e={options:t,capabilities:se};n&&(t.stepId=n),s.contentWindow.postMessage(e,"*")}}(e,t,n)})}const se=["MultiStepDisplayTypes"];function ie(e){if(!e.displaySettings)return;const t=re(e.instanceId),n=document.getElementById(t);n&&n.contentWindow&&n.contentWindow.postMessage({action:"updateDisplaySettings",displaySettings:e.displaySettings},"*")}async function ae(){var e=document.querySelector(".gist-message");e&&(e.classList.remove("gist-visible"),await Z(300)),oe()}function oe(){var e=document.querySelector("#gist-embed-message");e&&e.parentNode.removeChild(e)}function re(e){return`gist-${e}`}function ce(){var e=document.querySelector(".gist-message");e&&e.classList.add("gist-visible")}function ue(e){try{return document.querySelector(`#${e}`)||null}catch{return null}}const de="gist.web.customAttributes";let le=new Map;function ge(){const e=Array.from(le.entries()),t=new Date;t.setDate(t.getDate()+30),r(de,e,t),i(`Saved ${le.size} custom attributes to storage with TTL of 30 days`)}!function(){const e=c(de);if(e)try{le=new Map(e)}catch{le=new Map}else le=new Map}();const me="gist.web.message.broadcasts",pe=60;async function fe(e){const t=await ve();if(!t)return;const n=new Date;n.setMinutes(n.getMinutes()+pe),r(t,e.filter(ye),n)}async function he(e,t){return c(e).find((e=>e.queueId===t))}function ye(e){return e.properties&&e.properties.gist&&e.properties.gist.broadcast}function we(e){if(!ye(e))return!1;const{broadcast:t}=e.properties.gist;return 0===t.frequency.delay&&0===t.frequency.count}async function ve(){const e=await O();return e?`${me}.${e}`:null}function be(e,t){return`${e}.${t}.numberOfTimesShown`}function Se(e,t){return`${e}.${t}.shouldShow`}const Ie="gist.web.message.user",xe=60;async function $e(e){const t=await Ee();if(!t)return;const n=e.filter((e=>!(e.properties&&e.properties.gist&&e.properties.gist.broadcast))),s=new Date;s.setMinutes(s.getMinutes()+xe),r(t,n,s)}async function Ee(){const e=await O();return e?`${Ie}.${e}`:null}async function Ce(){const e=await O();return e?`${Ie}.${e}.seen`:null}async function De(e){const t=await O();return t?`${Ie}.${t}.message.${e}.loading`:null}async function ke(e){const t=await O();return t?`${Ie}.${t}.message.${e}.state`:null}async function Te(e){const t=await ke(e);t&&(u(t),i(`Cleared message state for queueId: ${e}`))}async function Me(e){if(nt.isDocumentVisible){if(B(e.queueId))return i(`Message with queueId ${e.queueId} is already showing.`),null;if(nt.overlayInstanceId)return i(`Message ${nt.overlayInstanceId} already showing.`),null;var t=j(e);return e.instanceId=b(),e.overlay=!0,e.firstLoad=!0,e.shouldResizeHeight=!0,e.shouldScale=t.shouldScale,e.renderStartTime=(new Date).getTime(),nt.overlayInstanceId=e.instanceId,nt.currentMessages.push(e),Ne(e,null,e.savedStepName||null)}return i("Document hidden, not showing message now."),null}function qe(e,t){return nt.isDocumentVisible?B(e.queueId)?(i(`Message with queueId ${e.queueId} is already showing.`),null):J(t)?(i(`Message with elementId ${t} already has a message.`),null):(e.instanceId=b(),e.overlay=!1,e.firstLoad=!0,e.shouldScale=!1,e.elementId=t,e.shouldResizeHeight=!te(t),e.renderStartTime=(new Date).getTime(),nt.currentMessages.push(e),Ne(e,t,e.savedStepName||null)):(i("Document hidden, not showing message now."),null)}async function Pe(e){e?(nt.messageDismissed(e),e.overlay?await Ae(!0,e):Le(e)):i(`Message with instance id: ${e.instanceId} not found`)}async function Re(e){var t=j(e);e?t.persistent&&(i("Persistent message dismissed, logging view"),await _e(e),await We(e),await Te(e.queueId)):i(`Message with instance id: ${e.instanceId} not found`)}function Le(e){Q(e.instanceId),ee(e.elementId)}async function Ae(e,t){e?await ae():oe(),0==nt.currentMessages.length&&(window.removeEventListener("message",Oe),window.removeEventListener("touchstart",Ue)),Q(t.instanceId),nt.overlayInstanceId=null}function Ne(e,t=null,n=null){var s={endpoint:E.ENGINE_API_ENDPOINT[nt.config.env],siteId:nt.config.siteId,dataCenter:nt.config.dataCenter,messageId:e.messageId,instanceId:e.instanceId,livePreview:!1,properties:e.properties,customAttributes:Object.fromEntries(new Map(le))},a=`${E.GIST_VIEW_ENDPOINT[nt.config.env]}/index.html`;return window.addEventListener("message",Oe),window.addEventListener("touchstart",Ue),t?(G.includes(t)&&z(t),function(e,t,n,s,a=null){var o=ue(e);if(o){var r=re(n.instanceId);o.classList.add(r);var c=j(n),u=c.messageWidth+"px";V.includes(e)&&!c.hasCustomWidth&&(u="100%"),G.includes(e)&&(o.style.width=u),te(e)||(o.style.height="0px"),o.innerHTML=function(e,t,n){var s=function(e,t,n){var s=800;return t.messageWidth>s&&(s=t.messageWidth),`\n <div id="gist-embed">\n <style>\n #x-gist-floating-top, #x-gist-floating-top-left, #x-gist-floating-top-right {\n position: fixed;\n top: 0px;\n z-index: 1000000;\n }\n #x-gist-floating-bottom, #x-gist-floating-bottom-left, #x-gist-floating-bottom-right {\n position: fixed;\n bottom: 0px;\n z-index: 1000000;\n }\n #x-gist-bottom, #x-gist-top, #x-gist-floating-top, #x-gist-floating-bottom {\n left: 50%;\n transform: translate(-50%, 0%);\n }\n #x-gist-floating-top-right, #x-gist-floating-bottom-right {\n right: 0px;\n }\n #gist-embed {\n position: relative;\n height: 100%;\n width: 100%;\n }\n #gist-embed-container {\n position: relative;\n height: 100%;\n width: 100%;\n }\n #gist-embed-container .gist-frame {\n height: 100%;\n width: 100%;\n border: none;\n }\n #x-gist-top.${e},\n #x-gist-bottom.${e},\n #x-gist-floating-top.${e},\n #x-gist-floating-bottom.${e},\n #x-gist-floating-top-left.${e},\n #x-gist-floating-top-right.${e},\n #x-gist-floating-bottom-left.${e},\n #x-gist-floating-bottom-right.${e} {\n transition: height 0.1s ease-in-out;\n }\n @media (max-width: ${s}px) {\n #x-gist-top.${e},\n #x-gist-bottom.${e},\n #x-gist-floating-top.${e},\n #x-gist-floating-bottom.${e},\n #x-gist-floating-top-left.${e},\n #x-gist-floating-top-right.${e},\n #x-gist-floating-bottom-left.${e},\n #x-gist-floating-bottom-right.${e} {\n width: 100% !important;\n }\n }\n </style>\n <div id="gist-embed-container">\n <iframe id="${e}" class="gist-frame" src="${n}"></iframe>\n </div>\n </div>`}(re(t.instanceId),n,e);return s}(t,n,c),ne(r,s,a)}else i(`Message could not be embedded, elementId ${e} not found.`)}(t,a,e,s,n)):function(e,t,n,s=null){document.querySelectorAll("#gist-embed-message").forEach((function(e){e.parentNode.removeChild(e)})),document.body.insertAdjacentHTML("afterbegin",function(e,t){var n=j(t),s=function(e,t,n){var s=600;return t.messageWidth>s&&(s=t.messageWidth),`\n <div id="gist-embed-message">\n <style>\n #gist-overlay.gist-background {\n position: fixed;\n z-index: 9999999998;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background-color: ${t.overlayColor};\n visibility: hidden;\n }\n #gist-overlay.gist-background.gist-visible {\n visibility: visible;\n }\n .gist-message {\n width: ${t.messageWidth}px;\n position: absolute;\n border: none;\n opacity: 0;\n transition: opacity 0.3s ease-in-out, height 0.1s ease-in-out;\n z-index: 9999999999;\n left: 50%;\n transform: translateX(-50%);\n }\n .gist-message.gist-visible {\n opacity: 1;\n pointer-events: auto;\n }\n .gist-message.gist-center {\n transform: translate(-50%, -50%);\n top: 50%;\n }\n .gist-message.gist-bottom {\n bottom: 0;\n }\n .gist-message.gist-top {\n top: 0;\n }\n @media (max-width: ${s}px) {\n .gist-message {\n width: 100%;\n }\n }\n </style>\n <div id="gist-overlay" class="gist-background">\n <iframe id="${e}" class="gist-message" src="${n}"></iframe>\n </div>\n </div>`}(re(t.instanceId),n,e);return s}(e,t)),ne(re(t.instanceId),n,s)}(a,e,s,n),e}async function We(e){i(`Message shown, logging view for: ${e.messageId}`);var t={};null!=e.queueId?(await _e(e),t=await H(e.queueId)):t=await async function(e){try{return await C().post(`/api/v1/logs/message/${e}`)}catch(e){return e.response}}(e.messageId),200===t.status?i("Message view logged"):i(`Problem logging message: ${t.status}`)}function Ue(){}async function Oe(e){if(e.data.gist&&e.origin===E.RENDERER_HOST){var t=e.data.gist.instanceId,n=F(t);if(!n)return;var s=j(n);switch(e.data.gist.method){case"routeLoaded":var a=.001*((new Date).getTime()-n.renderStartTime);i(`Engine render for message: ${n.messageId} timer elapsed in ${a.toFixed(3)} seconds`),async function(e){const t=await De(e);if(!t)return!1;u(t)}(n.queueId),n.currentRoute=e.data.gist.parameters.route,e.data.gist.parameters.fullDisplaySettings&&!n.displaySettings?n.displaySettings=e.data.gist.parameters.fullDisplaySettings:n.displaySettings&&(i("SDK already has display settings state, sending it to iframe"),ie(n)),(n.firstLoad||n.isDisplayChange)&&(n.overlay?function(e){var t=j(e),n=document.querySelector("#gist-overlay");if(n){n.classList.add("gist-visible");var s=document.querySelector(".gist-message");e.position?s.classList.add("gist-"+e.position):s.classList.add("gist-center"),setTimeout(ce,100),t.exitClick&&setTimeout((()=>function(e){var t=document.querySelector("#gist-overlay");t&&t.addEventListener("click",(function(){nt.dismissMessage(e)}))}(e.instanceId)),1e3)}else oe()}(n):(h=ue(n.elementId))&&h.classList.add("gist-visible"),n.firstLoad&&!n.isDisplayChange&&(nt.messageShown(n),s.persistent?i("Persistent message shown, skipping logging view"):await We(n)),n.firstLoad=!1,n.isDisplayChange=!1),X(t,n);break;case"tap":var o=e.data.gist.parameters.action,d=e.data.gist.parameters.name;if(nt.messageAction(n,o,d),e.data.gist.parameters.system&&!s.persistent){await Pe(n);break}try{var l=new URL(o);if(l&&"gist:"===l.protocol)switch(l.href.replace("gist://","").split("?")[0]){case"close":await Pe(n),await Re(n),await He(n),await Ye();break;case"showMessage":var g=l.searchParams.get("messageId"),m=l.searchParams.get("properties");g&&(m&&(m=JSON.parse(atob(m))),await nt.showMessage({messageId:g,properties:m}));break;case"loadPage":(l=l.href.substring(l.href.indexOf("?url=")+5))&&(l.startsWith("mailto:")||l.startsWith("https://")||l.startsWith("http://")||l.startsWith("/")?window.location.href=l:window.location.href=window.location+l)}}catch{}break;case"changeMessageStep":var p=e.data.gist.parameters.displaySettings,f=e.data.gist.parameters.messageStepName;(s.persistent||we(n))&&await async function(e,t,n){const s=await ke(e);if(!s)return;const a=c(s)||{},o={stepName:void 0!==t?t:a.stepName,displaySettings:void 0!==n?n:a.displaySettings},u=new Date;u.setDate(u.getDate()+30),r(s,o,u),i(`Saved message state for queueId: ${e}`)}(n.queueId,f,p),p&&function(e,t){const n=(s=e).overlay?"modal":s.elementId&&G.includes(s.elementId)?"overlay":s.elementId?"inline":"modal";var s;const i=t.displayType;if(void 0===i)return!1;if(n!==i)return!0;const a=j(e);switch(i){case"modal":if((e.position||"center")!==(t.modalPosition||"center"))return!0;if(void 0!==t.dismissOutsideClick&&a.exitClick!==t.dismissOutsideClick)return!0;if(void 0!==t.overlayColor&&a.overlayColor!==t.overlayColor)return!0;break;case"overlay":{const n=K(t.overlayPosition);if(e.elementId!==n)return!0;break}case"inline":if(e.elementId!==t.elementSelector)return!0}return void 0!==t.maxWidth&&a.messageWidth!==t.maxWidth}(n,p)&&(i("Display settings changed, reloading message"),await async function(e){e.overlay?await ae():ee(e.elementId)}(n),Y(n,p),await async function(e,t){e.isDisplayChange=!0,e.renderStartTime=(new Date).getTime();var n=e.elementId||null;if(n){const t=J(n);t&&t.instanceId!==e.instanceId&&(i(`Dismissing existing message at ${n} to make room for multi-step message`),await Pe(t))}if(e.overlay){nt.overlayInstanceId=e.instanceId;var s=j(e);e.shouldScale=s.shouldScale,e.shouldResizeHeight=!0}else nt.overlayInstanceId=null,e.shouldScale=!1,e.shouldResizeHeight=!te(n);n&&G.includes(n)&&z(n),Ne(e,n,t)}(n,f));break;case"routeChanged":n.currentRoute=e.data.gist.parameters.route,n.renderStartTime=(new Date).getTime(),X(t,n),i(`Route changed to: ${n.currentRoute}`);break;case"sizeChanged":i(`Size Changed Width: ${e.data.gist.parameters.width} - Height: ${e.data.gist.parameters.height}`),n.elementId&&!n.shouldResizeHeight||function(e,t){var n=ue(e.elementId?e.elementId:re(e.instanceId));if(n){var s=n.style;if(t.height>0)if(t.height>window.innerHeight){var i=1-(t.height/window.innerHeight-1);e.shouldScale&&i>=.4?(s.height=`${t.height}px`,s.transform=`translateX(-50%) translateY(-50%) scale(${i})`):s.height=`${window.innerHeight}px`}else s.height=`${t.height}px`}}(n,e.data.gist.parameters);break;case"titleChanged":i(`Overlay title changed to: ${e.data.gist.parameters.title}`),function(e,t){var n=ue(re(e));n&&(n.title=t)}(t,e.data.gist.parameters.title);break;case"eventDispatched":nt.events.dispatch("eventDispatched",{name:e.data.gist.parameters.name,payload:e.data.gist.parameters.payload});break;case"error":case"routeError":nt.messageError(n),nt.overlayInstanceId?Ae(!1,n):Le(n)}}var h}async function _e(e){i(`Logging user message view locally for: ${e.queueId}`),ye(e)?await async function(e){i(`Marking broadcast ${e} as seen.`);const t=await ve();if(!t)return;const n=await he(t,e);if(!n)return;const{broadcast:s}=n.properties.gist,a=be(t,e),o=Se(t,e);let u=c(a)||0;if(r(a,u+1),1===s.frequency.count)r(o,!1),i(`Marked broadcast ${e} as seen.`);else{let t=new Date;t.setSeconds(t.getSeconds()+s.frequency.delay),r(o,!1,t),i(`Marked broadcast ${e} as seen, broadcast was seen ${u+1} times, next show date is ${t}.`)}}(e.queueId):await async function(e){const t=await Ce();if(!t)return;const n=c(t)??[];n.push(e),r(t,n)}(e.queueId)}async function He(e){ye(e)&&(i(`Logging broadcast dismissed locally for: ${e.queueId}`),await async function(e){i(`Marking broadcast ${e} as dismissed.`);const t=await ve();if(!t)return;const n=await he(t,e);if(!n)return;const{broadcast:s}=n.properties.gist;!0!==s.frequency.ignoreDismiss?(r(Se(t,e),!1),i(`Marked broadcast ${e} as dismissed and will not show again.`)):i(`Broadcast ${e} is set to ignore dismiss.`)}(e.queueId),await Te(e.queueId))}const je="messageInboxUpdated",Ge="gist.web.inbox.messages",ze=60;async function Ve(e){const t=await Be();if(!t)return;const n=new Date;n.setMinutes(n.getMinutes()+ze),r(t,e,n),nt.events.dispatch(je,e)}async function Fe(){const e=await Be();if(!e)return[];const t=c(e)??[],n=new Date;return t.filter((e=>!e.expiry||new Date(e.expiry)>n))}async function Be(){const e=await O();return e?`${Ge}.${e}`:null}var Je=(e,t)=>e().then((e=>new Promise((t=>setTimeout(t,e))))(t).then((()=>Je(e,t)))),Qe=!1;let Xe=null;async function Ke(){Qe?await Ye():W()?(i("Queue watcher started"),Qe=!0,Je((()=>new Promise((()=>async function(){if(E.hasActiveSSEConnection())return!E.isSSEConnectionManagedBySDK()&&Xe&&(i("Not the main instance, closing our SSE connection."),tt()),void await Ye();Xe&&(i("SSE connection not active, closing it."),tt()),!E.useSSE()||N()?await et():await async function(){tt();const e=null===(t=_())?(i("No user token available for SSE endpoint."),null):E.GIST_QUEUE_REALTIME_API_ENDPOINT[nt.config.env]+`/api/v3/sse?userToken=${t}&siteId=${nt.config.siteId}&sessionId=${P()}`;var t;if(null===e)return i("SSE endpoint not available, falling back to polling."),void await et();i(`Starting SSE queue listener on ${e}`),Xe=new EventSource(e),E.setActiveSSEConnection(),Xe.addEventListener("connected",(async e=>{try{i("SSE connection received:"),E.setUseSSEFlag(!0);var t=JSON.parse(e.data);t.heartbeat&&(E.setSSEHeartbeat(t.heartbeat),i(`SSE heartbeat set to ${t.heartbeat} seconds`)),E.setActiveSSEConnection()}catch(e){i(`Failed to parse SSE settings: ${e}`)}u(M),await et()})),Xe.addEventListener("messages",(async e=>{try{var t=JSON.parse(e.data);i("SSE message received:"),await $e(t),await fe(t),await Ye()}catch(e){i("Failed to parse SSE message"),tt()}})),Xe.addEventListener("inbox_messages",(async e=>{try{var t=JSON.parse(e.data);i("SSE inbox messages received:"),await Ve(t)}catch(e){i("Failed to parse SSE inbox messages")}})),Xe.addEventListener("error",(async e=>{i("SSE error received:"),tt()})),Xe.addEventListener("heartbeat",(async e=>{i("SSE heartbeat received:"),E.setActiveSSEConnection(),E.setUseSSEFlag(!0)}))}()}()))),1e3)):i("User token not setup, queue not started.")}async function Ye(){var e=await async function(){const e=await ve();return e?(c(e)??[]).filter((t=>{const{broadcast:n}=t.properties.gist,s=c(Se(e,t.queueId))??!0,i=c(be(e,t.queueId))||0,a=0===n.frequency.count;return s&&(a||i<n.frequency.count)})):[]}(),t=await async function(){const e=await Ee();if(!e)return[];const t=c(e)??[],n=await async function(){const e=await Ce();return e?c(e)??[]:[]}();return t.filter((e=>!n.includes(e.queueId)))}(),n=e.concat(t);i(`Messages in local queue: ${n.length}`);var s=n.sort(((e,t)=>e.priority-t.priority));for(const e of s)await Ze(e)}async function Ze(e){var t=j(e);if(t.hasRouteRule){var n=nt.currentRoute;null==n&&(n=new URL(window.location.href).pathname);var s=t.routeRule;if(i(`Verifying route ${n} against rule: ${s}`),!new RegExp(s).test(n))return i(`Route ${n} does not match rule.`),!1}if(t.hasPosition&&(e.position=t.position),t.persistent||we(e)){const n=await async function(e){const t=await ke(e);return t?c(t):null}(e.queueId);n&&(i(`Restoring saved state for queueId ${e.queueId}`),n.displaySettings&&(Y(e,n.displaySettings),t=j(e)),e.savedStepName=n.stepName)}if(t.persistent||we(e)||!await async function(e){const t=await De(e);return!!t&&null!==c(t)}(e.queueId)){var a;return(a=t.isEmbedded?qe(e,t.elementId):await Me(e))&&async function(e){const t=await De(e);if(!t)return!1;r(t,!0,new Date(Date.now()+5e3))}(e.queueId),a}return i(`Not showing message with queueId ${e.queueId} because its already loading.`),!1}async function et(){if(W())if(nt.isDocumentVisible)if(null===c(M)){var e=await async function(){const e=W();var t;try{if(!T){T=!0;var n={"X-Gist-User-Anonymous":N(),"Content-Language":null!==c(D)?c(D):navigator.language};t=await C().post(`/api/v4/users?sessionId=${P()}`,{},{headers:n})}}catch(e){e.response?t=e.response:i(`Error getting user queue: ${e}`)}finally{T=!1}return e!==W()?(i("User token changed, clearing queue next pull check."),void u(M)):(function(e){if(e&&e.headers){var t=e.headers["x-gist-queue-polling-interval"];t&&t>0&&(k=t)}var n=new Date((new Date).getTime()+1e3*k);r(M,k,n)}(t),function(e){const t="true"===e?.headers?.["x-cio-use-sse"]?.toLowerCase();E.setUseSSEFlag(t)}(t),t)}();if(e){if(200===e.status||204===e.status){i("200 response, updating local store.");var t=e.data?.inAppMessages||[],n=e.data?.inboxMessages||[];$e(t),fe(t),Ve(n)}else 304===e.status&&i("304 response, using local store.");await Ye()}else i("No response object returned while checking message queue.")}else i("Next queue pull scheduled for later.");else i("Document not visible, skipping queue check.");else i("User token reset, skipping queue check.")}function tt(e=!1){e&&E.removeActiveSSEConnection(),(e||E.isSSEConnectionManagedBySDK())&&E.setUseSSEFlag(!1),Xe&&(i("Stopping SSE queue listener..."),Xe.close(),Xe=null)}const nt=class{static async setup(e){this.initialized?i("Gist SDK already initialized, skipping setup."):(this.initialized=!0,this.events=new s,this.config={useAnonymousSession:void 0!==e.useAnonymousSession&&e.useAnonymousSession,siteId:e.siteId,dataCenter:e.dataCenter,env:void 0===e.env?"prod":e.env,logging:void 0!==e.logging&&e.logging,experiments:void 0!==e.experiments&&e.experiments},this.currentMessages=[],this.overlayInstanceId=null,this.currentRoute=null,this.isDocumentVisible=!0,this.config.isPreviewSession=function(){const e=new URLSearchParams(window.location.search).get("cioPreviewId");return e&&(sessionStorage.setItem(o,!1),nt.setUserToken(e),i(`Preview mode enabled with user token: ${e}`)),!d()}(),function(){const e=l();for(let t=e.length-1;t>=0;t--)g(e.key(t))}(),i(`Setup complete on ${this.config.env} environment.`),this.config.isPreviewSession||!this.config.useAnonymousSession||new URLSearchParams(location.search).has("ajs_uid")||U(),await Ke(),document.addEventListener("visibilitychange",(async()=>{"hidden"===document.visibilityState?this.isDocumentVisible=!1:(this.isDocumentVisible=!0,await Ye())}),!1))}static async setCurrentRoute(e){this.currentRoute=e,i(`Current route set to: ${e}`),await Ye()}static async setUserToken(e,t){this.config.isPreviewSession||(function(e,t){void 0===t&&(t=new Date).setDate(t.getDate()+30),r(R,e,t),N()&&(u(M),u(L)),i(`Set user token "${e}" with expiry date set to ${t}`)}(e,t),tt(!0),await Ke())}static setUserLocale(e){var t;r(D,t=e),i(`Set user locate to "${t}"`)}static setCustomAttribute(e,t){return function(e,t){return e&&"string"==typeof e?(le.set(e,t),ge(),i(`Set custom attribute "${e}" to "${t}"`),!0):(i(`Invalid key for custom attribute: ${e}`),!1)}(e,t)}static clearCustomAttributes(){le.clear(),u(de),i("Cleared all custom attributes")}static removeCustomAttribute(e){return function(e){if(!e||"string"!=typeof e)return i(`Invalid key for custom attribute: ${e}`),!1;const t=le.has(e);return le.delete(e),le.size>0?ge():u(de),i(`Removed custom attribute "${e}"`),t}(e)}static async clearUserToken(){this.config.isPreviewSession||(u(R),i("Cleared user token"),this.config.useAnonymousSession&&U(),tt(!0),await Ke())}static async dismissMessage(e){var t=F(e);await Pe(t),await Re(t),await He(t),await Ye()}static async embedMessage(e,t){var n=qe(e,t);return n?n.instanceId:null}static async showMessage(e){var t=await Me(e);return t?t.instanceId:null}static updateMessageDisplaySettings(e,t){var n=F(e);return!!n&&(n.displaySettings=t,ie(n),!0)}static messageShown(e){i(`Message shown: ${e.messageId}`),this.events.dispatch("messageShown",e)}static messageDismissed(e){null!==e&&(i(`Message dismissed: ${e.messageId}`),this.events.dispatch("messageDismissed",e))}static messageError(e){i(`Message error: ${e.messageId}`),this.events.dispatch("messageError",e)}static messageAction(e,t,n){i(`Message action: ${e.currentRoute}, ${t} with name ${n} on ${e.instanceId}`),this.events.dispatch("messageAction",{message:e,action:t,name:n})}static async getInboxUnopenedCount(){return(await Fe()).filter((e=>!e.opened)).length}static async getInboxMessages(){return await Fe()}static async updateInboxMessageOpenState(e,t){return await async function(e,t){const n=await Be();if(!n)return;const s=await async function(e,t){try{return await C()(`/api/v1/messages/${e}`,{method:"PATCH",body:JSON.stringify(t),headers:{"Content-Type":"application/json"}})}catch(e){return e.response}}(e,{opened:t});if(!s||s.status<200||s.status>=300){const e=`Failed to mark inbox message opened: ${s?.status||"unknown error"}`;throw i(e),new Error(e)}const a=await Fe();let o=null;const c=a.map((n=>n.queueId===e?(n.opened=t,o=n,{...n}):n)),u=new Date;if(u.setMinutes(u.getMinutes()+ze),r(n,c,u),o){const e=t?"opened":"unopened";nt.events.dispatch("inboxMessageAction",{message:o,action:e})}nt.events.dispatch(je,await Fe())}(e,t)}static async removeInboxMessage(e){return await async function(e){const t=await Be();if(!t)return;const n=await H(e);if(!n||n.status<200||n.status>=300){const e=`Failed to remove inbox message: ${n?.status||"unknown error"}`;throw i(e),new Error(e)}const s=(await Fe()).filter((t=>t.queueId!==e)),a=new Date;a.setMinutes(a.getMinutes()+ze),r(t,s,a),nt.events.dispatch(je,await Fe())}(e)}}},44:(e,t,n)=>{const s=n(595).A;e.exports=s}},t={};function n(s){var i=t[s];if(void 0!==i)return i.exports;var a=t[s]={exports:{}};return e[s](a,a.exports,n),a.exports}return n.d=(e,t)=>{for(var s in t)n.o(t,s)&&!n.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n(44)})()));
@@ -47,7 +47,7 @@
47
47
  </div>
48
48
  <div class="config-form-sticky">
49
49
  <div class="config-form-header" onclick="toggleConfigForm()">
50
- <span>⚙️ Configuration Override</span>
50
+ <span>⚙️ Configuration Override & Debugging</span>
51
51
  <span id="configToggleIcon">▼</span>
52
52
  </div>
53
53
  <div class="config-form-content" id="configFormContent">
@@ -97,6 +97,13 @@
97
97
  <button type="button" class="button" onclick="resetConfig()">Reset to Defaults</button>
98
98
  </div>
99
99
  </form>
100
+ <div class="form-section" style="margin-top: 20px; border-top: 1px solid #ddd; padding-top: 20px;">
101
+ <h4>Active Messages & Display Settings</h4>
102
+ <div id="activeMessages" style="margin-top: 10px;">
103
+ <p style="color: #999; font-size: 14px;">No active messages</p>
104
+ </div>
105
+ <button type="button" class="button" onclick="refreshActiveMessages()" style="margin-top: 10px;">Refresh Messages</button>
106
+ </div>
100
107
  </div>
101
108
  </div>
102
109
  <script src="settings.js"></script>
@@ -223,6 +230,89 @@
223
230
  function addAnonymousCustomAttribute() {
224
231
  Gist.setCustomAttribute("cio_anonymous_id", "123456");
225
232
  }
233
+
234
+ // Active Messages Display Settings Utility
235
+ function refreshActiveMessages() {
236
+ const container = document.getElementById('activeMessages');
237
+
238
+ if (!Gist.currentMessages || Gist.currentMessages.length === 0) {
239
+ container.innerHTML = '<p style="color: #999; font-size: 14px;">No active messages</p>';
240
+ return;
241
+ }
242
+
243
+ let html = '';
244
+ Gist.currentMessages.forEach((message, index) => {
245
+ const displaySettings = message.displaySettings || {};
246
+ const displaySettingsJson = JSON.stringify(displaySettings, null, 2);
247
+
248
+ html += `
249
+ <div style="border: 1px solid #ddd; border-radius: 4px; padding: 10px; margin-bottom: 10px; background: #f9f9f9;">
250
+ <div style="font-weight: bold; margin-bottom: 5px;">
251
+ Message: ${message.messageId || 'Unknown'}
252
+ <span style="font-size: 11px; color: #666; font-weight: normal;">(${message.instanceId})</span>
253
+ </div>
254
+ <div style="margin-bottom: 8px;">
255
+ <label style="display: block; font-size: 13px; font-weight: bold; margin-bottom: 4px;">Display Settings JSON:</label>
256
+ <textarea
257
+ id="displaySettings-${index}"
258
+ style="width: 100%; min-height: 100px; font-family: monospace; font-size: 12px; padding: 8px; border: 1px solid #ccc; border-radius: 3px;"
259
+ >${displaySettingsJson}</textarea>
260
+ </div>
261
+ <button
262
+ class="button"
263
+ onclick="updateMessageDisplaySettings(${index})"
264
+ style="padding: 4px 12px; font-size: 12px;">
265
+ Save & Update
266
+ </button>
267
+ </div>
268
+ `;
269
+ });
270
+
271
+ container.innerHTML = html;
272
+ }
273
+
274
+ function updateMessageDisplaySettings(messageIndex) {
275
+ const message = Gist.currentMessages[messageIndex];
276
+ if (!message) {
277
+ console.error('Message not found at index', messageIndex);
278
+ return;
279
+ }
280
+
281
+ const textarea = document.getElementById(`displaySettings-${messageIndex}`);
282
+ try {
283
+ const newDisplaySettings = JSON.parse(textarea.value);
284
+ console.log('Updating display settings for message:', message.instanceId, newDisplaySettings);
285
+
286
+ const success = Gist.updateMessageDisplaySettings(message.instanceId, newDisplaySettings);
287
+ if (success) {
288
+ console.log('Display settings updated successfully');
289
+ } else {
290
+ console.error('Failed to update display settings');
291
+ }
292
+ } catch (e) {
293
+ console.error('Invalid JSON:', e);
294
+ alert('Invalid JSON: ' + e.message);
295
+ }
296
+ }
297
+
298
+ // Auto-refresh when config panel is opened
299
+ const originalToggleConfigForm = window.toggleConfigForm;
300
+ window.toggleConfigForm = function() {
301
+ if (typeof originalToggleConfigForm === 'function') {
302
+ originalToggleConfigForm();
303
+ }
304
+ // Refresh messages when opening the panel
305
+ setTimeout(refreshActiveMessages, 100);
306
+ };
307
+
308
+ // Refresh messages when they're shown
309
+ Gist.events.on("messageShown", message => {
310
+ setTimeout(refreshActiveMessages, 500);
311
+ });
312
+
313
+ Gist.events.on("messageDismissed", message => {
314
+ setTimeout(refreshActiveMessages, 500);
315
+ });
226
316
  </script>
227
317
  <script src="inbox.js"></script>
228
318
  </body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "customerio-gist-web",
3
- "version": "3.18.1",
3
+ "version": "3.18.3",
4
4
  "description": "Build beautiful in-app flows with no code and deliver them instantly to your app. http://customer.io",
5
5
  "private": false,
6
6
  "scripts": {
package/src/gist.js CHANGED
@@ -5,6 +5,7 @@ import { startQueueListener, checkMessageQueue, stopSSEListener } from "./manage
5
5
  import { setUserToken, clearUserToken, useGuestSession } from "./managers/user-manager";
6
6
  import { showMessage, embedMessage, hideMessage, removePersistentMessage, logBroadcastDismissedLocally } from "./managers/message-manager";
7
7
  import { fetchMessageByInstanceId } from "./utilities/message-utils";
8
+ import { sendDisplaySettingsToIframe } from "./managers/message-component-manager";
8
9
  import { setUserLocale } from "./managers/locale-manager";
9
10
  import { setCustomAttribute, clearCustomAttributes, removeCustomAttribute } from "./managers/custom-attribute-manager";
10
11
  import { setupPreview } from "./utilities/preview-mode";
@@ -16,6 +17,11 @@ import {
16
17
 
17
18
  export default class {
18
19
  static async setup(config) {
20
+ if (this.initialized) {
21
+ log("Gist SDK already initialized, skipping setup.");
22
+ return;
23
+ }
24
+ this.initialized = true;
19
25
  this.events = new EventEmitter();
20
26
  this.config = {
21
27
  useAnonymousSession: config.useAnonymousSession === undefined ? false : config.useAnonymousSession,
@@ -34,7 +40,7 @@ export default class {
34
40
 
35
41
  log(`Setup complete on ${this.config.env} environment.`);
36
42
 
37
- if (!this.config.isPreviewSession && this.config.useAnonymousSession) {
43
+ if (!this.config.isPreviewSession && this.config.useAnonymousSession && !new URLSearchParams(location.search).has('ajs_uid')) {
38
44
  useGuestSession();
39
45
  }
40
46
 
@@ -107,6 +113,16 @@ export default class {
107
113
  return messageResponse ? messageResponse.instanceId : null;
108
114
  }
109
115
 
116
+ static updateMessageDisplaySettings(instanceId, displaySettings) {
117
+ var message = fetchMessageByInstanceId(instanceId);
118
+ if (message) {
119
+ message.displaySettings = displaySettings;
120
+ sendDisplaySettingsToIframe(message);
121
+ return true;
122
+ }
123
+ return false;
124
+ }
125
+
110
126
  // Actions
111
127
 
112
128
  static messageShown(message) {
@@ -81,6 +81,9 @@ export function resizeComponent(message, size) {
81
81
  }
82
82
 
83
83
  export function loadOverlayComponent(url, message, options, stepName = null) {
84
+ document.querySelectorAll('#gist-embed-message').forEach(function(el) {
85
+ el.parentNode.removeChild(el);
86
+ });
84
87
  document.body.insertAdjacentHTML('afterbegin', component(url, message));
85
88
  attachIframeLoadEvent(getMessageElementId(message.instanceId), options, stepName);
86
89
  }
@@ -113,6 +116,22 @@ export function sendOptionsToIframe(iframeId, options, stepName = null) {
113
116
  }
114
117
  }
115
118
 
119
+ export function sendDisplaySettingsToIframe(message) {
120
+ // Only send if displaySettings exist
121
+ if (!message.displaySettings) {
122
+ return;
123
+ }
124
+
125
+ const iframeId = getMessageElementId(message.instanceId);
126
+ const iframe = document.getElementById(iframeId);
127
+ if (iframe && iframe.contentWindow) {
128
+ iframe.contentWindow.postMessage({
129
+ action: 'updateDisplaySettings',
130
+ displaySettings: message.displaySettings
131
+ }, '*');
132
+ }
133
+ }
134
+
116
135
  export function showOverlayComponent(message) {
117
136
  var messageProperties = resolveMessageProperties(message);
118
137
  var mainMessageElement = document.querySelector("#gist-overlay");
@@ -13,7 +13,8 @@ import {
13
13
  hideEmbedComponent,
14
14
  resizeComponent,
15
15
  elementHasHeight,
16
- changeOverlayTitle
16
+ changeOverlayTitle,
17
+ sendDisplaySettingsToIframe
17
18
  } from "./message-component-manager";
18
19
  import { resolveMessageProperties } from "./gist-properties-manager";
19
20
  import { positions, addPageElement } from "./page-component-manager";
@@ -203,7 +204,12 @@ async function handleGistEvents(e) {
203
204
  log(`Engine render for message: ${currentMessage.messageId} timer elapsed in ${timeElapsed.toFixed(3)} seconds`);
204
205
  setMessageLoaded(currentMessage.queueId);
205
206
  currentMessage.currentRoute = e.data.gist.parameters.route;
206
-
207
+ if (e.data.gist.parameters.fullDisplaySettings && !currentMessage.displaySettings) {
208
+ currentMessage.displaySettings = e.data.gist.parameters.fullDisplaySettings;
209
+ } else if (currentMessage.displaySettings) {
210
+ log(`SDK already has display settings state, sending it to iframe`);
211
+ sendDisplaySettingsToIframe(currentMessage);
212
+ }
207
213
  // Show component for first load or display change reload
208
214
  if (currentMessage.firstLoad || currentMessage.isDisplayChange) {
209
215
  if (currentMessage.overlay) {
@@ -141,7 +141,7 @@ async function checkQueueThroughPolling() {
141
141
  }
142
142
  await checkMessageQueue();
143
143
  } else {
144
- log(`There was an error while checking message queue.`);
144
+ log(`No response object returned while checking message queue.`);
145
145
  }
146
146
  } else {
147
147
  log(`Next queue pull scheduled for later.`);
@@ -1,8 +1,8 @@
1
1
  import Gist from '../gist';
2
2
  import { UserNetworkInstance } from './network';
3
- import { getKeyFromLocalStore, setKeyToLocalStore } from '../utilities/local-storage';
3
+ import { getKeyFromLocalStore, setKeyToLocalStore, clearKeyFromLocalStore } from '../utilities/local-storage';
4
4
  import { log } from "../utilities/log";
5
- import { isUsingGuestUserToken, getEncodedUserToken } from '../managers/user-manager';
5
+ import { isUsingGuestUserToken, getEncodedUserToken, getUserToken } from '../managers/user-manager';
6
6
  import { getUserLocale } from '../managers/locale-manager';
7
7
  import { settings } from './settings';
8
8
  import { v4 as uuidv4 } from 'uuid';
@@ -14,6 +14,7 @@ var checkInProgress = false;
14
14
  export const userQueueNextPullCheckLocalStoreName = "gist.web.userQueueNextPullCheck";
15
15
  export const sessionIdLocalStoreName = "gist.web.sessionId";
16
16
  export async function getUserQueue() {
17
+ const existingUserToken = getUserToken();
17
18
  var response;
18
19
  try {
19
20
  if (!checkInProgress) {
@@ -32,10 +33,16 @@ export async function getUserQueue() {
32
33
  }
33
34
  } finally {
34
35
  checkInProgress = false;
35
- scheduleNextQueuePull(response);
36
- setQueueUseSSE(response);
37
36
  }
38
37
 
38
+ if (existingUserToken !== getUserToken()) {
39
+ log("User token changed, clearing queue next pull check.");
40
+ clearKeyFromLocalStore(userQueueNextPullCheckLocalStoreName);
41
+ return;
42
+ }
43
+
44
+ scheduleNextQueuePull(response);
45
+ setQueueUseSSE(response);
39
46
  return response;
40
47
  }
41
48