@telia-ace/conversational-hub-bot-provider 0.0.12 → 0.0.13
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/{contact-method-e5c435a7.js → contact-method-429ef265.js} +5 -5
- package/{contact-method-77354cf2.mjs → contact-method-ae387667.mjs} +435 -492
- package/{index-b42c4c70.js → index-482ea30a.js} +1 -1
- package/{index-ad9aa727.mjs → index-93f64633.mjs} +2 -2
- package/index.js +1 -1
- package/index.mjs +1 -1
- package/package.json +1 -1
|
@@ -1211,4 +1211,4 @@ Valid keys: `+JSON.stringify(Object.keys(b),null," "));var A=me(I,K,P,H,M+"."+K
|
|
|
1211
1211
|
min-width: 100px;
|
|
1212
1212
|
`;class Xu{constructor(e){S(this,"cache",new Map);S(this,"subscriptions",[]);this.controller=e;const{events:n}=e.container.get("$widget"),r=n.subscribe("data-client:fetched",(i,o)=>{o.type==="contact-method"&&this.cache.set(o.response.id,o.response)});this.subscriptions.push(r)}getConversationLogs(){return this.controller.messages.reduce((n,r)=>{const i=fn(r),{key:o,content:s,type:a,sender:c,timestamp:u}=i.content,l=this.parseEntry(s,a,c,u);return l&&n.push(l),n},[])}parseEntry(e,n,r,i){const o=u=>{let l=[],d=[],f;if(Array.isArray(u)){const[g,v]=u;f=v}else f=u;return this.createMessageContent(f).length&&(d=[...d,this.createMessageContent(f)]),l=[...l,...this.createMessageOptions(f)],{messagesAsList:d,options:l}};let s=[],a=[];if(Array.isArray(e.items)){const{items:u}=e;u.forEach(l=>{const d=o(l);s=[...s,...d.options],a=[...a,...d.messagesAsList]})}else{const u=o(e);s=[...s,...u.options],a=[...a,...u.messagesAsList]}return{options:s,message:a.length?a.join(`
|
|
1213
1213
|
`):void 0,source:this.createMessageSource(n),alias:this.createAlias(n,r),timestamp:i}}createMessageSource(e){return e}createAlias(e,n){return e===dn.System?"system":(n==null?void 0:n.name)||"Me"}handleContactMethod(e){if(!this.cache.has(e))return;const n=this.cache.get(e);let r="";return r=this.appendText(r,`${n.clientName}:`),r=this.appendText(r,n.title),n.description&&(r=this.appendText(r,n.title)),r}getDetails(e,n=!0){if(!e)return"";const{header:r,title:i,label:o,description:s,text:a,html:c,body:u,contactMethodId:l}=e;let d="";if(l){const f=this.handleContactMethod(l.toString());f&&(d=this.appendText(d,f,n))}return r&&(d=this.appendText(d,r,n)),i&&(d=this.appendText(d,i,n)),s&&(d=this.appendText(d,s,n)),a&&(d=this.appendText(d,a,n)),o&&(d=this.appendText(d,o,n)),c&&(d=this.appendText(d,c,n)),u&&typeof u=="string"&&(d=this.appendText(d,u,n)),d}createMessageContent(e){let n="";return n=this.getDetails(e),n}createMessageOptions(e){let n=[],r=[];return Array.isArray(e==null?void 0:e.actions)?r=e.actions:typeof(e==null?void 0:e.actions)=="object"&&(r=Object.entries(e.actions).map(([i,o])=>({actionKey:i,label:o}))),r.length&&(n=r.map(i=>this.getDetails(i,!1))),n}appendText(e,n,r=!0){return r&&e.length?`${e}
|
|
1214
|
-
${n}`:e.length?`${e} ${n}`:n}dispose(){this.subscriptions.forEach(e=>{e()})}}class Jn{constructor(e,n){S(this,"id");S(this,"name");S(this,"avatar");S(this,"print",(e,n,r=null)=>{const i={name:this.name,avatar:this.avatar,id:this.id},o=fn(e,n);return r=r??o.timestamp,this.provider.createEntry(o.key,o.content,dn.Agent,i,r)});S(this,"typing",()=>this.provider.setTypingState({name:this.name,avatar:this.avatar}));this.provider=e,this.id=n.id||Ee(),this.name=n.name,this.avatar=n.avatar}update(e){var i;const{name:n,avatar:r}=e;r===null?this.avatar=void 0:r&&(this.avatar=r),n===null?this.name=void 0:n&&(this.name=n),(i=this.provider.controller)==null||i.events.dispatch("conversation:agent-updated",{agent:this})}}class Hr{constructor(e,n,r){S(this,"subscriptions",[]);S(this,"options");S(this,"user");this.name=e,this.container=n,this.controller=r,this.user=r==null?void 0:r.user,this.options={silent:!1}}static create(e,n,r){return new Hr(e,n,r)}createAgent(e={}){var n;if(this.controller){const r=this.controller.getAgentById(e.id),i=r?new Jn(this,{...r,...e}):new Jn(this,e);return r||(n=this.controller)==null||n.events.dispatch("conversation:agent-created",{agent:i}),i}}print(e){var n;return(n=this.controller)==null?void 0:n.print(e)}setTypingState(e,n){var r;return(r=this.controller)==null?void 0:r.setTypingState(e,n)}loading(){return this.controller?this.controller.loader():()=>()=>{}}createEntry(e,n,r,i,o){var s;return(s=this.controller)==null?void 0:s.createEntry(e,n,r,i,o)}dispose(){var e;process.env.NODE_ENV!=="production"&&console.log(`conversation-provider: dispose (${this.name})`),(e=this.controller)==null||e.disposeProvider(this),this.controller=null,this.subscriptions.forEach(n=>n())}isRehydrated(){var e;return((e=this.controller)==null?void 0:e.isRehydrated())||Promise.resolve(!1)}getHistory(){var e;return((e=this.controller)==null?void 0:e.getHistory())||[]}complete(){var e;(e=this.controller)==null||e.onCompleteProvider()}setOptions(e={silent:!1}){this.options=e}onUnreadMessage(e){var n;if(this.controller){const r=(n=this.controller)==null?void 0:n.onUnreadMessage(e);return this.subscriptions.push(r),()=>{r()}}}onMounted(e){var n;if(this.controller){const r=(n=this.controller)==null?void 0:n.events.subscribe("conversation:component-mount-changed",e);return this.subscriptions.push(r),e({},this.controller.getComponentMountedState()),()=>{r()}}}}const Go=t=>`conversation-${t}`;class Qu{constructor(){S(this,"_locking",Promise.resolve());S(this,"_locks",0)}isLocked(){return this._locks>0}lock(){this._locks+=1;let e;const n=new Promise(i=>e=()=>{this._locks-=1,i()}),r=this._locking.then(()=>e);return this._locking=this._locking.then(()=>n),r}}let ed=class{constructor(e,n,r){S(this,"sessionStorageKey");S(this,"locker",new Qu);S(this,"initialStoredAgents",[]);this.container=e,this.conversation=n,this.enabled=r,this.sessionStorageKey=Go(n.id),n.onStarted(async()=>{if(n.messages.length>0)return;const{agents:i}=await this.read(),o=[];i&&i.forEach(a=>{const c=n.providerIndex(a.providerName),u=c>-1?n.registeredProviders[c]:n.createProvider(a.providerName),l=new Jn(u,{name:a.name,avatar:a.avatar,id:a.id});o.push(l)});const{messages:s}=await this.read();s.forEach(a=>{switch(a.type){case"agent":{const c=o.find(u=>{var l;return u.id===((l=a.sender)==null?void 0:l.id)});c&&c.print(a.content.items||a.content,{key:a.key},a.timestamp);return}case"user":{n.user.print(a.content.items||a.content,{key:a.key},a.timestamp);return}case"system":default:n.print(a.content.items||a.content,a.timestamp)}})}),n.onMessageCreated(async(i,o)=>{this.write(o.message,"messages")}),n.events.subscribe("conversation:agent-created",async(i,o)=>{const s={id:o.agent.id,name:o.agent.name,avatar:o.agent.avatar,providerName:o.agent.provider.name};await this.write(s,"agents")}),n.events.subscribe("conversation:agent-updated",async(i,o)=>{const{agents:s}=await this.read();await this.write([...s.map(a=>a.id===o.agent.id?{...a,name:o.agent.name,avatar:o.agent.avatar}:a)],"agents","update")})}setInitialData(e){this.initialStoredAgents=e.agents}async isRehydrated(){const{messages:e}=await this.read();return e.length>0}getStoredAgent(e){if(this.enabled)return this.initialStoredAgents.find(n=>n.id===e)}async write(e,n,r="add"){if(!this.enabled)return;const i=await this.locker.lock();return rt(this.container,this.sessionStorageKey,de.Necessary).then(async o=>{if(r==="add"){const s=await this.read();if(n==="messages"&&s.messages.findIndex(c=>c.key===e.key)>-1){i();return}const a={...s};return n==="messages"?a.messages=[...a.messages,e]:n==="agents"&&(a.agents=[...a.agents,e]),o({...s,...a}).then(()=>{i()})}if(r==="update"&&n==="agents"){const s=await this.read();return o({...s,agents:e}).then(()=>{i()})}return o(e).then(()=>{i()})})}async read(){return Pe(this.container,this.sessionStorageKey).then(e=>e||{messages:[],agents:[]})}};class td{constructor(e){S(this,"print",(e,n,r=null)=>{const i=fn(e,n);return r=r??i.timestamp,this.controller.createEntry(i.key,i.content,dn.User,void 0,r)});this.controller=e}}const Xn=async(t,e,n)=>{const r=await t.getAsync("conversation"),i=await t.getAsync("components"),o=r.controllers.find(s=>s.conversation.id===e);if(o){const s=[...o.conversation.providers];s.forEach(c=>{o.conversation.setProviderOptions(c,{silent:!0})}),o.conversation.queueProviders(s),o.conversation.setProviders([n]);const a=i.components().ofType("conversation");i.write({key:"setConversationProvider",attributes:{properties:{providers:[n]}},target:a,provider:"localStorage"})}};class nd{constructor(e){this.writer=e}update(e){const n=this.getNormalizedSettings(e);this.writer(n)}remove(){this.writer(null)}getNormalizedSettings(e){return typeof e=="string"?{body:e}:e.length>-1&&typeof e=="object"?{items:e}:e}}var dn=(t=>(t.User="user",t.Agent="agent",t.System="system",t))(dn||{});const fn=(t,e)=>{let n,r=(e==null?void 0:e.key)||Ee(),i=Date.now();if(Array.isArray(t)&&t.length>-1)typeof t[0]=="string"?n={items:[t]}:n={items:t};else if(typeof t=="string")n={body:t};else if(t=t||{},t.type)n={...t};else{if(n={body:t.body,actions:t.actions,title:t.title},t.key&&(r=t.key),t.timestamp&&(i=t.timestamp),typeof t.form=="function"){const o=je.create(r);t.form(o);const s=o.get();n.form=s}t.timestamp===null&&(i=null)}return{content:n,key:r,timestamp:i}},Fi=(t,e)=>{if(!e)return;const n=JSON.stringify(e),r=t.findIndex(i=>n===JSON.stringify(i));if(r>-1)return t.splice(r,1)};class rd{constructor(e,n,r){S(this,"formHandlers",{});S(this,"user",new td(this));S(this,"events");S(this,"providers",[]);S(this,"active",!1);S(this,"queuedProviders",[]);S(this,"registeredProviders",[]);S(this,"loaders",0);S(this,"componentMounted",!1);S(this,"store");S(this,"messages",[]);S(this,"typingActors",[]);S(this,"conversationHistory");S(this,"print",(e,n=null)=>{const r=fn(e);return n=n??r.timestamp,this.createEntry(r.key,r.content,"system",void 0,n)});this.container=e,this.id=n;const i=e.get("$widget");this.events=i.events.createChild(this),this.store=new ed(e,this,r.rehydrate),this.conversationHistory=new Xu(this)}setInitialStorage(e){this.store.setInitialData(e)}setProviders(e){const n=[],r=[];this.providers.reduce((i,o)=>(e.indexOf(o)===-1&&i.push(o),i),[]).forEach(i=>{const o=this.providers.indexOf(i);o>-1&&(n.push(i),this.providers.splice(o,1))}),e.forEach(i=>{this.providers.indexOf(i)===-1&&(r.push(i),this.providers.push(i))}),(r.length||n.length)&&this.events.dispatch("conversation:providers-changed",{added:r,removed:n})}createProvider(e){const n=this.providerIndex(e);if(n>-1)return this.registeredProviders[n];const r=Hr.create(e,this.container,this);return this.registeredProviders.push(r),r}providerIndex(e){return this.registeredProviders.findIndex(n=>n.name===e)}getAgentById(e){if(e)return this.store.getStoredAgent(e)}dispose(){this.conversationHistory.dispose(),this.registeredProviders.forEach(e=>e.dispose()),this.messages=[],this.events.dispatch("conversation:controller-disposed",this),this.active=!1}onDispose(e){return this.events.subscribe("conversation:controller-disposed",e)}onStarted(e){return this.events.subscribe("conversation:started",e)}onMessageCreated(e){return this.events.subscribe("conversation:message-created",e)}isRehydrated(){return this.store.isRehydrated()}disposeProvider(e){const n=this.providerIndex(e.name);n>-1&&this.registeredProviders.splice(n,1),this.events.dispatch("conversation:providers-changed",{removed:[e.name]}),this.registeredProviders.length||this.dispose()}onProvidersChange(e){return this.events.subscribe("conversation:providers-changed",e)}setComponentMountedState(e){this.componentMounted!==e&&(this.componentMounted=e,e&&(this.events.dispatch("conversation:unread-message",!1),this.events.dispatch("conversation:started",!0),this.active=!0),this.events.dispatch("conversation:component-mount-changed",e))}setProviderOptions(e,n){const r=this.providerIndex(e);r>-1&&this.registeredProviders[r].setOptions(n)}changeProvider(e){this.registeredProviders.find(r=>r.name===e)&&Xn(this.container,this.id,e)}queueProviders(e){this.queuedProviders=e}onCompleteProvider(){const e=this.queuedProviders.pop();e&&Xn(this.container,this.id,e)}getComponentMountedState(){return this.componentMounted}onUnreadMessage(e){return this.events.subscribe("conversation:unread-message",e)}createEntry(e,n,r,i,o){const s={key:e,content:n,type:r,sender:i||null,timestamp:o||o===null?o:Date.now()};this.messages.push(s),s.type==="agent"&&Fi(this.typingActors,i);const a=new nd(c=>{if(c!==null){const{timestamp:u=void 0,...l}=c;s.content=l,u&&(s.timestamp=u)}else{const u=this.messages.indexOf(s);s.content=null,u>-1&&this.messages.splice(u,1)}this.events.dispatch("conversation:message-updated",{message:s}),this.update()});return this.events.dispatch("conversation:message-created",{message:s}),this.update(),this.componentMounted||this.events.dispatch("conversation:unread-message",!0),a}update(){this.events.dispatch("conversation:updated",{messages:this.messages,loading:this.loaders>0,typingActors:this.typingActors})}getMessageStream(){return{messages:this.messages,loading:this.loaders>0,typingActors:this.typingActors}}setTypingState(e,n){return this.typingActors.indexOf(e)===-1&&(this.typingActors.push(e),this.update()),()=>{Fi(this.typingActors,e),this.update()}}loader(){this.loaders=this.loaders+1;let e=!1;return this.loaders===1&&this.update(),()=>{e||(e=!0,this.loaders=this.loaders-1,this.loaders===0&&this.update())}}submitForm(e,n){this.formHandlers[e]={...this.formHandlers[e],submit:n}}validateForm(e,n){this.formHandlers[e]={...this.formHandlers[e],validate:n}}getHistory(){return this.conversationHistory.getConversationLogs()}}const qi=t=>{const{implementation:e}=t.get("$widget"),r=(e.container.get("modals")||[]).map(i=>i.close());return Promise.all(r)};var Qn=(t=>(t.LinkList="link-list",t.Separator="separator",t.ButtonList="button-list",t.ItemList="item-list",t.Text="text",t.HTML="html",t.VideoRequest="video-request",t))(Qn||{});const id=(t,e,n)=>t.getAsync("componentResolver").then(async r=>{(await hn.getInstance(t)).addSubscription(r.registerComponent(e,m.lazy(()=>n)))}),od=(t,e)=>{const n=t.split("_contact");return e.widgets.get(n[0])},zr=t=>{const e=t.get("$widget"),{name:n,implementation:r}=t.get("$widget"),i=n.indexOf("_contact")>-1?od(n,r):e,{data:o}=t.get("$settings"),{trigger:s}=i.container.get("$settings"),a=`${n.replace("_contact-method","").replace("_contact","")}_contact-method`,c=r.widgets.get(a);return c&&!s?{chatWidget:c,mainWidget:i,data:o}:{mainWidget:i,data:o}},sd=t=>{const{chatWidget:e}=zr(t);return!!e},Yi=(t,e,n)=>{const{mainWidget:r,data:i,chatWidget:o}=zr(t);return o?o.state==="activated"?o.invoke("open").then(()=>{o.container.getAsync("conversation").then(s=>{s.navigateToConversationIfActive(e.id).then(()=>qi(t))})}):o.activate().then(()=>{const{trigger:s}=o.container.get("$settings");return s.action="hide",o.invoke("setSettings",()=>({data:i,trigger:s,activate:!0})).then(()=>o.container.getAsync("components").then(a=>{const c=a.components().ofType("contact-method");a.write({key:"setContactMethodId",attributes:{properties:{id:e.id,guideId:e.guideId}},target:c,provider:"localStorage"});const u=a.components().ofType("conversation");a.write({key:"setConversationProvider",attributes:{properties:{providers:[e.clientName]}},target:u,provider:"localStorage"})}))}).then(()=>o.invoke("attach",{key:"contact-method",triggerDOMElement:n,withRenderState:"open"})).then(()=>(rt(o.container,"activeStickyWidget",de.Necessary,{medium:pe.Local,scope:Kt.Implementation}).then(s=>s(o.name)),o.container.getAsync("conversation").then(s=>{s.setConversationEndedBehavior(Ft.Deactivate)}).then(()=>qi(t)).then(()=>!1))):(r.container.getAsync("conversation").then(s=>s.navigateToConversationIfActive(e.id).then(()=>s.setConversationEndedBehavior(Ft.Navigate))),!o)},ad=(t,e,n="conversation")=>{const{mainWidget:r,chatWidget:i}=zr(t);return i?i.container.getAsync("router").then(o=>{o.navigate(n,{id:e.id})}):r.container.getAsync("conversation").then(o=>{var s;(s=o.setConversationEndedBehavior(Ft.Navigate))==null||s.then(()=>{r.container.getAsync("router").then(a=>{r.container.getAsync("components").then(c=>{const u=c.components().ofType("conversation");c.write({key:"setConversationProvider",attributes:{properties:{providers:[e.clientName]}},target:u,provider:"localStorage"})}).then(()=>{a.navigate(n,{id:e.id})})})})})},ut="conversations";var Ft=(t=>(t.Deactivate="deactivate",t.Navigate="navigate",t.None="none",t))(Ft||{});class hn{constructor(e,n){S(this,"events");S(this,"controllers",[]);S(this,"providers",[]);S(this,"disposeProviders",{});S(this,"subscriptions",[]);S(this,"storageWriter",null);S(this,"router",null);S(this,"buttonQuery",null);S(this,"sessionInfo",null);this.container=e,this.components=n;const r=e.get("$widget");this.events=r.events.createChild(this)}initialize(){rt(this.container,ut,de.Necessary,{medium:pe.Local}).then(e=>this.storageWriter=e),Pe(this.container,ut,pe.Local).then(e=>{this.buttonQuery=this.components.components().ofType("conversation-return-button"),e&&(this.sessionInfo=e,e.id&&e.route&&this.writeToComponents({active:!0,alert:{show:!1}}))}),this.container.getAsync("router").then(e=>this.router=e),this.events.subscribe("conversation:ended",(e,n)=>{var r,i,o;switch((r=this.sessionInfo)==null?void 0:r.conversationEndedBehavior){case"deactivate":this.container.get("$widget").deactivate();break;case"navigate":const a=(i=this.router)==null?void 0:i.getInitialRoute();a&&((o=this.router)==null||o.navigate(a.name));break}this.writeToComponents({active:!1}),this.sessionInfo=null,this.storageWriter&&this.storageWriter()})}addSubscription(e){this.subscriptions.push(e)}static getInstance(e,n="conversation"){return nt(e)(()=>e.getAsync(n).then(r=>{let i=r;return i||Gi.getInstance(e).then(o=>(i=new hn(e,o),i.initialize(),e.registerAsync(n,()=>i),i))}))}navigateToConversationIfActive(e){return Pe(this.container,ut,pe.Local).then(n=>{var r;if(n&&n.id===e&&n.route){const{name:i,params:o}=n.route;(r=this.router)==null||r.navigate(i,o)}})}setConversationEndedBehavior(e){return Pe(this.container,ut,pe.Local).then(n=>{let r=n;return r?r.conversationEndedBehavior=e:r={conversationEndedBehavior:e},this.sessionInfo=r,this.storageWriter&&this.storageWriter(this.sessionInfo)||Promise.resolve()})}async createController(e,n){const r=Go(e),{agents:i}=await Pe(this.container,r)||{agents:[]},o=this.controllers.findIndex(a=>a.conversation.id===e);let s;return o>-1?s=this.controllers[o].conversation:s=new rd(this.container,e,n),s.setInitialStorage({agents:i||[]}),s}registerProvider(e,n){const r={name:e,handler:n};this.providers.push(r),this.controllers.filter(i=>i.conversation.providers.indexOf(e)>-1).forEach(i=>{this.invokeHandler(r,i)})}registerController(e,n){const r=this.controllers.findIndex(o=>o.conversation.id===e.id);let i;if(r<0){i={conversation:e,component:n},this.controllers.push(i);const o=s=>{s&&this.providers.filter(a=>s.indexOf(a.name)>-1).forEach(a=>{this.invokeHandler(a,i)})};return this.subscriptions.push(e.onDispose((s,a)=>{const c=this.controllers.findIndex(u=>u.conversation===a);c>-1&&this.controllers.splice(c,1),this.components.components().ofType("conversation-return-button").select().writeProperties({active:!1}),this.events.dispatch("conversation:ended",{},{bubbles:!0})})),this.subscriptions.push(e.onProvidersChange((s,a)=>{const{added:c,removed:u=[]}=a;u.forEach(l=>{(this.disposeProviders[l]||[]).forEach(d=>{d()})}),o(c)})),this.subscriptions.push(e.onStarted((s,a)=>{var u,l;const c={id:e.id,route:(u=this.router)==null?void 0:u.getRouteData(),conversationEndedBehavior:(l=this.sessionInfo)==null?void 0:l.conversationEndedBehavior};this.sessionInfo=c,this.storageWriter&&this.storageWriter(c),this.writeToComponents({active:a})})),this.subscriptions.push(e.onUnreadMessage((s,a)=>{this.events.dispatch("conversation:unread-message",a),this.writeToComponents({alert:{show:a}})})),o(e.providers),!0}return i=this.controllers[r],!1}writeToComponents(e,n="conversationReturnButtonState"){this.buttonQuery&&this.components.write({key:"conversationReturnButtonState",attributes:{properties:e},target:this.buttonQuery,provider:"localStorage"})}invokeHandler(e,n){const r=e.handler(n.conversation.createProvider(e.name),n.component);r&&(this.disposeProviders[e.name]||(this.disposeProviders[e.name]=[]),this.disposeProviders[e.name].push(r))}getComponentRoute(){return Pe(this.container,ut,pe.Local).then(e=>e==null?void 0:e.route)}dispose(){Object.keys(this.disposeProviders).forEach(e=>{this.disposeProviders[e].forEach(n=>{n()})}),this.subscriptions.forEach(e=>{e()}),this.controllers=[],this.providers=[]}static async handleContactMethodClick(e,n,r,i){if(sd(n)){e.preventDefault();let o=document.getElementById("humany-dynamic-anchor");o||(o=document.createElement("a"),o.setAttribute("href","#"),o.id="humany-dynamic-anchor",document.body.appendChild(o)),Yi(n,r,o)}Yi(n,r)}static async handleContactMethodSubmit(e,n){var r,i;return(i=(r=n==null?void 0:n.body.form.meta)==null?void 0:r.conversation)!=null&&i.id?Xn(e,n.body.form.meta.conversation.id,n.clientName):ad(e,n)}}class cd{constructor(e){S(this,"enabled",!0);S(this,"botProviderGlobalStateKey","bot-provider-global-state");S(this,"botProviderLocalStateKey","bot-provider-local-state");S(this,"botProviderEntriesKey","bot-provider-entries");S(this,"botProviderMetaStateKey","bot-provider-conversation-meta");this.container=e}getKey(e){let n;switch(e){case"localState":n=this.botProviderLocalStateKey;break;case"globalState":n=this.botProviderGlobalStateKey;break;case"entries":n=this.botProviderEntriesKey;break;case"meta":n=this.botProviderMetaStateKey;break}return n}async read(e){const n=this.getKey(e);if(!(!this.enabled||!n))return Pe(this.container,n)}async write(e,n){const r=this.getKey(n);if(!this.enabled||!r)return;(await rt(this.container,r,de.Necessary))(e)}}var qt=(t=>(t.ContactMethod="ace-conversational-hub-contact-method",t))(qt||{});const ld=({isUser:t,items:e=[],meta:n={}})=>{const r=Ee();return{id:r,isUser:t,items:e.map(o=>({id:o.id||Ee(),isUser:t,groupId:r,message:o.message||[]})),meta:n}},ud=(t,{submit:e,errors:n,meta:r})=>{var i;if((i=t==null?void 0:t.body)!=null&&i.form){const{body:o}=t,s=new je(o.form);return o.form.layout.submit||s.createComponent(Rs(e,"submit")),n&&s.setValidationErrors(n),r&&s.setMeta(r),{...o,form:s.get()}}return(t==null?void 0:t.body)||{}},dd=async(t,e,n)=>{(await(await t.getAsync("dataClient")).getClient()).parameters.set(e,n)},Rt=({messageId:t,message:e,group:n})=>({id:t,message:e,groupId:n.id,isUser:n.isUser}),fd=async(t,e,n)=>{const r=async(c,u,l=[],d)=>{var p,g;const f=Ee();switch(c.type!=="List"&&c.tags.includes("guide")&&((g=(p=c.content.hints)==null?void 0:p[0])!=null&&g.id)&&await dd(t,"LastGuideId",c.content.hints[0].id),c.type){case"Text":{const v=[];if(v.push(Rt({messageId:f,message:[Qn.HTML,{body:c.content.html}],group:u})),l.length){l.find(k=>{var N;return k.type==="List"&&((N=k.localState)==null?void 0:N.$type)==="Humany.Matching.Bots.Conversations.States.ContactState, Humany.Matching"});const y=l.find(k=>k.tags.includes("contact")&&k.type==="Contact");y&&v.push(Rt({messageId:f,message:[qt.ContactMethod,{contactMethodId:y.content.id,groupId:u.id,guideId:y.content.guideId}],group:u}))}return v}case"Contact":return[Rt({messageId:f,message:[qt.ContactMethod,{contactMethodId:c.content.id,groupId:u.id,guideId:c.content.guideId}],group:u})];case"Error":return[Rt({messageId:f,message:[Qn.HTML,{body:c.content.message||"Something went wrong."}],group:u})];default:return[]}},i=new Map([["Text",1],["Contact",2]]),o=[],s=e.sort((c,u)=>{const d=i.get(c.type)||20,f=i.get(u.type)||20;return d-f}).filter(c=>!c.relation).reduce((c,u)=>c.concat(u),[]),a=c=>typeof c.actions.selector<"u";for(const c of s){const u=e.filter(f=>f.relation===c.id&&!a(f)),l=ld({isUser:!1});(await r(c,l,u)).forEach(f=>{l.items.push(f)}),l.items.length&&o.push(l)}return o};class hd{constructor(e,n,r,i){S(this,"globalState");S(this,"localState");S(this,"clientId");S(this,"entries");this.endpoint=e,this.events=n,this.store=r,this.container=i,this.clientId=Ee(),this.entries=[]}async fetchGuide(e){const n={command:{guide:{id:e}},globalState:this.globalState,clientId:this.clientId};return await this.postEnvelope(n)}async postEnvelope(e,n){try{const r=await fetch(this.endpoint,this.getHttpOptions(e));if(!r.ok)throw r;const i=await r.json();return this.handleResponse(i,n)}catch(r){process.env.NODE_ENV!=="production"&&console.warn("Something went wrong when posting the envelope.");let i="Something went wrong";return(r.message==="Failed to fetch"||r.message==="NetworkError when attempting to fetch resource.")&&(i="Lost connection... Please try again."),this.handleResponse({entries:[{id:Ee(),type:"Error",timestamp:new Date().toISOString(),content:{message:i},actions:{},tags:[]}]})}}async handleResponse(e,n){this.entries=this.entries.concat(e.entries),this.store.write(this.entries,"entries");const r=e.entries.find(o=>o.type==="Widget");return r&&this.events.dispatch("provider:widget-entry",r.content),e.globalState&&(this.globalState=e.globalState,this.store.write(e.globalState,"globalState")),this.localState=e.entries.reduce((o,s)=>s.localState?s.localState:o,void 0),this.store.write(this.localState,"localState"),await fd(this.container,e.entries)}getHttpOptions(e){const n={method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"}};return e.funnel=this.container.get("$widget").name,e.localState=e.localState||this.localState,Object.assign({},n,{body:JSON.stringify(e),credentials:"same-origin"})}}const pd="@telia-ace/conversational-hub-bot-provider",md="0.0.12",vd="./index.js",gd="./index.d.ts",yd={".":{import:"./index.mjs",require:"./index.js"}},bd={"@telia-ace/widget-conversation":"*","@webprovisions/platform":"^1.1.4","@telia-ace/knowledge-widget-core":"*","@telia-ace/widget-utilities":"*","@telia-ace/widget-services":"*","@telia-ace/widget-core":"*","@telia-ace/knowledge-data-client":"*","@telia-ace/knowledge-widget-adapters":"*","@telia-ace/knowledge-widget-ui":"*","@telia-ace/widget-forms":"*"},xd={"@emotion/react":"11.11.1","@emotion/styled":"11.11.0",react:"18.2.0"},Be={name:pd,version:md,main:vd,types:gd,exports:yd,dependencies:bd,peerDependencies:xd},wd=async t=>{var T,x,V,R,_;const e="chub-plugin",n=t.get("$widget"),r=(_=(R=(V=(x=(T=n==null?void 0:n.container)==null?void 0:T.get("$settings"))==null?void 0:x.components)==null?void 0:V.conversation)==null?void 0:R.properties)==null?void 0:_.conversationalHubPluginSettings;let i,o,s,a=(r==null?void 0:r.connectionAttempts)??5,c,u,l;se.info((Be==null?void 0:Be.name)+" version: "+(Be==null?void 0:Be.version)),id(t,qt.ContactMethod,Promise.resolve().then(()=>require("./contact-method-e5c435a7.js")));const d=await rt(t,"conversational-hub-session",de.Necessary),f=(L,D)=>{const{knowledgeBotEndpoint:W}=D.properties();if(W)return`${W}/conversations`;const{data:U}=L.get("$settings");if(!U||!U.projection)throw new Error("Missing Knowledge Bot endpoint");return`${U.projection}/conversations`};(await hn.getInstance(t)).registerProvider(e,(L,D)=>{i=L,o=i.controller,s=i.createAgent({name:r==null?void 0:r.botName,avatar:r==null?void 0:r.avatar}),l=f(t,D);const{events:W}=t.get("$widget"),U=new cd(t);u=new hd(l,W,U,t),g();const q=()=>o.providers.includes(e);window.controller=o,D.actions.create("submit",z=>{const{events:Y}=t.get("$widget");Y.dispatch("conversational-hub-provider:form-submitted",z)}),D.actions.watch("conversation.action",(z,Y)=>(q()&&v(z),Y(z))),D.actions.watch("conversation.user-submit",(z,Y)=>{if(!q())return Y(z);y(z.text),i.user.print(z.text.replace(/</g,"<").replace(/>/g,">"))})});async function g(L=!0){const D=await Pe(t,"conversational-hub-session");D!=null&&D.sessionId?c=D==null?void 0:D.sessionId:await k(r.baseUrl+"/initialize",`{"extension": "${r.extension}"}`,L)}async function v(L){await k(`${r.baseUrl}/input/${c}`,`{"type":"button_click","language":"${r.language}","content":{"button_text":"${L.label}","value":"${L.actionKey}"}}`)}async function y(L){const D={text:L};await k(`${r.baseUrl}/input/${c}`,`{"type":"text","language":"${r.language}","content":${JSON.stringify(D)}}`)}async function k(L,D,W=!0){var Y,te,oe,ne;const U=i.loading();let q,z;try{q=await fetch(L,{method:"POST",body:D}),z=await(q==null?void 0:q.json())}catch(B){B instanceof SyntaxError?se.error("Incorrect JSON format.",B):se.error("Network error: check connection or baseUrl.",B),U(),s.print(r.errorMessage);return}if(!(q!=null&&q.ok)){if(se.error(`HTTP ${q==null?void 0:q.status}.`,JSON.stringify(z)),U(),!!((Y=z==null?void 0:z.errors)!=null&&Y.filter(b=>b.code==="1003").length)&&a>0){a--,await new Promise(w=>setTimeout(w,500)),await g(!1);const b=JSON.parse(D);(te=b==null?void 0:b.content)!=null&&te.text?await y(b.content.text):(oe=b==null?void 0:b.content)!=null&&oe.action&&await v((ne=b==null?void 0:b.content)==null?void 0:ne.action)}else s.print(r.errorMessage);return}U(),a=(r==null?void 0:r.connectionAttempts)??5,z!=null&&z.action_payload&&N(z.action_payload),c=z==null?void 0:z.session_id,d({sessionId:c}),W&&j(z)}async function N(L){var q;const D=(q=L==null?void 0:L.transfer_parameters)==null?void 0:q.contactGuide,W=i.loading(),U=await u.fetchGuide(parseInt(D));if(W(),U){const z=U.concat(U);if(z.length){const Y=z[0].items.map(te=>te.message);s.print(Y)}}}function j(L){var D;L==null||L.agent_response.forEach(W=>{s.print(W.payload.text)}),(D=L==null?void 0:L.prompt)!=null&&D.items&&s.print(["button-list",{actions:L.prompt.items.map(W=>{let U;return W.type==="button"&&(U={actionKey:W.value,label:W.text}),W.type==="link"&&(U={actionKey:W.value,label:W.text,data:{href:W.url,target:(r==null?void 0:r.linkTarget)??"_blank"}}),U})}])}};exports.Button=Ae;exports.ComponentNodeContext=So;exports.ComponentQuery=rr;exports.Confirm=ju;exports.ConversationContext=Lc;exports.ConversationalHubPlugin=wd;exports.FormBuilder=je;exports.Html=Tr;exports.Icon=Po;exports.ItemList=Qc;exports.Link=un;exports.List=ln;exports.Paragraph=jo;exports.StyledText=Xe;exports.SymbolBadge=st;exports.Text=rn;exports.TextLink=Du;exports.Typography=sn;exports.WidgetRenderState=ar;exports.appendClassNames=ie;exports.borderTabStyle=ye;exports.convertToStringAttributes=Ce;exports.css=G;exports.deepClone=or;exports.genericHtml=Fc;exports.headingElement=Je;exports.invertedHoverButton=Bc;exports.itemList=Uc;exports.keyframes=wr;exports.linkTabStyle=To;exports.list=on;exports.lock=nt;exports.newStyled=$;exports.paddedBorderTabStyle=Wc;exports.updateForm=ud;exports.useComponentPlatform=kr;exports.useContainer=He;exports.useIsMounted=Sr;exports.usePrevious=ko;exports.useRouter=Oo;exports.uuid=Ee;
|
|
1214
|
+
${n}`:e.length?`${e} ${n}`:n}dispose(){this.subscriptions.forEach(e=>{e()})}}class Jn{constructor(e,n){S(this,"id");S(this,"name");S(this,"avatar");S(this,"print",(e,n,r=null)=>{const i={name:this.name,avatar:this.avatar,id:this.id},o=fn(e,n);return r=r??o.timestamp,this.provider.createEntry(o.key,o.content,dn.Agent,i,r)});S(this,"typing",()=>this.provider.setTypingState({name:this.name,avatar:this.avatar}));this.provider=e,this.id=n.id||Ee(),this.name=n.name,this.avatar=n.avatar}update(e){var i;const{name:n,avatar:r}=e;r===null?this.avatar=void 0:r&&(this.avatar=r),n===null?this.name=void 0:n&&(this.name=n),(i=this.provider.controller)==null||i.events.dispatch("conversation:agent-updated",{agent:this})}}class Hr{constructor(e,n,r){S(this,"subscriptions",[]);S(this,"options");S(this,"user");this.name=e,this.container=n,this.controller=r,this.user=r==null?void 0:r.user,this.options={silent:!1}}static create(e,n,r){return new Hr(e,n,r)}createAgent(e={}){var n;if(this.controller){const r=this.controller.getAgentById(e.id),i=r?new Jn(this,{...r,...e}):new Jn(this,e);return r||(n=this.controller)==null||n.events.dispatch("conversation:agent-created",{agent:i}),i}}print(e){var n;return(n=this.controller)==null?void 0:n.print(e)}setTypingState(e,n){var r;return(r=this.controller)==null?void 0:r.setTypingState(e,n)}loading(){return this.controller?this.controller.loader():()=>()=>{}}createEntry(e,n,r,i,o){var s;return(s=this.controller)==null?void 0:s.createEntry(e,n,r,i,o)}dispose(){var e;process.env.NODE_ENV!=="production"&&console.log(`conversation-provider: dispose (${this.name})`),(e=this.controller)==null||e.disposeProvider(this),this.controller=null,this.subscriptions.forEach(n=>n())}isRehydrated(){var e;return((e=this.controller)==null?void 0:e.isRehydrated())||Promise.resolve(!1)}getHistory(){var e;return((e=this.controller)==null?void 0:e.getHistory())||[]}complete(){var e;(e=this.controller)==null||e.onCompleteProvider()}setOptions(e={silent:!1}){this.options=e}onUnreadMessage(e){var n;if(this.controller){const r=(n=this.controller)==null?void 0:n.onUnreadMessage(e);return this.subscriptions.push(r),()=>{r()}}}onMounted(e){var n;if(this.controller){const r=(n=this.controller)==null?void 0:n.events.subscribe("conversation:component-mount-changed",e);return this.subscriptions.push(r),e({},this.controller.getComponentMountedState()),()=>{r()}}}}const Go=t=>`conversation-${t}`;class Qu{constructor(){S(this,"_locking",Promise.resolve());S(this,"_locks",0)}isLocked(){return this._locks>0}lock(){this._locks+=1;let e;const n=new Promise(i=>e=()=>{this._locks-=1,i()}),r=this._locking.then(()=>e);return this._locking=this._locking.then(()=>n),r}}let ed=class{constructor(e,n,r){S(this,"sessionStorageKey");S(this,"locker",new Qu);S(this,"initialStoredAgents",[]);this.container=e,this.conversation=n,this.enabled=r,this.sessionStorageKey=Go(n.id),n.onStarted(async()=>{if(n.messages.length>0)return;const{agents:i}=await this.read(),o=[];i&&i.forEach(a=>{const c=n.providerIndex(a.providerName),u=c>-1?n.registeredProviders[c]:n.createProvider(a.providerName),l=new Jn(u,{name:a.name,avatar:a.avatar,id:a.id});o.push(l)});const{messages:s}=await this.read();s.forEach(a=>{switch(a.type){case"agent":{const c=o.find(u=>{var l;return u.id===((l=a.sender)==null?void 0:l.id)});c&&c.print(a.content.items||a.content,{key:a.key},a.timestamp);return}case"user":{n.user.print(a.content.items||a.content,{key:a.key},a.timestamp);return}case"system":default:n.print(a.content.items||a.content,a.timestamp)}})}),n.onMessageCreated(async(i,o)=>{this.write(o.message,"messages")}),n.events.subscribe("conversation:agent-created",async(i,o)=>{const s={id:o.agent.id,name:o.agent.name,avatar:o.agent.avatar,providerName:o.agent.provider.name};await this.write(s,"agents")}),n.events.subscribe("conversation:agent-updated",async(i,o)=>{const{agents:s}=await this.read();await this.write([...s.map(a=>a.id===o.agent.id?{...a,name:o.agent.name,avatar:o.agent.avatar}:a)],"agents","update")})}setInitialData(e){this.initialStoredAgents=e.agents}async isRehydrated(){const{messages:e}=await this.read();return e.length>0}getStoredAgent(e){if(this.enabled)return this.initialStoredAgents.find(n=>n.id===e)}async write(e,n,r="add"){if(!this.enabled)return;const i=await this.locker.lock();return rt(this.container,this.sessionStorageKey,de.Necessary).then(async o=>{if(r==="add"){const s=await this.read();if(n==="messages"&&s.messages.findIndex(c=>c.key===e.key)>-1){i();return}const a={...s};return n==="messages"?a.messages=[...a.messages,e]:n==="agents"&&(a.agents=[...a.agents,e]),o({...s,...a}).then(()=>{i()})}if(r==="update"&&n==="agents"){const s=await this.read();return o({...s,agents:e}).then(()=>{i()})}return o(e).then(()=>{i()})})}async read(){return Pe(this.container,this.sessionStorageKey).then(e=>e||{messages:[],agents:[]})}};class td{constructor(e){S(this,"print",(e,n,r=null)=>{const i=fn(e,n);return r=r??i.timestamp,this.controller.createEntry(i.key,i.content,dn.User,void 0,r)});this.controller=e}}const Xn=async(t,e,n)=>{const r=await t.getAsync("conversation"),i=await t.getAsync("components"),o=r.controllers.find(s=>s.conversation.id===e);if(o){const s=[...o.conversation.providers];s.forEach(c=>{o.conversation.setProviderOptions(c,{silent:!0})}),o.conversation.queueProviders(s),o.conversation.setProviders([n]);const a=i.components().ofType("conversation");i.write({key:"setConversationProvider",attributes:{properties:{providers:[n]}},target:a,provider:"localStorage"})}};class nd{constructor(e){this.writer=e}update(e){const n=this.getNormalizedSettings(e);this.writer(n)}remove(){this.writer(null)}getNormalizedSettings(e){return typeof e=="string"?{body:e}:e.length>-1&&typeof e=="object"?{items:e}:e}}var dn=(t=>(t.User="user",t.Agent="agent",t.System="system",t))(dn||{});const fn=(t,e)=>{let n,r=(e==null?void 0:e.key)||Ee(),i=Date.now();if(Array.isArray(t)&&t.length>-1)typeof t[0]=="string"?n={items:[t]}:n={items:t};else if(typeof t=="string")n={body:t};else if(t=t||{},t.type)n={...t};else{if(n={body:t.body,actions:t.actions,title:t.title},t.key&&(r=t.key),t.timestamp&&(i=t.timestamp),typeof t.form=="function"){const o=je.create(r);t.form(o);const s=o.get();n.form=s}t.timestamp===null&&(i=null)}return{content:n,key:r,timestamp:i}},Fi=(t,e)=>{if(!e)return;const n=JSON.stringify(e),r=t.findIndex(i=>n===JSON.stringify(i));if(r>-1)return t.splice(r,1)};class rd{constructor(e,n,r){S(this,"formHandlers",{});S(this,"user",new td(this));S(this,"events");S(this,"providers",[]);S(this,"active",!1);S(this,"queuedProviders",[]);S(this,"registeredProviders",[]);S(this,"loaders",0);S(this,"componentMounted",!1);S(this,"store");S(this,"messages",[]);S(this,"typingActors",[]);S(this,"conversationHistory");S(this,"print",(e,n=null)=>{const r=fn(e);return n=n??r.timestamp,this.createEntry(r.key,r.content,"system",void 0,n)});this.container=e,this.id=n;const i=e.get("$widget");this.events=i.events.createChild(this),this.store=new ed(e,this,r.rehydrate),this.conversationHistory=new Xu(this)}setInitialStorage(e){this.store.setInitialData(e)}setProviders(e){const n=[],r=[];this.providers.reduce((i,o)=>(e.indexOf(o)===-1&&i.push(o),i),[]).forEach(i=>{const o=this.providers.indexOf(i);o>-1&&(n.push(i),this.providers.splice(o,1))}),e.forEach(i=>{this.providers.indexOf(i)===-1&&(r.push(i),this.providers.push(i))}),(r.length||n.length)&&this.events.dispatch("conversation:providers-changed",{added:r,removed:n})}createProvider(e){const n=this.providerIndex(e);if(n>-1)return this.registeredProviders[n];const r=Hr.create(e,this.container,this);return this.registeredProviders.push(r),r}providerIndex(e){return this.registeredProviders.findIndex(n=>n.name===e)}getAgentById(e){if(e)return this.store.getStoredAgent(e)}dispose(){this.conversationHistory.dispose(),this.registeredProviders.forEach(e=>e.dispose()),this.messages=[],this.events.dispatch("conversation:controller-disposed",this),this.active=!1}onDispose(e){return this.events.subscribe("conversation:controller-disposed",e)}onStarted(e){return this.events.subscribe("conversation:started",e)}onMessageCreated(e){return this.events.subscribe("conversation:message-created",e)}isRehydrated(){return this.store.isRehydrated()}disposeProvider(e){const n=this.providerIndex(e.name);n>-1&&this.registeredProviders.splice(n,1),this.events.dispatch("conversation:providers-changed",{removed:[e.name]}),this.registeredProviders.length||this.dispose()}onProvidersChange(e){return this.events.subscribe("conversation:providers-changed",e)}setComponentMountedState(e){this.componentMounted!==e&&(this.componentMounted=e,e&&(this.events.dispatch("conversation:unread-message",!1),this.events.dispatch("conversation:started",!0),this.active=!0),this.events.dispatch("conversation:component-mount-changed",e))}setProviderOptions(e,n){const r=this.providerIndex(e);r>-1&&this.registeredProviders[r].setOptions(n)}changeProvider(e){this.registeredProviders.find(r=>r.name===e)&&Xn(this.container,this.id,e)}queueProviders(e){this.queuedProviders=e}onCompleteProvider(){const e=this.queuedProviders.pop();e&&Xn(this.container,this.id,e)}getComponentMountedState(){return this.componentMounted}onUnreadMessage(e){return this.events.subscribe("conversation:unread-message",e)}createEntry(e,n,r,i,o){const s={key:e,content:n,type:r,sender:i||null,timestamp:o||o===null?o:Date.now()};this.messages.push(s),s.type==="agent"&&Fi(this.typingActors,i);const a=new nd(c=>{if(c!==null){const{timestamp:u=void 0,...l}=c;s.content=l,u&&(s.timestamp=u)}else{const u=this.messages.indexOf(s);s.content=null,u>-1&&this.messages.splice(u,1)}this.events.dispatch("conversation:message-updated",{message:s}),this.update()});return this.events.dispatch("conversation:message-created",{message:s}),this.update(),this.componentMounted||this.events.dispatch("conversation:unread-message",!0),a}update(){this.events.dispatch("conversation:updated",{messages:this.messages,loading:this.loaders>0,typingActors:this.typingActors})}getMessageStream(){return{messages:this.messages,loading:this.loaders>0,typingActors:this.typingActors}}setTypingState(e,n){return this.typingActors.indexOf(e)===-1&&(this.typingActors.push(e),this.update()),()=>{Fi(this.typingActors,e),this.update()}}loader(){this.loaders=this.loaders+1;let e=!1;return this.loaders===1&&this.update(),()=>{e||(e=!0,this.loaders=this.loaders-1,this.loaders===0&&this.update())}}submitForm(e,n){this.formHandlers[e]={...this.formHandlers[e],submit:n}}validateForm(e,n){this.formHandlers[e]={...this.formHandlers[e],validate:n}}getHistory(){return this.conversationHistory.getConversationLogs()}}const qi=t=>{const{implementation:e}=t.get("$widget"),r=(e.container.get("modals")||[]).map(i=>i.close());return Promise.all(r)};var Qn=(t=>(t.LinkList="link-list",t.Separator="separator",t.ButtonList="button-list",t.ItemList="item-list",t.Text="text",t.HTML="html",t.VideoRequest="video-request",t))(Qn||{});const id=(t,e,n)=>t.getAsync("componentResolver").then(async r=>{(await hn.getInstance(t)).addSubscription(r.registerComponent(e,m.lazy(()=>n)))}),od=(t,e)=>{const n=t.split("_contact");return e.widgets.get(n[0])},zr=t=>{const e=t.get("$widget"),{name:n,implementation:r}=t.get("$widget"),i=n.indexOf("_contact")>-1?od(n,r):e,{data:o}=t.get("$settings"),{trigger:s}=i.container.get("$settings"),a=`${n.replace("_contact-method","").replace("_contact","")}_contact-method`,c=r.widgets.get(a);return c&&!s?{chatWidget:c,mainWidget:i,data:o}:{mainWidget:i,data:o}},sd=t=>{const{chatWidget:e}=zr(t);return!!e},Yi=(t,e,n)=>{const{mainWidget:r,data:i,chatWidget:o}=zr(t);return o?o.state==="activated"?o.invoke("open").then(()=>{o.container.getAsync("conversation").then(s=>{s.navigateToConversationIfActive(e.id).then(()=>qi(t))})}):o.activate().then(()=>{const{trigger:s}=o.container.get("$settings");return s.action="hide",o.invoke("setSettings",()=>({data:i,trigger:s,activate:!0})).then(()=>o.container.getAsync("components").then(a=>{const c=a.components().ofType("contact-method");a.write({key:"setContactMethodId",attributes:{properties:{id:e.id,guideId:e.guideId}},target:c,provider:"localStorage"});const u=a.components().ofType("conversation");a.write({key:"setConversationProvider",attributes:{properties:{providers:[e.clientName]}},target:u,provider:"localStorage"})}))}).then(()=>o.invoke("attach",{key:"contact-method",triggerDOMElement:n,withRenderState:"open"})).then(()=>(rt(o.container,"activeStickyWidget",de.Necessary,{medium:pe.Local,scope:Kt.Implementation}).then(s=>s(o.name)),o.container.getAsync("conversation").then(s=>{s.setConversationEndedBehavior(Ft.Deactivate)}).then(()=>qi(t)).then(()=>!1))):(r.container.getAsync("conversation").then(s=>s.navigateToConversationIfActive(e.id).then(()=>s.setConversationEndedBehavior(Ft.Navigate))),!o)},ad=(t,e,n="conversation")=>{const{mainWidget:r,chatWidget:i}=zr(t);return i?i.container.getAsync("router").then(o=>{o.navigate(n,{id:e.id})}):r.container.getAsync("conversation").then(o=>{var s;(s=o.setConversationEndedBehavior(Ft.Navigate))==null||s.then(()=>{r.container.getAsync("router").then(a=>{r.container.getAsync("components").then(c=>{const u=c.components().ofType("conversation");c.write({key:"setConversationProvider",attributes:{properties:{providers:[e.clientName]}},target:u,provider:"localStorage"})}).then(()=>{a.navigate(n,{id:e.id})})})})})},ut="conversations";var Ft=(t=>(t.Deactivate="deactivate",t.Navigate="navigate",t.None="none",t))(Ft||{});class hn{constructor(e,n){S(this,"events");S(this,"controllers",[]);S(this,"providers",[]);S(this,"disposeProviders",{});S(this,"subscriptions",[]);S(this,"storageWriter",null);S(this,"router",null);S(this,"buttonQuery",null);S(this,"sessionInfo",null);this.container=e,this.components=n;const r=e.get("$widget");this.events=r.events.createChild(this)}initialize(){rt(this.container,ut,de.Necessary,{medium:pe.Local}).then(e=>this.storageWriter=e),Pe(this.container,ut,pe.Local).then(e=>{this.buttonQuery=this.components.components().ofType("conversation-return-button"),e&&(this.sessionInfo=e,e.id&&e.route&&this.writeToComponents({active:!0,alert:{show:!1}}))}),this.container.getAsync("router").then(e=>this.router=e),this.events.subscribe("conversation:ended",(e,n)=>{var r,i,o;switch((r=this.sessionInfo)==null?void 0:r.conversationEndedBehavior){case"deactivate":this.container.get("$widget").deactivate();break;case"navigate":const a=(i=this.router)==null?void 0:i.getInitialRoute();a&&((o=this.router)==null||o.navigate(a.name));break}this.writeToComponents({active:!1}),this.sessionInfo=null,this.storageWriter&&this.storageWriter()})}addSubscription(e){this.subscriptions.push(e)}static getInstance(e,n="conversation"){return nt(e)(()=>e.getAsync(n).then(r=>{let i=r;return i||Gi.getInstance(e).then(o=>(i=new hn(e,o),i.initialize(),e.registerAsync(n,()=>i),i))}))}navigateToConversationIfActive(e){return Pe(this.container,ut,pe.Local).then(n=>{var r;if(n&&n.id===e&&n.route){const{name:i,params:o}=n.route;(r=this.router)==null||r.navigate(i,o)}})}setConversationEndedBehavior(e){return Pe(this.container,ut,pe.Local).then(n=>{let r=n;return r?r.conversationEndedBehavior=e:r={conversationEndedBehavior:e},this.sessionInfo=r,this.storageWriter&&this.storageWriter(this.sessionInfo)||Promise.resolve()})}async createController(e,n){const r=Go(e),{agents:i}=await Pe(this.container,r)||{agents:[]},o=this.controllers.findIndex(a=>a.conversation.id===e);let s;return o>-1?s=this.controllers[o].conversation:s=new rd(this.container,e,n),s.setInitialStorage({agents:i||[]}),s}registerProvider(e,n){const r={name:e,handler:n};this.providers.push(r),this.controllers.filter(i=>i.conversation.providers.indexOf(e)>-1).forEach(i=>{this.invokeHandler(r,i)})}registerController(e,n){const r=this.controllers.findIndex(o=>o.conversation.id===e.id);let i;if(r<0){i={conversation:e,component:n},this.controllers.push(i);const o=s=>{s&&this.providers.filter(a=>s.indexOf(a.name)>-1).forEach(a=>{this.invokeHandler(a,i)})};return this.subscriptions.push(e.onDispose((s,a)=>{const c=this.controllers.findIndex(u=>u.conversation===a);c>-1&&this.controllers.splice(c,1),this.components.components().ofType("conversation-return-button").select().writeProperties({active:!1}),this.events.dispatch("conversation:ended",{},{bubbles:!0})})),this.subscriptions.push(e.onProvidersChange((s,a)=>{const{added:c,removed:u=[]}=a;u.forEach(l=>{(this.disposeProviders[l]||[]).forEach(d=>{d()})}),o(c)})),this.subscriptions.push(e.onStarted((s,a)=>{var u,l;const c={id:e.id,route:(u=this.router)==null?void 0:u.getRouteData(),conversationEndedBehavior:(l=this.sessionInfo)==null?void 0:l.conversationEndedBehavior};this.sessionInfo=c,this.storageWriter&&this.storageWriter(c),this.writeToComponents({active:a})})),this.subscriptions.push(e.onUnreadMessage((s,a)=>{this.events.dispatch("conversation:unread-message",a),this.writeToComponents({alert:{show:a}})})),o(e.providers),!0}return i=this.controllers[r],!1}writeToComponents(e,n="conversationReturnButtonState"){this.buttonQuery&&this.components.write({key:"conversationReturnButtonState",attributes:{properties:e},target:this.buttonQuery,provider:"localStorage"})}invokeHandler(e,n){const r=e.handler(n.conversation.createProvider(e.name),n.component);r&&(this.disposeProviders[e.name]||(this.disposeProviders[e.name]=[]),this.disposeProviders[e.name].push(r))}getComponentRoute(){return Pe(this.container,ut,pe.Local).then(e=>e==null?void 0:e.route)}dispose(){Object.keys(this.disposeProviders).forEach(e=>{this.disposeProviders[e].forEach(n=>{n()})}),this.subscriptions.forEach(e=>{e()}),this.controllers=[],this.providers=[]}static async handleContactMethodClick(e,n,r,i){if(sd(n)){e.preventDefault();let o=document.getElementById("humany-dynamic-anchor");o||(o=document.createElement("a"),o.setAttribute("href","#"),o.id="humany-dynamic-anchor",document.body.appendChild(o)),Yi(n,r,o)}Yi(n,r)}static async handleContactMethodSubmit(e,n){var r,i;return(i=(r=n==null?void 0:n.body.form.meta)==null?void 0:r.conversation)!=null&&i.id?Xn(e,n.body.form.meta.conversation.id,n.clientName):ad(e,n)}}class cd{constructor(e){S(this,"enabled",!0);S(this,"botProviderGlobalStateKey","bot-provider-global-state");S(this,"botProviderLocalStateKey","bot-provider-local-state");S(this,"botProviderEntriesKey","bot-provider-entries");S(this,"botProviderMetaStateKey","bot-provider-conversation-meta");this.container=e}getKey(e){let n;switch(e){case"localState":n=this.botProviderLocalStateKey;break;case"globalState":n=this.botProviderGlobalStateKey;break;case"entries":n=this.botProviderEntriesKey;break;case"meta":n=this.botProviderMetaStateKey;break}return n}async read(e){const n=this.getKey(e);if(!(!this.enabled||!n))return Pe(this.container,n)}async write(e,n){const r=this.getKey(n);if(!this.enabled||!r)return;(await rt(this.container,r,de.Necessary))(e)}}var qt=(t=>(t.ContactMethod="ace-conversational-hub-contact-method",t))(qt||{});const ld=({isUser:t,items:e=[],meta:n={}})=>{const r=Ee();return{id:r,isUser:t,items:e.map(o=>({id:o.id||Ee(),isUser:t,groupId:r,message:o.message||[]})),meta:n}},ud=(t,{submit:e,errors:n,meta:r})=>{var i;if((i=t==null?void 0:t.body)!=null&&i.form){const{body:o}=t,s=new je(o.form);return o.form.layout.submit||s.createComponent(Rs(e,"submit")),n&&s.setValidationErrors(n),r&&s.setMeta(r),{...o,form:s.get()}}return(t==null?void 0:t.body)||{}},dd=async(t,e,n)=>{(await(await t.getAsync("dataClient")).getClient()).parameters.set(e,n)},Rt=({messageId:t,message:e,group:n})=>({id:t,message:e,groupId:n.id,isUser:n.isUser}),fd=async(t,e,n)=>{const r=async(c,u,l=[],d)=>{var p,g;const f=Ee();switch(c.type!=="List"&&c.tags.includes("guide")&&((g=(p=c.content.hints)==null?void 0:p[0])!=null&&g.id)&&await dd(t,"LastGuideId",c.content.hints[0].id),c.type){case"Text":{const v=[];if(v.push(Rt({messageId:f,message:[Qn.HTML,{body:c.content.html}],group:u})),l.length){l.find(k=>{var N;return k.type==="List"&&((N=k.localState)==null?void 0:N.$type)==="Humany.Matching.Bots.Conversations.States.ContactState, Humany.Matching"});const y=l.find(k=>k.tags.includes("contact")&&k.type==="Contact");y&&v.push(Rt({messageId:f,message:[qt.ContactMethod,{contactMethodId:y.content.id,groupId:u.id,guideId:y.content.guideId}],group:u}))}return v}case"Contact":return[Rt({messageId:f,message:[qt.ContactMethod,{contactMethodId:c.content.id,groupId:u.id,guideId:c.content.guideId}],group:u})];case"Error":return[Rt({messageId:f,message:[Qn.HTML,{body:c.content.message||"Something went wrong."}],group:u})];default:return[]}},i=new Map([["Text",1],["Contact",2]]),o=[],s=e.sort((c,u)=>{const d=i.get(c.type)||20,f=i.get(u.type)||20;return d-f}).filter(c=>!c.relation).reduce((c,u)=>c.concat(u),[]),a=c=>typeof c.actions.selector<"u";for(const c of s){const u=e.filter(f=>f.relation===c.id&&!a(f)),l=ld({isUser:!1});(await r(c,l,u)).forEach(f=>{l.items.push(f)}),l.items.length&&o.push(l)}return o};class hd{constructor(e,n,r,i){S(this,"globalState");S(this,"localState");S(this,"clientId");S(this,"entries");this.endpoint=e,this.events=n,this.store=r,this.container=i,this.clientId=Ee(),this.entries=[]}async fetchGuide(e){const n={command:{guide:{id:e}},globalState:this.globalState,clientId:this.clientId};return await this.postEnvelope(n)}async postEnvelope(e,n){try{const r=await fetch(this.endpoint,this.getHttpOptions(e));if(!r.ok)throw r;const i=await r.json();return this.handleResponse(i,n)}catch(r){process.env.NODE_ENV!=="production"&&console.warn("Something went wrong when posting the envelope.");let i="Something went wrong";return(r.message==="Failed to fetch"||r.message==="NetworkError when attempting to fetch resource.")&&(i="Lost connection... Please try again."),this.handleResponse({entries:[{id:Ee(),type:"Error",timestamp:new Date().toISOString(),content:{message:i},actions:{},tags:[]}]})}}async handleResponse(e,n){this.entries=this.entries.concat(e.entries),this.store.write(this.entries,"entries");const r=e.entries.find(o=>o.type==="Widget");return r&&this.events.dispatch("provider:widget-entry",r.content),e.globalState&&(this.globalState=e.globalState,this.store.write(e.globalState,"globalState")),this.localState=e.entries.reduce((o,s)=>s.localState?s.localState:o,void 0),this.store.write(this.localState,"localState"),await fd(this.container,e.entries)}getHttpOptions(e){const n={method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"}};return e.funnel=this.container.get("$widget").name,e.localState=e.localState||this.localState,Object.assign({},n,{body:JSON.stringify(e),credentials:"same-origin"})}}const pd="@telia-ace/conversational-hub-bot-provider",md="0.0.13",vd="./index.js",gd="./index.d.ts",yd={".":{import:"./index.mjs",require:"./index.js"}},bd={"@telia-ace/widget-conversation":"*","@webprovisions/platform":"^1.1.4","@telia-ace/knowledge-widget-core":"*","@telia-ace/widget-utilities":"*","@telia-ace/widget-services":"*","@telia-ace/widget-core":"*","@telia-ace/knowledge-data-client":"*","@telia-ace/knowledge-widget-adapters":"*","@telia-ace/knowledge-widget-ui":"*","@telia-ace/widget-forms":"*"},xd={"@emotion/react":"11.11.1","@emotion/styled":"11.11.0",react:"18.2.0"},Be={name:pd,version:md,main:vd,types:gd,exports:yd,dependencies:bd,peerDependencies:xd},wd=async t=>{var T,x,V,R,_;const e="chub-plugin",n=t.get("$widget"),r=(_=(R=(V=(x=(T=n==null?void 0:n.container)==null?void 0:T.get("$settings"))==null?void 0:x.components)==null?void 0:V.conversation)==null?void 0:R.properties)==null?void 0:_.conversationalHubPluginSettings;let i,o,s,a=(r==null?void 0:r.connectionAttempts)??5,c,u,l;se.info((Be==null?void 0:Be.name)+" version: "+(Be==null?void 0:Be.version)),id(t,qt.ContactMethod,Promise.resolve().then(()=>require("./contact-method-429ef265.js")));const d=await rt(t,"conversational-hub-session",de.Necessary),f=(L,D)=>{const{knowledgeBotEndpoint:W}=D.properties();if(W)return`${W}/conversations`;const{data:U}=L.get("$settings");if(!U||!U.projection)throw new Error("Missing Knowledge Bot endpoint");return`${U.projection}/conversations`};(await hn.getInstance(t)).registerProvider(e,(L,D)=>{i=L,o=i.controller,s=i.createAgent({name:r==null?void 0:r.botName,avatar:r==null?void 0:r.avatar}),l=f(t,D);const{events:W}=t.get("$widget"),U=new cd(t);u=new hd(l,W,U,t),g();const q=()=>o.providers.includes(e);window.controller=o,D.actions.create("submit",z=>{const{events:Y}=t.get("$widget");Y.dispatch("conversational-hub-provider:form-submitted",z)}),D.actions.watch("conversation.action",(z,Y)=>(q()&&v(z),Y(z))),D.actions.watch("conversation.user-submit",(z,Y)=>{if(!q())return Y(z);y(z.text),i.user.print(z.text.replace(/</g,"<").replace(/>/g,">"))})});async function g(L=!0){const D=await Pe(t,"conversational-hub-session");D!=null&&D.sessionId?c=D==null?void 0:D.sessionId:await k(r.baseUrl+"/initialize",`{"extension": "${r.extension}"}`,L)}async function v(L){await k(`${r.baseUrl}/input/${c}`,`{"type":"button_click","language":"${r.language}","content":{"button_text":"${L.label}","value":"${L.actionKey}"}}`)}async function y(L){const D={text:L};await k(`${r.baseUrl}/input/${c}`,`{"type":"text","language":"${r.language}","content":${JSON.stringify(D)}}`)}async function k(L,D,W=!0){var Y,te,oe,ne;const U=i.loading();let q,z;try{q=await fetch(L,{method:"POST",body:D}),z=await(q==null?void 0:q.json())}catch(B){B instanceof SyntaxError?se.error("Incorrect JSON format.",B):se.error("Network error: check connection or baseUrl.",B),U(),s.print(r.errorMessage);return}if(!(q!=null&&q.ok)){if(se.error(`HTTP ${q==null?void 0:q.status}.`,JSON.stringify(z)),U(),!!((Y=z==null?void 0:z.errors)!=null&&Y.filter(b=>b.code==="1003").length)&&a>0){a--,await new Promise(w=>setTimeout(w,500)),await g(!1);const b=JSON.parse(D);(te=b==null?void 0:b.content)!=null&&te.text?await y(b.content.text):(oe=b==null?void 0:b.content)!=null&&oe.action&&await v((ne=b==null?void 0:b.content)==null?void 0:ne.action)}else s.print(r.errorMessage);return}U(),a=(r==null?void 0:r.connectionAttempts)??5,z!=null&&z.action_payload&&N(z.action_payload),c=z==null?void 0:z.session_id,d({sessionId:c}),W&&j(z)}async function N(L){var q;const D=(q=L==null?void 0:L.transfer_parameters)==null?void 0:q.contactGuide,W=i.loading(),U=await u.fetchGuide(parseInt(D));if(W(),U){const z=U.concat(U);if(z.length){const Y=z[0].items.map(te=>te.message);s.print(Y)}}}function j(L){var D;L==null||L.agent_response.forEach(W=>{s.print(W.payload.text)}),(D=L==null?void 0:L.prompt)!=null&&D.items&&s.print(["button-list",{actions:L.prompt.items.map(W=>{let U;return W.type==="button"&&(U={actionKey:W.value,label:W.text}),W.type==="link"&&(U={actionKey:W.value,label:W.text,data:{href:W.url,target:(r==null?void 0:r.linkTarget)??"_blank"}}),U})}])}};exports.Button=Ae;exports.ComponentNodeContext=So;exports.ComponentQuery=rr;exports.Confirm=ju;exports.ConversationContext=Lc;exports.ConversationalHubPlugin=wd;exports.FormBuilder=je;exports.Html=Tr;exports.Icon=Po;exports.ItemList=Qc;exports.Link=un;exports.List=ln;exports.Paragraph=jo;exports.StyledText=Xe;exports.SymbolBadge=st;exports.Text=rn;exports.TextLink=Du;exports.Typography=sn;exports.WidgetRenderState=ar;exports.appendClassNames=ie;exports.borderTabStyle=ye;exports.convertToStringAttributes=Ce;exports.css=G;exports.deepClone=or;exports.genericHtml=Fc;exports.headingElement=Je;exports.invertedHoverButton=Bc;exports.itemList=Uc;exports.keyframes=wr;exports.linkTabStyle=To;exports.list=on;exports.lock=nt;exports.newStyled=$;exports.paddedBorderTabStyle=Wc;exports.updateForm=ud;exports.useComponentPlatform=kr;exports.useContainer=He;exports.useIsMounted=Sr;exports.usePrevious=ko;exports.useRouter=Oo;exports.uuid=Ee;
|
|
@@ -10495,7 +10495,7 @@ class vd {
|
|
|
10495
10495
|
});
|
|
10496
10496
|
}
|
|
10497
10497
|
}
|
|
10498
|
-
const gd = "@telia-ace/conversational-hub-bot-provider", yd = "0.0.
|
|
10498
|
+
const gd = "@telia-ace/conversational-hub-bot-provider", yd = "0.0.13", bd = "./index.js", wd = "./index.d.ts", xd = {
|
|
10499
10499
|
".": {
|
|
10500
10500
|
import: "./index.mjs",
|
|
10501
10501
|
require: "./index.js"
|
|
@@ -10530,7 +10530,7 @@ const gd = "@telia-ace/conversational-hub-bot-provider", yd = "0.0.12", bd = "./
|
|
|
10530
10530
|
ce.info((Ke == null ? void 0 : Ke.name) + " version: " + (Ke == null ? void 0 : Ke.version)), cd(
|
|
10531
10531
|
t,
|
|
10532
10532
|
en.ContactMethod,
|
|
10533
|
-
import("./contact-method-
|
|
10533
|
+
import("./contact-method-ae387667.mjs")
|
|
10534
10534
|
);
|
|
10535
10535
|
const d = await st(
|
|
10536
10536
|
t,
|
package/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-482ea30a.js");require("react/jsx-runtime");require("react");require("react-dom");exports.ConversationalHubPlugin=e.ConversationalHubPlugin;
|
package/index.mjs
CHANGED