@opencx/widget 3.0.93 → 3.0.94

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/designs.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("react/jsx-runtime"),nu=require("@radix-ui/react-popover"),Q=require("react"),H=require("./useModes-C_mX92ur.cjs"),ru=require("@radix-ui/react-dialog"),Z=require("lucide-react"),iu=require("clsx"),au=require("tailwind-merge"),dr=require("react-dom"),su=require("@radix-ui/react-slot"),ou=require("class-variance-authority"),pe=require("framer-motion"),uu=require("@radix-ui/react-avatar"),lu=require("@radix-ui/react-tooltip"),di=require("tinycolor2"),at=require("./is-exhaustive-9o43S91P.cjs"),cu=require("react-dropzone"),hi=require("./widget.ctx-CxQoP5qn.cjs"),du=require("react-use/lib/useAsyncFn"),Wn=require("zod");function $t(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const Ln=$t(nu),Ye=$t(Q),Fe=$t(ru),Ct=$t(uu),Jt=$t(lu);function fi(e,t){const n=String(e);if(typeof t!="string")throw new TypeError("Expected character");let r=0,i=n.indexOf(t);for(;i!==-1;)r++,i=n.indexOf(t,i+t.length);return r}const we=st(/[A-Za-z]/),Ee=st(/[\dA-Za-z]/),hu=st(/[#-'*+\--9=?A-Z^-~]/);function yn(e){return e!==null&&(e<32||e===127)}const hr=st(/\d/),fu=st(/[\dA-Fa-f]/),pu=st(/[!-/:-@[-`{-~]/);function Y(e){return e!==null&&e<-2}function ae(e){return e!==null&&(e<0||e===32)}function K(e){return e===-2||e===-1||e===32}const Dn=st(new RegExp("\\p{P}|\\p{S}","u")),pt=st(/\s/);function st(e){return t;function t(n){return n!==null&&n>-1&&e.test(String.fromCharCode(n))}}function mu(e){if(typeof e!="string")throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const Rn=function(e){if(e==null)return Tu;if(typeof e=="function")return vn(e);if(typeof e=="object")return Array.isArray(e)?gu(e):bu(e);if(typeof e=="string")return Eu(e);throw new Error("Expected function, string, or object as test")};function gu(e){const t=[];let n=-1;for(;++n<e.length;)t[n]=Rn(e[n]);return vn(r);function r(...i){let s=-1;for(;++s<t.length;)if(t[s].apply(this,i))return!0;return!1}}function bu(e){const t=e;return vn(n);function n(r){const i=r;let s;for(s in e)if(i[s]!==t[s])return!1;return!0}}function Eu(e){return vn(t);function t(n){return n&&n.type===e}}function vn(e){return t;function t(n,r,i){return!!(xu(n)&&e.call(this,n,typeof r=="number"?r:void 0,i||void 0))}}function Tu(){return!0}function xu(e){return e!==null&&typeof e=="object"&&"type"in e}const Da=[],wu=!0,fr=!1,_u="skip";function Ra(e,t,n,r){let i;typeof t=="function"&&typeof n!="function"?(r=n,n=t):i=t;const s=Rn(i),a=r?-1:1;u(e,void 0,[])();function u(l,c,d){const h=l&&typeof l=="object"?l:{};if(typeof h.type=="string"){const f=typeof h.tagName=="string"?h.tagName:typeof h.name=="string"?h.name:void 0;Object.defineProperty(b,"name",{value:"node ("+(l.type+(f?"<"+f+">":""))+")"})}return b;function b(){let f=Da,T,y,S;if((!t||s(l,c,d[d.length-1]||void 0))&&(f=yu(n(l,d)),f[0]===fr))return f;if("children"in l&&l.children){const C=l;if(C.children&&f[0]!==_u)for(y=(r?C.children.length:-1)+a,S=d.concat(C);y>-1&&y<C.children.length;){const O=C.children[y];if(T=u(O,y,S)(),T[0]===fr)return T;y=typeof T[1]=="number"?T[1]:y+a}}return f}}}function yu(e){return Array.isArray(e)?e:typeof e=="number"?[wu,e]:e==null?Da:[e]}function Au(e,t,n){const i=Rn((n||{}).ignore||[]),s=Cu(t);let a=-1;for(;++a<s.length;)Ra(e,"text",u);function u(c,d){let h=-1,b;for(;++h<d.length;){const f=d[h],T=b?b.children:void 0;if(i(f,T?T.indexOf(f):void 0,b))return;b=f}if(b)return l(c,d)}function l(c,d){const h=d[d.length-1],b=s[a][0],f=s[a][1];let T=0;const S=h.children.indexOf(c);let C=!1,O=[];b.lastIndex=0;let L=b.exec(c.value);for(;L;){const M=L.index,B={index:L.index,input:L.input,stack:[...d,c]};let I=f(...L,B);if(typeof I=="string"&&(I=I.length>0?{type:"text",value:I}:void 0),I===!1?b.lastIndex=M+1:(T!==M&&O.push({type:"text",value:c.value.slice(T,M)}),Array.isArray(I)?O.push(...I):I&&O.push(I),T=M+L[0].length,C=!0),!b.global)break;L=b.exec(c.value)}return C?(T<c.value.length&&O.push({type:"text",value:c.value.slice(T)}),h.children.splice(S,1,...O)):O=[c],S+O.length}}function Cu(e){const t=[];if(!Array.isArray(e))throw new TypeError("Expected find and replace tuple or list of tuples");const n=!e[0]||Array.isArray(e[0])?e:[e];let r=-1;for(;++r<n.length;){const i=n[r];t.push([ku(i[0]),Iu(i[1])])}return t}function ku(e){return typeof e=="string"?new RegExp(mu(e),"g"):e}function Iu(e){return typeof e=="function"?e:function(){return e}}const Vn="phrasing",Qn=["autolink","link","image","label"];function Su(){return{transforms:[Pu],enter:{literalAutolink:Ou,literalAutolinkEmail:Gn,literalAutolinkHttp:Gn,literalAutolinkWww:Gn},exit:{literalAutolink:vu,literalAutolinkEmail:Ru,literalAutolinkHttp:Lu,literalAutolinkWww:Du}}}function Nu(){return{unsafe:[{character:"@",before:"[+\\-.\\w]",after:"[\\-.\\w]",inConstruct:Vn,notInConstruct:Qn},{character:".",before:"[Ww]",after:"[\\-.\\w]",inConstruct:Vn,notInConstruct:Qn},{character:":",before:"[ps]",after:"\\/",inConstruct:Vn,notInConstruct:Qn}]}}function Ou(e){this.enter({type:"link",title:null,url:"",children:[]},e)}function Gn(e){this.config.enter.autolinkProtocol.call(this,e)}function Lu(e){this.config.exit.autolinkProtocol.call(this,e)}function Du(e){this.config.exit.data.call(this,e);const t=this.stack[this.stack.length-1];t.type,t.url="http://"+this.sliceSerialize(e)}function Ru(e){this.config.exit.autolinkEmail.call(this,e)}function vu(e){this.exit(e)}function Pu(e){Au(e,[[/(https?:\/\/|www(?=\.))([-.\w]+)([^ \t\r\n]*)/gi,Mu],[new RegExp("(?<=^|\\s|\\p{P}|\\p{S})([-.\\w+]+)@([-\\w]+(?:\\.[-\\w]+)+)","gu"),Bu]],{ignore:["link","linkReference"]})}function Mu(e,t,n,r,i){let s="";if(!va(i)||(/^w/i.test(t)&&(n=t+n,t="",s="http://"),!Fu(n)))return!1;const a=Hu(n+r);if(!a[0])return!1;const u={type:"link",title:null,url:s+t+a[0],children:[{type:"text",value:t+a[0]}]};return a[1]?[u,{type:"text",value:a[1]}]:u}function Bu(e,t,n,r){return!va(r,!0)||/[-\d_]$/.test(n)?!1:{type:"link",title:null,url:"mailto:"+t+"@"+n,children:[{type:"text",value:t+"@"+n}]}}function Fu(e){const t=e.split(".");return!(t.length<2||t[t.length-1]&&(/_/.test(t[t.length-1])||!/[a-zA-Z\d]/.test(t[t.length-1]))||t[t.length-2]&&(/_/.test(t[t.length-2])||!/[a-zA-Z\d]/.test(t[t.length-2])))}function Hu(e){const t=/[!"&'),.:;<>?\]}]+$/.exec(e);if(!t)return[e,void 0];e=e.slice(0,t.index);let n=t[0],r=n.indexOf(")");const i=fi(e,"(");let s=fi(e,")");for(;r!==-1&&i>s;)e+=n.slice(0,r+1),n=n.slice(r+1),r=n.indexOf(")"),s++;return[e,n]}function va(e,t){const n=e.input.charCodeAt(e.index-1);return(e.index===0||pt(n)||Dn(n))&&(!t||n!==47)}function Be(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}Pa.peek=Ku;function Uu(){return{enter:{gfmFootnoteDefinition:ju,gfmFootnoteDefinitionLabelString:Yu,gfmFootnoteCall:Vu,gfmFootnoteCallString:Qu},exit:{gfmFootnoteDefinition:Wu,gfmFootnoteDefinitionLabelString:qu,gfmFootnoteCall:Xu,gfmFootnoteCallString:Gu}}}function zu(){return{unsafe:[{character:"[",inConstruct:["phrasing","label","reference"]}],handlers:{footnoteDefinition:$u,footnoteReference:Pa}}}function ju(e){this.enter({type:"footnoteDefinition",identifier:"",label:"",children:[]},e)}function Yu(){this.buffer()}function qu(e){const t=this.resume(),n=this.stack[this.stack.length-1];n.type,n.label=t,n.identifier=Be(this.sliceSerialize(e)).toLowerCase()}function Wu(e){this.exit(e)}function Vu(e){this.enter({type:"footnoteReference",identifier:"",label:""},e)}function Qu(){this.buffer()}function Gu(e){const t=this.resume(),n=this.stack[this.stack.length-1];n.type,n.label=t,n.identifier=Be(this.sliceSerialize(e)).toLowerCase()}function Xu(e){this.exit(e)}function Pa(e,t,n,r){const i=n.createTracker(r);let s=i.move("[^");const a=n.enter("footnoteReference"),u=n.enter("reference");return s+=i.move(n.safe(n.associationId(e),{...i.current(),before:s,after:"]"})),u(),a(),s+=i.move("]"),s}function Ku(){return"["}function $u(e,t,n,r){const i=n.createTracker(r);let s=i.move("[^");const a=n.enter("footnoteDefinition"),u=n.enter("label");return s+=i.move(n.safe(n.associationId(e),{...i.current(),before:s,after:"]"})),u(),s+=i.move("]:"+(e.children&&e.children.length>0?" ":"")),i.shift(4),s+=i.move(n.indentLines(n.containerFlow(e,i.current()),Ju)),a(),s}function Ju(e,t,n){return t===0?e:(n?"":" ")+e}const Zu=["autolink","destinationLiteral","destinationRaw","reference","titleQuote","titleApostrophe"];Ma.peek=il;function el(){return{canContainEols:["delete"],enter:{strikethrough:nl},exit:{strikethrough:rl}}}function tl(){return{unsafe:[{character:"~",inConstruct:"phrasing",notInConstruct:Zu}],handlers:{delete:Ma}}}function nl(e){this.enter({type:"delete",children:[]},e)}function rl(e){this.exit(e)}function Ma(e,t,n,r){const i=n.createTracker(r),s=n.enter("strikethrough");let a=i.move("~~");return a+=n.containerPhrasing(e,{...i.current(),before:a,after:"~"}),a+=i.move("~~"),s(),a}function il(){return"~"}function al(e,t={}){const n=(t.align||[]).concat(),r=t.stringLength||ol,i=[],s=[],a=[],u=[];let l=0,c=-1;for(;++c<e.length;){const T=[],y=[];let S=-1;for(e[c].length>l&&(l=e[c].length);++S<e[c].length;){const C=sl(e[c][S]);if(t.alignDelimiters!==!1){const O=r(C);y[S]=O,(u[S]===void 0||O>u[S])&&(u[S]=O)}T.push(C)}s[c]=T,a[c]=y}let d=-1;if(typeof n=="object"&&"length"in n)for(;++d<l;)i[d]=pi(n[d]);else{const T=pi(n);for(;++d<l;)i[d]=T}d=-1;const h=[],b=[];for(;++d<l;){const T=i[d];let y="",S="";T===99?(y=":",S=":"):T===108?y=":":T===114&&(S=":");let C=t.alignDelimiters===!1?1:Math.max(1,u[d]-y.length-S.length);const O=y+"-".repeat(C)+S;t.alignDelimiters!==!1&&(C=y.length+C+S.length,C>u[d]&&(u[d]=C),b[d]=C),h[d]=O}s.splice(1,0,h),a.splice(1,0,b),c=-1;const f=[];for(;++c<s.length;){const T=s[c],y=a[c];d=-1;const S=[];for(;++d<l;){const C=T[d]||"";let O="",L="";if(t.alignDelimiters!==!1){const M=u[d]-(y[d]||0),B=i[d];B===114?O=" ".repeat(M):B===99?M%2?(O=" ".repeat(M/2+.5),L=" ".repeat(M/2-.5)):(O=" ".repeat(M/2),L=O):L=" ".repeat(M)}t.delimiterStart!==!1&&!d&&S.push("|"),t.padding!==!1&&!(t.alignDelimiters===!1&&C==="")&&(t.delimiterStart!==!1||d)&&S.push(" "),t.alignDelimiters!==!1&&S.push(O),S.push(C),t.alignDelimiters!==!1&&S.push(L),t.padding!==!1&&S.push(" "),(t.delimiterEnd!==!1||d!==l-1)&&S.push("|")}f.push(t.delimiterEnd===!1?S.join("").replace(/ +$/,""):S.join(""))}return f.join(`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("react/jsx-runtime"),nu=require("@radix-ui/react-popover"),Q=require("react"),H=require("./useModes-BzcZkifa.cjs"),ru=require("@radix-ui/react-dialog"),Z=require("lucide-react"),iu=require("clsx"),au=require("tailwind-merge"),dr=require("react-dom"),su=require("@radix-ui/react-slot"),ou=require("class-variance-authority"),pe=require("framer-motion"),uu=require("@radix-ui/react-avatar"),lu=require("@radix-ui/react-tooltip"),di=require("tinycolor2"),at=require("./is-exhaustive-9o43S91P.cjs"),cu=require("react-dropzone"),hi=require("./widget.ctx-B-9oCDpY.cjs"),du=require("react-use/lib/useAsyncFn"),Wn=require("zod");function $t(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const Ln=$t(nu),Ye=$t(Q),Fe=$t(ru),Ct=$t(uu),Jt=$t(lu);function fi(e,t){const n=String(e);if(typeof t!="string")throw new TypeError("Expected character");let r=0,i=n.indexOf(t);for(;i!==-1;)r++,i=n.indexOf(t,i+t.length);return r}const we=st(/[A-Za-z]/),Ee=st(/[\dA-Za-z]/),hu=st(/[#-'*+\--9=?A-Z^-~]/);function yn(e){return e!==null&&(e<32||e===127)}const hr=st(/\d/),fu=st(/[\dA-Fa-f]/),pu=st(/[!-/:-@[-`{-~]/);function Y(e){return e!==null&&e<-2}function ae(e){return e!==null&&(e<0||e===32)}function K(e){return e===-2||e===-1||e===32}const Dn=st(new RegExp("\\p{P}|\\p{S}","u")),pt=st(/\s/);function st(e){return t;function t(n){return n!==null&&n>-1&&e.test(String.fromCharCode(n))}}function mu(e){if(typeof e!="string")throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const Rn=function(e){if(e==null)return Tu;if(typeof e=="function")return vn(e);if(typeof e=="object")return Array.isArray(e)?gu(e):bu(e);if(typeof e=="string")return Eu(e);throw new Error("Expected function, string, or object as test")};function gu(e){const t=[];let n=-1;for(;++n<e.length;)t[n]=Rn(e[n]);return vn(r);function r(...i){let s=-1;for(;++s<t.length;)if(t[s].apply(this,i))return!0;return!1}}function bu(e){const t=e;return vn(n);function n(r){const i=r;let s;for(s in e)if(i[s]!==t[s])return!1;return!0}}function Eu(e){return vn(t);function t(n){return n&&n.type===e}}function vn(e){return t;function t(n,r,i){return!!(xu(n)&&e.call(this,n,typeof r=="number"?r:void 0,i||void 0))}}function Tu(){return!0}function xu(e){return e!==null&&typeof e=="object"&&"type"in e}const Da=[],wu=!0,fr=!1,_u="skip";function Ra(e,t,n,r){let i;typeof t=="function"&&typeof n!="function"?(r=n,n=t):i=t;const s=Rn(i),a=r?-1:1;u(e,void 0,[])();function u(l,c,d){const h=l&&typeof l=="object"?l:{};if(typeof h.type=="string"){const f=typeof h.tagName=="string"?h.tagName:typeof h.name=="string"?h.name:void 0;Object.defineProperty(b,"name",{value:"node ("+(l.type+(f?"<"+f+">":""))+")"})}return b;function b(){let f=Da,T,y,S;if((!t||s(l,c,d[d.length-1]||void 0))&&(f=yu(n(l,d)),f[0]===fr))return f;if("children"in l&&l.children){const C=l;if(C.children&&f[0]!==_u)for(y=(r?C.children.length:-1)+a,S=d.concat(C);y>-1&&y<C.children.length;){const O=C.children[y];if(T=u(O,y,S)(),T[0]===fr)return T;y=typeof T[1]=="number"?T[1]:y+a}}return f}}}function yu(e){return Array.isArray(e)?e:typeof e=="number"?[wu,e]:e==null?Da:[e]}function Au(e,t,n){const i=Rn((n||{}).ignore||[]),s=Cu(t);let a=-1;for(;++a<s.length;)Ra(e,"text",u);function u(c,d){let h=-1,b;for(;++h<d.length;){const f=d[h],T=b?b.children:void 0;if(i(f,T?T.indexOf(f):void 0,b))return;b=f}if(b)return l(c,d)}function l(c,d){const h=d[d.length-1],b=s[a][0],f=s[a][1];let T=0;const S=h.children.indexOf(c);let C=!1,O=[];b.lastIndex=0;let L=b.exec(c.value);for(;L;){const M=L.index,B={index:L.index,input:L.input,stack:[...d,c]};let I=f(...L,B);if(typeof I=="string"&&(I=I.length>0?{type:"text",value:I}:void 0),I===!1?b.lastIndex=M+1:(T!==M&&O.push({type:"text",value:c.value.slice(T,M)}),Array.isArray(I)?O.push(...I):I&&O.push(I),T=M+L[0].length,C=!0),!b.global)break;L=b.exec(c.value)}return C?(T<c.value.length&&O.push({type:"text",value:c.value.slice(T)}),h.children.splice(S,1,...O)):O=[c],S+O.length}}function Cu(e){const t=[];if(!Array.isArray(e))throw new TypeError("Expected find and replace tuple or list of tuples");const n=!e[0]||Array.isArray(e[0])?e:[e];let r=-1;for(;++r<n.length;){const i=n[r];t.push([ku(i[0]),Iu(i[1])])}return t}function ku(e){return typeof e=="string"?new RegExp(mu(e),"g"):e}function Iu(e){return typeof e=="function"?e:function(){return e}}const Vn="phrasing",Qn=["autolink","link","image","label"];function Su(){return{transforms:[Pu],enter:{literalAutolink:Ou,literalAutolinkEmail:Gn,literalAutolinkHttp:Gn,literalAutolinkWww:Gn},exit:{literalAutolink:vu,literalAutolinkEmail:Ru,literalAutolinkHttp:Lu,literalAutolinkWww:Du}}}function Nu(){return{unsafe:[{character:"@",before:"[+\\-.\\w]",after:"[\\-.\\w]",inConstruct:Vn,notInConstruct:Qn},{character:".",before:"[Ww]",after:"[\\-.\\w]",inConstruct:Vn,notInConstruct:Qn},{character:":",before:"[ps]",after:"\\/",inConstruct:Vn,notInConstruct:Qn}]}}function Ou(e){this.enter({type:"link",title:null,url:"",children:[]},e)}function Gn(e){this.config.enter.autolinkProtocol.call(this,e)}function Lu(e){this.config.exit.autolinkProtocol.call(this,e)}function Du(e){this.config.exit.data.call(this,e);const t=this.stack[this.stack.length-1];t.type,t.url="http://"+this.sliceSerialize(e)}function Ru(e){this.config.exit.autolinkEmail.call(this,e)}function vu(e){this.exit(e)}function Pu(e){Au(e,[[/(https?:\/\/|www(?=\.))([-.\w]+)([^ \t\r\n]*)/gi,Mu],[new RegExp("(?<=^|\\s|\\p{P}|\\p{S})([-.\\w+]+)@([-\\w]+(?:\\.[-\\w]+)+)","gu"),Bu]],{ignore:["link","linkReference"]})}function Mu(e,t,n,r,i){let s="";if(!va(i)||(/^w/i.test(t)&&(n=t+n,t="",s="http://"),!Fu(n)))return!1;const a=Hu(n+r);if(!a[0])return!1;const u={type:"link",title:null,url:s+t+a[0],children:[{type:"text",value:t+a[0]}]};return a[1]?[u,{type:"text",value:a[1]}]:u}function Bu(e,t,n,r){return!va(r,!0)||/[-\d_]$/.test(n)?!1:{type:"link",title:null,url:"mailto:"+t+"@"+n,children:[{type:"text",value:t+"@"+n}]}}function Fu(e){const t=e.split(".");return!(t.length<2||t[t.length-1]&&(/_/.test(t[t.length-1])||!/[a-zA-Z\d]/.test(t[t.length-1]))||t[t.length-2]&&(/_/.test(t[t.length-2])||!/[a-zA-Z\d]/.test(t[t.length-2])))}function Hu(e){const t=/[!"&'),.:;<>?\]}]+$/.exec(e);if(!t)return[e,void 0];e=e.slice(0,t.index);let n=t[0],r=n.indexOf(")");const i=fi(e,"(");let s=fi(e,")");for(;r!==-1&&i>s;)e+=n.slice(0,r+1),n=n.slice(r+1),r=n.indexOf(")"),s++;return[e,n]}function va(e,t){const n=e.input.charCodeAt(e.index-1);return(e.index===0||pt(n)||Dn(n))&&(!t||n!==47)}function Be(e){return e.replace(/[\t\n\r ]+/g," ").replace(/^ | $/g,"").toLowerCase().toUpperCase()}Pa.peek=Ku;function Uu(){return{enter:{gfmFootnoteDefinition:ju,gfmFootnoteDefinitionLabelString:Yu,gfmFootnoteCall:Vu,gfmFootnoteCallString:Qu},exit:{gfmFootnoteDefinition:Wu,gfmFootnoteDefinitionLabelString:qu,gfmFootnoteCall:Xu,gfmFootnoteCallString:Gu}}}function zu(){return{unsafe:[{character:"[",inConstruct:["phrasing","label","reference"]}],handlers:{footnoteDefinition:$u,footnoteReference:Pa}}}function ju(e){this.enter({type:"footnoteDefinition",identifier:"",label:"",children:[]},e)}function Yu(){this.buffer()}function qu(e){const t=this.resume(),n=this.stack[this.stack.length-1];n.type,n.label=t,n.identifier=Be(this.sliceSerialize(e)).toLowerCase()}function Wu(e){this.exit(e)}function Vu(e){this.enter({type:"footnoteReference",identifier:"",label:""},e)}function Qu(){this.buffer()}function Gu(e){const t=this.resume(),n=this.stack[this.stack.length-1];n.type,n.label=t,n.identifier=Be(this.sliceSerialize(e)).toLowerCase()}function Xu(e){this.exit(e)}function Pa(e,t,n,r){const i=n.createTracker(r);let s=i.move("[^");const a=n.enter("footnoteReference"),u=n.enter("reference");return s+=i.move(n.safe(n.associationId(e),{...i.current(),before:s,after:"]"})),u(),a(),s+=i.move("]"),s}function Ku(){return"["}function $u(e,t,n,r){const i=n.createTracker(r);let s=i.move("[^");const a=n.enter("footnoteDefinition"),u=n.enter("label");return s+=i.move(n.safe(n.associationId(e),{...i.current(),before:s,after:"]"})),u(),s+=i.move("]:"+(e.children&&e.children.length>0?" ":"")),i.shift(4),s+=i.move(n.indentLines(n.containerFlow(e,i.current()),Ju)),a(),s}function Ju(e,t,n){return t===0?e:(n?"":" ")+e}const Zu=["autolink","destinationLiteral","destinationRaw","reference","titleQuote","titleApostrophe"];Ma.peek=il;function el(){return{canContainEols:["delete"],enter:{strikethrough:nl},exit:{strikethrough:rl}}}function tl(){return{unsafe:[{character:"~",inConstruct:"phrasing",notInConstruct:Zu}],handlers:{delete:Ma}}}function nl(e){this.enter({type:"delete",children:[]},e)}function rl(e){this.exit(e)}function Ma(e,t,n,r){const i=n.createTracker(r),s=n.enter("strikethrough");let a=i.move("~~");return a+=n.containerPhrasing(e,{...i.current(),before:a,after:"~"}),a+=i.move("~~"),s(),a}function il(){return"~"}function al(e,t={}){const n=(t.align||[]).concat(),r=t.stringLength||ol,i=[],s=[],a=[],u=[];let l=0,c=-1;for(;++c<e.length;){const T=[],y=[];let S=-1;for(e[c].length>l&&(l=e[c].length);++S<e[c].length;){const C=sl(e[c][S]);if(t.alignDelimiters!==!1){const O=r(C);y[S]=O,(u[S]===void 0||O>u[S])&&(u[S]=O)}T.push(C)}s[c]=T,a[c]=y}let d=-1;if(typeof n=="object"&&"length"in n)for(;++d<l;)i[d]=pi(n[d]);else{const T=pi(n);for(;++d<l;)i[d]=T}d=-1;const h=[],b=[];for(;++d<l;){const T=i[d];let y="",S="";T===99?(y=":",S=":"):T===108?y=":":T===114&&(S=":");let C=t.alignDelimiters===!1?1:Math.max(1,u[d]-y.length-S.length);const O=y+"-".repeat(C)+S;t.alignDelimiters!==!1&&(C=y.length+C+S.length,C>u[d]&&(u[d]=C),b[d]=C),h[d]=O}s.splice(1,0,h),a.splice(1,0,b),c=-1;const f=[];for(;++c<s.length;){const T=s[c],y=a[c];d=-1;const S=[];for(;++d<l;){const C=T[d]||"";let O="",L="";if(t.alignDelimiters!==!1){const M=u[d]-(y[d]||0),B=i[d];B===114?O=" ".repeat(M):B===99?M%2?(O=" ".repeat(M/2+.5),L=" ".repeat(M/2-.5)):(O=" ".repeat(M/2),L=O):L=" ".repeat(M)}t.delimiterStart!==!1&&!d&&S.push("|"),t.padding!==!1&&!(t.alignDelimiters===!1&&C==="")&&(t.delimiterStart!==!1||d)&&S.push(" "),t.alignDelimiters!==!1&&S.push(O),S.push(C),t.alignDelimiters!==!1&&S.push(L),t.padding!==!1&&S.push(" "),(t.delimiterEnd!==!1||d!==l-1)&&S.push("|")}f.push(t.delimiterEnd===!1?S.join("").replace(/ +$/,""):S.join(""))}return f.join(`
2
2
  `)}function sl(e){return e==null?"":String(e)}function ol(e){return e.length}function pi(e){const t=typeof e=="string"?e.codePointAt(0):0;return t===67||t===99?99:t===76||t===108?108:t===82||t===114?114:0}const mi={}.hasOwnProperty;function Ba(e,t){const n=t||{};function r(i,...s){let a=r.invalid;const u=r.handlers;if(i&&mi.call(i,e)){const l=String(i[e]);a=mi.call(u,l)?u[l]:r.unknown}if(a)return a.call(this,i,...s)}return r.handlers=n.handlers||{},r.invalid=n.invalid,r.unknown=n.unknown,r}function ul(e,t,n,r){const i=n.enter("blockquote"),s=n.createTracker(r);s.move("> "),s.shift(2);const a=n.indentLines(n.containerFlow(e,s.current()),ll);return i(),a}function ll(e,t,n){return">"+(n?"":" ")+e}function cl(e,t){return gi(e,t.inConstruct,!0)&&!gi(e,t.notInConstruct,!1)}function gi(e,t,n){if(typeof t=="string"&&(t=[t]),!t||t.length===0)return n;let r=-1;for(;++r<t.length;)if(e.includes(t[r]))return!0;return!1}function bi(e,t,n,r){let i=-1;for(;++i<n.unsafe.length;)if(n.unsafe[i].character===`
3
3
  `&&cl(n.stack,n.unsafe[i]))return/[ \t]/.test(r.before)?"":" ";return`\\
4
4
  `}function dl(e,t){const n=String(e);let r=n.indexOf(t),i=r,s=0,a=0;if(typeof t!="string")throw new TypeError("Expected substring");for(;r!==-1;)r===i?++s>a&&(a=s):s=1,i=r+t.length,r=n.indexOf(t,i);return a}function hl(e,t){return!!(t.options.fences===!1&&e.value&&!e.lang&&/[^ \r\n]/.test(e.value)&&!/^[\t ]*(?:[\r\n]|$)|(?:^|[\r\n])[\t ]*$/.test(e.value))}function fl(e){const t=e.options.fence||"`";if(t!=="`"&&t!=="~")throw new Error("Cannot serialize code with `"+t+"` for `options.fence`, expected `` ` `` or `~`");return t}function pl(e,t,n,r){const i=fl(n),s=e.value||"",a=i==="`"?"GraveAccent":"Tilde";if(hl(e,n)){const h=n.enter("codeIndented"),b=n.indentLines(s,ml);return h(),b}const u=n.createTracker(r),l=i.repeat(Math.max(dl(s,i)+1,3)),c=n.enter("codeFenced");let d=u.move(l);if(e.lang){const h=n.enter(`codeFencedLang${a}`);d+=u.move(n.safe(e.lang,{before:d,after:" ",encode:["`"],...u.current()})),h()}if(e.lang&&e.meta){const h=n.enter(`codeFencedMeta${a}`);d+=u.move(" "),d+=u.move(n.safe(e.meta,{before:d,after:`
package/dist/designs.js CHANGED
@@ -2,7 +2,7 @@ import { Fragment as Ur, jsx as g, jsxs as U } from "react/jsx-runtime";
2
2
  import * as Hn from "@radix-ui/react-popover";
3
3
  import * as qe from "react";
4
4
  import kt, { forwardRef as zr, useState as Ne, useImperativeHandle as Tu, useRef as sn, useCallback as wu, useMemo as Yr, useEffect as Ot, memo as xu, cloneElement as _u, createElement as Ai } from "react";
5
- import { a as Ce, u as ot, d as bt, g as Et, i as yu, c as Va, h as Je, e as Un, j as Lt, l as Qa, b as Au, W as Cu, k as ku } from "./useModes-BAsZP8Lq.js";
5
+ import { a as Ce, u as ot, d as bt, g as Et, i as yu, c as Va, h as Je, e as Un, j as Lt, l as Qa, b as Au, W as Cu, k as ku } from "./useModes-B5-vdm1q.js";
6
6
  import * as Fe from "@radix-ui/react-dialog";
7
7
  import { X as Iu, PaperclipIcon as Nu, ImageIcon as Su, CircleDashed as Ou, ArrowUpIcon as Lu, CircleCheckIcon as Ga, XIcon as qr, AlertCircle as Du, Loader2 as Ru, FileAudio2Icon as vu, FileVideo2Icon as Pu, FileIcon as Mu, SquareXIcon as Bu, SquareCheckBigIcon as Fu, SquareCheckIcon as Hu, ShrinkIcon as Uu, Minimize2Icon as zu, MinimizeIcon as Yu, Maximize2Icon as qu, MaximizeIcon as Wu, ExpandIcon as ju, CircleXIcon as Vu, CircleCheckBigIcon as Qu, CheckCheckIcon as Gu, CheckIcon as Xu, CircleDashedIcon as Ku, ChevronLeftIcon as $u, LoaderIcon as Ju, SendHorizontal as Zu, UserRoundIcon as el, ChevronRightIcon as tl, ChevronDownIcon as nl } from "lucide-react";
8
8
  import { clsx as rl } from "clsx";
@@ -16,7 +16,7 @@ import * as on from "@radix-ui/react-tooltip";
16
16
  import Ci from "tinycolor2";
17
17
  import { i as st } from "./is-exhaustive-DGJzQK69.js";
18
18
  import { useDropzone as ol } from "react-dropzone";
19
- import { r as ki } from "./widget.ctx-Djrb64eX.js";
19
+ import { r as ki } from "./widget.ctx-CfUvw50X.js";
20
20
  import ul from "react-use/lib/useAsyncFn";
21
21
  import { z as er } from "zod";
22
22
  function Ii(e, t) {
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./widget.ctx-CxQoP5qn.cjs"),e=require("./is-exhaustive-9o43S91P.cjs");exports.PrimitiveState=t.PrimitiveState;exports.WidgetCtx=t.WidgetCtx;exports.isExhaustive=e.isExhaustive;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./widget.ctx-B-9oCDpY.cjs"),e=require("./is-exhaustive-9o43S91P.cjs");exports.PrimitiveState=t.PrimitiveState;exports.WidgetCtx=t.WidgetCtx;exports.isExhaustive=e.isExhaustive;
2
2
  //# sourceMappingURL=index.cjs.map
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { P as e, W as a } from "./widget.ctx-Djrb64eX.js";
1
+ import { P as e, W as a } from "./widget.ctx-CfUvw50X.js";
2
2
  import { i as s } from "./is-exhaustive-DGJzQK69.js";
3
3
  export {
4
4
  e as PrimitiveState,
package/dist/react.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./useModes-C_mX92ur.cjs"),o=require("react-use/lib/useAsyncFn");function g(s,t,i){const{widgetCtx:{api:u}}=e.useWidget();return o(async r=>u.vote({action:r==="up"?"upvote":"downvote",messagePublicId:s,sessionId:t}).then(i),[u,s,t,i])}exports.WidgetProvider=e.WidgetProvider;exports.WidgetTriggerProvider=e.WidgetTriggerProvider;exports.useConfig=e.useConfig;exports.useContact=e.useContact;exports.useIsAwaitingBotReply=e.useIsAwaitingBotReply;exports.useMessages=e.useMessages;exports.useModes=e.useModes;exports.usePreludeData=e.usePreludeData;exports.usePrimitiveState=e.usePrimitiveState;exports.useSessions=e.useSessions;exports.useUploadFiles=e.useUploadFiles;exports.useWidget=e.useWidget;exports.useWidgetRouter=e.useWidgetRouter;exports.useWidgetTrigger=e.useWidgetTrigger;exports.useVote=g;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./useModes-BzcZkifa.cjs"),o=require("react-use/lib/useAsyncFn");function g(s,t,i){const{widgetCtx:{api:u}}=e.useWidget();return o(async r=>u.vote({action:r==="up"?"upvote":"downvote",messagePublicId:s,sessionId:t}).then(i),[u,s,t,i])}exports.WidgetProvider=e.WidgetProvider;exports.WidgetTriggerProvider=e.WidgetTriggerProvider;exports.useConfig=e.useConfig;exports.useContact=e.useContact;exports.useIsAwaitingBotReply=e.useIsAwaitingBotReply;exports.useMessages=e.useMessages;exports.useModes=e.useModes;exports.usePreludeData=e.usePreludeData;exports.usePrimitiveState=e.usePrimitiveState;exports.useSessions=e.useSessions;exports.useUploadFiles=e.useUploadFiles;exports.useWidget=e.useWidget;exports.useWidgetRouter=e.useWidgetRouter;exports.useWidgetTrigger=e.useWidgetTrigger;exports.useVote=g;
2
2
  //# sourceMappingURL=react.cjs.map
package/dist/react.js CHANGED
@@ -1,5 +1,5 @@
1
- import { u as o } from "./useModes-BAsZP8Lq.js";
2
- import { W as m, k as c, a as f, b as l, c as v, d as W, l as P, e as w, f as x, g as y, i as C, h as b, j as h } from "./useModes-BAsZP8Lq.js";
1
+ import { u as o } from "./useModes-B5-vdm1q.js";
2
+ import { W as m, k as c, a as f, b as l, c as v, d as W, l as P, e as w, f as x, g as y, i as C, h as b, j as h } from "./useModes-B5-vdm1q.js";
3
3
  import r from "react-use/lib/useAsyncFn";
4
4
  function n(e, s, t) {
5
5
  const {
@@ -1,6 +1,7 @@
1
1
  import { ApiCaller } from '../api/api-caller';
2
2
  import { Dto } from '../api/client';
3
3
  import { SessionDto } from '../types/dtos';
4
+ import { WidgetConfig } from '../types/widget-config';
4
5
  import { PrimitiveState } from '../utils/PrimitiveState';
5
6
  import { ContactCtx } from './contact.ctx';
6
7
  type SessionState = {
@@ -24,13 +25,15 @@ type SessionsState = {
24
25
  isInitialFetchLoading: boolean;
25
26
  };
26
27
  export declare class SessionCtx {
28
+ private config;
27
29
  private api;
28
30
  private contactCtx;
29
31
  private sessionsPollingIntervalSeconds;
30
32
  private sessionsRefresher;
31
33
  sessionState: PrimitiveState<SessionState>;
32
34
  sessionsState: PrimitiveState<SessionsState>;
33
- constructor({ api, contactCtx, sessionsPollingIntervalSeconds, }: {
35
+ constructor({ config, api, contactCtx, sessionsPollingIntervalSeconds, }: {
36
+ config: WidgetConfig;
34
37
  api: ApiCaller;
35
38
  contactCtx: ContactCtx;
36
39
  sessionsPollingIntervalSeconds: number;
@@ -348,6 +348,12 @@ export interface WidgetConfig {
348
348
  * @default undefined
349
349
  */
350
350
  messageCustomData?: Record<string, unknown>;
351
+ /**
352
+ * Custom data to be added to the session upon creation.
353
+ * This custom data is intended for human use only; the AI will not see it and it will not affect the AI's response.
354
+ * @default undefined
355
+ */
356
+ sessionCustomData?: Record<string, unknown>;
351
357
  /**
352
358
  * An apiUrl to override production backend.
353
359
  * This is for us to test the widget locally, you don't need to play with this option 😊.
@@ -2,8 +2,8 @@ import k from "swr";
2
2
  import { createContext as U, useRef as b, useState as w, useMemo as m, useEffect as h, useContext as F, useSyncExternalStore as P } from "react";
3
3
  import { v4 as O } from "uuid";
4
4
  import { jsx as W } from "react/jsx-runtime";
5
- import { W as R } from "./widget.ctx-Djrb64eX.js";
6
- const N = "3.0.93";
5
+ import { W as R } from "./widget.ctx-CfUvw50X.js";
6
+ const N = "3.0.94";
7
7
  class T {
8
8
  constructor(t) {
9
9
  this.components = [];
@@ -256,4 +256,4 @@ export {
256
256
  Q as l,
257
257
  g as u
258
258
  };
259
- //# sourceMappingURL=useModes-BAsZP8Lq.js.map
259
+ //# sourceMappingURL=useModes-B5-vdm1q.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useModes-BAsZP8Lq.js","sources":["../src/headless/react/ComponentRegistry.ts","../src/headless/react/WidgetProvider.tsx","../src/headless/react/hooks/useConfig.ts","../src/headless/react/hooks/usePrimitiveState.ts","../src/headless/react/hooks/useContact.ts","../src/headless/react/hooks/useMessages.ts","../src/headless/react/hooks/useSessions.ts","../src/headless/react/hooks/useIsAwaitingBotReply.ts","../src/headless/react/hooks/usePreludeData.ts","../src/headless/react/hooks/useWidgetRouter.ts","../src/headless/react/hooks/useUploadFiles.ts","../src/headless/react/hooks/useWidgetTrigger.tsx","../src/headless/react/hooks/useModes.ts"],"sourcesContent":["import type { WidgetComponentKey } from '../core';\nimport type { WidgetComponentType } from './types/components';\n\nexport class ComponentRegistry {\n components: WidgetComponentType[] = [];\n\n constructor(opts: { components?: WidgetComponentType[] }) {\n const { components } = opts;\n\n if (components) {\n components.forEach((c) => this.register(c));\n }\n\n if (this.components.length === 0) {\n throw new Error('No components registered');\n }\n if (!this.get('fallback')) {\n throw new Error('No fallback component registered');\n }\n }\n\n // TODO test that this registers or replaces the component\n register(component: WidgetComponentType) {\n // Replace the key if it already exists\n const index = this.components.findIndex((c) => c.key === component.key);\n if (index !== -1) {\n this.components[index] = component;\n } else {\n this.components.push(component);\n }\n return this;\n }\n\n private get(key: WidgetComponentKey) {\n const c = this.components.find(\n (c) => c.key.toUpperCase() === key.toUpperCase(),\n );\n if (c) return c;\n return null;\n }\n\n public getComponent(key: string) {\n return this.get(key)?.component;\n }\n}\n","import React, {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { version } from '../../../package.json';\nimport { type ExternalStorage, type WidgetConfig, WidgetCtx } from '../core';\nimport { ComponentRegistry } from './ComponentRegistry';\nimport type { WidgetComponentType } from './types/components';\n\ninterface WidgetProviderValue {\n widgetCtx: WidgetCtx;\n config: WidgetConfig;\n components?: WidgetComponentType[];\n componentStore: ComponentRegistry;\n version: string;\n contentIframeRef?: React.MutableRefObject<HTMLIFrameElement | null>;\n}\n\nconst context = createContext<WidgetProviderValue | null>(null);\n\nexport function WidgetProvider({\n options: config,\n children,\n components,\n storage,\n loadingComponent,\n}: {\n options: WidgetConfig;\n children: React.ReactNode;\n components?: WidgetComponentType[];\n storage?: ExternalStorage;\n /**\n * Custom loading component while the widget is initializing\n * Not to be confused with the `loading` custom component which renders when the bot's reply is pending\n */\n loadingComponent?: React.ReactNode;\n}) {\n const contentIframeRef = useRef<HTMLIFrameElement | null>(null);\n\n const didInitialize = useRef(false);\n const [widgetCtx, setWidgetCtx] = useState<WidgetCtx | null>(null);\n\n const componentStore = useMemo(\n () =>\n new ComponentRegistry({\n components: components,\n }),\n [components],\n );\n\n useEffect(() => {\n if (didInitialize.current) return;\n didInitialize.current = true;\n\n WidgetCtx.initialize({ config, storage }).then(setWidgetCtx);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (!widgetCtx) {\n return loadingComponent || null;\n }\n\n return (\n <context.Provider\n value={{\n widgetCtx,\n config,\n components,\n componentStore,\n version,\n contentIframeRef,\n }}\n >\n {children}\n </context.Provider>\n );\n}\n\nexport function useWidget() {\n const ctx = useContext(context);\n if (!ctx) {\n throw new Error('useWidget must be used within a WidgetProvider');\n }\n return ctx;\n}\n","import { useWidget } from '../WidgetProvider';\n\nexport function useConfig() {\n const { config } = useWidget();\n\n return config;\n}\n","import { useSyncExternalStore } from 'react';\nimport type { PrimitiveState } from '../../core';\n\nexport function usePrimitiveState<T>(p: PrimitiveState<T>) {\n return useSyncExternalStore(p.subscribe, p.get, p.get);\n}\n","import { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\n\nexport function useContact() {\n const { widgetCtx } = useWidget();\n const contactState = usePrimitiveState(widgetCtx.contactCtx.state);\n\n return {\n contactState,\n createUnverifiedContact: widgetCtx.contactCtx.createUnverifiedContact,\n };\n}\n","import { usePrimitiveState } from './usePrimitiveState';\nimport { useWidget } from '../WidgetProvider';\n\nexport function useMessages() {\n const { widgetCtx } = useWidget();\n const messagesState = usePrimitiveState(widgetCtx.messageCtx.state);\n\n return { messagesState, sendMessage: widgetCtx.messageCtx.sendMessage };\n}\n","import { useMemo } from 'react';\nimport { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\nimport { useConfig } from './useConfig';\n\nexport function useSessions() {\n const { widgetCtx } = useWidget();\n const { oneOpenSessionAllowed } = useConfig();\n const sessionState = usePrimitiveState(widgetCtx.sessionCtx.sessionState);\n const sessionsState = usePrimitiveState(widgetCtx.sessionCtx.sessionsState);\n\n const { openSessions, closedSessions } = useMemo(() => {\n return {\n openSessions: sessionsState.data.filter((s) => s.isOpened === true),\n closedSessions: sessionsState.data.filter((s) => s.isOpened === false),\n };\n }, [sessionsState.data]);\n\n const canCreateNewSession = useMemo(() => {\n if (oneOpenSessionAllowed) {\n return openSessions.length === 0;\n }\n return true;\n }, [oneOpenSessionAllowed, openSessions.length]);\n\n return {\n sessionState,\n sessionsState,\n loadMoreSessions: widgetCtx.sessionCtx.loadMoreSessions,\n resolveSession: widgetCtx.sessionCtx.resolveSession,\n createStateCheckpoint: widgetCtx.sessionCtx.createStateCheckpoint,\n openSessions,\n closedSessions,\n canCreateNewSession,\n };\n}\n","import { useMessages } from './useMessages';\nimport { useSessions } from './useSessions';\n\nexport function useIsAwaitingBotReply() {\n const { sessionState } = useSessions();\n const { messagesState } = useMessages();\n\n const isSessionAssignedToAI = sessionState.session?.assignee.kind === 'ai';\n // This check is useful in cases where the user might navigate in and out of a chat, and `isSendingMessage` is reset back to its default value\n const lastMessage =\n messagesState.messages.length > 0\n ? messagesState.messages[messagesState.messages.length - 1]\n : null;\n const isLastMessageAUserMessage = lastMessage?.type === 'FROM_USER';\n\n const isAwaitingBotReply =\n (isSessionAssignedToAI || sessionState.isCreatingSession) &&\n (messagesState.isSendingMessage || isLastMessageAUserMessage);\n\n return { isAwaitingBotReply };\n}\n","import useSWR from 'swr';\nimport { useWidget } from '../WidgetProvider';\n\nfunction usePreludeData() {\n const { widgetCtx } = useWidget();\n\n // TODO remove swr dependency\n return useSWR([widgetCtx.config.token], widgetCtx.api.widgetPrelude, {\n revalidateOnFocus: false,\n });\n}\n\nexport { usePreludeData };\n","import { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\n\nexport function useWidgetRouter() {\n const { widgetCtx } = useWidget();\n\n const routerState = usePrimitiveState(widgetCtx.routerCtx.state);\n\n return {\n routerState,\n toSessionsScreen: widgetCtx.routerCtx.toSessionsScreen,\n toChatScreen: widgetCtx.routerCtx.toChatScreen,\n };\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport { useWidget } from '../WidgetProvider';\nimport { v4 } from 'uuid';\n\nconst uploadAbortControllers: Map<string, AbortController> = new Map();\n\ninterface FileWithProgress {\n status: 'pending' | 'uploading' | 'success' | 'error';\n id: string;\n file: File;\n fileUrl?: string;\n progress: number;\n error?: string;\n}\n\nfunction useUploadFiles() {\n const [files, setFiles] = useState<FileWithProgress[]>([]);\n const {\n widgetCtx: { api },\n } = useWidget();\n function appendFiles(files: File[]) {\n const newFiles = files.map((file) => ({\n file,\n id: v4(),\n status: 'pending' as const,\n progress: 0,\n }));\n\n setFiles((prev) => [...prev, ...newFiles]);\n newFiles.forEach(uploadFile);\n }\n\n function updateFileById(id: string, update: Partial<FileWithProgress>) {\n setFiles((prev) =>\n prev.map((f) => (f.id === id ? { ...f, ...update } : f)),\n );\n }\n\n function removeFileById(id: string) {\n setFiles((prev) => prev.filter((f) => f.id !== id));\n }\n\n const uploadFile = async (fileItem: FileWithProgress) => {\n const controller = new AbortController();\n uploadAbortControllers.set(fileItem.id, controller);\n\n try {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === fileItem.id ? { ...f, status: 'uploading', progress: 0 } : f,\n ),\n );\n\n const response = await api.uploadFile({\n file: fileItem.file,\n abortSignal: controller.signal,\n onProgress: (percentage) => {\n updateFileById(fileItem.id, { progress: percentage });\n },\n });\n\n updateFileById(fileItem.id, {\n status: 'success',\n fileUrl: response.fileUrl,\n progress: 100,\n });\n } catch (error) {\n if (!controller.signal.aborted) {\n updateFileById(fileItem.id, {\n status: 'error',\n error: error instanceof Error ? error.message : 'Upload failed',\n progress: 0,\n });\n }\n } finally {\n uploadAbortControllers.delete(fileItem.id);\n }\n };\n\n const handleCancelUpload = (fileId: string) => {\n const controller = uploadAbortControllers.get(fileId);\n if (controller) {\n controller.abort();\n uploadAbortControllers.delete(fileId);\n }\n removeFileById(fileId);\n };\n\n const successFiles = useMemo(() => {\n return files.filter((f) => f.status === 'success' && f.fileUrl);\n }, [files]);\n\n function emptyTheFiles() {\n uploadAbortControllers.forEach((controller) => controller.abort());\n uploadAbortControllers.clear();\n setFiles([]);\n }\n\n useEffect(() => {\n return () => {\n uploadAbortControllers.forEach((controller) => controller.abort());\n uploadAbortControllers.clear();\n };\n }, []);\n\n return {\n allFiles: files,\n appendFiles,\n handleCancelUpload,\n successFiles,\n emptyTheFiles,\n getFileById: (id: string) => files.find((f) => f.id === id),\n getUploadProgress: (id: string) =>\n files.find((f) => f.id === id)?.progress ?? 0,\n getUploadStatus: (id: string) => files.find((f) => f.id === id)?.status,\n hasErrors: files.some((f) => f.status === 'error'),\n isUploading: files.some((f) => f.status === 'uploading'),\n };\n}\n\nexport { useUploadFiles, type FileWithProgress };\n","import React, {\n createContext,\n useContext,\n useEffect,\n useState,\n type Dispatch,\n type ReactNode,\n type SetStateAction,\n} from 'react';\nimport { useConfig } from './useConfig';\n\ntype WidgetTriggerCtx = {\n isOpen: boolean;\n setIsOpen: Dispatch<SetStateAction<boolean>>;\n};\n\nconst context = createContext<WidgetTriggerCtx | null>(null);\n\nexport function WidgetTriggerProvider({ children }: { children: ReactNode }) {\n const config = useConfig();\n const [isOpen, setIsOpen] = useState(config.isOpen ?? false);\n\n useEffect(() => {\n setIsOpen((prev) => config.isOpen ?? prev);\n }, [config.isOpen]);\n\n useEffect(() => {\n const openAfterNSeconds = config.openAfterNSeconds;\n if (typeof openAfterNSeconds !== 'number' || isNaN(openAfterNSeconds))\n return;\n\n const timeout = setTimeout(() => setIsOpen(true), openAfterNSeconds * 1000);\n\n return () => clearTimeout(timeout);\n }, [config.openAfterNSeconds]);\n\n return (\n <context.Provider value={{ isOpen, setIsOpen }}>\n {children}\n </context.Provider>\n );\n}\n\nexport function useWidgetTrigger() {\n const ctx = useContext(context);\n if (!ctx) {\n throw new Error(\n 'useWidgetTrigger must be used within a WidgetTriggerProvider',\n );\n }\n return ctx;\n}\n","import { useWidget } from '../WidgetProvider';\nimport { useConfig } from './useConfig';\nimport { useSessions } from './useSessions';\n\nexport function useModes() {\n const { widgetCtx } = useWidget();\n const { modesComponents } = useConfig();\n const { sessionState } = useSessions();\n\n const modes = widgetCtx.modes;\n const activeModeId = sessionState.session?.modeId;\n const activeMode = modes.find((mode) => mode.id === activeModeId);\n\n const Component = modesComponents?.find((modeComponent) =>\n [\n activeMode?.id || '',\n activeMode?.name?.toLowerCase() || '',\n activeMode?.slug?.toLowerCase() || '',\n ].includes(modeComponent.key.toLowerCase()),\n )?.component;\n\n return {\n modes,\n modesComponents,\n activeModeId,\n activeMode,\n Component,\n };\n}\n"],"names":["ComponentRegistry","opts","components","c","component","index","key","_a","context","createContext","WidgetProvider","config","children","storage","loadingComponent","contentIframeRef","useRef","didInitialize","widgetCtx","setWidgetCtx","useState","componentStore","useMemo","useEffect","WidgetCtx","jsx","version","useWidget","ctx","useContext","useConfig","usePrimitiveState","p","useSyncExternalStore","useContact","useMessages","useSessions","oneOpenSessionAllowed","sessionState","sessionsState","openSessions","closedSessions","s","canCreateNewSession","useIsAwaitingBotReply","messagesState","isSessionAssignedToAI","lastMessage","isLastMessageAUserMessage","usePreludeData","useSWR","useWidgetRouter","uploadAbortControllers","useUploadFiles","files","setFiles","api","appendFiles","newFiles","file","v4","prev","uploadFile","updateFileById","id","update","removeFileById","f","fileItem","controller","response","percentage","error","handleCancelUpload","fileId","successFiles","emptyTheFiles","WidgetTriggerProvider","isOpen","setIsOpen","openAfterNSeconds","timeout","useWidgetTrigger","useModes","modesComponents","modes","activeModeId","activeMode","mode","Component","_b","modeComponent"],"mappings":"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"}
1
+ {"version":3,"file":"useModes-B5-vdm1q.js","sources":["../src/headless/react/ComponentRegistry.ts","../src/headless/react/WidgetProvider.tsx","../src/headless/react/hooks/useConfig.ts","../src/headless/react/hooks/usePrimitiveState.ts","../src/headless/react/hooks/useContact.ts","../src/headless/react/hooks/useMessages.ts","../src/headless/react/hooks/useSessions.ts","../src/headless/react/hooks/useIsAwaitingBotReply.ts","../src/headless/react/hooks/usePreludeData.ts","../src/headless/react/hooks/useWidgetRouter.ts","../src/headless/react/hooks/useUploadFiles.ts","../src/headless/react/hooks/useWidgetTrigger.tsx","../src/headless/react/hooks/useModes.ts"],"sourcesContent":["import type { WidgetComponentKey } from '../core';\nimport type { WidgetComponentType } from './types/components';\n\nexport class ComponentRegistry {\n components: WidgetComponentType[] = [];\n\n constructor(opts: { components?: WidgetComponentType[] }) {\n const { components } = opts;\n\n if (components) {\n components.forEach((c) => this.register(c));\n }\n\n if (this.components.length === 0) {\n throw new Error('No components registered');\n }\n if (!this.get('fallback')) {\n throw new Error('No fallback component registered');\n }\n }\n\n // TODO test that this registers or replaces the component\n register(component: WidgetComponentType) {\n // Replace the key if it already exists\n const index = this.components.findIndex((c) => c.key === component.key);\n if (index !== -1) {\n this.components[index] = component;\n } else {\n this.components.push(component);\n }\n return this;\n }\n\n private get(key: WidgetComponentKey) {\n const c = this.components.find(\n (c) => c.key.toUpperCase() === key.toUpperCase(),\n );\n if (c) return c;\n return null;\n }\n\n public getComponent(key: string) {\n return this.get(key)?.component;\n }\n}\n","import React, {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { version } from '../../../package.json';\nimport { type ExternalStorage, type WidgetConfig, WidgetCtx } from '../core';\nimport { ComponentRegistry } from './ComponentRegistry';\nimport type { WidgetComponentType } from './types/components';\n\ninterface WidgetProviderValue {\n widgetCtx: WidgetCtx;\n config: WidgetConfig;\n components?: WidgetComponentType[];\n componentStore: ComponentRegistry;\n version: string;\n contentIframeRef?: React.MutableRefObject<HTMLIFrameElement | null>;\n}\n\nconst context = createContext<WidgetProviderValue | null>(null);\n\nexport function WidgetProvider({\n options: config,\n children,\n components,\n storage,\n loadingComponent,\n}: {\n options: WidgetConfig;\n children: React.ReactNode;\n components?: WidgetComponentType[];\n storage?: ExternalStorage;\n /**\n * Custom loading component while the widget is initializing\n * Not to be confused with the `loading` custom component which renders when the bot's reply is pending\n */\n loadingComponent?: React.ReactNode;\n}) {\n const contentIframeRef = useRef<HTMLIFrameElement | null>(null);\n\n const didInitialize = useRef(false);\n const [widgetCtx, setWidgetCtx] = useState<WidgetCtx | null>(null);\n\n const componentStore = useMemo(\n () =>\n new ComponentRegistry({\n components: components,\n }),\n [components],\n );\n\n useEffect(() => {\n if (didInitialize.current) return;\n didInitialize.current = true;\n\n WidgetCtx.initialize({ config, storage }).then(setWidgetCtx);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (!widgetCtx) {\n return loadingComponent || null;\n }\n\n return (\n <context.Provider\n value={{\n widgetCtx,\n config,\n components,\n componentStore,\n version,\n contentIframeRef,\n }}\n >\n {children}\n </context.Provider>\n );\n}\n\nexport function useWidget() {\n const ctx = useContext(context);\n if (!ctx) {\n throw new Error('useWidget must be used within a WidgetProvider');\n }\n return ctx;\n}\n","import { useWidget } from '../WidgetProvider';\n\nexport function useConfig() {\n const { config } = useWidget();\n\n return config;\n}\n","import { useSyncExternalStore } from 'react';\nimport type { PrimitiveState } from '../../core';\n\nexport function usePrimitiveState<T>(p: PrimitiveState<T>) {\n return useSyncExternalStore(p.subscribe, p.get, p.get);\n}\n","import { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\n\nexport function useContact() {\n const { widgetCtx } = useWidget();\n const contactState = usePrimitiveState(widgetCtx.contactCtx.state);\n\n return {\n contactState,\n createUnverifiedContact: widgetCtx.contactCtx.createUnverifiedContact,\n };\n}\n","import { usePrimitiveState } from './usePrimitiveState';\nimport { useWidget } from '../WidgetProvider';\n\nexport function useMessages() {\n const { widgetCtx } = useWidget();\n const messagesState = usePrimitiveState(widgetCtx.messageCtx.state);\n\n return { messagesState, sendMessage: widgetCtx.messageCtx.sendMessage };\n}\n","import { useMemo } from 'react';\nimport { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\nimport { useConfig } from './useConfig';\n\nexport function useSessions() {\n const { widgetCtx } = useWidget();\n const { oneOpenSessionAllowed } = useConfig();\n const sessionState = usePrimitiveState(widgetCtx.sessionCtx.sessionState);\n const sessionsState = usePrimitiveState(widgetCtx.sessionCtx.sessionsState);\n\n const { openSessions, closedSessions } = useMemo(() => {\n return {\n openSessions: sessionsState.data.filter((s) => s.isOpened === true),\n closedSessions: sessionsState.data.filter((s) => s.isOpened === false),\n };\n }, [sessionsState.data]);\n\n const canCreateNewSession = useMemo(() => {\n if (oneOpenSessionAllowed) {\n return openSessions.length === 0;\n }\n return true;\n }, [oneOpenSessionAllowed, openSessions.length]);\n\n return {\n sessionState,\n sessionsState,\n loadMoreSessions: widgetCtx.sessionCtx.loadMoreSessions,\n resolveSession: widgetCtx.sessionCtx.resolveSession,\n createStateCheckpoint: widgetCtx.sessionCtx.createStateCheckpoint,\n openSessions,\n closedSessions,\n canCreateNewSession,\n };\n}\n","import { useMessages } from './useMessages';\nimport { useSessions } from './useSessions';\n\nexport function useIsAwaitingBotReply() {\n const { sessionState } = useSessions();\n const { messagesState } = useMessages();\n\n const isSessionAssignedToAI = sessionState.session?.assignee.kind === 'ai';\n // This check is useful in cases where the user might navigate in and out of a chat, and `isSendingMessage` is reset back to its default value\n const lastMessage =\n messagesState.messages.length > 0\n ? messagesState.messages[messagesState.messages.length - 1]\n : null;\n const isLastMessageAUserMessage = lastMessage?.type === 'FROM_USER';\n\n const isAwaitingBotReply =\n (isSessionAssignedToAI || sessionState.isCreatingSession) &&\n (messagesState.isSendingMessage || isLastMessageAUserMessage);\n\n return { isAwaitingBotReply };\n}\n","import useSWR from 'swr';\nimport { useWidget } from '../WidgetProvider';\n\nfunction usePreludeData() {\n const { widgetCtx } = useWidget();\n\n // TODO remove swr dependency\n return useSWR([widgetCtx.config.token], widgetCtx.api.widgetPrelude, {\n revalidateOnFocus: false,\n });\n}\n\nexport { usePreludeData };\n","import { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\n\nexport function useWidgetRouter() {\n const { widgetCtx } = useWidget();\n\n const routerState = usePrimitiveState(widgetCtx.routerCtx.state);\n\n return {\n routerState,\n toSessionsScreen: widgetCtx.routerCtx.toSessionsScreen,\n toChatScreen: widgetCtx.routerCtx.toChatScreen,\n };\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport { useWidget } from '../WidgetProvider';\nimport { v4 } from 'uuid';\n\nconst uploadAbortControllers: Map<string, AbortController> = new Map();\n\ninterface FileWithProgress {\n status: 'pending' | 'uploading' | 'success' | 'error';\n id: string;\n file: File;\n fileUrl?: string;\n progress: number;\n error?: string;\n}\n\nfunction useUploadFiles() {\n const [files, setFiles] = useState<FileWithProgress[]>([]);\n const {\n widgetCtx: { api },\n } = useWidget();\n function appendFiles(files: File[]) {\n const newFiles = files.map((file) => ({\n file,\n id: v4(),\n status: 'pending' as const,\n progress: 0,\n }));\n\n setFiles((prev) => [...prev, ...newFiles]);\n newFiles.forEach(uploadFile);\n }\n\n function updateFileById(id: string, update: Partial<FileWithProgress>) {\n setFiles((prev) =>\n prev.map((f) => (f.id === id ? { ...f, ...update } : f)),\n );\n }\n\n function removeFileById(id: string) {\n setFiles((prev) => prev.filter((f) => f.id !== id));\n }\n\n const uploadFile = async (fileItem: FileWithProgress) => {\n const controller = new AbortController();\n uploadAbortControllers.set(fileItem.id, controller);\n\n try {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === fileItem.id ? { ...f, status: 'uploading', progress: 0 } : f,\n ),\n );\n\n const response = await api.uploadFile({\n file: fileItem.file,\n abortSignal: controller.signal,\n onProgress: (percentage) => {\n updateFileById(fileItem.id, { progress: percentage });\n },\n });\n\n updateFileById(fileItem.id, {\n status: 'success',\n fileUrl: response.fileUrl,\n progress: 100,\n });\n } catch (error) {\n if (!controller.signal.aborted) {\n updateFileById(fileItem.id, {\n status: 'error',\n error: error instanceof Error ? error.message : 'Upload failed',\n progress: 0,\n });\n }\n } finally {\n uploadAbortControllers.delete(fileItem.id);\n }\n };\n\n const handleCancelUpload = (fileId: string) => {\n const controller = uploadAbortControllers.get(fileId);\n if (controller) {\n controller.abort();\n uploadAbortControllers.delete(fileId);\n }\n removeFileById(fileId);\n };\n\n const successFiles = useMemo(() => {\n return files.filter((f) => f.status === 'success' && f.fileUrl);\n }, [files]);\n\n function emptyTheFiles() {\n uploadAbortControllers.forEach((controller) => controller.abort());\n uploadAbortControllers.clear();\n setFiles([]);\n }\n\n useEffect(() => {\n return () => {\n uploadAbortControllers.forEach((controller) => controller.abort());\n uploadAbortControllers.clear();\n };\n }, []);\n\n return {\n allFiles: files,\n appendFiles,\n handleCancelUpload,\n successFiles,\n emptyTheFiles,\n getFileById: (id: string) => files.find((f) => f.id === id),\n getUploadProgress: (id: string) =>\n files.find((f) => f.id === id)?.progress ?? 0,\n getUploadStatus: (id: string) => files.find((f) => f.id === id)?.status,\n hasErrors: files.some((f) => f.status === 'error'),\n isUploading: files.some((f) => f.status === 'uploading'),\n };\n}\n\nexport { useUploadFiles, type FileWithProgress };\n","import React, {\n createContext,\n useContext,\n useEffect,\n useState,\n type Dispatch,\n type ReactNode,\n type SetStateAction,\n} from 'react';\nimport { useConfig } from './useConfig';\n\ntype WidgetTriggerCtx = {\n isOpen: boolean;\n setIsOpen: Dispatch<SetStateAction<boolean>>;\n};\n\nconst context = createContext<WidgetTriggerCtx | null>(null);\n\nexport function WidgetTriggerProvider({ children }: { children: ReactNode }) {\n const config = useConfig();\n const [isOpen, setIsOpen] = useState(config.isOpen ?? false);\n\n useEffect(() => {\n setIsOpen((prev) => config.isOpen ?? prev);\n }, [config.isOpen]);\n\n useEffect(() => {\n const openAfterNSeconds = config.openAfterNSeconds;\n if (typeof openAfterNSeconds !== 'number' || isNaN(openAfterNSeconds))\n return;\n\n const timeout = setTimeout(() => setIsOpen(true), openAfterNSeconds * 1000);\n\n return () => clearTimeout(timeout);\n }, [config.openAfterNSeconds]);\n\n return (\n <context.Provider value={{ isOpen, setIsOpen }}>\n {children}\n </context.Provider>\n );\n}\n\nexport function useWidgetTrigger() {\n const ctx = useContext(context);\n if (!ctx) {\n throw new Error(\n 'useWidgetTrigger must be used within a WidgetTriggerProvider',\n );\n }\n return ctx;\n}\n","import { useWidget } from '../WidgetProvider';\nimport { useConfig } from './useConfig';\nimport { useSessions } from './useSessions';\n\nexport function useModes() {\n const { widgetCtx } = useWidget();\n const { modesComponents } = useConfig();\n const { sessionState } = useSessions();\n\n const modes = widgetCtx.modes;\n const activeModeId = sessionState.session?.modeId;\n const activeMode = modes.find((mode) => mode.id === activeModeId);\n\n const Component = modesComponents?.find((modeComponent) =>\n [\n activeMode?.id || '',\n activeMode?.name?.toLowerCase() || '',\n activeMode?.slug?.toLowerCase() || '',\n ].includes(modeComponent.key.toLowerCase()),\n )?.component;\n\n return {\n modes,\n modesComponents,\n activeModeId,\n activeMode,\n Component,\n };\n}\n"],"names":["ComponentRegistry","opts","components","c","component","index","key","_a","context","createContext","WidgetProvider","config","children","storage","loadingComponent","contentIframeRef","useRef","didInitialize","widgetCtx","setWidgetCtx","useState","componentStore","useMemo","useEffect","WidgetCtx","jsx","version","useWidget","ctx","useContext","useConfig","usePrimitiveState","p","useSyncExternalStore","useContact","useMessages","useSessions","oneOpenSessionAllowed","sessionState","sessionsState","openSessions","closedSessions","s","canCreateNewSession","useIsAwaitingBotReply","messagesState","isSessionAssignedToAI","lastMessage","isLastMessageAUserMessage","usePreludeData","useSWR","useWidgetRouter","uploadAbortControllers","useUploadFiles","files","setFiles","api","appendFiles","newFiles","file","v4","prev","uploadFile","updateFileById","id","update","removeFileById","f","fileItem","controller","response","percentage","error","handleCancelUpload","fileId","successFiles","emptyTheFiles","WidgetTriggerProvider","isOpen","setIsOpen","openAfterNSeconds","timeout","useWidgetTrigger","useModes","modesComponents","modes","activeModeId","activeMode","mode","Component","_b","modeComponent"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";const U=require("swr"),u=require("react"),F=require("uuid"),y=require("react/jsx-runtime"),P=require("./widget.ctx-CxQoP5qn.cjs"),R="3.0.93";class b{constructor(t){this.components=[];const{components:n}=t;if(n&&n.forEach(o=>this.register(o)),this.components.length===0)throw new Error("No components registered");if(!this.get("fallback"))throw new Error("No fallback component registered")}register(t){const n=this.components.findIndex(o=>o.key===t.key);return n!==-1?this.components[n]=t:this.components.push(t),this}get(t){const n=this.components.find(o=>o.key.toUpperCase()===t.toUpperCase());return n||null}getComponent(t){var n;return(n=this.get(t))==null?void 0:n.component}}const W=u.createContext(null);function A({options:e,children:t,components:n,storage:o,loadingComponent:i}){const c=u.useRef(null),d=u.useRef(!1),[l,C]=u.useState(null),p=u.useMemo(()=>new b({components:n}),[n]);return u.useEffect(()=>{d.current||(d.current=!0,P.WidgetCtx.initialize({config:e,storage:o}).then(C))},[]),l?y.jsx(W.Provider,{value:{widgetCtx:l,config:e,components:n,componentStore:p,version:R,contentIframeRef:c},children:t}):i||null}function g(){const e=u.useContext(W);if(!e)throw new Error("useWidget must be used within a WidgetProvider");return e}function x(){const{config:e}=g();return e}function m(e){return u.useSyncExternalStore(e.subscribe,e.get,e.get)}function M(){const{widgetCtx:e}=g();return{contactState:m(e.contactCtx.state),createUnverifiedContact:e.contactCtx.createUnverifiedContact}}function v(){const{widgetCtx:e}=g();return{messagesState:m(e.messageCtx.state),sendMessage:e.messageCtx.sendMessage}}function w(){const{widgetCtx:e}=g(),{oneOpenSessionAllowed:t}=x(),n=m(e.sessionCtx.sessionState),o=m(e.sessionCtx.sessionsState),{openSessions:i,closedSessions:c}=u.useMemo(()=>({openSessions:o.data.filter(l=>l.isOpened===!0),closedSessions:o.data.filter(l=>l.isOpened===!1)}),[o.data]),d=u.useMemo(()=>t?i.length===0:!0,[t,i.length]);return{sessionState:n,sessionsState:o,loadMoreSessions:e.sessionCtx.loadMoreSessions,resolveSession:e.sessionCtx.resolveSession,createStateCheckpoint:e.sessionCtx.createStateCheckpoint,openSessions:i,closedSessions:c,canCreateNewSession:d}}function k(){var d;const{sessionState:e}=w(),{messagesState:t}=v(),n=((d=e.session)==null?void 0:d.assignee.kind)==="ai",o=t.messages.length>0?t.messages[t.messages.length-1]:null,i=(o==null?void 0:o.type)==="FROM_USER";return{isAwaitingBotReply:(n||e.isCreatingSession)&&(t.isSendingMessage||i)}}function O(){const{widgetCtx:e}=g();return U([e.config.token],e.api.widgetPrelude,{revalidateOnFocus:!1})}function T(){const{widgetCtx:e}=g();return{routerState:m(e.routerCtx.state),toSessionsScreen:e.routerCtx.toSessionsScreen,toChatScreen:e.routerCtx.toChatScreen}}const f=new Map;function N(){const[e,t]=u.useState([]),{widgetCtx:{api:n}}=g();function o(s){const r=s.map(a=>({file:a,id:F.v4(),status:"pending",progress:0}));t(a=>[...a,...r]),r.forEach(d)}function i(s,r){t(a=>a.map(S=>S.id===s?{...S,...r}:S))}function c(s){t(r=>r.filter(a=>a.id!==s))}const d=async s=>{const r=new AbortController;f.set(s.id,r);try{t(S=>S.map(h=>h.id===s.id?{...h,status:"uploading",progress:0}:h));const a=await n.uploadFile({file:s.file,abortSignal:r.signal,onProgress:S=>{i(s.id,{progress:S})}});i(s.id,{status:"success",fileUrl:a.fileUrl,progress:100})}catch(a){r.signal.aborted||i(s.id,{status:"error",error:a instanceof Error?a.message:"Upload failed",progress:0})}finally{f.delete(s.id)}},l=s=>{const r=f.get(s);r&&(r.abort(),f.delete(s)),c(s)},C=u.useMemo(()=>e.filter(s=>s.status==="success"&&s.fileUrl),[e]);function p(){f.forEach(s=>s.abort()),f.clear(),t([])}return u.useEffect(()=>()=>{f.forEach(s=>s.abort()),f.clear()},[]),{allFiles:e,appendFiles:o,handleCancelUpload:l,successFiles:C,emptyTheFiles:p,getFileById:s=>e.find(r=>r.id===s),getUploadProgress:s=>{var r;return((r=e.find(a=>a.id===s))==null?void 0:r.progress)??0},getUploadStatus:s=>{var r;return(r=e.find(a=>a.id===s))==null?void 0:r.status},hasErrors:e.some(s=>s.status==="error"),isUploading:e.some(s=>s.status==="uploading")}}const E=u.createContext(null);function B({children:e}){const t=x(),[n,o]=u.useState(t.isOpen??!1);return u.useEffect(()=>{o(i=>t.isOpen??i)},[t.isOpen]),u.useEffect(()=>{const i=t.openAfterNSeconds;if(typeof i!="number"||isNaN(i))return;const c=setTimeout(()=>o(!0),i*1e3);return()=>clearTimeout(c)},[t.openAfterNSeconds]),y.jsx(E.Provider,{value:{isOpen:n,setIsOpen:o},children:e})}function q(){const e=u.useContext(E);if(!e)throw new Error("useWidgetTrigger must be used within a WidgetTriggerProvider");return e}function I(){var l,C;const{widgetCtx:e}=g(),{modesComponents:t}=x(),{sessionState:n}=w(),o=e.modes,i=(l=n.session)==null?void 0:l.modeId,c=o.find(p=>p.id===i),d=(C=t==null?void 0:t.find(p=>{var s,r;return[(c==null?void 0:c.id)||"",((s=c==null?void 0:c.name)==null?void 0:s.toLowerCase())||"",((r=c==null?void 0:c.slug)==null?void 0:r.toLowerCase())||""].includes(p.key.toLowerCase())}))==null?void 0:C.component;return{modes:o,modesComponents:t,activeModeId:i,activeMode:c,Component:d}}exports.WidgetProvider=A;exports.WidgetTriggerProvider=B;exports.useConfig=x;exports.useContact=M;exports.useIsAwaitingBotReply=k;exports.useMessages=v;exports.useModes=I;exports.usePreludeData=O;exports.usePrimitiveState=m;exports.useSessions=w;exports.useUploadFiles=N;exports.useWidget=g;exports.useWidgetRouter=T;exports.useWidgetTrigger=q;
2
- //# sourceMappingURL=useModes-C_mX92ur.cjs.map
1
+ "use strict";const U=require("swr"),u=require("react"),F=require("uuid"),y=require("react/jsx-runtime"),P=require("./widget.ctx-B-9oCDpY.cjs"),R="3.0.94";class b{constructor(t){this.components=[];const{components:n}=t;if(n&&n.forEach(o=>this.register(o)),this.components.length===0)throw new Error("No components registered");if(!this.get("fallback"))throw new Error("No fallback component registered")}register(t){const n=this.components.findIndex(o=>o.key===t.key);return n!==-1?this.components[n]=t:this.components.push(t),this}get(t){const n=this.components.find(o=>o.key.toUpperCase()===t.toUpperCase());return n||null}getComponent(t){var n;return(n=this.get(t))==null?void 0:n.component}}const W=u.createContext(null);function A({options:e,children:t,components:n,storage:o,loadingComponent:i}){const c=u.useRef(null),d=u.useRef(!1),[l,C]=u.useState(null),p=u.useMemo(()=>new b({components:n}),[n]);return u.useEffect(()=>{d.current||(d.current=!0,P.WidgetCtx.initialize({config:e,storage:o}).then(C))},[]),l?y.jsx(W.Provider,{value:{widgetCtx:l,config:e,components:n,componentStore:p,version:R,contentIframeRef:c},children:t}):i||null}function g(){const e=u.useContext(W);if(!e)throw new Error("useWidget must be used within a WidgetProvider");return e}function x(){const{config:e}=g();return e}function m(e){return u.useSyncExternalStore(e.subscribe,e.get,e.get)}function M(){const{widgetCtx:e}=g();return{contactState:m(e.contactCtx.state),createUnverifiedContact:e.contactCtx.createUnverifiedContact}}function v(){const{widgetCtx:e}=g();return{messagesState:m(e.messageCtx.state),sendMessage:e.messageCtx.sendMessage}}function w(){const{widgetCtx:e}=g(),{oneOpenSessionAllowed:t}=x(),n=m(e.sessionCtx.sessionState),o=m(e.sessionCtx.sessionsState),{openSessions:i,closedSessions:c}=u.useMemo(()=>({openSessions:o.data.filter(l=>l.isOpened===!0),closedSessions:o.data.filter(l=>l.isOpened===!1)}),[o.data]),d=u.useMemo(()=>t?i.length===0:!0,[t,i.length]);return{sessionState:n,sessionsState:o,loadMoreSessions:e.sessionCtx.loadMoreSessions,resolveSession:e.sessionCtx.resolveSession,createStateCheckpoint:e.sessionCtx.createStateCheckpoint,openSessions:i,closedSessions:c,canCreateNewSession:d}}function k(){var d;const{sessionState:e}=w(),{messagesState:t}=v(),n=((d=e.session)==null?void 0:d.assignee.kind)==="ai",o=t.messages.length>0?t.messages[t.messages.length-1]:null,i=(o==null?void 0:o.type)==="FROM_USER";return{isAwaitingBotReply:(n||e.isCreatingSession)&&(t.isSendingMessage||i)}}function O(){const{widgetCtx:e}=g();return U([e.config.token],e.api.widgetPrelude,{revalidateOnFocus:!1})}function T(){const{widgetCtx:e}=g();return{routerState:m(e.routerCtx.state),toSessionsScreen:e.routerCtx.toSessionsScreen,toChatScreen:e.routerCtx.toChatScreen}}const f=new Map;function N(){const[e,t]=u.useState([]),{widgetCtx:{api:n}}=g();function o(s){const r=s.map(a=>({file:a,id:F.v4(),status:"pending",progress:0}));t(a=>[...a,...r]),r.forEach(d)}function i(s,r){t(a=>a.map(S=>S.id===s?{...S,...r}:S))}function c(s){t(r=>r.filter(a=>a.id!==s))}const d=async s=>{const r=new AbortController;f.set(s.id,r);try{t(S=>S.map(h=>h.id===s.id?{...h,status:"uploading",progress:0}:h));const a=await n.uploadFile({file:s.file,abortSignal:r.signal,onProgress:S=>{i(s.id,{progress:S})}});i(s.id,{status:"success",fileUrl:a.fileUrl,progress:100})}catch(a){r.signal.aborted||i(s.id,{status:"error",error:a instanceof Error?a.message:"Upload failed",progress:0})}finally{f.delete(s.id)}},l=s=>{const r=f.get(s);r&&(r.abort(),f.delete(s)),c(s)},C=u.useMemo(()=>e.filter(s=>s.status==="success"&&s.fileUrl),[e]);function p(){f.forEach(s=>s.abort()),f.clear(),t([])}return u.useEffect(()=>()=>{f.forEach(s=>s.abort()),f.clear()},[]),{allFiles:e,appendFiles:o,handleCancelUpload:l,successFiles:C,emptyTheFiles:p,getFileById:s=>e.find(r=>r.id===s),getUploadProgress:s=>{var r;return((r=e.find(a=>a.id===s))==null?void 0:r.progress)??0},getUploadStatus:s=>{var r;return(r=e.find(a=>a.id===s))==null?void 0:r.status},hasErrors:e.some(s=>s.status==="error"),isUploading:e.some(s=>s.status==="uploading")}}const E=u.createContext(null);function B({children:e}){const t=x(),[n,o]=u.useState(t.isOpen??!1);return u.useEffect(()=>{o(i=>t.isOpen??i)},[t.isOpen]),u.useEffect(()=>{const i=t.openAfterNSeconds;if(typeof i!="number"||isNaN(i))return;const c=setTimeout(()=>o(!0),i*1e3);return()=>clearTimeout(c)},[t.openAfterNSeconds]),y.jsx(E.Provider,{value:{isOpen:n,setIsOpen:o},children:e})}function q(){const e=u.useContext(E);if(!e)throw new Error("useWidgetTrigger must be used within a WidgetTriggerProvider");return e}function I(){var l,C;const{widgetCtx:e}=g(),{modesComponents:t}=x(),{sessionState:n}=w(),o=e.modes,i=(l=n.session)==null?void 0:l.modeId,c=o.find(p=>p.id===i),d=(C=t==null?void 0:t.find(p=>{var s,r;return[(c==null?void 0:c.id)||"",((s=c==null?void 0:c.name)==null?void 0:s.toLowerCase())||"",((r=c==null?void 0:c.slug)==null?void 0:r.toLowerCase())||""].includes(p.key.toLowerCase())}))==null?void 0:C.component;return{modes:o,modesComponents:t,activeModeId:i,activeMode:c,Component:d}}exports.WidgetProvider=A;exports.WidgetTriggerProvider=B;exports.useConfig=x;exports.useContact=M;exports.useIsAwaitingBotReply=k;exports.useMessages=v;exports.useModes=I;exports.usePreludeData=O;exports.usePrimitiveState=m;exports.useSessions=w;exports.useUploadFiles=N;exports.useWidget=g;exports.useWidgetRouter=T;exports.useWidgetTrigger=q;
2
+ //# sourceMappingURL=useModes-BzcZkifa.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useModes-C_mX92ur.cjs","sources":["../src/headless/react/ComponentRegistry.ts","../src/headless/react/WidgetProvider.tsx","../src/headless/react/hooks/useConfig.ts","../src/headless/react/hooks/usePrimitiveState.ts","../src/headless/react/hooks/useContact.ts","../src/headless/react/hooks/useMessages.ts","../src/headless/react/hooks/useSessions.ts","../src/headless/react/hooks/useIsAwaitingBotReply.ts","../src/headless/react/hooks/usePreludeData.ts","../src/headless/react/hooks/useWidgetRouter.ts","../src/headless/react/hooks/useUploadFiles.ts","../src/headless/react/hooks/useWidgetTrigger.tsx","../src/headless/react/hooks/useModes.ts"],"sourcesContent":["import type { WidgetComponentKey } from '../core';\nimport type { WidgetComponentType } from './types/components';\n\nexport class ComponentRegistry {\n components: WidgetComponentType[] = [];\n\n constructor(opts: { components?: WidgetComponentType[] }) {\n const { components } = opts;\n\n if (components) {\n components.forEach((c) => this.register(c));\n }\n\n if (this.components.length === 0) {\n throw new Error('No components registered');\n }\n if (!this.get('fallback')) {\n throw new Error('No fallback component registered');\n }\n }\n\n // TODO test that this registers or replaces the component\n register(component: WidgetComponentType) {\n // Replace the key if it already exists\n const index = this.components.findIndex((c) => c.key === component.key);\n if (index !== -1) {\n this.components[index] = component;\n } else {\n this.components.push(component);\n }\n return this;\n }\n\n private get(key: WidgetComponentKey) {\n const c = this.components.find(\n (c) => c.key.toUpperCase() === key.toUpperCase(),\n );\n if (c) return c;\n return null;\n }\n\n public getComponent(key: string) {\n return this.get(key)?.component;\n }\n}\n","import React, {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { version } from '../../../package.json';\nimport { type ExternalStorage, type WidgetConfig, WidgetCtx } from '../core';\nimport { ComponentRegistry } from './ComponentRegistry';\nimport type { WidgetComponentType } from './types/components';\n\ninterface WidgetProviderValue {\n widgetCtx: WidgetCtx;\n config: WidgetConfig;\n components?: WidgetComponentType[];\n componentStore: ComponentRegistry;\n version: string;\n contentIframeRef?: React.MutableRefObject<HTMLIFrameElement | null>;\n}\n\nconst context = createContext<WidgetProviderValue | null>(null);\n\nexport function WidgetProvider({\n options: config,\n children,\n components,\n storage,\n loadingComponent,\n}: {\n options: WidgetConfig;\n children: React.ReactNode;\n components?: WidgetComponentType[];\n storage?: ExternalStorage;\n /**\n * Custom loading component while the widget is initializing\n * Not to be confused with the `loading` custom component which renders when the bot's reply is pending\n */\n loadingComponent?: React.ReactNode;\n}) {\n const contentIframeRef = useRef<HTMLIFrameElement | null>(null);\n\n const didInitialize = useRef(false);\n const [widgetCtx, setWidgetCtx] = useState<WidgetCtx | null>(null);\n\n const componentStore = useMemo(\n () =>\n new ComponentRegistry({\n components: components,\n }),\n [components],\n );\n\n useEffect(() => {\n if (didInitialize.current) return;\n didInitialize.current = true;\n\n WidgetCtx.initialize({ config, storage }).then(setWidgetCtx);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (!widgetCtx) {\n return loadingComponent || null;\n }\n\n return (\n <context.Provider\n value={{\n widgetCtx,\n config,\n components,\n componentStore,\n version,\n contentIframeRef,\n }}\n >\n {children}\n </context.Provider>\n );\n}\n\nexport function useWidget() {\n const ctx = useContext(context);\n if (!ctx) {\n throw new Error('useWidget must be used within a WidgetProvider');\n }\n return ctx;\n}\n","import { useWidget } from '../WidgetProvider';\n\nexport function useConfig() {\n const { config } = useWidget();\n\n return config;\n}\n","import { useSyncExternalStore } from 'react';\nimport type { PrimitiveState } from '../../core';\n\nexport function usePrimitiveState<T>(p: PrimitiveState<T>) {\n return useSyncExternalStore(p.subscribe, p.get, p.get);\n}\n","import { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\n\nexport function useContact() {\n const { widgetCtx } = useWidget();\n const contactState = usePrimitiveState(widgetCtx.contactCtx.state);\n\n return {\n contactState,\n createUnverifiedContact: widgetCtx.contactCtx.createUnverifiedContact,\n };\n}\n","import { usePrimitiveState } from './usePrimitiveState';\nimport { useWidget } from '../WidgetProvider';\n\nexport function useMessages() {\n const { widgetCtx } = useWidget();\n const messagesState = usePrimitiveState(widgetCtx.messageCtx.state);\n\n return { messagesState, sendMessage: widgetCtx.messageCtx.sendMessage };\n}\n","import { useMemo } from 'react';\nimport { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\nimport { useConfig } from './useConfig';\n\nexport function useSessions() {\n const { widgetCtx } = useWidget();\n const { oneOpenSessionAllowed } = useConfig();\n const sessionState = usePrimitiveState(widgetCtx.sessionCtx.sessionState);\n const sessionsState = usePrimitiveState(widgetCtx.sessionCtx.sessionsState);\n\n const { openSessions, closedSessions } = useMemo(() => {\n return {\n openSessions: sessionsState.data.filter((s) => s.isOpened === true),\n closedSessions: sessionsState.data.filter((s) => s.isOpened === false),\n };\n }, [sessionsState.data]);\n\n const canCreateNewSession = useMemo(() => {\n if (oneOpenSessionAllowed) {\n return openSessions.length === 0;\n }\n return true;\n }, [oneOpenSessionAllowed, openSessions.length]);\n\n return {\n sessionState,\n sessionsState,\n loadMoreSessions: widgetCtx.sessionCtx.loadMoreSessions,\n resolveSession: widgetCtx.sessionCtx.resolveSession,\n createStateCheckpoint: widgetCtx.sessionCtx.createStateCheckpoint,\n openSessions,\n closedSessions,\n canCreateNewSession,\n };\n}\n","import { useMessages } from './useMessages';\nimport { useSessions } from './useSessions';\n\nexport function useIsAwaitingBotReply() {\n const { sessionState } = useSessions();\n const { messagesState } = useMessages();\n\n const isSessionAssignedToAI = sessionState.session?.assignee.kind === 'ai';\n // This check is useful in cases where the user might navigate in and out of a chat, and `isSendingMessage` is reset back to its default value\n const lastMessage =\n messagesState.messages.length > 0\n ? messagesState.messages[messagesState.messages.length - 1]\n : null;\n const isLastMessageAUserMessage = lastMessage?.type === 'FROM_USER';\n\n const isAwaitingBotReply =\n (isSessionAssignedToAI || sessionState.isCreatingSession) &&\n (messagesState.isSendingMessage || isLastMessageAUserMessage);\n\n return { isAwaitingBotReply };\n}\n","import useSWR from 'swr';\nimport { useWidget } from '../WidgetProvider';\n\nfunction usePreludeData() {\n const { widgetCtx } = useWidget();\n\n // TODO remove swr dependency\n return useSWR([widgetCtx.config.token], widgetCtx.api.widgetPrelude, {\n revalidateOnFocus: false,\n });\n}\n\nexport { usePreludeData };\n","import { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\n\nexport function useWidgetRouter() {\n const { widgetCtx } = useWidget();\n\n const routerState = usePrimitiveState(widgetCtx.routerCtx.state);\n\n return {\n routerState,\n toSessionsScreen: widgetCtx.routerCtx.toSessionsScreen,\n toChatScreen: widgetCtx.routerCtx.toChatScreen,\n };\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport { useWidget } from '../WidgetProvider';\nimport { v4 } from 'uuid';\n\nconst uploadAbortControllers: Map<string, AbortController> = new Map();\n\ninterface FileWithProgress {\n status: 'pending' | 'uploading' | 'success' | 'error';\n id: string;\n file: File;\n fileUrl?: string;\n progress: number;\n error?: string;\n}\n\nfunction useUploadFiles() {\n const [files, setFiles] = useState<FileWithProgress[]>([]);\n const {\n widgetCtx: { api },\n } = useWidget();\n function appendFiles(files: File[]) {\n const newFiles = files.map((file) => ({\n file,\n id: v4(),\n status: 'pending' as const,\n progress: 0,\n }));\n\n setFiles((prev) => [...prev, ...newFiles]);\n newFiles.forEach(uploadFile);\n }\n\n function updateFileById(id: string, update: Partial<FileWithProgress>) {\n setFiles((prev) =>\n prev.map((f) => (f.id === id ? { ...f, ...update } : f)),\n );\n }\n\n function removeFileById(id: string) {\n setFiles((prev) => prev.filter((f) => f.id !== id));\n }\n\n const uploadFile = async (fileItem: FileWithProgress) => {\n const controller = new AbortController();\n uploadAbortControllers.set(fileItem.id, controller);\n\n try {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === fileItem.id ? { ...f, status: 'uploading', progress: 0 } : f,\n ),\n );\n\n const response = await api.uploadFile({\n file: fileItem.file,\n abortSignal: controller.signal,\n onProgress: (percentage) => {\n updateFileById(fileItem.id, { progress: percentage });\n },\n });\n\n updateFileById(fileItem.id, {\n status: 'success',\n fileUrl: response.fileUrl,\n progress: 100,\n });\n } catch (error) {\n if (!controller.signal.aborted) {\n updateFileById(fileItem.id, {\n status: 'error',\n error: error instanceof Error ? error.message : 'Upload failed',\n progress: 0,\n });\n }\n } finally {\n uploadAbortControllers.delete(fileItem.id);\n }\n };\n\n const handleCancelUpload = (fileId: string) => {\n const controller = uploadAbortControllers.get(fileId);\n if (controller) {\n controller.abort();\n uploadAbortControllers.delete(fileId);\n }\n removeFileById(fileId);\n };\n\n const successFiles = useMemo(() => {\n return files.filter((f) => f.status === 'success' && f.fileUrl);\n }, [files]);\n\n function emptyTheFiles() {\n uploadAbortControllers.forEach((controller) => controller.abort());\n uploadAbortControllers.clear();\n setFiles([]);\n }\n\n useEffect(() => {\n return () => {\n uploadAbortControllers.forEach((controller) => controller.abort());\n uploadAbortControllers.clear();\n };\n }, []);\n\n return {\n allFiles: files,\n appendFiles,\n handleCancelUpload,\n successFiles,\n emptyTheFiles,\n getFileById: (id: string) => files.find((f) => f.id === id),\n getUploadProgress: (id: string) =>\n files.find((f) => f.id === id)?.progress ?? 0,\n getUploadStatus: (id: string) => files.find((f) => f.id === id)?.status,\n hasErrors: files.some((f) => f.status === 'error'),\n isUploading: files.some((f) => f.status === 'uploading'),\n };\n}\n\nexport { useUploadFiles, type FileWithProgress };\n","import React, {\n createContext,\n useContext,\n useEffect,\n useState,\n type Dispatch,\n type ReactNode,\n type SetStateAction,\n} from 'react';\nimport { useConfig } from './useConfig';\n\ntype WidgetTriggerCtx = {\n isOpen: boolean;\n setIsOpen: Dispatch<SetStateAction<boolean>>;\n};\n\nconst context = createContext<WidgetTriggerCtx | null>(null);\n\nexport function WidgetTriggerProvider({ children }: { children: ReactNode }) {\n const config = useConfig();\n const [isOpen, setIsOpen] = useState(config.isOpen ?? false);\n\n useEffect(() => {\n setIsOpen((prev) => config.isOpen ?? prev);\n }, [config.isOpen]);\n\n useEffect(() => {\n const openAfterNSeconds = config.openAfterNSeconds;\n if (typeof openAfterNSeconds !== 'number' || isNaN(openAfterNSeconds))\n return;\n\n const timeout = setTimeout(() => setIsOpen(true), openAfterNSeconds * 1000);\n\n return () => clearTimeout(timeout);\n }, [config.openAfterNSeconds]);\n\n return (\n <context.Provider value={{ isOpen, setIsOpen }}>\n {children}\n </context.Provider>\n );\n}\n\nexport function useWidgetTrigger() {\n const ctx = useContext(context);\n if (!ctx) {\n throw new Error(\n 'useWidgetTrigger must be used within a WidgetTriggerProvider',\n );\n }\n return ctx;\n}\n","import { useWidget } from '../WidgetProvider';\nimport { useConfig } from './useConfig';\nimport { useSessions } from './useSessions';\n\nexport function useModes() {\n const { widgetCtx } = useWidget();\n const { modesComponents } = useConfig();\n const { sessionState } = useSessions();\n\n const modes = widgetCtx.modes;\n const activeModeId = sessionState.session?.modeId;\n const activeMode = modes.find((mode) => mode.id === activeModeId);\n\n const Component = modesComponents?.find((modeComponent) =>\n [\n activeMode?.id || '',\n activeMode?.name?.toLowerCase() || '',\n activeMode?.slug?.toLowerCase() || '',\n ].includes(modeComponent.key.toLowerCase()),\n )?.component;\n\n return {\n modes,\n modesComponents,\n activeModeId,\n activeMode,\n Component,\n };\n}\n"],"names":["ComponentRegistry","opts","components","c","component","index","key","_a","context","createContext","WidgetProvider","config","children","storage","loadingComponent","contentIframeRef","useRef","didInitialize","widgetCtx","setWidgetCtx","useState","componentStore","useMemo","useEffect","WidgetCtx","jsx","version","useWidget","ctx","useContext","useConfig","usePrimitiveState","p","useSyncExternalStore","useContact","useMessages","useSessions","oneOpenSessionAllowed","sessionState","sessionsState","openSessions","closedSessions","s","canCreateNewSession","useIsAwaitingBotReply","messagesState","isSessionAssignedToAI","lastMessage","isLastMessageAUserMessage","usePreludeData","useSWR","useWidgetRouter","uploadAbortControllers","useUploadFiles","files","setFiles","api","appendFiles","newFiles","file","v4","prev","uploadFile","updateFileById","id","update","f","removeFileById","fileItem","controller","response","percentage","error","handleCancelUpload","fileId","successFiles","emptyTheFiles","WidgetTriggerProvider","isOpen","setIsOpen","openAfterNSeconds","timeout","useWidgetTrigger","useModes","modesComponents","modes","activeModeId","activeMode","mode","Component","_b","modeComponent"],"mappings":"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"}
1
+ {"version":3,"file":"useModes-BzcZkifa.cjs","sources":["../src/headless/react/ComponentRegistry.ts","../src/headless/react/WidgetProvider.tsx","../src/headless/react/hooks/useConfig.ts","../src/headless/react/hooks/usePrimitiveState.ts","../src/headless/react/hooks/useContact.ts","../src/headless/react/hooks/useMessages.ts","../src/headless/react/hooks/useSessions.ts","../src/headless/react/hooks/useIsAwaitingBotReply.ts","../src/headless/react/hooks/usePreludeData.ts","../src/headless/react/hooks/useWidgetRouter.ts","../src/headless/react/hooks/useUploadFiles.ts","../src/headless/react/hooks/useWidgetTrigger.tsx","../src/headless/react/hooks/useModes.ts"],"sourcesContent":["import type { WidgetComponentKey } from '../core';\nimport type { WidgetComponentType } from './types/components';\n\nexport class ComponentRegistry {\n components: WidgetComponentType[] = [];\n\n constructor(opts: { components?: WidgetComponentType[] }) {\n const { components } = opts;\n\n if (components) {\n components.forEach((c) => this.register(c));\n }\n\n if (this.components.length === 0) {\n throw new Error('No components registered');\n }\n if (!this.get('fallback')) {\n throw new Error('No fallback component registered');\n }\n }\n\n // TODO test that this registers or replaces the component\n register(component: WidgetComponentType) {\n // Replace the key if it already exists\n const index = this.components.findIndex((c) => c.key === component.key);\n if (index !== -1) {\n this.components[index] = component;\n } else {\n this.components.push(component);\n }\n return this;\n }\n\n private get(key: WidgetComponentKey) {\n const c = this.components.find(\n (c) => c.key.toUpperCase() === key.toUpperCase(),\n );\n if (c) return c;\n return null;\n }\n\n public getComponent(key: string) {\n return this.get(key)?.component;\n }\n}\n","import React, {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { version } from '../../../package.json';\nimport { type ExternalStorage, type WidgetConfig, WidgetCtx } from '../core';\nimport { ComponentRegistry } from './ComponentRegistry';\nimport type { WidgetComponentType } from './types/components';\n\ninterface WidgetProviderValue {\n widgetCtx: WidgetCtx;\n config: WidgetConfig;\n components?: WidgetComponentType[];\n componentStore: ComponentRegistry;\n version: string;\n contentIframeRef?: React.MutableRefObject<HTMLIFrameElement | null>;\n}\n\nconst context = createContext<WidgetProviderValue | null>(null);\n\nexport function WidgetProvider({\n options: config,\n children,\n components,\n storage,\n loadingComponent,\n}: {\n options: WidgetConfig;\n children: React.ReactNode;\n components?: WidgetComponentType[];\n storage?: ExternalStorage;\n /**\n * Custom loading component while the widget is initializing\n * Not to be confused with the `loading` custom component which renders when the bot's reply is pending\n */\n loadingComponent?: React.ReactNode;\n}) {\n const contentIframeRef = useRef<HTMLIFrameElement | null>(null);\n\n const didInitialize = useRef(false);\n const [widgetCtx, setWidgetCtx] = useState<WidgetCtx | null>(null);\n\n const componentStore = useMemo(\n () =>\n new ComponentRegistry({\n components: components,\n }),\n [components],\n );\n\n useEffect(() => {\n if (didInitialize.current) return;\n didInitialize.current = true;\n\n WidgetCtx.initialize({ config, storage }).then(setWidgetCtx);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n if (!widgetCtx) {\n return loadingComponent || null;\n }\n\n return (\n <context.Provider\n value={{\n widgetCtx,\n config,\n components,\n componentStore,\n version,\n contentIframeRef,\n }}\n >\n {children}\n </context.Provider>\n );\n}\n\nexport function useWidget() {\n const ctx = useContext(context);\n if (!ctx) {\n throw new Error('useWidget must be used within a WidgetProvider');\n }\n return ctx;\n}\n","import { useWidget } from '../WidgetProvider';\n\nexport function useConfig() {\n const { config } = useWidget();\n\n return config;\n}\n","import { useSyncExternalStore } from 'react';\nimport type { PrimitiveState } from '../../core';\n\nexport function usePrimitiveState<T>(p: PrimitiveState<T>) {\n return useSyncExternalStore(p.subscribe, p.get, p.get);\n}\n","import { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\n\nexport function useContact() {\n const { widgetCtx } = useWidget();\n const contactState = usePrimitiveState(widgetCtx.contactCtx.state);\n\n return {\n contactState,\n createUnverifiedContact: widgetCtx.contactCtx.createUnverifiedContact,\n };\n}\n","import { usePrimitiveState } from './usePrimitiveState';\nimport { useWidget } from '../WidgetProvider';\n\nexport function useMessages() {\n const { widgetCtx } = useWidget();\n const messagesState = usePrimitiveState(widgetCtx.messageCtx.state);\n\n return { messagesState, sendMessage: widgetCtx.messageCtx.sendMessage };\n}\n","import { useMemo } from 'react';\nimport { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\nimport { useConfig } from './useConfig';\n\nexport function useSessions() {\n const { widgetCtx } = useWidget();\n const { oneOpenSessionAllowed } = useConfig();\n const sessionState = usePrimitiveState(widgetCtx.sessionCtx.sessionState);\n const sessionsState = usePrimitiveState(widgetCtx.sessionCtx.sessionsState);\n\n const { openSessions, closedSessions } = useMemo(() => {\n return {\n openSessions: sessionsState.data.filter((s) => s.isOpened === true),\n closedSessions: sessionsState.data.filter((s) => s.isOpened === false),\n };\n }, [sessionsState.data]);\n\n const canCreateNewSession = useMemo(() => {\n if (oneOpenSessionAllowed) {\n return openSessions.length === 0;\n }\n return true;\n }, [oneOpenSessionAllowed, openSessions.length]);\n\n return {\n sessionState,\n sessionsState,\n loadMoreSessions: widgetCtx.sessionCtx.loadMoreSessions,\n resolveSession: widgetCtx.sessionCtx.resolveSession,\n createStateCheckpoint: widgetCtx.sessionCtx.createStateCheckpoint,\n openSessions,\n closedSessions,\n canCreateNewSession,\n };\n}\n","import { useMessages } from './useMessages';\nimport { useSessions } from './useSessions';\n\nexport function useIsAwaitingBotReply() {\n const { sessionState } = useSessions();\n const { messagesState } = useMessages();\n\n const isSessionAssignedToAI = sessionState.session?.assignee.kind === 'ai';\n // This check is useful in cases where the user might navigate in and out of a chat, and `isSendingMessage` is reset back to its default value\n const lastMessage =\n messagesState.messages.length > 0\n ? messagesState.messages[messagesState.messages.length - 1]\n : null;\n const isLastMessageAUserMessage = lastMessage?.type === 'FROM_USER';\n\n const isAwaitingBotReply =\n (isSessionAssignedToAI || sessionState.isCreatingSession) &&\n (messagesState.isSendingMessage || isLastMessageAUserMessage);\n\n return { isAwaitingBotReply };\n}\n","import useSWR from 'swr';\nimport { useWidget } from '../WidgetProvider';\n\nfunction usePreludeData() {\n const { widgetCtx } = useWidget();\n\n // TODO remove swr dependency\n return useSWR([widgetCtx.config.token], widgetCtx.api.widgetPrelude, {\n revalidateOnFocus: false,\n });\n}\n\nexport { usePreludeData };\n","import { useWidget } from '../WidgetProvider';\nimport { usePrimitiveState } from './usePrimitiveState';\n\nexport function useWidgetRouter() {\n const { widgetCtx } = useWidget();\n\n const routerState = usePrimitiveState(widgetCtx.routerCtx.state);\n\n return {\n routerState,\n toSessionsScreen: widgetCtx.routerCtx.toSessionsScreen,\n toChatScreen: widgetCtx.routerCtx.toChatScreen,\n };\n}\n","import { useEffect, useMemo, useState } from 'react';\nimport { useWidget } from '../WidgetProvider';\nimport { v4 } from 'uuid';\n\nconst uploadAbortControllers: Map<string, AbortController> = new Map();\n\ninterface FileWithProgress {\n status: 'pending' | 'uploading' | 'success' | 'error';\n id: string;\n file: File;\n fileUrl?: string;\n progress: number;\n error?: string;\n}\n\nfunction useUploadFiles() {\n const [files, setFiles] = useState<FileWithProgress[]>([]);\n const {\n widgetCtx: { api },\n } = useWidget();\n function appendFiles(files: File[]) {\n const newFiles = files.map((file) => ({\n file,\n id: v4(),\n status: 'pending' as const,\n progress: 0,\n }));\n\n setFiles((prev) => [...prev, ...newFiles]);\n newFiles.forEach(uploadFile);\n }\n\n function updateFileById(id: string, update: Partial<FileWithProgress>) {\n setFiles((prev) =>\n prev.map((f) => (f.id === id ? { ...f, ...update } : f)),\n );\n }\n\n function removeFileById(id: string) {\n setFiles((prev) => prev.filter((f) => f.id !== id));\n }\n\n const uploadFile = async (fileItem: FileWithProgress) => {\n const controller = new AbortController();\n uploadAbortControllers.set(fileItem.id, controller);\n\n try {\n setFiles((prev) =>\n prev.map((f) =>\n f.id === fileItem.id ? { ...f, status: 'uploading', progress: 0 } : f,\n ),\n );\n\n const response = await api.uploadFile({\n file: fileItem.file,\n abortSignal: controller.signal,\n onProgress: (percentage) => {\n updateFileById(fileItem.id, { progress: percentage });\n },\n });\n\n updateFileById(fileItem.id, {\n status: 'success',\n fileUrl: response.fileUrl,\n progress: 100,\n });\n } catch (error) {\n if (!controller.signal.aborted) {\n updateFileById(fileItem.id, {\n status: 'error',\n error: error instanceof Error ? error.message : 'Upload failed',\n progress: 0,\n });\n }\n } finally {\n uploadAbortControllers.delete(fileItem.id);\n }\n };\n\n const handleCancelUpload = (fileId: string) => {\n const controller = uploadAbortControllers.get(fileId);\n if (controller) {\n controller.abort();\n uploadAbortControllers.delete(fileId);\n }\n removeFileById(fileId);\n };\n\n const successFiles = useMemo(() => {\n return files.filter((f) => f.status === 'success' && f.fileUrl);\n }, [files]);\n\n function emptyTheFiles() {\n uploadAbortControllers.forEach((controller) => controller.abort());\n uploadAbortControllers.clear();\n setFiles([]);\n }\n\n useEffect(() => {\n return () => {\n uploadAbortControllers.forEach((controller) => controller.abort());\n uploadAbortControllers.clear();\n };\n }, []);\n\n return {\n allFiles: files,\n appendFiles,\n handleCancelUpload,\n successFiles,\n emptyTheFiles,\n getFileById: (id: string) => files.find((f) => f.id === id),\n getUploadProgress: (id: string) =>\n files.find((f) => f.id === id)?.progress ?? 0,\n getUploadStatus: (id: string) => files.find((f) => f.id === id)?.status,\n hasErrors: files.some((f) => f.status === 'error'),\n isUploading: files.some((f) => f.status === 'uploading'),\n };\n}\n\nexport { useUploadFiles, type FileWithProgress };\n","import React, {\n createContext,\n useContext,\n useEffect,\n useState,\n type Dispatch,\n type ReactNode,\n type SetStateAction,\n} from 'react';\nimport { useConfig } from './useConfig';\n\ntype WidgetTriggerCtx = {\n isOpen: boolean;\n setIsOpen: Dispatch<SetStateAction<boolean>>;\n};\n\nconst context = createContext<WidgetTriggerCtx | null>(null);\n\nexport function WidgetTriggerProvider({ children }: { children: ReactNode }) {\n const config = useConfig();\n const [isOpen, setIsOpen] = useState(config.isOpen ?? false);\n\n useEffect(() => {\n setIsOpen((prev) => config.isOpen ?? prev);\n }, [config.isOpen]);\n\n useEffect(() => {\n const openAfterNSeconds = config.openAfterNSeconds;\n if (typeof openAfterNSeconds !== 'number' || isNaN(openAfterNSeconds))\n return;\n\n const timeout = setTimeout(() => setIsOpen(true), openAfterNSeconds * 1000);\n\n return () => clearTimeout(timeout);\n }, [config.openAfterNSeconds]);\n\n return (\n <context.Provider value={{ isOpen, setIsOpen }}>\n {children}\n </context.Provider>\n );\n}\n\nexport function useWidgetTrigger() {\n const ctx = useContext(context);\n if (!ctx) {\n throw new Error(\n 'useWidgetTrigger must be used within a WidgetTriggerProvider',\n );\n }\n return ctx;\n}\n","import { useWidget } from '../WidgetProvider';\nimport { useConfig } from './useConfig';\nimport { useSessions } from './useSessions';\n\nexport function useModes() {\n const { widgetCtx } = useWidget();\n const { modesComponents } = useConfig();\n const { sessionState } = useSessions();\n\n const modes = widgetCtx.modes;\n const activeModeId = sessionState.session?.modeId;\n const activeMode = modes.find((mode) => mode.id === activeModeId);\n\n const Component = modesComponents?.find((modeComponent) =>\n [\n activeMode?.id || '',\n activeMode?.name?.toLowerCase() || '',\n activeMode?.slug?.toLowerCase() || '',\n ].includes(modeComponent.key.toLowerCase()),\n )?.component;\n\n return {\n modes,\n modesComponents,\n activeModeId,\n activeMode,\n Component,\n };\n}\n"],"names":["ComponentRegistry","opts","components","c","component","index","key","_a","context","createContext","WidgetProvider","config","children","storage","loadingComponent","contentIframeRef","useRef","didInitialize","widgetCtx","setWidgetCtx","useState","componentStore","useMemo","useEffect","WidgetCtx","jsx","version","useWidget","ctx","useContext","useConfig","usePrimitiveState","p","useSyncExternalStore","useContact","useMessages","useSessions","oneOpenSessionAllowed","sessionState","sessionsState","openSessions","closedSessions","s","canCreateNewSession","useIsAwaitingBotReply","messagesState","isSessionAssignedToAI","lastMessage","isLastMessageAUserMessage","usePreludeData","useSWR","useWidgetRouter","uploadAbortControllers","useUploadFiles","files","setFiles","api","appendFiles","newFiles","file","v4","prev","uploadFile","updateFileById","id","update","f","removeFileById","fileItem","controller","response","percentage","error","handleCancelUpload","fileId","successFiles","emptyTheFiles","WidgetTriggerProvider","isOpen","setIsOpen","openAfterNSeconds","timeout","useWidgetTrigger","useModes","modesComponents","modes","activeModeId","activeMode","mode","Component","_b","modeComponent"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ "use strict";const M=require("openapi-fetch"),O=require("lodash.isequal"),E=require("uuid"),F=d=>{console.log(d.error)},_=d=>{const a=M({baseUrl:d.baseUrl}),o={onRequest:d.onRequest,onResponse:d.onResponse,onError:d.onError||F};return a.use(o),a};class U{constructor({config:a}){var g,e;this.userToken=null,this.constructClientOptions=t=>{const s=this.config.apiUrl||"https://api.open.cx",i={"X-Bot-Token":this.config.token,"Content-Type":"application/json",Accept:"application/json",Authorization:t?`Bearer ${t}`:void 0};return{baseUrl:s,headers:i}},this.createOpenAPIClient=({baseUrl:t,headers:s})=>_({baseUrl:t,onRequest:({request:i})=>{Object.entries(s).forEach(([r,n])=>{n&&i.headers.set(r,n)})}}),this.setAuthToken=t=>{this.userToken=t;const{baseUrl:s,headers:i}=this.constructClientOptions(t);this.client=this.createOpenAPIClient({baseUrl:s,headers:i})},this.getExternalWidgetConfig=async()=>await this.client.GET("/backend/widget/v2/config",{params:{header:{"X-Bot-Token":this.config.token}}}),this.widgetPrelude=async()=>await this.client.GET("/backend/widget/v2/prelude",{params:{header:{"X-Bot-Token":this.config.token}}}),this.sendMessage=async(t,s)=>await this.client.POST("/backend/widget/v2/chat/send",{body:t,signal:s}),this.createUnverifiedContact=async t=>await this.client.POST("/backend/widget/v2/contact/create-unverified",{params:{header:{"x-bot-token":this.config.token}},body:t}),this.createSession=async t=>await this.client.POST("/backend/widget/v2/create-session",{body:t}),this.pollSessionAndHistory=async({sessionId:t,lastMessageTimestamp:s,abortSignal:i})=>{const r=s?{lastMessageTimestamp:s}:void 0;return await this.client.GET("/backend/widget/v2/poll/{sessionId}",{params:{path:{sessionId:t},query:r},signal:i})},this.getSessions=async({cursor:t,filters:s,abortSignal:i})=>await this.client.GET("/backend/widget/v2/sessions",{params:{query:{cursor:t,filters:JSON.stringify(s)}},signal:i}),this.uploadFile=async({file:t,abortSignal:s,onProgress:i})=>new Promise((r,n)=>{var v;const h=new FormData;h.append("file",t);const c=new XMLHttpRequest;if(s&&(s.addEventListener("abort",()=>{c.abort(),n(new DOMException("Aborted","AbortError"))}),s.aborted)){n(new DOMException("Aborted","AbortError"));return}c.upload.addEventListener("progress",u=>{if(u.lengthComputable&&i){const p=Math.round(u.loaded/u.total*100);i(p)}}),c.addEventListener("load",()=>{if(c.status>=200&&c.status<300)try{const u=JSON.parse(c.responseText);r(u)}catch(u){n(new Error(`Failed to parse response: ${u}`))}else n(new Error(`Upload failed with status: ${c.status}`))}),c.addEventListener("error",()=>{n(new Error("Network error occurred"))}),c.addEventListener("timeout",()=>{n(new Error("Upload timed out"))});const{baseUrl:C}=this.constructClientOptions(this.userToken),S=`${C}/backend/widget/v2/upload`;c.open("POST",S),c.setRequestHeader("X-Bot-Token",this.config.token),this.userToken??((v=this.config.user)==null?void 0:v.token)?c.setRequestHeader("Authorization",`Bearer ${this.userToken}`):console.error("User token not set"),c.send(h)}),this.vote=async t=>await this.client.POST("/backend/widget/v2/chat/vote",{body:t}),this.resolveSession=async(t,s)=>await this.client.POST("/backend/widget/v2/session/resolve",{body:t,signal:s}),this.createStateCheckpoint=async t=>await this.client.POST("/backend/widget/v2/checkpoint",{body:t}),this.config=a,this.userToken=((g=a.user)==null?void 0:g.token)||null;const{baseUrl:o,headers:l}=this.constructClientOptions((e=a.user)==null?void 0:e.token);this.client=this.createOpenAPIClient({baseUrl:o,headers:l})}}class b{constructor(a){this.subscribers=new Set,this.get=()=>this.state,this.set=o=>{O(this.state,o)||(this.state=o,this.notifySubscribers(o))},this.setPartial=o=>{if(o==null)return;const l={...this.state,...o};this.set(l)},this.reset=()=>{this.set(this.initialState)},this.notifySubscribers=o=>{Array.from(this.subscribers).forEach(g=>{try{g(o)}catch(e){console.error(e)}})},this.subscribe=o=>(this.subscribers.add(o),()=>{this.subscribers.delete(o)}),this.state=a,this.initialState=a}}class R{constructor(){this.state=new b({isPolling:!1,isError:!1}),this.abortController=new AbortController,this.reset=()=>{var a;this.abortController.abort("Resetting poller"),(a=this.stopPolling)==null||a.call(this),this.stopPolling=null},this.stopPolling=null,this.startPolling=(a,o)=>{if(this.stopPolling)return;const l=[],g=async()=>{this.abortController=new AbortController,this.state.setPartial({isPolling:!0});try{await a(this.abortController.signal)}catch(e){if(this.abortController.signal.aborted)return;console.error("Failed to poll:",e),this.state.setPartial({isError:!0})}finally{this.state.setPartial({isPolling:!1})}this.abortController.signal.aborted?console.log("Poller aborted, not scheduling anymore"):l.push(setTimeout(g,o))};g(),this.stopPolling=()=>{l.forEach(clearTimeout),this.state.reset()}}}}function D(d){return d()}function L(d){try{const a=d();return a instanceof Promise?a.then(o=>({data:o})).catch(o=>({error:o})):{data:a}}catch(a){return{error:a}}}class B{constructor({api:a,config:o,sessionCtx:l,messageCtx:g,sessionPollingIntervalSeconds:e}){this.poller=new R,this.registerPolling=()=>{this.sessionCtx.sessionState.subscribe(({session:t})=>{t!=null&&t.id?this.poller.startPolling(async s=>{this.hackAndSlash(t.id,s)},this.sessionPollingIntervalSeconds*1e3):this.poller.reset()})},this.hackAndSlash=async(t,s)=>{var h;this.messageCtx.state.get().messages.length===0&&this.messageCtx.state.setPartial({isInitialFetchLoading:!0});const i=this.messageCtx.state.get().messages,r=i.length>0?(h=i[i.length-1])==null?void 0:h.timestamp:void 0,{data:n}=await this.api.pollSessionAndHistory({sessionId:t,abortSignal:s,lastMessageTimestamp:r});if(n!=null&&n.session&&(this.sessionCtx.sessionState.setPartial({session:n.session}),this.sessionCtx.setSessions([n.session])),n!=null&&n.history&&n.history.length>0){const c=this.messageCtx.state.get().messages,C=n.history.map(this.mapHistoryToMessage).filter(x=>!c.some(S=>S.id===x.id));this.messageCtx.state.setPartial({messages:[...c,...C]})}this.messageCtx.state.get().isInitialFetchLoading&&this.messageCtx.state.setPartial({isInitialFetchLoading:!1})},this.mapHistoryToMessage=t=>{var r,n;const s={id:t.publicId,timestamp:t.sentAt||"",attachments:t.attachments||void 0};if(t.sender.kind==="user")return{...s,type:"FROM_USER",content:t.content.text||"",deliveredAt:t.sentAt||""};if(t.sender.kind==="agent")return{...s,type:"FROM_AGENT",component:"agent_message",data:{message:t.content.text||""},agent:{name:t.sender.name||"",avatar:t.sender.avatar||"",id:null,isAi:!1}};const i=t.actionCalls&&t.actionCalls.length>0?t.actionCalls[t.actionCalls.length-1]:void 0;return{...s,type:"FROM_BOT",component:"bot_message",agent:{id:null,name:((r=this.config.bot)==null?void 0:r.name)||"",isAi:!0,avatar:((n=this.config.bot)==null?void 0:n.avatar)||""},data:{message:t.content.text||"",action:i?{name:i.actionName,data:this.extractActionResult(i)}:void 0}}},this.extractActionResult=t=>{const s=t.result;if(s===null||typeof s!="object")return s;if("responseBodyText"in s&&typeof s.responseBodyText=="string"){const i=s.responseBodyText,r=L(()=>JSON.parse(i)).data;if(r)return r}return t.result},this.api=a,this.config=o,this.sessionCtx=l,this.messageCtx=g,this.sessionPollingIntervalSeconds=e,this.registerPolling()}}class q{constructor({config:a,api:o,storageCtx:l}){var g;this.shouldCollectData=()=>{var e;return!!(!((e=this.state.get().contact)!=null&&e.token)&&this.config.collectUserData)},this.autoCreateUnverifiedUserIfNotExists=async()=>{var e,t,s,i,r,n,h,c,C,x,S,w,v,u;if(!((e=this.config.user)!=null&&e.token)){if(this.config.collectUserData&&!((s=(t=this.config.user)==null?void 0:t.data)!=null&&s.email)){if((i=this.config.extraDataCollectionFields)!=null&&i.length)return;const p=await((r=this.storageCtx)==null?void 0:r.getContactToken());p&&await this.setUnverifiedContact(p);return}if(!((h=(n=this.config.user)==null?void 0:n.data)!=null&&h.email)){const p=await((c=this.storageCtx)==null?void 0:c.getContactToken());if(p){await this.setUnverifiedContact(p);return}}await this.createUnverifiedContact({email:(x=(C=this.config.user)==null?void 0:C.data)==null?void 0:x.email,non_verified_name:((w=(S=this.config.user)==null?void 0:S.data)==null?void 0:w.name)||"Anonymous",non_verified_custom_data:(u=(v=this.config.user)==null?void 0:v.data)==null?void 0:u.customData})}},this.createUnverifiedContact=async(e,t)=>{this.state.setPartial({extraCollectedData:t});try{this.state.setPartial({isCreatingUnverifiedContact:!0,isErrorCreatingUnverifiedContact:!1});const{data:s}=await this.api.createUnverifiedContact(e);s!=null&&s.token?await this.setUnverifiedContact(s.token):this.state.setPartial({isErrorCreatingUnverifiedContact:!0})}finally{this.state.setPartial({isCreatingUnverifiedContact:!1})}},this.setUnverifiedContact=async e=>{var i,r,n,h;const t=await((i=this.storageCtx)==null?void 0:i.getExternalContactId()),s=((r=this.config.user)==null?void 0:r.externalId)||t||E.v4();this.api.setAuthToken(e),await((n=this.storageCtx)==null?void 0:n.setContactToken(e)),await((h=this.storageCtx)==null?void 0:h.setExternalContactId(s)),this.state.setPartial({contact:{token:e,externalId:s}})},this.config=a,this.storageCtx=l,this.api=o,this.state=new b({contact:(g=a.user)!=null&&g.token?{token:a.user.token,externalId:a.user.externalId}:null,extraCollectedData:void 0,isCreatingUnverifiedContact:!1,isErrorCreatingUnverifiedContact:!1}),this.autoCreateUnverifiedUserIfNotExists()}}function y(){return E.v4()}class ${constructor({config:a,api:o,contactCtx:l,sessionsPollingIntervalSeconds:g}){this.sessionsRefresher=new R,this.sessionState=new b({session:null,isCreatingSession:!1,isResolvingSession:!1}),this.sessionsState=new b({data:[],cursor:void 0,isLastPage:!1,didStartInitialFetch:!1,isInitialFetchLoading:!0}),this.reset=async()=>{this.sessionState.reset()},this.registerSessionsRefresherWrapper=()=>{var e;(e=this.contactCtx.state.get().contact)!=null&&e.token&&!this.sessionsState.get().didStartInitialFetch?this.registerSessionsRefresher():this.contactCtx.state.subscribe(({contact:t})=>{t!=null&&t.token&&!this.sessionsState.get().didStartInitialFetch&&this.registerSessionsRefresher()})},this.registerSessionsRefresher=()=>{this.sessionsRefresher.startPolling(async()=>{this.sessionsState.get().didStartInitialFetch===!1&&this.sessionsState.setPartial({didStartInitialFetch:!0}),await this.refreshSessions(),this.sessionsState.get().isInitialFetchLoading===!0&&this.sessionsState.setPartial({isInitialFetchLoading:!1})},this.sessionsPollingIntervalSeconds*1e3)},this.createSession=async()=>{var r;this.sessionState.setPartial({session:null,isCreatingSession:!0});const e=(r=this.contactCtx.state.get().contact)==null?void 0:r.externalId,t={...this.config.sessionCustomData,...e?{external_id:e}:{}},{data:s,error:i}=await this.api.createSession({customData:Object.keys(t).length>0?t:void 0});return s?(this.sessionState.setPartial({session:s,isCreatingSession:!1}),s):(this.sessionState.setPartial({isCreatingSession:!1}),console.error("Failed to create session:",i),null)},this.loadMoreSessions=async()=>{if(this.sessionsState.get().isLastPage)return;const{data:e}=await this.getSessions({cursor:this.sessionsState.get().cursor});if(e){const s=[...this.sessionsState.get().data,...e.items].filter((i,r,n)=>r===n.findIndex(h=>i.id===h.id));this.sessionsState.setPartial({data:s,cursor:e.next||void 0,isLastPage:e.next===null})}},this.getSessions=async({cursor:e})=>{var s,i;if(!((s=this.contactCtx.state.get().contact)!=null&&s.token))return{data:null};const t=(i=this.contactCtx.state.get().contact)==null?void 0:i.externalId;return await this.api.getSessions({cursor:e,filters:t?{external_id:t}:{}})},this.setSessions=e=>{const t=[...e,...this.sessionsState.get().data].filter((s,i,r)=>i===r.findIndex(n=>s.id===n.id));this.sessionsState.setPartial({data:t})},this.refreshSessions=async()=>{const{data:e}=await this.getSessions({cursor:void 0});e&&this.setSessions(e.items)},this.resolveSession=async()=>{const e=this.sessionState.get().session;if(!e||!e.isOpened)return{success:!1,error:"Session is not opened"};this.sessionState.setPartial({isResolvingSession:!0});const{data:t,error:s}=await this.api.resolveSession({session_id:e.id});return t?(this.sessionState.setPartial({session:t,isResolvingSession:!1}),{success:!0,data:t}):(this.sessionState.setPartial({isResolvingSession:!1}),{success:!1,error:s})},this.createStateCheckpoint=async e=>{var r;const t=(r=this.sessionState.get().session)==null?void 0:r.id;if(!t)return;const{data:s,error:i}=await this.api.createStateCheckpoint({session_id:t,payload:e});return s?{data:s}:{success:!1,error:i}},this.config=a,this.api=o,this.contactCtx=l,this.sessionsPollingIntervalSeconds=g,this.registerSessionsRefresherWrapper()}}class N{constructor({config:a,api:o,sessionCtx:l,contactCtx:g}){this.state=new b({messages:[],isSendingMessage:!1,lastAIResMightSolveUserIssue:!1,isInitialFetchLoading:!1}),this.sendMessageAbortController=new AbortController,this.reset=()=>{this.sendMessageAbortController.abort("Resetting chat"),this.state.reset()},this.sendMessage=async e=>{var n,h,c,C,x,S,w,v;if(!e.content.trim()&&(!e.attachments||e.attachments.length===0)){console.warn("Cannot send an empty message of no content or attachments");return}const t=this.state.get().isSendingMessage,s=((n=this.sessionCtx.sessionState.get().session)==null?void 0:n.assignee.kind)==="ai",i=this.state.get().messages,r=i.length>0?i[i.length-1]:void 0;if(s&&t||s&&(r==null?void 0:r.type)==="FROM_USER"){console.warn("Cannot send messages while awaiting AI response");return}this.sendMessageAbortController=new AbortController,this.state.setPartial({lastAIResMightSolveUserIssue:!1});try{this.state.setPartial({isSendingMessage:!0});const u=this.toUserMessage(e.content.trim(),e.attachments||void 0),p=this.state.get().messages;if(this.state.setPartial({messages:[...p,u]}),!((h=this.sessionCtx.sessionState.get().session)!=null&&h.id)){if(!await this.sessionCtx.createSession()){console.error("Failed to create session");return}this.sessionCtx.refreshSessions()}const T=(c=this.sessionCtx.sessionState.get().session)==null?void 0:c.id;if(!T)return;const{data:f}=await this.api.sendMessage({uuid:u.id,bot_token:this.config.token,headers:this.config.headers,query_params:this.config.queryParams,body_properties:this.config.bodyProperties,session_id:T,content:u.content,attachments:e.attachments,clientContext:this.config.context,custom_data:{...this.config.messageCustomData||{},...e.customData||{}},language:this.config.language,exit_mode_prompt:e.exitModePrompt},this.sendMessageAbortController.signal);if(f!=null&&f.success){const P=this.toBotMessage(f);if(P){const I=this.state.get().messages;if(!!I.some(A=>A.id===P.id)){this.state.setPartial({lastAIResMightSolveUserIssue:((C=f.autopilotResponse)==null?void 0:C.mightSolveUserIssue)||((x=f.uiResponse)==null?void 0:x.mightSolveUserIssue)});return}this.state.setPartial({messages:[...I,P],lastAIResMightSolveUserIssue:((S=f.autopilotResponse)==null?void 0:S.mightSolveUserIssue)||((w=f.uiResponse)==null?void 0:w.mightSolveUserIssue)})}f.session&&this.sessionCtx.sessionState.setPartial({session:f.session})}else{const P=this.toBotErrorMessage(((v=f==null?void 0:f.error)==null?void 0:v.message)||"Unknown error occurred"),I=this.state.get().messages;this.state.setPartial({messages:[...I,P]})}}catch(u){this.sendMessageAbortController.signal.aborted||console.error("Failed to send message:",u)}finally{this.state.setPartial({isSendingMessage:!1})}},this.toUserMessage=(e,t)=>{const s=(()=>{const i=this.contactCtx.state.get().extraCollectedData;return this.state.get().messages.length===0&&i&&Object.keys(i).length>0?`${Object.entries(i).filter(([n,h])=>!!h).map(([n,h])=>`${n}: ${h}`).join(`
2
+ `)}
3
+
4
+ ${e}`:e})();return{id:y(),type:"FROM_USER",content:s,deliveredAt:new Date().toISOString(),attachments:t,timestamp:new Date().toISOString()}},this.toBotMessage=e=>{var t;return e.success&&e.autopilotResponse?{type:"FROM_BOT",id:e.autopilotResponse.id||y(),timestamp:new Date().toISOString(),component:"bot_message",agent:this.config.bot?{name:this.config.bot.name||"",isAi:!0,avatar:this.config.bot.avatar||"",id:null}:void 0,data:{message:e.autopilotResponse.value.content,action:(t=e.uiResponse)!=null&&t.value.name?{name:e.uiResponse.value.name,data:e.uiResponse.value.request_response}:void 0}}:null},this.toBotErrorMessage=e=>({type:"FROM_BOT",id:y(),timestamp:new Date().toISOString(),component:"TEXT",data:{message:e,variant:"error",action:void 0}}),this.config=a,this.api=o,this.sessionCtx=l,this.contactCtx=g}}class H{constructor({config:a,contactCtx:o,sessionCtx:l,resetChat:g}){var e;this.registerRoutingListener=()=>{this.contactCtx.state.subscribe(({contact:t})=>{var s;t!=null&&t.token&&this.state.get().screen==="welcome"&&this.state.setPartial({screen:(s=this.config.router)!=null&&s.chatScreenOnly?"chat":"sessions"})}),this.sessionCtx.sessionsState.subscribe(({isInitialFetchLoading:t,data:s})=>{var i,r,n,h;if((i=this.config.router)!=null&&i.chatScreenOnly&&!((r=this.sessionCtx.sessionState.get().session)!=null&&r.id)){const c=(n=s.find(C=>C.isOpened))==null?void 0:n.id;return c?this.toChatScreen(c):void 0}s.length||((h=this.config.router)==null?void 0:h.goToChatIfNoSessions)!==!1&&!t&&this.state.get().screen!=="chat"&&this.toChatScreen()})},this.toSessionsScreen=()=>{this.resetChat(),this.state.setPartial({screen:"sessions"})},this.toChatScreen=t=>{if(this.resetChat(),t){const s=this.sessionCtx.sessionsState.get().data.find(i=>i.id===t);if(!s)return;this.sessionCtx.sessionState.setPartial({session:s})}this.state.setPartial({screen:"chat"})},this.config=a,this.contactCtx=o,this.sessionCtx=l,this.resetChat=g,this.state=new b({screen:this.contactCtx.shouldCollectData()?"welcome":(e=this.config.router)!=null&&e.chatScreenOnly?"chat":"sessions"}),this.registerRoutingListener()}}class X{constructor({storage:a}){this.KEYS={contactToken:"opencx__widget__contactToken",externalContactId:"opencx__widget__externalContactId"},this.setContactToken=async o=>{await this.storage.set(this.KEYS.contactToken,o)},this.getContactToken=async()=>this.storage.get(this.KEYS.contactToken),this.setExternalContactId=async o=>{await this.storage.set(this.KEYS.externalContactId,o)},this.getExternalContactId=async()=>this.storage.get(this.KEYS.externalContactId),this.storage=a}}const m=class m{constructor({config:a,storage:o,modes:l}){if(this.modes=[],this.resetChat=()=>{this.sessionCtx.reset(),this.messageCtx.reset()},!m.pollingIntervalsSeconds)throw Error("Widget polling values are not defined, did you call WidgetCtx.initialize()");this.config=a,this.api=new U({config:a}),this.storageCtx=o?new X({storage:o}):void 0,this.modes=l,this.contactCtx=new q({api:this.api,config:this.config,storageCtx:this.storageCtx}),this.sessionCtx=new $({config:this.config,api:this.api,contactCtx:this.contactCtx,sessionsPollingIntervalSeconds:m.pollingIntervalsSeconds.sessions}),this.messageCtx=new N({config:this.config,api:this.api,sessionCtx:this.sessionCtx,contactCtx:this.contactCtx}),this.activeSessionPollingCtx=new B({api:this.api,config:this.config,sessionCtx:this.sessionCtx,messageCtx:this.messageCtx,sessionPollingIntervalSeconds:m.pollingIntervalsSeconds.session}),this.routerCtx=new H({config:this.config,contactCtx:this.contactCtx,sessionCtx:this.sessionCtx,resetChat:this.resetChat})}};m.pollingIntervalsSeconds=null,m.initialize=async({config:a,storage:o})=>{var g,e,t;const l=await new U({config:a}).getExternalWidgetConfig();return m.pollingIntervalsSeconds={session:((g=l.data)==null?void 0:g.sessionPollingIntervalSeconds)||10,sessions:((e=l.data)==null?void 0:e.sessionsPollingIntervalSeconds)||60},new m({config:a,storage:o,modes:((t=l.data)==null?void 0:t.modes)||[]})};let k=m;exports.PrimitiveState=b;exports.WidgetCtx=k;exports.run=D;
5
+ //# sourceMappingURL=widget.ctx-B-9oCDpY.cjs.map