@botfabrik/engine-webclient 4.66.0 → 4.66.2

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.
@@ -2,3 +2,24 @@
2
2
  * Das Aussehen des Webclients kann für jedes Projekt übersteuert werden.
3
3
  * Dazu kann eine eigene CSS Datei namens 'custom.css' im Verzeichnis 'public/${name-meines-webclients}/' abgelegt werden.
4
4
  */
5
+
6
+ @import url(//fonts.googleapis.com/css?family=Roboto:400,300,700,500,100,200);
7
+
8
+ .bubble-chat {
9
+ /* common */
10
+ --brand-primary-color: rgb(6, 48, 98);
11
+ --brand-secondary-color: white;
12
+ --danger-color: #cd2147;
13
+
14
+ /* chat window */
15
+ --header-background-color: var(--brand-primary-color);
16
+
17
+ /* chat body */
18
+ --body-background-color: rgb(234, 238, 243);
19
+ --bot-bubble-border-width: 0;
20
+ --bot-avatar-background-color: white;
21
+ --guest-bubble-border-width: 0;
22
+ --agent-avatar-background-color: white;
23
+
24
+ font-family: 'Roboto', sans-serif;
25
+ }
@@ -1,5 +1,5 @@
1
1
  <!doctype html>
2
- <html lang="en" translate="no" class="notranslate">
2
+ <html lang="en" translate="no" class="notranslate bubble-chat">
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
5
  <link rel="icon" href="./favicon.ico" />
@@ -7,8 +7,8 @@
7
7
  <meta name="theme-color" content="#000000" />
8
8
  <meta name="google" content="notranslate" />
9
9
  <title>Bubble Chat Client</title>
10
- <script type="module" crossorigin src="./assets/index-Ces-s9t_.js"></script>
11
- <link rel="stylesheet" crossorigin href="./assets/index-IZ7KnhKS.css">
10
+ <script type="module" crossorigin src="./assets/index-DTiiiazw.js"></script>
11
+ <link rel="stylesheet" crossorigin href="./assets/index-Bv7hr1lr.css">
12
12
  </head>
13
13
 
14
14
  <body>
@@ -1,4 +1,4 @@
1
- var at=Object.defineProperty;var lt=(h,p,j)=>p in h?at(h,p,{enumerable:!0,configurable:!0,writable:!0,value:j}):h[p]=j;var Z=(h,p,j)=>lt(h,typeof p!="symbol"?p+"":p,j);(function(){"use strict";function h(){}function p(e){return e()}function j(){return Object.create(null)}function k(e){e.forEach(p)}function A(e){return typeof e=="function"}function P(e,t){return e!=e?t==t:e!==t||e&&typeof e=="object"||typeof e=="function"}let L;function x(e,t){return e===t?!0:(L||(L=document.createElement("a")),L.href=t,e===L.href)}function be(e){return Object.keys(e).length===0}const _e=typeof window<"u"?window:typeof globalThis<"u"?globalThis:global;function v(e,t){e.appendChild(t)}function z(e,t,n){const r=ye(e);if(!r.getElementById(t)){const o=m("style");o.id=t,o.textContent=n,je(r,o)}}function ye(e){if(!e)return document;const t=e.getRootNode?e.getRootNode():e.ownerDocument;return t&&t.host?t:e.ownerDocument}function je(e,t){return v(e.head||e,t),t.sheet}function y(e,t,n){e.insertBefore(t,n||null)}function w(e){e.parentNode&&e.parentNode.removeChild(e)}function m(e){return document.createElement(e)}function ee(e){return document.createTextNode(e)}function E(){return ee(" ")}function ke(){return ee("")}function W(e,t,n,r){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)}function f(e,t,n){n==null?e.removeAttribute(t):e.getAttribute(t)!==n&&e.setAttribute(t,n)}function xe(e){return Array.from(e.childNodes)}function te(e,t,n){e.classList.toggle(t,!!n)}let N;function U(e){N=e}const C=[],ne=[];let O=[];const re=[],Ce=Promise.resolve();let H=!1;function Oe(){H||(H=!0,Ce.then(oe))}function q(e){O.push(e)}const M=new Set;let T=0;function oe(){if(T!==0)return;const e=N;do{try{for(;T<C.length;){const t=C[T];T++,U(t),Te(t.$$)}}catch(t){throw C.length=0,T=0,t}for(U(null),C.length=0,T=0;ne.length;)ne.pop()();for(let t=0;t<O.length;t+=1){const n=O[t];M.has(n)||(M.add(n),n())}O.length=0}while(C.length);for(;re.length;)re.pop()();H=!1,M.clear(),U(e)}function Te(e){if(e.fragment!==null){e.update(),k(e.before_update);const t=e.dirty;e.dirty=[-1],e.fragment&&e.fragment.p(e.ctx,t),e.after_update.forEach(q)}}function Ee(e){const t=[],n=[];O.forEach(r=>e.indexOf(r)===-1?t.push(r):n.push(r)),n.forEach(r=>r()),O=t}const I=new Set;let Ue;function B(e,t){e&&e.i&&(I.delete(e),e.i(t))}function ie(e,t,n,r){if(e&&e.o){if(I.has(e))return;I.add(e),Ue.c.push(()=>{I.delete(e),r&&(n&&e.d(1),r())}),e.o(t)}else r&&r()}function se(e){e&&e.c()}function $(e,t,n){const{fragment:r,after_update:o}=e.$$;r&&r.m(t,n),q(()=>{const s=e.$$.on_mount.map(p).filter(A);e.$$.on_destroy?e.$$.on_destroy.push(...s):k(s),e.$$.on_mount=[]}),o.forEach(q)}function G(e,t){const n=e.$$;n.fragment!==null&&(Ee(n.after_update),k(n.on_destroy),n.fragment&&n.fragment.d(t),n.on_destroy=n.fragment=null,n.ctx=[])}function Se(e,t){e.$$.dirty[0]===-1&&(C.push(e),Oe(),e.$$.dirty.fill(0)),e.$$.dirty[t/31|0]|=1<<t%31}function F(e,t,n,r,o,s,a=null,d=[-1]){const l=N;U(e);const i=e.$$={fragment:null,ctx:[],props:s,update:h,not_equal:o,bound:j(),on_mount:[],on_destroy:[],on_disconnect:[],before_update:[],after_update:[],context:new Map(t.context||(l?l.$$.context:[])),callbacks:j(),dirty:d,skip_bound:!1,root:t.target||l.$$.root};a&&a(i.root);let c=!1;if(i.ctx=n?n(e,t.props||{},(u,g,...b)=>{const _=b.length?b[0]:g;return i.ctx&&o(i.ctx[u],i.ctx[u]=_)&&(!i.skip_bound&&i.bound[u]&&i.bound[u](_),c&&Se(e,u)),g}):[],i.update(),c=!0,k(i.before_update),i.fragment=r?r(i.ctx):!1,t.target){if(t.hydrate){const u=xe(t.target);i.fragment&&i.fragment.l(u),u.forEach(w)}else i.fragment&&i.fragment.c();t.intro&&B(e.$$.fragment),$(e,t.target,t.anchor),oe()}U(l)}class Y{constructor(){Z(this,"$$");Z(this,"$$set")}$destroy(){G(this,1),this.$destroy=h}$on(t,n){if(!A(n))return h;const r=this.$$.callbacks[t]||(this.$$.callbacks[t]=[]);return r.push(n),()=>{const o=r.indexOf(n);o!==-1&&r.splice(o,1)}}$set(t){this.$$set&&!be(t)&&(this.$$.skip_bound=!0,this.$$set(t),this.$$.skip_bound=!1)}}const Ae="4";typeof window<"u"&&(window.__svelte||(window.__svelte={v:new Set})).v.add(Ae);function Le(e){z(e,"svelte-f0h0jd",`.svelte-f0h0jd.svelte-f0h0jd,.svelte-f0h0jd.svelte-f0h0jd:before,.svelte-f0h0jd.svelte-f0h0jd:after{box-sizing:border-box}.bot-border.svelte-f0h0jd.svelte-f0h0jd{position:fixed;display:flex;flex-direction:column;top:0;bottom:env(safe-area-inset-bottom);height:100%;max-height:100vh;width:100%;border-width:0;border-radius:var(--window-border-radius, 8px);box-shadow:rgba(0, 0, 0, 0.24) 0px 16px 40px;background:transparent;opacity:1;transition:transform 200ms,
1
+ var at=Object.defineProperty;var lt=(h,p,j)=>p in h?at(h,p,{enumerable:!0,configurable:!0,writable:!0,value:j}):h[p]=j;var Z=(h,p,j)=>lt(h,typeof p!="symbol"?p+"":p,j);(function(){"use strict";function h(){}function p(e){return e()}function j(){return Object.create(null)}function k(e){e.forEach(p)}function A(e){return typeof e=="function"}function P(e,t){return e!=e?t==t:e!==t||e&&typeof e=="object"||typeof e=="function"}let L;function x(e,t){return e===t?!0:(L||(L=document.createElement("a")),L.href=t,e===L.href)}function we(e){return Object.keys(e).length===0}const _e=typeof window<"u"?window:typeof globalThis<"u"?globalThis:global;function v(e,t){e.appendChild(t)}function z(e,t,n){const r=ye(e);if(!r.getElementById(t)){const o=m("style");o.id=t,o.textContent=n,je(r,o)}}function ye(e){if(!e)return document;const t=e.getRootNode?e.getRootNode():e.ownerDocument;return t&&t.host?t:e.ownerDocument}function je(e,t){return v(e.head||e,t),t.sheet}function y(e,t,n){e.insertBefore(t,n||null)}function b(e){e.parentNode&&e.parentNode.removeChild(e)}function m(e){return document.createElement(e)}function ee(e){return document.createTextNode(e)}function E(){return ee(" ")}function ke(){return ee("")}function W(e,t,n,r){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)}function d(e,t,n){n==null?e.removeAttribute(t):e.getAttribute(t)!==n&&e.setAttribute(t,n)}function xe(e){return Array.from(e.childNodes)}function te(e,t,n){e.classList.toggle(t,!!n)}let N;function U(e){N=e}const C=[],ne=[];let O=[];const re=[],Ce=Promise.resolve();let H=!1;function Oe(){H||(H=!0,Ce.then(oe))}function q(e){O.push(e)}const M=new Set;let T=0;function oe(){if(T!==0)return;const e=N;do{try{for(;T<C.length;){const t=C[T];T++,U(t),Te(t.$$)}}catch(t){throw C.length=0,T=0,t}for(U(null),C.length=0,T=0;ne.length;)ne.pop()();for(let t=0;t<O.length;t+=1){const n=O[t];M.has(n)||(M.add(n),n())}O.length=0}while(C.length);for(;re.length;)re.pop()();H=!1,M.clear(),U(e)}function Te(e){if(e.fragment!==null){e.update(),k(e.before_update);const t=e.dirty;e.dirty=[-1],e.fragment&&e.fragment.p(e.ctx,t),e.after_update.forEach(q)}}function Ee(e){const t=[],n=[];O.forEach(r=>e.indexOf(r)===-1?t.push(r):n.push(r)),n.forEach(r=>r()),O=t}const I=new Set;let Ue;function B(e,t){e&&e.i&&(I.delete(e),e.i(t))}function ie(e,t,n,r){if(e&&e.o){if(I.has(e))return;I.add(e),Ue.c.push(()=>{I.delete(e),r&&(n&&e.d(1),r())}),e.o(t)}else r&&r()}function se(e){e&&e.c()}function $(e,t,n){const{fragment:r,after_update:o}=e.$$;r&&r.m(t,n),q(()=>{const s=e.$$.on_mount.map(p).filter(A);e.$$.on_destroy?e.$$.on_destroy.push(...s):k(s),e.$$.on_mount=[]}),o.forEach(q)}function G(e,t){const n=e.$$;n.fragment!==null&&(Ee(n.after_update),k(n.on_destroy),n.fragment&&n.fragment.d(t),n.on_destroy=n.fragment=null,n.ctx=[])}function Se(e,t){e.$$.dirty[0]===-1&&(C.push(e),Oe(),e.$$.dirty.fill(0)),e.$$.dirty[t/31|0]|=1<<t%31}function F(e,t,n,r,o,s,a=null,f=[-1]){const l=N;U(e);const i=e.$$={fragment:null,ctx:[],props:s,update:h,not_equal:o,bound:j(),on_mount:[],on_destroy:[],on_disconnect:[],before_update:[],after_update:[],context:new Map(t.context||(l?l.$$.context:[])),callbacks:j(),dirty:f,skip_bound:!1,root:t.target||l.$$.root};a&&a(i.root);let c=!1;if(i.ctx=n?n(e,t.props||{},(u,g,...w)=>{const _=w.length?w[0]:g;return i.ctx&&o(i.ctx[u],i.ctx[u]=_)&&(!i.skip_bound&&i.bound[u]&&i.bound[u](_),c&&Se(e,u)),g}):[],i.update(),c=!0,k(i.before_update),i.fragment=r?r(i.ctx):!1,t.target){if(t.hydrate){const u=xe(t.target);i.fragment&&i.fragment.l(u),u.forEach(b)}else i.fragment&&i.fragment.c();t.intro&&B(e.$$.fragment),$(e,t.target,t.anchor),oe()}U(l)}class Y{constructor(){Z(this,"$$");Z(this,"$$set")}$destroy(){G(this,1),this.$destroy=h}$on(t,n){if(!A(n))return h;const r=this.$$.callbacks[t]||(this.$$.callbacks[t]=[]);return r.push(n),()=>{const o=r.indexOf(n);o!==-1&&r.splice(o,1)}}$set(t){this.$$set&&!we(t)&&(this.$$.skip_bound=!0,this.$$set(t),this.$$.skip_bound=!1)}}const Ae="4";typeof window<"u"&&(window.__svelte||(window.__svelte={v:new Set})).v.add(Ae);function Le(e){z(e,"svelte-f0h0jd",`.svelte-f0h0jd.svelte-f0h0jd,.svelte-f0h0jd.svelte-f0h0jd:before,.svelte-f0h0jd.svelte-f0h0jd:after{box-sizing:border-box}.bot-border.svelte-f0h0jd.svelte-f0h0jd{position:fixed;display:flex;flex-direction:column;top:0;bottom:env(safe-area-inset-bottom);height:100%;max-height:100vh;width:100%;border-width:0;border-radius:var(--window-border-radius, 8px);box-shadow:rgba(0, 0, 0, 0.24) 0px 16px 40px;background:transparent;opacity:1;transition:transform 200ms,
2
2
  opacity 100ms 100ms,
3
3
  all 150ms;z-index:2147483647}.bot-border.closed.svelte-f0h0jd.svelte-f0h0jd{transform:translateY(100vh);opacity:0}.header.svelte-f0h0jd.svelte-f0h0jd{display:flex;justify-content:space-between;width:100%;height:var(--header-height, 4em);background-color:var(
4
4
  --header-background-color,
@@ -15,5 +15,5 @@ var at=Object.defineProperty;var lt=(h,p,j)=>p in h?at(h,p,{enumerable:!0,config
15
15
  <br class="svelte-f0h0jd"/>
16
16
  src=&quot;https://server.com/webclient/embed/bundle.js&quot;&gt; &lt;/script&gt;
17
17
  </code>
18
- `,f(t,"class","svelte-f0h0jd"),f(r,"class","svelte-f0h0jd")},m(o,s){y(o,t,s),y(o,n,s),y(o,r,s)},p:h,d(o){o&&(w(t),w(n),w(r))}}}function Ie(e){let t,n,r,o,s,a,d,l,i,c,u,g;return{c(){t=m("div"),n=m("div"),r=m("img"),s=E(),a=m("div"),a.innerHTML='<svg viewBox="-2 -2 24 24" aria-label="Close window icon" class="svelte-f0h0jd"><path d="M0,0L20,20M20,0L0,20" class="svelte-f0h0jd"></path></svg>',d=E(),l=m("iframe"),x(r.src,o=`${e[3]}/logo.svg`)||f(r,"src",o),f(r,"alt","Logo"),f(r,"class","logo svelte-f0h0jd"),f(a,"aria-label","Close chat window"),f(a,"role","button"),f(a,"class","bot-border-close-icon svelte-f0h0jd"),f(a,"tabindex",0),f(n,"class","header svelte-f0h0jd"),f(l,"id","chat-frame"),f(l,"title","Chat"),f(l,"class","bot svelte-f0h0jd"),x(l.src,i=`${e[0]}${e[0].indexOf("?")===-1?"?":"&"}referrer=${encodeURIComponent(e[1]??"")}&windowHeight=${le()}&windowWidth=${ae()}`)||f(l,"src",i),f(l,"frameborder","0"),f(l,"allow","microphone"),l.allowFullscreen=!0,f(t,"class","bot-border svelte-f0h0jd"),f(t,"aria-hidden",c=e[2]?"false":"true"),te(t,"closed",!e[2])},m(b,_){y(b,t,_),v(t,n),v(n,r),v(n,s),v(n,a),v(t,d),v(t,l),u||(g=[W(a,"click",function(){A(e[4])&&e[4].apply(this,arguments)}),W(a,"keydown",e[5])],u=!0)},p(b,_){e=b,_&8&&!x(r.src,o=`${e[3]}/logo.svg`)&&f(r,"src",o),_&3&&!x(l.src,i=`${e[0]}${e[0].indexOf("?")===-1?"?":"&"}referrer=${encodeURIComponent(e[1]??"")}&windowHeight=${le()}&windowWidth=${ae()}`)&&f(l,"src",i),_&4&&c!==(c=e[2]?"false":"true")&&f(t,"aria-hidden",c),_&4&&te(t,"closed",!e[2])},d(b){b&&w(t),u=!1,k(g)}}}function Re(e){let t;function n(s,a){return s[0]?Ie:We}let r=n(e),o=r(e);return{c(){o.c(),t=ke()},m(s,a){o.m(s,a),y(s,t,a)},p(s,[a]){r===(r=n(s))&&o?o.p(s,a):(o.d(1),o=r(s),o&&(o.c(),o.m(t.parentNode,t)))},i:h,o:h,d(s){s&&w(t),o.d(s)}}}function ae(){try{return window.innerWidth}catch{return-1}}function le(){try{return window.innerHeight}catch{return-1}}function De(e,t,n){let{server:r}=t,{referrer:o}=t,{open:s}=t,{assetsUrl:a}=t,{onToggle:d}=t;function l(i){const c=i.key;(c==="ArrowDown"||c==="ArrowRight"||c==="Enter"||c===" "||c==="Space")&&(i.stopPropagation(),d())}return e.$$set=i=>{"server"in i&&n(0,r=i.server),"referrer"in i&&n(1,o=i.referrer),"open"in i&&n(2,s=i.open),"assetsUrl"in i&&n(3,a=i.assetsUrl),"onToggle"in i&&n(4,d=i.onToggle)},[r,o,s,a,d,l]}class Pe extends Y{constructor(t){super(),F(this,t,De,Re,P,{server:0,referrer:1,open:2,assetsUrl:3,onToggle:4},Le)}}function ze(e){z(e,"svelte-2hl2mw",`.svelte-2hl2mw,.svelte-2hl2mw:before,.svelte-2hl2mw:after{box-sizing:border-box}.chat-button-wrapper.svelte-2hl2mw{position:fixed;top:var(--fab-top-mobile, var(--fab-top, auto));right:var(--fab-right-mobile, var(--fab-right, 1.5em));bottom:var(--fab-bottom-mobile, var(--fab-bottom, 1.5em));left:var(--fab-left-mobile, var(--fab-left, auto));width:var(--fab-size-mobile, var(--fab-size, 5em));height:var(--fab-size-mobile, var(--fab-size, 5em));z-index:999}@media screen and (min-width: 768px){.chat-button-wrapper.svelte-2hl2mw{top:var(--fab-top, auto);right:var(--fab-right, 1.5em);bottom:var(--fab-bottom, 1.5em);left:var(--fab-left, auto);width:var(--fab-size, 6em);height:var(--fab-size, 6em)}}.chat-button.svelte-2hl2mw{display:block;height:100%;cursor:pointer;border-radius:50%;box-shadow:9px 9px 16px rgba(0, 0, 0, 0.25);transition:transform 100ms,
19
- box-shadow 100ms}.chat-button.svelte-2hl2mw:hover{box-shadow:16px 16px 16px rgba(0, 0, 0, 0.2);transform:translateY(-2px)}`)}function Ne(e){let t,n,r,o,s,a;return{c(){t=m("div"),n=m("img"),f(n,"class","chat-button svelte-2hl2mw"),f(n,"alt","Open chat window"),x(n.src,r=`${e[0]}/fab.svg`)||f(n,"src",r),f(t,"class","chat-button-wrapper svelte-2hl2mw"),f(t,"tabindex","0"),f(t,"role","button"),f(t,"aria-label","Open chat window"),f(t,"aria-expanded",o=e[2]?"true":"false")},m(d,l){y(d,t,l),v(t,n),s||(a=[W(t,"click",function(){A(e[1])&&e[1].apply(this,arguments)}),W(t,"keydown",e[3])],s=!0)},p(d,[l]){e=d,l&1&&!x(n.src,r=`${e[0]}/fab.svg`)&&f(n,"src",r),l&4&&o!==(o=e[2]?"true":"false")&&f(t,"aria-expanded",o)},i:h,o:h,d(d){d&&w(t),s=!1,k(a)}}}function He(e,t,n){let{assetsUrl:r}=t,{onToggle:o}=t,{open:s}=t;function a(d){const l=d.key;(l==="ArrowDown"||l==="ArrowRight"||l==="Enter"||l===" "||l==="Space")&&(d.stopPropagation(),o())}return e.$$set=d=>{"assetsUrl"in d&&n(0,r=d.assetsUrl),"onToggle"in d&&n(1,o=d.onToggle),"open"in d&&n(2,s=d.open)},[r,o,s,a]}class qe extends Y{constructor(t){super(),F(this,t,He,Ne,P,{assetsUrl:0,onToggle:1,open:2},ze)}}/*! js-cookie v3.0.5 | MIT */function R(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)e[r]=n[r]}return e}var Me={read:function(e){return e[0]==='"'&&(e=e.slice(1,-1)),e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(e){return encodeURIComponent(e).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}};function K(e,t){function n(o,s,a){if(!(typeof document>"u")){a=R({},t,a),typeof a.expires=="number"&&(a.expires=new Date(Date.now()+a.expires*864e5)),a.expires&&(a.expires=a.expires.toUTCString()),o=encodeURIComponent(o).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var d="";for(var l in a)a[l]&&(d+="; "+l,a[l]!==!0&&(d+="="+a[l].split(";")[0]));return document.cookie=o+"="+e.write(s,o)+d}}function r(o){if(!(typeof document>"u"||arguments.length&&!o)){for(var s=document.cookie?document.cookie.split("; "):[],a={},d=0;d<s.length;d++){var l=s[d].split("="),i=l.slice(1).join("=");try{var c=decodeURIComponent(l[0]);if(a[c]=e.read(i,c),o===c)break}catch{}}return o?a[o]:a}}return Object.create({set:n,get:r,remove:function(o,s){n(o,"",R({},s,{expires:-1}))},withAttributes:function(o){return K(this.converter,R({},this.attributes,o))},withConverter:function(o){return K(R({},this.converter,o),this.attributes)}},{attributes:{value:Object.freeze(t)},converter:{value:Object.freeze(e)}})}var de=K(Me,{path:"/"});const fe="bot-window",ce=()=>{switch(de.get(fe)){case"open":return!0;case"closed":return!1;default:return!1}},ue=e=>{de.set(fe,e)};let he=!1;function Be(e){he=e}function $e(){return he}const V=[];let S=ce();function J(){S=!0,ue("open"),V.forEach(function(e){e.call(window,S)})}function Q(){S=!1,ue("closed"),V.forEach(function(e){e.call(window,S)})}function X(){S?Q():J()}function Ge(e){ge({type:"CHAT_MESSAGE_FROM_GUEST",text:e})}function Fe(e){ge({type:"TRIGGER_STORY",story:e})}function ge(e){var n;const t=document.getElementById("chat-frame");(n=t==null?void 0:t.contentWindow)==null||n.postMessage(e,"*")}function me(e,t){switch(e){case"ON_CHAT_WINDOW_STATE_CHANGE":V.push(t);break;default:throw new Error("Unsupported event "+e)}}const Ye=Object.freeze(Object.defineProperty({__proto__:null,closeChatWindow:Q,enterGuestMessage:Ge,isChatbotLoaded:$e,openChatWindow:J,subscribe:me,toggleChatWindow:X,triggerStory:Fe},Symbol.toStringTag,{value:"Module"}));function Ke(){return navigator.userAgent.match(/(iPad|iPhone|iPod)/g)}const Ve=()=>{Ke()&&document.querySelectorAll("html, body").forEach(e=>{e.classList.add("iOS-device")})},Je=e=>{"gtag"in window&&typeof window.gtag=="function"?window.gtag("event","",e):"dataLayer"in window&&Array.isArray(window.dataLayer)&&window.dataLayer.push(e)},Qe=(e,t)=>{window.addEventListener("message",n=>{const r=n.data;switch(r.type){case"webclient.expand.window":e(r.devices);break;case"webclient.change.url":t(r.url);break;case"google.tag.event":Je(r.payload);break}},!1)},{document:Xe}=_e;function Ze(e){z(e,"svelte-sr5aex","#chatbot-window.svelte-sr5aex{font-size:16px}")}function et(e){let t,n,r,o,s,a,d,l;return s=new qe({props:{assetsUrl:e[2],open:e[3],onToggle:X}}),d=new Pe({props:{server:e[0],referrer:e[1],assetsUrl:e[2],open:e[3],onToggle:X}}),{c(){t=m("link"),r=E(),o=m("div"),se(s.$$.fragment),a=E(),se(d.$$.fragment),f(t,"rel","stylesheet"),f(t,"href",n=`${e[2]}/custom.css`),f(o,"id","chatbot-window"),f(o,"class","svelte-sr5aex")},m(i,c){v(Xe.head,t),y(i,r,c),y(i,o,c),$(s,o,null),v(o,a),$(d,o,null),l=!0},p(i,[c]){(!l||c&4&&n!==(n=`${i[2]}/custom.css`))&&f(t,"href",n);const u={};c&4&&(u.assetsUrl=i[2]),c&8&&(u.open=i[3]),s.$set(u);const g={};c&1&&(g.server=i[0]),c&2&&(g.referrer=i[1]),c&4&&(g.assetsUrl=i[2]),c&8&&(g.open=i[3]),d.$set(g)},i(i){l||(B(s.$$.fragment,i),B(d.$$.fragment,i),l=!0)},o(i){ie(s.$$.fragment,i),ie(d.$$.fragment,i),l=!1},d(i){i&&(w(r),w(o)),w(t),G(s),G(d)}}}function tt(e,t,n){let{server:r}=t,{referrer:o}=t,{assetsUrl:s=r?r.split("?")[0]:void 0}=t;Ve();let a=ce();me("ON_CHAT_WINDOW_STATE_CHANGE",function(c){n(3,a=c)});function d(i){const c=window.innerWidth,u=i==null||i==="all",g=i==="desktop"&&c>=768,b=i==="mobile"&&c<768;(u||g||b)&&J()}function l(i){window.innerWidth<768&&Q(),document.location.href=i}return Qe(d,l),e.$$set=i=>{"server"in i&&n(0,r=i.server),"referrer"in i&&n(1,o=i.referrer),"assetsUrl"in i&&n(2,s=i.assetsUrl)},[r,o,s,a]}class nt extends Y{constructor(t){super(),F(this,t,tt,et,P,{server:0,referrer:1,assetsUrl:2},Ze)}}const rt=e=>e.replace(/\/embed\/bundle\.js/,""),ot=e=>{var t;return(t=e.dataset)==null?void 0:t.server},it=e=>{if(e&&"src"in e&&typeof e.src=="string")return ot(e)||rt(e.src)},st=document.querySelector("script#chatbot"),pe=it(st);window.chatbot=Ye;const ve=()=>{console.log("Chatbot is loading from",pe),new nt({target:document.body,props:{server:pe,referrer:window.location.href}}),Be(!0)},we=(e=0)=>{e>=3||document.readyState==="complete"?setTimeout(ve,1e3):setTimeout(()=>{we(e+1)},1e3)};we();var D=document.getElementById("chatbot");D&&"src"in D&&typeof D.src=="string"&&D.src.indexOf("caller=bookmarklet")>0&&setTimeout(ve,500)})();
18
+ `,d(t,"class","svelte-f0h0jd"),d(r,"class","svelte-f0h0jd")},m(o,s){y(o,t,s),y(o,n,s),y(o,r,s)},p:h,d(o){o&&(b(t),b(n),b(r))}}}function Ie(e){let t,n,r,o,s,a,f,l,i,c,u,g;return{c(){t=m("div"),n=m("div"),r=m("img"),s=E(),a=m("div"),a.innerHTML='<svg viewBox="-2 -2 24 24" aria-label="Close window icon" class="svelte-f0h0jd"><path d="M0,0L20,20M20,0L0,20" class="svelte-f0h0jd"></path></svg>',f=E(),l=m("iframe"),x(r.src,o=`${e[3]}/logo.svg`)||d(r,"src",o),d(r,"alt","Logo"),d(r,"class","logo svelte-f0h0jd"),d(a,"aria-label","Close chat window"),d(a,"role","button"),d(a,"class","bot-border-close-icon svelte-f0h0jd"),d(a,"tabindex",0),d(n,"class","header svelte-f0h0jd"),d(l,"id","chat-frame"),d(l,"title","Chat"),d(l,"class","bot svelte-f0h0jd"),x(l.src,i=`${e[0]}${e[0].indexOf("?")===-1?"?":"&"}referrer=${encodeURIComponent(e[1]??"")}&windowHeight=${le()}&windowWidth=${ae()}`)||d(l,"src",i),d(l,"frameborder","0"),d(l,"allow","microphone"),l.allowFullscreen=!0,d(t,"class","bot-border svelte-f0h0jd"),d(t,"aria-hidden",c=e[2]?"false":"true"),te(t,"closed",!e[2])},m(w,_){y(w,t,_),v(t,n),v(n,r),v(n,s),v(n,a),v(t,f),v(t,l),u||(g=[W(a,"click",function(){A(e[4])&&e[4].apply(this,arguments)}),W(a,"keydown",e[5])],u=!0)},p(w,_){e=w,_&8&&!x(r.src,o=`${e[3]}/logo.svg`)&&d(r,"src",o),_&3&&!x(l.src,i=`${e[0]}${e[0].indexOf("?")===-1?"?":"&"}referrer=${encodeURIComponent(e[1]??"")}&windowHeight=${le()}&windowWidth=${ae()}`)&&d(l,"src",i),_&4&&c!==(c=e[2]?"false":"true")&&d(t,"aria-hidden",c),_&4&&te(t,"closed",!e[2])},d(w){w&&b(t),u=!1,k(g)}}}function Re(e){let t;function n(s,a){return s[0]?Ie:We}let r=n(e),o=r(e);return{c(){o.c(),t=ke()},m(s,a){o.m(s,a),y(s,t,a)},p(s,[a]){r===(r=n(s))&&o?o.p(s,a):(o.d(1),o=r(s),o&&(o.c(),o.m(t.parentNode,t)))},i:h,o:h,d(s){s&&b(t),o.d(s)}}}function ae(){try{return window.innerWidth}catch{return-1}}function le(){try{return window.innerHeight}catch{return-1}}function De(e,t,n){let{server:r}=t,{referrer:o}=t,{open:s}=t,{assetsUrl:a}=t,{onToggle:f}=t;function l(i){const c=i.key;(c==="ArrowDown"||c==="ArrowRight"||c==="Enter"||c===" "||c==="Space")&&(i.stopPropagation(),f())}return e.$$set=i=>{"server"in i&&n(0,r=i.server),"referrer"in i&&n(1,o=i.referrer),"open"in i&&n(2,s=i.open),"assetsUrl"in i&&n(3,a=i.assetsUrl),"onToggle"in i&&n(4,f=i.onToggle)},[r,o,s,a,f,l]}class Pe extends Y{constructor(t){super(),F(this,t,De,Re,P,{server:0,referrer:1,open:2,assetsUrl:3,onToggle:4},Le)}}function ze(e){z(e,"svelte-2hl2mw",`.svelte-2hl2mw,.svelte-2hl2mw:before,.svelte-2hl2mw:after{box-sizing:border-box}.chat-button-wrapper.svelte-2hl2mw{position:fixed;top:var(--fab-top-mobile, var(--fab-top, auto));right:var(--fab-right-mobile, var(--fab-right, 1.5em));bottom:var(--fab-bottom-mobile, var(--fab-bottom, 1.5em));left:var(--fab-left-mobile, var(--fab-left, auto));width:var(--fab-size-mobile, var(--fab-size, 5em));height:var(--fab-size-mobile, var(--fab-size, 5em));z-index:999}@media screen and (min-width: 768px){.chat-button-wrapper.svelte-2hl2mw{top:var(--fab-top, auto);right:var(--fab-right, 1.5em);bottom:var(--fab-bottom, 1.5em);left:var(--fab-left, auto);width:var(--fab-size, 6em);height:var(--fab-size, 6em)}}.chat-button.svelte-2hl2mw{display:block;height:100%;cursor:pointer;border-radius:50%;box-shadow:9px 9px 16px rgba(0, 0, 0, 0.25);transition:transform 100ms,
19
+ box-shadow 100ms}.chat-button.svelte-2hl2mw:hover{box-shadow:16px 16px 16px rgba(0, 0, 0, 0.2);transform:translateY(-2px)}`)}function Ne(e){let t,n,r,o,s,a;return{c(){t=m("div"),n=m("img"),d(n,"class","chat-button svelte-2hl2mw"),d(n,"alt","Open chat window"),x(n.src,r=`${e[0]}/fab.svg`)||d(n,"src",r),d(t,"class","chat-button-wrapper svelte-2hl2mw"),d(t,"tabindex","0"),d(t,"role","button"),d(t,"aria-label","Open chat window"),d(t,"aria-expanded",o=e[2]?"true":"false")},m(f,l){y(f,t,l),v(t,n),s||(a=[W(t,"click",function(){A(e[1])&&e[1].apply(this,arguments)}),W(t,"keydown",e[3])],s=!0)},p(f,[l]){e=f,l&1&&!x(n.src,r=`${e[0]}/fab.svg`)&&d(n,"src",r),l&4&&o!==(o=e[2]?"true":"false")&&d(t,"aria-expanded",o)},i:h,o:h,d(f){f&&b(t),s=!1,k(a)}}}function He(e,t,n){let{assetsUrl:r}=t,{onToggle:o}=t,{open:s}=t;function a(f){const l=f.key;(l==="ArrowDown"||l==="ArrowRight"||l==="Enter"||l===" "||l==="Space")&&(f.stopPropagation(),o())}return e.$$set=f=>{"assetsUrl"in f&&n(0,r=f.assetsUrl),"onToggle"in f&&n(1,o=f.onToggle),"open"in f&&n(2,s=f.open)},[r,o,s,a]}class qe extends Y{constructor(t){super(),F(this,t,He,Ne,P,{assetsUrl:0,onToggle:1,open:2},ze)}}/*! js-cookie v3.0.5 | MIT */function R(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)e[r]=n[r]}return e}var Me={read:function(e){return e[0]==='"'&&(e=e.slice(1,-1)),e.replace(/(%[\dA-F]{2})+/gi,decodeURIComponent)},write:function(e){return encodeURIComponent(e).replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,decodeURIComponent)}};function K(e,t){function n(o,s,a){if(!(typeof document>"u")){a=R({},t,a),typeof a.expires=="number"&&(a.expires=new Date(Date.now()+a.expires*864e5)),a.expires&&(a.expires=a.expires.toUTCString()),o=encodeURIComponent(o).replace(/%(2[346B]|5E|60|7C)/g,decodeURIComponent).replace(/[()]/g,escape);var f="";for(var l in a)a[l]&&(f+="; "+l,a[l]!==!0&&(f+="="+a[l].split(";")[0]));return document.cookie=o+"="+e.write(s,o)+f}}function r(o){if(!(typeof document>"u"||arguments.length&&!o)){for(var s=document.cookie?document.cookie.split("; "):[],a={},f=0;f<s.length;f++){var l=s[f].split("="),i=l.slice(1).join("=");try{var c=decodeURIComponent(l[0]);if(a[c]=e.read(i,c),o===c)break}catch{}}return o?a[o]:a}}return Object.create({set:n,get:r,remove:function(o,s){n(o,"",R({},s,{expires:-1}))},withAttributes:function(o){return K(this.converter,R({},this.attributes,o))},withConverter:function(o){return K(R({},this.converter,o),this.attributes)}},{attributes:{value:Object.freeze(t)},converter:{value:Object.freeze(e)}})}var fe=K(Me,{path:"/"});const de="bot-window",ce=()=>{switch(fe.get(de)){case"open":return!0;case"closed":return!1;default:return!1}},ue=e=>{fe.set(de,e)};let he=!1;function Be(e){he=e}function $e(){return he}const V=[];let S=ce();function J(){S=!0,ue("open"),V.forEach(function(e){e.call(window,S)})}function Q(){S=!1,ue("closed"),V.forEach(function(e){e.call(window,S)})}function X(){S?Q():J()}function Ge(e){ge({type:"CHAT_MESSAGE_FROM_GUEST",text:e})}function Fe(e){ge({type:"TRIGGER_STORY",story:e})}function ge(e){var n;const t=document.getElementById("chat-frame");(n=t==null?void 0:t.contentWindow)==null||n.postMessage(e,"*")}function me(e,t){switch(e){case"ON_CHAT_WINDOW_STATE_CHANGE":V.push(t);break;default:throw new Error("Unsupported event "+e)}}const Ye=Object.freeze(Object.defineProperty({__proto__:null,closeChatWindow:Q,enterGuestMessage:Ge,isChatbotLoaded:$e,openChatWindow:J,subscribe:me,toggleChatWindow:X,triggerStory:Fe},Symbol.toStringTag,{value:"Module"}));function Ke(){return navigator.userAgent.match(/(iPad|iPhone|iPod)/g)}const Ve=()=>{Ke()&&document.querySelectorAll("html, body").forEach(e=>{e.classList.add("iOS-device")})},Je=e=>{"gtag"in window&&typeof window.gtag=="function"?window.gtag("event","",e):"dataLayer"in window&&Array.isArray(window.dataLayer)&&window.dataLayer.push(e)},Qe=(e,t)=>{window.addEventListener("message",n=>{const r=n.data;switch(r.type){case"webclient.expand.window":e(r.devices);break;case"webclient.change.url":t(r.url);break;case"google.tag.event":Je(r.payload);break}},!1)},{document:Xe}=_e;function Ze(e){z(e,"svelte-1vmieip",".bubble-chat.svelte-1vmieip{font-size:16px}")}function et(e){let t,n,r,o,s,a,f,l;return s=new qe({props:{assetsUrl:e[2],open:e[3],onToggle:X}}),f=new Pe({props:{server:e[0],referrer:e[1],assetsUrl:e[2],open:e[3],onToggle:X}}),{c(){t=m("link"),r=E(),o=m("div"),se(s.$$.fragment),a=E(),se(f.$$.fragment),d(t,"rel","stylesheet"),d(t,"href",n=`${e[2]}/custom.css`),d(o,"class","bubble-chat svelte-1vmieip")},m(i,c){v(Xe.head,t),y(i,r,c),y(i,o,c),$(s,o,null),v(o,a),$(f,o,null),l=!0},p(i,[c]){(!l||c&4&&n!==(n=`${i[2]}/custom.css`))&&d(t,"href",n);const u={};c&4&&(u.assetsUrl=i[2]),c&8&&(u.open=i[3]),s.$set(u);const g={};c&1&&(g.server=i[0]),c&2&&(g.referrer=i[1]),c&4&&(g.assetsUrl=i[2]),c&8&&(g.open=i[3]),f.$set(g)},i(i){l||(B(s.$$.fragment,i),B(f.$$.fragment,i),l=!0)},o(i){ie(s.$$.fragment,i),ie(f.$$.fragment,i),l=!1},d(i){i&&(b(r),b(o)),b(t),G(s),G(f)}}}function tt(e,t,n){let{server:r}=t,{referrer:o}=t,{assetsUrl:s=r?r.split("?")[0]:void 0}=t;Ve();let a=ce();me("ON_CHAT_WINDOW_STATE_CHANGE",function(c){n(3,a=c)});function f(i){const c=window.innerWidth,u=i==null||i==="all",g=i==="desktop"&&c>=768,w=i==="mobile"&&c<768;(u||g||w)&&J()}function l(i){window.innerWidth<768&&Q(),document.location.href=i}return Qe(f,l),e.$$set=i=>{"server"in i&&n(0,r=i.server),"referrer"in i&&n(1,o=i.referrer),"assetsUrl"in i&&n(2,s=i.assetsUrl)},[r,o,s,a]}class nt extends Y{constructor(t){super(),F(this,t,tt,et,P,{server:0,referrer:1,assetsUrl:2},Ze)}}const rt=e=>e.replace(/\/embed\/bundle\.js/,""),ot=e=>{var t;return(t=e.dataset)==null?void 0:t.server},it=e=>{if(e&&"src"in e&&typeof e.src=="string")return ot(e)||rt(e.src)},st=document.querySelector("script#chatbot"),pe=it(st);window.chatbot=Ye;const ve=()=>{console.log("Chatbot is loading from",pe),new nt({target:document.body,props:{server:pe,referrer:window.location.href}}),Be(!0)},be=(e=0)=>{e>=3||document.readyState==="complete"?setTimeout(ve,1e3):setTimeout(()=>{be(e+1)},1e3)};be();var D=document.getElementById("chatbot");D&&"src"in D&&typeof D.src=="string"&&D.src.indexOf("caller=bookmarklet")>0&&setTimeout(ve,500)})();
package/dist/index.js CHANGED
@@ -123,14 +123,19 @@ const serveStaticOptions = {
123
123
  },
124
124
  };
125
125
  const isFabVisible = ({ fabVisible = true }) => fabVisible;
126
- const onStartChat = (socket, props, bot, clientName, environment, logger) => async ({ sessionId: defaultSessionId, userId: defaultUserId, }) => {
126
+ const onStartChat = (socket, props, bot, clientName, environment, logger) => async ({ sessionId: sessionIdFromClient, sessionIdToTerminate, // passed if the user wants to restart the chat
127
+ userId: defaultUserId, }) => {
127
128
  const locale = (0, extractLocale_1.default)(socket.handshake.query, socket.request.headers['accept-language']);
128
129
  const sessionsCollection = bot.store.db.collection('sessions');
129
- const { sessionId, sessionInfo: defaultSessionInfo, isNew, } = await (0, requestSessionData_1.default)(defaultSessionId, socket.handshake.query, sessionsCollection, clientName, locale, props);
130
+ const { sessionId, sessionInfo: defaultSessionInfo, isNew, } = await (0, requestSessionData_1.default)(sessionIdFromClient, socket.handshake.query, sessionsCollection, clientName, locale, props);
130
131
  // create a channel for each session
131
132
  socket.join(sessionId);
132
133
  const sessionInfo = await (0, createSessionInfo_1.default)(socket, clientName, environment, defaultSessionInfo, defaultUserId, locale, props)();
133
134
  const session = await bot.createSession(sessionId, sessionInfo);
135
+ if (sessionIdToTerminate) {
136
+ socket.leave(sessionIdToTerminate);
137
+ await session.dispatch((0, engine_domain_1.guestDisconnected)(sessionIdToTerminate));
138
+ }
134
139
  // sending persisted state to client
135
140
  const previousConversations = await (0, loadPreviousConversation_1.default)(bot.store, sessionId);
136
141
  socket.emit('restore-client-state', {
@@ -155,25 +160,20 @@ const onStartChat = (socket, props, bot, clientName, environment, logger) => asy
155
160
  devices: props.expandChatWindowAtStart,
156
161
  });
157
162
  }
158
- // forward actions from webclient
159
- socket.on('action', async (action) => {
163
+ registerListener(socket, 'action', async (action) => {
160
164
  await session.dispatch(JSON.parse(action));
161
165
  });
162
- socket.on('disconnect', async () => {
166
+ registerListener(socket, 'disconnect', async () => {
163
167
  await session.dispatch((0, engine_domain_1.guestDisconnected)(sessionId));
164
168
  });
165
- socket.on('conversation-rating', async (rating) => {
166
- sessionsCollection.updateOne({ _id: sessionId }, {
167
- $set: {
168
- 'sessionInfo.client.payload.conversationRating': rating,
169
- },
170
- });
169
+ registerListener(socket, 'conversation-rating', async (rating) => {
170
+ sessionsCollection.updateOne({ _id: sessionId }, { $set: { 'sessionInfo.client.payload.conversationRating': rating } });
171
171
  session.dispatch({
172
172
  type: engine_domain_1.ActionTypes.CONVERSATION_RATING_FROM_GUEST,
173
173
  payload: { rating },
174
174
  });
175
175
  });
176
- socket.on('audio-message', async (buffer) => {
176
+ registerListener(socket, 'audio-message', async (buffer) => {
177
177
  if (props.speech) {
178
178
  try {
179
179
  const text = await (0, speechToText_1.default)(props.speech, session.translator.locale, buffer);
@@ -188,6 +188,11 @@ const onStartChat = (socket, props, bot, clientName, environment, logger) => asy
188
188
  }
189
189
  });
190
190
  };
191
+ const registerListener = (socket, event, listener) => {
192
+ // remove all listeners for the event to avoid multiple listeners
193
+ socket.removeAllListeners(event);
194
+ socket.on(event, listener);
195
+ };
191
196
  const sendConfigurationToClient = (socket, props, bot, clientName) => {
192
197
  // sending active language and translations to client
193
198
  const locale = (0, extractLocale_1.default)(socket.handshake.query, socket.request.headers['accept-language']);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@botfabrik/engine-webclient",
3
- "version": "4.66.0",
3
+ "version": "4.66.2",
4
4
  "description": "Webclient for Botfabriks Bot Engine",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -20,9 +20,9 @@
20
20
  "dev:embed": "tsx --watch ./run-embed-local.ts"
21
21
  },
22
22
  "dependencies": {
23
- "@botfabrik/engine-core": "^4.66.0",
23
+ "@botfabrik/engine-core": "^4.66.1",
24
24
  "@botfabrik/engine-domain": "^4.64.0",
25
- "@botfabrik/engine-transcript-export": "^4.66.0",
25
+ "@botfabrik/engine-transcript-export": "^4.66.1",
26
26
  "@botfabrik/engine-utils": "^4.64.0",
27
27
  "@google-cloud/speech": "^6.6.1",
28
28
  "accept-language-parser": "^1.5.0",
@@ -40,5 +40,5 @@
40
40
  "tsx": "^4.16.2",
41
41
  "typescript": "5.1.6"
42
42
  },
43
- "gitHead": "cd345fceb4010234b47b2b95991cb98121eac9d9"
43
+ "gitHead": "15c10cd6451213d44bbfdd27f59e28e132086ab3"
44
44
  }