posthog-js 1.347.2 → 1.348.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.
Files changed (74) hide show
  1. package/dist/array.full.es5.js +1 -1
  2. package/dist/array.full.js +1 -1
  3. package/dist/array.full.no-external.js +1 -1
  4. package/dist/array.js +1 -1
  5. package/dist/array.no-external.js +1 -1
  6. package/dist/conversations.js +1 -1
  7. package/dist/conversations.js.map +1 -1
  8. package/dist/customizations.full.js +1 -1
  9. package/dist/lazy-recorder.js +1 -1
  10. package/dist/main.js +1 -1
  11. package/dist/main.js.map +1 -1
  12. package/dist/module.d.ts +43 -1
  13. package/dist/module.full.d.ts +43 -1
  14. package/dist/module.full.js +1 -1
  15. package/dist/module.full.js.map +1 -1
  16. package/dist/module.full.no-external.d.ts +43 -1
  17. package/dist/module.full.no-external.js +1 -1
  18. package/dist/module.full.no-external.js.map +1 -1
  19. package/dist/module.js +1 -1
  20. package/dist/module.js.map +1 -1
  21. package/dist/module.no-external.d.ts +43 -1
  22. package/dist/module.no-external.js +1 -1
  23. package/dist/module.no-external.js.map +1 -1
  24. package/dist/posthog-recorder.js +1 -1
  25. package/dist/product-tours-preview.d.ts +2 -0
  26. package/dist/product-tours-preview.js +1 -1
  27. package/dist/product-tours-preview.js.map +1 -1
  28. package/dist/product-tours.js +1 -1
  29. package/dist/product-tours.js.map +1 -1
  30. package/dist/src/extensions/conversations/external/components/ConversationsWidget.d.ts +43 -2
  31. package/dist/src/extensions/conversations/external/components/TicketListItem.d.ts +13 -0
  32. package/dist/src/extensions/conversations/external/components/TicketListView.d.ts +15 -0
  33. package/dist/src/extensions/conversations/external/components/styles.d.ts +184 -0
  34. package/dist/src/extensions/conversations/external/components/utils.d.ts +8 -0
  35. package/dist/src/extensions/conversations/external/index.d.ts +39 -1
  36. package/dist/src/extensions/product-tours/product-tours.d.ts +2 -0
  37. package/dist/src/posthog-product-tours-types.d.ts +42 -0
  38. package/dist/surveys-preview.d.ts +2 -0
  39. package/lib/package.json +1 -1
  40. package/lib/src/extensions/conversations/external/components/ConversationsWidget.d.ts +43 -2
  41. package/lib/src/extensions/conversations/external/components/ConversationsWidget.js +96 -28
  42. package/lib/src/extensions/conversations/external/components/ConversationsWidget.js.map +1 -1
  43. package/lib/src/extensions/conversations/external/components/TicketListItem.d.ts +13 -0
  44. package/lib/src/extensions/conversations/external/components/TicketListItem.js +47 -0
  45. package/lib/src/extensions/conversations/external/components/TicketListItem.js.map +1 -0
  46. package/lib/src/extensions/conversations/external/components/TicketListView.d.ts +15 -0
  47. package/lib/src/extensions/conversations/external/components/TicketListView.js +75 -0
  48. package/lib/src/extensions/conversations/external/components/TicketListView.js.map +1 -0
  49. package/lib/src/extensions/conversations/external/components/styles.d.ts +184 -0
  50. package/lib/src/extensions/conversations/external/components/styles.js +189 -0
  51. package/lib/src/extensions/conversations/external/components/styles.js.map +1 -1
  52. package/lib/src/extensions/conversations/external/components/utils.d.ts +8 -0
  53. package/lib/src/extensions/conversations/external/components/utils.js +49 -0
  54. package/lib/src/extensions/conversations/external/components/utils.js.map +1 -0
  55. package/lib/src/extensions/conversations/external/index.d.ts +39 -1
  56. package/lib/src/extensions/conversations/external/index.js +253 -31
  57. package/lib/src/extensions/conversations/external/index.js.map +1 -1
  58. package/lib/src/extensions/product-tours/components/ProductTourSurveyStepInner.js +1 -1
  59. package/lib/src/extensions/product-tours/components/ProductTourSurveyStepInner.js.map +1 -1
  60. package/lib/src/extensions/product-tours/product-tours.d.ts +2 -0
  61. package/lib/src/extensions/product-tours/product-tours.js +78 -71
  62. package/lib/src/extensions/product-tours/product-tours.js.map +1 -1
  63. package/lib/src/posthog-product-tours-types.d.ts +42 -0
  64. package/lib/src/posthog-product-tours-types.js +43 -1
  65. package/lib/src/posthog-product-tours-types.js.map +1 -1
  66. package/lib/src/utils/product-tour-event-receiver.js +2 -1
  67. package/lib/src/utils/product-tour-event-receiver.js.map +1 -1
  68. package/lib/tsconfig.tsbuildinfo +1 -1
  69. package/package.json +3 -3
  70. package/react/dist/esm/index.js +25 -1
  71. package/react/dist/esm/index.js.map +1 -1
  72. package/react/dist/types/index.d.ts +4 -2
  73. package/react/dist/umd/index.js +25 -0
  74. package/react/dist/umd/index.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"conversations.js","sources":["../../../node_modules/.pnpm/preact@10.28.2/node_modules/preact/dist/preact.module.js","../../core/dist/utils/type-utils.mjs","../src/utils/globals.ts","../src/utils/logger.ts","../src/uuidv7.ts","../src/extensions/conversations/external/persistence.ts","../src/extensions/conversations/external/components/styles.ts","../src/constants.ts","../src/extensions/conversations/external/components/OpenChatButton.tsx","../../../node_modules/.pnpm/preact@10.28.2/node_modules/preact/hooks/dist/hooks.module.js","../src/extensions/conversations/external/components/SendMessageButton.tsx","../src/extensions/conversations/external/components/CloseChatButton.tsx","../src/extensions/conversations/external/components/RichContent.tsx","../src/extensions/conversations/external/components/ConversationsWidget.tsx","../src/utils/index.ts","../src/utils/request-utils.ts","../src/extensions/conversations/external/index.tsx","../src/entrypoints/conversations.ts"],"sourcesContent":["var n,l,u,t,i,o,r,e,f,c,s,a,h,p={},v=[],y=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,d=Array.isArray;function w(n,l){for(var u in l)n[u]=l[u];return n}function g(n){n&&n.parentNode&&n.parentNode.removeChild(n)}function _(l,u,t){var i,o,r,e={};for(r in u)\"key\"==r?i=u[r]:\"ref\"==r?o=u[r]:e[r]=u[r];if(arguments.length>2&&(e.children=arguments.length>3?n.call(arguments,2):t),\"function\"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===e[r]&&(e[r]=l.defaultProps[r]);return m(l,e,i,o,null)}function m(n,t,i,o,r){var e={type:n,props:t,key:i,ref:o,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:null==r?++u:r,__i:-1,__u:0};return null==r&&null!=l.vnode&&l.vnode(e),e}function b(){return{current:null}}function k(n){return n.children}function x(n,l){this.props=n,this.context=l}function S(n,l){if(null==l)return n.__?S(n.__,n.__i+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?S(n):null}function C(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return C(n)}}function M(n){(!n.__d&&(n.__d=!0)&&i.push(n)&&!$.__r++||o!=l.debounceRendering)&&((o=l.debounceRendering)||r)($)}function $(){for(var n,u,t,o,r,f,c,s=1;i.length;)i.length>s&&i.sort(e),n=i.shift(),s=i.length,n.__d&&(t=void 0,o=void 0,r=(o=(u=n).__v).__e,f=[],c=[],u.__P&&((t=w({},o)).__v=o.__v+1,l.vnode&&l.vnode(t),O(u.__P,t,o,u.__n,u.__P.namespaceURI,32&o.__u?[r]:null,f,null==r?S(o):r,!!(32&o.__u),c),t.__v=o.__v,t.__.__k[t.__i]=t,N(f,t,c),o.__e=o.__=null,t.__e!=r&&C(t)));$.__r=0}function I(n,l,u,t,i,o,r,e,f,c,s){var a,h,y,d,w,g,_,m=t&&t.__k||v,b=l.length;for(f=P(u,l,m,f,b),a=0;a<b;a++)null!=(y=u.__k[a])&&(h=-1==y.__i?p:m[y.__i]||p,y.__i=a,g=O(n,y,h,i,o,r,e,f,c,s),d=y.__e,y.ref&&h.ref!=y.ref&&(h.ref&&B(h.ref,null,y),s.push(y.ref,y.__c||d,y)),null==w&&null!=d&&(w=d),(_=!!(4&y.__u))||h.__k===y.__k?f=A(y,f,n,_):\"function\"==typeof y.type&&void 0!==g?f=g:d&&(f=d.nextSibling),y.__u&=-7);return u.__e=w,f}function P(n,l,u,t,i){var o,r,e,f,c,s=u.length,a=s,h=0;for(n.__k=new Array(i),o=0;o<i;o++)null!=(r=l[o])&&\"boolean\"!=typeof r&&\"function\"!=typeof r?(\"string\"==typeof r||\"number\"==typeof r||\"bigint\"==typeof r||r.constructor==String?r=n.__k[o]=m(null,r,null,null,null):d(r)?r=n.__k[o]=m(k,{children:r},null,null,null):void 0===r.constructor&&r.__b>0?r=n.__k[o]=m(r.type,r.props,r.key,r.ref?r.ref:null,r.__v):n.__k[o]=r,f=o+h,r.__=n,r.__b=n.__b+1,e=null,-1!=(c=r.__i=L(r,u,f,a))&&(a--,(e=u[c])&&(e.__u|=2)),null==e||null==e.__v?(-1==c&&(i>s?h--:i<s&&h++),\"function\"!=typeof r.type&&(r.__u|=4)):c!=f&&(c==f-1?h--:c==f+1?h++:(c>f?h--:h++,r.__u|=4))):n.__k[o]=null;if(a)for(o=0;o<s;o++)null!=(e=u[o])&&0==(2&e.__u)&&(e.__e==t&&(t=S(e)),D(e,e));return t}function A(n,l,u,t){var i,o;if(\"function\"==typeof n.type){for(i=n.__k,o=0;i&&o<i.length;o++)i[o]&&(i[o].__=n,l=A(i[o],l,u,t));return l}n.__e!=l&&(t&&(l&&n.type&&!l.parentNode&&(l=S(n)),u.insertBefore(n.__e,l||null)),l=n.__e);do{l=l&&l.nextSibling}while(null!=l&&8==l.nodeType);return l}function H(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(d(n)?n.some(function(n){H(n,l)}):l.push(n)),l}function L(n,l,u,t){var i,o,r,e=n.key,f=n.type,c=l[u],s=null!=c&&0==(2&c.__u);if(null===c&&null==e||s&&e==c.key&&f==c.type)return u;if(t>(s?1:0))for(i=u-1,o=u+1;i>=0||o<l.length;)if(null!=(c=l[r=i>=0?i--:o++])&&0==(2&c.__u)&&e==c.key&&f==c.type)return r;return-1}function T(n,l,u){\"-\"==l[0]?n.setProperty(l,null==u?\"\":u):n[l]=null==u?\"\":\"number\"!=typeof u||y.test(l)?u:u+\"px\"}function j(n,l,u,t,i){var o,r;n:if(\"style\"==l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof t&&(n.style.cssText=t=\"\"),t)for(l in t)u&&l in u||T(n.style,l,\"\");if(u)for(l in u)t&&u[l]==t[l]||T(n.style,l,u[l])}else if(\"o\"==l[0]&&\"n\"==l[1])o=l!=(l=l.replace(f,\"$1\")),r=l.toLowerCase(),l=r in n||\"onFocusOut\"==l||\"onFocusIn\"==l?r.slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?t?u.u=t.u:(u.u=c,n.addEventListener(l,o?a:s,o)):n.removeEventListener(l,o?a:s,o);else{if(\"http://www.w3.org/2000/svg\"==i)l=l.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"width\"!=l&&\"height\"!=l&&\"href\"!=l&&\"list\"!=l&&\"form\"!=l&&\"tabIndex\"!=l&&\"download\"!=l&&\"rowSpan\"!=l&&\"colSpan\"!=l&&\"role\"!=l&&\"popover\"!=l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null==u||!1===u&&\"-\"!=l[4]?n.removeAttribute(l):n.setAttribute(l,\"popover\"==l&&1==u?\"\":u))}}function F(n){return function(u){if(this.l){var t=this.l[u.type+n];if(null==u.t)u.t=c++;else if(u.t<t.u)return;return t(l.event?l.event(u):u)}}}function O(n,u,t,i,o,r,e,f,c,s){var a,h,p,v,y,_,m,b,S,C,M,$,P,A,H,L,T,j=u.type;if(void 0!==u.constructor)return null;128&t.__u&&(c=!!(32&t.__u),r=[f=u.__e=t.__e]),(a=l.__b)&&a(u);n:if(\"function\"==typeof j)try{if(b=u.props,S=\"prototype\"in j&&j.prototype.render,C=(a=j.contextType)&&i[a.__c],M=a?C?C.props.value:a.__:i,t.__c?m=(h=u.__c=t.__c).__=h.__E:(S?u.__c=h=new j(b,M):(u.__c=h=new x(b,M),h.constructor=j,h.render=E),C&&C.sub(h),h.state||(h.state={}),h.__n=i,p=h.__d=!0,h.__h=[],h._sb=[]),S&&null==h.__s&&(h.__s=h.state),S&&null!=j.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=w({},h.__s)),w(h.__s,j.getDerivedStateFromProps(b,h.__s))),v=h.props,y=h.state,h.__v=u,p)S&&null==j.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),S&&null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else{if(S&&null==j.getDerivedStateFromProps&&b!==v&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(b,M),u.__v==t.__v||!h.__e&&null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(b,h.__s,M)){for(u.__v!=t.__v&&(h.props=b,h.state=h.__s,h.__d=!1),u.__e=t.__e,u.__k=t.__k,u.__k.some(function(n){n&&(n.__=u)}),$=0;$<h._sb.length;$++)h.__h.push(h._sb[$]);h._sb=[],h.__h.length&&e.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(b,h.__s,M),S&&null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(v,y,_)})}if(h.context=M,h.props=b,h.__P=n,h.__e=!1,P=l.__r,A=0,S){for(h.state=h.__s,h.__d=!1,P&&P(u),a=h.render(h.props,h.state,h.context),H=0;H<h._sb.length;H++)h.__h.push(h._sb[H]);h._sb=[]}else do{h.__d=!1,P&&P(u),a=h.render(h.props,h.state,h.context),h.state=h.__s}while(h.__d&&++A<25);h.state=h.__s,null!=h.getChildContext&&(i=w(w({},i),h.getChildContext())),S&&!p&&null!=h.getSnapshotBeforeUpdate&&(_=h.getSnapshotBeforeUpdate(v,y)),L=a,null!=a&&a.type===k&&null==a.key&&(L=V(a.props.children)),f=I(n,d(L)?L:[L],u,t,i,o,r,e,f,c,s),h.base=u.__e,u.__u&=-161,h.__h.length&&e.push(h),m&&(h.__E=h.__=null)}catch(n){if(u.__v=null,c||null!=r)if(n.then){for(u.__u|=c?160:128;f&&8==f.nodeType&&f.nextSibling;)f=f.nextSibling;r[r.indexOf(f)]=null,u.__e=f}else{for(T=r.length;T--;)g(r[T]);z(u)}else u.__e=t.__e,u.__k=t.__k,n.then||z(u);l.__e(n,u,t)}else null==r&&u.__v==t.__v?(u.__k=t.__k,u.__e=t.__e):f=u.__e=q(t.__e,u,t,i,o,r,e,c,s);return(a=l.diffed)&&a(u),128&u.__u?void 0:f}function z(n){n&&n.__c&&(n.__c.__e=!0),n&&n.__k&&n.__k.forEach(z)}function N(n,u,t){for(var i=0;i<t.length;i++)B(t[i],t[++i],t[++i]);l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u)})}catch(n){l.__e(n,u.__v)}})}function V(n){return\"object\"!=typeof n||null==n||n.__b&&n.__b>0?n:d(n)?n.map(V):w({},n)}function q(u,t,i,o,r,e,f,c,s){var a,h,v,y,w,_,m,b=i.props||p,k=t.props,x=t.type;if(\"svg\"==x?r=\"http://www.w3.org/2000/svg\":\"math\"==x?r=\"http://www.w3.org/1998/Math/MathML\":r||(r=\"http://www.w3.org/1999/xhtml\"),null!=e)for(a=0;a<e.length;a++)if((w=e[a])&&\"setAttribute\"in w==!!x&&(x?w.localName==x:3==w.nodeType)){u=w,e[a]=null;break}if(null==u){if(null==x)return document.createTextNode(k);u=document.createElementNS(r,x,k.is&&k),c&&(l.__m&&l.__m(t,e),c=!1),e=null}if(null==x)b===k||c&&u.data==k||(u.data=k);else{if(e=e&&n.call(u.childNodes),!c&&null!=e)for(b={},a=0;a<u.attributes.length;a++)b[(w=u.attributes[a]).name]=w.value;for(a in b)if(w=b[a],\"children\"==a);else if(\"dangerouslySetInnerHTML\"==a)v=w;else if(!(a in k)){if(\"value\"==a&&\"defaultValue\"in k||\"checked\"==a&&\"defaultChecked\"in k)continue;j(u,a,null,w,r)}for(a in k)w=k[a],\"children\"==a?y=w:\"dangerouslySetInnerHTML\"==a?h=w:\"value\"==a?_=w:\"checked\"==a?m=w:c&&\"function\"!=typeof w||b[a]===w||j(u,a,w,b[a],r);if(h)c||v&&(h.__html==v.__html||h.__html==u.innerHTML)||(u.innerHTML=h.__html),t.__k=[];else if(v&&(u.innerHTML=\"\"),I(\"template\"==t.type?u.content:u,d(y)?y:[y],t,i,o,\"foreignObject\"==x?\"http://www.w3.org/1999/xhtml\":r,e,f,e?e[0]:i.__k&&S(i,0),c,s),null!=e)for(a=e.length;a--;)g(e[a]);c||(a=\"value\",\"progress\"==x&&null==_?u.removeAttribute(\"value\"):null!=_&&(_!==u[a]||\"progress\"==x&&!_||\"option\"==x&&_!=b[a])&&j(u,a,_,b[a],r),a=\"checked\",null!=m&&m!=u[a]&&j(u,a,m,b[a],r))}return u}function B(n,u,t){try{if(\"function\"==typeof n){var i=\"function\"==typeof n.__u;i&&n.__u(),i&&null==u||(n.__u=n(u))}else n.current=u}catch(n){l.__e(n,t)}}function D(n,u,t){var i,o;if(l.unmount&&l.unmount(n),(i=n.ref)&&(i.current&&i.current!=n.__e||B(i,null,u)),null!=(i=n.__c)){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(n){l.__e(n,u)}i.base=i.__P=null}if(i=n.__k)for(o=0;o<i.length;o++)i[o]&&D(i[o],u,t||\"function\"!=typeof n.type);t||g(n.__e),n.__c=n.__=n.__e=void 0}function E(n,l,u){return this.constructor(n,u)}function G(u,t,i){var o,r,e,f;t==document&&(t=document.documentElement),l.__&&l.__(u,t),r=(o=\"function\"==typeof i)?null:i&&i.__k||t.__k,e=[],f=[],O(t,u=(!o&&i||t).__k=_(k,null,[u]),r||p,p,t.namespaceURI,!o&&i?[i]:r?null:t.firstChild?n.call(t.childNodes):null,e,!o&&i?i:r?r.__e:t.firstChild,o,f),N(e,u,f)}function J(n,l){G(n,l,J)}function K(l,u,t){var i,o,r,e,f=w({},l.props);for(r in l.type&&l.type.defaultProps&&(e=l.type.defaultProps),u)\"key\"==r?i=u[r]:\"ref\"==r?o=u[r]:f[r]=void 0===u[r]&&null!=e?e[r]:u[r];return arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),m(l.type,f,i||l.key,o||l.ref,null)}function Q(n){function l(n){var u,t;return this.getChildContext||(u=new Set,(t={})[l.__c]=this,this.getChildContext=function(){return t},this.componentWillUnmount=function(){u=null},this.shouldComponentUpdate=function(n){this.props.value!=n.value&&u.forEach(function(n){n.__e=!0,M(n)})},this.sub=function(n){u.add(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u&&u.delete(n),l&&l.call(n)}}),n.children}return l.__c=\"__cC\"+h++,l.__=n,l.Provider=l.__l=(l.Consumer=function(n,l){return n.children(l)}).contextType=l,l}n=v.slice,l={__e:function(n,l,u,t){for(var i,o,r;l=l.__;)if((i=l.__c)&&!i.__)try{if((o=i.constructor)&&null!=o.getDerivedStateFromError&&(i.setState(o.getDerivedStateFromError(n)),r=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(n,t||{}),r=i.__d),r)return i.__E=i}catch(l){n=l}throw n}},u=0,t=function(n){return null!=n&&void 0===n.constructor},x.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!=this.state?this.__s:this.__s=w({},this.state),\"function\"==typeof n&&(n=n(w({},u),this.props)),n&&w(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),M(this))},x.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),M(this))},x.prototype.render=k,i=[],r=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,e=function(n,l){return n.__v.__b-l.__v.__b},$.__r=0,f=/(PointerCapture)$|Capture$/i,c=0,s=F(!1),a=F(!0),h=0;export{x as Component,k as Fragment,K as cloneElement,Q as createContext,_ as createElement,b as createRef,_ as h,J as hydrate,t as isValidElement,l as options,G as render,H as toChildArray};\n//# sourceMappingURL=preact.module.js.map\n","import { knownUnsafeEditableEvent } from \"../types.mjs\";\nimport { includes } from \"./string-utils.mjs\";\nconst nativeIsArray = Array.isArray;\nconst ObjProto = Object.prototype;\nconst type_utils_hasOwnProperty = ObjProto.hasOwnProperty;\nconst type_utils_toString = ObjProto.toString;\nconst isArray = nativeIsArray || function(obj) {\n return '[object Array]' === type_utils_toString.call(obj);\n};\nconst isFunction = (x)=>'function' == typeof x;\nconst isNativeFunction = (x)=>isFunction(x) && -1 !== x.toString().indexOf('[native code]');\nconst isObject = (x)=>x === Object(x) && !isArray(x);\nconst isEmptyObject = (x)=>{\n if (isObject(x)) {\n for(const key in x)if (type_utils_hasOwnProperty.call(x, key)) return false;\n return true;\n }\n return false;\n};\nconst isUndefined = (x)=>void 0 === x;\nconst isString = (x)=>'[object String]' == type_utils_toString.call(x);\nconst isEmptyString = (x)=>isString(x) && 0 === x.trim().length;\nconst isNull = (x)=>null === x;\nconst isNullish = (x)=>isUndefined(x) || isNull(x);\nconst isNumber = (x)=>'[object Number]' == type_utils_toString.call(x) && x === x;\nconst isPositiveNumber = (value)=>isNumber(value) && value > 0;\nconst isBoolean = (x)=>'[object Boolean]' === type_utils_toString.call(x);\nconst isFormData = (x)=>x instanceof FormData;\nconst isFile = (x)=>x instanceof File;\nconst isPlainError = (x)=>x instanceof Error;\nconst isKnownUnsafeEditableEvent = (x)=>includes(knownUnsafeEditableEvent, x);\nfunction isPrimitive(value) {\n return null === value || 'object' != typeof value;\n}\nfunction isBuiltin(candidate, className) {\n return Object.prototype.toString.call(candidate) === `[object ${className}]`;\n}\nfunction isError(candidate) {\n switch(Object.prototype.toString.call(candidate)){\n case '[object Error]':\n case '[object Exception]':\n case '[object DOMException]':\n case '[object DOMError]':\n case '[object WebAssembly.Exception]':\n return true;\n default:\n return isInstanceOf(candidate, Error);\n }\n}\nfunction isErrorEvent(event) {\n return isBuiltin(event, 'ErrorEvent');\n}\nfunction isEvent(candidate) {\n return !isUndefined(Event) && isInstanceOf(candidate, Event);\n}\nfunction isPlainObject(candidate) {\n return isBuiltin(candidate, 'Object');\n}\nfunction isInstanceOf(candidate, base) {\n try {\n return candidate instanceof base;\n } catch {\n return false;\n }\n}\nconst yesLikeValues = [\n true,\n 'true',\n 1,\n '1',\n 'yes'\n];\nconst isYesLike = (val)=>includes(yesLikeValues, val);\nconst noLikeValues = [\n false,\n 'false',\n 0,\n '0',\n 'no'\n];\nconst isNoLike = (val)=>includes(noLikeValues, val);\nexport { type_utils_hasOwnProperty as hasOwnProperty, isArray, isBoolean, isBuiltin, isEmptyObject, isEmptyString, isError, isErrorEvent, isEvent, isFile, isFormData, isFunction, isKnownUnsafeEditableEvent, isNativeFunction, isNoLike, isNull, isNullish, isNumber, isObject, isPlainError, isPlainObject, isPositiveNumber, isPrimitive, isString, isUndefined, isYesLike, noLikeValues, yesLikeValues };\n","import type { PostHog } from '../posthog-core'\nimport { SessionIdManager } from '../sessionid'\nimport {\n DeadClicksAutoCaptureConfig,\n ExternalIntegrationKind,\n Properties,\n RemoteConfig,\n SiteAppLoader,\n SessionStartReason,\n} from '../types'\nimport type {\n ConversationsRemoteConfig,\n GetMessagesResponse,\n GetTicketsOptions,\n GetTicketsResponse,\n MarkAsReadResponse,\n SendMessageResponse,\n UserProvidedTraits,\n} from '../posthog-conversations-types'\n// only importing types here, so won't affect the bundle\n// eslint-disable-next-line posthog-js/no-external-replay-imports\nimport type { SessionRecordingStatus, TriggerType } from '../extensions/replay/external/triggerMatching'\nimport { eventWithTime } from '../extensions/replay/types/rrweb-types'\nimport { ErrorTracking } from '@posthog/core'\n\n/*\n * Global helpers to protect access to browser globals in a way that is safer for different targets\n * like DOM, SSR, Web workers etc.\n *\n * NOTE: Typically we want the \"window\" but globalThis works for both the typical browser context as\n * well as other contexts such as the web worker context. Window is still exported for any bits that explicitly require it.\n * If in doubt - export the global you need from this file and use that as an optional value. This way the code path is forced\n * to handle the case where the global is not available.\n */\n\n// eslint-disable-next-line no-restricted-globals\nconst win: (Window & typeof globalThis) | undefined = typeof window !== 'undefined' ? window : undefined\n\nexport type AssignableWindow = Window &\n typeof globalThis & {\n /*\n * Main PostHog instance\n */\n posthog: any\n\n /*\n * This is our contract between (potentially) lazily loaded extensions and the SDK\n */\n __PosthogExtensions__?: PostHogExtensions\n\n /**\n * When loading remote config, we assign it to this global configuration\n * for ease of sharing it with the rest of the SDK\n */\n _POSTHOG_REMOTE_CONFIG?: Record<\n string,\n {\n config: RemoteConfig\n siteApps: SiteAppLoader[]\n }\n >\n\n /**\n * If this is set on the window, our logger will log to the console\n * for ease of debugging. Used for testing purposes only.\n *\n * @see {Config.DEBUG} from config.ts\n */\n POSTHOG_DEBUG: any\n\n // Exposed by the browser\n doNotTrack: any\n\n // See entrypoints/customizations.full.ts\n posthogCustomizations: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/exception-autocapture.ts\n *\n * @deprecated use `__PosthogExtensions__.errorWrappingFunctions` instead\n */\n posthogErrorWrappingFunctions: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.rrweb` instead\n */\n rrweb: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.rrwebConsoleRecord` instead\n */\n rrwebConsoleRecord: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.getRecordNetworkPlugin` instead\n */\n getRecordNetworkPlugin: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/web-vitals.ts\n *\n * @deprecated use `__PosthogExtensions__.postHogWebVitalsCallbacks` instead\n */\n postHogWebVitalsCallbacks: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/tracing-headers.ts\n *\n * @deprecated use `__PosthogExtensions__.postHogTracingHeadersPatchFns` instead\n */\n postHogTracingHeadersPatchFns: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/surveys.ts\n *\n * @deprecated use `__PosthogExtensions__.generateSurveys` instead\n */\n extendPostHogWithSurveys: any\n\n /*\n * These are used to handle our toolbar state.\n * @see {Toolbar} from extensions/toolbar.ts\n */\n ph_load_toolbar: any\n ph_load_editor: any\n ph_toolbar_state: any\n } & Record<`__$$ph_site_app_${string}`, any>\n\n/**\n * This is our contract between (potentially) lazily loaded extensions and the SDK\n * changes to this interface can be breaking changes for users of the SDK\n */\n\nexport type ExternalExtensionKind = 'intercom-integration' | 'crisp-chat-integration'\n\nexport type PostHogExtensionKind =\n | 'toolbar'\n | 'exception-autocapture'\n | 'web-vitals'\n | 'web-vitals-with-attribution'\n | 'recorder'\n | 'lazy-recorder'\n | 'tracing-headers'\n | 'surveys'\n | 'logs'\n | 'conversations'\n | 'product-tours'\n | 'dead-clicks-autocapture'\n | 'remote-config'\n | ExternalExtensionKind\n\nexport interface LazyLoadedSessionRecordingInterface {\n start: (startReason?: SessionStartReason) => void\n stop: () => void\n sessionId: string\n status: SessionRecordingStatus\n onRRwebEmit: (rawEvent: eventWithTime) => void\n log: (message: string, level: 'log' | 'warn' | 'error') => void\n sdkDebugProperties: Properties\n overrideLinkedFlag: () => void\n overrideSampling: () => void\n overrideTrigger: (triggerType: TriggerType) => void\n isStarted: boolean\n tryAddCustomEvent(tag: string, payload: any): boolean\n}\n\nexport interface LazyLoadedDeadClicksAutocaptureInterface {\n start: (observerTarget: Node) => void\n stop: () => void\n}\n\nexport interface LazyLoadedConversationsInterface {\n // Widget control\n show: () => void\n hide: () => void\n isVisible: () => boolean\n\n // Lifecycle\n reset: () => void\n\n // API methods\n sendMessage: (message: string, userTraits?: UserProvidedTraits, newTicket?: boolean) => Promise<SendMessageResponse>\n getMessages: (ticketId?: string, after?: string) => Promise<GetMessagesResponse>\n markAsRead: (ticketId?: string) => Promise<MarkAsReadResponse>\n getTickets: (options?: GetTicketsOptions) => Promise<GetTicketsResponse>\n getCurrentTicketId: () => string | null\n getWidgetSessionId: () => string\n}\n\ninterface PostHogExtensions {\n loadExternalDependency?: (\n posthog: PostHog,\n kind: PostHogExtensionKind,\n callback: (error?: string | Event, event?: Event) => void\n ) => void\n\n loadSiteApp?: (posthog: PostHog, appUrl: string, callback: (error?: string | Event, event?: Event) => void) => void\n\n errorWrappingFunctions?: {\n wrapOnError: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n wrapUnhandledRejection: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n wrapConsoleError: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n }\n rrweb?: { record: any; version: string; wasMaxDepthReached?: () => boolean; resetMaxDepthState?: () => void }\n rrwebPlugins?: { getRecordConsolePlugin: any; getRecordNetworkPlugin?: any }\n generateSurveys?: (posthog: PostHog, isSurveysEnabled: boolean) => any | undefined\n generateProductTours?: (posthog: PostHog, isEnabled: boolean) => any | undefined\n logs?: {\n initializeLogs?: (posthog: PostHog) => any | undefined\n }\n postHogWebVitalsCallbacks?: {\n onLCP: (metric: any) => void\n onCLS: (metric: any) => void\n onFCP: (metric: any) => void\n onINP: (metric: any) => void\n }\n /**\n * @deprecated\n *\n * this was introduced briefly, it is now always a no-op and only kept for backwards compatibility\n */\n loadWebVitalsCallbacks?: (useAttribution?: boolean) => PostHogExtensions['postHogWebVitalsCallbacks']\n tracingHeadersPatchFns?: {\n _patchFetch: (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager) => () => void\n _patchXHR: (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager) => () => void\n }\n initDeadClicksAutocapture?: (\n ph: PostHog,\n config: DeadClicksAutoCaptureConfig\n ) => LazyLoadedDeadClicksAutocaptureInterface\n integrations?: {\n [K in ExternalIntegrationKind]?: { start: (posthog: PostHog) => void; stop: () => void }\n }\n initSessionRecording?: (ph: PostHog) => LazyLoadedSessionRecordingInterface\n initConversations?: (config: ConversationsRemoteConfig, posthog: PostHog) => LazyLoadedConversationsInterface\n}\n\nconst global: typeof globalThis | undefined = typeof globalThis !== 'undefined' ? globalThis : win\n\n// React Native polyfills for posthog-js compatibility\nif (typeof self === 'undefined') {\n ;(global as any).self = global\n}\nif (typeof File === 'undefined') {\n ;(global as any).File = function () {}\n}\n\nexport const ArrayProto = Array.prototype\nexport const nativeForEach = ArrayProto.forEach\nexport const nativeIndexOf = ArrayProto.indexOf\n\nexport const navigator = global?.navigator\nexport const document = global?.document\nexport const location = global?.location\nexport const fetch = global?.fetch\nexport const XMLHttpRequest =\n global?.XMLHttpRequest && 'withCredentials' in new global.XMLHttpRequest() ? global.XMLHttpRequest : undefined\nexport const AbortController = global?.AbortController\nexport const userAgent = navigator?.userAgent\nexport const assignableWindow: AssignableWindow = win ?? ({} as any)\n\nexport { win as window }\n","import Config from '../config'\nimport { isUndefined } from '@posthog/core'\nimport { assignableWindow, window } from './globals'\nimport type { Logger } from '@posthog/core'\n\ntype CreateLoggerOptions = {\n debugEnabled?: boolean\n}\n\ntype PosthogJsLogger = Omit<Logger, 'createLogger'> & {\n _log: (level: 'log' | 'warn' | 'error', ...args: any[]) => void\n uninitializedWarning: (methodName: string) => void\n createLogger: (prefix: string, options?: CreateLoggerOptions) => PosthogJsLogger\n}\n\nconst _createLogger = (prefix: string, { debugEnabled }: CreateLoggerOptions = {}): PosthogJsLogger => {\n const logger: PosthogJsLogger = {\n _log: (level: 'log' | 'warn' | 'error', ...args: any[]) => {\n if (\n window &&\n (Config.DEBUG || assignableWindow.POSTHOG_DEBUG || debugEnabled) &&\n !isUndefined(window.console) &&\n window.console\n ) {\n const consoleLog =\n '__rrweb_original__' in window.console[level]\n ? (window.console[level] as any)['__rrweb_original__']\n : window.console[level]\n\n // eslint-disable-next-line no-console\n consoleLog(prefix, ...args)\n }\n },\n\n info: (...args: any[]) => {\n logger._log('log', ...args)\n },\n\n warn: (...args: any[]) => {\n logger._log('warn', ...args)\n },\n\n error: (...args: any[]) => {\n logger._log('error', ...args)\n },\n\n critical: (...args: any[]) => {\n // Critical errors are always logged to the console\n // eslint-disable-next-line no-console\n console.error(prefix, ...args)\n },\n\n uninitializedWarning: (methodName: string) => {\n logger.error(`You must initialize PostHog before calling ${methodName}`)\n },\n\n createLogger: (additionalPrefix: string, options?: CreateLoggerOptions) =>\n _createLogger(`${prefix} ${additionalPrefix}`, options),\n }\n return logger\n}\n\nexport const logger = _createLogger('[PostHog.js]')\n\nexport const createLogger = logger.createLogger\n","/**\n * uuidv7: An experimental implementation of the proposed UUID Version 7\n *\n * @license Apache-2.0\n * @copyright 2021-2023 LiosK\n * @packageDocumentation\n *\n * from https://github.com/LiosK/uuidv7/blob/e501462ea3d23241de13192ceae726956f9b3b7d/src/index.ts\n */\n\n// polyfill for IE11\nimport { window } from './utils/globals'\n\nimport { isNumber, isUndefined } from '@posthog/core'\n\nif (!Math.trunc) {\n Math.trunc = function (v) {\n return v < 0 ? Math.ceil(v) : Math.floor(v)\n }\n}\n\n// polyfill for IE11\nif (!Number.isInteger) {\n Number.isInteger = function (value) {\n return isNumber(value) && isFinite(value) && Math.floor(value) === value\n }\n}\n\nconst DIGITS = '0123456789abcdef'\n\n/** Represents a UUID as a 16-byte byte array. */\nexport class UUID {\n /** @param bytes - The 16-byte byte array representation. */\n constructor(readonly bytes: Readonly<Uint8Array>) {\n if (bytes.length !== 16) {\n throw new TypeError('not 128-bit length')\n }\n }\n\n /**\n * Builds a byte array from UUIDv7 field values.\n *\n * @param unixTsMs - A 48-bit `unix_ts_ms` field value.\n * @param randA - A 12-bit `rand_a` field value.\n * @param randBHi - The higher 30 bits of 62-bit `rand_b` field value.\n * @param randBLo - The lower 32 bits of 62-bit `rand_b` field value.\n */\n static fromFieldsV7(unixTsMs: number, randA: number, randBHi: number, randBLo: number): UUID {\n if (\n !Number.isInteger(unixTsMs) ||\n !Number.isInteger(randA) ||\n !Number.isInteger(randBHi) ||\n !Number.isInteger(randBLo) ||\n unixTsMs < 0 ||\n randA < 0 ||\n randBHi < 0 ||\n randBLo < 0 ||\n unixTsMs > 0xffff_ffff_ffff ||\n randA > 0xfff ||\n randBHi > 0x3fff_ffff ||\n randBLo > 0xffff_ffff\n ) {\n throw new RangeError('invalid field value')\n }\n\n const bytes = new Uint8Array(16)\n bytes[0] = unixTsMs / 2 ** 40\n bytes[1] = unixTsMs / 2 ** 32\n bytes[2] = unixTsMs / 2 ** 24\n bytes[3] = unixTsMs / 2 ** 16\n bytes[4] = unixTsMs / 2 ** 8\n bytes[5] = unixTsMs\n bytes[6] = 0x70 | (randA >>> 8)\n bytes[7] = randA\n bytes[8] = 0x80 | (randBHi >>> 24)\n bytes[9] = randBHi >>> 16\n bytes[10] = randBHi >>> 8\n bytes[11] = randBHi\n bytes[12] = randBLo >>> 24\n bytes[13] = randBLo >>> 16\n bytes[14] = randBLo >>> 8\n bytes[15] = randBLo\n return new UUID(bytes)\n }\n\n /** @returns The 8-4-4-4-12 canonical hexadecimal string representation. */\n toString(): string {\n let text = ''\n for (let i = 0; i < this.bytes.length; i++) {\n text = text + DIGITS.charAt(this.bytes[i] >>> 4) + DIGITS.charAt(this.bytes[i] & 0xf)\n if (i === 3 || i === 5 || i === 7 || i === 9) {\n text += '-'\n }\n }\n\n if (text.length !== 36) {\n // We saw one customer whose bundling code was mangling the UUID generation\n // rather than accept a bad UUID, we throw an error here.\n throw new Error('Invalid UUIDv7 was generated')\n }\n return text\n }\n\n /** Creates an object from `this`. */\n clone(): UUID {\n return new UUID(this.bytes.slice(0))\n }\n\n /** Returns true if `this` is equivalent to `other`. */\n equals(other: UUID): boolean {\n return this.compareTo(other) === 0\n }\n\n /**\n * Returns a negative integer, zero, or positive integer if `this` is less\n * than, equal to, or greater than `other`, respectively.\n */\n compareTo(other: UUID): number {\n for (let i = 0; i < 16; i++) {\n const diff = this.bytes[i] - other.bytes[i]\n if (diff !== 0) {\n return Math.sign(diff)\n }\n }\n return 0\n }\n}\n\n/** Encapsulates the monotonic counter state. */\nclass V7Generator {\n private _timestamp = 0\n private _counter = 0\n private readonly _random = new DefaultRandom()\n\n /**\n * Generates a new UUIDv7 object from the current timestamp, or resets the\n * generator upon significant timestamp rollback.\n *\n * This method returns monotonically increasing UUIDs unless the up-to-date\n * timestamp is significantly (by ten seconds or more) smaller than the one\n * embedded in the immediately preceding UUID. If such a significant clock\n * rollback is detected, this method resets the generator and returns a new\n * UUID based on the current timestamp.\n */\n generate(): UUID {\n const value = this.generateOrAbort()\n if (!isUndefined(value)) {\n return value\n } else {\n // reset state and resume\n this._timestamp = 0\n const valueAfterReset = this.generateOrAbort()\n if (isUndefined(valueAfterReset)) {\n throw new Error('Could not generate UUID after timestamp reset')\n }\n return valueAfterReset\n }\n }\n\n /**\n * Generates a new UUIDv7 object from the current timestamp, or returns\n * `undefined` upon significant timestamp rollback.\n *\n * This method returns monotonically increasing UUIDs unless the up-to-date\n * timestamp is significantly (by ten seconds or more) smaller than the one\n * embedded in the immediately preceding UUID. If such a significant clock\n * rollback is detected, this method aborts and returns `undefined`.\n */\n generateOrAbort(): UUID | undefined {\n const MAX_COUNTER = 0x3ff_ffff_ffff\n const ROLLBACK_ALLOWANCE = 10_000 // 10 seconds\n\n const ts = Date.now()\n if (ts > this._timestamp) {\n this._timestamp = ts\n this._resetCounter()\n } else if (ts + ROLLBACK_ALLOWANCE > this._timestamp) {\n // go on with previous timestamp if new one is not much smaller\n this._counter++\n if (this._counter > MAX_COUNTER) {\n // increment timestamp at counter overflow\n this._timestamp++\n this._resetCounter()\n }\n } else {\n // abort if clock went backwards to unbearable extent\n return undefined\n }\n\n return UUID.fromFieldsV7(\n this._timestamp,\n Math.trunc(this._counter / 2 ** 30),\n this._counter & (2 ** 30 - 1),\n this._random.nextUint32()\n )\n }\n\n /** Initializes the counter at a 42-bit random integer. */\n private _resetCounter(): void {\n this._counter = this._random.nextUint32() * 0x400 + (this._random.nextUint32() & 0x3ff)\n }\n}\n\n/** A global flag to force use of cryptographically strong RNG. */\ndeclare const UUIDV7_DENY_WEAK_RNG: boolean\n\n/** Stores `crypto.getRandomValues()` available in the environment. */\nlet getRandomValues: <T extends Uint8Array | Uint32Array>(buffer: T) => T = (buffer) => {\n // fall back on Math.random() unless the flag is set to true\n // TRICKY: don't use the isUndefined method here as can't pass the reference\n if (typeof UUIDV7_DENY_WEAK_RNG !== 'undefined' && UUIDV7_DENY_WEAK_RNG) {\n throw new Error('no cryptographically strong RNG available')\n }\n\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] = Math.trunc(Math.random() * 0x1_0000) * 0x1_0000 + Math.trunc(Math.random() * 0x1_0000)\n }\n return buffer\n}\n\n// detect Web Crypto API\nif (window && !isUndefined(window.crypto) && crypto.getRandomValues) {\n getRandomValues = (buffer) => crypto.getRandomValues(buffer)\n}\n\n/**\n * Wraps `crypto.getRandomValues()` and compatibles to enable buffering; this\n * uses a small buffer by default to avoid unbearable throughput decline in some\n * environments as well as the waste of time and space for unused values.\n */\nclass DefaultRandom {\n private readonly _buffer = new Uint32Array(8)\n private _cursor = Infinity\n nextUint32(): number {\n if (this._cursor >= this._buffer.length) {\n getRandomValues(this._buffer)\n this._cursor = 0\n }\n return this._buffer[this._cursor++]\n }\n}\n\nlet defaultGenerator: V7Generator | undefined\n\n/**\n * Generates a UUIDv7 string.\n *\n * @returns The 8-4-4-4-12 canonical hexadecimal string representation\n * (\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\").\n */\nexport const uuidv7 = (): string => uuidv7obj().toString()\n\n/** Generates a UUIDv7 object. */\nconst uuidv7obj = (): UUID => (defaultGenerator || (defaultGenerator = new V7Generator())).generate()\n\nexport const uuid7ToTimestampMs = (uuid: string): number => {\n // remove hyphens\n const hex = uuid.replace(/-/g, '')\n // ensure that it's a version 7 UUID\n if (hex.length !== 32) {\n throw new Error('Not a valid UUID')\n }\n if (hex[12] !== '7') {\n throw new Error('Not a UUIDv7')\n }\n // the first 6 bytes are the timestamp, which means that we can read only the first 12 hex characters\n return parseInt(hex.substring(0, 12), 16)\n}\n","import { PostHog } from '../../../posthog-core'\nimport { UserProvidedTraits } from '../../../posthog-conversations-types'\nimport { createLogger } from '../../../utils/logger'\nimport { uuidv7 } from '../../../uuidv7'\n\nconst logger = createLogger('[ConversationsPersistence]')\n\n// Persistence keys - defined here in the lazy-loaded extension bundle\n// These keys are also listed in constants.ts PERSISTENCE_RESERVED_PROPERTIES\n// to prevent them from being included in event properties\nconst CONVERSATIONS_WIDGET_SESSION_ID = '$conversations_widget_session_id'\nconst CONVERSATIONS_TICKET_ID = '$conversations_ticket_id'\nconst CONVERSATIONS_WIDGET_STATE = '$conversations_widget_state'\nconst CONVERSATIONS_USER_TRAITS = '$conversations_user_traits'\n\n/**\n * ConversationsPersistence manages conversation-related data using PostHog's\n * core persistence layer. This ensures the data respects user's persistence\n * preferences (localStorage, cookie, sessionStorage, memory) and consent settings.\n */\nexport class ConversationsPersistence {\n private _cachedWidgetSessionId: string | null = null\n\n constructor(private readonly _posthog: PostHog) {}\n\n /** Check if persistence is available and enabled */\n private _isPersistenceAvailable(): boolean {\n return !!this._posthog.persistence && !this._posthog.persistence.isDisabled?.()\n }\n\n /**\n * Get or create the widget session ID (random UUID for access control).\n * This ID is generated once per browser and persists across sessions.\n * It is NOT tied to distinct_id - it stays the same even when user identifies.\n *\n * SECURITY: This is the key for access control. Only the browser that created\n * the widget_session_id can access tickets associated with it.\n */\n getOrCreateWidgetSessionId(): string {\n // Return cached value if available\n if (this._cachedWidgetSessionId) {\n return this._cachedWidgetSessionId\n }\n\n // Check if persistence is available\n if (!this._isPersistenceAvailable()) {\n // Fallback: generate a new one each time (won't persist)\n // This is acceptable for SSR or environments without persistence\n const sessionId = uuidv7()\n logger.warn('Persistence not available, widget_session_id will not persist', { sessionId })\n return sessionId\n }\n\n try {\n let sessionId = this._posthog.persistence?.get_property(CONVERSATIONS_WIDGET_SESSION_ID)\n if (!sessionId) {\n sessionId = uuidv7()\n this._posthog.persistence?.register({ [CONVERSATIONS_WIDGET_SESSION_ID]: sessionId })\n }\n this._cachedWidgetSessionId = sessionId\n return sessionId\n } catch (error) {\n logger.error('Failed to get/create widget_session_id', error)\n // Fallback: generate a new one (won't persist)\n return uuidv7()\n }\n }\n\n /**\n * Clear the widget session ID (called on posthog.reset()).\n * This will create a new session and lose access to previous tickets.\n */\n clearWidgetSessionId(): void {\n this._cachedWidgetSessionId = null\n\n if (!this._isPersistenceAvailable()) {\n return\n }\n\n try {\n this._posthog.persistence?.unregister(CONVERSATIONS_WIDGET_SESSION_ID)\n logger.info('Cleared widget_session_id')\n } catch (error) {\n logger.error('Failed to clear widget_session_id', error)\n }\n }\n\n /**\n * Save the current ticket ID to persistence\n */\n saveTicketId(ticketId: string): void {\n if (!this._isPersistenceAvailable()) {\n logger.warn('Persistence not available')\n return\n }\n\n try {\n this._posthog.persistence?.register({ [CONVERSATIONS_TICKET_ID]: ticketId })\n logger.info('Saved ticket ID', { ticketId })\n } catch (error) {\n logger.error('Failed to save ticket ID', error)\n }\n }\n\n /**\n * Load the current ticket ID from persistence\n */\n loadTicketId(): string | null {\n if (!this._isPersistenceAvailable()) {\n logger.warn('Persistence not available')\n return null\n }\n\n try {\n const ticketId = this._posthog.persistence?.get_property(CONVERSATIONS_TICKET_ID)\n if (ticketId) {\n logger.info('Loaded ticket ID', { ticketId })\n }\n return ticketId || null\n } catch (error) {\n logger.error('Failed to load ticket ID', error)\n return null\n }\n }\n\n /**\n * Clear the current ticket ID from persistence\n */\n clearTicketId(): void {\n if (!this._isPersistenceAvailable()) {\n logger.warn('Persistence not available')\n return\n }\n\n try {\n this._posthog.persistence?.unregister(CONVERSATIONS_TICKET_ID)\n logger.info('Cleared ticket ID')\n } catch (error) {\n logger.error('Failed to clear ticket ID', error)\n }\n }\n\n /**\n * Save widget state (open, closed)\n */\n saveWidgetState(state: 'open' | 'closed'): void {\n if (!this._isPersistenceAvailable()) {\n return\n }\n\n try {\n this._posthog.persistence?.register({ [CONVERSATIONS_WIDGET_STATE]: state })\n } catch (error) {\n logger.error('Failed to save widget state', error)\n }\n }\n\n /**\n * Load widget state\n */\n loadWidgetState(): 'open' | 'closed' | null {\n if (!this._isPersistenceAvailable()) {\n return null\n }\n\n try {\n const state = this._posthog.persistence?.get_property(CONVERSATIONS_WIDGET_STATE)\n if (state === 'open' || state === 'closed') {\n return state\n }\n return null\n } catch (error) {\n logger.error('Failed to load widget state', error)\n return null\n }\n }\n\n /**\n * Save user-provided traits (name, email) to persistence\n */\n saveUserTraits(traits: UserProvidedTraits): void {\n if (!this._isPersistenceAvailable()) {\n logger.warn('Persistence not available')\n return\n }\n\n try {\n this._posthog.persistence?.register({ [CONVERSATIONS_USER_TRAITS]: traits })\n logger.info('Saved user traits', { hasName: !!traits.name, hasEmail: !!traits.email })\n } catch (error) {\n logger.error('Failed to save user traits', error)\n }\n }\n\n /**\n * Load user-provided traits from persistence\n */\n loadUserTraits(): UserProvidedTraits | null {\n if (!this._isPersistenceAvailable()) {\n return null\n }\n\n try {\n const traits = this._posthog.persistence?.get_property(CONVERSATIONS_USER_TRAITS) as\n | UserProvidedTraits\n | undefined\n if (traits) {\n logger.info('Loaded user traits', { hasName: !!traits.name, hasEmail: !!traits.email })\n return traits\n }\n return null\n } catch (error) {\n logger.error('Failed to load user traits', error)\n return null\n }\n }\n\n /**\n * Clear user-provided traits from persistence\n */\n clearUserTraits(): void {\n if (!this._isPersistenceAvailable()) {\n return\n }\n\n try {\n this._posthog.persistence?.unregister(CONVERSATIONS_USER_TRAITS)\n logger.info('Cleared user traits')\n } catch (error) {\n logger.error('Failed to clear user traits', error)\n }\n }\n\n /**\n * Clear all conversation-related data from persistence.\n * This is called on posthog.reset() to start fresh.\n */\n clearAll(): void {\n if (!this._isPersistenceAvailable()) {\n return\n }\n\n try {\n // Clear all conversation properties\n this._posthog.persistence?.unregister(CONVERSATIONS_WIDGET_STATE)\n this._posthog.persistence?.unregister(CONVERSATIONS_USER_TRAITS)\n this._posthog.persistence?.unregister(CONVERSATIONS_TICKET_ID)\n\n // Clear widget session ID last (this will lose access to previous tickets)\n this.clearWidgetSessionId()\n\n logger.info('Cleared all conversation data')\n } catch (error) {\n logger.error('Failed to clear conversation data', error)\n }\n }\n}\n","// Inline styles following PostHog design system\n\nimport type { WidgetPosition } from '../../../../posthog-conversations-types'\nimport { Z_INDEX_CONVERSATIONS } from '../../../../constants'\n\n/**\n * Calculate contrasting text color (black or white) based on background brightness\n * Uses HSP (Highly Sensitive Purity) brightness formula\n */\nfunction getContrastTextColor(hexColor: string): string {\n const hex = hexColor.replace(/^#/, '')\n const fullHex = hex.length === 3 ? hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2] : hex\n\n const r = parseInt(fullHex.slice(0, 2), 16)\n const g = parseInt(fullHex.slice(2, 4), 16)\n const b = parseInt(fullHex.slice(4, 6), 16)\n\n // HSP brightness formula\n const hsp = Math.sqrt(0.299 * (r * r) + 0.587 * (g * g) + 0.114 * (b * b))\n return hsp > 127.5 ? '#020617' : 'white'\n}\n\nexport const getStyles = (primaryColor: string, position: WidgetPosition = 'bottom_right') => {\n const isLeft = position.includes('left')\n const isTop = position.includes('top')\n\n return {\n widget: {\n position: 'fixed' as const,\n ...(isTop ? { top: '20px' } : { bottom: '20px' }),\n ...(isLeft ? { left: '20px' } : { right: '20px' }),\n zIndex: Z_INDEX_CONVERSATIONS,\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Inter\", \"Segoe UI\", \"Roboto\", Helvetica, Arial, sans-serif',\n },\n buttonContainer: {\n position: 'relative' as const,\n },\n button: {\n width: '50px',\n height: '50px',\n borderRadius: '50%',\n background: primaryColor,\n color: getContrastTextColor(primaryColor),\n border: 'none',\n cursor: 'pointer',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'transform 0.2s ease-out, box-shadow 0.2s ease-out',\n },\n unreadBadge: {\n position: 'absolute' as const,\n ...(isTop ? { bottom: '-4px' } : { top: '-4px' }),\n ...(isLeft ? { left: '-4px' } : { right: '-4px' }),\n minWidth: '20px',\n height: '20px',\n borderRadius: '10px',\n background: '#ef4444',\n color: 'white',\n fontSize: '11px',\n fontWeight: 600,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0 5px',\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.2)',\n border: '2px solid white',\n boxSizing: 'border-box' as const,\n },\n window: {\n position: 'absolute' as const,\n ...(isTop ? { top: 0 } : { bottom: 0 }),\n ...(isLeft ? { left: 0 } : { right: 0 }),\n background: 'white',\n borderRadius: '10px',\n boxShadow: '0 10px 25px -3px rgba(0,0,0,0.12), 0 4px 12px -2px rgba(0,0,0,0.10)',\n display: 'flex',\n flexDirection: 'column' as const,\n overflow: 'hidden',\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n //border: '1px solid #dcdcdc',\n border: 'none',\n },\n windowOpen: {\n width: '400px',\n height: '600px',\n maxHeight: 'calc(100vh - 100px)',\n },\n header: {\n background: primaryColor,\n color: getContrastTextColor(primaryColor),\n padding: '8px 12px',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n flexShrink: 0,\n },\n headerTitle: {\n fontWeight: 500,\n fontSize: '14px',\n },\n headerActions: {\n display: 'flex',\n gap: '4px',\n },\n headerButton: {\n background: 'transparent',\n border: 'none',\n color: getContrastTextColor(primaryColor),\n cursor: 'pointer',\n padding: '6px 8px',\n fontSize: '16px',\n lineHeight: 1,\n borderRadius: '4px',\n transition: 'background 0.2s ease-out',\n opacity: 0.9,\n },\n messages: {\n flex: 1,\n overflowY: 'auto' as const,\n padding: '14px',\n display: 'flex',\n flexDirection: 'column' as const,\n gap: '8px',\n background: 'white',\n },\n message: {\n display: 'flex',\n flexDirection: 'column' as const,\n maxWidth: '85%',\n animation: 'fadeIn 0.2s ease-out',\n },\n messageCustomer: {\n alignSelf: 'flex-end',\n alignItems: 'flex-end',\n },\n messageAgent: {\n alignSelf: 'flex-start',\n alignItems: 'flex-start',\n },\n messageAuthor: {\n fontSize: '10px',\n color: '#939393',\n marginBottom: '4px',\n fontWeight: 500,\n },\n messageContent: {\n padding: '8px 12px',\n borderRadius: '8px',\n fontSize: '12px',\n lineHeight: 1.5,\n wordWrap: 'break-word' as const,\n whiteSpace: 'pre-wrap' as const,\n },\n messageContentCustomer: {\n background: primaryColor,\n color: getContrastTextColor(primaryColor),\n borderBottomRightRadius: '2px',\n },\n messageContentAgent: {\n background: 'white',\n color: '#020617',\n border: '1.5px solid #dcdcdc',\n borderBottomLeftRadius: '2px',\n },\n messageTime: {\n fontSize: '10px',\n color: '#939393',\n marginTop: '4px',\n opacity: 0.8,\n },\n error: {\n padding: '10px 16px',\n background: '#fee2e2',\n color: '#991b1b',\n fontSize: '13px',\n borderTop: '1px solid #fecaca',\n borderBottom: '1px solid #fecaca',\n textAlign: 'center' as const,\n fontWeight: 500,\n },\n inputContainer: {\n padding: '8px 12px',\n background: 'white',\n borderTop: '1px solid #dcdcdc',\n display: 'flex',\n gap: '8px',\n alignItems: 'center', // Changed from flex-end to center to vertically align input and sendButton\n flexShrink: 0,\n },\n input: {\n flex: 1,\n maxHeight: '120px',\n fontSize: '14px',\n resize: 'vertical',\n fontFamily: 'inherit',\n lineHeight: 1.5,\n color: '#020617',\n background: 'white',\n border: 'none',\n outline: 'none',\n transition: 'border-color 0.2s ease-out, box-shadow 0.2s ease-out',\n display: 'flex',\n alignItems: 'center',\n fieldSizing: 'content',\n },\n sendButton: {\n width: '33px',\n height: '33px', // Match input minHeight for vertical alignment\n borderRadius: '10px',\n background: primaryColor,\n color: getContrastTextColor(primaryColor),\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s ease-out',\n boxShadow: '0 2px 0 rgba(0, 0, 0, 0.045)',\n fontWeight: 700,\n flexShrink: 0,\n },\n // Identification form styles\n identificationForm: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column' as const,\n padding: '24px',\n background: '#eeeded',\n overflowY: 'auto' as const,\n },\n formTitle: {\n fontSize: '18px',\n fontWeight: 600,\n color: '#020617',\n marginBottom: '8px',\n },\n formDescription: {\n fontSize: '14px',\n color: '#64748b',\n marginBottom: '24px',\n lineHeight: 1.5,\n },\n formField: {\n marginBottom: '16px',\n },\n formLabel: {\n display: 'block',\n fontSize: '13px',\n fontWeight: 500,\n color: '#020617',\n marginBottom: '6px',\n },\n formInput: {\n width: '100%',\n padding: '10px 12px',\n border: '1px solid #dcdcdc',\n borderRadius: '6px',\n fontSize: '14px',\n fontFamily: 'inherit',\n color: '#020617',\n background: 'white',\n transition: 'border-color 0.2s ease-out, box-shadow 0.2s ease-out',\n boxSizing: 'border-box' as const,\n },\n formInputError: {\n borderColor: '#ef4444',\n },\n formError: {\n fontSize: '12px',\n color: '#ef4444',\n marginTop: '4px',\n },\n formSubmitButton: {\n width: '100%',\n padding: '12px 16px',\n borderRadius: '6px',\n background: primaryColor,\n color: getContrastTextColor(primaryColor),\n border: 'none',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: 600,\n transition: 'all 0.2s ease-out',\n marginTop: '8px',\n },\n formOptional: {\n fontSize: '12px',\n color: '#939393',\n fontWeight: 400,\n },\n }\n}\n","/*\n * Constants\n */\n\n/* PROPERTY KEYS */\n\n// This key is deprecated, but we want to check for it to see whether aliasing is allowed.\nexport const PEOPLE_DISTINCT_ID_KEY = '$people_distinct_id'\nexport const DISTINCT_ID = 'distinct_id'\nexport const DEVICE_ID = '$device_id'\nexport const ALIAS_ID_KEY = '__alias'\nexport const CAMPAIGN_IDS_KEY = '__cmpns'\nexport const EVENT_TIMERS_KEY = '__timers'\nexport const AUTOCAPTURE_DISABLED_SERVER_SIDE = '$autocapture_disabled_server_side'\nexport const HEATMAPS_ENABLED_SERVER_SIDE = '$heatmaps_enabled_server_side'\nexport const EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE = '$exception_capture_enabled_server_side'\nexport const ERROR_TRACKING_SUPPRESSION_RULES = '$error_tracking_suppression_rules'\nexport const ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS = '$error_tracking_capture_extension_exceptions'\nexport const WEB_VITALS_ENABLED_SERVER_SIDE = '$web_vitals_enabled_server_side'\nexport const DEAD_CLICKS_ENABLED_SERVER_SIDE = '$dead_clicks_enabled_server_side'\nexport const PRODUCT_TOURS_ENABLED_SERVER_SIDE = '$product_tours_enabled_server_side'\nexport const WEB_VITALS_ALLOWED_METRICS = '$web_vitals_allowed_metrics'\nexport const SESSION_RECORDING_REMOTE_CONFIG = '$session_recording_remote_config'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_ENABLED_SERVER_SIDE = '$session_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE = '$console_log_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_NETWORK_PAYLOAD_CAPTURE = '$session_recording_network_payload_capture'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MASKING = '$session_recording_masking'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_CANVAS_RECORDING = '$session_recording_canvas_recording'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SAMPLE_RATE = '$replay_sample_rate'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MINIMUM_DURATION = '$replay_minimum_duration'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SCRIPT_CONFIG = '$replay_script_config'\nexport const SESSION_RECORDING_OVERRIDE_SAMPLING = '$replay_override_sampling'\nexport const SESSION_RECORDING_OVERRIDE_LINKED_FLAG = '$replay_override_linked_flag'\nexport const SESSION_RECORDING_OVERRIDE_URL_TRIGGER = '$replay_override_url_trigger'\nexport const SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER = '$replay_override_event_trigger'\nexport const SESSION_ID = '$sesid'\nexport const SESSION_RECORDING_IS_SAMPLED = '$session_is_sampled'\nexport const SESSION_RECORDING_PAST_MINIMUM_DURATION = '$session_past_minimum_duration'\nexport const SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION = '$session_recording_url_trigger_activated_session'\nexport const SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION = '$session_recording_event_trigger_activated_session'\nexport const SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP = '$debug_first_full_snapshot_timestamp'\nexport const ENABLED_FEATURE_FLAGS = '$enabled_feature_flags'\nexport const PERSISTENCE_EARLY_ACCESS_FEATURES = '$early_access_features'\nexport const PERSISTENCE_FEATURE_FLAG_DETAILS = '$feature_flag_details'\nexport const STORED_PERSON_PROPERTIES_KEY = '$stored_person_properties'\nexport const STORED_GROUP_PROPERTIES_KEY = '$stored_group_properties'\nexport const SURVEYS = '$surveys'\nexport const SURVEYS_ACTIVATED = '$surveys_activated'\nexport const PRODUCT_TOURS_ACTIVATED = '$product_tours_activated'\nexport const CONVERSATIONS = '$conversations'\nexport const FLAG_CALL_REPORTED = '$flag_call_reported'\nexport const PERSISTENCE_FEATURE_FLAG_ERRORS = '$feature_flag_errors'\nexport const USER_STATE = '$user_state'\nexport const CLIENT_SESSION_PROPS = '$client_session_props'\nexport const CAPTURE_RATE_LIMIT = '$capture_rate_limit'\n\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_CAMPAIGN_PARAMS = '$initial_campaign_params'\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_REFERRER_INFO = '$initial_referrer_info'\nexport const INITIAL_PERSON_INFO = '$initial_person_info'\nexport const ENABLE_PERSON_PROCESSING = '$epp'\nexport const TOOLBAR_ID = '__POSTHOG_TOOLBAR__'\nexport const TOOLBAR_CONTAINER_CLASS = 'toolbar-global-fade-container'\n\n/**\n * PREVIEW - MAY CHANGE WITHOUT WARNING - DO NOT USE IN PRODUCTION\n * Sentinel value for distinct id, device id, session id. Signals that the server should generate the value\n * */\nexport const COOKIELESS_SENTINEL_VALUE = '$posthog_cookieless'\nexport const COOKIELESS_MODE_FLAG_PROPERTY = '$cookieless_mode'\n\nexport const WEB_EXPERIMENTS = '$web_experiments'\n\n// These are properties that are reserved and will not be automatically included in events\nexport const PERSISTENCE_RESERVED_PROPERTIES = [\n PEOPLE_DISTINCT_ID_KEY,\n ALIAS_ID_KEY,\n CAMPAIGN_IDS_KEY,\n EVENT_TIMERS_KEY,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n HEATMAPS_ENABLED_SERVER_SIDE,\n SESSION_ID,\n ENABLED_FEATURE_FLAGS,\n ERROR_TRACKING_SUPPRESSION_RULES,\n USER_STATE,\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n PERSISTENCE_FEATURE_FLAG_DETAILS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n SURVEYS,\n FLAG_CALL_REPORTED,\n PERSISTENCE_FEATURE_FLAG_ERRORS,\n CLIENT_SESSION_PROPS,\n CAPTURE_RATE_LIMIT,\n INITIAL_CAMPAIGN_PARAMS,\n INITIAL_REFERRER_INFO,\n ENABLE_PERSON_PROCESSING,\n INITIAL_PERSON_INFO,\n // Conversations keys (defined in lazy-loaded extension)\n '$conversations_widget_session_id',\n '$conversations_ticket_id',\n '$conversations_widget_state',\n '$conversations_user_traits',\n]\n\nexport const SURVEYS_REQUEST_TIMEOUT_MS = 10000\n\n/* Z-INDEX HIERARCHY: tours > surveys > support */\nexport const Z_INDEX_TOURS = 2147483646\nexport const Z_INDEX_SURVEYS = 2147483645\nexport const Z_INDEX_CONVERSATIONS = 2147483644\n","import type { WidgetPosition } from '../../../../posthog-conversations-types'\nimport { getStyles } from './styles'\n\ninterface OpenChatButtonProps {\n primaryColor: string\n position?: WidgetPosition\n handleToggleOpen: () => void\n unreadCount?: number\n}\n\nexport const OpenChatButton = ({\n primaryColor,\n position = 'bottom_right',\n handleToggleOpen,\n unreadCount = 0,\n}: OpenChatButtonProps) => {\n const styles = getStyles(primaryColor, position)\n const displayCount = unreadCount > 99 ? '99+' : unreadCount.toString()\n\n return (\n <div style={styles.widget}>\n <div style={styles.buttonContainer}>\n <button\n style={styles.button}\n onClick={handleToggleOpen}\n aria-label={unreadCount > 0 ? `Open chat (${unreadCount} unread)` : 'Open chat'}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = 'scale(1.05)'\n e.currentTarget.style.boxShadow = '0 6px 20px rgba(0, 0, 0, 0.2)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'scale(1)'\n e.currentTarget.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.15)'\n }}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 2C6.48 2 2 6.48 2 12C2 13.93 2.6 15.71 3.64 17.18L2.5 21.5L7.04 20.42C8.46 21.28 10.17 21.75 12 21.75C17.52 21.75 22 17.27 22 11.75C22 6.23 17.52 2 12 2Z\"\n fill=\"currentColor\"\n />\n </svg>\n </button>\n {unreadCount > 0 && <div style={styles.unreadBadge}>{displayCount}</div>}\n </div>\n </div>\n )\n}\n","import{options as n}from\"preact\";var t,r,u,i,o=0,f=[],c=n,e=c.__b,a=c.__r,v=c.diffed,l=c.__c,m=c.unmount,s=c.__;function p(n,t){c.__h&&c.__h(r,n,o||t),o=0;var u=r.__H||(r.__H={__:[],__h:[]});return n>=u.__.length&&u.__.push({}),u.__[n]}function d(n){return o=1,h(D,n)}function h(n,u,i){var o=p(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):D(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.__f)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return!!n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=o.__c.props!==n;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),c&&c.call(this,n,t,r)||i};r.__f=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function y(n,u){var i=p(t++,3);!c.__s&&C(i.__H,u)&&(i.__=n,i.u=u,r.__H.__h.push(i))}function _(n,u){var i=p(t++,4);!c.__s&&C(i.__H,u)&&(i.__=n,i.u=u,r.__h.push(i))}function A(n){return o=5,T(function(){return{current:n}},[])}function F(n,t,r){o=6,_(function(){if(\"function\"==typeof n){var r=n(t());return function(){n(null),r&&\"function\"==typeof r&&r()}}if(n)return n.current=t(),function(){return n.current=null}},null==r?r:r.concat(n))}function T(n,r){var u=p(t++,7);return C(u.__H,r)&&(u.__=n(),u.__H=r,u.__h=n),u.__}function q(n,t){return o=8,T(function(){return n},t)}function x(n){var u=r.context[n.__c],i=p(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function P(n,t){c.useDebugValue&&c.useDebugValue(t?t(n):n)}function b(n){var u=p(t++,10),i=d();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function g(){var n=p(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__=\"P\"+i[0]+\"-\"+i[1]++}return n.__}function j(){for(var n;n=f.shift();)if(n.__P&&n.__H)try{n.__H.__h.forEach(z),n.__H.__h.forEach(B),n.__H.__h=[]}catch(t){n.__H.__h=[],c.__e(t,n.__v)}}c.__b=function(n){r=null,e&&e(n)},c.__=function(n,t){n&&t.__k&&t.__k.__m&&(n.__m=t.__k.__m),s&&s(n,t)},c.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(i.__h.forEach(z),i.__h.forEach(B),i.__h=[],t=0)),u=r},c.diffed=function(n){v&&v(n);var t=n.__c;t&&t.__H&&(t.__H.__h.length&&(1!==f.push(t)&&i===c.requestAnimationFrame||((i=c.requestAnimationFrame)||w)(j)),t.__H.__.forEach(function(n){n.u&&(n.__H=n.u),n.u=void 0})),u=r=null},c.__c=function(n,t){t.some(function(n){try{n.__h.forEach(z),n.__h=n.__h.filter(function(n){return!n.__||B(n)})}catch(r){t.some(function(n){n.__h&&(n.__h=[])}),t=[],c.__e(r,n.__v)}}),l&&l(n,t)},c.unmount=function(n){m&&m(n);var t,r=n.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{z(n)}catch(n){t=n}}),r.__H=void 0,t&&c.__e(t,r.__v))};var k=\"function\"==typeof requestAnimationFrame;function w(n){var t,r=function(){clearTimeout(u),k&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,35);k&&(t=requestAnimationFrame(r))}function z(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function B(n){var t=r;n.__c=n.__(),r=t}function C(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function D(n,t){return\"function\"==typeof t?t(n):t}export{q as useCallback,x as useContext,P as useDebugValue,y as useEffect,b as useErrorBoundary,g as useId,F as useImperativeHandle,_ as useLayoutEffect,T as useMemo,h as useReducer,A as useRef,d as useState};\n//# sourceMappingURL=hooks.module.js.map\n","import { getStyles } from './styles'\n\ninterface SendMessageButtonProps {\n primaryColor: string\n inputValue: string\n isLoading: boolean\n handleSendMessage: () => void\n}\n\nexport const SendMessageButton = ({\n primaryColor,\n inputValue,\n isLoading,\n handleSendMessage,\n}: SendMessageButtonProps) => {\n const styles = getStyles(primaryColor)\n return (\n <button\n style={{\n ...styles.sendButton,\n opacity: !inputValue.trim() || isLoading ? 0.6 : 1,\n cursor: !inputValue.trim() || isLoading ? 'not-allowed' : 'pointer',\n }}\n onClick={handleSendMessage}\n disabled={!inputValue.trim() || isLoading}\n aria-label=\"Send message\"\n onMouseEnter={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.transform = 'scale(1.02)'\n e.currentTarget.style.boxShadow = '0 4px 8px rgba(0, 0, 0, 0.1)'\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'scale(1)'\n e.currentTarget.style.boxShadow = '0 2px 0 rgba(0, 0, 0, 0.045)'\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 10L18 2L10 18L8 11L2 10Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )\n}\n","import { getStyles } from './styles'\n\ninterface CloseChatButtonProps {\n primaryColor: string\n handleClose: () => void\n}\n\nexport const CloseChatButton = ({ primaryColor, handleClose }: CloseChatButtonProps) => {\n const styles = getStyles(primaryColor)\n return (\n <button\n style={styles.headerButton}\n onClick={handleClose}\n aria-label=\"Close\"\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.15)'\n e.currentTarget.style.opacity = '1'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent'\n e.currentTarget.style.opacity = '0.9'\n }}\n >\n ✕\n </button>\n )\n}\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { h, Fragment } from 'preact'\nimport { useMemo } from 'preact/hooks'\nimport { isUndefined, isNumber, isArray } from '@posthog/core'\nimport { TipTapDoc, TipTapNode, TipTapMark } from '../../../../posthog-conversations-types'\n\ninterface RichContentProps {\n /** Rich content in TipTap JSON format (preferred) */\n richContent?: TipTapDoc\n /** Plain text fallback if rich_content is missing or invalid */\n content: string\n /** Whether message is from customer (affects styling) */\n isCustomer: boolean\n /** Primary color for links */\n primaryColor: string\n}\n\n/**\n * Sanitize URL to prevent javascript: and other dangerous protocols.\n * Only allows http:, https:, mailto:, tel:, and relative URLs.\n *\n * Security measures:\n * - Removes ASCII control characters (0x00-0x1F, 0x7F) that could obfuscate protocols\n * - Removes Unicode whitespace and zero-width characters\n * - Collapses whitespace when checking protocols to prevent \"java script:\" bypasses\n * - Blocks javascript:, vbscript:, data:, and file: protocols\n * - Blocks protocol-relative URLs (//example.com)\n */\nfunction sanitizeUrl(url: string): string | undefined {\n if (!url || typeof url !== 'string') {\n return undefined\n }\n\n // Remove ASCII control characters (0x00-0x1F, 0x7F DEL) that could obfuscate protocols\n // Also remove zero-width characters (U+200B-U+200D, U+FEFF) that could be used for obfuscation\n // eslint-disable-next-line no-control-regex\n const cleanedUrl = url.replace(/[\\x00-\\x1f\\x7f\\u200b-\\u200d\\ufeff]/g, '')\n const trimmedUrl = cleanedUrl.trim()\n if (!trimmedUrl) {\n return undefined\n }\n\n // Collapse all whitespace (including Unicode whitespace) when checking protocol\n // This prevents bypasses like \"java script:\" or \"java\\u00A0script:\" (non-breaking space)\n const normalizedForCheck = trimmedUrl.replace(/\\s+/g, '').toLowerCase()\n\n // Block dangerous protocols\n if (\n normalizedForCheck.startsWith('javascript:') ||\n normalizedForCheck.startsWith('vbscript:') ||\n normalizedForCheck.startsWith('data:') ||\n normalizedForCheck.startsWith('file:')\n ) {\n return undefined\n }\n\n // Allow relative URLs (check against trimmed URL, not normalized)\n // Note: We explicitly check for '//' first to block protocol-relative URLs (e.g., //evil.com)\n // which could be used to load content from attacker-controlled domains\n if (trimmedUrl.startsWith('//')) {\n return undefined\n }\n if (\n trimmedUrl.startsWith('/') ||\n trimmedUrl.startsWith('./') ||\n trimmedUrl.startsWith('../') ||\n trimmedUrl.startsWith('#')\n ) {\n return trimmedUrl\n }\n\n // Allow safe absolute URLs\n const lowerUrl = trimmedUrl.toLowerCase()\n if (\n lowerUrl.startsWith('http://') ||\n lowerUrl.startsWith('https://') ||\n lowerUrl.startsWith('mailto:') ||\n lowerUrl.startsWith('tel:')\n ) {\n return trimmedUrl\n }\n\n return undefined\n}\n\n/** Maximum recursion depth to prevent stack overflow */\nconst MAX_DEPTH = 20\n\nfunction getStyles(isCustomer: boolean, primaryColor: string) {\n return {\n code: {\n fontFamily: 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace',\n fontSize: '0.9em',\n padding: '2px 4px',\n borderRadius: '3px',\n background: isCustomer ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.06)',\n },\n codeBlock: {\n fontFamily: 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace',\n fontSize: '0.85em',\n padding: '8px 10px',\n borderRadius: '6px',\n background: isCustomer ? 'rgba(255, 255, 255, 0.15)' : '#f4f4f5',\n overflowX: 'auto' as const,\n whiteSpace: 'pre-wrap' as const,\n wordWrap: 'break-word' as const,\n wordBreak: 'break-word' as const,\n margin: '8px 0',\n display: 'block',\n lineHeight: 1.5,\n border: isCustomer ? 'none' : '1px solid #e4e4e7',\n },\n link: {\n color: isCustomer ? 'white' : primaryColor,\n textDecoration: 'underline',\n },\n image: {\n maxWidth: '100%',\n borderRadius: '4px',\n marginTop: '4px',\n marginBottom: '4px',\n display: 'block',\n },\n }\n}\n\n/**\n * Render a text node with its marks (bold, italic, underline, etc.)\n * Marks are applied by wrapping the content in nested elements.\n */\nfunction renderTextWithMarks(\n text: string,\n marks: TipTapMark[] | undefined,\n styles: ReturnType<typeof getStyles>,\n key: string\n): preact.JSX.Element {\n if (!marks || marks.length === 0) {\n return <span key={key}>{text}</span>\n }\n\n // Build the element by wrapping with marks from inside out\n let element: preact.JSX.Element = <>{text}</>\n\n for (const mark of marks) {\n switch (mark.type) {\n case 'bold':\n element = <strong style={{ fontWeight: 700 }}>{element}</strong>\n break\n case 'italic':\n element = <em style={{ fontStyle: 'italic' }}>{element}</em>\n break\n case 'underline':\n element = <u style={{ textDecoration: 'underline' }}>{element}</u>\n break\n case 'strike':\n element = <s style={{ textDecoration: 'line-through' }}>{element}</s>\n break\n case 'code':\n element = <code style={styles.code}>{element}</code>\n break\n case 'link': {\n const href = mark.attrs?.href\n const safeUrl = typeof href === 'string' ? sanitizeUrl(href) : undefined\n if (safeUrl) {\n element = (\n <a\n href={safeUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n referrerPolicy=\"no-referrer\"\n style={styles.link}\n >\n {element}\n </a>\n )\n }\n break\n }\n // Ignore unknown mark types for safety\n }\n }\n\n return <span key={key}>{element}</span>\n}\n\n/**\n * Recursively render a TipTap node and its children\n */\nfunction renderNode(\n node: TipTapNode | TipTapDoc,\n styles: ReturnType<typeof getStyles>,\n depth: number,\n key: string\n): preact.JSX.Element | null {\n // Safety: prevent infinite recursion\n if (depth > MAX_DEPTH) {\n return null\n }\n\n // Text node with optional marks\n if (node.type === 'text' && !isUndefined(node.text)) {\n return renderTextWithMarks(node.text, node.marks, styles, key)\n }\n\n // Render children recursively\n const children = node.content?.map((child, index) => renderNode(child, styles, depth + 1, `${key}-${index}`)) || []\n\n switch (node.type) {\n case 'doc':\n return <>{children}</>\n\n case 'paragraph':\n return (\n <p key={key} style={{ margin: '0 0 8px 0' }}>\n {children.length > 0 ? children : <br />}\n </p>\n )\n\n case 'hardBreak':\n return <br key={key} />\n\n case 'codeBlock': {\n // Code blocks store text in content[0].text\n const codeText = node.content?.[0]?.text || ''\n return (\n <pre key={key} style={styles.codeBlock}>\n <code>{codeText}</code>\n </pre>\n )\n }\n\n case 'image': {\n const src = node.attrs?.src\n const alt = node.attrs?.alt\n const safeUrl = typeof src === 'string' ? sanitizeUrl(src) : undefined\n if (!safeUrl) {\n return null\n }\n return (\n <img\n key={key}\n src={safeUrl}\n alt={typeof alt === 'string' ? alt : ''}\n style={styles.image}\n onError={(e) => {\n ;(e.target as HTMLImageElement).style.display = 'none'\n }}\n />\n )\n }\n\n case 'bulletList':\n return (\n <ul key={key} style={{ margin: '8px 0', paddingLeft: '24px' }}>\n {children}\n </ul>\n )\n\n case 'orderedList':\n return (\n <ol key={key} style={{ margin: '8px 0', paddingLeft: '24px' }}>\n {children}\n </ol>\n )\n\n case 'listItem':\n return (\n <li key={key} style={{ margin: '4px 0' }}>\n {children}\n </li>\n )\n\n case 'blockquote':\n return (\n <blockquote\n key={key}\n style={{\n margin: '8px 0',\n paddingLeft: '12px',\n borderLeft: '3px solid #e4e4e7',\n color: '#71717a',\n }}\n >\n {children}\n </blockquote>\n )\n\n case 'heading': {\n const rawLevel = node.attrs?.level\n const level = isNumber(rawLevel) ? rawLevel : 1\n const HeadingTag = `h${Math.min(Math.max(level, 1), 6)}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'\n return (\n <HeadingTag key={key} style={{ margin: '12px 0 8px 0' }}>\n {children}\n </HeadingTag>\n )\n }\n\n case 'horizontalRule':\n return <hr key={key} style={{ margin: '12px 0', border: 'none', borderTop: '1px solid #e4e4e7' }} />\n\n default:\n // Unknown node types: render children if any, otherwise ignore\n if (children.length > 0) {\n return <span key={key}>{children}</span>\n }\n return null\n }\n}\n\n/**\n * Validate that the content looks like a valid TipTap document\n */\nfunction isValidTipTapDoc(doc: unknown): doc is TipTapDoc {\n if (!doc || typeof doc !== 'object') {\n return false\n }\n const d = doc as TipTapDoc\n return d.type === 'doc' && (isUndefined(d.content) || isArray(d.content))\n}\n\n/**\n * Render plain text with line breaks preserved\n */\nfunction renderPlainText(text: string): preact.JSX.Element {\n if (!text) {\n return <></>\n }\n const lines = text.split('\\n')\n return (\n <>\n {lines.map((line, index) => (\n <Fragment key={index}>\n {line}\n {index < lines.length - 1 && <br />}\n </Fragment>\n ))}\n </>\n )\n}\n\n/**\n * RichContent component - renders TipTap JSON content with plain text fallback\n *\n * Rendering logic:\n * 1. If richContent is present and valid, render as TipTap tree\n * 2. If richContent is missing or invalid, fall back to plain text content\n * 3. Wrap TipTap rendering in try/catch for safety\n */\nexport function RichContent({ richContent, content, isCustomer, primaryColor }: RichContentProps) {\n const styles = useMemo(() => getStyles(isCustomer, primaryColor), [isCustomer, primaryColor])\n\n // Try to render rich content if available\n if (richContent) {\n try {\n if (isValidTipTapDoc(richContent)) {\n const rendered = renderNode(richContent, styles, 0, 'root')\n if (rendered) {\n return rendered\n }\n }\n } catch {\n // Fall through to plain text on any error\n }\n }\n\n // Fallback: render plain text content\n return renderPlainText(content)\n}\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { h, Component, Fragment } from 'preact'\nimport {\n ConversationsRemoteConfig,\n Message,\n ConversationsWidgetState,\n UserProvidedTraits,\n} from '../../../../posthog-conversations-types'\nimport { createLogger } from '../../../../utils/logger'\nimport { getStyles } from './styles'\nimport { OpenChatButton } from './OpenChatButton'\nimport { SendMessageButton } from './SendMessageButton'\nimport { CloseChatButton } from './CloseChatButton'\nimport { RichContent } from './RichContent'\n\nconst logger = createLogger('[ConversationsWidget]')\n\ninterface WidgetProps {\n config: ConversationsRemoteConfig\n initialState?: ConversationsWidgetState\n initialUserTraits?: UserProvidedTraits | null\n isUserIdentified?: boolean\n onSendMessage: (message: string) => Promise<void>\n onStateChange?: (state: ConversationsWidgetState) => void\n onIdentify?: (traits: UserProvidedTraits) => void\n}\n\ninterface WidgetState {\n state: ConversationsWidgetState\n messages: Message[]\n inputValue: string\n isLoading: boolean\n error: string | null\n showIdentificationForm: boolean\n formName: string\n formEmail: string\n formEmailError: string | null\n userTraits: UserProvidedTraits | null\n unreadCount: number\n}\n\nexport class ConversationsWidget extends Component<WidgetProps, WidgetState> {\n private _messagesEndRef: HTMLDivElement | null = null\n private _inputRef: HTMLTextAreaElement | null = null\n\n constructor(props: WidgetProps) {\n super(props)\n\n // Determine if we need to show the identification form\n const userTraits = props.initialUserTraits || null\n const needsIdentification = this._needsIdentification(props.config, userTraits, props.isUserIdentified)\n\n this.state = {\n state: props.initialState || 'closed',\n messages: [],\n inputValue: '',\n isLoading: false,\n error: null,\n showIdentificationForm: needsIdentification,\n formName: userTraits?.name || '',\n formEmail: userTraits?.email || '',\n formEmailError: null,\n userTraits,\n unreadCount: 0,\n }\n }\n\n /**\n * Check if we need to show the identification form\n */\n private _needsIdentification(\n config: ConversationsRemoteConfig,\n traits: UserProvidedTraits | null,\n isUserIdentified?: boolean\n ): boolean {\n // If user is already identified via PostHog, no form needed\n // They've called posthog.identify() so we have their identity\n if (isUserIdentified) {\n return false\n }\n\n // If requireEmail is not set, no identification needed\n if (!config.requireEmail) {\n return false\n }\n\n // If we already have an email, no form needed\n if (traits?.email) {\n return false\n }\n\n return true\n }\n\n componentDidMount() {\n // Add greeting message if no messages exist\n if (this.state.messages.length === 0 && this.props.config.greetingText) {\n this._addGreetingMessage()\n }\n }\n\n componentDidUpdate(_prevProps: WidgetProps, prevState: WidgetState) {\n // Scroll to bottom when messages change\n if (this.state.messages.length !== prevState.messages.length) {\n this._scrollToBottom()\n }\n\n // Notify parent of state changes\n if (this.state.state !== prevState.state && this.props.onStateChange) {\n this.props.onStateChange(this.state.state)\n }\n\n // Focus input and scroll to bottom when opening\n if (this.state.state === 'open' && prevState.state !== 'open') {\n this._focusInput()\n this._scrollToBottom()\n }\n }\n\n private _addGreetingMessage() {\n const greetingMessage: Message = {\n id: 'greeting',\n content: this.props.config.greetingText || 'Hi! How can we help?',\n author_type: 'AI',\n author_name: 'Support',\n created_at: new Date().toISOString(),\n is_private: false,\n }\n this.setState({ messages: [greetingMessage] })\n }\n\n private _scrollToBottom() {\n if (this._messagesEndRef) {\n this._messagesEndRef.scrollIntoView({ behavior: 'smooth' })\n }\n }\n\n private _focusInput() {\n if (this._inputRef) {\n this._inputRef.focus()\n }\n }\n\n private _handleToggleOpen = () => {\n this.setState((prevState) => ({\n state: prevState.state === 'open' ? 'closed' : 'open',\n }))\n }\n\n private _handleClose = () => {\n this.setState({ state: 'closed' })\n }\n\n private _handleInputChange = (e: Event) => {\n const target = e.target as HTMLTextAreaElement\n this.setState({ inputValue: target.value })\n }\n\n private _handleKeyPress = (e: KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n this._handleSendMessage()\n }\n }\n\n // Identification form handlers\n private _handleFormNameChange = (e: Event) => {\n const target = e.target as HTMLInputElement\n this.setState({ formName: target.value })\n }\n\n private _handleFormEmailChange = (e: Event) => {\n const target = e.target as HTMLInputElement\n this.setState({ formEmail: target.value, formEmailError: null })\n }\n\n private _validateEmail(email: string): boolean {\n // Basic email validation\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n }\n\n private _handleFormSubmit = (e: Event) => {\n e.preventDefault()\n\n const { formEmail, formName } = this.state\n const { config, onIdentify } = this.props\n\n // Validate email if required\n if (config.requireEmail && !formEmail.trim()) {\n this.setState({ formEmailError: 'Email is required' })\n return\n }\n\n if (formEmail.trim() && !this._validateEmail(formEmail.trim())) {\n this.setState({ formEmailError: 'Please enter a valid email address' })\n return\n }\n\n // Create traits object\n const traits: UserProvidedTraits = {}\n if (formName.trim()) {\n traits.name = formName.trim()\n }\n if (formEmail.trim()) {\n traits.email = formEmail.trim()\n }\n\n // Update state and notify parent\n this.setState({\n userTraits: traits,\n showIdentificationForm: false,\n })\n\n if (onIdentify) {\n onIdentify(traits)\n }\n }\n\n private _handleSendMessage = async () => {\n const { inputValue } = this.state\n const trimmedMessage = inputValue.trim()\n\n if (!trimmedMessage) {\n return\n }\n\n // Add user message to UI immediately\n const userMessage: Message = {\n id: `temp-${Date.now()}`,\n content: trimmedMessage,\n author_type: 'customer',\n author_name: 'You',\n created_at: new Date().toISOString(),\n is_private: false,\n }\n\n this.setState({\n messages: [...this.state.messages, userMessage],\n inputValue: '',\n isLoading: true,\n error: null,\n })\n\n try {\n await this.props.onSendMessage(trimmedMessage)\n // Success - message will be updated via addMessage()\n this.setState({ isLoading: false })\n } catch (error) {\n logger.error('Failed to send message', error)\n this.setState({\n isLoading: false,\n error: error instanceof Error ? error.message : 'Failed to send message',\n })\n\n // Remove the temporary message on error\n this.setState((prevState) => ({\n messages: prevState.messages.filter((m) => m.id !== userMessage.id),\n }))\n }\n }\n\n private _formatTime(isoString: string): string {\n const date = new Date(isoString)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMins = Math.floor(diffMs / 60000)\n\n if (diffMins < 1) {\n return 'Just now'\n } else if (diffMins < 60) {\n return `${diffMins}m ago`\n } else if (diffMins < 1440) {\n return `${Math.floor(diffMins / 60)}h ago`\n } else {\n return date.toLocaleDateString()\n }\n }\n\n /**\n * Public method to add messages from outside\n */\n addMessages(messages: Message[]) {\n this.setState((prevState) => {\n // Filter out duplicates\n const existingIds = new Set(prevState.messages.map((m) => m.id))\n const newMessages = messages.filter((m) => !existingIds.has(m.id))\n\n if (newMessages.length > 0) {\n return {\n messages: [...prevState.messages, ...newMessages],\n }\n }\n return null\n })\n }\n\n /**\n * Public method to show the widget\n */\n show() {\n this.setState({ state: 'open' })\n }\n\n /**\n * Public method to hide the widget\n */\n hide() {\n this.setState({ state: 'closed' })\n }\n\n /**\n * Public method to close the widget completely\n */\n close() {\n this.setState({ state: 'closed' })\n }\n\n /**\n * Get user traits (either provided via form or from props)\n */\n getUserTraits(): UserProvidedTraits | null {\n return this.state.userTraits\n }\n\n /**\n * Called when user identifies via posthog.identify()\n * Hides the identification form since we now know who they are\n */\n setUserIdentified(): void {\n if (this.state.showIdentificationForm) {\n this.setState({ showIdentificationForm: false })\n }\n }\n\n /**\n * Set the unread message count (called by manager)\n */\n setUnreadCount(count: number): void {\n this.setState({ unreadCount: count })\n }\n\n private _renderIdentificationForm(styles: ReturnType<typeof getStyles>) {\n const { config } = this.props\n const { formName, formEmail, formEmailError } = this.state\n\n const title = config.identificationFormTitle || 'Before we start...'\n const description =\n config.identificationFormDescription || 'Please provide your details so we can help you better.'\n const showNameField = config.collectName !== false // Show by default unless explicitly disabled\n\n return (\n <div style={styles.identificationForm}>\n <div style={styles.formTitle}>{title}</div>\n <div style={styles.formDescription}>{description}</div>\n\n <form onSubmit={this._handleFormSubmit}>\n {showNameField && (\n <div style={styles.formField}>\n <label style={styles.formLabel}>\n Name <span style={styles.formOptional}>(optional)</span>\n </label>\n <input\n type=\"text\"\n style={styles.formInput}\n value={formName}\n onInput={this._handleFormNameChange}\n placeholder=\"Your name\"\n autoComplete=\"name\"\n />\n </div>\n )}\n\n <div style={styles.formField}>\n <label style={styles.formLabel}>\n Email {!config.requireEmail && <span style={styles.formOptional}>(optional)</span>}\n </label>\n <input\n type=\"email\"\n style={{\n ...styles.formInput,\n ...(formEmailError ? styles.formInputError : {}),\n }}\n value={formEmail}\n onInput={this._handleFormEmailChange}\n placeholder=\"you@example.com\"\n autoComplete=\"email\"\n />\n {formEmailError && <div style={styles.formError}>{formEmailError}</div>}\n </div>\n\n <button\n type=\"submit\"\n style={styles.formSubmitButton}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '0.9'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '1'\n }}\n >\n Start Chat\n </button>\n </form>\n </div>\n )\n }\n\n private _renderMessage(message: Message, styles: ReturnType<typeof getStyles>, primaryColor: string) {\n const isCustomer = message.author_type === 'customer'\n const messageStyle = {\n ...styles.message,\n ...(isCustomer ? styles.messageCustomer : styles.messageAgent),\n }\n const contentStyle = {\n ...styles.messageContent,\n ...(isCustomer ? styles.messageContentCustomer : styles.messageContentAgent),\n }\n\n return (\n <div key={message.id} style={messageStyle}>\n {!isCustomer && message.author_name && <div style={styles.messageAuthor}>{message.author_name}</div>}\n <div style={contentStyle}>\n <RichContent\n richContent={message.rich_content}\n content={message.content}\n isCustomer={isCustomer}\n primaryColor={primaryColor}\n />\n </div>\n <div style={styles.messageTime}>{this._formatTime(message.created_at)}</div>\n </div>\n )\n }\n\n render() {\n const { config } = this.props\n const { state, messages, inputValue, isLoading, error, showIdentificationForm } = this.state\n const primaryColor = config.color || '#5375ff'\n const widgetPosition = config.widgetPosition || 'bottom_right'\n const placeholderText = config.placeholderText || 'Type your message...'\n const styles = getStyles(primaryColor, widgetPosition)\n\n // Button only (closed state)\n if (state === 'closed') {\n return (\n <OpenChatButton\n primaryColor={primaryColor}\n position={widgetPosition}\n handleToggleOpen={this._handleToggleOpen}\n unreadCount={this.state.unreadCount}\n />\n )\n }\n\n // Open state\n const windowStyle = {\n ...styles.window,\n ...styles.windowOpen,\n }\n\n return (\n <div style={styles.widget}>\n <div style={windowStyle}>\n {/* Header */}\n <div style={styles.header}>\n <div style={styles.headerTitle}>\n <span>Support Chat</span>\n </div>\n <div style={styles.headerActions}>\n <CloseChatButton primaryColor={primaryColor} handleClose={this._handleClose} />\n </div>\n </div>\n\n {/* Show identification form if needed, otherwise show chat */}\n {showIdentificationForm ? (\n this._renderIdentificationForm(styles)\n ) : (\n <>\n <div style={styles.messages}>\n {messages.map((message) => this._renderMessage(message, styles, primaryColor))}\n <div\n ref={(el) => {\n this._messagesEndRef = el\n }}\n />\n </div>\n\n {/* Error message */}\n {error && <div style={styles.error}>{error}</div>}\n\n {/* Input */}\n <div style={styles.inputContainer}>\n <textarea\n ref={(el) => {\n this._inputRef = el\n }}\n style={styles.input}\n placeholder={placeholderText}\n value={inputValue}\n onInput={this._handleInputChange}\n onKeyPress={this._handleKeyPress}\n rows={1}\n disabled={isLoading}\n />\n <SendMessageButton\n primaryColor={primaryColor}\n inputValue={inputValue}\n isLoading={isLoading}\n handleSendMessage={this._handleSendMessage}\n />\n </div>\n </>\n )}\n </div>\n </div>\n )\n }\n}\n","import { Breaker, Properties } from '../types'\nimport { nativeForEach, nativeIndexOf } from './globals'\nimport { logger } from './logger'\nimport { isFormData, isNull, isNullish, isNumber, isString, hasOwnProperty, isArray } from '@posthog/core'\n\nconst breaker: Breaker = {}\n\nexport function eachArray<E = any>(\n obj: E[] | null | undefined,\n iterator: (value: E, key: number) => void | Breaker,\n thisArg?: any\n): void {\n if (isArray(obj)) {\n if (nativeForEach && obj.forEach === nativeForEach) {\n obj.forEach(iterator, thisArg)\n } else if ('length' in obj && obj.length === +obj.length) {\n for (let i = 0, l = obj.length; i < l; i++) {\n if (i in obj && iterator.call(thisArg, obj[i], i) === breaker) {\n return\n }\n }\n }\n }\n}\n\n/**\n * @param {*=} obj\n * @param {function(...*)=} iterator\n * @param {Object=} thisArg\n */\nexport function each(obj: any, iterator: (value: any, key: any) => void | Breaker, thisArg?: any): void {\n if (isNullish(obj)) {\n return\n }\n if (isArray(obj)) {\n return eachArray(obj, iterator, thisArg)\n }\n if (isFormData(obj)) {\n for (const pair of obj.entries()) {\n if (iterator.call(thisArg, pair[1], pair[0]) === breaker) {\n return\n }\n }\n return\n }\n for (const key in obj) {\n if (hasOwnProperty.call(obj, key)) {\n if (iterator.call(thisArg, obj[key], key) === breaker) {\n return\n }\n }\n }\n}\n\nexport const extend = function (obj: Record<string, any>, ...args: Record<string, any>[]): Record<string, any> {\n eachArray(args, function (source) {\n for (const prop in source) {\n if (source[prop] !== void 0) {\n obj[prop] = source[prop]\n }\n }\n })\n return obj\n}\n\nexport const extendArray = function <T>(obj: T[], ...args: T[][]): T[] {\n eachArray(args, function (source) {\n eachArray(source, function (item) {\n obj.push(item)\n })\n })\n return obj\n}\n\nexport const include = function (\n obj: null | string | Array<any> | Record<string, any>,\n target: any\n): boolean | Breaker {\n let found = false\n if (isNull(obj)) {\n return found\n }\n if (nativeIndexOf && obj.indexOf === nativeIndexOf) {\n return obj.indexOf(target) != -1\n }\n each(obj, function (value) {\n if (found || (found = value === target)) {\n return breaker\n }\n return\n })\n return found\n}\n\n/**\n * Object.entries() polyfill\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries\n */\nexport function entries<T = any>(obj: Record<string, T>): [string, T][] {\n const ownProps = Object.keys(obj)\n let i = ownProps.length\n const resArray = new Array(i) // preallocate the Array\n\n while (i--) {\n resArray[i] = [ownProps[i], obj[ownProps[i]]]\n }\n return resArray\n}\n\nexport const trySafe = function <T>(fn: () => T): T | undefined {\n try {\n return fn()\n } catch {\n return undefined\n }\n}\n\nexport const safewrap = function <F extends (...args: any[]) => any = (...args: any[]) => any>(f: F): F {\n return function (...args) {\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return f.apply(this, args)\n } catch (e) {\n logger.critical(\n 'Implementation error. Please turn on debug mode and open a ticket on https://app.posthog.com/home#panel=support%3Asupport%3A.'\n )\n logger.critical(e)\n }\n } as F\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const safewrapClass = function (klass: Function, functions: string[]): void {\n for (let i = 0; i < functions.length; i++) {\n klass.prototype[functions[i]] = safewrap(klass.prototype[functions[i]])\n }\n}\n\nexport const stripEmptyProperties = function (p: Properties): Properties {\n const ret: Properties = {}\n each(p, function (v, k) {\n if ((isString(v) && v.length > 0) || isNumber(v)) {\n ret[k] = v\n }\n })\n return ret\n}\n\n/**\n * Deep copies an object.\n * It handles cycles by replacing all references to them with `undefined`\n * Also supports customizing native values\n *\n * @param value\n * @param customizer\n * @returns {{}|undefined|*}\n */\nfunction deepCircularCopy<T extends Record<string, any> = Record<string, any>>(\n value: T,\n customizer?: <K extends keyof T = keyof T>(value: T[K], key?: K) => T[K]\n): T | undefined {\n const COPY_IN_PROGRESS_SET = new Set()\n\n function internalDeepCircularCopy(value: T, key?: string): T | undefined {\n if (value !== Object(value)) return customizer ? customizer(value as any, key) : value // primitive value\n\n if (COPY_IN_PROGRESS_SET.has(value)) return undefined\n COPY_IN_PROGRESS_SET.add(value)\n let result: T\n\n if (isArray(value)) {\n result = [] as any as T\n eachArray(value, (it) => {\n result.push(internalDeepCircularCopy(it))\n })\n } else {\n result = {} as T\n each(value, (val, key) => {\n if (!COPY_IN_PROGRESS_SET.has(val)) {\n ;(result as any)[key] = internalDeepCircularCopy(val, key)\n }\n })\n }\n return result\n }\n return internalDeepCircularCopy(value)\n}\n\nexport function _copyAndTruncateStrings<T extends Record<string, any> = Record<string, any>>(\n object: T,\n maxStringLength: number | null\n): T {\n return deepCircularCopy(object, (value: any) => {\n if (isString(value) && !isNull(maxStringLength)) {\n return (value as string).slice(0, maxStringLength)\n }\n return value\n }) as T\n}\n\n// NOTE: Update PostHogConfig docs if you change this list\n// We will not try to catch all bullets here, but we should make an effort to catch the most common ones\n// You should be highly against adding more to this list, because ultimately customers can configure\n// their `cross_subdomain_cookie` setting to anything they want.\nconst EXCLUDED_FROM_CROSS_SUBDOMAIN_COOKIE = ['herokuapp.com', 'vercel.app', 'netlify.app']\nexport function isCrossDomainCookie(documentLocation: Location | undefined) {\n const hostname = documentLocation?.hostname\n\n if (!isString(hostname)) {\n return false\n }\n // split and slice isn't a great way to match arbitrary domains,\n // but it's good enough for ensuring we only match herokuapp.com when it is the TLD\n // for the hostname\n const lastTwoParts = hostname.split('.').slice(-2).join('.')\n\n for (const excluded of EXCLUDED_FROM_CROSS_SUBDOMAIN_COOKIE) {\n if (lastTwoParts === excluded) {\n return false\n }\n }\n\n return true\n}\n\nexport function find<T>(value: T[], predicate: (value: T) => boolean): T | undefined {\n for (let i = 0; i < value.length; i++) {\n if (predicate(value[i])) {\n return value[i]\n }\n }\n return undefined\n}\n\n// Use this instead of element.addEventListener to avoid eslint errors\n// this properly implements the default options for passive event listeners\nexport function addEventListener(\n element: Window | Document | Element | undefined,\n event: string,\n callback: EventListener,\n options?: AddEventListenerOptions\n): void {\n const { capture = false, passive = true } = options ?? {}\n\n // This is the only place where we are allowed to call this function\n // because the whole idea is that we should be calling this instead of the built-in one\n // eslint-disable-next-line posthog-js/no-add-event-listener\n element?.addEventListener(event, callback, { capture, passive })\n}\n\n/**\n * Helper to migrate deprecated config fields to new field names with appropriate warnings\n * @param config - The config object to check\n * @param newField - The new field name to use\n * @param oldField - The deprecated field name to check for\n * @param defaultValue - The default value if neither field is set\n * @param loggerInstance - Optional logger instance for deprecation warnings\n * @returns The value to use (new field takes precedence over old field)\n */\nexport function migrateConfigField<T>(\n config: Record<string, any>,\n newField: string,\n oldField: string,\n defaultValue: T,\n loggerInstance?: { warn: (message: string) => void }\n): T {\n const hasNewField = newField in config && !isNullish(config[newField])\n const hasOldField = oldField in config && !isNullish(config[oldField])\n\n if (hasNewField) {\n return config[newField]\n }\n\n if (hasOldField) {\n if (loggerInstance) {\n loggerInstance.warn(\n `Config field '${oldField}' is deprecated. Please use '${newField}' instead. ` +\n `The old field will be removed in a future major version.`\n )\n }\n return config[oldField]\n }\n\n return defaultValue\n}\n","import { each } from './'\n\nimport { isArray, isFile, isUndefined } from '@posthog/core'\nimport { logger } from './logger'\nimport { document } from './globals'\n\nconst localDomains = ['localhost', '127.0.0.1']\n\n/**\n * IE11 doesn't support `new URL`\n * so we can create an anchor element and use that to parse the URL\n * there's a lot of overlap between HTMLHyperlinkElementUtils and URL\n * meaning useful properties like `pathname` are available on both\n */\nexport const convertToURL = (url: string): HTMLAnchorElement | null => {\n const location = document?.createElement('a')\n if (isUndefined(location)) {\n return null\n }\n\n location.href = url\n return location\n}\n\nexport const formDataToQuery = function (formdata: Record<string, any> | FormData, arg_separator = '&'): string {\n let use_val: string\n let use_key: string\n const tph_arr: string[] = []\n\n each(formdata, function (val: File | string | undefined, key: string | undefined) {\n // the key might be literally the string undefined for e.g. if {undefined: 'something'}\n if (isUndefined(val) || isUndefined(key) || key === 'undefined') {\n return\n }\n\n use_val = encodeURIComponent(isFile(val) ? val.name : val.toString())\n use_key = encodeURIComponent(key)\n tph_arr[tph_arr.length] = use_key + '=' + use_val\n })\n\n return tph_arr.join(arg_separator)\n}\n\n// NOTE: Once we get rid of IE11/op_mini we can start using URLSearchParams\nexport const getQueryParam = function (url: string, param: string): string {\n const withoutHash: string = url.split('#')[0] || ''\n\n // Split only on the first ? to sort problem out for those with multiple ?s\n // and then remove them\n const queryParams: string = withoutHash.split(/\\?(.*)/)[1] || ''\n const cleanedQueryParams = queryParams.replace(/^\\?+/g, '')\n\n const queryParts = cleanedQueryParams.split('&')\n let keyValuePair\n\n for (let i = 0; i < queryParts.length; i++) {\n const parts = queryParts[i].split('=')\n if (parts[0] === param) {\n keyValuePair = parts\n break\n }\n }\n\n if (!isArray(keyValuePair) || keyValuePair.length < 2) {\n return ''\n } else {\n let result = keyValuePair[1]\n try {\n result = decodeURIComponent(result)\n } catch {\n logger.error('Skipping decoding for malformed query param: ' + result)\n }\n return result.replace(/\\+/g, ' ')\n }\n}\n\n// replace any query params in the url with the provided mask value. Tries to keep the URL as instant as possible,\n// including preserving malformed text in most cases\nexport const maskQueryParams = function <T extends string | undefined>(\n url: T,\n maskedParams: string[] | undefined,\n mask: string\n): T extends string ? string : undefined {\n if (!url || !maskedParams || !maskedParams.length) {\n return url as any\n }\n\n const splitHash = url.split('#')\n const withoutHash: string = splitHash[0] || ''\n const hash = splitHash[1]\n\n const splitQuery: string[] = withoutHash.split('?')\n const queryString: string = splitQuery[1]\n const urlWithoutQueryAndHash: string = splitQuery[0]\n const queryParts = (queryString || '').split('&')\n\n // use an array of strings rather than an object to preserve ordering and duplicates\n const paramStrings: string[] = []\n\n for (let i = 0; i < queryParts.length; i++) {\n const keyValuePair = queryParts[i].split('=')\n if (!isArray(keyValuePair)) {\n continue\n } else if (maskedParams.includes(keyValuePair[0])) {\n paramStrings.push(keyValuePair[0] + '=' + mask)\n } else {\n paramStrings.push(queryParts[i])\n }\n }\n\n let result = urlWithoutQueryAndHash\n if (queryString != null) {\n result += '?' + paramStrings.join('&')\n }\n if (hash != null) {\n result += '#' + hash\n }\n\n return result as any\n}\n\nexport const _getHashParam = function (hash: string, param: string): string | null {\n const matches = hash.match(new RegExp(param + '=([^&]*)'))\n return matches ? matches[1] : null\n}\n\nexport const isLocalhost = (): boolean => {\n return localDomains.includes(location.hostname)\n}\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { render, h } from 'preact'\nimport { isNumber } from '@posthog/core'\nimport {\n ConversationsRemoteConfig,\n ConversationsWidgetState,\n UserProvidedTraits,\n SendMessageResponse,\n SendMessagePayload,\n GetMessagesResponse,\n MarkAsReadResponse,\n GetTicketsOptions,\n GetTicketsResponse,\n} from '../../../posthog-conversations-types'\nimport { PostHog } from '../../../posthog-core'\nimport { ConversationsManager as ConversationsManagerInterface } from '../posthog-conversations'\nimport { ConversationsPersistence } from './persistence'\nimport { ConversationsWidget } from './components/ConversationsWidget'\nimport { createLogger } from '../../../utils/logger'\nimport { document, window } from '../../../utils/globals'\nimport { formDataToQuery } from '../../../utils/request-utils'\n\nconst logger = createLogger('[ConversationsManager]')\n\nconst WIDGET_CONTAINER_ID = 'ph-conversations-widget-container'\nconst POLL_INTERVAL_MS = 5000 // 5 seconds\n\n/**\n * Extract hostname from a domain string (handles URLs and plain hostnames)\n */\nfunction extractHostname(domain: string): string | null {\n // Remove protocol if present\n let hostname = domain.replace(/^https?:\\/\\//, '')\n // Remove path, query, port if present\n hostname = hostname.split('/')[0].split('?')[0].split(':')[0]\n return hostname || null\n}\n\n/**\n * Check if the current domain matches the allowed domains list.\n * Returns true if:\n * - domains is empty or not present (no restriction)\n * - current hostname matches any allowed domain\n */\nfunction isCurrentDomainAllowed(domains: string[] | undefined): boolean {\n // No domain restriction - allow all\n if (!domains || domains.length === 0) {\n return true\n }\n\n const currentHostname = window?.location?.hostname\n if (!currentHostname) {\n // Can't determine hostname (SSR, etc.) - allow by default\n return true\n }\n\n return domains.some((domain) => {\n const allowedHostname = extractHostname(domain)\n if (!allowedHostname) {\n return false\n }\n\n if (allowedHostname.startsWith('*.')) {\n // Wildcard match: *.example.com matches foo.example.com and example.com\n const pattern = allowedHostname.slice(2) // Remove \"*.\"\n return currentHostname.endsWith(`.${pattern}`) || currentHostname === pattern\n }\n\n // Exact match\n return currentHostname === allowedHostname\n })\n}\n\nexport class ConversationsManager implements ConversationsManagerInterface {\n private _config: ConversationsRemoteConfig\n private _persistence: ConversationsPersistence\n private _widgetRef: ConversationsWidget | null = null\n private _containerElement: HTMLDivElement | null = null\n private _currentTicketId: string | null = null\n private _pollIntervalId: number | null = null\n private _lastMessageTimestamp: string | null = null\n private _isPolling: boolean = false\n private _unsubscribeIdentifyListener: (() => void) | null = null\n private _unreadCount: number = 0\n // SECURITY: widget_session_id is the key for access control\n // This is a random UUID that only this browser knows\n private _widgetSessionId: string\n private _isWidgetEnabled: boolean\n private _isDomainAllowed: boolean\n private _isWidgetRendered: boolean = false\n\n constructor(\n config: ConversationsRemoteConfig,\n private readonly _posthog: PostHog\n ) {\n this._config = config\n this._persistence = new ConversationsPersistence(_posthog)\n // Get or create widget_session_id - this stays the same even when user identifies\n this._widgetSessionId = this._persistence.getOrCreateWidgetSessionId()\n\n // Determine if widget should be shown based on config and domain\n this._isWidgetEnabled = config.widgetEnabled === true\n this._isDomainAllowed = isCurrentDomainAllowed(config.domains)\n\n logger.info('ConversationsManager initialized', {\n config,\n widgetSessionId: this._widgetSessionId,\n isWidgetEnabled: this._isWidgetEnabled,\n isDomainAllowed: this._isDomainAllowed,\n })\n\n this._initialize()\n }\n\n /**\n * Send a message programmatically via the API\n * Creates a new ticket if none exists or if newTicket is true\n *\n * @param message - The message text to send\n * @param userTraits - Optional user identification data (name, email)\n * @param newTicket - If true, forces creation of a new ticket (ignores current ticket)\n * @returns Promise with the response including ticket_id and message_id\n */\n async sendMessage(\n message: string,\n userTraits?: UserProvidedTraits,\n newTicket?: boolean\n ): Promise<SendMessageResponse> {\n // Determine which ticket to use\n // If newTicket is true, force creation of new ticket by sending null\n // Otherwise use current ticket ID (which may be null if no ticket exists yet)\n const ticketId = newTicket ? null : this._currentTicketId\n\n // Track if this is creating a new ticket\n const isNewTicket = !ticketId\n\n const token = this._config.token\n\n // eslint-disable-next-line compat/compat\n return new Promise((resolve, reject) => {\n const distinctId = this._posthog.get_distinct_id()\n const personProperties = this._posthog.persistence?.props || {}\n\n // Priority for traits:\n // 1. User-provided traits from the widget form\n // 2. PostHog person properties\n const name = userTraits?.name || personProperties.$name || personProperties.name || null\n const email = userTraits?.email || personProperties.$email || personProperties.email || null\n\n const payload: Partial<SendMessagePayload> = {\n widget_session_id: this._widgetSessionId,\n // distinct_id is only used for Person linking, not access control\n distinct_id: distinctId,\n message: message.trim(),\n traits: {\n name,\n email,\n },\n ticket_id: ticketId,\n }\n\n try {\n // Capture session ID - sent with every message\n const capturedSessionId = this._posthog.get_session_id()\n if (capturedSessionId) {\n payload.session_id = capturedSessionId\n }\n\n // Capture session replay URL with timestamp - sent with every message\n const replayUrl = this._posthog.get_session_replay_url({\n withTimestamp: true,\n timestampLookBack: 30,\n })\n\n // Capture current URL - only for new tickets to record where user started\n const currentUrl = isNewTicket ? window?.location?.href : undefined\n\n if (replayUrl || currentUrl) {\n payload.session_context = {\n session_replay_url: replayUrl || undefined,\n current_url: currentUrl || undefined,\n }\n }\n } catch (error) {\n // Log error but don't fail message sending\n logger.warn('Failed to capture session context', error)\n }\n\n this._posthog._send_request({\n url: this._posthog.requestRouter.endpointFor('api', '/api/conversations/v1/widget/message'),\n method: 'POST',\n data: payload,\n headers: {\n 'X-Conversations-Token': token,\n },\n callback: (response) => {\n if (response.statusCode === 429) {\n reject(new Error('Too many requests. Please wait before trying again.'))\n return\n }\n\n if (response.statusCode !== 200 && response.statusCode !== 201) {\n const errorMsg = response.json?.detail || response.json?.message || 'Failed to send message'\n logger.error('Failed to send message', { status: response.statusCode })\n reject(new Error(errorMsg))\n return\n }\n\n if (!response.json) {\n reject(new Error('Invalid response from server'))\n return\n }\n\n const data = response.json as SendMessageResponse\n\n // Update current ticket ID if this was a new ticket\n // This happens when: 1) No ticket existed, or 2) User forced new ticket creation\n if (isNewTicket && data.ticket_id) {\n this._currentTicketId = data.ticket_id\n this._persistence.saveTicketId(data.ticket_id)\n logger.info('New ticket created', {\n ticketId: data.ticket_id,\n forced: newTicket === true,\n })\n }\n\n // Track message sent\n this._posthog.capture('$conversations_message_sent', {\n ticketId: data.ticket_id,\n isNewTicket: isNewTicket,\n messageLength: message.length,\n })\n\n // Update last message timestamp\n this._lastMessageTimestamp = data.created_at\n\n resolve(data)\n },\n })\n })\n }\n\n /**\n * Switch to a different ticket if an explicit ticketId is provided\n * This ensures subsequent operations (sendMessage, etc.) use the correct ticket\n */\n private _switchToTicketIfNeeded(ticketId: string | undefined): void {\n if (ticketId && ticketId !== this._currentTicketId) {\n this._currentTicketId = ticketId\n this._persistence.saveTicketId(ticketId)\n // Reset last message timestamp when switching tickets\n this._lastMessageTimestamp = null\n }\n }\n\n /** Fetch messages via the API */\n async getMessages(ticketId?: string, after?: string): Promise<GetMessagesResponse> {\n // Use provided ticketId or fall back to current ticket\n const targetTicketId = ticketId || this._currentTicketId\n\n if (!targetTicketId) {\n throw new Error('No ticket ID provided and no active conversation')\n }\n\n // Switch to this ticket if explicitly provided\n this._switchToTicketIfNeeded(ticketId)\n\n const token = this._config.token\n\n // eslint-disable-next-line compat/compat\n return new Promise((resolve, reject) => {\n // SECURITY: widget_session_id is required for access control\n // distinct_id is NOT sent for getMessages - access is controlled by widget_session_id only\n const queryParams: Record<string, string> = {\n widget_session_id: this._widgetSessionId,\n limit: '50',\n }\n\n if (after) {\n queryParams.after = after\n }\n\n this._posthog._send_request({\n url: this._posthog.requestRouter.endpointFor(\n 'api',\n `/api/conversations/v1/widget/messages/${targetTicketId}?${formDataToQuery(queryParams)}`\n ),\n method: 'GET',\n headers: {\n 'X-Conversations-Token': token,\n },\n callback: (response) => {\n if (response.statusCode === 429) {\n reject(new Error('Too many requests. Please wait before trying again.'))\n return\n }\n\n if (response.statusCode !== 200) {\n const errorMsg = response.json?.detail || response.json?.message || 'Failed to fetch messages'\n logger.error('Failed to fetch messages', { status: response.statusCode })\n reject(new Error(errorMsg))\n return\n }\n\n if (!response.json) {\n reject(new Error('Invalid response from server'))\n return\n }\n\n const data = response.json as GetMessagesResponse\n resolve(data)\n },\n })\n })\n }\n\n /** Mark messages as read via the API */\n async markAsRead(ticketId?: string): Promise<MarkAsReadResponse> {\n // Use provided ticketId or fall back to current ticket\n const targetTicketId = ticketId || this._currentTicketId\n\n if (!targetTicketId) {\n throw new Error('No ticket ID provided and no active conversation')\n }\n\n // Switch to this ticket if explicitly provided\n this._switchToTicketIfNeeded(ticketId)\n\n const token = this._config.token\n\n logger.info('Marking messages as read', { ticketId: targetTicketId })\n\n // eslint-disable-next-line compat/compat\n return new Promise((resolve, reject) => {\n this._posthog._send_request({\n url: this._posthog.requestRouter.endpointFor(\n 'api',\n `/api/conversations/v1/widget/messages/${targetTicketId}/read`\n ),\n method: 'POST',\n data: {\n widget_session_id: this._widgetSessionId,\n },\n headers: {\n 'X-Conversations-Token': token,\n },\n callback: (response) => {\n if (response.statusCode === 429) {\n reject(new Error('Too many requests. Please wait before trying again.'))\n return\n }\n\n if (response.statusCode !== 200) {\n const errorMsg =\n response.json?.detail || response.json?.message || 'Failed to mark messages as read'\n logger.error('Failed to mark messages as read', { status: response.statusCode })\n reject(new Error(errorMsg))\n return\n }\n\n if (!response.json) {\n reject(new Error('Invalid response from server'))\n return\n }\n\n const data = response.json as MarkAsReadResponse\n resolve(data)\n },\n })\n })\n }\n\n /**\n * Initialize the conversations manager.\n * Always initializes persistence and event listeners for API usage.\n * Only renders the widget if widgetEnabled is true AND domain is allowed.\n */\n private _initialize(): void {\n if (!document || !window) {\n logger.info('Conversations not available: Document or window not available')\n return\n }\n\n // Load any existing ticket ID from localStorage\n this._currentTicketId = this._persistence.loadTicketId()\n logger.info('Loaded ticket ID from storage', { ticketId: this._currentTicketId })\n\n // Track conversations API loaded (separate from widget loaded)\n this._posthog.capture('$conversations_loaded', {\n hasExistingTicket: !!this._currentTicketId,\n widgetEnabled: this._isWidgetEnabled,\n domainAllowed: this._isDomainAllowed,\n })\n\n // Only render widget if both widgetEnabled and domain is allowed\n if (this._isWidgetEnabled && this._isDomainAllowed) {\n this._initializeWidget()\n } else {\n logger.info('Widget not rendered', {\n widgetEnabled: this._isWidgetEnabled,\n domainAllowed: this._isDomainAllowed,\n })\n }\n\n // Listen for identify events to hide identification form when user identifies\n this._setupIdentifyListener()\n }\n\n /**\n * Initialize and render the widget UI\n */\n private _initializeWidget(): void {\n if (this._isWidgetRendered) {\n return // Already rendered\n }\n\n const savedState = this._persistence.loadWidgetState()\n let initialState: ConversationsWidgetState = 'closed'\n if (savedState === 'open') {\n initialState = 'open'\n }\n\n // Get initial user traits (from PostHog person properties or saved)\n const initialUserTraits = this._getInitialUserTraits()\n\n // Render the widget\n this._renderWidget(initialState, initialUserTraits)\n this._isWidgetRendered = true\n\n // Track widget initialization\n this._posthog.capture('$conversations_widget_loaded', {\n hasExistingTicket: !!this._currentTicketId,\n initialState: initialState,\n hasUserTraits: !!initialUserTraits,\n })\n\n // Set up polling and load messages only when widget is rendered\n // If we have a ticket, load its messages\n if (this._currentTicketId) {\n this._loadMessages()\n }\n\n // Start polling for messages to keep widget UI updated\n this._startPolling()\n }\n\n /**\n * Get initial user traits from PostHog or localStorage\n */\n private _getInitialUserTraits(): UserProvidedTraits | null {\n // First, check PostHog's person properties\n const personProperties = this._posthog.persistence?.props || {}\n const posthogName = personProperties.$name || personProperties.name\n const posthogEmail = personProperties.$email || personProperties.email\n\n // If we have traits from PostHog, use those\n if (posthogName || posthogEmail) {\n return {\n name: posthogName || undefined,\n email: posthogEmail || undefined,\n }\n }\n\n // Otherwise, check localStorage for previously saved traits\n const savedTraits = this._persistence.loadUserTraits()\n if (savedTraits && (savedTraits.name || savedTraits.email)) {\n return savedTraits\n }\n\n return null\n }\n\n /**\n * Handle user identification from the widget form\n */\n private _handleIdentify = (traits: UserProvidedTraits): void => {\n // Save traits to localStorage\n this._persistence.saveUserTraits(traits)\n\n // Track identification\n this._posthog.capture('$conversations_user_identified', {\n hasName: !!traits.name,\n hasEmail: !!traits.email,\n })\n }\n\n /**\n * Handle sending a message from the widget\n */\n private _handleSendMessage = async (message: string): Promise<void> => {\n // Get user traits from the widget\n const userTraits = this._widgetRef?.getUserTraits() || undefined\n\n try {\n // Call the public API method (which handles tracking and state updates)\n await this.sendMessage(message, userTraits)\n\n // Poll for response immediately\n setTimeout(() => this._pollMessages(), 1000)\n } catch (error) {\n logger.error('Failed to send message', error)\n throw error\n }\n }\n\n /**\n * Handle widget state changes\n */\n private _handleStateChange = (state: ConversationsWidgetState): void => {\n logger.info('Widget state changed', { state })\n\n // Track state changes\n this._posthog.capture('$conversations_widget_state_changed', {\n state: state,\n ticketId: this._currentTicketId,\n })\n\n // Save state to localStorage\n this._persistence.saveWidgetState(state)\n\n // Mark messages as read when widget opens\n if (state === 'open') {\n if (this._unreadCount > 0 && this._currentTicketId) {\n this._markMessagesAsRead()\n }\n }\n }\n\n /**\n * Mark messages as read\n */\n private async _markMessagesAsRead(): Promise<void> {\n if (!this._currentTicketId) {\n return\n }\n\n try {\n const response = await this.markAsRead(this._currentTicketId || undefined)\n this._unreadCount = response.unread_count\n // Update the widget to reflect the new unread count\n this._widgetRef?.setUnreadCount(0)\n logger.info('Messages marked as read', { unreadCount: response.unread_count })\n } catch (error) {\n logger.error('Failed to mark messages as read', error)\n }\n }\n\n /**\n * Load messages for the current ticket\n */\n private async _loadMessages(): Promise<void> {\n if (!this._currentTicketId) {\n return\n }\n\n try {\n const response = await this.getMessages(\n this._currentTicketId || undefined,\n this._lastMessageTimestamp || undefined\n )\n\n // Update unread count from response\n if (isNumber(response.unread_count)) {\n this._unreadCount = response.unread_count\n this._widgetRef?.setUnreadCount(response.unread_count)\n\n // If widget is open and there are unread messages, mark them as read\n if (response.unread_count > 0 && this._isWidgetOpen()) {\n this._markMessagesAsRead()\n }\n }\n\n if (response.messages.length > 0) {\n this._widgetRef?.addMessages(response.messages)\n // Update last message timestamp\n const lastMessage = response.messages[response.messages.length - 1]\n this._lastMessageTimestamp = lastMessage.created_at\n }\n } catch (error) {\n logger.error('Failed to load messages', error)\n }\n }\n\n /**\n * Check if the widget is currently open\n */\n private _isWidgetOpen(): boolean {\n return this._persistence.loadWidgetState() === 'open'\n }\n\n /**\n * Poll for new messages\n */\n private _pollMessages = async (): Promise<void> => {\n if (this._isPolling || !this._currentTicketId) {\n return\n }\n\n this._isPolling = true\n try {\n await this._loadMessages()\n } finally {\n this._isPolling = false\n }\n }\n\n /**\n * Start polling for new messages\n */\n private _startPolling(): void {\n if (this._pollIntervalId) {\n return // Already polling\n }\n\n // Poll immediately\n this._pollMessages()\n\n // Set up interval\n this._pollIntervalId = window?.setInterval(() => {\n this._pollMessages()\n }, POLL_INTERVAL_MS) as unknown as number\n\n logger.info('Started polling for messages')\n }\n\n /**\n * Stop polling for new messages\n */\n private _stopPolling(): void {\n if (this._pollIntervalId) {\n window?.clearInterval(this._pollIntervalId)\n this._pollIntervalId = null\n logger.info('Stopped polling for messages')\n }\n }\n\n /**\n * Setup listener for identify events.\n * When user calls posthog.identify(), hide the identification form\n * since we now know who they are.\n */\n private _setupIdentifyListener(): void {\n this._unsubscribeIdentifyListener = this._posthog.on('eventCaptured', (event: any) => {\n if (event.event === '$identify') {\n // User just identified - hide the identification form if it's showing\n this._widgetRef?.setUserIdentified()\n }\n })\n }\n\n /**\n * Show the widget (render it to DOM).\n * The widget respects its saved state (open/closed).\n * Note: Domain restrictions still apply - widget won't render on disallowed domains.\n */\n show(): void {\n // Check domain restrictions - don't render on disallowed domains\n if (!this._isDomainAllowed) {\n logger.warn('Cannot show widget: current domain is not allowed')\n return\n }\n\n // If widget isn't rendered yet, render it now\n if (!this._isWidgetRendered) {\n this._initializeWidget()\n }\n }\n\n /**\n * Hide and remove the widget from the DOM.\n * Conversation data is preserved - call show() to re-render.\n */\n hide(): void {\n // Stop polling when widget is hidden (save resources)\n this._stopPolling()\n\n if (this._containerElement) {\n render(null, this._containerElement)\n this._containerElement.remove()\n this._containerElement = null\n }\n this._widgetRef = null\n this._isWidgetRendered = false\n\n // Reset timestamp so show() will re-fetch all messages\n this._lastMessageTimestamp = null\n }\n\n /**\n * Check if the widget is currently visible (rendered in DOM)\n */\n isVisible(): boolean {\n return this._isWidgetRendered\n }\n\n /** Get tickets list for the current widget session */\n async getTickets(options?: GetTicketsOptions): Promise<GetTicketsResponse> {\n const token = this._config.token\n\n const queryParams: Record<string, string> = {\n widget_session_id: this._widgetSessionId,\n limit: String(options?.limit ?? 20),\n offset: String(options?.offset ?? 0),\n }\n\n if (options?.status) {\n queryParams.status = options.status\n }\n\n // eslint-disable-next-line compat/compat\n return new Promise((resolve, reject) => {\n this._posthog._send_request({\n url: this._posthog.requestRouter.endpointFor(\n 'api',\n `/api/conversations/v1/widget/tickets?${formDataToQuery(queryParams)}`\n ),\n method: 'GET',\n headers: {\n 'X-Conversations-Token': token,\n },\n callback: (response) => {\n if (response.statusCode === 429) {\n reject(new Error('Too many requests. Please wait before trying again.'))\n return\n }\n\n if (response.statusCode !== 200) {\n const errorMsg = response.json?.detail || response.json?.message || 'Failed to fetch tickets'\n logger.error('Failed to fetch tickets', { status: response.statusCode })\n reject(new Error(errorMsg))\n return\n }\n\n if (!response.json) {\n reject(new Error('Invalid response from server'))\n return\n }\n\n const data = response.json as GetTicketsResponse\n resolve(data)\n },\n })\n })\n }\n\n /**\n * Get the current active ticket ID\n * Returns null if no conversation has been started yet\n */\n getCurrentTicketId(): string | null {\n return this._currentTicketId\n }\n\n /**\n * Get the widget session ID (persistent browser identifier)\n * This ID is used for access control and stays the same across page loads\n */\n getWidgetSessionId(): string {\n return this._widgetSessionId\n }\n\n /**\n * Clean up the widget\n */\n destroy(): void {\n this._stopPolling()\n\n // Unsubscribe from identify events\n if (this._unsubscribeIdentifyListener) {\n this._unsubscribeIdentifyListener()\n this._unsubscribeIdentifyListener = null\n }\n\n if (this._containerElement) {\n render(null, this._containerElement)\n this._containerElement.remove()\n this._containerElement = null\n }\n\n this._widgetRef = null\n logger.info('Widget destroyed')\n }\n\n /**\n * Reset all conversation data and destroy the widget.\n * Called on posthog.reset() to start fresh.\n */\n reset(): void {\n // Clear all persisted conversation data\n this._persistence.clearAll()\n\n // Reset local state\n this._currentTicketId = null\n this._lastMessageTimestamp = null\n this._unreadCount = 0\n\n // Destroy the widget\n this.destroy()\n\n logger.info('Conversations reset')\n }\n\n /**\n * Render the widget to the DOM\n */\n private _renderWidget(initialState: ConversationsWidgetState, initialUserTraits: UserProvidedTraits | null): void {\n if (!document) {\n logger.info('Conversations widget not rendered: Document not available')\n return\n }\n\n // Create container if it doesn't exist\n let container = document.getElementById(WIDGET_CONTAINER_ID) as HTMLDivElement\n if (!container) {\n if (!document.body) {\n logger.info('Conversations widget not rendered: Document body not available yet')\n return\n }\n container = document.createElement('div')\n container.id = WIDGET_CONTAINER_ID\n document.body.appendChild(container)\n }\n this._containerElement = container\n\n // Render widget with ref\n render(\n <ConversationsWidget\n ref={(ref: ConversationsWidget | null) => {\n this._widgetRef = ref\n }}\n config={this._config}\n initialState={initialState}\n initialUserTraits={initialUserTraits}\n isUserIdentified={this._posthog._isIdentified()}\n onSendMessage={this._handleSendMessage}\n onStateChange={this._handleStateChange}\n onIdentify={this._handleIdentify}\n />,\n container\n )\n }\n}\n\n/**\n * Initialize the conversations widget\n * This is the entry point called from the lazy-loaded bundle\n */\nexport function initConversations(config: ConversationsRemoteConfig, posthog: PostHog): ConversationsManager {\n logger.info('initConversations called', { hasConfig: !!config, hasPosthog: !!posthog })\n return new ConversationsManager(config, posthog)\n}\n","import { initConversations } from '../extensions/conversations/external'\nimport { assignableWindow } from '../utils/globals'\n\nassignableWindow.__PosthogExtensions__ = assignableWindow.__PosthogExtensions__ || {}\nassignableWindow.__PosthogExtensions__.initConversations = initConversations\n\nexport default initConversations\n"],"names":["p","v","y","nativeIsArray","Array","isArray","ObjProto","Object","prototype","type_utils_hasOwnProperty","hasOwnProperty","type_utils_toString","toString","obj","call","isUndefined","x","isNumber","win","window","undefined","global","globalThis","self","File","nativeForEach","forEach","navigator","document","location","fetch","XMLHttpRequest","AbortController","userAgent","assignableWindow","_createLogger","prefix","_temp","debugEnabled","logger","_log","level","POSTHOG_DEBUG","console","consoleLog","_len","arguments","length","args","_key","info","_len2","_key2","warn","_len3","_key3","error","_len4","_key4","critical","_len5","_key5","uninitializedWarning","methodName","createLogger","additionalPrefix","options","Math","trunc","ceil","floor","Number","isInteger","value","isFinite","DIGITS","UUID","constructor","bytes","this","TypeError","fromFieldsV7","unixTsMs","randA","randBHi","randBLo","RangeError","Uint8Array","pow","text","i","charAt","Error","clone","slice","equals","other","compareTo","diff","sign","V7Generator","_timestamp","_counter","_random","DefaultRandom","generate","generateOrAbort","valueAfterReset","ts","Date","now","_resetCounter","nextUint32","defaultGenerator","getRandomValues","buffer","UUIDV7_DENY_WEAK_RNG","random","crypto","_buffer","Uint32Array","_cursor","Infinity","uuidv7","uuidv7obj","CONVERSATIONS_WIDGET_SESSION_ID","CONVERSATIONS_TICKET_ID","CONVERSATIONS_WIDGET_STATE","CONVERSATIONS_USER_TRAITS","ConversationsPersistence","_posthog","_cachedWidgetSessionId","_isPersistenceAvailable","_this$_posthog$persis","_this$_posthog$persis2","persistence","isDisabled","getOrCreateWidgetSessionId","sessionId","_this$_posthog$persis3","_this$_posthog$persis4","get_property","register","clearWidgetSessionId","_this$_posthog$persis5","unregister","saveTicketId","ticketId","_this$_posthog$persis6","loadTicketId","_this$_posthog$persis7","clearTicketId","_this$_posthog$persis8","saveWidgetState","state","_this$_posthog$persis9","loadWidgetState","_this$_posthog$persis0","saveUserTraits","traits","_this$_posthog$persis1","hasName","name","hasEmail","email","loadUserTraits","_this$_posthog$persis10","clearUserTraits","_this$_posthog$persis11","clearAll","_this$_posthog$persis12","_this$_posthog$persis13","_this$_posthog$persis14","getContrastTextColor","hexColor","hex","replace","fullHex","r","parseInt","g","b","sqrt","getStyles","primaryColor","position","isLeft","includes","isTop","widget","_extends","top","bottom","left","right","zIndex","fontFamily","buttonContainer","button","width","height","borderRadius","background","color","border","cursor","boxShadow","display","alignItems","justifyContent","transition","unreadBadge","minWidth","fontSize","fontWeight","padding","boxSizing","flexDirection","overflow","windowOpen","maxHeight","header","flexShrink","headerTitle","headerActions","gap","headerButton","lineHeight","opacity","messages","flex","overflowY","message","maxWidth","animation","messageCustomer","alignSelf","messageAgent","messageAuthor","marginBottom","messageContent","wordWrap","whiteSpace","messageContentCustomer","borderBottomRightRadius","messageContentAgent","borderBottomLeftRadius","messageTime","marginTop","borderTop","borderBottom","textAlign","inputContainer","input","resize","outline","fieldSizing","sendButton","identificationForm","formTitle","formDescription","formField","formLabel","formInput","formInputError","borderColor","formError","formSubmitButton","formOptional","t","u","OpenChatButton","_ref","handleToggleOpen","unreadCount","styles","displayCount","_jsx","style","children","_jsxs","onClick","onMouseEnter","e","currentTarget","transform","onMouseLeave","viewBox","fill","xmlns","d","SendMessageButton","inputValue","isLoading","handleSendMessage","trim","disabled","stroke","strokeWidth","strokeLinejoin","CloseChatButton","handleClose","o","f","c","n","__b","a","__r","diffed","l","__c","m","unmount","s","__","__h","__H","push","j","shift","__P","z","B","__e","__v","__k","__m","__N","requestAnimationFrame","w","some","filter","k","clearTimeout","cancelAnimationFrame","setTimeout","sanitizeUrl","url","trimmedUrl","normalizedForCheck","toLowerCase","startsWith","lowerUrl","MAX_DEPTH","renderNode","node","depth","key","_node$content","type","marks","element","_Fragment","mark","fontStyle","textDecoration","code","_mark$attrs","href","attrs","safeUrl","target","rel","referrerPolicy","link","renderTextWithMarks","content","map","child","index","margin","_node$content2","codeText","codeBlock","_node$attrs","_node$attrs2","src","alt","image","onError","paddingLeft","borderLeft","_node$attrs3","rawLevel","min","max","RichContent","richContent","isCustomer","C","useMemo","overflowX","wordBreak","doc","isValidTipTapDoc","rendered","_unused","lines","split","line","Fragment","renderPlainText","ConversationsWidget","Component","props","_this","super","_messagesEndRef","_inputRef","_handleToggleOpen","setState","prevState","_handleClose","_handleInputChange","_handleKeyPress","shiftKey","preventDefault","_handleSendMessage","_handleFormNameChange","formName","_handleFormEmailChange","formEmail","formEmailError","_handleFormSubmit","config","onIdentify","requireEmail","_validateEmail","userTraits","showIdentificationForm","_asyncToGenerator","trimmedMessage","userMessage","id","author_type","author_name","created_at","toISOString","is_private","onSendMessage","initialUserTraits","needsIdentification","_needsIdentification","isUserIdentified","initialState","componentDidMount","greetingText","_addGreetingMessage","componentDidUpdate","_prevProps","_scrollToBottom","onStateChange","_focusInput","greetingMessage","scrollIntoView","behavior","focus","test","_formatTime","isoString","date","diffMs","getTime","diffMins","toLocaleDateString","addMessages","existingIds","Set","newMessages","has","show","hide","close","getUserTraits","setUserIdentified","setUnreadCount","count","_renderIdentificationForm","title","identificationFormTitle","description","identificationFormDescription","showNameField","collectName","onSubmit","onInput","placeholder","autoComplete","_renderMessage","messageStyle","contentStyle","rich_content","render","widgetPosition","placeholderText","windowStyle","ref","el","onKeyPress","rows","breaker","each","iterator","thisArg","isNull","isNullish","eachArray","FormData","isFormData","pair","entries","formDataToQuery","formdata","arg_separator","use_val","use_key","tph_arr","val","encodeURIComponent","isFile","join","WIDGET_CONTAINER_ID","ConversationsManager","_widgetRef","_containerElement","_currentTicketId","_pollIntervalId","_lastMessageTimestamp","_isPolling","_unsubscribeIdentifyListener","_unreadCount","_isWidgetRendered","_handleIdentify","_persistence","capture","_this$_widgetRef","sendMessage","_pollMessages","_x","apply","_handleStateChange","_markMessagesAsRead","_loadMessages","_config","_widgetSessionId","_isWidgetEnabled","widgetEnabled","_isDomainAllowed","domains","_window$location","currentHostname","hostname","domain","allowedHostname","extractHostname","pattern","endsWith","isCurrentDomainAllowed","widgetSessionId","isWidgetEnabled","isDomainAllowed","_initialize","newTicket","_this2","isNewTicket","token","Promise","resolve","reject","_this2$_posthog$persi","distinctId","get_distinct_id","personProperties","$name","$email","payload","widget_session_id","distinct_id","ticket_id","_window$location2","capturedSessionId","get_session_id","session_id","replayUrl","get_session_replay_url","withTimestamp","timestampLookBack","currentUrl","session_context","session_replay_url","current_url","_send_request","requestRouter","endpointFor","method","data","headers","callback","response","statusCode","_response$json","_response$json2","errorMsg","json","detail","status","forced","messageLength","_switchToTicketIfNeeded","getMessages","after","_this3","targetTicketId","queryParams","limit","_response$json3","_response$json4","markAsRead","_this4","_response$json5","_response$json6","hasExistingTicket","domainAllowed","_initializeWidget","_setupIdentifyListener","_getInitialUserTraits","_renderWidget","hasUserTraits","_startPolling","posthogName","posthogEmail","savedTraits","_this5","_this5$_widgetRef","unread_count","_this6","_this6$_widgetRef","_isWidgetOpen","_this6$_widgetRef2","lastMessage","setInterval","_stopPolling","clearInterval","on","event","_this$_widgetRef2","remove","isVisible","getTickets","_this7","_options$limit","_options$offset","String","offset","_response$json7","_response$json8","getCurrentTicketId","getWidgetSessionId","destroy","reset","container","getElementById","body","createElement","appendChild","_isIdentified","initConversations","posthog","hasConfig","hasPosthog","__PosthogExtensions__"],"mappings":"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","x_google_ignoreList":[0,9]}
1
+ {"version":3,"file":"conversations.js","sources":["../../../node_modules/.pnpm/preact@10.28.2/node_modules/preact/dist/preact.module.js","../../core/dist/utils/type-utils.mjs","../src/utils/globals.ts","../src/utils/logger.ts","../src/uuidv7.ts","../src/extensions/conversations/external/persistence.ts","../src/extensions/conversations/external/components/styles.ts","../src/constants.ts","../src/extensions/conversations/external/components/OpenChatButton.tsx","../../../node_modules/.pnpm/preact@10.28.2/node_modules/preact/hooks/dist/hooks.module.js","../src/extensions/conversations/external/components/SendMessageButton.tsx","../src/extensions/conversations/external/components/CloseChatButton.tsx","../src/extensions/conversations/external/components/RichContent.tsx","../src/extensions/conversations/external/components/utils.ts","../src/extensions/conversations/external/components/TicketListItem.tsx","../src/extensions/conversations/external/components/TicketListView.tsx","../src/extensions/conversations/external/components/ConversationsWidget.tsx","../src/utils/index.ts","../src/utils/request-utils.ts","../src/extensions/conversations/external/index.tsx","../src/entrypoints/conversations.ts"],"sourcesContent":["var n,l,u,t,i,o,r,e,f,c,s,a,h,p={},v=[],y=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,d=Array.isArray;function w(n,l){for(var u in l)n[u]=l[u];return n}function g(n){n&&n.parentNode&&n.parentNode.removeChild(n)}function _(l,u,t){var i,o,r,e={};for(r in u)\"key\"==r?i=u[r]:\"ref\"==r?o=u[r]:e[r]=u[r];if(arguments.length>2&&(e.children=arguments.length>3?n.call(arguments,2):t),\"function\"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===e[r]&&(e[r]=l.defaultProps[r]);return m(l,e,i,o,null)}function m(n,t,i,o,r){var e={type:n,props:t,key:i,ref:o,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:null==r?++u:r,__i:-1,__u:0};return null==r&&null!=l.vnode&&l.vnode(e),e}function b(){return{current:null}}function k(n){return n.children}function x(n,l){this.props=n,this.context=l}function S(n,l){if(null==l)return n.__?S(n.__,n.__i+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?S(n):null}function C(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return C(n)}}function M(n){(!n.__d&&(n.__d=!0)&&i.push(n)&&!$.__r++||o!=l.debounceRendering)&&((o=l.debounceRendering)||r)($)}function $(){for(var n,u,t,o,r,f,c,s=1;i.length;)i.length>s&&i.sort(e),n=i.shift(),s=i.length,n.__d&&(t=void 0,o=void 0,r=(o=(u=n).__v).__e,f=[],c=[],u.__P&&((t=w({},o)).__v=o.__v+1,l.vnode&&l.vnode(t),O(u.__P,t,o,u.__n,u.__P.namespaceURI,32&o.__u?[r]:null,f,null==r?S(o):r,!!(32&o.__u),c),t.__v=o.__v,t.__.__k[t.__i]=t,N(f,t,c),o.__e=o.__=null,t.__e!=r&&C(t)));$.__r=0}function I(n,l,u,t,i,o,r,e,f,c,s){var a,h,y,d,w,g,_,m=t&&t.__k||v,b=l.length;for(f=P(u,l,m,f,b),a=0;a<b;a++)null!=(y=u.__k[a])&&(h=-1==y.__i?p:m[y.__i]||p,y.__i=a,g=O(n,y,h,i,o,r,e,f,c,s),d=y.__e,y.ref&&h.ref!=y.ref&&(h.ref&&B(h.ref,null,y),s.push(y.ref,y.__c||d,y)),null==w&&null!=d&&(w=d),(_=!!(4&y.__u))||h.__k===y.__k?f=A(y,f,n,_):\"function\"==typeof y.type&&void 0!==g?f=g:d&&(f=d.nextSibling),y.__u&=-7);return u.__e=w,f}function P(n,l,u,t,i){var o,r,e,f,c,s=u.length,a=s,h=0;for(n.__k=new Array(i),o=0;o<i;o++)null!=(r=l[o])&&\"boolean\"!=typeof r&&\"function\"!=typeof r?(\"string\"==typeof r||\"number\"==typeof r||\"bigint\"==typeof r||r.constructor==String?r=n.__k[o]=m(null,r,null,null,null):d(r)?r=n.__k[o]=m(k,{children:r},null,null,null):void 0===r.constructor&&r.__b>0?r=n.__k[o]=m(r.type,r.props,r.key,r.ref?r.ref:null,r.__v):n.__k[o]=r,f=o+h,r.__=n,r.__b=n.__b+1,e=null,-1!=(c=r.__i=L(r,u,f,a))&&(a--,(e=u[c])&&(e.__u|=2)),null==e||null==e.__v?(-1==c&&(i>s?h--:i<s&&h++),\"function\"!=typeof r.type&&(r.__u|=4)):c!=f&&(c==f-1?h--:c==f+1?h++:(c>f?h--:h++,r.__u|=4))):n.__k[o]=null;if(a)for(o=0;o<s;o++)null!=(e=u[o])&&0==(2&e.__u)&&(e.__e==t&&(t=S(e)),D(e,e));return t}function A(n,l,u,t){var i,o;if(\"function\"==typeof n.type){for(i=n.__k,o=0;i&&o<i.length;o++)i[o]&&(i[o].__=n,l=A(i[o],l,u,t));return l}n.__e!=l&&(t&&(l&&n.type&&!l.parentNode&&(l=S(n)),u.insertBefore(n.__e,l||null)),l=n.__e);do{l=l&&l.nextSibling}while(null!=l&&8==l.nodeType);return l}function H(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(d(n)?n.some(function(n){H(n,l)}):l.push(n)),l}function L(n,l,u,t){var i,o,r,e=n.key,f=n.type,c=l[u],s=null!=c&&0==(2&c.__u);if(null===c&&null==e||s&&e==c.key&&f==c.type)return u;if(t>(s?1:0))for(i=u-1,o=u+1;i>=0||o<l.length;)if(null!=(c=l[r=i>=0?i--:o++])&&0==(2&c.__u)&&e==c.key&&f==c.type)return r;return-1}function T(n,l,u){\"-\"==l[0]?n.setProperty(l,null==u?\"\":u):n[l]=null==u?\"\":\"number\"!=typeof u||y.test(l)?u:u+\"px\"}function j(n,l,u,t,i){var o,r;n:if(\"style\"==l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof t&&(n.style.cssText=t=\"\"),t)for(l in t)u&&l in u||T(n.style,l,\"\");if(u)for(l in u)t&&u[l]==t[l]||T(n.style,l,u[l])}else if(\"o\"==l[0]&&\"n\"==l[1])o=l!=(l=l.replace(f,\"$1\")),r=l.toLowerCase(),l=r in n||\"onFocusOut\"==l||\"onFocusIn\"==l?r.slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?t?u.u=t.u:(u.u=c,n.addEventListener(l,o?a:s,o)):n.removeEventListener(l,o?a:s,o);else{if(\"http://www.w3.org/2000/svg\"==i)l=l.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"width\"!=l&&\"height\"!=l&&\"href\"!=l&&\"list\"!=l&&\"form\"!=l&&\"tabIndex\"!=l&&\"download\"!=l&&\"rowSpan\"!=l&&\"colSpan\"!=l&&\"role\"!=l&&\"popover\"!=l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null==u||!1===u&&\"-\"!=l[4]?n.removeAttribute(l):n.setAttribute(l,\"popover\"==l&&1==u?\"\":u))}}function F(n){return function(u){if(this.l){var t=this.l[u.type+n];if(null==u.t)u.t=c++;else if(u.t<t.u)return;return t(l.event?l.event(u):u)}}}function O(n,u,t,i,o,r,e,f,c,s){var a,h,p,v,y,_,m,b,S,C,M,$,P,A,H,L,T,j=u.type;if(void 0!==u.constructor)return null;128&t.__u&&(c=!!(32&t.__u),r=[f=u.__e=t.__e]),(a=l.__b)&&a(u);n:if(\"function\"==typeof j)try{if(b=u.props,S=\"prototype\"in j&&j.prototype.render,C=(a=j.contextType)&&i[a.__c],M=a?C?C.props.value:a.__:i,t.__c?m=(h=u.__c=t.__c).__=h.__E:(S?u.__c=h=new j(b,M):(u.__c=h=new x(b,M),h.constructor=j,h.render=E),C&&C.sub(h),h.state||(h.state={}),h.__n=i,p=h.__d=!0,h.__h=[],h._sb=[]),S&&null==h.__s&&(h.__s=h.state),S&&null!=j.getDerivedStateFromProps&&(h.__s==h.state&&(h.__s=w({},h.__s)),w(h.__s,j.getDerivedStateFromProps(b,h.__s))),v=h.props,y=h.state,h.__v=u,p)S&&null==j.getDerivedStateFromProps&&null!=h.componentWillMount&&h.componentWillMount(),S&&null!=h.componentDidMount&&h.__h.push(h.componentDidMount);else{if(S&&null==j.getDerivedStateFromProps&&b!==v&&null!=h.componentWillReceiveProps&&h.componentWillReceiveProps(b,M),u.__v==t.__v||!h.__e&&null!=h.shouldComponentUpdate&&!1===h.shouldComponentUpdate(b,h.__s,M)){for(u.__v!=t.__v&&(h.props=b,h.state=h.__s,h.__d=!1),u.__e=t.__e,u.__k=t.__k,u.__k.some(function(n){n&&(n.__=u)}),$=0;$<h._sb.length;$++)h.__h.push(h._sb[$]);h._sb=[],h.__h.length&&e.push(h);break n}null!=h.componentWillUpdate&&h.componentWillUpdate(b,h.__s,M),S&&null!=h.componentDidUpdate&&h.__h.push(function(){h.componentDidUpdate(v,y,_)})}if(h.context=M,h.props=b,h.__P=n,h.__e=!1,P=l.__r,A=0,S){for(h.state=h.__s,h.__d=!1,P&&P(u),a=h.render(h.props,h.state,h.context),H=0;H<h._sb.length;H++)h.__h.push(h._sb[H]);h._sb=[]}else do{h.__d=!1,P&&P(u),a=h.render(h.props,h.state,h.context),h.state=h.__s}while(h.__d&&++A<25);h.state=h.__s,null!=h.getChildContext&&(i=w(w({},i),h.getChildContext())),S&&!p&&null!=h.getSnapshotBeforeUpdate&&(_=h.getSnapshotBeforeUpdate(v,y)),L=a,null!=a&&a.type===k&&null==a.key&&(L=V(a.props.children)),f=I(n,d(L)?L:[L],u,t,i,o,r,e,f,c,s),h.base=u.__e,u.__u&=-161,h.__h.length&&e.push(h),m&&(h.__E=h.__=null)}catch(n){if(u.__v=null,c||null!=r)if(n.then){for(u.__u|=c?160:128;f&&8==f.nodeType&&f.nextSibling;)f=f.nextSibling;r[r.indexOf(f)]=null,u.__e=f}else{for(T=r.length;T--;)g(r[T]);z(u)}else u.__e=t.__e,u.__k=t.__k,n.then||z(u);l.__e(n,u,t)}else null==r&&u.__v==t.__v?(u.__k=t.__k,u.__e=t.__e):f=u.__e=q(t.__e,u,t,i,o,r,e,c,s);return(a=l.diffed)&&a(u),128&u.__u?void 0:f}function z(n){n&&n.__c&&(n.__c.__e=!0),n&&n.__k&&n.__k.forEach(z)}function N(n,u,t){for(var i=0;i<t.length;i++)B(t[i],t[++i],t[++i]);l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u)})}catch(n){l.__e(n,u.__v)}})}function V(n){return\"object\"!=typeof n||null==n||n.__b&&n.__b>0?n:d(n)?n.map(V):w({},n)}function q(u,t,i,o,r,e,f,c,s){var a,h,v,y,w,_,m,b=i.props||p,k=t.props,x=t.type;if(\"svg\"==x?r=\"http://www.w3.org/2000/svg\":\"math\"==x?r=\"http://www.w3.org/1998/Math/MathML\":r||(r=\"http://www.w3.org/1999/xhtml\"),null!=e)for(a=0;a<e.length;a++)if((w=e[a])&&\"setAttribute\"in w==!!x&&(x?w.localName==x:3==w.nodeType)){u=w,e[a]=null;break}if(null==u){if(null==x)return document.createTextNode(k);u=document.createElementNS(r,x,k.is&&k),c&&(l.__m&&l.__m(t,e),c=!1),e=null}if(null==x)b===k||c&&u.data==k||(u.data=k);else{if(e=e&&n.call(u.childNodes),!c&&null!=e)for(b={},a=0;a<u.attributes.length;a++)b[(w=u.attributes[a]).name]=w.value;for(a in b)if(w=b[a],\"children\"==a);else if(\"dangerouslySetInnerHTML\"==a)v=w;else if(!(a in k)){if(\"value\"==a&&\"defaultValue\"in k||\"checked\"==a&&\"defaultChecked\"in k)continue;j(u,a,null,w,r)}for(a in k)w=k[a],\"children\"==a?y=w:\"dangerouslySetInnerHTML\"==a?h=w:\"value\"==a?_=w:\"checked\"==a?m=w:c&&\"function\"!=typeof w||b[a]===w||j(u,a,w,b[a],r);if(h)c||v&&(h.__html==v.__html||h.__html==u.innerHTML)||(u.innerHTML=h.__html),t.__k=[];else if(v&&(u.innerHTML=\"\"),I(\"template\"==t.type?u.content:u,d(y)?y:[y],t,i,o,\"foreignObject\"==x?\"http://www.w3.org/1999/xhtml\":r,e,f,e?e[0]:i.__k&&S(i,0),c,s),null!=e)for(a=e.length;a--;)g(e[a]);c||(a=\"value\",\"progress\"==x&&null==_?u.removeAttribute(\"value\"):null!=_&&(_!==u[a]||\"progress\"==x&&!_||\"option\"==x&&_!=b[a])&&j(u,a,_,b[a],r),a=\"checked\",null!=m&&m!=u[a]&&j(u,a,m,b[a],r))}return u}function B(n,u,t){try{if(\"function\"==typeof n){var i=\"function\"==typeof n.__u;i&&n.__u(),i&&null==u||(n.__u=n(u))}else n.current=u}catch(n){l.__e(n,t)}}function D(n,u,t){var i,o;if(l.unmount&&l.unmount(n),(i=n.ref)&&(i.current&&i.current!=n.__e||B(i,null,u)),null!=(i=n.__c)){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(n){l.__e(n,u)}i.base=i.__P=null}if(i=n.__k)for(o=0;o<i.length;o++)i[o]&&D(i[o],u,t||\"function\"!=typeof n.type);t||g(n.__e),n.__c=n.__=n.__e=void 0}function E(n,l,u){return this.constructor(n,u)}function G(u,t,i){var o,r,e,f;t==document&&(t=document.documentElement),l.__&&l.__(u,t),r=(o=\"function\"==typeof i)?null:i&&i.__k||t.__k,e=[],f=[],O(t,u=(!o&&i||t).__k=_(k,null,[u]),r||p,p,t.namespaceURI,!o&&i?[i]:r?null:t.firstChild?n.call(t.childNodes):null,e,!o&&i?i:r?r.__e:t.firstChild,o,f),N(e,u,f)}function J(n,l){G(n,l,J)}function K(l,u,t){var i,o,r,e,f=w({},l.props);for(r in l.type&&l.type.defaultProps&&(e=l.type.defaultProps),u)\"key\"==r?i=u[r]:\"ref\"==r?o=u[r]:f[r]=void 0===u[r]&&null!=e?e[r]:u[r];return arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),m(l.type,f,i||l.key,o||l.ref,null)}function Q(n){function l(n){var u,t;return this.getChildContext||(u=new Set,(t={})[l.__c]=this,this.getChildContext=function(){return t},this.componentWillUnmount=function(){u=null},this.shouldComponentUpdate=function(n){this.props.value!=n.value&&u.forEach(function(n){n.__e=!0,M(n)})},this.sub=function(n){u.add(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u&&u.delete(n),l&&l.call(n)}}),n.children}return l.__c=\"__cC\"+h++,l.__=n,l.Provider=l.__l=(l.Consumer=function(n,l){return n.children(l)}).contextType=l,l}n=v.slice,l={__e:function(n,l,u,t){for(var i,o,r;l=l.__;)if((i=l.__c)&&!i.__)try{if((o=i.constructor)&&null!=o.getDerivedStateFromError&&(i.setState(o.getDerivedStateFromError(n)),r=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(n,t||{}),r=i.__d),r)return i.__E=i}catch(l){n=l}throw n}},u=0,t=function(n){return null!=n&&void 0===n.constructor},x.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!=this.state?this.__s:this.__s=w({},this.state),\"function\"==typeof n&&(n=n(w({},u),this.props)),n&&w(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),M(this))},x.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),M(this))},x.prototype.render=k,i=[],r=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,e=function(n,l){return n.__v.__b-l.__v.__b},$.__r=0,f=/(PointerCapture)$|Capture$/i,c=0,s=F(!1),a=F(!0),h=0;export{x as Component,k as Fragment,K as cloneElement,Q as createContext,_ as createElement,b as createRef,_ as h,J as hydrate,t as isValidElement,l as options,G as render,H as toChildArray};\n//# sourceMappingURL=preact.module.js.map\n","import { knownUnsafeEditableEvent } from \"../types.mjs\";\nimport { includes } from \"./string-utils.mjs\";\nconst nativeIsArray = Array.isArray;\nconst ObjProto = Object.prototype;\nconst type_utils_hasOwnProperty = ObjProto.hasOwnProperty;\nconst type_utils_toString = ObjProto.toString;\nconst isArray = nativeIsArray || function(obj) {\n return '[object Array]' === type_utils_toString.call(obj);\n};\nconst isFunction = (x)=>'function' == typeof x;\nconst isNativeFunction = (x)=>isFunction(x) && -1 !== x.toString().indexOf('[native code]');\nconst isObject = (x)=>x === Object(x) && !isArray(x);\nconst isEmptyObject = (x)=>{\n if (isObject(x)) {\n for(const key in x)if (type_utils_hasOwnProperty.call(x, key)) return false;\n return true;\n }\n return false;\n};\nconst isUndefined = (x)=>void 0 === x;\nconst isString = (x)=>'[object String]' == type_utils_toString.call(x);\nconst isEmptyString = (x)=>isString(x) && 0 === x.trim().length;\nconst isNull = (x)=>null === x;\nconst isNullish = (x)=>isUndefined(x) || isNull(x);\nconst isNumber = (x)=>'[object Number]' == type_utils_toString.call(x) && x === x;\nconst isPositiveNumber = (value)=>isNumber(value) && value > 0;\nconst isBoolean = (x)=>'[object Boolean]' === type_utils_toString.call(x);\nconst isFormData = (x)=>x instanceof FormData;\nconst isFile = (x)=>x instanceof File;\nconst isPlainError = (x)=>x instanceof Error;\nconst isKnownUnsafeEditableEvent = (x)=>includes(knownUnsafeEditableEvent, x);\nfunction isPrimitive(value) {\n return null === value || 'object' != typeof value;\n}\nfunction isBuiltin(candidate, className) {\n return Object.prototype.toString.call(candidate) === `[object ${className}]`;\n}\nfunction isError(candidate) {\n switch(Object.prototype.toString.call(candidate)){\n case '[object Error]':\n case '[object Exception]':\n case '[object DOMException]':\n case '[object DOMError]':\n case '[object WebAssembly.Exception]':\n return true;\n default:\n return isInstanceOf(candidate, Error);\n }\n}\nfunction isErrorEvent(event) {\n return isBuiltin(event, 'ErrorEvent');\n}\nfunction isEvent(candidate) {\n return !isUndefined(Event) && isInstanceOf(candidate, Event);\n}\nfunction isPlainObject(candidate) {\n return isBuiltin(candidate, 'Object');\n}\nfunction isInstanceOf(candidate, base) {\n try {\n return candidate instanceof base;\n } catch {\n return false;\n }\n}\nconst yesLikeValues = [\n true,\n 'true',\n 1,\n '1',\n 'yes'\n];\nconst isYesLike = (val)=>includes(yesLikeValues, val);\nconst noLikeValues = [\n false,\n 'false',\n 0,\n '0',\n 'no'\n];\nconst isNoLike = (val)=>includes(noLikeValues, val);\nexport { type_utils_hasOwnProperty as hasOwnProperty, isArray, isBoolean, isBuiltin, isEmptyObject, isEmptyString, isError, isErrorEvent, isEvent, isFile, isFormData, isFunction, isKnownUnsafeEditableEvent, isNativeFunction, isNoLike, isNull, isNullish, isNumber, isObject, isPlainError, isPlainObject, isPositiveNumber, isPrimitive, isString, isUndefined, isYesLike, noLikeValues, yesLikeValues };\n","import type { PostHog } from '../posthog-core'\nimport { SessionIdManager } from '../sessionid'\nimport {\n DeadClicksAutoCaptureConfig,\n ExternalIntegrationKind,\n Properties,\n RemoteConfig,\n SiteAppLoader,\n SessionStartReason,\n} from '../types'\nimport type {\n ConversationsRemoteConfig,\n GetMessagesResponse,\n GetTicketsOptions,\n GetTicketsResponse,\n MarkAsReadResponse,\n SendMessageResponse,\n UserProvidedTraits,\n} from '../posthog-conversations-types'\n// only importing types here, so won't affect the bundle\n// eslint-disable-next-line posthog-js/no-external-replay-imports\nimport type { SessionRecordingStatus, TriggerType } from '../extensions/replay/external/triggerMatching'\nimport { eventWithTime } from '../extensions/replay/types/rrweb-types'\nimport { ErrorTracking } from '@posthog/core'\n\n/*\n * Global helpers to protect access to browser globals in a way that is safer for different targets\n * like DOM, SSR, Web workers etc.\n *\n * NOTE: Typically we want the \"window\" but globalThis works for both the typical browser context as\n * well as other contexts such as the web worker context. Window is still exported for any bits that explicitly require it.\n * If in doubt - export the global you need from this file and use that as an optional value. This way the code path is forced\n * to handle the case where the global is not available.\n */\n\n// eslint-disable-next-line no-restricted-globals\nconst win: (Window & typeof globalThis) | undefined = typeof window !== 'undefined' ? window : undefined\n\nexport type AssignableWindow = Window &\n typeof globalThis & {\n /*\n * Main PostHog instance\n */\n posthog: any\n\n /*\n * This is our contract between (potentially) lazily loaded extensions and the SDK\n */\n __PosthogExtensions__?: PostHogExtensions\n\n /**\n * When loading remote config, we assign it to this global configuration\n * for ease of sharing it with the rest of the SDK\n */\n _POSTHOG_REMOTE_CONFIG?: Record<\n string,\n {\n config: RemoteConfig\n siteApps: SiteAppLoader[]\n }\n >\n\n /**\n * If this is set on the window, our logger will log to the console\n * for ease of debugging. Used for testing purposes only.\n *\n * @see {Config.DEBUG} from config.ts\n */\n POSTHOG_DEBUG: any\n\n // Exposed by the browser\n doNotTrack: any\n\n // See entrypoints/customizations.full.ts\n posthogCustomizations: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/exception-autocapture.ts\n *\n * @deprecated use `__PosthogExtensions__.errorWrappingFunctions` instead\n */\n posthogErrorWrappingFunctions: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.rrweb` instead\n */\n rrweb: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.rrwebConsoleRecord` instead\n */\n rrwebConsoleRecord: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/posthog-recorder.ts\n *\n * @deprecated use `__PosthogExtensions__.getRecordNetworkPlugin` instead\n */\n getRecordNetworkPlugin: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/web-vitals.ts\n *\n * @deprecated use `__PosthogExtensions__.postHogWebVitalsCallbacks` instead\n */\n postHogWebVitalsCallbacks: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/tracing-headers.ts\n *\n * @deprecated use `__PosthogExtensions__.postHogTracingHeadersPatchFns` instead\n */\n postHogTracingHeadersPatchFns: any\n\n /**\n * This is a legacy way to expose these functions, but we still need to support it for backwards compatibility\n * Can be removed once we drop support for 1.161.1\n *\n * See entrypoints/surveys.ts\n *\n * @deprecated use `__PosthogExtensions__.generateSurveys` instead\n */\n extendPostHogWithSurveys: any\n\n /*\n * These are used to handle our toolbar state.\n * @see {Toolbar} from extensions/toolbar.ts\n */\n ph_load_toolbar: any\n ph_load_editor: any\n ph_toolbar_state: any\n } & Record<`__$$ph_site_app_${string}`, any>\n\n/**\n * This is our contract between (potentially) lazily loaded extensions and the SDK\n * changes to this interface can be breaking changes for users of the SDK\n */\n\nexport type ExternalExtensionKind = 'intercom-integration' | 'crisp-chat-integration'\n\nexport type PostHogExtensionKind =\n | 'toolbar'\n | 'exception-autocapture'\n | 'web-vitals'\n | 'web-vitals-with-attribution'\n | 'recorder'\n | 'lazy-recorder'\n | 'tracing-headers'\n | 'surveys'\n | 'logs'\n | 'conversations'\n | 'product-tours'\n | 'dead-clicks-autocapture'\n | 'remote-config'\n | ExternalExtensionKind\n\nexport interface LazyLoadedSessionRecordingInterface {\n start: (startReason?: SessionStartReason) => void\n stop: () => void\n sessionId: string\n status: SessionRecordingStatus\n onRRwebEmit: (rawEvent: eventWithTime) => void\n log: (message: string, level: 'log' | 'warn' | 'error') => void\n sdkDebugProperties: Properties\n overrideLinkedFlag: () => void\n overrideSampling: () => void\n overrideTrigger: (triggerType: TriggerType) => void\n isStarted: boolean\n tryAddCustomEvent(tag: string, payload: any): boolean\n}\n\nexport interface LazyLoadedDeadClicksAutocaptureInterface {\n start: (observerTarget: Node) => void\n stop: () => void\n}\n\nexport interface LazyLoadedConversationsInterface {\n // Widget control\n show: () => void\n hide: () => void\n isVisible: () => boolean\n\n // Lifecycle\n reset: () => void\n\n // API methods\n sendMessage: (message: string, userTraits?: UserProvidedTraits, newTicket?: boolean) => Promise<SendMessageResponse>\n getMessages: (ticketId?: string, after?: string) => Promise<GetMessagesResponse>\n markAsRead: (ticketId?: string) => Promise<MarkAsReadResponse>\n getTickets: (options?: GetTicketsOptions) => Promise<GetTicketsResponse>\n getCurrentTicketId: () => string | null\n getWidgetSessionId: () => string\n}\n\ninterface PostHogExtensions {\n loadExternalDependency?: (\n posthog: PostHog,\n kind: PostHogExtensionKind,\n callback: (error?: string | Event, event?: Event) => void\n ) => void\n\n loadSiteApp?: (posthog: PostHog, appUrl: string, callback: (error?: string | Event, event?: Event) => void) => void\n\n errorWrappingFunctions?: {\n wrapOnError: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n wrapUnhandledRejection: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n wrapConsoleError: (captureFn: (props: ErrorTracking.ErrorProperties) => void) => () => void\n }\n rrweb?: { record: any; version: string; wasMaxDepthReached?: () => boolean; resetMaxDepthState?: () => void }\n rrwebPlugins?: { getRecordConsolePlugin: any; getRecordNetworkPlugin?: any }\n generateSurveys?: (posthog: PostHog, isSurveysEnabled: boolean) => any | undefined\n generateProductTours?: (posthog: PostHog, isEnabled: boolean) => any | undefined\n logs?: {\n initializeLogs?: (posthog: PostHog) => any | undefined\n }\n postHogWebVitalsCallbacks?: {\n onLCP: (metric: any) => void\n onCLS: (metric: any) => void\n onFCP: (metric: any) => void\n onINP: (metric: any) => void\n }\n /**\n * @deprecated\n *\n * this was introduced briefly, it is now always a no-op and only kept for backwards compatibility\n */\n loadWebVitalsCallbacks?: (useAttribution?: boolean) => PostHogExtensions['postHogWebVitalsCallbacks']\n tracingHeadersPatchFns?: {\n _patchFetch: (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager) => () => void\n _patchXHR: (hostnames: string[], distinctId: string, sessionManager?: SessionIdManager) => () => void\n }\n initDeadClicksAutocapture?: (\n ph: PostHog,\n config: DeadClicksAutoCaptureConfig\n ) => LazyLoadedDeadClicksAutocaptureInterface\n integrations?: {\n [K in ExternalIntegrationKind]?: { start: (posthog: PostHog) => void; stop: () => void }\n }\n initSessionRecording?: (ph: PostHog) => LazyLoadedSessionRecordingInterface\n initConversations?: (config: ConversationsRemoteConfig, posthog: PostHog) => LazyLoadedConversationsInterface\n}\n\nconst global: typeof globalThis | undefined = typeof globalThis !== 'undefined' ? globalThis : win\n\n// React Native polyfills for posthog-js compatibility\nif (typeof self === 'undefined') {\n ;(global as any).self = global\n}\nif (typeof File === 'undefined') {\n ;(global as any).File = function () {}\n}\n\nexport const ArrayProto = Array.prototype\nexport const nativeForEach = ArrayProto.forEach\nexport const nativeIndexOf = ArrayProto.indexOf\n\nexport const navigator = global?.navigator\nexport const document = global?.document\nexport const location = global?.location\nexport const fetch = global?.fetch\nexport const XMLHttpRequest =\n global?.XMLHttpRequest && 'withCredentials' in new global.XMLHttpRequest() ? global.XMLHttpRequest : undefined\nexport const AbortController = global?.AbortController\nexport const userAgent = navigator?.userAgent\nexport const assignableWindow: AssignableWindow = win ?? ({} as any)\n\nexport { win as window }\n","import Config from '../config'\nimport { isUndefined } from '@posthog/core'\nimport { assignableWindow, window } from './globals'\nimport type { Logger } from '@posthog/core'\n\ntype CreateLoggerOptions = {\n debugEnabled?: boolean\n}\n\ntype PosthogJsLogger = Omit<Logger, 'createLogger'> & {\n _log: (level: 'log' | 'warn' | 'error', ...args: any[]) => void\n uninitializedWarning: (methodName: string) => void\n createLogger: (prefix: string, options?: CreateLoggerOptions) => PosthogJsLogger\n}\n\nconst _createLogger = (prefix: string, { debugEnabled }: CreateLoggerOptions = {}): PosthogJsLogger => {\n const logger: PosthogJsLogger = {\n _log: (level: 'log' | 'warn' | 'error', ...args: any[]) => {\n if (\n window &&\n (Config.DEBUG || assignableWindow.POSTHOG_DEBUG || debugEnabled) &&\n !isUndefined(window.console) &&\n window.console\n ) {\n const consoleLog =\n '__rrweb_original__' in window.console[level]\n ? (window.console[level] as any)['__rrweb_original__']\n : window.console[level]\n\n // eslint-disable-next-line no-console\n consoleLog(prefix, ...args)\n }\n },\n\n info: (...args: any[]) => {\n logger._log('log', ...args)\n },\n\n warn: (...args: any[]) => {\n logger._log('warn', ...args)\n },\n\n error: (...args: any[]) => {\n logger._log('error', ...args)\n },\n\n critical: (...args: any[]) => {\n // Critical errors are always logged to the console\n // eslint-disable-next-line no-console\n console.error(prefix, ...args)\n },\n\n uninitializedWarning: (methodName: string) => {\n logger.error(`You must initialize PostHog before calling ${methodName}`)\n },\n\n createLogger: (additionalPrefix: string, options?: CreateLoggerOptions) =>\n _createLogger(`${prefix} ${additionalPrefix}`, options),\n }\n return logger\n}\n\nexport const logger = _createLogger('[PostHog.js]')\n\nexport const createLogger = logger.createLogger\n","/**\n * uuidv7: An experimental implementation of the proposed UUID Version 7\n *\n * @license Apache-2.0\n * @copyright 2021-2023 LiosK\n * @packageDocumentation\n *\n * from https://github.com/LiosK/uuidv7/blob/e501462ea3d23241de13192ceae726956f9b3b7d/src/index.ts\n */\n\n// polyfill for IE11\nimport { window } from './utils/globals'\n\nimport { isNumber, isUndefined } from '@posthog/core'\n\nif (!Math.trunc) {\n Math.trunc = function (v) {\n return v < 0 ? Math.ceil(v) : Math.floor(v)\n }\n}\n\n// polyfill for IE11\nif (!Number.isInteger) {\n Number.isInteger = function (value) {\n return isNumber(value) && isFinite(value) && Math.floor(value) === value\n }\n}\n\nconst DIGITS = '0123456789abcdef'\n\n/** Represents a UUID as a 16-byte byte array. */\nexport class UUID {\n /** @param bytes - The 16-byte byte array representation. */\n constructor(readonly bytes: Readonly<Uint8Array>) {\n if (bytes.length !== 16) {\n throw new TypeError('not 128-bit length')\n }\n }\n\n /**\n * Builds a byte array from UUIDv7 field values.\n *\n * @param unixTsMs - A 48-bit `unix_ts_ms` field value.\n * @param randA - A 12-bit `rand_a` field value.\n * @param randBHi - The higher 30 bits of 62-bit `rand_b` field value.\n * @param randBLo - The lower 32 bits of 62-bit `rand_b` field value.\n */\n static fromFieldsV7(unixTsMs: number, randA: number, randBHi: number, randBLo: number): UUID {\n if (\n !Number.isInteger(unixTsMs) ||\n !Number.isInteger(randA) ||\n !Number.isInteger(randBHi) ||\n !Number.isInteger(randBLo) ||\n unixTsMs < 0 ||\n randA < 0 ||\n randBHi < 0 ||\n randBLo < 0 ||\n unixTsMs > 0xffff_ffff_ffff ||\n randA > 0xfff ||\n randBHi > 0x3fff_ffff ||\n randBLo > 0xffff_ffff\n ) {\n throw new RangeError('invalid field value')\n }\n\n const bytes = new Uint8Array(16)\n bytes[0] = unixTsMs / 2 ** 40\n bytes[1] = unixTsMs / 2 ** 32\n bytes[2] = unixTsMs / 2 ** 24\n bytes[3] = unixTsMs / 2 ** 16\n bytes[4] = unixTsMs / 2 ** 8\n bytes[5] = unixTsMs\n bytes[6] = 0x70 | (randA >>> 8)\n bytes[7] = randA\n bytes[8] = 0x80 | (randBHi >>> 24)\n bytes[9] = randBHi >>> 16\n bytes[10] = randBHi >>> 8\n bytes[11] = randBHi\n bytes[12] = randBLo >>> 24\n bytes[13] = randBLo >>> 16\n bytes[14] = randBLo >>> 8\n bytes[15] = randBLo\n return new UUID(bytes)\n }\n\n /** @returns The 8-4-4-4-12 canonical hexadecimal string representation. */\n toString(): string {\n let text = ''\n for (let i = 0; i < this.bytes.length; i++) {\n text = text + DIGITS.charAt(this.bytes[i] >>> 4) + DIGITS.charAt(this.bytes[i] & 0xf)\n if (i === 3 || i === 5 || i === 7 || i === 9) {\n text += '-'\n }\n }\n\n if (text.length !== 36) {\n // We saw one customer whose bundling code was mangling the UUID generation\n // rather than accept a bad UUID, we throw an error here.\n throw new Error('Invalid UUIDv7 was generated')\n }\n return text\n }\n\n /** Creates an object from `this`. */\n clone(): UUID {\n return new UUID(this.bytes.slice(0))\n }\n\n /** Returns true if `this` is equivalent to `other`. */\n equals(other: UUID): boolean {\n return this.compareTo(other) === 0\n }\n\n /**\n * Returns a negative integer, zero, or positive integer if `this` is less\n * than, equal to, or greater than `other`, respectively.\n */\n compareTo(other: UUID): number {\n for (let i = 0; i < 16; i++) {\n const diff = this.bytes[i] - other.bytes[i]\n if (diff !== 0) {\n return Math.sign(diff)\n }\n }\n return 0\n }\n}\n\n/** Encapsulates the monotonic counter state. */\nclass V7Generator {\n private _timestamp = 0\n private _counter = 0\n private readonly _random = new DefaultRandom()\n\n /**\n * Generates a new UUIDv7 object from the current timestamp, or resets the\n * generator upon significant timestamp rollback.\n *\n * This method returns monotonically increasing UUIDs unless the up-to-date\n * timestamp is significantly (by ten seconds or more) smaller than the one\n * embedded in the immediately preceding UUID. If such a significant clock\n * rollback is detected, this method resets the generator and returns a new\n * UUID based on the current timestamp.\n */\n generate(): UUID {\n const value = this.generateOrAbort()\n if (!isUndefined(value)) {\n return value\n } else {\n // reset state and resume\n this._timestamp = 0\n const valueAfterReset = this.generateOrAbort()\n if (isUndefined(valueAfterReset)) {\n throw new Error('Could not generate UUID after timestamp reset')\n }\n return valueAfterReset\n }\n }\n\n /**\n * Generates a new UUIDv7 object from the current timestamp, or returns\n * `undefined` upon significant timestamp rollback.\n *\n * This method returns monotonically increasing UUIDs unless the up-to-date\n * timestamp is significantly (by ten seconds or more) smaller than the one\n * embedded in the immediately preceding UUID. If such a significant clock\n * rollback is detected, this method aborts and returns `undefined`.\n */\n generateOrAbort(): UUID | undefined {\n const MAX_COUNTER = 0x3ff_ffff_ffff\n const ROLLBACK_ALLOWANCE = 10_000 // 10 seconds\n\n const ts = Date.now()\n if (ts > this._timestamp) {\n this._timestamp = ts\n this._resetCounter()\n } else if (ts + ROLLBACK_ALLOWANCE > this._timestamp) {\n // go on with previous timestamp if new one is not much smaller\n this._counter++\n if (this._counter > MAX_COUNTER) {\n // increment timestamp at counter overflow\n this._timestamp++\n this._resetCounter()\n }\n } else {\n // abort if clock went backwards to unbearable extent\n return undefined\n }\n\n return UUID.fromFieldsV7(\n this._timestamp,\n Math.trunc(this._counter / 2 ** 30),\n this._counter & (2 ** 30 - 1),\n this._random.nextUint32()\n )\n }\n\n /** Initializes the counter at a 42-bit random integer. */\n private _resetCounter(): void {\n this._counter = this._random.nextUint32() * 0x400 + (this._random.nextUint32() & 0x3ff)\n }\n}\n\n/** A global flag to force use of cryptographically strong RNG. */\ndeclare const UUIDV7_DENY_WEAK_RNG: boolean\n\n/** Stores `crypto.getRandomValues()` available in the environment. */\nlet getRandomValues: <T extends Uint8Array | Uint32Array>(buffer: T) => T = (buffer) => {\n // fall back on Math.random() unless the flag is set to true\n // TRICKY: don't use the isUndefined method here as can't pass the reference\n if (typeof UUIDV7_DENY_WEAK_RNG !== 'undefined' && UUIDV7_DENY_WEAK_RNG) {\n throw new Error('no cryptographically strong RNG available')\n }\n\n for (let i = 0; i < buffer.length; i++) {\n buffer[i] = Math.trunc(Math.random() * 0x1_0000) * 0x1_0000 + Math.trunc(Math.random() * 0x1_0000)\n }\n return buffer\n}\n\n// detect Web Crypto API\nif (window && !isUndefined(window.crypto) && crypto.getRandomValues) {\n getRandomValues = (buffer) => crypto.getRandomValues(buffer)\n}\n\n/**\n * Wraps `crypto.getRandomValues()` and compatibles to enable buffering; this\n * uses a small buffer by default to avoid unbearable throughput decline in some\n * environments as well as the waste of time and space for unused values.\n */\nclass DefaultRandom {\n private readonly _buffer = new Uint32Array(8)\n private _cursor = Infinity\n nextUint32(): number {\n if (this._cursor >= this._buffer.length) {\n getRandomValues(this._buffer)\n this._cursor = 0\n }\n return this._buffer[this._cursor++]\n }\n}\n\nlet defaultGenerator: V7Generator | undefined\n\n/**\n * Generates a UUIDv7 string.\n *\n * @returns The 8-4-4-4-12 canonical hexadecimal string representation\n * (\"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\").\n */\nexport const uuidv7 = (): string => uuidv7obj().toString()\n\n/** Generates a UUIDv7 object. */\nconst uuidv7obj = (): UUID => (defaultGenerator || (defaultGenerator = new V7Generator())).generate()\n\nexport const uuid7ToTimestampMs = (uuid: string): number => {\n // remove hyphens\n const hex = uuid.replace(/-/g, '')\n // ensure that it's a version 7 UUID\n if (hex.length !== 32) {\n throw new Error('Not a valid UUID')\n }\n if (hex[12] !== '7') {\n throw new Error('Not a UUIDv7')\n }\n // the first 6 bytes are the timestamp, which means that we can read only the first 12 hex characters\n return parseInt(hex.substring(0, 12), 16)\n}\n","import { PostHog } from '../../../posthog-core'\nimport { UserProvidedTraits } from '../../../posthog-conversations-types'\nimport { createLogger } from '../../../utils/logger'\nimport { uuidv7 } from '../../../uuidv7'\n\nconst logger = createLogger('[ConversationsPersistence]')\n\n// Persistence keys - defined here in the lazy-loaded extension bundle\n// These keys are also listed in constants.ts PERSISTENCE_RESERVED_PROPERTIES\n// to prevent them from being included in event properties\nconst CONVERSATIONS_WIDGET_SESSION_ID = '$conversations_widget_session_id'\nconst CONVERSATIONS_TICKET_ID = '$conversations_ticket_id'\nconst CONVERSATIONS_WIDGET_STATE = '$conversations_widget_state'\nconst CONVERSATIONS_USER_TRAITS = '$conversations_user_traits'\n\n/**\n * ConversationsPersistence manages conversation-related data using PostHog's\n * core persistence layer. This ensures the data respects user's persistence\n * preferences (localStorage, cookie, sessionStorage, memory) and consent settings.\n */\nexport class ConversationsPersistence {\n private _cachedWidgetSessionId: string | null = null\n\n constructor(private readonly _posthog: PostHog) {}\n\n /** Check if persistence is available and enabled */\n private _isPersistenceAvailable(): boolean {\n return !!this._posthog.persistence && !this._posthog.persistence.isDisabled?.()\n }\n\n /**\n * Get or create the widget session ID (random UUID for access control).\n * This ID is generated once per browser and persists across sessions.\n * It is NOT tied to distinct_id - it stays the same even when user identifies.\n *\n * SECURITY: This is the key for access control. Only the browser that created\n * the widget_session_id can access tickets associated with it.\n */\n getOrCreateWidgetSessionId(): string {\n // Return cached value if available\n if (this._cachedWidgetSessionId) {\n return this._cachedWidgetSessionId\n }\n\n // Check if persistence is available\n if (!this._isPersistenceAvailable()) {\n // Fallback: generate a new one each time (won't persist)\n // This is acceptable for SSR or environments without persistence\n const sessionId = uuidv7()\n logger.warn('Persistence not available, widget_session_id will not persist', { sessionId })\n return sessionId\n }\n\n try {\n let sessionId = this._posthog.persistence?.get_property(CONVERSATIONS_WIDGET_SESSION_ID)\n if (!sessionId) {\n sessionId = uuidv7()\n this._posthog.persistence?.register({ [CONVERSATIONS_WIDGET_SESSION_ID]: sessionId })\n }\n this._cachedWidgetSessionId = sessionId\n return sessionId\n } catch (error) {\n logger.error('Failed to get/create widget_session_id', error)\n // Fallback: generate a new one (won't persist)\n return uuidv7()\n }\n }\n\n /**\n * Clear the widget session ID (called on posthog.reset()).\n * This will create a new session and lose access to previous tickets.\n */\n clearWidgetSessionId(): void {\n this._cachedWidgetSessionId = null\n\n if (!this._isPersistenceAvailable()) {\n return\n }\n\n try {\n this._posthog.persistence?.unregister(CONVERSATIONS_WIDGET_SESSION_ID)\n logger.info('Cleared widget_session_id')\n } catch (error) {\n logger.error('Failed to clear widget_session_id', error)\n }\n }\n\n /**\n * Save the current ticket ID to persistence\n */\n saveTicketId(ticketId: string): void {\n if (!this._isPersistenceAvailable()) {\n logger.warn('Persistence not available')\n return\n }\n\n try {\n this._posthog.persistence?.register({ [CONVERSATIONS_TICKET_ID]: ticketId })\n logger.info('Saved ticket ID', { ticketId })\n } catch (error) {\n logger.error('Failed to save ticket ID', error)\n }\n }\n\n /**\n * Load the current ticket ID from persistence\n */\n loadTicketId(): string | null {\n if (!this._isPersistenceAvailable()) {\n logger.warn('Persistence not available')\n return null\n }\n\n try {\n const ticketId = this._posthog.persistence?.get_property(CONVERSATIONS_TICKET_ID)\n if (ticketId) {\n logger.info('Loaded ticket ID', { ticketId })\n }\n return ticketId || null\n } catch (error) {\n logger.error('Failed to load ticket ID', error)\n return null\n }\n }\n\n /**\n * Clear the current ticket ID from persistence\n */\n clearTicketId(): void {\n if (!this._isPersistenceAvailable()) {\n logger.warn('Persistence not available')\n return\n }\n\n try {\n this._posthog.persistence?.unregister(CONVERSATIONS_TICKET_ID)\n logger.info('Cleared ticket ID')\n } catch (error) {\n logger.error('Failed to clear ticket ID', error)\n }\n }\n\n /**\n * Save widget state (open, closed)\n */\n saveWidgetState(state: 'open' | 'closed'): void {\n if (!this._isPersistenceAvailable()) {\n return\n }\n\n try {\n this._posthog.persistence?.register({ [CONVERSATIONS_WIDGET_STATE]: state })\n } catch (error) {\n logger.error('Failed to save widget state', error)\n }\n }\n\n /**\n * Load widget state\n */\n loadWidgetState(): 'open' | 'closed' | null {\n if (!this._isPersistenceAvailable()) {\n return null\n }\n\n try {\n const state = this._posthog.persistence?.get_property(CONVERSATIONS_WIDGET_STATE)\n if (state === 'open' || state === 'closed') {\n return state\n }\n return null\n } catch (error) {\n logger.error('Failed to load widget state', error)\n return null\n }\n }\n\n /**\n * Save user-provided traits (name, email) to persistence\n */\n saveUserTraits(traits: UserProvidedTraits): void {\n if (!this._isPersistenceAvailable()) {\n logger.warn('Persistence not available')\n return\n }\n\n try {\n this._posthog.persistence?.register({ [CONVERSATIONS_USER_TRAITS]: traits })\n logger.info('Saved user traits', { hasName: !!traits.name, hasEmail: !!traits.email })\n } catch (error) {\n logger.error('Failed to save user traits', error)\n }\n }\n\n /**\n * Load user-provided traits from persistence\n */\n loadUserTraits(): UserProvidedTraits | null {\n if (!this._isPersistenceAvailable()) {\n return null\n }\n\n try {\n const traits = this._posthog.persistence?.get_property(CONVERSATIONS_USER_TRAITS) as\n | UserProvidedTraits\n | undefined\n if (traits) {\n logger.info('Loaded user traits', { hasName: !!traits.name, hasEmail: !!traits.email })\n return traits\n }\n return null\n } catch (error) {\n logger.error('Failed to load user traits', error)\n return null\n }\n }\n\n /**\n * Clear user-provided traits from persistence\n */\n clearUserTraits(): void {\n if (!this._isPersistenceAvailable()) {\n return\n }\n\n try {\n this._posthog.persistence?.unregister(CONVERSATIONS_USER_TRAITS)\n logger.info('Cleared user traits')\n } catch (error) {\n logger.error('Failed to clear user traits', error)\n }\n }\n\n /**\n * Clear all conversation-related data from persistence.\n * This is called on posthog.reset() to start fresh.\n */\n clearAll(): void {\n if (!this._isPersistenceAvailable()) {\n return\n }\n\n try {\n // Clear all conversation properties\n this._posthog.persistence?.unregister(CONVERSATIONS_WIDGET_STATE)\n this._posthog.persistence?.unregister(CONVERSATIONS_USER_TRAITS)\n this._posthog.persistence?.unregister(CONVERSATIONS_TICKET_ID)\n\n // Clear widget session ID last (this will lose access to previous tickets)\n this.clearWidgetSessionId()\n\n logger.info('Cleared all conversation data')\n } catch (error) {\n logger.error('Failed to clear conversation data', error)\n }\n }\n}\n","// Inline styles following PostHog design system\n\nimport type { WidgetPosition } from '../../../../posthog-conversations-types'\nimport { Z_INDEX_CONVERSATIONS } from '../../../../constants'\n\n/**\n * Calculate contrasting text color (black or white) based on background brightness\n * Uses HSP (Highly Sensitive Purity) brightness formula\n */\nfunction getContrastTextColor(hexColor: string): string {\n const hex = hexColor.replace(/^#/, '')\n const fullHex = hex.length === 3 ? hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2] : hex\n\n const r = parseInt(fullHex.slice(0, 2), 16)\n const g = parseInt(fullHex.slice(2, 4), 16)\n const b = parseInt(fullHex.slice(4, 6), 16)\n\n // HSP brightness formula\n const hsp = Math.sqrt(0.299 * (r * r) + 0.587 * (g * g) + 0.114 * (b * b))\n return hsp > 127.5 ? '#020617' : 'white'\n}\n\nexport const getStyles = (primaryColor: string, position: WidgetPosition = 'bottom_right') => {\n const isLeft = position.includes('left')\n const isTop = position.includes('top')\n\n return {\n widget: {\n position: 'fixed' as const,\n ...(isTop ? { top: '20px' } : { bottom: '20px' }),\n ...(isLeft ? { left: '20px' } : { right: '20px' }),\n zIndex: Z_INDEX_CONVERSATIONS,\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Inter\", \"Segoe UI\", \"Roboto\", Helvetica, Arial, sans-serif',\n },\n buttonContainer: {\n position: 'relative' as const,\n },\n button: {\n width: '50px',\n height: '50px',\n borderRadius: '50%',\n background: primaryColor,\n color: getContrastTextColor(primaryColor),\n border: 'none',\n cursor: 'pointer',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'transform 0.2s ease-out, box-shadow 0.2s ease-out',\n },\n unreadBadge: {\n position: 'absolute' as const,\n ...(isTop ? { bottom: '-4px' } : { top: '-4px' }),\n ...(isLeft ? { left: '-4px' } : { right: '-4px' }),\n minWidth: '20px',\n height: '20px',\n borderRadius: '10px',\n background: '#ef4444',\n color: 'white',\n fontSize: '11px',\n fontWeight: 600,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0 5px',\n boxShadow: '0 2px 4px rgba(0, 0, 0, 0.2)',\n border: '2px solid white',\n boxSizing: 'border-box' as const,\n },\n window: {\n position: 'absolute' as const,\n ...(isTop ? { top: 0 } : { bottom: 0 }),\n ...(isLeft ? { left: 0 } : { right: 0 }),\n background: 'white',\n borderRadius: '10px',\n boxShadow: '0 10px 25px -3px rgba(0,0,0,0.12), 0 4px 12px -2px rgba(0,0,0,0.10)',\n display: 'flex',\n flexDirection: 'column' as const,\n overflow: 'hidden',\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n //border: '1px solid #dcdcdc',\n border: 'none',\n },\n windowOpen: {\n width: '400px',\n maxWidth: 'calc(100vw - 40px)',\n height: '600px',\n maxHeight: 'calc(100vh - 100px)',\n },\n header: {\n background: primaryColor,\n color: getContrastTextColor(primaryColor),\n padding: '8px 12px',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n flexShrink: 0,\n },\n headerTitle: {\n fontWeight: 500,\n fontSize: '14px',\n },\n headerActions: {\n display: 'flex',\n gap: '4px',\n },\n headerButton: {\n background: 'transparent',\n border: 'none',\n color: getContrastTextColor(primaryColor),\n cursor: 'pointer',\n padding: '6px 8px',\n fontSize: '16px',\n lineHeight: 1,\n borderRadius: '4px',\n transition: 'background 0.2s ease-out',\n opacity: 0.9,\n },\n messages: {\n flex: 1,\n overflowY: 'auto' as const,\n padding: '14px',\n display: 'flex',\n flexDirection: 'column' as const,\n gap: '8px',\n background: 'white',\n },\n message: {\n display: 'flex',\n flexDirection: 'column' as const,\n maxWidth: '85%',\n animation: 'fadeIn 0.2s ease-out',\n },\n messageCustomer: {\n alignSelf: 'flex-end',\n alignItems: 'flex-end',\n },\n messageAgent: {\n alignSelf: 'flex-start',\n alignItems: 'flex-start',\n },\n messageAuthor: {\n fontSize: '10px',\n color: '#939393',\n marginBottom: '4px',\n fontWeight: 500,\n },\n messageContent: {\n padding: '8px 12px',\n borderRadius: '8px',\n fontSize: '12px',\n lineHeight: 1.5,\n wordWrap: 'break-word' as const,\n whiteSpace: 'pre-wrap' as const,\n },\n messageContentCustomer: {\n background: primaryColor,\n color: getContrastTextColor(primaryColor),\n borderBottomRightRadius: '2px',\n },\n messageContentAgent: {\n background: 'white',\n color: '#020617',\n border: '1.5px solid #dcdcdc',\n borderBottomLeftRadius: '2px',\n },\n messageTime: {\n fontSize: '10px',\n color: '#939393',\n marginTop: '4px',\n opacity: 0.8,\n },\n error: {\n padding: '10px 16px',\n background: '#fee2e2',\n color: '#991b1b',\n fontSize: '13px',\n borderTop: '1px solid #fecaca',\n borderBottom: '1px solid #fecaca',\n textAlign: 'center' as const,\n fontWeight: 500,\n },\n inputContainer: {\n padding: '8px 12px',\n background: 'white',\n borderTop: '1px solid #dcdcdc',\n display: 'flex',\n gap: '8px',\n alignItems: 'center', // Changed from flex-end to center to vertically align input and sendButton\n flexShrink: 0,\n },\n input: {\n flex: 1,\n maxHeight: '120px',\n fontSize: '14px',\n resize: 'vertical',\n fontFamily: 'inherit',\n lineHeight: 1.5,\n color: '#020617',\n background: 'white',\n border: 'none',\n outline: 'none',\n transition: 'border-color 0.2s ease-out, box-shadow 0.2s ease-out',\n display: 'flex',\n alignItems: 'center',\n fieldSizing: 'content',\n },\n sendButton: {\n width: '33px',\n height: '33px', // Match input minHeight for vertical alignment\n borderRadius: '10px',\n background: primaryColor,\n color: getContrastTextColor(primaryColor),\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s ease-out',\n boxShadow: '0 2px 0 rgba(0, 0, 0, 0.045)',\n fontWeight: 700,\n flexShrink: 0,\n },\n // Identification form styles\n identificationForm: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column' as const,\n padding: '24px',\n background: '#eeeded',\n overflowY: 'auto' as const,\n },\n formTitle: {\n fontSize: '18px',\n fontWeight: 600,\n color: '#020617',\n marginBottom: '8px',\n },\n formDescription: {\n fontSize: '14px',\n color: '#64748b',\n marginBottom: '24px',\n lineHeight: 1.5,\n },\n formField: {\n marginBottom: '16px',\n },\n formLabel: {\n display: 'block',\n fontSize: '13px',\n fontWeight: 500,\n color: '#020617',\n marginBottom: '6px',\n },\n formInput: {\n width: '100%',\n padding: '10px 12px',\n border: '1px solid #dcdcdc',\n borderRadius: '6px',\n fontSize: '14px',\n fontFamily: 'inherit',\n color: '#020617',\n background: 'white',\n transition: 'border-color 0.2s ease-out, box-shadow 0.2s ease-out',\n boxSizing: 'border-box' as const,\n },\n formInputError: {\n borderColor: '#ef4444',\n },\n formError: {\n fontSize: '12px',\n color: '#ef4444',\n marginTop: '4px',\n },\n formSubmitButton: {\n width: '100%',\n padding: '12px 16px',\n borderRadius: '6px',\n background: primaryColor,\n color: getContrastTextColor(primaryColor),\n border: 'none',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: 600,\n transition: 'all 0.2s ease-out',\n marginTop: '8px',\n },\n formOptional: {\n fontSize: '12px',\n color: '#939393',\n fontWeight: 400,\n },\n // Ticket list styles\n ticketListContainer: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column' as const,\n background: 'white',\n overflowY: 'auto' as const,\n },\n ticketList: {\n flex: 1,\n overflowY: 'auto' as const,\n },\n ticketItem: {\n padding: '14px 16px',\n borderBottom: '1px solid #f1f1f1',\n cursor: 'pointer',\n transition: 'background 0.15s ease-out',\n background: 'white',\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n },\n ticketItemUnread: {\n background: '#fafafa',\n },\n ticketItemContent: {\n display: 'flex',\n flexDirection: 'column' as const,\n gap: '6px',\n flex: 1,\n minWidth: 0, // Allow text truncation\n },\n ticketItemArrow: {\n color: '#939393',\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n },\n ticketItemHeader: {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n gap: '8px',\n },\n ticketPreview: {\n fontSize: '13px',\n color: '#020617',\n lineHeight: 1.4,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap' as const,\n },\n ticketPreviewUnread: {\n fontSize: '13px',\n color: '#020617',\n lineHeight: 1.4,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap' as const,\n fontWeight: 600,\n },\n ticketUnreadBadge: {\n minWidth: '18px',\n height: '18px',\n borderRadius: '9px',\n background: '#ef4444',\n color: 'white',\n fontSize: '10px',\n fontWeight: 600,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '0 5px',\n flexShrink: 0,\n },\n ticketMeta: {\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n },\n ticketTime: {\n fontSize: '11px',\n color: '#939393',\n },\n ticketStatus: {\n fontSize: '10px',\n color: '#64748b',\n background: '#f1f5f9',\n padding: '2px 6px',\n borderRadius: '4px',\n textTransform: 'uppercase' as const,\n letterSpacing: '0.3px',\n },\n newConversationButton: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n margin: '12px 16px',\n padding: '10px 16px',\n borderRadius: '8px',\n background: primaryColor,\n color: getContrastTextColor(primaryColor),\n border: 'none',\n cursor: 'pointer',\n fontSize: '13px',\n fontWeight: 500,\n transition: 'all 0.2s ease-out',\n },\n // Ticket list loading state\n ticketListLoading: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column' as const,\n alignItems: 'center',\n justifyContent: 'center',\n gap: '12px',\n color: '#64748b',\n fontSize: '13px',\n },\n loadingSpinner: {\n width: '24px',\n height: '24px',\n border: '2px solid #e2e8f0',\n borderTop: `2px solid ${primaryColor}`,\n borderRadius: '50%',\n animation: 'spin 0.8s linear infinite',\n },\n // Ticket list empty state\n ticketListEmpty: {\n flex: 1,\n display: 'flex',\n flexDirection: 'column' as const,\n alignItems: 'center',\n justifyContent: 'center',\n padding: '32px 24px',\n textAlign: 'center' as const,\n },\n emptyStateIcon: {\n color: '#cbd5e1',\n marginBottom: '16px',\n },\n emptyStateTitle: {\n fontSize: '16px',\n fontWeight: 600,\n color: '#020617',\n marginBottom: '8px',\n },\n emptyStateDescription: {\n fontSize: '13px',\n color: '#64748b',\n lineHeight: 1.5,\n marginBottom: '20px',\n },\n newConversationButtonLarge: {\n padding: '12px 24px',\n borderRadius: '8px',\n background: primaryColor,\n color: getContrastTextColor(primaryColor),\n border: 'none',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: 600,\n transition: 'all 0.2s ease-out',\n },\n // Back button for message view header\n backButton: {\n background: 'transparent',\n border: 'none',\n color: getContrastTextColor(primaryColor),\n cursor: 'pointer',\n padding: '6px 0px',\n marginRight: '4px',\n fontSize: '16px',\n lineHeight: 1,\n borderRadius: '4px',\n transition: 'background 0.2s ease-out',\n opacity: 0.9,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n },\n // Header with back button layout\n headerWithBack: {\n display: 'flex',\n alignItems: 'center',\n },\n }\n}\n","/*\n * Constants\n */\n\n/* PROPERTY KEYS */\n\n// This key is deprecated, but we want to check for it to see whether aliasing is allowed.\nexport const PEOPLE_DISTINCT_ID_KEY = '$people_distinct_id'\nexport const DISTINCT_ID = 'distinct_id'\nexport const DEVICE_ID = '$device_id'\nexport const ALIAS_ID_KEY = '__alias'\nexport const CAMPAIGN_IDS_KEY = '__cmpns'\nexport const EVENT_TIMERS_KEY = '__timers'\nexport const AUTOCAPTURE_DISABLED_SERVER_SIDE = '$autocapture_disabled_server_side'\nexport const HEATMAPS_ENABLED_SERVER_SIDE = '$heatmaps_enabled_server_side'\nexport const EXCEPTION_CAPTURE_ENABLED_SERVER_SIDE = '$exception_capture_enabled_server_side'\nexport const ERROR_TRACKING_SUPPRESSION_RULES = '$error_tracking_suppression_rules'\nexport const ERROR_TRACKING_CAPTURE_EXTENSION_EXCEPTIONS = '$error_tracking_capture_extension_exceptions'\nexport const WEB_VITALS_ENABLED_SERVER_SIDE = '$web_vitals_enabled_server_side'\nexport const DEAD_CLICKS_ENABLED_SERVER_SIDE = '$dead_clicks_enabled_server_side'\nexport const PRODUCT_TOURS_ENABLED_SERVER_SIDE = '$product_tours_enabled_server_side'\nexport const WEB_VITALS_ALLOWED_METRICS = '$web_vitals_allowed_metrics'\nexport const SESSION_RECORDING_REMOTE_CONFIG = '$session_recording_remote_config'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_ENABLED_SERVER_SIDE = '$session_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE = '$console_log_recording_enabled_server_side'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_NETWORK_PAYLOAD_CAPTURE = '$session_recording_network_payload_capture'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MASKING = '$session_recording_masking'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_CANVAS_RECORDING = '$session_recording_canvas_recording'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SAMPLE_RATE = '$replay_sample_rate'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_MINIMUM_DURATION = '$replay_minimum_duration'\n// @deprecated can be removed along with eager loaded replay\nexport const SESSION_RECORDING_SCRIPT_CONFIG = '$replay_script_config'\nexport const SESSION_RECORDING_OVERRIDE_SAMPLING = '$replay_override_sampling'\nexport const SESSION_RECORDING_OVERRIDE_LINKED_FLAG = '$replay_override_linked_flag'\nexport const SESSION_RECORDING_OVERRIDE_URL_TRIGGER = '$replay_override_url_trigger'\nexport const SESSION_RECORDING_OVERRIDE_EVENT_TRIGGER = '$replay_override_event_trigger'\nexport const SESSION_ID = '$sesid'\nexport const SESSION_RECORDING_IS_SAMPLED = '$session_is_sampled'\nexport const SESSION_RECORDING_PAST_MINIMUM_DURATION = '$session_past_minimum_duration'\nexport const SESSION_RECORDING_URL_TRIGGER_ACTIVATED_SESSION = '$session_recording_url_trigger_activated_session'\nexport const SESSION_RECORDING_EVENT_TRIGGER_ACTIVATED_SESSION = '$session_recording_event_trigger_activated_session'\nexport const SESSION_RECORDING_FIRST_FULL_SNAPSHOT_TIMESTAMP = '$debug_first_full_snapshot_timestamp'\nexport const ENABLED_FEATURE_FLAGS = '$enabled_feature_flags'\nexport const PERSISTENCE_EARLY_ACCESS_FEATURES = '$early_access_features'\nexport const PERSISTENCE_FEATURE_FLAG_DETAILS = '$feature_flag_details'\nexport const STORED_PERSON_PROPERTIES_KEY = '$stored_person_properties'\nexport const STORED_GROUP_PROPERTIES_KEY = '$stored_group_properties'\nexport const SURVEYS = '$surveys'\nexport const SURVEYS_ACTIVATED = '$surveys_activated'\nexport const PRODUCT_TOURS_ACTIVATED = '$product_tours_activated'\nexport const CONVERSATIONS = '$conversations'\nexport const FLAG_CALL_REPORTED = '$flag_call_reported'\nexport const PERSISTENCE_FEATURE_FLAG_ERRORS = '$feature_flag_errors'\nexport const USER_STATE = '$user_state'\nexport const CLIENT_SESSION_PROPS = '$client_session_props'\nexport const CAPTURE_RATE_LIMIT = '$capture_rate_limit'\n\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_CAMPAIGN_PARAMS = '$initial_campaign_params'\n/** @deprecated Delete this when INITIAL_PERSON_INFO has been around for long enough to ignore backwards compat */\nexport const INITIAL_REFERRER_INFO = '$initial_referrer_info'\nexport const INITIAL_PERSON_INFO = '$initial_person_info'\nexport const ENABLE_PERSON_PROCESSING = '$epp'\nexport const TOOLBAR_ID = '__POSTHOG_TOOLBAR__'\nexport const TOOLBAR_CONTAINER_CLASS = 'toolbar-global-fade-container'\n\n/**\n * PREVIEW - MAY CHANGE WITHOUT WARNING - DO NOT USE IN PRODUCTION\n * Sentinel value for distinct id, device id, session id. Signals that the server should generate the value\n * */\nexport const COOKIELESS_SENTINEL_VALUE = '$posthog_cookieless'\nexport const COOKIELESS_MODE_FLAG_PROPERTY = '$cookieless_mode'\n\nexport const WEB_EXPERIMENTS = '$web_experiments'\n\n// These are properties that are reserved and will not be automatically included in events\nexport const PERSISTENCE_RESERVED_PROPERTIES = [\n PEOPLE_DISTINCT_ID_KEY,\n ALIAS_ID_KEY,\n CAMPAIGN_IDS_KEY,\n EVENT_TIMERS_KEY,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n HEATMAPS_ENABLED_SERVER_SIDE,\n SESSION_ID,\n ENABLED_FEATURE_FLAGS,\n ERROR_TRACKING_SUPPRESSION_RULES,\n USER_STATE,\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n PERSISTENCE_FEATURE_FLAG_DETAILS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n SURVEYS,\n FLAG_CALL_REPORTED,\n PERSISTENCE_FEATURE_FLAG_ERRORS,\n CLIENT_SESSION_PROPS,\n CAPTURE_RATE_LIMIT,\n INITIAL_CAMPAIGN_PARAMS,\n INITIAL_REFERRER_INFO,\n ENABLE_PERSON_PROCESSING,\n INITIAL_PERSON_INFO,\n // Conversations keys (defined in lazy-loaded extension)\n '$conversations_widget_session_id',\n '$conversations_ticket_id',\n '$conversations_widget_state',\n '$conversations_user_traits',\n]\n\nexport const SURVEYS_REQUEST_TIMEOUT_MS = 10000\n\n/* Z-INDEX HIERARCHY: tours > surveys > support */\nexport const Z_INDEX_TOURS = 2147483646\nexport const Z_INDEX_SURVEYS = 2147483645\nexport const Z_INDEX_CONVERSATIONS = 2147483644\n","import type { WidgetPosition } from '../../../../posthog-conversations-types'\nimport { getStyles } from './styles'\n\ninterface OpenChatButtonProps {\n primaryColor: string\n position?: WidgetPosition\n handleToggleOpen: () => void\n unreadCount?: number\n}\n\nexport const OpenChatButton = ({\n primaryColor,\n position = 'bottom_right',\n handleToggleOpen,\n unreadCount = 0,\n}: OpenChatButtonProps) => {\n const styles = getStyles(primaryColor, position)\n const displayCount = unreadCount > 99 ? '99+' : unreadCount.toString()\n\n return (\n <div style={styles.widget}>\n <div style={styles.buttonContainer}>\n <button\n style={styles.button}\n onClick={handleToggleOpen}\n aria-label={unreadCount > 0 ? `Open chat (${unreadCount} unread)` : 'Open chat'}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = 'scale(1.05)'\n e.currentTarget.style.boxShadow = '0 6px 20px rgba(0, 0, 0, 0.2)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'scale(1)'\n e.currentTarget.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.15)'\n }}\n >\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M12 2C6.48 2 2 6.48 2 12C2 13.93 2.6 15.71 3.64 17.18L2.5 21.5L7.04 20.42C8.46 21.28 10.17 21.75 12 21.75C17.52 21.75 22 17.27 22 11.75C22 6.23 17.52 2 12 2Z\"\n fill=\"currentColor\"\n />\n </svg>\n </button>\n {unreadCount > 0 && <div style={styles.unreadBadge}>{displayCount}</div>}\n </div>\n </div>\n )\n}\n","import{options as n}from\"preact\";var t,r,u,i,o=0,f=[],c=n,e=c.__b,a=c.__r,v=c.diffed,l=c.__c,m=c.unmount,s=c.__;function p(n,t){c.__h&&c.__h(r,n,o||t),o=0;var u=r.__H||(r.__H={__:[],__h:[]});return n>=u.__.length&&u.__.push({}),u.__[n]}function d(n){return o=1,h(D,n)}function h(n,u,i){var o=p(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):D(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.__f)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return!!n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=o.__c.props!==n;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),c&&c.call(this,n,t,r)||i};r.__f=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function y(n,u){var i=p(t++,3);!c.__s&&C(i.__H,u)&&(i.__=n,i.u=u,r.__H.__h.push(i))}function _(n,u){var i=p(t++,4);!c.__s&&C(i.__H,u)&&(i.__=n,i.u=u,r.__h.push(i))}function A(n){return o=5,T(function(){return{current:n}},[])}function F(n,t,r){o=6,_(function(){if(\"function\"==typeof n){var r=n(t());return function(){n(null),r&&\"function\"==typeof r&&r()}}if(n)return n.current=t(),function(){return n.current=null}},null==r?r:r.concat(n))}function T(n,r){var u=p(t++,7);return C(u.__H,r)&&(u.__=n(),u.__H=r,u.__h=n),u.__}function q(n,t){return o=8,T(function(){return n},t)}function x(n){var u=r.context[n.__c],i=p(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function P(n,t){c.useDebugValue&&c.useDebugValue(t?t(n):n)}function b(n){var u=p(t++,10),i=d();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function g(){var n=p(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__=\"P\"+i[0]+\"-\"+i[1]++}return n.__}function j(){for(var n;n=f.shift();)if(n.__P&&n.__H)try{n.__H.__h.forEach(z),n.__H.__h.forEach(B),n.__H.__h=[]}catch(t){n.__H.__h=[],c.__e(t,n.__v)}}c.__b=function(n){r=null,e&&e(n)},c.__=function(n,t){n&&t.__k&&t.__k.__m&&(n.__m=t.__k.__m),s&&s(n,t)},c.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.u=n.__N=void 0})):(i.__h.forEach(z),i.__h.forEach(B),i.__h=[],t=0)),u=r},c.diffed=function(n){v&&v(n);var t=n.__c;t&&t.__H&&(t.__H.__h.length&&(1!==f.push(t)&&i===c.requestAnimationFrame||((i=c.requestAnimationFrame)||w)(j)),t.__H.__.forEach(function(n){n.u&&(n.__H=n.u),n.u=void 0})),u=r=null},c.__c=function(n,t){t.some(function(n){try{n.__h.forEach(z),n.__h=n.__h.filter(function(n){return!n.__||B(n)})}catch(r){t.some(function(n){n.__h&&(n.__h=[])}),t=[],c.__e(r,n.__v)}}),l&&l(n,t)},c.unmount=function(n){m&&m(n);var t,r=n.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{z(n)}catch(n){t=n}}),r.__H=void 0,t&&c.__e(t,r.__v))};var k=\"function\"==typeof requestAnimationFrame;function w(n){var t,r=function(){clearTimeout(u),k&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,35);k&&(t=requestAnimationFrame(r))}function z(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function B(n){var t=r;n.__c=n.__(),r=t}function C(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function D(n,t){return\"function\"==typeof t?t(n):t}export{q as useCallback,x as useContext,P as useDebugValue,y as useEffect,b as useErrorBoundary,g as useId,F as useImperativeHandle,_ as useLayoutEffect,T as useMemo,h as useReducer,A as useRef,d as useState};\n//# sourceMappingURL=hooks.module.js.map\n","import { getStyles } from './styles'\n\ninterface SendMessageButtonProps {\n primaryColor: string\n inputValue: string\n isLoading: boolean\n handleSendMessage: () => void\n}\n\nexport const SendMessageButton = ({\n primaryColor,\n inputValue,\n isLoading,\n handleSendMessage,\n}: SendMessageButtonProps) => {\n const styles = getStyles(primaryColor)\n return (\n <button\n style={{\n ...styles.sendButton,\n opacity: !inputValue.trim() || isLoading ? 0.6 : 1,\n cursor: !inputValue.trim() || isLoading ? 'not-allowed' : 'pointer',\n }}\n onClick={handleSendMessage}\n disabled={!inputValue.trim() || isLoading}\n aria-label=\"Send message\"\n onMouseEnter={(e) => {\n if (!e.currentTarget.disabled) {\n e.currentTarget.style.transform = 'scale(1.02)'\n e.currentTarget.style.boxShadow = '0 4px 8px rgba(0, 0, 0, 0.1)'\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'scale(1)'\n e.currentTarget.style.boxShadow = '0 2px 0 rgba(0, 0, 0, 0.045)'\n }}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M2 10L18 2L10 18L8 11L2 10Z\"\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )\n}\n","import { getStyles } from './styles'\n\ninterface CloseChatButtonProps {\n primaryColor: string\n handleClose: () => void\n}\n\nexport const CloseChatButton = ({ primaryColor, handleClose }: CloseChatButtonProps) => {\n const styles = getStyles(primaryColor)\n return (\n <button\n style={styles.headerButton}\n onClick={handleClose}\n aria-label=\"Close\"\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.15)'\n e.currentTarget.style.opacity = '1'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent'\n e.currentTarget.style.opacity = '0.9'\n }}\n >\n ✕\n </button>\n )\n}\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { h, Fragment } from 'preact'\nimport { useMemo } from 'preact/hooks'\nimport { isUndefined, isNumber, isArray } from '@posthog/core'\nimport { TipTapDoc, TipTapNode, TipTapMark } from '../../../../posthog-conversations-types'\n\ninterface RichContentProps {\n /** Rich content in TipTap JSON format (preferred) */\n richContent?: TipTapDoc\n /** Plain text fallback if rich_content is missing or invalid */\n content: string\n /** Whether message is from customer (affects styling) */\n isCustomer: boolean\n /** Primary color for links */\n primaryColor: string\n}\n\n/**\n * Sanitize URL to prevent javascript: and other dangerous protocols.\n * Only allows http:, https:, mailto:, tel:, and relative URLs.\n *\n * Security measures:\n * - Removes ASCII control characters (0x00-0x1F, 0x7F) that could obfuscate protocols\n * - Removes Unicode whitespace and zero-width characters\n * - Collapses whitespace when checking protocols to prevent \"java script:\" bypasses\n * - Blocks javascript:, vbscript:, data:, and file: protocols\n * - Blocks protocol-relative URLs (//example.com)\n */\nfunction sanitizeUrl(url: string): string | undefined {\n if (!url || typeof url !== 'string') {\n return undefined\n }\n\n // Remove ASCII control characters (0x00-0x1F, 0x7F DEL) that could obfuscate protocols\n // Also remove zero-width characters (U+200B-U+200D, U+FEFF) that could be used for obfuscation\n // eslint-disable-next-line no-control-regex\n const cleanedUrl = url.replace(/[\\x00-\\x1f\\x7f\\u200b-\\u200d\\ufeff]/g, '')\n const trimmedUrl = cleanedUrl.trim()\n if (!trimmedUrl) {\n return undefined\n }\n\n // Collapse all whitespace (including Unicode whitespace) when checking protocol\n // This prevents bypasses like \"java script:\" or \"java\\u00A0script:\" (non-breaking space)\n const normalizedForCheck = trimmedUrl.replace(/\\s+/g, '').toLowerCase()\n\n // Block dangerous protocols\n if (\n normalizedForCheck.startsWith('javascript:') ||\n normalizedForCheck.startsWith('vbscript:') ||\n normalizedForCheck.startsWith('data:') ||\n normalizedForCheck.startsWith('file:')\n ) {\n return undefined\n }\n\n // Allow relative URLs (check against trimmed URL, not normalized)\n // Note: We explicitly check for '//' first to block protocol-relative URLs (e.g., //evil.com)\n // which could be used to load content from attacker-controlled domains\n if (trimmedUrl.startsWith('//')) {\n return undefined\n }\n if (\n trimmedUrl.startsWith('/') ||\n trimmedUrl.startsWith('./') ||\n trimmedUrl.startsWith('../') ||\n trimmedUrl.startsWith('#')\n ) {\n return trimmedUrl\n }\n\n // Allow safe absolute URLs\n const lowerUrl = trimmedUrl.toLowerCase()\n if (\n lowerUrl.startsWith('http://') ||\n lowerUrl.startsWith('https://') ||\n lowerUrl.startsWith('mailto:') ||\n lowerUrl.startsWith('tel:')\n ) {\n return trimmedUrl\n }\n\n return undefined\n}\n\n/** Maximum recursion depth to prevent stack overflow */\nconst MAX_DEPTH = 20\n\nfunction getStyles(isCustomer: boolean, primaryColor: string) {\n return {\n code: {\n fontFamily: 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace',\n fontSize: '0.9em',\n padding: '2px 4px',\n borderRadius: '3px',\n background: isCustomer ? 'rgba(255, 255, 255, 0.2)' : 'rgba(0, 0, 0, 0.06)',\n },\n codeBlock: {\n fontFamily: 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, Consolas, \"Liberation Mono\", monospace',\n fontSize: '0.85em',\n padding: '8px 10px',\n borderRadius: '6px',\n background: isCustomer ? 'rgba(255, 255, 255, 0.15)' : '#f4f4f5',\n overflowX: 'auto' as const,\n whiteSpace: 'pre-wrap' as const,\n wordWrap: 'break-word' as const,\n wordBreak: 'break-word' as const,\n margin: '8px 0',\n display: 'block',\n lineHeight: 1.5,\n border: isCustomer ? 'none' : '1px solid #e4e4e7',\n },\n link: {\n color: isCustomer ? 'white' : primaryColor,\n textDecoration: 'underline',\n },\n image: {\n maxWidth: '100%',\n borderRadius: '4px',\n marginTop: '4px',\n marginBottom: '4px',\n display: 'block',\n },\n }\n}\n\n/**\n * Render a text node with its marks (bold, italic, underline, etc.)\n * Marks are applied by wrapping the content in nested elements.\n */\nfunction renderTextWithMarks(\n text: string,\n marks: TipTapMark[] | undefined,\n styles: ReturnType<typeof getStyles>,\n key: string\n): preact.JSX.Element {\n if (!marks || marks.length === 0) {\n return <span key={key}>{text}</span>\n }\n\n // Build the element by wrapping with marks from inside out\n let element: preact.JSX.Element = <>{text}</>\n\n for (const mark of marks) {\n switch (mark.type) {\n case 'bold':\n element = <strong style={{ fontWeight: 700 }}>{element}</strong>\n break\n case 'italic':\n element = <em style={{ fontStyle: 'italic' }}>{element}</em>\n break\n case 'underline':\n element = <u style={{ textDecoration: 'underline' }}>{element}</u>\n break\n case 'strike':\n element = <s style={{ textDecoration: 'line-through' }}>{element}</s>\n break\n case 'code':\n element = <code style={styles.code}>{element}</code>\n break\n case 'link': {\n const href = mark.attrs?.href\n const safeUrl = typeof href === 'string' ? sanitizeUrl(href) : undefined\n if (safeUrl) {\n element = (\n <a\n href={safeUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n referrerPolicy=\"no-referrer\"\n style={styles.link}\n >\n {element}\n </a>\n )\n }\n break\n }\n // Ignore unknown mark types for safety\n }\n }\n\n return <span key={key}>{element}</span>\n}\n\n/**\n * Recursively render a TipTap node and its children\n */\nfunction renderNode(\n node: TipTapNode | TipTapDoc,\n styles: ReturnType<typeof getStyles>,\n depth: number,\n key: string\n): preact.JSX.Element | null {\n // Safety: prevent infinite recursion\n if (depth > MAX_DEPTH) {\n return null\n }\n\n // Text node with optional marks\n if (node.type === 'text' && !isUndefined(node.text)) {\n return renderTextWithMarks(node.text, node.marks, styles, key)\n }\n\n // Render children recursively\n const children = node.content?.map((child, index) => renderNode(child, styles, depth + 1, `${key}-${index}`)) || []\n\n switch (node.type) {\n case 'doc':\n return <>{children}</>\n\n case 'paragraph':\n return (\n <p key={key} style={{ margin: '0 0 8px 0' }}>\n {children.length > 0 ? children : <br />}\n </p>\n )\n\n case 'hardBreak':\n return <br key={key} />\n\n case 'codeBlock': {\n // Code blocks store text in content[0].text\n const codeText = node.content?.[0]?.text || ''\n return (\n <pre key={key} style={styles.codeBlock}>\n <code>{codeText}</code>\n </pre>\n )\n }\n\n case 'image': {\n const src = node.attrs?.src\n const alt = node.attrs?.alt\n const safeUrl = typeof src === 'string' ? sanitizeUrl(src) : undefined\n if (!safeUrl) {\n return null\n }\n return (\n <img\n key={key}\n src={safeUrl}\n alt={typeof alt === 'string' ? alt : ''}\n style={styles.image}\n onError={(e) => {\n ;(e.target as HTMLImageElement).style.display = 'none'\n }}\n />\n )\n }\n\n case 'bulletList':\n return (\n <ul key={key} style={{ margin: '8px 0', paddingLeft: '24px' }}>\n {children}\n </ul>\n )\n\n case 'orderedList':\n return (\n <ol key={key} style={{ margin: '8px 0', paddingLeft: '24px' }}>\n {children}\n </ol>\n )\n\n case 'listItem':\n return (\n <li key={key} style={{ margin: '4px 0' }}>\n {children}\n </li>\n )\n\n case 'blockquote':\n return (\n <blockquote\n key={key}\n style={{\n margin: '8px 0',\n paddingLeft: '12px',\n borderLeft: '3px solid #e4e4e7',\n color: '#71717a',\n }}\n >\n {children}\n </blockquote>\n )\n\n case 'heading': {\n const rawLevel = node.attrs?.level\n const level = isNumber(rawLevel) ? rawLevel : 1\n const HeadingTag = `h${Math.min(Math.max(level, 1), 6)}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'\n return (\n <HeadingTag key={key} style={{ margin: '12px 0 8px 0' }}>\n {children}\n </HeadingTag>\n )\n }\n\n case 'horizontalRule':\n return <hr key={key} style={{ margin: '12px 0', border: 'none', borderTop: '1px solid #e4e4e7' }} />\n\n default:\n // Unknown node types: render children if any, otherwise ignore\n if (children.length > 0) {\n return <span key={key}>{children}</span>\n }\n return null\n }\n}\n\n/**\n * Validate that the content looks like a valid TipTap document\n */\nfunction isValidTipTapDoc(doc: unknown): doc is TipTapDoc {\n if (!doc || typeof doc !== 'object') {\n return false\n }\n const d = doc as TipTapDoc\n return d.type === 'doc' && (isUndefined(d.content) || isArray(d.content))\n}\n\n/**\n * Render plain text with line breaks preserved\n */\nfunction renderPlainText(text: string): preact.JSX.Element {\n if (!text) {\n return <></>\n }\n const lines = text.split('\\n')\n return (\n <>\n {lines.map((line, index) => (\n <Fragment key={index}>\n {line}\n {index < lines.length - 1 && <br />}\n </Fragment>\n ))}\n </>\n )\n}\n\n/**\n * RichContent component - renders TipTap JSON content with plain text fallback\n *\n * Rendering logic:\n * 1. If richContent is present and valid, render as TipTap tree\n * 2. If richContent is missing or invalid, fall back to plain text content\n * 3. Wrap TipTap rendering in try/catch for safety\n */\nexport function RichContent({ richContent, content, isCustomer, primaryColor }: RichContentProps) {\n const styles = useMemo(() => getStyles(isCustomer, primaryColor), [isCustomer, primaryColor])\n\n // Try to render rich content if available\n if (richContent) {\n try {\n if (isValidTipTapDoc(richContent)) {\n const rendered = renderNode(richContent, styles, 0, 'root')\n if (rendered) {\n return rendered\n }\n }\n } catch {\n // Fall through to plain text on any error\n }\n }\n\n // Fallback: render plain text content\n return renderPlainText(content)\n}\n","/**\n * Format a timestamp to a relative time string\n */\nexport function formatRelativeTime(isoString: string | undefined): string {\n if (!isoString) {\n return ''\n }\n\n const date = new Date(isoString)\n const now = new Date()\n const diffMs = now.getTime() - date.getTime()\n const diffMins = Math.floor(diffMs / 60000)\n const diffHours = Math.floor(diffMins / 60)\n const diffDays = Math.floor(diffHours / 24)\n\n if (diffMins < 1) {\n return 'Just now'\n } else if (diffMins < 60) {\n return `${diffMins}m ago`\n } else if (diffHours < 24) {\n return `${diffHours}h ago`\n } else if (diffDays === 1) {\n return 'Yesterday'\n } else if (diffDays < 7) {\n return `${diffDays}d ago`\n } else {\n return date.toLocaleDateString()\n }\n}\n\n/**\n * Truncate text to a maximum length with ellipsis\n */\nexport function truncateText(text: string | undefined, maxLength: number): string {\n if (!text) {\n return 'No messages yet'\n }\n if (text.length <= maxLength) {\n return text\n }\n return text.substring(0, maxLength - 3) + '...'\n}\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { h, FunctionComponent } from 'preact'\nimport { Ticket, TicketStatus } from '../../../../posthog-conversations-types'\nimport { getStyles } from './styles'\nimport { formatRelativeTime, truncateText } from './utils'\n\ninterface TicketListItemProps {\n ticket: Ticket\n styles: ReturnType<typeof getStyles>\n onClick: (ticketId: string) => void\n}\n\n/**\n * Get a human-readable status label\n * Matches the display logic in PostHog main app\n */\nfunction getStatusLabel(status: TicketStatus): string {\n if (status === 'on_hold') {\n return 'On hold'\n }\n // Capitalize first letter: 'new' -> 'New', 'open' -> 'Open', etc.\n return status.charAt(0).toUpperCase() + status.slice(1)\n}\n\n/**\n * A single ticket item in the ticket list\n */\nexport const TicketListItem: FunctionComponent<TicketListItemProps> = ({ ticket, styles, onClick }) => {\n const hasUnread = (ticket.unread_count || 0) > 0\n const statusLabel = getStatusLabel(ticket.status)\n\n const handleClick = () => {\n onClick(ticket.id)\n }\n\n const itemStyle = {\n ...styles.ticketItem,\n ...(hasUnread ? styles.ticketItemUnread : {}),\n }\n\n return (\n <div\n style={itemStyle}\n onClick={handleClick}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n }}\n role=\"button\"\n tabIndex={0}\n >\n <div style={styles.ticketItemContent}>\n <div style={styles.ticketItemHeader}>\n <span style={hasUnread ? styles.ticketPreviewUnread : styles.ticketPreview}>\n {truncateText(ticket.last_message, 60)}\n </span>\n {hasUnread && <span style={styles.ticketUnreadBadge}>{ticket.unread_count}</span>}\n </div>\n <div style={styles.ticketMeta}>\n <span style={styles.ticketTime}>\n {formatRelativeTime(ticket.last_message_at || ticket.created_at)}\n </span>\n <span style={styles.ticketStatus}>{statusLabel}</span>\n </div>\n </div>\n {/* Right arrow indicator */}\n <div style={styles.ticketItemArrow}>\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </div>\n </div>\n )\n}\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { h, FunctionComponent } from 'preact'\nimport { Ticket } from '../../../../posthog-conversations-types'\nimport { getStyles } from './styles'\nimport { TicketListItem } from './TicketListItem'\n\ninterface TicketListViewProps {\n tickets: Ticket[]\n isLoading: boolean\n styles: ReturnType<typeof getStyles>\n onSelectTicket: (ticketId: string) => void\n onNewConversation: () => void\n}\n\n/**\n * Loading state component\n */\nconst LoadingState: FunctionComponent<{ styles: ReturnType<typeof getStyles> }> = ({ styles }) => (\n <div style={styles.ticketListLoading}>\n <div style={styles.loadingSpinner} />\n <span>Loading conversations...</span>\n </div>\n)\n\n/**\n * Empty state component when there are no tickets\n */\nconst EmptyState: FunctionComponent<{\n styles: ReturnType<typeof getStyles>\n onNewConversation: () => void\n}> = ({ styles, onNewConversation }) => (\n <div style={styles.ticketListEmpty}>\n <div style={styles.emptyStateIcon}>\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n </div>\n <div style={styles.emptyStateTitle}>No conversations yet</div>\n <div style={styles.emptyStateDescription}>Start a new conversation to get help from our team.</div>\n <button\n style={styles.newConversationButtonLarge}\n onClick={onNewConversation}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '0.9'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '1'\n }}\n >\n Start a conversation\n </button>\n </div>\n)\n\n/**\n * Ticket list view showing all user's tickets\n */\nexport const TicketListView: FunctionComponent<TicketListViewProps> = ({\n tickets,\n isLoading,\n styles,\n onSelectTicket,\n onNewConversation,\n}) => {\n // Show loading state\n if (isLoading && tickets.length === 0) {\n return <LoadingState styles={styles} />\n }\n\n // Show empty state when no tickets\n if (tickets.length === 0) {\n return <EmptyState styles={styles} onNewConversation={onNewConversation} />\n }\n\n // Show ticket list\n return (\n <div style={styles.ticketListContainer}>\n {/* Ticket list - sorted by most recent activity */}\n <div style={styles.ticketList}>\n {[...tickets]\n .sort((a, b) => {\n const dateA = new Date(a.last_message_at || a.created_at).getTime()\n const dateB = new Date(b.last_message_at || b.created_at).getTime()\n return dateB - dateA // Descending order (newest first)\n })\n .map((ticket) => (\n <TicketListItem key={ticket.id} ticket={ticket} styles={styles} onClick={onSelectTicket} />\n ))}\n </div>\n\n {/* New conversation button at bottom */}\n <button\n style={styles.newConversationButton}\n onClick={onNewConversation}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '0.9'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '1'\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n style={{ marginRight: '8px' }}\n >\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n New conversation\n </button>\n </div>\n )\n}\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { h, Component, Fragment } from 'preact'\nimport {\n ConversationsRemoteConfig,\n Message,\n ConversationsWidgetState,\n UserProvidedTraits,\n Ticket,\n} from '../../../../posthog-conversations-types'\nimport { createLogger } from '../../../../utils/logger'\nimport { getStyles } from './styles'\nimport { OpenChatButton } from './OpenChatButton'\nimport { SendMessageButton } from './SendMessageButton'\nimport { CloseChatButton } from './CloseChatButton'\nimport { RichContent } from './RichContent'\nimport { TicketListView } from './TicketListView'\nimport { formatRelativeTime } from './utils'\n\nconst logger = createLogger('[ConversationsWidget]')\n\n/**\n * Type for the current view in the widget\n */\nexport type WidgetView = 'tickets' | 'messages'\n\ninterface WidgetProps {\n config: ConversationsRemoteConfig\n initialState?: ConversationsWidgetState\n initialUserTraits?: UserProvidedTraits | null\n isUserIdentified?: boolean\n initialView?: WidgetView\n initialTickets?: Ticket[]\n hasMultipleTickets?: boolean\n onSendMessage: (message: string) => Promise<void>\n onStateChange?: (state: ConversationsWidgetState) => void\n onIdentify?: (traits: UserProvidedTraits) => void\n onSelectTicket?: (ticketId: string) => void\n onNewConversation?: () => void\n onBackToTickets?: () => void\n onViewChange?: (view: WidgetView) => void\n}\n\ninterface WidgetState {\n state: ConversationsWidgetState\n view: WidgetView\n messages: Message[]\n tickets: Ticket[]\n ticketsLoading: boolean\n inputValue: string\n isLoading: boolean\n error: string | null\n showIdentificationForm: boolean\n formName: string\n formEmail: string\n formEmailError: string | null\n userTraits: UserProvidedTraits | null\n unreadCount: number\n hasMultipleTickets: boolean\n}\n\nexport class ConversationsWidget extends Component<WidgetProps, WidgetState> {\n private _messagesEndRef: HTMLDivElement | null = null\n private _inputRef: HTMLTextAreaElement | null = null\n\n constructor(props: WidgetProps) {\n super(props)\n\n // Determine if we need to show the identification form\n const userTraits = props.initialUserTraits || null\n const needsIdentification = this._needsIdentification(props.config, userTraits, props.isUserIdentified)\n\n this.state = {\n state: props.initialState || 'closed',\n view: props.initialView || 'messages',\n messages: [],\n tickets: props.initialTickets || [],\n ticketsLoading: false,\n inputValue: '',\n isLoading: false,\n error: null,\n showIdentificationForm: needsIdentification,\n formName: userTraits?.name || '',\n formEmail: userTraits?.email || '',\n formEmailError: null,\n userTraits,\n unreadCount: 0,\n hasMultipleTickets: props.hasMultipleTickets || false,\n }\n }\n\n /**\n * Check if we need to show the identification form\n */\n private _needsIdentification(\n config: ConversationsRemoteConfig,\n traits: UserProvidedTraits | null,\n isUserIdentified?: boolean\n ): boolean {\n // If user is already identified via PostHog, no form needed\n // They've called posthog.identify() so we have their identity\n if (isUserIdentified) {\n return false\n }\n\n // If requireEmail is not set, no identification needed\n if (!config.requireEmail) {\n return false\n }\n\n // If we already have an email, no form needed\n if (traits?.email) {\n return false\n }\n\n return true\n }\n\n componentDidMount() {\n // Add greeting message if no messages exist and we're in message view\n if (this.state.view === 'messages' && this.state.messages.length === 0 && this.props.config.greetingText) {\n this._addGreetingMessage()\n }\n }\n\n componentDidUpdate(_prevProps: WidgetProps, prevState: WidgetState) {\n // Scroll to bottom when messages change\n if (this.state.messages.length !== prevState.messages.length) {\n this._scrollToBottom()\n }\n\n // Notify parent of state changes\n if (this.state.state !== prevState.state && this.props.onStateChange) {\n this.props.onStateChange(this.state.state)\n }\n\n // Focus input and scroll to bottom when opening\n if (this.state.state === 'open' && prevState.state !== 'open') {\n this._focusInput()\n this._scrollToBottom()\n }\n }\n\n private _addGreetingMessage() {\n const greetingMessage: Message = {\n id: 'greeting',\n content: this.props.config.greetingText || 'Hi! How can we help?',\n author_type: 'AI',\n author_name: 'Support',\n created_at: new Date().toISOString(),\n is_private: false,\n }\n this.setState({ messages: [greetingMessage] })\n }\n\n private _scrollToBottom() {\n if (this._messagesEndRef) {\n this._messagesEndRef.scrollIntoView({ behavior: 'smooth' })\n }\n }\n\n private _focusInput() {\n if (this._inputRef) {\n this._inputRef.focus()\n }\n }\n\n private _handleToggleOpen = () => {\n this.setState((prevState) => ({\n state: prevState.state === 'open' ? 'closed' : 'open',\n }))\n }\n\n private _handleClose = () => {\n this.setState({ state: 'closed' })\n }\n\n private _handleSelectTicket = (ticketId: string) => {\n if (this.props.onSelectTicket) {\n this.props.onSelectTicket(ticketId)\n }\n }\n\n private _handleNewConversation = () => {\n if (this.props.onNewConversation) {\n this.props.onNewConversation()\n }\n }\n\n private _handleBackToTickets = () => {\n if (this.props.onBackToTickets) {\n this.props.onBackToTickets()\n }\n }\n\n private _handleInputChange = (e: Event) => {\n const target = e.target as HTMLTextAreaElement\n this.setState({ inputValue: target.value })\n }\n\n private _handleKeyPress = (e: KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n this._handleSendMessage()\n }\n }\n\n // Identification form handlers\n private _handleFormNameChange = (e: Event) => {\n const target = e.target as HTMLInputElement\n this.setState({ formName: target.value })\n }\n\n private _handleFormEmailChange = (e: Event) => {\n const target = e.target as HTMLInputElement\n this.setState({ formEmail: target.value, formEmailError: null })\n }\n\n private _validateEmail(email: string): boolean {\n // Basic email validation\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n return emailRegex.test(email)\n }\n\n private _handleFormSubmit = (e: Event) => {\n e.preventDefault()\n\n const { formEmail, formName } = this.state\n const { config, onIdentify } = this.props\n\n // Validate email if required\n if (config.requireEmail && !formEmail.trim()) {\n this.setState({ formEmailError: 'Email is required' })\n return\n }\n\n if (formEmail.trim() && !this._validateEmail(formEmail.trim())) {\n this.setState({ formEmailError: 'Please enter a valid email address' })\n return\n }\n\n // Create traits object\n const traits: UserProvidedTraits = {}\n if (formName.trim()) {\n traits.name = formName.trim()\n }\n if (formEmail.trim()) {\n traits.email = formEmail.trim()\n }\n\n // Update state and notify parent\n this.setState({\n userTraits: traits,\n showIdentificationForm: false,\n })\n\n if (onIdentify) {\n onIdentify(traits)\n }\n }\n\n private _handleSendMessage = async () => {\n const { inputValue } = this.state\n const trimmedMessage = inputValue.trim()\n\n if (!trimmedMessage) {\n return\n }\n\n // Add user message to UI immediately\n const userMessage: Message = {\n id: `temp-${Date.now()}`,\n content: trimmedMessage,\n author_type: 'customer',\n author_name: 'You',\n created_at: new Date().toISOString(),\n is_private: false,\n }\n\n this.setState({\n messages: [...this.state.messages, userMessage],\n inputValue: '',\n isLoading: true,\n error: null,\n })\n\n try {\n await this.props.onSendMessage(trimmedMessage)\n // Success - message will be updated via addMessage()\n this.setState({ isLoading: false })\n } catch (error) {\n logger.error('Failed to send message', error)\n this.setState({\n isLoading: false,\n error: error instanceof Error ? error.message : 'Failed to send message',\n })\n\n // Remove the temporary message on error\n this.setState((prevState) => ({\n messages: prevState.messages.filter((m) => m.id !== userMessage.id),\n }))\n }\n }\n\n /**\n * Public method to add messages from outside\n */\n addMessages(messages: Message[]) {\n this.setState((prevState) => {\n // Filter out duplicates\n const existingIds = new Set(prevState.messages.map((m) => m.id))\n const newMessages = messages.filter((m) => !existingIds.has(m.id))\n\n if (newMessages.length > 0) {\n return {\n messages: [...prevState.messages, ...newMessages],\n }\n }\n return null\n })\n }\n\n /**\n * Public method to show the widget\n */\n show() {\n this.setState({ state: 'open' })\n }\n\n /**\n * Public method to hide the widget\n */\n hide() {\n this.setState({ state: 'closed' })\n }\n\n /**\n * Public method to close the widget completely\n */\n close() {\n this.setState({ state: 'closed' })\n }\n\n /**\n * Get user traits (either provided via form or from props)\n */\n getUserTraits(): UserProvidedTraits | null {\n return this.state.userTraits\n }\n\n /**\n * Called when user identifies via posthog.identify()\n * Hides the identification form since we now know who they are\n */\n setUserIdentified(): void {\n if (this.state.showIdentificationForm) {\n this.setState({ showIdentificationForm: false })\n }\n }\n\n /**\n * Set the unread message count (called by manager)\n */\n setUnreadCount(count: number): void {\n this.setState({ unreadCount: count })\n }\n\n /**\n * Update the tickets list (called by manager during polling)\n */\n updateTickets(tickets: Ticket[]): void {\n this.setState({\n tickets,\n ticketsLoading: false,\n hasMultipleTickets: tickets.length > 1,\n })\n }\n\n /**\n * Set the current view (tickets list or messages)\n */\n setView(view: WidgetView): void {\n this.setState({ view })\n if (this.props.onViewChange) {\n this.props.onViewChange(view)\n }\n }\n\n /**\n * Get the current view\n */\n getView(): WidgetView {\n return this.state.view\n }\n\n /**\n * Set tickets loading state\n */\n setTicketsLoading(loading: boolean): void {\n this.setState({ ticketsLoading: loading })\n }\n\n /**\n * Clear messages (used when switching tickets or starting new conversation)\n * @param addGreeting - If true, adds the greeting message after clearing\n */\n clearMessages(addGreeting: boolean = false): void {\n this.setState({ messages: [] }, () => {\n if (addGreeting && this.props.config.greetingText) {\n this._addGreetingMessage()\n }\n })\n }\n\n private _renderIdentificationForm(styles: ReturnType<typeof getStyles>) {\n const { config } = this.props\n const { formName, formEmail, formEmailError } = this.state\n\n const title = config.identificationFormTitle || 'Before we start...'\n const description =\n config.identificationFormDescription || 'Please provide your details so we can help you better.'\n const showNameField = config.collectName !== false // Show by default unless explicitly disabled\n\n return (\n <div style={styles.identificationForm}>\n <div style={styles.formTitle}>{title}</div>\n <div style={styles.formDescription}>{description}</div>\n\n <form onSubmit={this._handleFormSubmit}>\n {showNameField && (\n <div style={styles.formField}>\n <label style={styles.formLabel}>\n Name <span style={styles.formOptional}>(optional)</span>\n </label>\n <input\n type=\"text\"\n style={styles.formInput}\n value={formName}\n onInput={this._handleFormNameChange}\n placeholder=\"Your name\"\n autoComplete=\"name\"\n />\n </div>\n )}\n\n <div style={styles.formField}>\n <label style={styles.formLabel}>\n Email {!config.requireEmail && <span style={styles.formOptional}>(optional)</span>}\n </label>\n <input\n type=\"email\"\n style={{\n ...styles.formInput,\n ...(formEmailError ? styles.formInputError : {}),\n }}\n value={formEmail}\n onInput={this._handleFormEmailChange}\n placeholder=\"you@example.com\"\n autoComplete=\"email\"\n />\n {formEmailError && <div style={styles.formError}>{formEmailError}</div>}\n </div>\n\n <button\n type=\"submit\"\n style={styles.formSubmitButton}\n onMouseEnter={(e) => {\n e.currentTarget.style.opacity = '0.9'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.opacity = '1'\n }}\n >\n Start Chat\n </button>\n </form>\n </div>\n )\n }\n\n private _renderMessage(message: Message, styles: ReturnType<typeof getStyles>, primaryColor: string) {\n const isCustomer = message.author_type === 'customer'\n const messageStyle = {\n ...styles.message,\n ...(isCustomer ? styles.messageCustomer : styles.messageAgent),\n }\n const contentStyle = {\n ...styles.messageContent,\n ...(isCustomer ? styles.messageContentCustomer : styles.messageContentAgent),\n }\n\n return (\n <div key={message.id} style={messageStyle}>\n {!isCustomer && message.author_name && <div style={styles.messageAuthor}>{message.author_name}</div>}\n <div style={contentStyle}>\n <RichContent\n richContent={message.rich_content}\n content={message.content}\n isCustomer={isCustomer}\n primaryColor={primaryColor}\n />\n </div>\n <div style={styles.messageTime}>{formatRelativeTime(message.created_at)}</div>\n </div>\n )\n }\n\n private _renderBackButton(styles: ReturnType<typeof getStyles>) {\n return (\n <button style={styles.backButton} onClick={this._handleBackToTickets} aria-label=\"Back to conversations\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </button>\n )\n }\n\n private _renderTicketList(styles: ReturnType<typeof getStyles>) {\n const { tickets, ticketsLoading } = this.state\n\n return (\n <TicketListView\n tickets={tickets}\n isLoading={ticketsLoading}\n styles={styles}\n onSelectTicket={this._handleSelectTicket}\n onNewConversation={this._handleNewConversation}\n />\n )\n }\n\n private _renderMessages(styles: ReturnType<typeof getStyles>, primaryColor: string, placeholderText: string) {\n const { messages, inputValue, isLoading, error } = this.state\n\n return (\n <>\n <div style={styles.messages}>\n {messages.map((message) => this._renderMessage(message, styles, primaryColor))}\n <div\n ref={(el) => {\n this._messagesEndRef = el\n }}\n />\n </div>\n\n {/* Error message */}\n {error && <div style={styles.error}>{error}</div>}\n\n {/* Input */}\n <div style={styles.inputContainer}>\n <textarea\n ref={(el) => {\n this._inputRef = el\n }}\n style={styles.input}\n placeholder={placeholderText}\n value={inputValue}\n onInput={this._handleInputChange}\n onKeyPress={this._handleKeyPress}\n rows={1}\n disabled={isLoading}\n />\n <SendMessageButton\n primaryColor={primaryColor}\n inputValue={inputValue}\n isLoading={isLoading}\n handleSendMessage={this._handleSendMessage}\n />\n </div>\n </>\n )\n }\n\n render() {\n const { config } = this.props\n const { state, view, showIdentificationForm } = this.state\n const primaryColor = config.color || '#5375ff'\n const widgetPosition = config.widgetPosition || 'bottom_right'\n const placeholderText = config.placeholderText || 'Type your message...'\n const styles = getStyles(primaryColor, widgetPosition)\n\n // Button only (closed state)\n if (state === 'closed') {\n return (\n <OpenChatButton\n primaryColor={primaryColor}\n position={widgetPosition}\n handleToggleOpen={this._handleToggleOpen}\n unreadCount={this.state.unreadCount}\n />\n )\n }\n\n // Open state\n const windowStyle = {\n ...styles.window,\n ...styles.windowOpen,\n }\n\n // Determine header title based on view\n const headerTitle = view === 'tickets' ? 'Conversations' : 'Support Chat'\n\n // Show back button in message view when there are multiple tickets\n const showBackButton = view === 'messages' && this.state.hasMultipleTickets\n\n return (\n <div style={styles.widget}>\n <div style={windowStyle}>\n {/* Header */}\n <div style={styles.header}>\n <div style={showBackButton ? styles.headerWithBack : styles.headerTitle}>\n {showBackButton && this._renderBackButton(styles)}\n <span style={styles.headerTitle}>{headerTitle}</span>\n </div>\n <div style={styles.headerActions}>\n <CloseChatButton primaryColor={primaryColor} handleClose={this._handleClose} />\n </div>\n </div>\n\n {/* Show identification form if needed */}\n {showIdentificationForm\n ? this._renderIdentificationForm(styles)\n : view === 'tickets'\n ? // Ticket list view\n this._renderTicketList(styles)\n : // Messages view\n this._renderMessages(styles, primaryColor, placeholderText)}\n </div>\n </div>\n )\n }\n}\n","import { Breaker, Properties } from '../types'\nimport { nativeForEach, nativeIndexOf } from './globals'\nimport { logger } from './logger'\nimport { isFormData, isNull, isNullish, isNumber, isString, hasOwnProperty, isArray } from '@posthog/core'\n\nconst breaker: Breaker = {}\n\nexport function eachArray<E = any>(\n obj: E[] | null | undefined,\n iterator: (value: E, key: number) => void | Breaker,\n thisArg?: any\n): void {\n if (isArray(obj)) {\n if (nativeForEach && obj.forEach === nativeForEach) {\n obj.forEach(iterator, thisArg)\n } else if ('length' in obj && obj.length === +obj.length) {\n for (let i = 0, l = obj.length; i < l; i++) {\n if (i in obj && iterator.call(thisArg, obj[i], i) === breaker) {\n return\n }\n }\n }\n }\n}\n\n/**\n * @param {*=} obj\n * @param {function(...*)=} iterator\n * @param {Object=} thisArg\n */\nexport function each(obj: any, iterator: (value: any, key: any) => void | Breaker, thisArg?: any): void {\n if (isNullish(obj)) {\n return\n }\n if (isArray(obj)) {\n return eachArray(obj, iterator, thisArg)\n }\n if (isFormData(obj)) {\n for (const pair of obj.entries()) {\n if (iterator.call(thisArg, pair[1], pair[0]) === breaker) {\n return\n }\n }\n return\n }\n for (const key in obj) {\n if (hasOwnProperty.call(obj, key)) {\n if (iterator.call(thisArg, obj[key], key) === breaker) {\n return\n }\n }\n }\n}\n\nexport const extend = function (obj: Record<string, any>, ...args: Record<string, any>[]): Record<string, any> {\n eachArray(args, function (source) {\n for (const prop in source) {\n if (source[prop] !== void 0) {\n obj[prop] = source[prop]\n }\n }\n })\n return obj\n}\n\nexport const extendArray = function <T>(obj: T[], ...args: T[][]): T[] {\n eachArray(args, function (source) {\n eachArray(source, function (item) {\n obj.push(item)\n })\n })\n return obj\n}\n\nexport const include = function (\n obj: null | string | Array<any> | Record<string, any>,\n target: any\n): boolean | Breaker {\n let found = false\n if (isNull(obj)) {\n return found\n }\n if (nativeIndexOf && obj.indexOf === nativeIndexOf) {\n return obj.indexOf(target) != -1\n }\n each(obj, function (value) {\n if (found || (found = value === target)) {\n return breaker\n }\n return\n })\n return found\n}\n\n/**\n * Object.entries() polyfill\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries\n */\nexport function entries<T = any>(obj: Record<string, T>): [string, T][] {\n const ownProps = Object.keys(obj)\n let i = ownProps.length\n const resArray = new Array(i) // preallocate the Array\n\n while (i--) {\n resArray[i] = [ownProps[i], obj[ownProps[i]]]\n }\n return resArray\n}\n\nexport const trySafe = function <T>(fn: () => T): T | undefined {\n try {\n return fn()\n } catch {\n return undefined\n }\n}\n\nexport const safewrap = function <F extends (...args: any[]) => any = (...args: any[]) => any>(f: F): F {\n return function (...args) {\n try {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return f.apply(this, args)\n } catch (e) {\n logger.critical(\n 'Implementation error. Please turn on debug mode and open a ticket on https://app.posthog.com/home#panel=support%3Asupport%3A.'\n )\n logger.critical(e)\n }\n } as F\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport const safewrapClass = function (klass: Function, functions: string[]): void {\n for (let i = 0; i < functions.length; i++) {\n klass.prototype[functions[i]] = safewrap(klass.prototype[functions[i]])\n }\n}\n\nexport const stripEmptyProperties = function (p: Properties): Properties {\n const ret: Properties = {}\n each(p, function (v, k) {\n if ((isString(v) && v.length > 0) || isNumber(v)) {\n ret[k] = v\n }\n })\n return ret\n}\n\n/**\n * Deep copies an object.\n * It handles cycles by replacing all references to them with `undefined`\n * Also supports customizing native values\n *\n * @param value\n * @param customizer\n * @returns {{}|undefined|*}\n */\nfunction deepCircularCopy<T extends Record<string, any> = Record<string, any>>(\n value: T,\n customizer?: <K extends keyof T = keyof T>(value: T[K], key?: K) => T[K]\n): T | undefined {\n const COPY_IN_PROGRESS_SET = new Set()\n\n function internalDeepCircularCopy(value: T, key?: string): T | undefined {\n if (value !== Object(value)) return customizer ? customizer(value as any, key) : value // primitive value\n\n if (COPY_IN_PROGRESS_SET.has(value)) return undefined\n COPY_IN_PROGRESS_SET.add(value)\n let result: T\n\n if (isArray(value)) {\n result = [] as any as T\n eachArray(value, (it) => {\n result.push(internalDeepCircularCopy(it))\n })\n } else {\n result = {} as T\n each(value, (val, key) => {\n if (!COPY_IN_PROGRESS_SET.has(val)) {\n ;(result as any)[key] = internalDeepCircularCopy(val, key)\n }\n })\n }\n return result\n }\n return internalDeepCircularCopy(value)\n}\n\nexport function _copyAndTruncateStrings<T extends Record<string, any> = Record<string, any>>(\n object: T,\n maxStringLength: number | null\n): T {\n return deepCircularCopy(object, (value: any) => {\n if (isString(value) && !isNull(maxStringLength)) {\n return (value as string).slice(0, maxStringLength)\n }\n return value\n }) as T\n}\n\n// NOTE: Update PostHogConfig docs if you change this list\n// We will not try to catch all bullets here, but we should make an effort to catch the most common ones\n// You should be highly against adding more to this list, because ultimately customers can configure\n// their `cross_subdomain_cookie` setting to anything they want.\nconst EXCLUDED_FROM_CROSS_SUBDOMAIN_COOKIE = ['herokuapp.com', 'vercel.app', 'netlify.app']\nexport function isCrossDomainCookie(documentLocation: Location | undefined) {\n const hostname = documentLocation?.hostname\n\n if (!isString(hostname)) {\n return false\n }\n // split and slice isn't a great way to match arbitrary domains,\n // but it's good enough for ensuring we only match herokuapp.com when it is the TLD\n // for the hostname\n const lastTwoParts = hostname.split('.').slice(-2).join('.')\n\n for (const excluded of EXCLUDED_FROM_CROSS_SUBDOMAIN_COOKIE) {\n if (lastTwoParts === excluded) {\n return false\n }\n }\n\n return true\n}\n\nexport function find<T>(value: T[], predicate: (value: T) => boolean): T | undefined {\n for (let i = 0; i < value.length; i++) {\n if (predicate(value[i])) {\n return value[i]\n }\n }\n return undefined\n}\n\n// Use this instead of element.addEventListener to avoid eslint errors\n// this properly implements the default options for passive event listeners\nexport function addEventListener(\n element: Window | Document | Element | undefined,\n event: string,\n callback: EventListener,\n options?: AddEventListenerOptions\n): void {\n const { capture = false, passive = true } = options ?? {}\n\n // This is the only place where we are allowed to call this function\n // because the whole idea is that we should be calling this instead of the built-in one\n // eslint-disable-next-line posthog-js/no-add-event-listener\n element?.addEventListener(event, callback, { capture, passive })\n}\n\n/**\n * Helper to migrate deprecated config fields to new field names with appropriate warnings\n * @param config - The config object to check\n * @param newField - The new field name to use\n * @param oldField - The deprecated field name to check for\n * @param defaultValue - The default value if neither field is set\n * @param loggerInstance - Optional logger instance for deprecation warnings\n * @returns The value to use (new field takes precedence over old field)\n */\nexport function migrateConfigField<T>(\n config: Record<string, any>,\n newField: string,\n oldField: string,\n defaultValue: T,\n loggerInstance?: { warn: (message: string) => void }\n): T {\n const hasNewField = newField in config && !isNullish(config[newField])\n const hasOldField = oldField in config && !isNullish(config[oldField])\n\n if (hasNewField) {\n return config[newField]\n }\n\n if (hasOldField) {\n if (loggerInstance) {\n loggerInstance.warn(\n `Config field '${oldField}' is deprecated. Please use '${newField}' instead. ` +\n `The old field will be removed in a future major version.`\n )\n }\n return config[oldField]\n }\n\n return defaultValue\n}\n","import { each } from './'\n\nimport { isArray, isFile, isUndefined } from '@posthog/core'\nimport { logger } from './logger'\nimport { document } from './globals'\n\nconst localDomains = ['localhost', '127.0.0.1']\n\n/**\n * IE11 doesn't support `new URL`\n * so we can create an anchor element and use that to parse the URL\n * there's a lot of overlap between HTMLHyperlinkElementUtils and URL\n * meaning useful properties like `pathname` are available on both\n */\nexport const convertToURL = (url: string): HTMLAnchorElement | null => {\n const location = document?.createElement('a')\n if (isUndefined(location)) {\n return null\n }\n\n location.href = url\n return location\n}\n\nexport const formDataToQuery = function (formdata: Record<string, any> | FormData, arg_separator = '&'): string {\n let use_val: string\n let use_key: string\n const tph_arr: string[] = []\n\n each(formdata, function (val: File | string | undefined, key: string | undefined) {\n // the key might be literally the string undefined for e.g. if {undefined: 'something'}\n if (isUndefined(val) || isUndefined(key) || key === 'undefined') {\n return\n }\n\n use_val = encodeURIComponent(isFile(val) ? val.name : val.toString())\n use_key = encodeURIComponent(key)\n tph_arr[tph_arr.length] = use_key + '=' + use_val\n })\n\n return tph_arr.join(arg_separator)\n}\n\n// NOTE: Once we get rid of IE11/op_mini we can start using URLSearchParams\nexport const getQueryParam = function (url: string, param: string): string {\n const withoutHash: string = url.split('#')[0] || ''\n\n // Split only on the first ? to sort problem out for those with multiple ?s\n // and then remove them\n const queryParams: string = withoutHash.split(/\\?(.*)/)[1] || ''\n const cleanedQueryParams = queryParams.replace(/^\\?+/g, '')\n\n const queryParts = cleanedQueryParams.split('&')\n let keyValuePair\n\n for (let i = 0; i < queryParts.length; i++) {\n const parts = queryParts[i].split('=')\n if (parts[0] === param) {\n keyValuePair = parts\n break\n }\n }\n\n if (!isArray(keyValuePair) || keyValuePair.length < 2) {\n return ''\n } else {\n let result = keyValuePair[1]\n try {\n result = decodeURIComponent(result)\n } catch {\n logger.error('Skipping decoding for malformed query param: ' + result)\n }\n return result.replace(/\\+/g, ' ')\n }\n}\n\n// replace any query params in the url with the provided mask value. Tries to keep the URL as instant as possible,\n// including preserving malformed text in most cases\nexport const maskQueryParams = function <T extends string | undefined>(\n url: T,\n maskedParams: string[] | undefined,\n mask: string\n): T extends string ? string : undefined {\n if (!url || !maskedParams || !maskedParams.length) {\n return url as any\n }\n\n const splitHash = url.split('#')\n const withoutHash: string = splitHash[0] || ''\n const hash = splitHash[1]\n\n const splitQuery: string[] = withoutHash.split('?')\n const queryString: string = splitQuery[1]\n const urlWithoutQueryAndHash: string = splitQuery[0]\n const queryParts = (queryString || '').split('&')\n\n // use an array of strings rather than an object to preserve ordering and duplicates\n const paramStrings: string[] = []\n\n for (let i = 0; i < queryParts.length; i++) {\n const keyValuePair = queryParts[i].split('=')\n if (!isArray(keyValuePair)) {\n continue\n } else if (maskedParams.includes(keyValuePair[0])) {\n paramStrings.push(keyValuePair[0] + '=' + mask)\n } else {\n paramStrings.push(queryParts[i])\n }\n }\n\n let result = urlWithoutQueryAndHash\n if (queryString != null) {\n result += '?' + paramStrings.join('&')\n }\n if (hash != null) {\n result += '#' + hash\n }\n\n return result as any\n}\n\nexport const _getHashParam = function (hash: string, param: string): string | null {\n const matches = hash.match(new RegExp(param + '=([^&]*)'))\n return matches ? matches[1] : null\n}\n\nexport const isLocalhost = (): boolean => {\n return localDomains.includes(location.hostname)\n}\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { render, h } from 'preact'\nimport { isNumber } from '@posthog/core'\nimport {\n ConversationsRemoteConfig,\n ConversationsWidgetState,\n UserProvidedTraits,\n SendMessageResponse,\n SendMessagePayload,\n GetMessagesResponse,\n MarkAsReadResponse,\n GetTicketsOptions,\n GetTicketsResponse,\n Ticket,\n} from '../../../posthog-conversations-types'\nimport { PostHog } from '../../../posthog-core'\nimport { ConversationsManager as ConversationsManagerInterface } from '../posthog-conversations'\nimport { ConversationsPersistence } from './persistence'\nimport { ConversationsWidget, WidgetView } from './components/ConversationsWidget'\nimport { createLogger } from '../../../utils/logger'\nimport { document, window } from '../../../utils/globals'\nimport { formDataToQuery } from '../../../utils/request-utils'\n\nconst logger = createLogger('[ConversationsManager]')\n\nconst WIDGET_CONTAINER_ID = 'ph-conversations-widget-container'\nconst POLL_INTERVAL_MS = 5000 // 5 seconds\n\n/**\n * Extract hostname from a domain string (handles URLs and plain hostnames)\n */\nfunction extractHostname(domain: string): string | null {\n // Remove protocol if present\n let hostname = domain.replace(/^https?:\\/\\//, '')\n // Remove path, query, port if present\n hostname = hostname.split('/')[0].split('?')[0].split(':')[0]\n return hostname || null\n}\n\n/**\n * Check if the current domain matches the allowed domains list.\n * Returns true if:\n * - domains is empty or not present (no restriction)\n * - current hostname matches any allowed domain\n */\nfunction isCurrentDomainAllowed(domains: string[] | undefined): boolean {\n // No domain restriction - allow all\n if (!domains || domains.length === 0) {\n return true\n }\n\n const currentHostname = window?.location?.hostname\n if (!currentHostname) {\n // Can't determine hostname (SSR, etc.) - allow by default\n return true\n }\n\n return domains.some((domain) => {\n const allowedHostname = extractHostname(domain)\n if (!allowedHostname) {\n return false\n }\n\n if (allowedHostname.startsWith('*.')) {\n // Wildcard match: *.example.com matches foo.example.com and example.com\n const pattern = allowedHostname.slice(2) // Remove \"*.\"\n return currentHostname.endsWith(`.${pattern}`) || currentHostname === pattern\n }\n\n // Exact match\n return currentHostname === allowedHostname\n })\n}\n\nexport class ConversationsManager implements ConversationsManagerInterface {\n private _config: ConversationsRemoteConfig\n private _persistence: ConversationsPersistence\n private _widgetRef: ConversationsWidget | null = null\n private _containerElement: HTMLDivElement | null = null\n private _currentTicketId: string | null = null\n private _pollIntervalId: number | null = null\n private _lastMessageTimestamp: string | null = null\n private _isPolling: boolean = false\n private _unsubscribeIdentifyListener: (() => void) | null = null\n private _unreadCount: number = 0\n // SECURITY: widget_session_id is the key for access control\n // This is a random UUID that only this browser knows\n private _widgetSessionId: string\n private _isWidgetEnabled: boolean\n private _isDomainAllowed: boolean\n private _isWidgetRendered: boolean = false\n private _initializeWidgetPromise: Promise<void> | null = null\n // View state management for ticket list vs message view\n private _currentView: WidgetView = 'messages'\n private _tickets: Ticket[] = []\n private _hasMultipleTickets: boolean = false\n\n constructor(\n config: ConversationsRemoteConfig,\n private readonly _posthog: PostHog\n ) {\n this._config = config\n this._persistence = new ConversationsPersistence(_posthog)\n // Get or create widget_session_id - this stays the same even when user identifies\n this._widgetSessionId = this._persistence.getOrCreateWidgetSessionId()\n\n // Determine if widget should be shown based on config and domain\n this._isWidgetEnabled = config.widgetEnabled === true\n this._isDomainAllowed = isCurrentDomainAllowed(config.domains)\n\n logger.info('ConversationsManager initialized', {\n config,\n widgetSessionId: this._widgetSessionId,\n isWidgetEnabled: this._isWidgetEnabled,\n isDomainAllowed: this._isDomainAllowed,\n })\n\n this._initialize()\n }\n\n /**\n * Send a message programmatically via the API\n * Creates a new ticket if none exists or if newTicket is true\n *\n * @param message - The message text to send\n * @param userTraits - Optional user identification data (name, email)\n * @param newTicket - If true, forces creation of a new ticket (ignores current ticket)\n * @returns Promise with the response including ticket_id and message_id\n */\n async sendMessage(\n message: string,\n userTraits?: UserProvidedTraits,\n newTicket?: boolean\n ): Promise<SendMessageResponse> {\n // Determine which ticket to use\n // If newTicket is true, force creation of new ticket by sending null\n // Otherwise use current ticket ID (which may be null if no ticket exists yet)\n const ticketId = newTicket ? null : this._currentTicketId\n\n // Track if this is creating a new ticket\n const isNewTicket = !ticketId\n\n const token = this._config.token\n\n // eslint-disable-next-line compat/compat\n return new Promise((resolve, reject) => {\n const distinctId = this._posthog.get_distinct_id()\n const personProperties = this._posthog.persistence?.props || {}\n\n // Priority for traits:\n // 1. User-provided traits from the widget form\n // 2. PostHog person properties\n const name = userTraits?.name || personProperties.$name || personProperties.name || null\n const email = userTraits?.email || personProperties.$email || personProperties.email || null\n\n const payload: Partial<SendMessagePayload> = {\n widget_session_id: this._widgetSessionId,\n // distinct_id is only used for Person linking, not access control\n distinct_id: distinctId,\n message: message.trim(),\n traits: {\n name,\n email,\n },\n ticket_id: ticketId,\n }\n\n try {\n // Capture session ID - sent with every message\n const capturedSessionId = this._posthog.get_session_id()\n if (capturedSessionId) {\n payload.session_id = capturedSessionId\n }\n\n // Capture session replay URL with timestamp - sent with every message\n const replayUrl = this._posthog.get_session_replay_url({\n withTimestamp: true,\n timestampLookBack: 30,\n })\n\n // Capture current URL - only for new tickets to record where user started\n const currentUrl = isNewTicket ? window?.location?.href : undefined\n\n if (replayUrl || currentUrl) {\n payload.session_context = {\n session_replay_url: replayUrl || undefined,\n current_url: currentUrl || undefined,\n }\n }\n } catch (error) {\n // Log error but don't fail message sending\n logger.warn('Failed to capture session context', error)\n }\n\n this._posthog._send_request({\n url: this._posthog.requestRouter.endpointFor('api', '/api/conversations/v1/widget/message'),\n method: 'POST',\n data: payload,\n headers: {\n 'X-Conversations-Token': token,\n },\n callback: (response) => {\n if (response.statusCode === 429) {\n reject(new Error('Too many requests. Please wait before trying again.'))\n return\n }\n\n if (response.statusCode !== 200 && response.statusCode !== 201) {\n const errorMsg = response.json?.detail || response.json?.message || 'Failed to send message'\n logger.error('Failed to send message', { status: response.statusCode })\n reject(new Error(errorMsg))\n return\n }\n\n if (!response.json) {\n reject(new Error('Invalid response from server'))\n return\n }\n\n const data = response.json as SendMessageResponse\n\n // Update current ticket ID if this was a new ticket\n // This happens when: 1) No ticket existed, or 2) User forced new ticket creation\n if (isNewTicket && data.ticket_id) {\n this._currentTicketId = data.ticket_id\n this._persistence.saveTicketId(data.ticket_id)\n logger.info('New ticket created', {\n ticketId: data.ticket_id,\n forced: newTicket === true,\n })\n }\n\n // Track message sent\n this._posthog.capture('$conversations_message_sent', {\n ticketId: data.ticket_id,\n isNewTicket: isNewTicket,\n messageLength: message.length,\n })\n\n // Update last message timestamp\n this._lastMessageTimestamp = data.created_at\n\n resolve(data)\n },\n })\n })\n }\n\n /**\n * Switch to a different ticket if an explicit ticketId is provided\n * This ensures subsequent operations (sendMessage, etc.) use the correct ticket\n */\n private _switchToTicketIfNeeded(ticketId: string | undefined): void {\n if (ticketId && ticketId !== this._currentTicketId) {\n this._currentTicketId = ticketId\n this._persistence.saveTicketId(ticketId)\n // Reset last message timestamp when switching tickets\n this._lastMessageTimestamp = null\n }\n }\n\n /** Fetch messages via the API */\n async getMessages(ticketId?: string, after?: string): Promise<GetMessagesResponse> {\n // Use provided ticketId or fall back to current ticket\n const targetTicketId = ticketId || this._currentTicketId\n\n if (!targetTicketId) {\n throw new Error('No ticket ID provided and no active conversation')\n }\n\n // Switch to this ticket if explicitly provided\n this._switchToTicketIfNeeded(ticketId)\n\n const token = this._config.token\n\n // eslint-disable-next-line compat/compat\n return new Promise((resolve, reject) => {\n // SECURITY: widget_session_id is required for access control\n // distinct_id is NOT sent for getMessages - access is controlled by widget_session_id only\n const queryParams: Record<string, string> = {\n widget_session_id: this._widgetSessionId,\n limit: '50',\n }\n\n if (after) {\n queryParams.after = after\n }\n\n this._posthog._send_request({\n url: this._posthog.requestRouter.endpointFor(\n 'api',\n `/api/conversations/v1/widget/messages/${targetTicketId}?${formDataToQuery(queryParams)}`\n ),\n method: 'GET',\n headers: {\n 'X-Conversations-Token': token,\n },\n callback: (response) => {\n if (response.statusCode === 429) {\n reject(new Error('Too many requests. Please wait before trying again.'))\n return\n }\n\n if (response.statusCode !== 200) {\n const errorMsg = response.json?.detail || response.json?.message || 'Failed to fetch messages'\n logger.error('Failed to fetch messages', { status: response.statusCode })\n reject(new Error(errorMsg))\n return\n }\n\n if (!response.json) {\n reject(new Error('Invalid response from server'))\n return\n }\n\n const data = response.json as GetMessagesResponse\n resolve(data)\n },\n })\n })\n }\n\n /** Mark messages as read via the API */\n async markAsRead(ticketId?: string): Promise<MarkAsReadResponse> {\n // Use provided ticketId or fall back to current ticket\n const targetTicketId = ticketId || this._currentTicketId\n\n if (!targetTicketId) {\n throw new Error('No ticket ID provided and no active conversation')\n }\n\n // Switch to this ticket if explicitly provided\n this._switchToTicketIfNeeded(ticketId)\n\n const token = this._config.token\n\n logger.info('Marking messages as read', { ticketId: targetTicketId })\n\n // eslint-disable-next-line compat/compat\n return new Promise((resolve, reject) => {\n this._posthog._send_request({\n url: this._posthog.requestRouter.endpointFor(\n 'api',\n `/api/conversations/v1/widget/messages/${targetTicketId}/read`\n ),\n method: 'POST',\n data: {\n widget_session_id: this._widgetSessionId,\n },\n headers: {\n 'X-Conversations-Token': token,\n },\n callback: (response) => {\n if (response.statusCode === 429) {\n reject(new Error('Too many requests. Please wait before trying again.'))\n return\n }\n\n if (response.statusCode !== 200) {\n const errorMsg =\n response.json?.detail || response.json?.message || 'Failed to mark messages as read'\n logger.error('Failed to mark messages as read', { status: response.statusCode })\n reject(new Error(errorMsg))\n return\n }\n\n if (!response.json) {\n reject(new Error('Invalid response from server'))\n return\n }\n\n const data = response.json as MarkAsReadResponse\n resolve(data)\n },\n })\n })\n }\n\n /**\n * Initialize the conversations manager.\n * Always initializes persistence and event listeners for API usage.\n * Only renders the widget if widgetEnabled is true AND domain is allowed.\n */\n private _initialize(): void {\n if (!document || !window) {\n logger.info('Conversations not available: Document or window not available')\n return\n }\n\n // Load any existing ticket ID from localStorage\n this._currentTicketId = this._persistence.loadTicketId()\n logger.info('Loaded ticket ID from storage', { ticketId: this._currentTicketId })\n\n // Track conversations API loaded (separate from widget loaded)\n this._posthog.capture('$conversations_loaded', {\n hasExistingTicket: !!this._currentTicketId,\n widgetEnabled: this._isWidgetEnabled,\n domainAllowed: this._isDomainAllowed,\n })\n\n // Only render widget if both widgetEnabled and domain is allowed\n if (this._isWidgetEnabled && this._isDomainAllowed) {\n this._initializeWidget()\n } else {\n logger.info('Widget not rendered', {\n widgetEnabled: this._isWidgetEnabled,\n domainAllowed: this._isDomainAllowed,\n })\n }\n\n // Listen for identify events to hide identification form when user identifies\n this._setupIdentifyListener()\n }\n\n /**\n * Initialize and render the widget UI\n * Uses a promise guard to prevent race conditions from concurrent calls\n */\n private _initializeWidget(): Promise<void> {\n if (this._isWidgetRendered) {\n return Promise.resolve()\n }\n if (this._initializeWidgetPromise) {\n return this._initializeWidgetPromise\n }\n this._initializeWidgetPromise = this._doInitializeWidget()\n return this._initializeWidgetPromise\n }\n\n private async _doInitializeWidget(): Promise<void> {\n const savedState = this._persistence.loadWidgetState()\n let initialState: ConversationsWidgetState = 'closed'\n if (savedState === 'open') {\n initialState = 'open'\n }\n\n // Get initial user traits (from PostHog person properties or saved)\n const initialUserTraits = this._getInitialUserTraits()\n\n // Determine initial view based on ticket count\n const { view: initialView, tickets } = await this._determineInitialView()\n this._currentView = initialView\n\n // Render the widget with initial view\n this._renderWidget(initialState, initialUserTraits, initialView, tickets)\n this._isWidgetRendered = true\n\n // Track widget initialization\n this._posthog.capture('$conversations_widget_loaded', {\n hasExistingTicket: !!this._currentTicketId,\n initialState: initialState,\n initialView: initialView,\n ticketCount: tickets.length,\n hasUserTraits: !!initialUserTraits,\n })\n\n // Load messages if in message view and have a ticket\n if (initialView === 'messages' && this._currentTicketId) {\n this._loadMessages()\n }\n\n // Start polling based on current view\n this._startPolling()\n }\n\n /**\n * Get initial user traits from PostHog or localStorage\n */\n private _getInitialUserTraits(): UserProvidedTraits | null {\n // First, check PostHog's person properties\n const personProperties = this._posthog.persistence?.props || {}\n const posthogName = personProperties.$name || personProperties.name\n const posthogEmail = personProperties.$email || personProperties.email\n\n // If we have traits from PostHog, use those\n if (posthogName || posthogEmail) {\n return {\n name: posthogName || undefined,\n email: posthogEmail || undefined,\n }\n }\n\n // Otherwise, check localStorage for previously saved traits\n const savedTraits = this._persistence.loadUserTraits()\n if (savedTraits && (savedTraits.name || savedTraits.email)) {\n return savedTraits\n }\n\n return null\n }\n\n /**\n * Handle user identification from the widget form\n */\n private _handleIdentify = (traits: UserProvidedTraits): void => {\n // Save traits to localStorage\n this._persistence.saveUserTraits(traits)\n\n // Track identification\n this._posthog.capture('$conversations_user_identified', {\n hasName: !!traits.name,\n hasEmail: !!traits.email,\n })\n }\n\n /**\n * Handle sending a message from the widget\n */\n private _handleSendMessage = async (message: string): Promise<void> => {\n // Get user traits from the widget\n const userTraits = this._widgetRef?.getUserTraits() || undefined\n\n try {\n // Call the public API method (which handles tracking and state updates)\n await this.sendMessage(message, userTraits)\n\n // Poll for response immediately\n setTimeout(() => this._pollMessages(), 1000)\n } catch (error) {\n logger.error('Failed to send message', error)\n throw error\n }\n }\n\n /**\n * Handle widget state changes\n */\n private _handleStateChange = (state: ConversationsWidgetState): void => {\n logger.info('Widget state changed', { state, view: this._currentView })\n\n // Track state changes\n this._posthog.capture('$conversations_widget_state_changed', {\n state: state,\n view: this._currentView,\n ticketId: this._currentTicketId,\n })\n\n // Save state to localStorage\n this._persistence.saveWidgetState(state)\n\n // Mark messages as read when widget opens (only if in message view with a ticket)\n if (state === 'open') {\n if (this._currentView === 'messages' && this._unreadCount > 0 && this._currentTicketId) {\n this._markMessagesAsRead()\n }\n }\n }\n\n /**\n * Mark messages as read\n */\n private async _markMessagesAsRead(): Promise<void> {\n if (!this._currentTicketId) {\n return\n }\n\n try {\n const response = await this.markAsRead(this._currentTicketId || undefined)\n this._unreadCount = response.unread_count\n // Update the widget to reflect the new unread count\n this._widgetRef?.setUnreadCount(0)\n logger.info('Messages marked as read', { unreadCount: response.unread_count })\n } catch (error) {\n logger.error('Failed to mark messages as read', error)\n }\n }\n\n /**\n * Load messages for the current ticket\n */\n private async _loadMessages(): Promise<void> {\n if (!this._currentTicketId) {\n return\n }\n\n try {\n const response = await this.getMessages(\n this._currentTicketId || undefined,\n this._lastMessageTimestamp || undefined\n )\n\n // Update unread count from response\n if (isNumber(response.unread_count)) {\n this._unreadCount = response.unread_count\n this._widgetRef?.setUnreadCount(response.unread_count)\n\n // If widget is open and there are unread messages, mark them as read\n if (response.unread_count > 0 && this._isWidgetOpen()) {\n this._markMessagesAsRead()\n }\n }\n\n if (response.messages.length > 0) {\n this._widgetRef?.addMessages(response.messages)\n // Update last message timestamp\n const lastMessage = response.messages[response.messages.length - 1]\n this._lastMessageTimestamp = lastMessage.created_at\n }\n } catch (error) {\n logger.error('Failed to load messages', error)\n }\n }\n\n /**\n * Check if the widget is currently open\n */\n private _isWidgetOpen(): boolean {\n return this._persistence.loadWidgetState() === 'open'\n }\n\n /**\n * Poll for new messages\n */\n private _pollMessages = async (): Promise<void> => {\n if (this._isPolling || !this._currentTicketId) {\n return\n }\n\n this._isPolling = true\n try {\n await this._loadMessages()\n } finally {\n this._isPolling = false\n }\n }\n\n /**\n * Poll for tickets list\n */\n private _pollTickets = async (): Promise<void> => {\n if (this._isPolling) {\n return\n }\n\n this._isPolling = true\n try {\n await this._loadTickets()\n } finally {\n this._isPolling = false\n }\n }\n\n /**\n * Load tickets list from API\n */\n private async _loadTickets(): Promise<void> {\n try {\n const response = await this.getTickets()\n this._tickets = response.results\n this._hasMultipleTickets = response.results.length > 1\n this._widgetRef?.updateTickets(response.results)\n\n // Calculate total unread across all tickets\n const totalUnread = response.results.reduce((sum, t) => sum + (t.unread_count || 0), 0)\n this._unreadCount = totalUnread\n this._widgetRef?.setUnreadCount(totalUnread)\n\n logger.info('Tickets loaded', { count: response.results.length, totalUnread })\n } catch (error) {\n logger.error('Failed to load tickets', error)\n }\n }\n\n /**\n * Main poll function that polls based on current view\n */\n private _poll = async (): Promise<void> => {\n if (this._currentView === 'tickets') {\n await this._pollTickets()\n } else {\n await this._pollMessages()\n }\n }\n\n /**\n * Handle view changes from the widget\n */\n private _handleViewChange = (view: WidgetView): void => {\n logger.info('View changed', { from: this._currentView, to: view })\n this._currentView = view\n }\n\n /**\n * Handle ticket selection from the list\n */\n private _handleSelectTicket = async (ticketId: string): Promise<void> => {\n // Switch to this ticket\n this._switchToTicketIfNeeded(ticketId)\n\n // Clear messages and reset timestamp\n this._lastMessageTimestamp = null\n this._widgetRef?.clearMessages()\n\n // Switch view to messages\n this._currentView = 'messages'\n this._widgetRef?.setView('messages')\n\n // Load messages for the selected ticket\n await this._loadMessages()\n\n // Mark as read if widget is open\n if (this._isWidgetOpen() && this._unreadCount > 0) {\n this._markMessagesAsRead()\n }\n }\n\n /**\n * Handle new conversation request\n */\n private _handleNewConversation = (): void => {\n logger.info('New conversation requested')\n\n // Clear current ticket\n this._currentTicketId = null\n this._persistence.clearTicketId()\n\n // Reset timestamp\n this._lastMessageTimestamp = null\n\n // Switch view to messages\n this._currentView = 'messages'\n this._widgetRef?.setView('messages')\n\n // Clear messages and add greeting\n this._widgetRef?.clearMessages(true)\n }\n\n /**\n * Handle back to tickets request\n */\n private _handleBackToTickets = async (): Promise<void> => {\n logger.info('Back to tickets requested')\n\n // Switch view to tickets\n this._currentView = 'tickets'\n this._widgetRef?.setView('tickets')\n\n // Load tickets\n this._widgetRef?.setTicketsLoading(true)\n await this._loadTickets()\n\n // Track back to tickets\n this._posthog.capture('$conversations_back_to_tickets')\n }\n\n /**\n * Determine initial view based on ticket count\n */\n private async _determineInitialView(): Promise<{ view: WidgetView; tickets: Ticket[] }> {\n try {\n const response = await this.getTickets()\n this._tickets = response.results\n this._hasMultipleTickets = response.results.length > 1\n\n // Calculate total unread\n const totalUnread = response.results.reduce((sum, t) => sum + (t.unread_count || 0), 0)\n this._unreadCount = totalUnread\n\n // If 2+ tickets, show ticket list; otherwise show messages\n if (response.results.length >= 2) {\n return { view: 'tickets', tickets: response.results }\n }\n\n // If exactly 1 ticket, set it as current\n if (response.results.length === 1) {\n this._currentTicketId = response.results[0].id\n this._persistence.saveTicketId(response.results[0].id)\n }\n\n return { view: 'messages', tickets: response.results }\n } catch (error) {\n logger.error('Failed to determine initial view', error)\n return { view: 'messages', tickets: [] }\n }\n }\n\n /**\n * Start polling based on current view\n */\n private _startPolling(): void {\n if (this._pollIntervalId) {\n return // Already polling\n }\n\n // Poll immediately\n this._poll()\n\n // Set up interval\n this._pollIntervalId = window?.setInterval(() => {\n this._poll()\n }, POLL_INTERVAL_MS) as unknown as number\n\n logger.info('Started polling', { view: this._currentView })\n }\n\n /**\n * Stop polling for new messages\n */\n private _stopPolling(): void {\n if (this._pollIntervalId) {\n window?.clearInterval(this._pollIntervalId)\n this._pollIntervalId = null\n logger.info('Stopped polling for messages')\n }\n }\n\n /**\n * Setup listener for identify events.\n * When user calls posthog.identify(), hide the identification form\n * since we now know who they are.\n */\n private _setupIdentifyListener(): void {\n this._unsubscribeIdentifyListener = this._posthog.on('eventCaptured', (event: any) => {\n if (event.event === '$identify') {\n // User just identified - hide the identification form if it's showing\n this._widgetRef?.setUserIdentified()\n }\n })\n }\n\n /**\n * Show the widget (render it to DOM).\n * The widget respects its saved state (open/closed).\n * Note: Domain restrictions still apply - widget won't render on disallowed domains.\n */\n show(): void {\n // Check domain restrictions - don't render on disallowed domains\n if (!this._isDomainAllowed) {\n logger.warn('Cannot show widget: current domain is not allowed')\n return\n }\n\n // If widget isn't rendered yet, render it now\n if (!this._isWidgetRendered) {\n this._initializeWidget()\n }\n }\n\n /**\n * Hide and remove the widget from the DOM.\n * Conversation data is preserved - call show() to re-render.\n */\n hide(): void {\n // Stop polling when widget is hidden (save resources)\n this._stopPolling()\n\n if (this._containerElement) {\n render(null, this._containerElement)\n this._containerElement.remove()\n this._containerElement = null\n }\n this._widgetRef = null\n this._isWidgetRendered = false\n this._initializeWidgetPromise = null\n\n // Reset timestamp so show() will re-fetch all messages\n this._lastMessageTimestamp = null\n }\n\n /**\n * Check if the widget is currently visible (rendered in DOM)\n */\n isVisible(): boolean {\n return this._isWidgetRendered\n }\n\n /** Get tickets list for the current widget session */\n async getTickets(options?: GetTicketsOptions): Promise<GetTicketsResponse> {\n const token = this._config.token\n\n const queryParams: Record<string, string> = {\n widget_session_id: this._widgetSessionId,\n limit: String(options?.limit ?? 20),\n offset: String(options?.offset ?? 0),\n }\n\n if (options?.status) {\n queryParams.status = options.status\n }\n\n // eslint-disable-next-line compat/compat\n return new Promise((resolve, reject) => {\n this._posthog._send_request({\n url: this._posthog.requestRouter.endpointFor(\n 'api',\n `/api/conversations/v1/widget/tickets?${formDataToQuery(queryParams)}`\n ),\n method: 'GET',\n headers: {\n 'X-Conversations-Token': token,\n },\n callback: (response) => {\n if (response.statusCode === 429) {\n reject(new Error('Too many requests. Please wait before trying again.'))\n return\n }\n\n if (response.statusCode !== 200) {\n const errorMsg = response.json?.detail || response.json?.message || 'Failed to fetch tickets'\n logger.error('Failed to fetch tickets', { status: response.statusCode })\n reject(new Error(errorMsg))\n return\n }\n\n if (!response.json) {\n reject(new Error('Invalid response from server'))\n return\n }\n\n const data = response.json as GetTicketsResponse\n resolve(data)\n },\n })\n })\n }\n\n /**\n * Get the current active ticket ID\n * Returns null if no conversation has been started yet\n */\n getCurrentTicketId(): string | null {\n return this._currentTicketId\n }\n\n /**\n * Get the widget session ID (persistent browser identifier)\n * This ID is used for access control and stays the same across page loads\n */\n getWidgetSessionId(): string {\n return this._widgetSessionId\n }\n\n /**\n * Clean up the widget\n */\n destroy(): void {\n this._stopPolling()\n\n // Unsubscribe from identify events\n if (this._unsubscribeIdentifyListener) {\n this._unsubscribeIdentifyListener()\n this._unsubscribeIdentifyListener = null\n }\n\n if (this._containerElement) {\n render(null, this._containerElement)\n this._containerElement.remove()\n this._containerElement = null\n }\n\n this._widgetRef = null\n logger.info('Widget destroyed')\n }\n\n /**\n * Reset all conversation data and destroy the widget.\n * Called on posthog.reset() to start fresh.\n */\n reset(): void {\n // Clear all persisted conversation data\n this._persistence.clearAll()\n\n // Reset local state\n this._currentTicketId = null\n this._lastMessageTimestamp = null\n this._unreadCount = 0\n\n // Destroy the widget\n this.destroy()\n\n logger.info('Conversations reset')\n }\n\n /**\n * Render the widget to the DOM\n */\n private _renderWidget(\n initialState: ConversationsWidgetState,\n initialUserTraits: UserProvidedTraits | null,\n initialView: WidgetView = 'messages',\n initialTickets: Ticket[] = []\n ): void {\n if (!document) {\n logger.info('Conversations widget not rendered: Document not available')\n return\n }\n\n // Create container if it doesn't exist\n let container = document.getElementById(WIDGET_CONTAINER_ID) as HTMLDivElement\n if (!container) {\n if (!document.body) {\n logger.info('Conversations widget not rendered: Document body not available yet')\n return\n }\n container = document.createElement('div')\n container.id = WIDGET_CONTAINER_ID\n document.body.appendChild(container)\n }\n this._containerElement = container\n\n // Render widget with ref\n render(\n <ConversationsWidget\n ref={(ref: ConversationsWidget | null) => {\n this._widgetRef = ref\n }}\n config={this._config}\n initialState={initialState}\n initialUserTraits={initialUserTraits}\n isUserIdentified={this._posthog._isIdentified()}\n initialView={initialView}\n initialTickets={initialTickets}\n hasMultipleTickets={this._hasMultipleTickets}\n onSendMessage={this._handleSendMessage}\n onStateChange={this._handleStateChange}\n onIdentify={this._handleIdentify}\n onSelectTicket={this._handleSelectTicket}\n onNewConversation={this._handleNewConversation}\n onBackToTickets={this._handleBackToTickets}\n onViewChange={this._handleViewChange}\n />,\n container\n )\n }\n}\n\n/**\n * Initialize the conversations widget\n * This is the entry point called from the lazy-loaded bundle\n */\nexport function initConversations(config: ConversationsRemoteConfig, posthog: PostHog): ConversationsManager {\n logger.info('initConversations called', { hasConfig: !!config, hasPosthog: !!posthog })\n return new ConversationsManager(config, posthog)\n}\n","import { initConversations } from '../extensions/conversations/external'\nimport { assignableWindow } from '../utils/globals'\n\nassignableWindow.__PosthogExtensions__ = assignableWindow.__PosthogExtensions__ || {}\nassignableWindow.__PosthogExtensions__.initConversations = initConversations\n\nexport default initConversations\n"],"names":["p","v","y","nativeIsArray","Array","isArray","ObjProto","Object","prototype","type_utils_hasOwnProperty","hasOwnProperty","type_utils_toString","toString","obj","call","isUndefined","x","isNumber","win","window","undefined","global","globalThis","self","File","nativeForEach","forEach","navigator","document","location","fetch","XMLHttpRequest","AbortController","userAgent","assignableWindow","_createLogger","prefix","_temp","debugEnabled","logger","_log","level","POSTHOG_DEBUG","console","consoleLog","_len","arguments","length","args","_key","info","_len2","_key2","warn","_len3","_key3","error","_len4","_key4","critical","_len5","_key5","uninitializedWarning","methodName","createLogger","additionalPrefix","options","Math","trunc","ceil","floor","Number","isInteger","value","isFinite","DIGITS","UUID","constructor","bytes","this","TypeError","fromFieldsV7","unixTsMs","randA","randBHi","randBLo","RangeError","Uint8Array","pow","text","i","charAt","Error","clone","slice","equals","other","compareTo","diff","sign","V7Generator","_timestamp","_counter","_random","DefaultRandom","generate","generateOrAbort","valueAfterReset","ts","Date","now","_resetCounter","nextUint32","defaultGenerator","getRandomValues","buffer","UUIDV7_DENY_WEAK_RNG","random","crypto","_buffer","Uint32Array","_cursor","Infinity","uuidv7","uuidv7obj","CONVERSATIONS_WIDGET_SESSION_ID","CONVERSATIONS_TICKET_ID","CONVERSATIONS_WIDGET_STATE","CONVERSATIONS_USER_TRAITS","ConversationsPersistence","_posthog","_cachedWidgetSessionId","_isPersistenceAvailable","_this$_posthog$persis","_this$_posthog$persis2","persistence","isDisabled","getOrCreateWidgetSessionId","sessionId","_this$_posthog$persis3","_this$_posthog$persis4","get_property","register","clearWidgetSessionId","_this$_posthog$persis5","unregister","saveTicketId","ticketId","_this$_posthog$persis6","loadTicketId","_this$_posthog$persis7","clearTicketId","_this$_posthog$persis8","saveWidgetState","state","_this$_posthog$persis9","loadWidgetState","_this$_posthog$persis0","saveUserTraits","traits","_this$_posthog$persis1","hasName","name","hasEmail","email","loadUserTraits","_this$_posthog$persis10","clearUserTraits","_this$_posthog$persis11","clearAll","_this$_posthog$persis12","_this$_posthog$persis13","_this$_posthog$persis14","getContrastTextColor","hexColor","hex","replace","fullHex","r","parseInt","g","b","sqrt","getStyles","primaryColor","position","isLeft","includes","isTop","widget","_extends","top","bottom","left","right","zIndex","fontFamily","buttonContainer","button","width","height","borderRadius","background","color","border","cursor","boxShadow","display","alignItems","justifyContent","transition","unreadBadge","minWidth","fontSize","fontWeight","padding","boxSizing","flexDirection","overflow","windowOpen","maxWidth","maxHeight","header","flexShrink","headerTitle","headerActions","gap","headerButton","lineHeight","opacity","messages","flex","overflowY","message","animation","messageCustomer","alignSelf","messageAgent","messageAuthor","marginBottom","messageContent","wordWrap","whiteSpace","messageContentCustomer","borderBottomRightRadius","messageContentAgent","borderBottomLeftRadius","messageTime","marginTop","borderTop","borderBottom","textAlign","inputContainer","input","resize","outline","fieldSizing","sendButton","identificationForm","formTitle","formDescription","formField","formLabel","formInput","formInputError","borderColor","formError","formSubmitButton","formOptional","ticketListContainer","ticketList","ticketItem","ticketItemUnread","ticketItemContent","ticketItemArrow","ticketItemHeader","ticketPreview","textOverflow","ticketPreviewUnread","ticketUnreadBadge","ticketMeta","ticketTime","ticketStatus","textTransform","letterSpacing","newConversationButton","margin","ticketListLoading","loadingSpinner","ticketListEmpty","emptyStateIcon","emptyStateTitle","emptyStateDescription","newConversationButtonLarge","backButton","marginRight","headerWithBack","t","u","OpenChatButton","_ref","handleToggleOpen","unreadCount","styles","displayCount","_jsx","style","children","_jsxs","onClick","onMouseEnter","e","currentTarget","transform","onMouseLeave","viewBox","fill","xmlns","d","SendMessageButton","inputValue","isLoading","handleSendMessage","trim","disabled","stroke","strokeWidth","strokeLinejoin","CloseChatButton","handleClose","o","f","c","n","__b","a","__r","diffed","l","__c","m","unmount","s","__","__h","__H","push","j","shift","__P","z","B","__e","__v","__k","__m","__N","requestAnimationFrame","w","some","filter","k","clearTimeout","cancelAnimationFrame","setTimeout","sanitizeUrl","url","trimmedUrl","normalizedForCheck","toLowerCase","startsWith","lowerUrl","MAX_DEPTH","renderNode","node","depth","key","_node$content","type","marks","element","_Fragment","mark","fontStyle","textDecoration","code","_mark$attrs","href","attrs","safeUrl","target","rel","referrerPolicy","link","renderTextWithMarks","content","map","child","index","_node$content2","codeText","codeBlock","_node$attrs","_node$attrs2","src","alt","image","onError","paddingLeft","borderLeft","_node$attrs3","rawLevel","min","max","RichContent","richContent","isCustomer","C","useMemo","overflowX","wordBreak","doc","isValidTipTapDoc","rendered","_unused","lines","split","line","Fragment","renderPlainText","formatRelativeTime","isoString","date","diffMs","getTime","diffMins","diffHours","diffDays","toLocaleDateString","TicketListItem","status","maxLength","ticket","hasUnread","unread_count","statusLabel","toUpperCase","handleClick","id","onKeyDown","preventDefault","role","tabIndex","last_message","substring","last_message_at","created_at","points","LoadingState","EmptyState","_ref2","onNewConversation","TicketListView","_ref3","tickets","onSelectTicket","sort","dateA","x1","y1","x2","y2","ConversationsWidget","Component","props","_this","super","_messagesEndRef","_inputRef","_handleToggleOpen","setState","prevState","_handleClose","_handleSelectTicket","_handleNewConversation","_handleBackToTickets","onBackToTickets","_handleInputChange","_handleKeyPress","shiftKey","_handleSendMessage","_handleFormNameChange","formName","_handleFormEmailChange","formEmail","formEmailError","_handleFormSubmit","config","onIdentify","requireEmail","_validateEmail","userTraits","showIdentificationForm","_asyncToGenerator","trimmedMessage","userMessage","author_type","author_name","toISOString","is_private","onSendMessage","initialUserTraits","needsIdentification","_needsIdentification","isUserIdentified","initialState","view","initialView","initialTickets","ticketsLoading","hasMultipleTickets","componentDidMount","greetingText","_addGreetingMessage","componentDidUpdate","_prevProps","_scrollToBottom","onStateChange","_focusInput","greetingMessage","scrollIntoView","behavior","focus","test","addMessages","existingIds","Set","newMessages","has","show","hide","close","getUserTraits","setUserIdentified","setUnreadCount","count","updateTickets","setView","onViewChange","getView","setTicketsLoading","loading","clearMessages","addGreeting","_renderIdentificationForm","title","identificationFormTitle","description","identificationFormDescription","showNameField","collectName","onSubmit","onInput","placeholder","autoComplete","_renderMessage","messageStyle","contentStyle","rich_content","_renderBackButton","_renderTicketList","_renderMessages","placeholderText","ref","el","onKeyPress","rows","render","widgetPosition","windowStyle","showBackButton","breaker","each","iterator","thisArg","isNull","isNullish","eachArray","FormData","isFormData","pair","entries","formDataToQuery","formdata","arg_separator","use_val","use_key","tph_arr","val","encodeURIComponent","isFile","join","WIDGET_CONTAINER_ID","ConversationsManager","_widgetRef","_containerElement","_currentTicketId","_pollIntervalId","_lastMessageTimestamp","_isPolling","_unsubscribeIdentifyListener","_unreadCount","_isWidgetRendered","_initializeWidgetPromise","_currentView","_tickets","_hasMultipleTickets","_handleIdentify","_persistence","capture","_this$_widgetRef","sendMessage","_pollMessages","_x","apply","_handleStateChange","_markMessagesAsRead","_loadMessages","_pollTickets","_loadTickets","_poll","_handleViewChange","from","to","_ref5","_this$_widgetRef2","_this$_widgetRef3","_switchToTicketIfNeeded","_isWidgetOpen","_x2","_this$_widgetRef4","_this$_widgetRef5","_this$_widgetRef6","_this$_widgetRef7","_config","_widgetSessionId","_isWidgetEnabled","widgetEnabled","_isDomainAllowed","domains","_window$location","currentHostname","hostname","domain","allowedHostname","extractHostname","pattern","endsWith","isCurrentDomainAllowed","widgetSessionId","isWidgetEnabled","isDomainAllowed","_initialize","newTicket","_this2","isNewTicket","token","Promise","resolve","reject","_this2$_posthog$persi","distinctId","get_distinct_id","personProperties","$name","$email","payload","widget_session_id","distinct_id","ticket_id","_window$location2","capturedSessionId","get_session_id","session_id","replayUrl","get_session_replay_url","withTimestamp","timestampLookBack","currentUrl","session_context","session_replay_url","current_url","_send_request","requestRouter","endpointFor","method","data","headers","callback","response","statusCode","_response$json","_response$json2","errorMsg","json","detail","forced","messageLength","getMessages","after","_this3","targetTicketId","queryParams","limit","_response$json3","_response$json4","markAsRead","_this4","_response$json5","_response$json6","hasExistingTicket","domainAllowed","_initializeWidget","_setupIdentifyListener","_doInitializeWidget","_this5","_getInitialUserTraits","_determineInitialView","_renderWidget","ticketCount","hasUserTraits","_startPolling","posthogName","posthogEmail","savedTraits","_this6","_this6$_widgetRef","_this7","_this7$_widgetRef","_this7$_widgetRef2","lastMessage","_this8","_this8$_widgetRef","_this8$_widgetRef2","getTickets","results","totalUnread","reduce","sum","_this9","setInterval","_stopPolling","clearInterval","on","event","_this$_widgetRef8","remove","isVisible","_this0","_options$limit","_options$offset","String","offset","_response$json7","_response$json8","getCurrentTicketId","getWidgetSessionId","destroy","reset","container","getElementById","body","createElement","appendChild","_isIdentified","initConversations","posthog","hasConfig","hasPosthog","__PosthogExtensions__"],"mappings":"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","x_google_ignoreList":[0,9]}