@journyio/messaging-sdk 1.0.0
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/README.md +256 -0
- package/dist/index.d.ts +6 -0
- package/dist/journy-messages.css +1 -0
- package/dist/journy-messages.esm.js +2833 -0
- package/dist/journy-messages.js +2860 -0
- package/dist/journy-messages.min.js +4 -0
- package/dist/types.d.ts +42 -0
- package/package.json +28 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).JournyMessages={},e.React)}(this,function(e,t){"use strict";function n(e){var t=Object.create(null);return e&&Object.keys(e).forEach(function(n){if("default"!==n){var s=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,s.get?s:{enumerable:!0,get:function(){return e[n]}})}}),t.default=e,Object.freeze(t)}var s=n(t);class o{constructor(){this.queue=[],this.messageMap={},this.allFetchedMessages=[],this.readMessageIds=new Set}addMessage(e){const t=this.messageMap[e.id];t?this.updateMessageReceived(t,e):e.expiredAt&&new Date(e.expiredAt)<new Date||(this.queue.push(e),this.messageMap[e.id]=e,this.allFetchedMessages.push(e),this.sortByPriority())}addMessages(e){e.forEach(e=>this.addMessage(e))}getNextMessage(){return this.removeExpiredMessages(),0===this.queue.length?null:this.queue[0]}getAlreadyReceivedIds(e){return e.filter(e=>this.messageMap[e]?.received||this.readMessageIds.has(e))}removeMessage(e){this.queue=this.queue.filter(t=>!e.includes(t.id)),e.forEach(e=>this.readMessageIds.add(e))}markMessageAsReceived(e){const t=t=>e.includes(t.id)?{...t,received:!0}:t;this.queue=this.queue.map(t),this.allFetchedMessages=this.allFetchedMessages.map(t);for(const t of e)this.messageMap[t]&&(this.messageMap[t]={...this.messageMap[t],received:!0})}getAllMessages(){return this.removeExpiredMessages(),[...this.queue]}getAllFetchedMessages(){return[...this.allFetchedMessages]}getActiveCount(){return this.queue.length}getReadCount(){return this.allFetchedMessages.filter(e=>this.readMessageIds.has(e.id)&&!this.queue.find(t=>t.id===e.id)).length}clear(){this.queue=[],this.allFetchedMessages=[],this.readMessageIds.clear()}size(){return this.queue.length}sortByCreatedAt(e,t){return new Date(e.createdAt).getTime()-new Date(t.createdAt).getTime()}sortByPriority(){const e=this.queue.filter(e=>!e.received),t=this.queue.filter(e=>e.received);this.queue=[...e.sort(this.sortByCreatedAt),...t.sort(this.sortByCreatedAt)]}removeExpiredMessages(){const e=new Date;this.queue=this.queue.filter(t=>!t.expiredAt||new Date(t.expiredAt)>=e)}updateMessageReceived(e,t){const n={...e,received:t.received,expired:t.expired,status:t.status},s=this.queue.indexOf(e);-1!==s&&(this.queue[s]=n);const o=this.allFetchedMessages.indexOf(e);-1!==o&&(this.allFetchedMessages[o]=n),this.messageMap[n.id]=n}}const a="/sdk/in-app-messages";class i{constructor(e){this.config=e}getHeaders(){const e={"Content-Type":"application/json"};return this.config.writeKey&&(e.Authorization=`Bearer ${this.config.writeKey}`,e["x-write-key"]=this.config.writeKey),e}buildUrl(e){const t=(this.config.apiEndpoint||"https://jtm.journy.io").replace(/\/$/,""),n="user"===this.config.entityType?this.config.userId:this.config.accountId;if(!n)throw new Error(`${this.config.entityType}Id is required`);const s=`${a}/${this.config.entityType}/${n}${e}`;return new URL(s,t).toString()}async getUnreadMessages(){try{const e=this.buildUrl("/unread"),t=await fetch(e,{method:"GET",headers:this.getHeaders(),mode:"cors"});if(!t.ok)throw new Error(`HTTP error! status: ${t.status}`);return(await t.json()).data||[]}catch(e){return console.error("Failed to fetch unread messages:",e),[]}}async markAsRead(e){try{const t=this.buildUrl("/received"),n=await fetch(t,{method:"POST",headers:this.getHeaders(),mode:"cors",body:JSON.stringify({messageIds:e})});if(!n.ok)throw new Error(`HTTP error! status: ${n.status}`);const s=await n.json();if(s.data&&s.data.markedCount!==e.length)throw new Error(`Failed to mark all messages as read. Expected ${e.length} messages, got ${s.data.markedCount}`)}catch(e){console.error("Failed to mark message as read:",e)}}}var r;!function(e){e.MessageReceived="In-App Message Received",e.MessageOpened="In-App Message Opened",e.MessageClosed="In-App Message Closed",e.MessageLinkClicked="In-App Message Link Clicked"}(r||(r={}));const l={pollingInterval:3e4,showReadMessages:!0,autoExpandOnNew:!0,displayMode:"widget",apiEndpoint:"https://jtm.journy.io",styles:"default"};function c(e){return`journy_messages_${e}`}function d(e,t){try{const n=c(e);localStorage.setItem(n,JSON.stringify(t))}catch(e){console.warn("Failed to set item in localStorage:",e)}}function u(e){try{const t=c(e),n=localStorage.getItem(t);return n?JSON.parse(n):null}catch(e){return console.warn("Failed to get item from localStorage:",e),null}}class g{constructor(e){this.analyticsClient=e,this.eventQueue=[],this.flushInterval=null,this.loadQueuedEvents(),this.startFlushInterval()}track(e,t){const n={event:e,properties:t,timestamp:(new Date).toISOString()};this.eventQueue.push(n),this.saveQueuedEvents(),this.isImportantEvent(e)&&this.flush().catch(e=>{console.error("Failed to flush events:",e)})}async flush(){if(0===this.eventQueue.length)return;const e=[...this.eventQueue];try{await this.analyticsClient.trackEvents(e.map(({event:e,properties:t})=>({event:e,properties:t||{}})))&&(this.eventQueue=this.eventQueue.filter(t=>!e.includes(t)))}catch(e){console.error("Failed to flush events:",e)}this.saveQueuedEvents()}startFlushInterval(){this.flushInterval=window.setInterval(()=>{this.flush().catch(e=>{console.error("Failed to flush events:",e)})},g.FLUSH_INTERVAL_MS)}destroy(){null!==this.flushInterval&&(clearInterval(this.flushInterval),this.flushInterval=null),this.flush().catch(e=>{console.error("Failed to flush events on destroy:",e)})}isImportantEvent(e){return g.IMPORTANT_MESSAGES.includes(e)}saveQueuedEvents(){d("event_queue",this.eventQueue)}loadQueuedEvents(){const e=u("event_queue");e&&Array.isArray(e)&&(this.eventQueue=e)}}g.FLUSH_INTERVAL_MS=5e3,g.IMPORTANT_MESSAGES=[r.MessageOpened,r.MessageClosed,r.MessageLinkClicked];class m{constructor(e){this.listeners=new Set,this.state=e}getState(){return this.state}setState(e){this.state={...this.state,...e},this.listeners.forEach(e=>e())}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}destroy(){this.listeners.clear()}}const p="journy-messages-styles-link",h="journy-messages-custom";function f(e,t=h){if("undefined"==typeof document||!document.head)return;let n=document.getElementById(t);n?n.textContent=e:(n=document.createElement("style"),n.id=t,n.textContent=e,document.head.appendChild(n))}function y(){if("undefined"==typeof document)return;const e=document.getElementById(p);e&&e.remove();const t=document.getElementById(h);t&&t.remove();const n=document.getElementById("journy-messages-default");n&&n.remove()}
|
|
2
|
+
/*! @license DOMPurify 3.3.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.3.1/LICENSE */
|
|
3
|
+
const{entries:b,setPrototypeOf:w,isFrozen:x,getPrototypeOf:v,getOwnPropertyDescriptor:E}=Object;let{freeze:M,seal:j,create:k}=Object,{apply:T,construct:S}="undefined"!=typeof Reflect&&Reflect;M||(M=function(e){return e}),j||(j=function(e){return e}),T||(T=function(e,t){for(var n=arguments.length,s=new Array(n>2?n-2:0),o=2;o<n;o++)s[o-2]=arguments[o];return e.apply(t,s)}),S||(S=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),s=1;s<t;s++)n[s-1]=arguments[s];return new e(...n)});const N=B(Array.prototype.forEach),C=B(Array.prototype.lastIndexOf),A=B(Array.prototype.pop),I=B(Array.prototype.push),R=B(Array.prototype.splice),_=B(String.prototype.toLowerCase),D=B(String.prototype.toString),L=B(String.prototype.match),O=B(String.prototype.replace),z=B(String.prototype.indexOf),P=B(String.prototype.trim),F=B(Object.prototype.hasOwnProperty),U=B(RegExp.prototype.test),H=(W=TypeError,function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return S(W,t)});var W;function B(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);for(var n=arguments.length,s=new Array(n>1?n-1:0),o=1;o<n;o++)s[o-1]=arguments[o];return T(e,t,s)}}function q(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:_;w&&w(e,null);let s=t.length;for(;s--;){let o=t[s];if("string"==typeof o){const e=n(o);e!==o&&(x(t)||(t[s]=e),o=e)}e[o]=!0}return e}function $(e){for(let t=0;t<e.length;t++){F(e,t)||(e[t]=null)}return e}function G(e){const t=k(null);for(const[n,s]of b(e)){F(e,n)&&(Array.isArray(s)?t[n]=$(s):s&&"object"==typeof s&&s.constructor===Object?t[n]=G(s):t[n]=s)}return t}function Q(e,t){for(;null!==e;){const n=E(e,t);if(n){if(n.get)return B(n.get);if("function"==typeof n.value)return B(n.value)}e=v(e)}return function(){return null}}const Y=M(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","search","section","select","shadow","slot","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),X=M(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","enterkeyhint","exportparts","filter","font","g","glyph","glyphref","hkern","image","inputmode","line","lineargradient","marker","mask","metadata","mpath","part","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),K=M(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),J=M(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),V=M(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),Z=M(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),ee=M(["#text"]),te=M(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","exportparts","face","for","headers","height","hidden","high","href","hreflang","id","inert","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","part","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","slot","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns","slot"]),ne=M(["accent-height","accumulate","additive","alignment-baseline","amplitude","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","exponent","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","intercept","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","mask-type","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","slope","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","tablevalues","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),se=M(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),oe=M(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),ae=j(/\{\{[\w\W]*|[\w\W]*\}\}/gm),ie=j(/<%[\w\W]*|[\w\W]*%>/gm),re=j(/\$\{[\w\W]*/gm),le=j(/^data-[\-\w.\u00B7-\uFFFF]+$/),ce=j(/^aria-[\-\w]+$/),de=j(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),ue=j(/^(?:\w+script|data):/i),ge=j(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),me=j(/^html$/i),pe=j(/^[a-z][.\w]*(-[.\w]+)+$/i);var he=Object.freeze({__proto__:null,ARIA_ATTR:ce,ATTR_WHITESPACE:ge,CUSTOM_ELEMENT:pe,DATA_ATTR:le,DOCTYPE_NAME:me,ERB_EXPR:ie,IS_ALLOWED_URI:de,IS_SCRIPT_OR_DATA:ue,MUSTACHE_EXPR:ae,TMPLIT_EXPR:re});const fe=1,ye=3,be=7,we=8,xe=9,ve=function(){return"undefined"==typeof window?null:window};var Ee=function e(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ve();const n=t=>e(t);if(n.version="3.3.1",n.removed=[],!t||!t.document||t.document.nodeType!==xe||!t.Element)return n.isSupported=!1,n;let{document:s}=t;const o=s,a=o.currentScript,{DocumentFragment:i,HTMLTemplateElement:r,Node:l,Element:c,NodeFilter:d,NamedNodeMap:u=t.NamedNodeMap||t.MozNamedAttrMap,HTMLFormElement:g,DOMParser:m,trustedTypes:p}=t,h=c.prototype,f=Q(h,"cloneNode"),y=Q(h,"remove"),w=Q(h,"nextSibling"),x=Q(h,"childNodes"),v=Q(h,"parentNode");if("function"==typeof r){const e=s.createElement("template");e.content&&e.content.ownerDocument&&(s=e.content.ownerDocument)}let E,j="";const{implementation:T,createNodeIterator:S,createDocumentFragment:W,getElementsByTagName:B}=s,{importNode:$}=o;let ae={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};n.isSupported="function"==typeof b&&"function"==typeof v&&T&&void 0!==T.createHTMLDocument;const{MUSTACHE_EXPR:ie,ERB_EXPR:re,TMPLIT_EXPR:le,DATA_ATTR:ce,ARIA_ATTR:ue,IS_SCRIPT_OR_DATA:ge,ATTR_WHITESPACE:pe,CUSTOM_ELEMENT:Ee}=he;let{IS_ALLOWED_URI:Me}=he,je=null;const ke=q({},[...Y,...X,...K,...V,...ee]);let Te=null;const Se=q({},[...te,...ne,...se,...oe]);let Ne=Object.seal(k(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Ce=null,Ae=null;const Ie=Object.seal(k(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let Re=!0,_e=!0,De=!1,Le=!0,Oe=!1,ze=!0,Pe=!1,Fe=!1,Ue=!1,He=!1,We=!1,Be=!1,qe=!0,$e=!1,Ge=!0,Qe=!1,Ye={},Xe=null;const Ke=q({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Je=null;const Ve=q({},["audio","video","img","source","image","track"]);let Ze=null;const et=q({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),tt="http://www.w3.org/1998/Math/MathML",nt="http://www.w3.org/2000/svg",st="http://www.w3.org/1999/xhtml";let ot=st,at=!1,it=null;const rt=q({},[tt,nt,st],D);let lt=q({},["mi","mo","mn","ms","mtext"]),ct=q({},["annotation-xml"]);const dt=q({},["title","style","font","a","script"]);let ut=null;const gt=["application/xhtml+xml","text/html"];let mt=null,pt=null;const ht=s.createElement("form"),ft=function(e){return e instanceof RegExp||e instanceof Function},yt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!pt||pt!==e){if(e&&"object"==typeof e||(e={}),e=G(e),ut=-1===gt.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,mt="application/xhtml+xml"===ut?D:_,je=F(e,"ALLOWED_TAGS")?q({},e.ALLOWED_TAGS,mt):ke,Te=F(e,"ALLOWED_ATTR")?q({},e.ALLOWED_ATTR,mt):Se,it=F(e,"ALLOWED_NAMESPACES")?q({},e.ALLOWED_NAMESPACES,D):rt,Ze=F(e,"ADD_URI_SAFE_ATTR")?q(G(et),e.ADD_URI_SAFE_ATTR,mt):et,Je=F(e,"ADD_DATA_URI_TAGS")?q(G(Ve),e.ADD_DATA_URI_TAGS,mt):Ve,Xe=F(e,"FORBID_CONTENTS")?q({},e.FORBID_CONTENTS,mt):Ke,Ce=F(e,"FORBID_TAGS")?q({},e.FORBID_TAGS,mt):G({}),Ae=F(e,"FORBID_ATTR")?q({},e.FORBID_ATTR,mt):G({}),Ye=!!F(e,"USE_PROFILES")&&e.USE_PROFILES,Re=!1!==e.ALLOW_ARIA_ATTR,_e=!1!==e.ALLOW_DATA_ATTR,De=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Le=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,Oe=e.SAFE_FOR_TEMPLATES||!1,ze=!1!==e.SAFE_FOR_XML,Pe=e.WHOLE_DOCUMENT||!1,He=e.RETURN_DOM||!1,We=e.RETURN_DOM_FRAGMENT||!1,Be=e.RETURN_TRUSTED_TYPE||!1,Ue=e.FORCE_BODY||!1,qe=!1!==e.SANITIZE_DOM,$e=e.SANITIZE_NAMED_PROPS||!1,Ge=!1!==e.KEEP_CONTENT,Qe=e.IN_PLACE||!1,Me=e.ALLOWED_URI_REGEXP||de,ot=e.NAMESPACE||st,lt=e.MATHML_TEXT_INTEGRATION_POINTS||lt,ct=e.HTML_INTEGRATION_POINTS||ct,Ne=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&ft(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Ne.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&ft(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Ne.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Ne.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Oe&&(_e=!1),We&&(He=!0),Ye&&(je=q({},ee),Te=[],!0===Ye.html&&(q(je,Y),q(Te,te)),!0===Ye.svg&&(q(je,X),q(Te,ne),q(Te,oe)),!0===Ye.svgFilters&&(q(je,K),q(Te,ne),q(Te,oe)),!0===Ye.mathMl&&(q(je,V),q(Te,se),q(Te,oe))),e.ADD_TAGS&&("function"==typeof e.ADD_TAGS?Ie.tagCheck=e.ADD_TAGS:(je===ke&&(je=G(je)),q(je,e.ADD_TAGS,mt))),e.ADD_ATTR&&("function"==typeof e.ADD_ATTR?Ie.attributeCheck=e.ADD_ATTR:(Te===Se&&(Te=G(Te)),q(Te,e.ADD_ATTR,mt))),e.ADD_URI_SAFE_ATTR&&q(Ze,e.ADD_URI_SAFE_ATTR,mt),e.FORBID_CONTENTS&&(Xe===Ke&&(Xe=G(Xe)),q(Xe,e.FORBID_CONTENTS,mt)),e.ADD_FORBID_CONTENTS&&(Xe===Ke&&(Xe=G(Xe)),q(Xe,e.ADD_FORBID_CONTENTS,mt)),Ge&&(je["#text"]=!0),Pe&&q(je,["html","head","body"]),je.table&&(q(je,["tbody"]),delete Ce.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw H('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw H('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');E=e.TRUSTED_TYPES_POLICY,j=E.createHTML("")}else void 0===E&&(E=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const s="data-tt-policy-suffix";t&&t.hasAttribute(s)&&(n=t.getAttribute(s));const o="dompurify"+(n?"#"+n:"");try{return e.createPolicy(o,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+o+" could not be created."),null}}(p,a)),null!==E&&"string"==typeof j&&(j=E.createHTML(""));M&&M(e),pt=e}},bt=q({},[...X,...K,...J]),wt=q({},[...V,...Z]),xt=function(e){I(n.removed,{element:e});try{v(e).removeChild(e)}catch(t){y(e)}},vt=function(e,t){try{I(n.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){I(n.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(He||We)try{xt(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},Et=function(e){let t=null,n=null;if(Ue)e="<remove></remove>"+e;else{const t=L(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===ut&&ot===st&&(e='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+e+"</body></html>");const o=E?E.createHTML(e):e;if(ot===st)try{t=(new m).parseFromString(o,ut)}catch(e){}if(!t||!t.documentElement){t=T.createDocument(ot,"template",null);try{t.documentElement.innerHTML=at?j:o}catch(e){}}const a=t.body||t.documentElement;return e&&n&&a.insertBefore(s.createTextNode(n),a.childNodes[0]||null),ot===st?B.call(t,Pe?"html":"body")[0]:Pe?t.documentElement:a},Mt=function(e){return S.call(e.ownerDocument||e,e,d.SHOW_ELEMENT|d.SHOW_COMMENT|d.SHOW_TEXT|d.SHOW_PROCESSING_INSTRUCTION|d.SHOW_CDATA_SECTION,null)},jt=function(e){return e instanceof g&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof u)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},kt=function(e){return"function"==typeof l&&e instanceof l};function Tt(e,t,s){N(e,e=>{e.call(n,t,s,pt)})}const St=function(e){let t=null;if(Tt(ae.beforeSanitizeElements,e,null),jt(e))return xt(e),!0;const s=mt(e.nodeName);if(Tt(ae.uponSanitizeElement,e,{tagName:s,allowedTags:je}),ze&&e.hasChildNodes()&&!kt(e.firstElementChild)&&U(/<[/\w!]/g,e.innerHTML)&&U(/<[/\w!]/g,e.textContent))return xt(e),!0;if(e.nodeType===be)return xt(e),!0;if(ze&&e.nodeType===we&&U(/<[/\w]/g,e.data))return xt(e),!0;if(!(Ie.tagCheck instanceof Function&&Ie.tagCheck(s))&&(!je[s]||Ce[s])){if(!Ce[s]&&Ct(s)){if(Ne.tagNameCheck instanceof RegExp&&U(Ne.tagNameCheck,s))return!1;if(Ne.tagNameCheck instanceof Function&&Ne.tagNameCheck(s))return!1}if(Ge&&!Xe[s]){const t=v(e)||e.parentNode,n=x(e)||e.childNodes;if(n&&t){for(let s=n.length-1;s>=0;--s){const o=f(n[s],!0);o.__removalCount=(e.__removalCount||0)+1,t.insertBefore(o,w(e))}}}return xt(e),!0}return e instanceof c&&!function(e){let t=v(e);t&&t.tagName||(t={namespaceURI:ot,tagName:"template"});const n=_(e.tagName),s=_(t.tagName);return!!it[e.namespaceURI]&&(e.namespaceURI===nt?t.namespaceURI===st?"svg"===n:t.namespaceURI===tt?"svg"===n&&("annotation-xml"===s||lt[s]):Boolean(bt[n]):e.namespaceURI===tt?t.namespaceURI===st?"math"===n:t.namespaceURI===nt?"math"===n&&ct[s]:Boolean(wt[n]):e.namespaceURI===st?!(t.namespaceURI===nt&&!ct[s])&&!(t.namespaceURI===tt&&!lt[s])&&!wt[n]&&(dt[n]||!bt[n]):!("application/xhtml+xml"!==ut||!it[e.namespaceURI]))}(e)?(xt(e),!0):"noscript"!==s&&"noembed"!==s&&"noframes"!==s||!U(/<\/no(script|embed|frames)/i,e.innerHTML)?(Oe&&e.nodeType===ye&&(t=e.textContent,N([ie,re,le],e=>{t=O(t,e," ")}),e.textContent!==t&&(I(n.removed,{element:e.cloneNode()}),e.textContent=t)),Tt(ae.afterSanitizeElements,e,null),!1):(xt(e),!0)},Nt=function(e,t,n){if(qe&&("id"===t||"name"===t)&&(n in s||n in ht))return!1;if(_e&&!Ae[t]&&U(ce,t));else if(Re&&U(ue,t));else if(Ie.attributeCheck instanceof Function&&Ie.attributeCheck(t,e));else if(!Te[t]||Ae[t]){if(!(Ct(e)&&(Ne.tagNameCheck instanceof RegExp&&U(Ne.tagNameCheck,e)||Ne.tagNameCheck instanceof Function&&Ne.tagNameCheck(e))&&(Ne.attributeNameCheck instanceof RegExp&&U(Ne.attributeNameCheck,t)||Ne.attributeNameCheck instanceof Function&&Ne.attributeNameCheck(t,e))||"is"===t&&Ne.allowCustomizedBuiltInElements&&(Ne.tagNameCheck instanceof RegExp&&U(Ne.tagNameCheck,n)||Ne.tagNameCheck instanceof Function&&Ne.tagNameCheck(n))))return!1}else if(Ze[t]);else if(U(Me,O(n,pe,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==z(n,"data:")||!Je[e]){if(De&&!U(ge,O(n,pe,"")));else if(n)return!1}else;return!0},Ct=function(e){return"annotation-xml"!==e&&L(e,Ee)},At=function(e){Tt(ae.beforeSanitizeAttributes,e,null);const{attributes:t}=e;if(!t||jt(e))return;const s={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Te,forceKeepAttr:void 0};let o=t.length;for(;o--;){const a=t[o],{name:i,namespaceURI:r,value:l}=a,c=mt(i),d=l;let u="value"===i?d:P(d);if(s.attrName=c,s.attrValue=u,s.keepAttr=!0,s.forceKeepAttr=void 0,Tt(ae.uponSanitizeAttribute,e,s),u=s.attrValue,!$e||"id"!==c&&"name"!==c||(vt(i,e),u="user-content-"+u),ze&&U(/((--!?|])>)|<\/(style|title|textarea)/i,u)){vt(i,e);continue}if("attributename"===c&&L(u,"href")){vt(i,e);continue}if(s.forceKeepAttr)continue;if(!s.keepAttr){vt(i,e);continue}if(!Le&&U(/\/>/i,u)){vt(i,e);continue}Oe&&N([ie,re,le],e=>{u=O(u,e," ")});const g=mt(e.nodeName);if(Nt(g,c,u)){if(E&&"object"==typeof p&&"function"==typeof p.getAttributeType)if(r);else switch(p.getAttributeType(g,c)){case"TrustedHTML":u=E.createHTML(u);break;case"TrustedScriptURL":u=E.createScriptURL(u)}if(u!==d)try{r?e.setAttributeNS(r,i,u):e.setAttribute(i,u),jt(e)?xt(e):A(n.removed)}catch(t){vt(i,e)}}else vt(i,e)}Tt(ae.afterSanitizeAttributes,e,null)},It=function e(t){let n=null;const s=Mt(t);for(Tt(ae.beforeSanitizeShadowDOM,t,null);n=s.nextNode();)Tt(ae.uponSanitizeShadowNode,n,null),St(n),At(n),n.content instanceof i&&e(n.content);Tt(ae.afterSanitizeShadowDOM,t,null)};return n.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=null,a=null,r=null,c=null;if(at=!e,at&&(e="\x3c!--\x3e"),"string"!=typeof e&&!kt(e)){if("function"!=typeof e.toString)throw H("toString is not a function");if("string"!=typeof(e=e.toString()))throw H("dirty is not a string, aborting")}if(!n.isSupported)return e;if(Fe||yt(t),n.removed=[],"string"==typeof e&&(Qe=!1),Qe){if(e.nodeName){const t=mt(e.nodeName);if(!je[t]||Ce[t])throw H("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof l)s=Et("\x3c!----\x3e"),a=s.ownerDocument.importNode(e,!0),a.nodeType===fe&&"BODY"===a.nodeName||"HTML"===a.nodeName?s=a:s.appendChild(a);else{if(!He&&!Oe&&!Pe&&-1===e.indexOf("<"))return E&&Be?E.createHTML(e):e;if(s=Et(e),!s)return He?null:Be?j:""}s&&Ue&&xt(s.firstChild);const d=Mt(Qe?e:s);for(;r=d.nextNode();)St(r),At(r),r.content instanceof i&&It(r.content);if(Qe)return e;if(He){if(We)for(c=W.call(s.ownerDocument);s.firstChild;)c.appendChild(s.firstChild);else c=s;return(Te.shadowroot||Te.shadowrootmode)&&(c=$.call(o,c,!0)),c}let u=Pe?s.outerHTML:s.innerHTML;return Pe&&je["!doctype"]&&s.ownerDocument&&s.ownerDocument.doctype&&s.ownerDocument.doctype.name&&U(me,s.ownerDocument.doctype.name)&&(u="<!DOCTYPE "+s.ownerDocument.doctype.name+">\n"+u),Oe&&N([ie,re,le],e=>{u=O(u,e," ")}),E&&Be?E.createHTML(u):u},n.setConfig=function(){yt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),Fe=!0},n.clearConfig=function(){pt=null,Fe=!1},n.isValidAttribute=function(e,t,n){pt||yt({});const s=mt(e),o=mt(t);return Nt(s,o,n)},n.addHook=function(e,t){"function"==typeof t&&I(ae[e],t)},n.removeHook=function(e,t){if(void 0!==t){const n=C(ae[e],t);return-1===n?void 0:R(ae[e],n,1)[0]}return A(ae[e])},n.removeHooks=function(e){ae[e]=[]},n.removeAllHooks=function(){ae={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},n}();function Me(e){return Ee.sanitize(e,{ALLOWED_TAGS:["a","b","i","em","strong","u","s","strike","del","p","br","div","span","h1","h2","h3","h4","h5","h6","ul","ol","li","dl","dt","dd","code","pre","kbd","samp","blockquote","q","table","thead","tbody","tfoot","tr","th","td","hr","sub","sup","small","mark","abbr","cite","time"],ALLOWED_ATTR:["href","target","rel","title","class","id","style"],ALLOW_DATA_ATTR:!1,ALLOW_UNKNOWN_PROTOCOLS:!1})}function je(e){const t=new Date(e);if(isNaN(t.getTime()))return"";const n=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"][t.getMonth()],s=t.getDate(),o=t.getFullYear();let a=t.getHours();const i=t.getMinutes(),r=a>=12?"PM":"AM";a=a%12||12;return`${n} ${s}, ${o} at ${a}:${i<10?`0${i}`:`${i}`} ${r}`}const ke=({message:e,onClose:n,onLinkClick:o})=>{const[a,i]=t.useState(!1);t.useEffect(()=>{setTimeout(()=>i(!0),10)},[]);const r=Me(e.message),l=e.received?"viewed":"info";return s.createElement("div",{className:"journy-message-overlay "+(a?"journy-message-visible":"")},s.createElement("div",{className:`journy-message-popup journy-message-${l}`},s.createElement("button",{className:"journy-message-close",onClick:n,"aria-label":"Close message"},"×"),e.createdAt&&s.createElement("div",{className:"journy-message-timestamp"},je(e.createdAt)),s.createElement("div",{className:"journy-message-content",dangerouslySetInnerHTML:{__html:r},onClick:e=>{"A"===e.target.tagName&&(e=>{e.preventDefault();const t=e.currentTarget.href;o(t)})(e)}})))},Te=[{label:"15 seconds",value:15e3},{label:"30 seconds",value:3e4},{label:"60 seconds",value:6e4},{label:"120 seconds",value:12e4}],Se=[{label:"Widget",value:"widget"},{label:"List",value:"list"}],Ne=[{label:"Default",value:"default"},{label:"None (custom)",value:"none"}];const Ce=({isOpen:e,onClose:n,settings:o,onSettingsChange:a,configInfo:i})=>{const[r,l]=t.useState(!1),c=e=>{a({...o,...e})},d=e=>{c({[e]:!o[e]})},u="default"===(g=o.styles)||"none"===g?g:"object"==typeof g&&"url"in g?"custom-url":"object"==typeof g&&"css"in g?"custom-css":"default";var g;return s.createElement("div",{className:"journy-settings-panel "+(e?"journy-settings-panel-open":"journy-settings-panel-closed"),onClick:e=>e.stopPropagation()},s.createElement("div",{className:"journy-settings-header"},s.createElement("span",{className:"journy-settings-title"},"Settings"),s.createElement("button",{type:"button",className:"journy-settings-close",onClick:n,title:"Close settings","aria-label":"Close settings"},"×")),s.createElement("div",{className:"journy-settings-body"},s.createElement("div",{className:"journy-settings-item"},s.createElement("label",{className:"journy-settings-label"},"Display mode"),s.createElement("select",{className:"journy-settings-select",value:o.displayMode,onChange:e=>c({displayMode:e.target.value})},Se.map(e=>s.createElement("option",{key:e.value,value:e.value},e.label)))),s.createElement("div",{className:"journy-settings-item"},s.createElement("label",{className:"journy-settings-label"},"Polling interval"),s.createElement("select",{className:"journy-settings-select",value:o.pollingInterval,onChange:e=>c({pollingInterval:Number(e.target.value)})},Te.map(e=>s.createElement("option",{key:e.value,value:e.value},e.label)))),s.createElement("div",{className:"journy-settings-item"},s.createElement("label",{className:"journy-settings-label"},"Show read messages"),s.createElement("button",{type:"button",className:"journy-settings-toggle "+(o.showReadMessages?"journy-settings-toggle-on":""),onClick:()=>d("showReadMessages"),role:"switch","aria-checked":o.showReadMessages},s.createElement("span",{className:"journy-settings-toggle-knob"}))),s.createElement("div",{className:"journy-settings-item"},s.createElement("label",{className:"journy-settings-label"},"Auto-expand on new messages"),s.createElement("button",{type:"button",className:"journy-settings-toggle "+(o.autoExpandOnNew?"journy-settings-toggle-on":""),onClick:()=>d("autoExpandOnNew"),role:"switch","aria-checked":o.autoExpandOnNew},s.createElement("span",{className:"journy-settings-toggle-knob"}))),s.createElement("div",{className:"journy-settings-item"},s.createElement("label",{className:"journy-settings-label"},"Styles"),s.createElement("select",{className:"journy-settings-select",value:u,onChange:e=>{const t=e.target.value;"default"!==t&&"none"!==t||c({styles:t})}},Ne.map(e=>s.createElement("option",{key:e.value,value:e.value},e.label)),"custom-url"===u&&s.createElement("option",{value:"custom-url",disabled:!0},"Custom URL"),"custom-css"===u&&s.createElement("option",{value:"custom-css",disabled:!0},"Custom CSS"))),s.createElement("div",{className:"journy-settings-item"},s.createElement("button",{type:"button",className:"journy-settings-advanced-btn",onClick:()=>l(!r)},r?"▾ Advanced":"▸ Advanced")),r&&s.createElement(s.Fragment,null,s.createElement("div",{className:"journy-settings-item journy-settings-item-vertical"},s.createElement("label",{className:"journy-settings-label"},"API endpoint"),s.createElement("input",{type:"text",className:"journy-settings-input",value:o.apiEndpoint,onChange:e=>c({apiEndpoint:e.target.value}),placeholder:"https://jtm.journy.io"})),i&&s.createElement(s.Fragment,null,s.createElement("div",{className:"journy-settings-item"},s.createElement("label",{className:"journy-settings-label"},"Entity type"),s.createElement("span",{className:"journy-settings-value"},i.entityType)),i.userId&&s.createElement("div",{className:"journy-settings-item"},s.createElement("label",{className:"journy-settings-label"},"User ID"),s.createElement("span",{className:"journy-settings-value"},i.userId)),i.accountId&&s.createElement("div",{className:"journy-settings-item"},s.createElement("label",{className:"journy-settings-label"},"Account ID"),s.createElement("span",{className:"journy-settings-value"},i.accountId))))))},Ae=10,Ie=({onMouseDown:e,title:t="Drag to move",className:n="journy-message-widget-drag-handle"})=>s.createElement("div",{className:n,onMouseDown:e,title:t},s.createElement("svg",{width:12,height:12,viewBox:"0 0 12 12",fill:"none",xmlns:"http://www.w3.org/2000/svg"},s.createElement("circle",{cx:2,cy:2,r:1,fill:"#9ca3af"}),s.createElement("circle",{cx:6,cy:2,r:1,fill:"#9ca3af"}),s.createElement("circle",{cx:Ae,cy:2,r:1,fill:"#9ca3af"}),s.createElement("circle",{cx:2,cy:6,r:1,fill:"#9ca3af"}),s.createElement("circle",{cx:6,cy:6,r:1,fill:"#9ca3af"}),s.createElement("circle",{cx:Ae,cy:6,r:1,fill:"#9ca3af"}),s.createElement("circle",{cx:2,cy:Ae,r:1,fill:"#9ca3af"}),s.createElement("circle",{cx:6,cy:Ae,r:1,fill:"#9ca3af"}),s.createElement("circle",{cx:Ae,cy:Ae,r:1,fill:"#9ca3af"}))),Re=({onMouseDown:e,title:t="Resize",className:n="journy-message-widget-resize-handle"})=>s.createElement("div",{className:n,onMouseDown:e,title:t},s.createElement("svg",{width:16,height:16,viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg"},s.createElement("path",{d:"M16 0 L0 16 M13 3 L3 13",stroke:"#9ca3af",strokeWidth:1.5,strokeLinecap:"round"}))),_e=300;const De="widget_settings";const Le=({message:e,isSeparated:n,onMessageReceived:o,onDismissMessage:a,children:i})=>{const r=t.useRef(null);return function(e,n,s,o){const a=t.useRef(!1);t.useEffect(()=>{if(s)return void(a.current=!0);a.current=!1;const t=e.current;if(!t||!o)return;const i=new IntersectionObserver(e=>{const[t]=e;t?.isIntersecting&&!a.current&&(a.current=!0,o([n]),i.disconnect())},{threshold:.1,root:null});return i.observe(t),()=>i.disconnect()},[n,s,o])}(r,e.id,e.received,o),s.createElement("div",{ref:r,className:`journy-message-widget-message journy-message-${e.received?"viewed":"info"} ${n?"journy-message-widget-message-separated":""}`},a&&s.createElement("button",{type:"button",className:"journy-message-widget-message-close",onClick:t=>{t.stopPropagation(),t.preventDefault(),a(e.id)},title:"Dismiss message","aria-label":"Dismiss"},"×"),i)};const Oe=({store:e,onClose:n,onCloseWidget:o,onLinkClick:a,onToggleExpand:i,onMessageReceived:r,onDismissMessage:c,onNextMessage:g,onPrevMessage:m,onSettingsChange:p,configInfo:h})=>{const{messages:f,currentMessage:y,isCollapsed:b,displayMode:w,widgetVisible:x}=function(e){const[n,s]=t.useState(()=>e.getState());return t.useEffect(()=>(s(e.getState()),e.subscribe(()=>s(e.getState()))),[e]),n}(e),{totalCount:v,unreadCount:E,readCount:M}=function(e){return t.useMemo(()=>{const t=e.filter(e=>!e.received).length,n=e.filter(e=>e.received).length;return{totalCount:e.length,unreadCount:t,readCount:n}},[e])}(f),[j,k]=t.useState(null),[T,S]=t.useState(!1),[N,C]=t.useState(()=>{const e=u(De);return e?{...l,...e,displayMode:w}:{...l,displayMode:w}}),A="list"===w,{position:I,isDragging:R,isResizing:_,widgetRef:D,justFinishedDragging:L,currentWidth:O,currentHeight:z,handleMouseDown:P,handleResizeStart:F}=function({isCollapsed:e,isListMode:n}){const[s,o]=t.useState(()=>{const e=u("widget_position");return e&&"number"==typeof e.left&&"number"==typeof e.top?{left:Math.max(0,Math.min(e.left,window.innerWidth-_e)),top:Math.max(0,Math.min(e.top,window.innerHeight-80))}:e&&"number"==typeof e.x&&"number"==typeof e.y?{left:Math.max(0,e.x-_e),top:Math.max(0,e.y-80)}:{left:window.innerWidth-20-_e,top:window.innerHeight-20-80}}),[a,i]=t.useState({width:600,height:800}),[r,l]=t.useState(!1),[c,g]=t.useState(!1),[m,p]=t.useState({x:0,y:0}),[h,f]=t.useState(null),y=t.useRef(null),b=t.useRef(!1),w=t.useRef(!1),x=e?_e:n?a.width:340,v=e?80:n?a.height:280;return t.useEffect(()=>{const e=u("widget_size");e&&i({width:Math.max(300,Math.min(e.width,window.innerWidth-40)),height:Math.max(200,Math.min(e.height,window.innerHeight-40))})},[]),t.useEffect(()=>{o(e=>({left:Math.max(0,Math.min(e.left,window.innerWidth-x)),top:Math.max(0,Math.min(e.top,window.innerHeight-v))}))},[x,v]),t.useEffect(()=>{(s.left>0||s.top>0)&&d("widget_position",s)},[s]),t.useEffect(()=>{n&&!e&&a.width>0&&a.height>0&&d("widget_size",a)},[a,e,n]),t.useEffect(()=>{const e=()=>{o(e=>({left:Math.max(0,Math.min(e.left,window.innerWidth-x)),top:Math.max(0,Math.min(e.top,window.innerHeight-v))}))};return window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[x,v]),t.useEffect(()=>{if(!r&&!c)return;const e=e=>{if(r){b.current=!0;const t=e.clientX-m.x,n=e.clientY-m.y;o({left:Math.max(0,Math.min(t,window.innerWidth-x)),top:Math.max(0,Math.min(n,window.innerHeight-v))})}else if(c&&h){const t=e.clientX-h.x,n=e.clientY-h.y,o=window.innerWidth-s.left,a=window.innerHeight-s.top,r=Math.max(300,Math.min(h.width+t,o)),l=Math.max(200,Math.min(h.height+n,a));i({width:r,height:l})}},t=()=>{r&&b.current&&(w.current=!0,setTimeout(()=>{w.current=!1},100)),l(!1),g(!1),f(null)};return document.addEventListener("mousemove",e),document.addEventListener("mouseup",t),()=>{document.removeEventListener("mousemove",e),document.removeEventListener("mouseup",t)}},[r,c,m,h,s,x,v]),{position:s,size:a,isDragging:r,isResizing:c,widgetRef:y,justFinishedDragging:w,currentWidth:x,currentHeight:v,handleMouseDown:e=>{if(!e.target.closest(".journy-message-widget-drag-handle"))return;if(!y.current)return;b.current=!1;const t=y.current.getBoundingClientRect();p({x:e.clientX-t.left,y:e.clientY-t.top}),l(!0)},handleResizeStart:e=>{if(e.stopPropagation(),!y.current)return;const t=y.current.getBoundingClientRect();f({x:e.clientX,y:e.clientY,width:t.width,height:t.height}),g(!0)}}}({isCollapsed:b,isListMode:A}),U=t.useRef(null),H=t.useRef(null);t.useEffect(()=>{if(b||!A)return;const e=U.current;if(!e)return;const t=u("widget_scroll_position");null!=t&&(e.scrollTop=t);const n=()=>{H.current&&clearTimeout(H.current),H.current=setTimeout(()=>{d("widget_scroll_position",e.scrollTop)},150)};return e.addEventListener("scroll",n,{passive:!0}),()=>{e.removeEventListener("scroll",n),H.current&&clearTimeout(H.current)}},[b,A]);const W=t.useCallback(e=>{C(e),d(De,e),p?.(e)},[p]);if(!x)return null;const B=(e,t)=>{"A"===t.target.tagName?(e=>{e.preventDefault();const t=e.currentTarget.href;a(t)})(t):(r&&!e.received&&r([e.id]),k(e))},q=f.filter(e=>!e.received),$=A&&!N.showReadMessages?q:f,G=A&&(q.length>0&&N.showReadMessages||$.length>0)?$:f,Q=y||(!b&&G.length>0?G[0]:null),Y=Q?Math.max(0,G.findIndex(e=>e.id===Q.id)):0,X=!A&&G.length>1&&Y>0,K=!A&&G.length>1&&Y<G.length-1,J=e=>{if(!e)return"Messages";const t=e.message.match(/<h[1-3][^>]*>(.*?)<\/h[1-3]>/i);return t?t[1].replace(/<[^>]+>/g,""):"Messages"};return s.createElement("div",{ref:D,className:`journy-message-widget ${b?"journy-message-widget-collapsed":"journy-message-widget-expanded"} ${R?"journy-message-widget-dragging":""} ${_?"journy-message-widget-resizing":""}`,style:{left:`${I.left}px`,top:`${I.top}px`,width:`${O}px`,height:`${z}px`,transition:R||_?"none":"height 0.25s ease-out, top 0.25s ease-out"},onClick:e=>{if(L.current)return e.preventDefault(),void e.stopPropagation();if(!b)return;const t=e.target,n=t.closest("button"),s=t.closest(".journy-message-widget-drag-handle"),o="A"===t.tagName||t.closest("a");n||s||o||i()}},s.createElement("div",{className:"journy-message-widget-header"},s.createElement(Ie,{onMouseDown:P}),s.createElement("div",{className:"journy-message-widget-header-content"},b?s.createElement(s.Fragment,null,s.createElement("span",{className:"journy-message-widget-badge"},E),s.createElement("span",{className:"journy-message-widget-title"},E>0?"New Messages":"Messages"),M>0&&s.createElement("span",{className:"journy-message-widget-read-count"},"(",M," read)")):s.createElement(s.Fragment,null,E>0&&s.createElement("span",{className:"journy-message-widget-badge"},E),s.createElement("span",{className:"journy-message-widget-title"},Q?J(Q):G.length>0?J(G[0]):"Messages"),A&&G.length>1&&s.createElement("span",{className:"journy-message-widget-message-count"},"(",G.length," messages)"))),s.createElement("div",{className:"journy-message-widget-controls"},!b&&s.createElement("button",{className:"journy-message-widget-settings-btn",onClick:e=>{e.stopPropagation(),e.preventDefault(),S(!0)},onMouseDown:e=>e.stopPropagation(),title:"Settings","aria-label":"Settings"},s.createElement("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",xmlns:"http://www.w3.org/2000/svg"},s.createElement("path",{d:"M6.5 1L6.2 2.6C5.8 2.8 5.5 3 5.2 3.2L3.6 2.7L2.1 5.3L3.4 6.3C3.4 6.5 3.3 6.8 3.3 7C3.3 7.2 3.4 7.5 3.4 7.7L2.1 8.7L3.6 11.3L5.2 10.8C5.5 11 5.8 11.2 6.2 11.4L6.5 13H9.5L9.8 11.4C10.2 11.2 10.5 11 10.8 10.8L12.4 11.3L13.9 8.7L12.6 7.7C12.6 7.5 12.7 7.2 12.7 7C12.7 6.8 12.6 6.5 12.6 6.3L13.9 5.3L12.4 2.7L10.8 3.2C10.5 3 10.2 2.8 9.8 2.6L9.5 1H6.5ZM8 5C9.1 5 10 5.9 10 7C10 8.1 9.1 9 8 9C6.9 9 6 8.1 6 7C6 5.9 6.9 5 8 5Z",fill:"currentColor"}))),s.createElement("button",{className:"journy-message-widget-toggle",onClick:e=>{e.stopPropagation(),e.preventDefault(),i()},onMouseDown:e=>{e.stopPropagation()},title:b?"Expand":"Collapse","aria-label":b?"Expand":"Collapse"},b?"+":"−"),b&&s.createElement("button",{className:"journy-message-widget-close",onClick:e=>{e.stopPropagation(),e.preventDefault(),o?o():n()},onMouseDown:e=>{e.stopPropagation()},title:"Close widget","aria-label":"Close"},"×"),!b&&!1===A&&G.length>1&&s.createElement(s.Fragment,null,s.createElement("button",{className:"journy-message-widget-nav",onClick:e=>{e.stopPropagation(),e.preventDefault(),m?.()},onMouseDown:e=>e.stopPropagation(),title:"Previous message","aria-label":"Previous",disabled:!X},"‹"),s.createElement("button",{className:"journy-message-widget-nav",onClick:e=>{e.stopPropagation(),e.preventDefault(),g?.()},onMouseDown:e=>e.stopPropagation(),title:"Next message","aria-label":"Next",disabled:!K},"›")))),!b&&G.length>0&&s.createElement(s.Fragment,null,s.createElement("div",{ref:U,className:"journy-message-widget-content "+(A?"":"journy-message-widget-content--single")},A?G.map((e,t)=>s.createElement(Le,{key:e.id,message:e,isSeparated:t<G.length-1,onMessageReceived:r,onDismissMessage:c},s.createElement("div",{className:"journy-message-content journy-message-content-clickable",dangerouslySetInnerHTML:{__html:Me(e.message)},onClick:t=>B(e,t)}),e.createdAt&&s.createElement("div",{className:"journy-message-timestamp"},je(e.createdAt)))):Q?s.createElement(Le,{message:Q,isSeparated:!1,onMessageReceived:r,onDismissMessage:c},s.createElement("div",{className:"journy-message-content journy-message-content-clickable",dangerouslySetInnerHTML:{__html:Me(Q.message)},onClick:e=>B(Q,e)}),Q.createdAt&&s.createElement("div",{className:"journy-message-timestamp"},je(Q.createdAt))):null),!A&&G.length>1&&s.createElement("div",{className:"journy-message-widget-position"},Y+1," / ",G.length),A&&s.createElement(Re,{onMouseDown:F})),!b&&0===G.length&&s.createElement(s.Fragment,null,s.createElement("div",{className:"journy-message-widget-content journy-message-widget-empty"},s.createElement("p",null,"No unread messages")),A&&s.createElement(Re,{onMouseDown:F})),!b&&s.createElement(Ce,{isOpen:T,onClose:()=>S(!1),settings:N,onSettingsChange:W,configInfo:h}),j&&s.createElement(ke,{message:j,onClose:()=>k(null),onLinkClick:a}))};var ze=Object.freeze({__proto__:null,MessageWidget:Oe,default:Oe});class Pe{constructor(e){this.config=e,this.analyticsHost=e.apiEndpoint||"https://jtm.journy.io"}get trackIdentity(){return{userId:this.config.userId,accountId:this.config.accountId}}async trackEvents(e){if(0===e.length)return!0;const t=e.map(({event:e,properties:t})=>function(e,t,n,s){const o={type:"track",event:n,properties:s};if("account"===e&&t.accountId)return{...o,anonymousId:t.accountId,context:{groupId:t.accountId}};if(t.userId)return{...o,userId:t.userId};if(t.anonymousId)return{...o,anonymousId:t.anonymousId};throw new Error("User scope requires userId or anonymousId; account scope requires accountId.")}(this.config.entityType,this.trackIdentity,e,t));return await fetch(this.analyticsHost+"/frontend/v1/b",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({writeKey:this.config.writeKey,batch:t})}),!0}async sendAnalyticsEvents(e){return this.trackEvents(e.map(e=>({event:r.MessageReceived,properties:{messageId:e}})))}}const Fe="widget_settings",Ue="widget_visible",He="widget_collapsed",We="current_message_id";class Be{constructor(e){if(this.initialized=!1,this.pollingInterval=null,this.reactRoot=null,this.reactRootContainer=null,this.rootElementId="journy-messages-root",this.unsubscribePersistence=null,this.config={apiEndpoint:"https://jtm.journy.io",pollingInterval:3e4,...e},!this.config.writeKey)throw new Error("writeKey is required");if(!this.config.entityType)throw new Error("entityType is required");this.apiClient=new i(this.config),this.messageQueue=new o,this.analyticsClient=new Pe(this.config),this.eventTracker=new g(this.analyticsClient);const t={...l,pollingInterval:this.config.pollingInterval||l.pollingInterval,displayMode:this.config.displayMode||l.displayMode,apiEndpoint:this.config.apiEndpoint||l.apiEndpoint,styles:this.config.styles||l.styles},n=u(Fe);this.widgetSettings=n?{...t,...n}:t,this.config.pollingInterval=this.widgetSettings.pollingInterval,this.config.apiEndpoint=this.widgetSettings.apiEndpoint,this.config.displayMode=this.widgetSettings.displayMode;const s=u(Ue),a=u(He);this.store=new m({messages:[],currentMessage:null,isCollapsed:a??this.config.isCollapsed??!0,widgetVisible:s??!0,displayMode:this.widgetSettings.displayMode}),this.unsubscribePersistence=this.store.subscribe(()=>{const e=this.store.getState();d(Ue,e.widgetVisible),d(He,e.isCollapsed),e.currentMessage?d(We,e.currentMessage.id):function(e){try{const t=c(e);localStorage.removeItem(t)}catch(e){console.warn("Failed to remove item from localStorage:",e)}}(We)}),this.init()}get uiState(){return this.store.getState()}async init(){this.initialized||(await this.loadMessages(),this.startPolling(),this.initializeUI(),this.initialized=!0)}async loadMessages(){try{const e=await this.apiClient.getUnreadMessages(),t=this.messageQueue.getActiveCount();this.messageQueue.addMessages(e);const n=this.messageQueue.getActiveCount();let s={messages:this.messageQueue.getAllMessages()};if(n>t&&(s.widgetVisible=!0,this.widgetSettings.autoExpandOnNew&&(s.isCollapsed=!1)),this.store.setState(s),!this.uiState.currentMessage&&n>0){const e=u(We),t=this.messageQueue.getAllMessages(),n=e?t.find(t=>t.id===e):null;n?this.store.setState({currentMessage:n}):this.displayNextMessage()}this.uiState.isCollapsed||!this.uiState.currentMessage||this.uiState.currentMessage.received||this.handleMessageReceived([this.uiState.currentMessage.id])}catch(e){console.error("Failed to load messages:",e)}}startPolling(){null!==this.pollingInterval&&clearInterval(this.pollingInterval),this.pollingInterval=window.setInterval(()=>{this.loadMessages()},this.config.pollingInterval||3e4)}applyStyles(e){y(),"none"===e||(e&&"default"!==e?"url"in e&&e.url?function(e){if("undefined"==typeof document||!document.head)return;const t=document.getElementById(p);if(t&&t instanceof HTMLLinkElement&&t.href===e)return;t&&t.remove();const n=document.createElement("link");n.id=p,n.rel="stylesheet",n.href=e,document.head.appendChild(n)}(e.url):"css"in e&&e.css&&f(e.css):f("/* Widget Container */\n.journy-message-widget {\n position: fixed;\n z-index: 10000;\n background: white;\n border-radius: 12px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n overflow: hidden;\n user-select: none;\n transform-origin: bottom right;\n}\n\n.journy-message-widget.journy-message-widget-dragging {\n cursor: grabbing;\n transition: none;\n z-index: 10001;\n}\n\n.journy-message-widget.journy-message-widget-expanded {\n display: flex;\n flex-direction: column;\n min-height: 0;\n}\n\n.journy-message-widget.journy-message-widget-resizing {\n transition: none;\n}\n\n/* Expand/collapse: height and top are animated via inline transition so bottom-right stays fixed */\n\n/* Widget Header */\n.journy-message-widget-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: #f9fafb;\n border-bottom: 1px solid #e5e7eb;\n user-select: none;\n}\n\n.journy-message-widget-drag-handle {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 4px 8px;\n margin-right: 8px;\n cursor: grab;\n color: #9ca3af;\n transition: color 0.2s;\n flex-shrink: 0;\n}\n\n.journy-message-widget-drag-handle:active {\n cursor: grabbing;\n color: #6b7280;\n}\n\n.journy-message-widget-drag-handle:hover {\n color: #6b7280;\n}\n\n.journy-message-widget-drag-handle svg {\n display: block;\n}\n\n.journy-message-widget-header-content {\n display: flex;\n align-items: center;\n gap: 10px;\n flex: 1;\n flex-wrap: wrap;\n cursor: pointer;\n}\n\n.journy-message-widget-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n padding: 0 8px;\n background: #3b82f6;\n color: white;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n}\n\n.journy-message-widget-title {\n font-size: 14px;\n font-weight: 600;\n color: #111827;\n}\n\n.journy-message-widget-read-count {\n font-size: 12px;\n color: #6b7280;\n font-weight: 400;\n}\n\n.journy-message-widget-controls {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.journy-message-widget-toggle,\n.journy-message-widget-close {\n background: none;\n border: none;\n font-size: 18px;\n line-height: 1;\n cursor: pointer;\n color: #6b7280;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background-color 0.2s, color 0.2s;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n}\n\n.journy-message-widget-toggle:hover,\n.journy-message-widget-close:hover {\n background-color: #e5e7eb;\n color: #374151;\n}\n\n/* Widget Content */\n.journy-message-widget-content {\n padding: 16px;\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n.journy-message-widget-content--single .journy-message-widget-message {\n flex: 1;\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n\n.journy-message-widget-content--single .journy-message-widget-message .journy-message-content {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n}\n\n/* Resize Handle */\n.journy-message-widget-resize-handle {\n position: absolute;\n bottom: 0;\n right: 0;\n width: 20px;\n height: 20px;\n cursor: nwse-resize;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, transparent 0%, transparent 40%, #e5e7eb 40%, #e5e7eb 100%);\n z-index: 10;\n transition: background 0.2s;\n}\n\n.journy-message-widget-resize-handle:hover {\n background: linear-gradient(135deg, transparent 0%, transparent 40%, #d1d5db 40%, #d1d5db 100%);\n}\n\n.journy-message-widget-resize-handle svg {\n width: 12px;\n height: 12px;\n opacity: 0.6;\n}\n\n.journy-message-widget-resize-handle:hover svg {\n opacity: 1;\n}\n\n.journy-message-widget-message {\n padding: 0;\n position: relative;\n min-height: 60px;\n}\n\n.journy-message-widget-message-close {\n position: absolute;\n top: 4px;\n right: 4px;\n width: 24px;\n height: 24px;\n padding: 0;\n border: none;\n background: transparent;\n color: #6b7280;\n font-size: 18px;\n line-height: 1;\n cursor: pointer;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 0.2s, color 0.2s;\n z-index: 1;\n}\n\n.journy-message-widget-message-close:hover {\n background-color: #e5e7eb;\n color: #374151;\n}\n\n.journy-message-widget-message:has(.journy-message-widget-message-close) .journy-message-content {\n padding-right: 28px;\n}\n\n.journy-message-widget-nav {\n background: none;\n border: none;\n font-size: 18px;\n line-height: 1;\n cursor: pointer;\n color: #6b7280;\n padding: 4px 6px;\n border-radius: 4px;\n transition: background-color 0.2s, color 0.2s;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n}\n\n.journy-message-widget-nav:hover:not(:disabled) {\n background-color: #e5e7eb;\n color: #374151;\n}\n\n.journy-message-widget-nav:disabled {\n opacity: 0.4;\n cursor: default;\n}\n\n.journy-message-widget-message-separated {\n margin-bottom: 24px;\n padding-bottom: 24px;\n border-bottom: 1px solid #e5e7eb;\n}\n\n.journy-message-widget-message-count {\n font-size: 12px;\n color: #6b7280;\n font-weight: 400;\n margin-left: 8px;\n}\n\n.journy-message-widget-position {\n padding: 4px 12px;\n font-size: 11px;\n color: #9ca3af;\n font-weight: 500;\n text-align: right;\n flex-shrink: 0;\n}\n\n.journy-message-widget-message.journy-message-info {\n border-left: 4px solid #3b82f6;\n padding-left: 12px;\n}\n\n.journy-message-widget-message.journy-message-success {\n border-left: 4px solid #10b981;\n padding-left: 12px;\n}\n\n.journy-message-widget-message.journy-message-warning {\n border-left: 4px solid #f59e0b;\n padding-left: 12px;\n}\n\n.journy-message-widget-message.journy-message-error {\n border-left: 4px solid #ef4444;\n padding-left: 12px;\n}\n\n.journy-message-widget-message.journy-message-viewed {\n border-left: 4px solid #6b7280;\n padding-left: 12px;\n}\n\n/* Message modal (80vw x 60vh) */\n.journy-message-modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10002;\n padding: 20px;\n}\n\n.journy-message-modal {\n width: 80vw;\n max-width: 80vw;\n height: 60vh;\n max-height: 60vh;\n background: white;\n border-radius: 12px;\n box-shadow: 0 4px 24px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n position: relative;\n}\n\n.journy-message-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 24px;\n background: #f9fafb;\n border-bottom: 1px solid #e5e7eb;\n flex-shrink: 0;\n}\n\n.journy-message-modal-title {\n font-size: 18px;\n font-weight: 600;\n color: #111827;\n}\n\n.journy-message-modal-close {\n background: none;\n border: none;\n font-size: 24px;\n line-height: 1;\n cursor: pointer;\n color: #6b7280;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background-color 0.2s, color 0.2s;\n}\n\n.journy-message-modal-close:hover {\n background-color: #e5e7eb;\n color: #374151;\n}\n\n.journy-message-modal .journy-message-widget-message {\n padding: 24px 24px 24px 24px;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n/* Timestamp */\n.journy-message-timestamp {\n font-size: 12px;\n color: #6b7280;\n margin-top: 4px;\n line-height: 1.4;\n}\n\n.journy-message-content-clickable {\n cursor: pointer;\n}\n\n.journy-message-content-clickable:hover {\n opacity: 0.95;\n}\n\n/* Legacy Modal Overlay Styles (kept for backward compatibility) */\n.journy-message-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n opacity: 0;\n transition: opacity 0.3s ease-in-out;\n pointer-events: none;\n}\n\n.journy-message-overlay.journy-message-visible {\n opacity: 1;\n pointer-events: all;\n}\n\n.journy-message-popup {\n background: white;\n border-radius: 8px;\n padding: 24px;\n max-width: 500px;\n width: 90%;\n max-height: 80vh;\n overflow-y: auto;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);\n position: relative;\n transform: scale(0.9);\n transition: transform 0.3s ease-in-out;\n}\n\n.journy-message-overlay.journy-message-visible .journy-message-popup {\n transform: scale(1);\n}\n\n.journy-message-popup.journy-message-info {\n border-top: 4px solid #3b82f6;\n}\n\n.journy-message-popup.journy-message-success {\n border-top: 4px solid #10b981;\n}\n\n.journy-message-popup.journy-message-warning {\n border-top: 4px solid #f59e0b;\n}\n\n.journy-message-popup.journy-message-error {\n border-top: 4px solid #ef4444;\n}\n\n.journy-message-popup.journy-message-viewed {\n border-top: 4px solid #6b7280;\n}\n\n.journy-message-close {\n position: absolute;\n top: 12px;\n right: 12px;\n background: none;\n border: none;\n font-size: 24px;\n line-height: 1;\n cursor: pointer;\n color: #6b7280;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background-color 0.2s, color 0.2s;\n}\n\n.journy-message-close:hover {\n background-color: #f3f4f6;\n color: #374151;\n}\n\n.journy-message-title {\n font-size: 20px;\n font-weight: 600;\n margin-bottom: 12px;\n color: #111827;\n}\n\n.journy-message-content {\n font-size: 16px;\n line-height: 1.6;\n color: #374151;\n margin-bottom: 16px;\n}\n\n.journy-message-content a {\n color: #3b82f6;\n text-decoration: underline;\n transition: color 0.2s;\n}\n\n.journy-message-content a:hover {\n color: #2563eb;\n}\n\n.journy-message-content p {\n margin: 0 0 12px 0;\n}\n\n.journy-message-content p:last-child {\n margin-bottom: 0;\n}\n\n.journy-message-content ul,\n.journy-message-content ol {\n margin: 12px 0;\n padding-left: 24px;\n}\n\n.journy-message-content li {\n margin-bottom: 8px;\n}\n\n/* Headings */\n.journy-message-content h1,\n.journy-message-content h2,\n.journy-message-content h3,\n.journy-message-content h4,\n.journy-message-content h5,\n.journy-message-content h6 {\n margin: 16px 0 12px 0;\n font-weight: 600;\n line-height: 1.3;\n color: #111827;\n}\n\n.journy-message-content h1 {\n font-size: 24px;\n}\n\n.journy-message-content h2 {\n font-size: 20px;\n}\n\n.journy-message-content h3 {\n font-size: 18px;\n}\n\n.journy-message-content h4 {\n font-size: 16px;\n}\n\n.journy-message-content h5,\n.journy-message-content h6 {\n font-size: 14px;\n}\n\n/* Code blocks */\n.journy-message-content code {\n background-color: #f3f4f6;\n color: #ef4444;\n padding: 2px 6px;\n border-radius: 4px;\n font-size: 0.9em;\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\n}\n\n.journy-message-content pre {\n background-color: #1f2937;\n color: #f9fafb;\n padding: 16px;\n border-radius: 8px;\n overflow-x: auto;\n margin: 12px 0;\n font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\n font-size: 14px;\n line-height: 1.5;\n}\n\n.journy-message-content pre code {\n background-color: transparent;\n color: inherit;\n padding: 0;\n border-radius: 0;\n font-size: inherit;\n}\n\n/* Text formatting */\n.journy-message-content u {\n text-decoration: underline;\n}\n\n.journy-message-content s,\n.journy-message-content strike,\n.journy-message-content del {\n text-decoration: line-through;\n}\n\n.journy-message-content strong {\n font-weight: 600;\n}\n\n.journy-message-content em {\n font-style: italic;\n}\n\n/* Blockquotes */\n.journy-message-content blockquote {\n border-left: 4px solid #e5e7eb;\n padding-left: 16px;\n margin: 12px 0;\n color: #6b7280;\n font-style: italic;\n}\n\n/* Tables */\n.journy-message-content table {\n width: 100%;\n border-collapse: collapse;\n margin: 12px 0;\n}\n\n.journy-message-content th,\n.journy-message-content td {\n border: 1px solid #e5e7eb;\n padding: 8px 12px;\n text-align: left;\n}\n\n.journy-message-content th {\n background-color: #f9fafb;\n font-weight: 600;\n}\n\n/* Horizontal rule */\n.journy-message-content hr {\n border: none;\n border-top: 1px solid #e5e7eb;\n margin: 16px 0;\n}\n\n.journy-message-actions {\n display: flex;\n gap: 12px;\n margin-top: 20px;\n flex-wrap: wrap;\n}\n\n.journy-message-action {\n padding: 10px 20px;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n border: none;\n transition: all 0.2s;\n}\n\n.journy-message-action-primary {\n background-color: #3b82f6;\n color: white;\n}\n\n.journy-message-action-primary:hover {\n background-color: #2563eb;\n}\n\n.journy-message-action-secondary {\n background-color: #e5e7eb;\n color: #374151;\n}\n\n.journy-message-action-secondary:hover {\n background-color: #d1d5db;\n}\n\n.journy-message-action-link {\n background: none;\n color: #3b82f6;\n text-decoration: underline;\n padding: 10px 0;\n}\n\n.journy-message-action-link:hover {\n color: #2563eb;\n}\n\n/* Settings Panel */\n.journy-settings-panel {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n width: 100%;\n background: white;\n z-index: 10;\n display: flex;\n flex-direction: column;\n transform: translateX(100%);\n transition: transform 0.3s ease;\n}\n\n.journy-settings-panel-open {\n transform: translateX(0);\n}\n\n.journy-settings-panel-closed {\n transform: translateX(100%);\n}\n\n.journy-settings-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: #f9fafb;\n border-bottom: 1px solid #e5e7eb;\n flex-shrink: 0;\n}\n\n.journy-settings-title {\n font-size: 14px;\n font-weight: 600;\n color: #111827;\n}\n\n.journy-settings-close {\n background: none;\n border: none;\n font-size: 18px;\n line-height: 1;\n cursor: pointer;\n color: #6b7280;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background-color 0.2s, color 0.2s;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n}\n\n.journy-settings-close:hover {\n background-color: #e5e7eb;\n color: #374151;\n}\n\n.journy-settings-body {\n padding: 16px;\n overflow-y: auto;\n flex: 1;\n}\n\n.journy-settings-item {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 0;\n border-bottom: 1px solid #f3f4f6;\n}\n\n.journy-settings-item:last-child {\n border-bottom: none;\n}\n\n.journy-settings-label {\n font-size: 13px;\n font-weight: 500;\n color: #374151;\n}\n\n.journy-settings-select {\n padding: 6px 10px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n font-size: 13px;\n color: #374151;\n background: white;\n cursor: pointer;\n outline: none;\n transition: border-color 0.2s;\n}\n\n.journy-settings-select:focus {\n border-color: #3b82f6;\n}\n\n.journy-settings-toggle {\n position: relative;\n width: 40px;\n height: 22px;\n border-radius: 11px;\n border: none;\n background: #d1d5db;\n cursor: pointer;\n padding: 0;\n transition: background-color 0.2s;\n flex-shrink: 0;\n}\n\n.journy-settings-toggle-on {\n background: #3b82f6;\n}\n\n.journy-settings-toggle-knob {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: white;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n transition: transform 0.2s;\n}\n\n.journy-settings-toggle-on .journy-settings-toggle-knob {\n transform: translateX(18px);\n}\n\n.journy-settings-item-vertical {\n flex-direction: column;\n align-items: flex-start;\n gap: 6px;\n}\n\n.journy-settings-input {\n width: 100%;\n padding: 6px 10px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n font-size: 13px;\n color: #374151;\n background: white;\n outline: none;\n transition: border-color 0.2s;\n box-sizing: border-box;\n}\n\n.journy-settings-input:focus {\n border-color: #3b82f6;\n}\n\n.journy-settings-input::placeholder {\n color: #9ca3af;\n}\n\n.journy-settings-value {\n font-size: 13px;\n color: #6b7280;\n font-weight: 400;\n max-width: 60%;\n text-align: right;\n word-break: break-all;\n}\n\n.journy-message-widget-empty {\n display: flex;\n align-items: center;\n justify-content: center;\n color: #9ca3af;\n font-size: 14px;\n flex: 1;\n min-height: 80px;\n}\n\n.journy-settings-advanced-btn {\n background: none;\n border: none;\n font-size: 13px;\n font-weight: 500;\n color: #6b7280;\n cursor: pointer;\n padding: 0;\n transition: color 0.2s;\n}\n\n.journy-settings-advanced-btn:hover {\n color: #374151;\n}\n\n.journy-message-widget-settings-btn {\n background: none;\n border: none;\n font-size: 16px;\n line-height: 1;\n cursor: pointer;\n color: #6b7280;\n padding: 4px 8px;\n border-radius: 4px;\n transition: background-color 0.2s, color 0.2s;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n}\n\n.journy-message-widget-settings-btn:hover {\n background-color: #e5e7eb;\n color: #374151;\n}\n\n/* Responsive design */\n@media (max-width: 640px) {\n .journy-message-widget {\n min-width: calc(100vw - 32px);\n max-width: calc(100vw - 32px);\n left: 16px !important;\n right: 16px !important;\n }\n\n .journy-message-popup {\n width: 95%;\n padding: 20px;\n }\n\n .journy-message-title {\n font-size: 18px;\n }\n\n .journy-message-content {\n font-size: 14px;\n }\n\n .journy-message-actions {\n flex-direction: column;\n }\n\n .journy-message-action {\n width: 100%;\n }\n}\n","journy-messages-default"))}initializeUI(){const e=function(e){let t=document.getElementById(e);return t||(t=document.createElement("div"),t.id=e,document.body.appendChild(t)),t}(this.rootElementId);this.applyStyles(this.widgetSettings.styles),"undefined"!=typeof window&&window.React&&window.ReactDOM?this.renderUI(e):this.waitForReact(e)}waitForReact(e){const t=setInterval(()=>{"undefined"!=typeof window&&window.React&&window.ReactDOM&&(clearInterval(t),this.renderUI(e))},100);setTimeout(()=>{clearInterval(t)},1e4)}renderUI(e){try{const t=window.React,n=window.ReactDOM;if(!t||!n)throw new Error("React or ReactDOM not found in window");this.reactRoot&&this.reactRootContainer!==e&&(this.reactRoot=null,this.reactRootContainer=null);const s=Oe||Oe;if(!s)throw console.error("MessageWidget not found in module:",ze),new Error("MessageWidget not found in module");const o={store:this.store,onClose:()=>this.handleMessageClose(),onCloseWidget:()=>this.handleCloseWidget(),onLinkClick:e=>this.handleLinkClick(e),onToggleExpand:()=>this.handleToggleExpand(),onMessageReceived:e=>this.handleMessageReceived(e),onDismissMessage:e=>this.handleDismissMessage(e),onNextMessage:()=>this.handleNextMessage(),onPrevMessage:()=>this.handlePrevMessage(),onSettingsChange:e=>this.handleSettingsChange(e),configInfo:{entityType:this.config.entityType,userId:this.config.userId,accountId:this.config.accountId}},a=t.createElement(s,o);n.createRoot?(this.reactRoot||(e.innerHTML="",this.reactRoot=n.createRoot(e),this.reactRootContainer=e),this.reactRoot.render(a)):(e.innerHTML="",n.render(a,e))}catch(e){console.error("Failed to render UI:",e)}}handleSettingsChange(e){const t=this.widgetSettings;this.widgetSettings=e,d(Fe,e),this.config.pollingInterval=e.pollingInterval,this.config.apiEndpoint=e.apiEndpoint,e.pollingInterval!==t.pollingInterval&&this.startPolling(),e.displayMode!==t.displayMode&&this.store.setState({displayMode:e.displayMode}),JSON.stringify(e.styles)!==JSON.stringify(t.styles)&&this.applyStyles(e.styles),e.apiEndpoint!==t.apiEndpoint&&(this.apiClient=new i(this.config))}handleToggleExpand(){this.store.setState({isCollapsed:!this.uiState.isCollapsed})}displayNextMessage(){const e=this.messageQueue.getNextMessage();e&&e.id!==this.uiState.currentMessage?.id?this.showMessage(e):this.store.setState({currentMessage:e||null,messages:this.messageQueue.getAllMessages()})}showMessage(e){this.store.setState({currentMessage:e,messages:this.messageQueue.getAllMessages()}),this.eventTracker.track(r.MessageOpened,{messageId:e.id})}handleMessageClose(){const{currentMessage:e}=this.uiState;e&&(this.eventTracker.track(r.MessageClosed,{messageId:e.id}),this.markAsRead([e.id]),this.store.setState({currentMessage:null,isCollapsed:!1}),setTimeout(()=>{this.displayNextMessage()},300))}handleCloseWidget(){this.store.setState({widgetVisible:!1})}async handleDismissMessage(e){this.eventTracker.track(r.MessageClosed,{messageId:e}),await this.markAsRead([e]),this.uiState.currentMessage?.id===e&&(this.store.setState({currentMessage:null}),this.displayNextMessage())}navigateMessage(e){const t=this.messageQueue.getAllMessages(),n=t.findIndex(e=>e.id===this.uiState.currentMessage?.id)+e;if(n<0||n>=t.length)return;const s=t[n];s.received?this.store.setState({currentMessage:s}):(this.store.setState({currentMessage:s}),this.handleMessageReceived([s.id]))}handleNextMessage(){this.navigateMessage(1)}handlePrevMessage(){this.navigateMessage(-1)}handleLinkClick(e){const{currentMessage:t}=this.uiState;t&&this.eventTracker.track(r.MessageLinkClicked,{messageId:t.id,linkUrl:e})}async markAsRead(e){const t=Array.isArray(e)?e:[e];await this.handleMessageReceived(t),this.messageQueue.removeMessage(t),this.store.setState({messages:this.messageQueue.getAllMessages()})}async handleMessageReceived(e){const t=Array.isArray(e)?e:[e];if(this.messageQueue.getAlreadyReceivedIds(t).length===t.length)return;this.messageQueue.markMessageAsReceived(t);const{currentMessage:n}=this.uiState,s={messages:this.messageQueue.getAllMessages()};n&&t.includes(n.id)&&(s.currentMessage={...n,received:!0}),this.store.setState(s),await this.apiClient.markAsRead(t),await this.analyticsClient.sendAnalyticsEvents(t)}trackLinkClick(e,t){this.eventTracker.track(r.MessageLinkClicked,{messageId:e,linkUrl:t})}trackMessageClosed(e){this.eventTracker.track(r.MessageClosed,{messageId:e})}trackMessageOpened(e){this.eventTracker.track(r.MessageOpened,{messageId:e})}destroy(){if(null!==this.pollingInterval&&(clearInterval(this.pollingInterval),this.pollingInterval=null),this.unsubscribePersistence&&(this.unsubscribePersistence(),this.unsubscribePersistence=null),this.eventTracker.destroy(),this.store.destroy(),this.reactRoot){try{this.reactRoot.unmount()}catch(e){console.error("Error unmounting React root:",e)}this.reactRoot=null,this.reactRootContainer=null}!function(e){const t=document.getElementById(e);t&&t.remove()}(this.rootElementId),y()}}"undefined"!=typeof window&&(window.JournyMessages=Be),e.JournyMessaging=Be,e.default=Be,Object.defineProperty(e,"__esModule",{value:!0})});
|
|
4
|
+
//# sourceMappingURL=journy-messages.min.js.map
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export declare enum SDKEventType {
|
|
2
|
+
MessageReceived = "In-App Message Received",
|
|
3
|
+
MessageOpened = "In-App Message Opened",
|
|
4
|
+
MessageClosed = "In-App Message Closed",
|
|
5
|
+
MessageLinkClicked = "In-App Message Link Clicked"
|
|
6
|
+
}
|
|
7
|
+
export type MessageStatus = 'pending' | 'sent' | 'read' | 'expired';
|
|
8
|
+
export type MessageScope = 'account' | 'user';
|
|
9
|
+
export type AppDisplayMode = 'widget' | 'list';
|
|
10
|
+
export interface Message {
|
|
11
|
+
id: string;
|
|
12
|
+
appId: string;
|
|
13
|
+
accountId?: string;
|
|
14
|
+
userId?: string;
|
|
15
|
+
status: MessageStatus;
|
|
16
|
+
scope: MessageScope;
|
|
17
|
+
message: string;
|
|
18
|
+
received: boolean;
|
|
19
|
+
expired: boolean;
|
|
20
|
+
createdAt: string;
|
|
21
|
+
expiredAt?: string;
|
|
22
|
+
}
|
|
23
|
+
export type StylesConfig = 'default' | 'none' | {
|
|
24
|
+
url: string;
|
|
25
|
+
} | {
|
|
26
|
+
css: string;
|
|
27
|
+
};
|
|
28
|
+
export interface WidgetSettings {
|
|
29
|
+
pollingInterval: number;
|
|
30
|
+
showReadMessages: boolean;
|
|
31
|
+
autoExpandOnNew: boolean;
|
|
32
|
+
displayMode: AppDisplayMode;
|
|
33
|
+
apiEndpoint: string;
|
|
34
|
+
styles: StylesConfig;
|
|
35
|
+
}
|
|
36
|
+
export declare const DEFAULT_WIDGET_SETTINGS: WidgetSettings;
|
|
37
|
+
export interface ApiResponse<T> {
|
|
38
|
+
data: T;
|
|
39
|
+
success: boolean;
|
|
40
|
+
error?: string;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=types.d.ts.map
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@journyio/messaging-sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Journy In-App Messaging Library",
|
|
5
|
+
"main": "dist/journy-messages.js",
|
|
6
|
+
"module": "dist/journy-messages.esm.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"peerDependencies": {
|
|
9
|
+
"react": ">=16.8.0",
|
|
10
|
+
"react-dom": ">=16.8.0"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@segment/analytics-next": "^1.81.1",
|
|
14
|
+
"dompurify": "^3.0.0"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"journy",
|
|
18
|
+
"messaging",
|
|
19
|
+
"in-app",
|
|
20
|
+
"notifications"
|
|
21
|
+
],
|
|
22
|
+
"author": "Journy",
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "https://github.com/journy-io/messaging-sdk.git"
|
|
27
|
+
}
|
|
28
|
+
}
|