@opencx/widget 3.0.0 → 3.0.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.
- package/dist/basic.cjs +3 -3
- package/dist/basic.cjs.map +1 -1
- package/dist/basic.js +432 -429
- package/dist/basic.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/react.cjs +1 -1
- package/dist/react.js +2 -2
- package/dist/{src → types/src}/designs/react/basic/index.d.ts +1 -1
- package/dist/{src → types/src}/designs/react/basic/utils/group-messages-by-type.d.ts +1 -1
- package/dist/{src → types/src}/designs/react/components/BotOrAgentMessage.d.ts +1 -1
- package/dist/{src → types/src}/designs/react/components/BotOrAgentMessageGroup.d.ts +1 -1
- package/dist/{src → types/src}/designs/react/components/Fallback.component.d.ts +1 -1
- package/dist/{src → types/src}/designs/react/components/RenderFile.d.ts +1 -1
- package/dist/{src/designs/react/components/keyboard.d.ts → types/src/designs/react/components/SuggestedReplies.d.ts} +2 -2
- package/dist/{src → types/src}/designs/react/components/Text.component.d.ts +1 -1
- package/dist/{src → types/src}/designs/react/components/UserMessageGroup.d.ts +1 -1
- package/dist/{src → types/src}/designs/react/components/lib/button.d.ts +1 -1
- package/dist/{src → types/src}/designs/react/components/lib/dialog.d.ts +7 -7
- package/dist/{src → types/src}/designs/react/components/lib/dropdown-menu.d.ts +2 -2
- package/dist/types/src/designs/react/hooks/useLocale.d.ts +6 -0
- package/dist/{src → types/src}/designs/react/index.d.ts +1 -1
- package/dist/{src → types/src}/headless/core/context/contact.d.ts +6 -7
- package/dist/{src → types/src}/headless/core/context/message.d.ts +5 -3
- package/dist/{src → types/src}/headless/core/context/session.d.ts +3 -3
- package/dist/{src → types/src}/headless/core/context/widget.d.ts +1 -1
- package/dist/types/src/headless/core/index.d.ts +10 -0
- package/dist/{src → types/src}/headless/core/types/messages.d.ts +1 -1
- package/dist/{src → types/src}/headless/core/types/schemas.d.ts +1 -1
- package/dist/{src → types/src}/headless/core/utils/Poller.d.ts +1 -1
- package/dist/{src → types/src}/headless/react/WidgetProvider.d.ts +1 -1
- package/dist/types/src/headless/react/hooks/useConfig.d.ts +1 -0
- package/dist/{src → types/src}/headless/react/hooks/useContact.d.ts +1 -1
- package/dist/{src → types/src}/headless/react/hooks/useMessages.d.ts +1 -1
- package/dist/{src → types/src}/headless/react/hooks/usePubsub.d.ts +1 -1
- package/dist/{src → types/src}/headless/react/index.d.ts +0 -1
- package/dist/{src → types/src}/headless/react/types/components.d.ts +1 -2
- package/dist/{useUploadFiles-BaCcqTwX.js → useUploadFiles-DJElNIQi.js} +87 -87
- package/dist/useUploadFiles-DJElNIQi.js.map +1 -0
- package/dist/{useUploadFiles-BZa0DENN.cjs → useUploadFiles-DMskqhR-.cjs} +4 -4
- package/dist/useUploadFiles-DMskqhR-.cjs.map +1 -0
- package/dist/{widget-DbgWez1r.js → widget-BeNOCqB5.js} +46 -43
- package/dist/widget-BeNOCqB5.js.map +1 -0
- package/dist/{widget-BlvH6dre.cjs → widget-DlAUwHzU.cjs} +2 -2
- package/dist/widget-DlAUwHzU.cjs.map +1 -0
- package/dist-embed/script.js +100 -100
- package/dist-embed/script.js.map +1 -1
- package/package.json +8 -13
- package/dist/basic.d.ts +0 -2
- package/dist/index.d.ts +0 -2
- package/dist/react.d.ts +0 -2
- package/dist/src/designs/react/hooks/useLocale.d.ts +0 -6
- package/dist/src/headless/core/index.d.ts +0 -7
- package/dist/src/headless/react/hooks/useConfig.d.ts +0 -1
- package/dist/useUploadFiles-BZa0DENN.cjs.map +0 -1
- package/dist/useUploadFiles-BaCcqTwX.js.map +0 -1
- package/dist/vitest/setup.d.ts +0 -1
- package/dist/widget-BlvH6dre.cjs.map +0 -1
- package/dist/widget-DbgWez1r.js.map +0 -1
- /package/dist/{src → types/src}/designs/react/basic/WidgetPopoverTrigger.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/basic/screens/chat-screen/ChatFooter.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/basic/screens/chat-screen/ChatHeader.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/basic/screens/chat-screen/ChatMain.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/basic/screens/chat-screen/ChatScreen.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/basic/screens/root-screen.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/basic/screens/welcome-screen/WelcomeScreen.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/basic/widget-interaction-tests/widget.test.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/components/BotOrAgentMessageWrapper.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/components/Loading.component.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/components/OpenLogoSvg.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/components/VoteButtons.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/components/lib/MotionDiv.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/components/lib/avatar.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/components/lib/input.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/components/lib/popover.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/components/lib/skeleton.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/components/lib/switch.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/components/lib/tooltip.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/components/lib/utils/cn.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/components/lib/wobble.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/components/markdown.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/constants.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/hooks/useWidgetContentHeight.d.ts +0 -0
- /package/dist/{src → types/src}/designs/react/render.d.ts +0 -0
- /package/dist/{src → types/src}/designs/translation/ar.locale.d.ts +0 -0
- /package/dist/{src → types/src}/designs/translation/de.locale.d.ts +0 -0
- /package/dist/{src → types/src}/designs/translation/en.locale.d.ts +0 -0
- /package/dist/{src → types/src}/designs/translation/fr.locale.d.ts +0 -0
- /package/dist/{src → types/src}/designs/translation/index.d.ts +0 -0
- /package/dist/{src → types/src}/designs/translation/nl.locale.d.ts +0 -0
- /package/dist/{src → types/src}/designs/translation/pt.locale.d.ts +0 -0
- /package/dist/{src → types/src}/designs/translation/translation.types.d.ts +0 -0
- /package/dist/{src → types/src}/headless/core/api.d.ts +0 -0
- /package/dist/{src → types/src}/headless/core/sdk/index.d.ts +0 -0
- /package/dist/{src → types/src}/headless/core/types/WidgetConfig.d.ts +0 -0
- /package/dist/{src → types/src}/headless/core/types/agent-or-bot.d.ts +0 -0
- /package/dist/{src → types/src}/headless/core/types/helpers.d.ts +0 -0
- /package/dist/{src → types/src}/headless/core/utils/PubSub.d.ts +0 -0
- /package/dist/{src → types/src}/headless/core/utils/PubSub.test.d.ts +0 -0
- /package/dist/{src → types/src}/headless/core/utils/uuid.d.ts +0 -0
- /package/dist/{src → types/src}/headless/react/ComponentRegistry.d.ts +0 -0
- /package/dist/{src → types/src}/headless/react/hooks/useIsAwaitingBotReply.d.ts +0 -0
- /package/dist/{src → types/src}/headless/react/hooks/usePreludeData.d.ts +0 -0
- /package/dist/{src → types/src}/headless/react/hooks/useSession.d.ts +0 -0
- /package/dist/{src → types/src}/headless/react/hooks/useUploadFiles.d.ts +0 -0
- /package/dist/{src → types/src}/headless/react/hooks/useVote.d.ts +0 -0
- /package/dist/{src → types/src}/headless/react/utils/create-safe-context.d.ts +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var x=Object.defineProperty;var A=a=>{throw TypeError(a)};var O=(a,e,t)=>e in a?x(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var s=(a,e,t)=>O(a,typeof e!="symbol"?e+"":e,t),U=(a,e,t)=>e.has(a)||A("Cannot "+t);var c=(a,e,t)=>(U(a,e,"read from private field"),t?t.call(a):e.get(a)),S=(a,e,t)=>e.has(a)?A("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(a):e.set(a,t),p=(a,e,t,i)=>(U(a,e,"write to private field"),i?i.call(a,t):e.set(a,t),t);const R=require("axios"),E=require("openapi-fetch"),F=require("lodash.isequal"),L=require("uuid"),D=a=>{console.log(a.error)},I=a=>{const e=E({baseUrl:a.baseUrl}),t={onRequest:a.onRequest,onResponse:a.onResponse,onError:a.onError||D};return e.use(t),e};class q{constructor({config:e}){s(this,"client");s(this,"uploadFileClient");s(this,"config");s(this,"constructClientOptions",e=>{const t=this.config.apiUrl||"https://api.open.cx",i={"X-Bot-Token":this.config.token,"Content-Type":"application/json",Accept:"application/json",Authorization:e?`Bearer ${e}`:void 0};return{baseUrl:t,headers:i}});s(this,"createOpenAPIClient",({baseUrl:e,headers:t})=>I({baseUrl:e,onRequest:({request:i})=>{Object.entries(t).forEach(([n,r])=>{r&&i.headers.set(n,r)})}}));s(this,"createAxiosUploadClient",({baseUrl:e,headers:t})=>R.create({baseURL:`${e}/backend/widget/v2/upload`,headers:t}));s(this,"setAuthToken",e=>{const{baseUrl:t,headers:i}=this.constructClientOptions(e);this.client=this.createOpenAPIClient({baseUrl:t,headers:i}),this.uploadFileClient=this.createAxiosUploadClient({baseUrl:t,headers:i})});s(this,"widgetPrelude",async()=>await this.client.GET("/backend/widget/v2/prelude",{params:{header:{"X-Bot-Token":this.config.token}}}));s(this,"sendMessage",async(e,t)=>await this.client.POST("/backend/widget/v2/chat/send",{body:e,signal:t}));s(this,"getSessionHistory",async({sessionId:e,lastMessageTimestamp:t,abortSignal:i})=>{const n=t?{lastMessageTimestamp:t}:void 0;return await this.client.GET("/backend/widget/v2/session/history/{sessionId}",{params:{path:{sessionId:e},query:n},signal:i})});s(this,"createUnverifiedContact",async e=>await this.client.POST("/backend/widget/v2/contact/create-unverified",{params:{header:{"x-bot-token":this.config.token}},body:e}));s(this,"createSession",async()=>await this.client.POST("/backend/widget/v2/create-session"));s(this,"getSession",async({sessionId:e,abortSignal:t})=>await this.client.GET("/backend/widget/v2/session/{sessionId}",{params:{path:{sessionId:e}},signal:t}));s(this,"uploadFile",async(e,t={})=>{const i=new FormData;i.append("file",e.file);const{data:n}=await this.uploadFileClient.post("",i,{headers:{"Content-Type":"multipart/form-data"},...t});return n});s(this,"vote",async e=>await this.client.POST("/backend/widget/v2/chat/vote",{body:e}));this.config=e;const{baseUrl:t,headers:i}=this.constructClientOptions(e.contactToken);this.client=this.createOpenAPIClient({baseUrl:t,headers:i}),this.uploadFileClient=this.createAxiosUploadClient({baseUrl:t,headers:i})}}var l,g;class f{constructor(e){s(this,"subscribers",new Set);S(this,l);s(this,"initialState");S(this,g);s(this,"lifecycleListeners",new Map);s(this,"emitLifecycle",(e,t)=>{const i=this.lifecycleListeners.get(e);if(i){const n={type:e,timestamp:Date.now(),data:t};i.forEach(r=>{try{r(n)}catch{}})}});s(this,"notifySubscribers",e=>{Array.from(this.subscribers).forEach(i=>{try{i(e)}catch(n){this.emitLifecycle("error",{error:n})}})});s(this,"subscribe",e=>(this.subscribers.add(e),()=>{this.subscribers.delete(e)}));s(this,"onLifecycle",(e,t)=>{this.lifecycleListeners.has(e)||this.lifecycleListeners.set(e,new Set);const i=this.lifecycleListeners.get(e);return i.add(t),()=>{i.delete(t),i.size===0&&this.lifecycleListeners.delete(e)}});s(this,"get",()=>c(this,l));s(this,"set",e=>{this.emitLifecycle("beforeUpdate",{previousState:c(this,l),nextState:e}),F(c(this,l),e)||(p(this,l,e),p(this,g,Date.now()),this.emitLifecycle("stateChange",{state:e}),this.notifySubscribers(e)),this.emitLifecycle("afterUpdate",{state:e})});s(this,"setPartial",e=>{if(e==null)return;const t={...c(this,l),...e};this.set(t)});s(this,"clear",()=>{this.emitLifecycle("destroy"),this.subscribers=new Set,this.lifecycleListeners=new Map});s(this,"reset",()=>{this.set(this.initialState)});s(this,"lastUpdated",()=>c(this,g));p(this,l,e),this.initialState=e,p(this,g,Date.now()),this.emitLifecycle("init",{initialState:c(this,l)})}}l=new WeakMap,g=new WeakMap;class B{constructor({config:e,api:t}){s(this,"config");s(this,"api");s(this,"state");s(this,"shouldCollectData",()=>{var t;return!!(!((t=this.state.get().contact)!=null&&t.token)&&this.config.collectUserData)});s(this,"autoCreateUnverifiedUser",async()=>{var e,t;await this.createUnverifiedContact({name:((e=this.config.user)==null?void 0:e.name)||"Anonymous",email:(t=this.config.user)==null?void 0:t.email})});s(this,"createUnverifiedContact",async e=>{try{this.state.setPartial({isCreatingUnverifiedContact:!0,isErrorCreatingUnverifiedContact:!1});const{data:t}=await this.api.createUnverifiedContact(e);t!=null&&t.token?(this.state.setPartial({contact:{token:t.token}}),this.api.setAuthToken(t.token)):this.state.setPartial({isErrorCreatingUnverifiedContact:!0})}finally{this.state.setPartial({isCreatingUnverifiedContact:!1})}});this.config=e,this.api=t,this.state=new f({contact:e.contactToken?{token:e.contactToken}:null,isCreatingUnverifiedContact:!1,isErrorCreatingUnverifiedContact:!1}),!e.contactToken&&!e.collectUserData&&this.autoCreateUnverifiedUser()}}function P(){return L.v4()}class M{constructor(){s(this,"state",new f({isPolling:!1,isError:!1}));s(this,"abortController",new AbortController);s(this,"reset",()=>{var e;this.abortController.abort("Resetting poller"),(e=this.stopPolling)==null||e.call(this),this.stopPolling=null});s(this,"stopPolling",null);s(this,"startPolling",(e,t)=>{if(this.stopPolling)return;const i=[],n=async()=>{this.abortController=new AbortController,this.state.setPartial({isPolling:!0});try{await e(this.abortController.signal)}catch(r){if(this.abortController.signal.aborted)return;console.error("Failed to poll:",r),this.state.setPartial({isError:!0})}finally{this.state.setPartial({isPolling:!1})}this.abortController.signal.aborted?console.log("Poller aborted, not scheduling anymore"):i.push(setTimeout(n,t))};n(),this.stopPolling=()=>{i.forEach(clearTimeout),this.state.reset()}})}}class d{constructor({config:e,api:t,sessionCtx:i}){s(this,"config");s(this,"api");s(this,"sessionCtx");s(this,"poller",new M);s(this,"state",new f({messages:[],isSendingMessage:!1,suggestedReplies:null}));s(this,"sendMessageAbortController",new AbortController);s(this,"reset",()=>{this.sendMessageAbortController.abort("Resetting chat"),this.state.reset(),this.poller.reset()});s(this,"registerPolling",()=>{this.sessionCtx.state.subscribe(({session:e})=>{e!=null&&e.id?this.poller.startPolling(async t=>{await this.fetchAndSetHistory(e.id,t)},1e3):this.poller.reset()})});s(this,"sendMessage",async e=>{var n,r,u,m,C,b;this.sendMessageAbortController=new AbortController;const t=this.state.get().isSendingMessage,i=((n=this.sessionCtx.state.get().session)==null?void 0:n.assignee.kind)==="ai";if(t&&i){console.warn("Cannot send messages while awaiting AI response");return}this.state.setPartial({suggestedReplies:null});try{this.state.setPartial({isSendingMessage:!0});const y=d.toUserMessage(e.content,e.attachments||void 0),k=this.state.get().messages;if(this.state.setPartial({messages:[...k,y]}),!((r=this.sessionCtx.state.get().session)!=null&&r.id)&&!await this.sessionCtx.createSession()){console.error("Failed to create session");return}const v=(u=this.sessionCtx.state.get().session)==null?void 0:u.id;if(!v)return;const{data:o}=await this.api.sendMessage({uuid:y.id,bot_token:this.config.token,headers:this.config.headers,query_params:this.config.queryParams,session_id:v,user:this.config.user,...e},this.sendMessageAbortController.signal);if(o!=null&&o.success){const h=d.toBotMessage(o);if(h){const w=this.state.get().messages;if(!!w.some(T=>T.id===h.id))return;this.state.setPartial({messages:[...w,h]})}else(m=o.options)!=null&&m.value&&((C=o.options)==null?void 0:C.value.length)>0&&this.state.setPartial({suggestedReplies:o.options.value})}else{const h=d.toErrorMessage(((b=o==null?void 0:o.error)==null?void 0:b.message)||"Unknown error occurred"),w=this.state.get().messages;this.state.setPartial({messages:[...w,h]})}}catch(y){this.sendMessageAbortController.signal.aborted||console.error("Failed to send message:",y)}finally{this.state.setPartial({isSendingMessage:!1})}});s(this,"fetchAndSetHistory",async(e,t)=>{var r;const i=(r=this.state.get().messages.at(-1))==null?void 0:r.timestamp,{data:n}=await this.api.getSessionHistory({sessionId:e,lastMessageTimestamp:i,abortSignal:t});if(n&&n.length>0){const u=this.state.get().messages,m=n.map(d.mapHistoryToMessage).filter(C=>!u.some(b=>b.id===C.id));this.state.setPartial({messages:[...u,...m]})}});this.config=e,this.api=t,this.sessionCtx=i,this.registerPolling()}static mapHistoryToMessage(e){const t={id:e.publicId,timestamp:e.sentAt||"",attachments:e.attachments||void 0};return e.sender.kind==="user"?{...t,type:"FROM_USER",content:e.content.text||"",deliveredAt:e.sentAt||""}:e.sender.kind==="agent"?{...t,type:"FROM_AGENT",component:"agent_message",data:{message:e.content.text||""}}:{...t,type:"FROM_BOT",component:"bot_message",agent:{id:null,name:e.sender.name||"",isAi:e.sender.kind==="ai",avatar:e.sender.avatar||null},data:{message:e.content.text}}}static toUserMessage(e,t){return{id:P(),type:"FROM_USER",content:e,deliveredAt:new Date().toISOString(),attachments:t,timestamp:new Date().toISOString()}}static toBotMessage(e){if(e.success&&e.autopilotResponse)return{type:"FROM_BOT",id:e.autopilotResponse.id||P(),timestamp:new Date().toISOString(),component:"bot_message",data:{message:e.autopilotResponse.value.content}};if(e.success&&e.uiResponse){const t=e.uiResponse.value;return{type:"FROM_BOT",id:P(),timestamp:new Date().toISOString(),component:t.name,data:t.request_response}}return null}static toErrorMessage(e){return{type:"FROM_BOT",id:P(),timestamp:new Date().toISOString(),component:"TEXT",data:{message:e,variant:"error"}}}}class _{constructor(e){s(this,"api");s(this,"poller",new M);s(this,"state",new f({session:null,isCreatingSession:!1}));s(this,"reset",async()=>{this.state.reset(),this.poller.reset()});s(this,"registerPolling",()=>{this.state.subscribe(({session:e})=>{e!=null&&e.id?this.poller.startPolling(async t=>{const{data:i}=await this.fetch(e.id,t);i&&this.state.setPartial({session:i})},1e3):this.poller.reset()})});s(this,"createSession",async()=>{this.state.setPartial({session:null,isCreatingSession:!0});const{data:e,error:t}=await this.api.createSession();return e?(this.state.setPartial({session:e,isCreatingSession:!1}),e):(console.error("Failed to create session:",t),null)});s(this,"fetch",async(e,t)=>this.api.getSession({sessionId:e,abortSignal:t}));this.api=e,this.registerPolling()}}class H{constructor({config:e}){s(this,"config");s(this,"api");s(this,"contactCtx");s(this,"sessionCtx");s(this,"messageCtx");s(this,"resetChat",()=>{this.sessionCtx.reset(),this.messageCtx.reset()});this.config=e,this.api=new q({config:e}),this.contactCtx=new B({api:this.api,config:this.config}),this.sessionCtx=new _(this.api),this.messageCtx=new d({config:this.config,api:this.api,sessionCtx:this.sessionCtx})}}exports.PubSub=f;exports.WidgetCtx=H;
|
|
2
|
-
//# sourceMappingURL=widget-
|
|
1
|
+
"use strict";var x=Object.defineProperty;var A=a=>{throw TypeError(a)};var O=(a,e,t)=>e in a?x(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var s=(a,e,t)=>O(a,typeof e!="symbol"?e+"":e,t),U=(a,e,t)=>e.has(a)||A("Cannot "+t);var c=(a,e,t)=>(U(a,e,"read from private field"),t?t.call(a):e.get(a)),S=(a,e,t)=>e.has(a)?A("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(a):e.set(a,t),p=(a,e,t,i)=>(U(a,e,"write to private field"),i?i.call(a,t):e.set(a,t),t);const R=require("axios"),E=require("openapi-fetch"),F=require("lodash.isequal"),L=require("uuid"),D=a=>{console.log(a.error)},I=a=>{const e=E({baseUrl:a.baseUrl}),t={onRequest:a.onRequest,onResponse:a.onResponse,onError:a.onError||D};return e.use(t),e};class q{constructor({config:e}){s(this,"client");s(this,"uploadFileClient");s(this,"config");s(this,"constructClientOptions",e=>{const t=this.config.apiUrl||"https://api.open.cx",i={"X-Bot-Token":this.config.token,"Content-Type":"application/json",Accept:"application/json",Authorization:e?`Bearer ${e}`:void 0};return{baseUrl:t,headers:i}});s(this,"createOpenAPIClient",({baseUrl:e,headers:t})=>I({baseUrl:e,onRequest:({request:i})=>{Object.entries(t).forEach(([n,r])=>{r&&i.headers.set(n,r)})}}));s(this,"createAxiosUploadClient",({baseUrl:e,headers:t})=>R.create({baseURL:`${e}/backend/widget/v2/upload`,headers:t}));s(this,"setAuthToken",e=>{const{baseUrl:t,headers:i}=this.constructClientOptions(e);this.client=this.createOpenAPIClient({baseUrl:t,headers:i}),this.uploadFileClient=this.createAxiosUploadClient({baseUrl:t,headers:i})});s(this,"widgetPrelude",async()=>await this.client.GET("/backend/widget/v2/prelude",{params:{header:{"X-Bot-Token":this.config.token}}}));s(this,"sendMessage",async(e,t)=>await this.client.POST("/backend/widget/v2/chat/send",{body:e,signal:t}));s(this,"getSessionHistory",async({sessionId:e,lastMessageTimestamp:t,abortSignal:i})=>{const n=t?{lastMessageTimestamp:t}:void 0;return await this.client.GET("/backend/widget/v2/session/history/{sessionId}",{params:{path:{sessionId:e},query:n},signal:i})});s(this,"createUnverifiedContact",async e=>await this.client.POST("/backend/widget/v2/contact/create-unverified",{params:{header:{"x-bot-token":this.config.token}},body:e}));s(this,"createSession",async()=>await this.client.POST("/backend/widget/v2/create-session"));s(this,"getSession",async({sessionId:e,abortSignal:t})=>await this.client.GET("/backend/widget/v2/session/{sessionId}",{params:{path:{sessionId:e}},signal:t}));s(this,"uploadFile",async(e,t={})=>{const i=new FormData;i.append("file",e.file);const{data:n}=await this.uploadFileClient.post("",i,{headers:{"Content-Type":"multipart/form-data"},...t});return n});s(this,"vote",async e=>await this.client.POST("/backend/widget/v2/chat/vote",{body:e}));this.config=e;const{baseUrl:t,headers:i}=this.constructClientOptions(e.contactToken);this.client=this.createOpenAPIClient({baseUrl:t,headers:i}),this.uploadFileClient=this.createAxiosUploadClient({baseUrl:t,headers:i})}}var l,g;class f{constructor(e){s(this,"subscribers",new Set);S(this,l);s(this,"initialState");S(this,g);s(this,"lifecycleListeners",new Map);s(this,"emitLifecycle",(e,t)=>{const i=this.lifecycleListeners.get(e);if(i){const n={type:e,timestamp:Date.now(),data:t};i.forEach(r=>{try{r(n)}catch{}})}});s(this,"notifySubscribers",e=>{Array.from(this.subscribers).forEach(i=>{try{i(e)}catch(n){this.emitLifecycle("error",{error:n})}})});s(this,"subscribe",e=>(this.subscribers.add(e),()=>{this.subscribers.delete(e)}));s(this,"onLifecycle",(e,t)=>{this.lifecycleListeners.has(e)||this.lifecycleListeners.set(e,new Set);const i=this.lifecycleListeners.get(e);return i.add(t),()=>{i.delete(t),i.size===0&&this.lifecycleListeners.delete(e)}});s(this,"get",()=>c(this,l));s(this,"set",e=>{this.emitLifecycle("beforeUpdate",{previousState:c(this,l),nextState:e}),F(c(this,l),e)||(p(this,l,e),p(this,g,Date.now()),this.emitLifecycle("stateChange",{state:e}),this.notifySubscribers(e)),this.emitLifecycle("afterUpdate",{state:e})});s(this,"setPartial",e=>{if(e==null)return;const t={...c(this,l),...e};this.set(t)});s(this,"clear",()=>{this.emitLifecycle("destroy"),this.subscribers=new Set,this.lifecycleListeners=new Map});s(this,"reset",()=>{this.set(this.initialState)});s(this,"lastUpdated",()=>c(this,g));p(this,l,e),this.initialState=e,p(this,g,Date.now()),this.emitLifecycle("init",{initialState:c(this,l)})}}l=new WeakMap,g=new WeakMap;class B{constructor({config:e,api:t}){s(this,"config");s(this,"api");s(this,"state");s(this,"shouldCollectData",()=>{var t;return!!(!((t=this.state.get().contact)!=null&&t.token)&&this.config.collectUserData)});s(this,"autoCreateUnverifiedUser",async()=>{var e,t;await this.createUnverifiedContact({name:((e=this.config.user)==null?void 0:e.name)||"Anonymous",email:(t=this.config.user)==null?void 0:t.email})});s(this,"createUnverifiedContact",async e=>{try{this.state.setPartial({isCreatingUnverifiedContact:!0,isErrorCreatingUnverifiedContact:!1});const{data:t}=await this.api.createUnverifiedContact(e);t!=null&&t.token?(this.state.setPartial({contact:{token:t.token}}),this.api.setAuthToken(t.token)):this.state.setPartial({isErrorCreatingUnverifiedContact:!0})}finally{this.state.setPartial({isCreatingUnverifiedContact:!1})}});this.config=e,this.api=t,this.state=new f({contact:e.contactToken?{token:e.contactToken}:null,isCreatingUnverifiedContact:!1,isErrorCreatingUnverifiedContact:!1}),!e.contactToken&&!e.collectUserData&&this.autoCreateUnverifiedUser()}}class M{constructor(){s(this,"state",new f({isPolling:!1,isError:!1}));s(this,"abortController",new AbortController);s(this,"reset",()=>{var e;this.abortController.abort("Resetting poller"),(e=this.stopPolling)==null||e.call(this),this.stopPolling=null});s(this,"stopPolling",null);s(this,"startPolling",(e,t)=>{if(this.stopPolling)return;const i=[],n=async()=>{this.abortController=new AbortController,this.state.setPartial({isPolling:!0});try{await e(this.abortController.signal)}catch(r){if(this.abortController.signal.aborted)return;console.error("Failed to poll:",r),this.state.setPartial({isError:!0})}finally{this.state.setPartial({isPolling:!1})}this.abortController.signal.aborted?console.log("Poller aborted, not scheduling anymore"):i.push(setTimeout(n,t))};n(),this.stopPolling=()=>{i.forEach(clearTimeout),this.state.reset()}})}}function P(){return L.v4()}class _{constructor(e){s(this,"api");s(this,"poller",new M);s(this,"state",new f({session:null,isCreatingSession:!1}));s(this,"reset",async()=>{this.state.reset(),this.poller.reset()});s(this,"registerPolling",()=>{this.state.subscribe(({session:e})=>{e!=null&&e.id?this.poller.startPolling(async t=>{const{data:i}=await this.fetch(e.id,t);i&&this.state.setPartial({session:i})},1e3):this.poller.reset()})});s(this,"createSession",async()=>{this.state.setPartial({session:null,isCreatingSession:!0});const{data:e,error:t}=await this.api.createSession();return e?(this.state.setPartial({session:e,isCreatingSession:!1}),e):(console.error("Failed to create session:",t),null)});s(this,"fetch",async(e,t)=>this.api.getSession({sessionId:e,abortSignal:t}));this.api=e,this.registerPolling()}}class d{constructor({config:e,api:t,sessionCtx:i}){s(this,"config");s(this,"api");s(this,"sessionCtx");s(this,"poller",new M);s(this,"state",new f({messages:[],isSendingMessage:!1,suggestedReplies:null}));s(this,"sendMessageAbortController",new AbortController);s(this,"reset",()=>{this.sendMessageAbortController.abort("Resetting chat"),this.state.reset(),this.poller.reset()});s(this,"registerPolling",()=>{this.sessionCtx.state.subscribe(({session:e})=>{e!=null&&e.id?this.poller.startPolling(async t=>{await this.fetchAndSetHistory(e.id,t)},1e3):this.poller.reset()})});s(this,"sendMessage",async e=>{var n,r,u,m,C,b;this.sendMessageAbortController=new AbortController;const t=this.state.get().isSendingMessage,i=((n=this.sessionCtx.state.get().session)==null?void 0:n.assignee.kind)==="ai";if(t&&i){console.warn("Cannot send messages while awaiting AI response");return}this.state.setPartial({suggestedReplies:null});try{this.state.setPartial({isSendingMessage:!0});const y=d.toUserMessage(e.content,e.attachments||void 0),k=this.state.get().messages;if(this.state.setPartial({messages:[...k,y]}),!((r=this.sessionCtx.state.get().session)!=null&&r.id)&&!await this.sessionCtx.createSession()){console.error("Failed to create session");return}const v=(u=this.sessionCtx.state.get().session)==null?void 0:u.id;if(!v)return;const{data:o}=await this.api.sendMessage({uuid:y.id,bot_token:this.config.token,headers:this.config.headers,query_params:this.config.queryParams,session_id:v,user:this.config.user,...e},this.sendMessageAbortController.signal);if(o!=null&&o.success){const h=d.toBotMessage(o);if(h){const w=this.state.get().messages;if(!!w.some(T=>T.id===h.id))return;this.state.setPartial({messages:[...w,h]})}else(m=o.options)!=null&&m.value&&((C=o.options)==null?void 0:C.value.length)>0&&this.state.setPartial({suggestedReplies:o.options.value})}else{const h=d.toErrorMessage(((b=o==null?void 0:o.error)==null?void 0:b.message)||"Unknown error occurred"),w=this.state.get().messages;this.state.setPartial({messages:[...w,h]})}}catch(y){this.sendMessageAbortController.signal.aborted||console.error("Failed to send message:",y)}finally{this.state.setPartial({isSendingMessage:!1})}});s(this,"fetchAndSetHistory",async(e,t)=>{var r;const i=(r=this.state.get().messages.at(-1))==null?void 0:r.timestamp,{data:n}=await this.api.getSessionHistory({sessionId:e,lastMessageTimestamp:i,abortSignal:t});if(n&&n.length>0){const u=this.state.get().messages,m=n.map(d.mapHistoryToMessage).filter(C=>!u.some(b=>b.id===C.id));this.state.setPartial({messages:[...u,...m]})}});this.config=e,this.api=t,this.sessionCtx=i,this.registerPolling()}static mapHistoryToMessage(e){const t={id:e.publicId,timestamp:e.sentAt||"",attachments:e.attachments||void 0};return e.sender.kind==="user"?{...t,type:"FROM_USER",content:e.content.text||"",deliveredAt:e.sentAt||""}:e.sender.kind==="agent"?{...t,type:"FROM_AGENT",component:"agent_message",data:{message:e.content.text||""}}:{...t,type:"FROM_BOT",component:"bot_message",agent:{id:null,name:e.sender.name||"",isAi:e.sender.kind==="ai",avatar:e.sender.avatar||null},data:{message:e.content.text}}}static toUserMessage(e,t){return{id:P(),type:"FROM_USER",content:e,deliveredAt:new Date().toISOString(),attachments:t,timestamp:new Date().toISOString()}}static toBotMessage(e){if(e.success&&e.autopilotResponse)return{type:"FROM_BOT",id:e.autopilotResponse.id||P(),timestamp:new Date().toISOString(),component:"bot_message",data:{message:e.autopilotResponse.value.content}};if(e.success&&e.uiResponse){const t=e.uiResponse.value;return{type:"FROM_BOT",id:P(),timestamp:new Date().toISOString(),component:t.name,data:t.request_response}}return null}static toErrorMessage(e){return{type:"FROM_BOT",id:P(),timestamp:new Date().toISOString(),component:"TEXT",data:{message:e,variant:"error"}}}}class H{constructor({config:e}){s(this,"config");s(this,"api");s(this,"contactCtx");s(this,"sessionCtx");s(this,"messageCtx");s(this,"resetChat",()=>{this.sessionCtx.reset(),this.messageCtx.reset()});this.config=e,this.api=new q({config:e}),this.contactCtx=new B({api:this.api,config:this.config}),this.sessionCtx=new _(this.api),this.messageCtx=new d({config:this.config,api:this.api,sessionCtx:this.sessionCtx})}}exports.PubSub=f;exports.WidgetCtx=H;
|
|
2
|
+
//# sourceMappingURL=widget-DlAUwHzU.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget-DlAUwHzU.cjs","sources":["../src/headless/core/sdk/index.ts","../src/headless/core/api.ts","../src/headless/core/utils/PubSub.ts","../src/headless/core/context/contact.ts","../src/headless/core/utils/Poller.ts","../src/headless/core/utils/uuid.ts","../src/headless/core/context/session.ts","../src/headless/core/context/message.ts","../src/headless/core/context/widget.ts"],"sourcesContent":["import createClient, { type Middleware } from \"openapi-fetch\";\nimport type { paths } from \"./schema\";\nimport type { components } from \"./schema\";\n\ntype Options = {\n baseUrl: string;\n onRequest?: Middleware[\"onRequest\"];\n onResponse?: Middleware[\"onResponse\"];\n onError?: Middleware[\"onError\"];\n};\n\nconst defaultOnError: Middleware[\"onError\"] = (onErrorOptions) => {\n console.log(onErrorOptions.error);\n};\n\nexport const basicClient = (options: Options) => {\n const client = createClient<paths>({\n baseUrl: options.baseUrl,\n });\n\n const middlewares: Middleware = {\n onRequest: options.onRequest,\n onResponse: options.onResponse,\n onError: options.onError || defaultOnError,\n };\n\n client.use(middlewares);\n return client;\n};\n\nexport type Endpoint = keyof paths;\nexport type Dto = components[\"schemas\"];\n","import axios, { type AxiosInstance, type AxiosRequestConfig } from \"axios\";\nimport { type Dto, type Endpoint, basicClient } from \"./sdk\";\nimport type { WidgetConfig } from \"./types/WidgetConfig\";\nimport type { SendMessageDto, VoteInputDto } from \"./types/schemas\";\n\nexport class ApiCaller {\n private client: ReturnType<typeof basicClient>;\n private uploadFileClient: AxiosInstance;\n private config: WidgetConfig;\n\n constructor({\n config,\n }: {\n config: WidgetConfig;\n }) {\n this.config = config;\n const { baseUrl, headers } = this.constructClientOptions(\n config.contactToken,\n );\n this.client = this.createOpenAPIClient({ baseUrl, headers });\n this.uploadFileClient = this.createAxiosUploadClient({ baseUrl, headers });\n }\n\n private constructClientOptions = (token: string | null | undefined) => {\n const baseUrl = this.config.apiUrl || \"https://api.open.cx\";\n const headers = {\n \"X-Bot-Token\": this.config.token,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n Authorization: token ? `Bearer ${token}` : undefined,\n };\n\n return { baseUrl, headers };\n };\n\n private createOpenAPIClient = ({\n baseUrl,\n headers,\n }: ReturnType<typeof this.constructClientOptions>) => {\n return basicClient({\n baseUrl,\n onRequest: ({ request }) => {\n Object.entries(headers).forEach(([key, value]) => {\n if (value) {\n request.headers.set(key, value);\n }\n });\n },\n });\n };\n private createAxiosUploadClient = ({\n baseUrl,\n headers,\n }: ReturnType<typeof this.constructClientOptions>) => {\n const uploadPath = \"/backend/widget/v2/upload\" satisfies Endpoint;\n return axios.create({\n baseURL: `${baseUrl}${uploadPath}`,\n headers,\n });\n };\n\n setAuthToken = (token: string) => {\n const { baseUrl, headers } = this.constructClientOptions(token);\n this.client = this.createOpenAPIClient({ baseUrl, headers });\n this.uploadFileClient = this.createAxiosUploadClient({ baseUrl, headers });\n };\n\n widgetPrelude = async () => {\n return await this.client.GET(\"/backend/widget/v2/prelude\", {\n params: { header: { \"X-Bot-Token\": this.config.token } },\n });\n };\n\n sendMessage = async (body: SendMessageDto, abortSignal?: AbortSignal) => {\n return await this.client.POST(\"/backend/widget/v2/chat/send\", {\n body,\n signal: abortSignal,\n });\n };\n\n getSessionHistory = async ({\n sessionId,\n lastMessageTimestamp,\n abortSignal,\n }: {\n sessionId: string;\n lastMessageTimestamp?: string;\n abortSignal: AbortSignal;\n }) => {\n const query = lastMessageTimestamp ? { lastMessageTimestamp } : undefined;\n return await this.client.GET(\n \"/backend/widget/v2/session/history/{sessionId}\",\n { params: { path: { sessionId }, query }, signal: abortSignal },\n );\n };\n\n createUnverifiedContact = async (body: Dto[\"CreateUnverifiedContactDto\"]) => {\n return await this.client.POST(\n \"/backend/widget/v2/contact/create-unverified\",\n {\n params: { header: { \"x-bot-token\": this.config.token } },\n body,\n },\n );\n };\n\n createSession = async () => {\n return await this.client.POST(\"/backend/widget/v2/create-session\");\n };\n\n getSession = async ({\n sessionId,\n abortSignal,\n }: { sessionId: string; abortSignal: AbortSignal }) => {\n return await this.client.GET(\"/backend/widget/v2/session/{sessionId}\", {\n params: { path: { sessionId } },\n signal: abortSignal,\n });\n };\n\n uploadFile = async (\n file: {\n id: string;\n file: File;\n },\n config: Partial<AxiosRequestConfig> = {},\n ) => {\n const formData = new FormData();\n formData.append(\"file\", file.file);\n\n // Couldn't get this to work with the openapi client... dunno why...\n const { data } = await this.uploadFileClient.post<\n Dto[\"UploadWidgetFileResponseDto\"]\n >(\"\", formData, {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n ...config,\n });\n return data;\n };\n\n vote = async (body: VoteInputDto) => {\n return await this.client.POST(\"/backend/widget/v2/chat/vote\", { body });\n };\n}\n","import isEqual from \"lodash.isequal\";\n\nexport type Subscriber<T> = (data: T) => void;\n\nexport enum LifecycleEvent {\n INIT = \"init\",\n STATE_CHANGE = \"stateChange\",\n BEFORE_UPDATE = \"beforeUpdate\",\n AFTER_UPDATE = \"afterUpdate\",\n DESTROY = \"destroy\",\n ERROR = \"error\",\n}\n\ntype LifecycleListener = (event: {\n type: LifecycleEvent;\n timestamp: number;\n data?: any;\n}) => void;\n\nexport class PubSub<S> {\n private subscribers = new Set<Subscriber<S>>();\n #state: S;\n private initialState: S;\n #lastUpdated: number | null;\n private lifecycleListeners: Map<LifecycleEvent, Set<LifecycleListener>> =\n new Map();\n\n constructor(state: S) {\n this.#state = state;\n this.initialState = state;\n this.#lastUpdated = Date.now();\n this.emitLifecycle(LifecycleEvent.INIT, { initialState: this.#state });\n }\n\n private emitLifecycle = (event: LifecycleEvent, data?: any) => {\n const listeners = this.lifecycleListeners.get(event);\n if (listeners) {\n const eventData = {\n type: event,\n timestamp: Date.now(),\n data,\n };\n listeners.forEach((listener) => {\n try {\n listener(eventData);\n } catch {\n // ignore error\n }\n });\n }\n };\n\n private notifySubscribers = (state: S) => {\n const subscribersArray = Array.from(this.subscribers);\n subscribersArray.forEach((callback) => {\n try {\n callback(state);\n } catch (error) {\n this.emitLifecycle(LifecycleEvent.ERROR, { error });\n }\n });\n };\n\n /**\n * Subscribe to state changes\n * @param callback Function to call when state changes\n * @returns Unsubscribe function\n */\n subscribe = (callback: Subscriber<S>): (() => void) => {\n this.subscribers.add(callback);\n // Don't call the callback immediately with current state\n return () => {\n this.subscribers.delete(callback);\n };\n };\n\n onLifecycle = (\n event: LifecycleEvent,\n listener: LifecycleListener,\n ): (() => void) => {\n if (!this.lifecycleListeners.has(event)) {\n this.lifecycleListeners.set(event, new Set());\n }\n const listeners = this.lifecycleListeners.get(event)!;\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0) {\n this.lifecycleListeners.delete(event);\n }\n };\n };\n\n /** Get the current state */\n get = (): S => {\n return this.#state;\n };\n\n // TODO make this provide prev state\n /**\n * Set the state and notify subscribers if the state changes\n * @param newState The new state to set\n */\n set = (newState: S): void => {\n this.emitLifecycle(LifecycleEvent.BEFORE_UPDATE, {\n previousState: this.#state,\n nextState: newState,\n });\n\n if (!isEqual(this.#state, newState)) {\n this.#state = newState;\n this.#lastUpdated = Date.now();\n this.emitLifecycle(LifecycleEvent.STATE_CHANGE, { state: newState });\n this.notifySubscribers(newState);\n }\n\n this.emitLifecycle(LifecycleEvent.AFTER_UPDATE, { state: newState });\n };\n\n // TODO make this provide prev state\n setPartial = (_s: Partial<S>): void => {\n if (_s === undefined || _s === null) return;\n const newState = { ...this.#state, ..._s };\n this.set(newState);\n };\n\n /**\n * Clear all subscriptions\n */\n clear = (): void => {\n this.emitLifecycle(LifecycleEvent.DESTROY);\n this.subscribers = new Set(); // Create a new Set instead of just clearing\n this.lifecycleListeners = new Map();\n };\n\n reset = (): void => {\n this.set(this.initialState);\n };\n\n lastUpdated = (): number | null => {\n return this.#lastUpdated;\n };\n}\n","import { PubSub } from \"../utils/PubSub\";\nimport { ApiCaller } from \"../api\";\nimport { type WidgetConfig } from \"../types/WidgetConfig\";\nimport { type Dto } from \"../sdk\";\n\ntype ContactState = {\n contact: { token: string } | null;\n isCreatingUnverifiedContact: boolean;\n isErrorCreatingUnverifiedContact: boolean;\n};\n\nexport class ContactCtx {\n private config: WidgetConfig;\n private api: ApiCaller;\n state: PubSub<ContactState>;\n\n constructor({\n config,\n api,\n }: {\n api: ApiCaller;\n config: WidgetConfig;\n }) {\n this.config = config;\n this.api = api;\n\n this.state = new PubSub<ContactState>({\n contact: config.contactToken ? { token: config.contactToken } : null,\n isCreatingUnverifiedContact: false,\n isErrorCreatingUnverifiedContact: false,\n });\n\n if (!config.contactToken && !config.collectUserData) {\n this.autoCreateUnverifiedUser();\n }\n }\n\n shouldCollectData = (): boolean => {\n const currentState = this.state.get();\n\n if (!currentState.contact?.token && this.config.collectUserData) {\n return true;\n } else {\n return false;\n }\n };\n\n autoCreateUnverifiedUser = async () => {\n await this.createUnverifiedContact({\n name: this.config.user?.name || \"Anonymous\",\n email: this.config.user?.email,\n });\n };\n\n createUnverifiedContact = async (\n payload: Dto[\"CreateUnverifiedContactDto\"],\n ): Promise<void> => {\n try {\n this.state.setPartial({\n isCreatingUnverifiedContact: true,\n isErrorCreatingUnverifiedContact: false,\n });\n\n const { data } = await this.api.createUnverifiedContact(payload);\n if (data?.token) {\n this.state.setPartial({ contact: { token: data.token } });\n this.api.setAuthToken(data.token);\n } else {\n this.state.setPartial({ isErrorCreatingUnverifiedContact: true });\n }\n } finally {\n this.state.setPartial({ isCreatingUnverifiedContact: false });\n }\n };\n}\n","import { PubSub } from \"./PubSub\";\n\nexport type PollingState = {\n isPolling: boolean;\n isError: boolean;\n};\n\nexport class Poller {\n state = new PubSub<PollingState>({\n isPolling: false,\n isError: false,\n });\n private abortController = new AbortController();\n\n reset = () => {\n this.abortController.abort(\"Resetting poller\");\n this.stopPolling?.();\n this.stopPolling = null;\n };\n\n stopPolling: (() => void) | null = null;\n\n startPolling = (\n cb: (abortSignal: AbortSignal) => Promise<void>,\n interval: number,\n ) => {\n if (this.stopPolling) return;\n\n const timeouts: NodeJS.Timeout[] = [];\n\n const poll = async () => {\n this.abortController = new AbortController();\n this.state.setPartial({ isPolling: true });\n\n try {\n await cb(this.abortController.signal);\n } catch (error) {\n if (this.abortController.signal.aborted) {\n // If aborted, just return and do not schedule the nest poll\n return;\n } else {\n console.error(\"Failed to poll:\", error);\n this.state.setPartial({ isError: true });\n } \n } finally {\n this.state.setPartial({ isPolling: false });\n }\n\n // Another check to stop scheduling polls in case someone removes the early return in the catch above\n if (this.abortController.signal.aborted) {\n console.log(\"Poller aborted, not scheduling anymore\");\n } else {\n timeouts.push(setTimeout(poll, interval));\n }\n };\n\n poll();\n\n this.stopPolling = () => {\n timeouts.forEach(clearTimeout);\n this.state.reset();\n };\n };\n}\n","import { v4 as uuidv4 } from \"uuid\";\n\nexport function genUuid() {\n return uuidv4();\n}\n","import type { ApiCaller } from \"../api\";\nimport type { SessionDto } from \"../types/schemas\";\nimport { Poller } from \"../utils/Poller\";\nimport { PubSub } from \"../utils/PubSub\";\n\nexport class SessionCtx {\n private api: ApiCaller;\n private poller = new Poller();\n\n public state = new PubSub<{\n session: SessionDto | null;\n isCreatingSession: boolean;\n }>({\n session: null,\n isCreatingSession: false,\n });\n\n constructor(api: ApiCaller) {\n this.api = api;\n this.registerPolling();\n }\n\n /** Clears the session and stops polling */\n reset = async () => {\n this.state.reset();\n // The poller should automatically reset, since we're subscribed to the session state, and whenever it's null, the poller resets... but just in case, let's reset it here as well\n this.poller.reset();\n };\n\n registerPolling = () => {\n this.state.subscribe(({ session }) => {\n if (session?.id) {\n this.poller.startPolling(async (abortSignal) => {\n const { data } = await this.fetch(session.id, abortSignal);\n data && this.state.setPartial({ session: data });\n }, 1000);\n } else {\n this.poller.reset();\n }\n });\n };\n\n /**\n * Creates a new session\n * @returns The session\n */\n createSession = async () => {\n this.state.setPartial({ session: null, isCreatingSession: true });\n\n const { data: session, error } = await this.api.createSession();\n if (session) {\n this.state.setPartial({ session, isCreatingSession: false });\n return session;\n }\n\n console.error(\"Failed to create session:\", error);\n return null;\n };\n\n /**\n * Fetches the session from the API\n * @param id - The ID of the session to fetch\n * @returns The session\n */\n fetch = async (sessionId: string, abortSignal: AbortSignal) => {\n return this.api.getSession({ sessionId, abortSignal });\n };\n}\n","import { ApiCaller } from \"../api\";\nimport type { WidgetConfig } from \"../types/WidgetConfig\";\nimport type { SafeOmit, SomeOptional } from \"../types/helpers\";\nimport type { BotMessageType, MessageType, UserMessageType } from \"../types/messages\";\nimport type { MessageAttachmentType, MessageDto, SendMessageDto, SendMessageOutputDto } from \"../types/schemas\";\nimport { Poller } from \"../utils/Poller\";\nimport { PubSub } from \"../utils/PubSub\";\nimport { genUuid } from \"../utils/uuid\";\nimport { SessionCtx } from \"./session\";\n\nexport class MessageCtx {\n private config: WidgetConfig;\n private api: ApiCaller;\n private sessionCtx: SessionCtx;\n private poller = new Poller();\n\n public state = new PubSub<{\n messages: MessageType[];\n isSendingMessage: boolean;\n suggestedReplies: string[] | null;\n }>({\n messages: [],\n isSendingMessage: false,\n suggestedReplies: null,\n });\n\n private sendMessageAbortController = new AbortController();\n\n constructor({\n config,\n api,\n sessionCtx,\n }: { config: WidgetConfig; api: ApiCaller; sessionCtx: SessionCtx }) {\n this.config = config;\n this.api = api;\n this.sessionCtx = sessionCtx;\n\n this.registerPolling();\n }\n\n reset = () => {\n this.sendMessageAbortController.abort(\"Resetting chat\");\n this.state.reset();\n // The poller should automatically reset, since we're subscribed to the session state, and whenever it's null, the poller resets... but just in case, let's reset it here as well\n this.poller.reset();\n };\n\n registerPolling = () => {\n this.sessionCtx.state.subscribe(({ session }) => {\n if (session?.id) {\n this.poller.startPolling(async (abortSignal) => {\n await this.fetchAndSetHistory(session.id, abortSignal);\n }, 1000);\n } else {\n this.poller.reset();\n }\n });\n };\n\n sendMessage = async (\n input: SomeOptional<\n SafeOmit<SendMessageDto, \"bot_token\" | \"uuid\">,\n \"session_id\" | \"user\"\n >,\n ): Promise<void> => {\n this.sendMessageAbortController = new AbortController();\n /* ------------------------------------------------------ */\n /* Prevent sending while waiting for AI res */\n /* ------------------------------------------------------ */\n const isSending = this.state.get().isSendingMessage;\n const isAssignedToAI =\n this.sessionCtx.state.get().session?.assignee.kind === \"ai\";\n if (isSending && isAssignedToAI) {\n console.warn(\"Cannot send messages while awaiting AI response\");\n return;\n }\n\n /* ------------------------------------------------------ */\n /* Clear suggested replies */\n /* ------------------------------------------------------ */\n this.state.setPartial({ suggestedReplies: null });\n\n try {\n this.state.setPartial({ isSendingMessage: true });\n /* ------------------------------------------------------ */\n /* Optimistically add message to rendered messages */\n /* ------------------------------------------------------ */\n const userMessage = MessageCtx.toUserMessage(\n input.content,\n input.attachments || undefined,\n );\n const currentMessages = this.state.get().messages;\n this.state.setPartial({\n messages: [...currentMessages, userMessage],\n });\n\n /* ------------------------------------------------------ */\n /* Create session if not exists */\n /* ------------------------------------------------------ */\n if (!this.sessionCtx.state.get().session?.id) {\n const createdSession = await this.sessionCtx.createSession();\n\n // TODO: apply some retry logic here\n if (!createdSession) {\n console.error(\"Failed to create session\");\n return;\n }\n }\n const sessionId = this.sessionCtx.state.get().session?.id;\n if (!sessionId) return;\n\n /* ------------------------------------------------------ */\n /* Send and wait for bot response */\n /* ------------------------------------------------------ */\n const { data } = await this.api.sendMessage(\n {\n uuid: userMessage.id,\n bot_token: this.config.token,\n headers: this.config.headers,\n query_params: this.config.queryParams,\n session_id: sessionId,\n user: this.config.user,\n ...input,\n },\n this.sendMessageAbortController.signal,\n );\n\n if (data?.success) {\n /* ------------------------------------------------------ */\n /* Append bot reply if not fetched from polling */\n /* ------------------------------------------------------ */\n const botMessage = MessageCtx.toBotMessage(data);\n if (botMessage) {\n const prevMessages = this.state.get().messages;\n const shouldAppend = !prevMessages.some(\n (m) => m.id === botMessage.id,\n );\n if (!shouldAppend) return;\n this.state.setPartial({ messages: [...prevMessages, botMessage] });\n } else {\n /* ------------------------------------------------------ */\n /* Check if bot responded with suggested replies */\n /* ------------------------------------------------------ */\n if (data.options?.value && data.options?.value.length > 0) {\n this.state.setPartial({ suggestedReplies: data.options.value });\n }\n }\n } else {\n const errorMessage = MessageCtx.toErrorMessage(\n data?.error?.message || \"Unknown error occurred\",\n );\n const currentMessages = this.state.get().messages;\n this.state.setPartial({\n messages: [...currentMessages, errorMessage],\n });\n }\n } catch (error) {\n if (!this.sendMessageAbortController.signal.aborted) {\n console.error(\"Failed to send message:\", error);\n }\n } finally {\n this.state.setPartial({ isSendingMessage: false });\n }\n };\n\n fetchAndSetHistory = async (\n sessionId: string,\n abortSignal: AbortSignal,\n ): Promise<void> => {\n const lastMessageTimestamp = this.state.get().messages.at(-1)?.timestamp;\n\n const { data: response } = await this.api.getSessionHistory({\n sessionId,\n lastMessageTimestamp,\n abortSignal,\n });\n\n if (response && response.length > 0) {\n // Get a fresh reference to current messages after the poll is done\n const prevMessages = this.state.get().messages;\n const newMessages = response\n .map(MessageCtx.mapHistoryToMessage)\n .filter(\n (newMsg) =>\n !prevMessages.some((existingMsg) => existingMsg.id === newMsg.id),\n );\n this.state.setPartial({\n messages: [...prevMessages, ...newMessages],\n });\n\n // if (newMessages.length > 0) {\n // // const playSoundEffects = config?.settings?.playSoundEffects;\n // // Play notification sound for new messages if enabled\n // // if (\n // // playSoundEffects &&\n // // platform?.audio &&\n // // isAudioAvailable(platform.audio)\n // // ) {\n // // const botMessages = newMessages.filter(\n // // (msg) => msg.type === \"FROM_BOT\",\n // // );\n // // if (botMessages.length > 0) {\n // // await safeAudioOperation(\n // // () => platform.audio!.playNotification(),\n // // \"Failed to play notification sound for new messages\",\n // // );\n // // }\n // // }\n\n // }\n }\n };\n\n /** Not the best name but whatever */\n static mapHistoryToMessage(history: MessageDto): MessageType {\n const commonFields = {\n id: history.publicId,\n timestamp: history.sentAt || \"\",\n attachments: history.attachments || undefined,\n };\n\n if (history.sender.kind === \"user\") {\n return {\n ...commonFields,\n type: \"FROM_USER\",\n content: history.content.text || \"\",\n deliveredAt: history.sentAt || \"\",\n };\n }\n\n if (history.sender.kind === \"agent\") {\n return {\n ...commonFields,\n type: \"FROM_AGENT\",\n component: \"agent_message\",\n data: {\n message: history.content.text || \"\",\n },\n };\n }\n\n return {\n ...commonFields,\n type: \"FROM_BOT\",\n component: \"bot_message\",\n agent: {\n id: null,\n name: history.sender.name || \"\",\n isAi: history.sender.kind === \"ai\",\n avatar: history.sender.avatar || null,\n },\n data: {\n message: history.content.text,\n },\n };\n }\n\n static toUserMessage(\n content: string,\n attachments?: MessageAttachmentType[],\n ): UserMessageType {\n return {\n id: genUuid(),\n type: \"FROM_USER\",\n content,\n deliveredAt: new Date().toISOString(),\n attachments,\n timestamp: new Date().toISOString(),\n };\n }\n\n static toBotMessage(response: SendMessageOutputDto): BotMessageType | null {\n if (response.success && response.autopilotResponse) {\n return {\n type: \"FROM_BOT\",\n id: response.autopilotResponse.id || genUuid(),\n timestamp: new Date().toISOString(),\n component: \"bot_message\",\n data: {\n message: response.autopilotResponse.value.content,\n },\n };\n }\n\n if (response.success && response.uiResponse) {\n const uiVal = response.uiResponse.value;\n return {\n type: \"FROM_BOT\" as const,\n id: genUuid(),\n timestamp: new Date().toISOString(),\n component: uiVal.name,\n data: uiVal.request_response,\n };\n }\n\n return null;\n }\n\n static toErrorMessage(message: string) {\n return {\n type: \"FROM_BOT\" as const,\n id: genUuid(),\n timestamp: new Date().toISOString(),\n component: \"TEXT\",\n data: {\n message,\n variant: \"error\",\n },\n };\n }\n}\n","import { ApiCaller } from \"../api\";\nimport type { WidgetConfig } from \"../types/WidgetConfig\";\nimport { ContactCtx } from \"./contact\";\nimport { MessageCtx } from \"./message\";\nimport { SessionCtx } from \"./session\";\n\nexport class WidgetCtx {\n public config: WidgetConfig;\n public api: ApiCaller;\n public contactCtx: ContactCtx;\n public sessionCtx: SessionCtx;\n public messageCtx: MessageCtx;\n\n constructor({ config }: { config: WidgetConfig }) {\n this.config = config;\n this.api = new ApiCaller({ config });\n\n this.contactCtx = new ContactCtx({\n api: this.api,\n config: this.config,\n });\n\n this.sessionCtx = new SessionCtx(this.api);\n this.messageCtx = new MessageCtx({\n config: this.config,\n api: this.api,\n sessionCtx: this.sessionCtx,\n });\n }\n\n resetChat = () => {\n this.sessionCtx.reset();\n this.messageCtx.reset();\n };\n}\n"],"names":["defaultOnError","onErrorOptions","basicClient","options","client","createClient","middlewares","ApiCaller","config","__publicField","token","baseUrl","headers","request","key","value","axios","body","abortSignal","sessionId","lastMessageTimestamp","query","file","formData","data","PubSub","state","__privateAdd","_state","_lastUpdated","event","listeners","eventData","listener","callback","error","__privateGet","newState","isEqual","__privateSet","_s","ContactCtx","api","_a","_b","payload","Poller","cb","interval","timeouts","poll","genUuid","uuidv4","SessionCtx","session","MessageCtx","sessionCtx","input","isSending","isAssignedToAI","userMessage","currentMessages","_c","botMessage","prevMessages","m","_d","_e","errorMessage","_f","response","newMessages","newMsg","existingMsg","history","commonFields","content","attachments","uiVal","message","WidgetCtx"],"mappings":"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"}
|