codicent-app-sdk 0.3.98 → 0.3.100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +7 -0
  2. package/dist/cjs/components/AiInput.js +1 -1
  3. package/dist/cjs/components/AudioIcon.js +1 -1
  4. package/dist/cjs/components/ChatInput.js +1 -1
  5. package/dist/cjs/components/ChatMessage.js +1 -1
  6. package/dist/cjs/components/CombinedPlaceholderDialog.js +1 -1
  7. package/dist/cjs/components/Footer.js +1 -1
  8. package/dist/cjs/components/Header.d.ts.map +1 -1
  9. package/dist/cjs/components/Header.js +1 -1
  10. package/dist/cjs/components/HtmlView.js +1 -1
  11. package/dist/cjs/components/MessageInput.js +1 -1
  12. package/dist/cjs/components/MessageItem.js +1 -1
  13. package/dist/cjs/components/Profile.js +1 -1
  14. package/dist/cjs/components/Prompt.js +1 -1
  15. package/dist/cjs/components/SnapFooter.js +1 -1
  16. package/dist/cjs/components/TextHeader.js +1 -1
  17. package/dist/cjs/components/TypingIndicator.js +1 -1
  18. package/dist/cjs/components/UploadFile.js +1 -1
  19. package/dist/cjs/components/UrlProcessor.js +1 -1
  20. package/dist/cjs/components/VoiceIcon.js +1 -1
  21. package/dist/cjs/config/index.d.ts +8 -0
  22. package/dist/cjs/config/index.d.ts.map +1 -1
  23. package/dist/cjs/config/index.js +1 -1
  24. package/dist/cjs/hooks/useAuthState.js +1 -1
  25. package/dist/cjs/hooks/useChat.js +1 -1
  26. package/dist/cjs/hooks/useCodicentApp.js +1 -1
  27. package/dist/cjs/hooks/useCodicentState.js +1 -1
  28. package/dist/cjs/hooks/useRealtimeVoiceAI.d.ts.map +1 -1
  29. package/dist/cjs/hooks/useRealtimeVoiceAI.js +1 -1
  30. package/dist/cjs/index.js +1 -1
  31. package/dist/cjs/pages/AppFrame.js +1 -1
  32. package/dist/cjs/pages/Chat.js +1 -1
  33. package/dist/cjs/pages/Compose.js +1 -1
  34. package/dist/cjs/pages/CrmPage.js +1 -1
  35. package/dist/cjs/pages/CrmPagePersistent.js +1 -1
  36. package/dist/cjs/pages/FormAccept.js +1 -1
  37. package/dist/cjs/pages/FormInvite.js +1 -1
  38. package/dist/cjs/pages/HtmlViewer.js +1 -1
  39. package/dist/cjs/pages/ImageView.js +1 -1
  40. package/dist/cjs/pages/Login.js +1 -1
  41. package/dist/cjs/pages/Purchase.js +1 -1
  42. package/dist/cjs/pages/Sales.js +1 -1
  43. package/dist/cjs/pages/Search.js +1 -1
  44. package/dist/cjs/pages/Snap.js +1 -1
  45. package/dist/cjs/services/codicent.js +1 -1
  46. package/dist/cjs/utils/appState.d.ts +45 -0
  47. package/dist/cjs/utils/appState.d.ts.map +1 -1
  48. package/dist/cjs/utils/appState.js +1 -1
  49. package/dist/cjs/utils/cacheManager.d.ts +85 -0
  50. package/dist/cjs/utils/cacheManager.d.ts.map +1 -0
  51. package/dist/cjs/utils/cacheManager.js +1 -0
  52. package/dist/cjs/utils/index.d.ts +2 -0
  53. package/dist/cjs/utils/index.d.ts.map +1 -1
  54. package/dist/esm/components/AiInput.js +1 -1
  55. package/dist/esm/components/AudioIcon.js +1 -1
  56. package/dist/esm/components/ChatInput.js +1 -1
  57. package/dist/esm/components/ChatMessage.js +1 -1
  58. package/dist/esm/components/CombinedPlaceholderDialog.js +1 -1
  59. package/dist/esm/components/Footer.js +1 -1
  60. package/dist/esm/components/Header.d.ts.map +1 -1
  61. package/dist/esm/components/Header.js +1 -1
  62. package/dist/esm/components/HtmlView.js +1 -1
  63. package/dist/esm/components/MessageInput.js +1 -1
  64. package/dist/esm/components/MessageItem.js +1 -1
  65. package/dist/esm/components/Profile.js +1 -1
  66. package/dist/esm/components/Prompt.js +1 -1
  67. package/dist/esm/components/SnapFooter.js +1 -1
  68. package/dist/esm/components/TextHeader.js +1 -1
  69. package/dist/esm/components/TypingIndicator.js +1 -1
  70. package/dist/esm/components/UploadFile.js +1 -1
  71. package/dist/esm/components/UrlProcessor.js +1 -1
  72. package/dist/esm/components/VoiceIcon.js +1 -1
  73. package/dist/esm/config/index.d.ts +8 -0
  74. package/dist/esm/config/index.d.ts.map +1 -1
  75. package/dist/esm/config/index.js +1 -1
  76. package/dist/esm/hooks/useAuthState.js +1 -1
  77. package/dist/esm/hooks/useChat.js +1 -1
  78. package/dist/esm/hooks/useCodicentApp.js +1 -1
  79. package/dist/esm/hooks/useCodicentState.js +1 -1
  80. package/dist/esm/hooks/useRealtimeVoiceAI.d.ts.map +1 -1
  81. package/dist/esm/hooks/useRealtimeVoiceAI.js +1 -1
  82. package/dist/esm/index.js +1 -1
  83. package/dist/esm/pages/AppFrame.js +1 -1
  84. package/dist/esm/pages/Chat.js +1 -1
  85. package/dist/esm/pages/Compose.js +1 -1
  86. package/dist/esm/pages/CrmPage.js +1 -1
  87. package/dist/esm/pages/CrmPagePersistent.js +1 -1
  88. package/dist/esm/pages/FormAccept.js +1 -1
  89. package/dist/esm/pages/FormInvite.js +1 -1
  90. package/dist/esm/pages/HtmlViewer.js +1 -1
  91. package/dist/esm/pages/ImageView.js +1 -1
  92. package/dist/esm/pages/Login.js +1 -1
  93. package/dist/esm/pages/Purchase.js +1 -1
  94. package/dist/esm/pages/Sales.js +1 -1
  95. package/dist/esm/pages/Search.js +1 -1
  96. package/dist/esm/pages/Snap.js +1 -1
  97. package/dist/esm/services/codicent.js +1 -1
  98. package/dist/esm/utils/appState.d.ts +45 -0
  99. package/dist/esm/utils/appState.d.ts.map +1 -1
  100. package/dist/esm/utils/appState.js +1 -1
  101. package/dist/esm/utils/cacheManager.d.ts +85 -0
  102. package/dist/esm/utils/cacheManager.d.ts.map +1 -0
  103. package/dist/esm/utils/cacheManager.js +1 -0
  104. package/dist/esm/utils/index.d.ts +2 -0
  105. package/dist/esm/utils/index.d.ts.map +1 -1
  106. package/dist/index.d.ts +139 -1
  107. package/package.json +1 -1
@@ -1 +1 @@
1
- import{useState as o,useMemo as e,useEffect as t,useCallback as s}from"react";import{CodicentService as n}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"react/jsx-runtime";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import{getConfigValue as i}from"../config/index.js";import"../stores/chatStore.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./useLocalization.js";import"./useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import"../pages/AppFrame.js";import"../pages/Chat.js";import"../pages/Compose.js";import"../pages/Snap.js";import"../pages/Search.js";import"../pages/Login.js";import"../pages/CrmPage.js";import"../pages/CrmPagePersistent.js";import"../pages/ImageView.js";import"../pages/FormInvite.js";import"../pages/FormAccept.js";import"../pages/Sales.js";import"../pages/Purchase.js";const r=r=>{const{isAuthenticated:p,getAccessTokenSilently:a,user:m,isLoading:c,logout:l,getAccessTokenWithPopup:g,loginWithRedirect:j,loginWithPopup:u}=r,[P,E]=o(null),[d,T]=o(void 0),[_,C]=o(null),[A,h]=o(""),I=e((()=>new n({API_BASE_URL:i("API_BASE_URL"),APP_LOG_CODICENT:i("APP_LOG_CODICENT"),APP_LOG_TOKEN:i("APP_LOG_TOKEN"),APP_NAME:i("APP_NAME"),APP_PREFIX:i("APP_PREFIX"),APP_TEMPLATE:i("APP_TEMPLATE"),BUTTON_TAG:i("BUTTON_TAG"),STRIPE_PUBLIC_KEY:i("STRIPE_PUBLIC_KEY"),SUBSCRIPTION_NEEDED:i("SUBSCRIPTION_NEEDED"),USER_PREFIX:i("USER_PREFIX"),ANONYMOUS_TOKEN:i("ANONYMOUS_TOKEN")})),[]);t((()=>{!c&&p&&(async()=>{try{const o=await a({});console.debug("CODICENT: ACCESS TOKEN",o),E(o)}catch(o){console.debug("CODICENT: Failed to get access token",o);const e=o;if(e&&"object"==typeof e&&"error"in e&&"login_required"===e.error)console.warn("CODICENT: Login required"),S();else if(e&&"object"==typeof e&&"error"in e&&"consent_required"===e.error)try{const o=await g();if(!o)return void C("Failed to get access token: no token from auth0 with popup");console.log("CODICENT: GOT ACCESS TOKEN"),E(o)}catch(o){console.warn("CODICENT: Failed to get access token with popup",o),S()}else C("Failed to get access token: "+(e.message?.toString()||e.toString())),console.log("CODICENT: ACCESS TOKEN ERROR",e)}})().then((()=>{}))}),[p,g,a,j,c]),t((()=>{if(m&&m.sub&&P&&void 0===d){let o=!0;return I.loginUser(m.sub,P).then((e=>{o&&(null===e?T(!1):""===e?C("Kontrollera internetanslutningen och försök igen."):(I.setToken(P),I.getNickname().then(h),T(!0)))})).catch((()=>{o&&(C("Ett fel uppstod. Försök igen senare."),T(!1))})),()=>{o=!1}}}),[m,P,d,I]);const S=s((()=>{I.logout(),E(null),C(null),T(void 0),h(""),l({logoutParams:{returnTo:i("AUTH_REDIRECT_URL")}})}),[I,l]),O=s((async o=>{const e=await I.registerUser(o,m.email,m.sub,P);return e&&(I.setToken(P),T(!0)),e}),[I,m,P]);t((()=>{I.onUnauthorized=S}),[I]);const N=s((async o=>{try{await u({authorizationParams:{connection:"email",login_hint:o}})}catch(o){console.error("Passwordless login failed:",o),C(`Passwordless login failed: ${o}`)}}),[u]);return e((()=>({isAuthenticated:p,isRegistered:d,accessToken:P,authError:_,isLoading:c,user:m,nickname:A,logout:S,registerUser:O,codicentService:I,loginWithRedirect:j,loginPasswordless:N})),[p,d,P,_,c,m,A,S,O,I,j,N])};export{r as default};
1
+ import{useState as o,useMemo as e,useEffect as t,useCallback as s}from"react";import{CodicentService as n}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"react/jsx-runtime";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import{getConfigValue as i}from"../config/index.js";import"../stores/chatStore.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./useLocalization.js";import"./useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import"../pages/AppFrame.js";import"../pages/Chat.js";import"../pages/Compose.js";import"../pages/Snap.js";import"../pages/Search.js";import"../pages/Login.js";import"../pages/CrmPage.js";import"../pages/CrmPagePersistent.js";import"../pages/ImageView.js";import"../pages/FormInvite.js";import"../pages/FormAccept.js";import"../pages/Sales.js";import"../pages/Purchase.js";const r=r=>{const{isAuthenticated:p,getAccessTokenSilently:a,user:m,isLoading:c,logout:l,getAccessTokenWithPopup:g,loginWithRedirect:j,loginWithPopup:u}=r,[P,E]=o(null),[d,T]=o(void 0),[_,C]=o(null),[A,h]=o(""),I=e((()=>new n({API_BASE_URL:i("API_BASE_URL"),APP_LOG_CODICENT:i("APP_LOG_CODICENT"),APP_LOG_TOKEN:i("APP_LOG_TOKEN"),APP_NAME:i("APP_NAME"),APP_PREFIX:i("APP_PREFIX"),APP_TEMPLATE:i("APP_TEMPLATE"),BUTTON_TAG:i("BUTTON_TAG"),STRIPE_PUBLIC_KEY:i("STRIPE_PUBLIC_KEY"),SUBSCRIPTION_NEEDED:i("SUBSCRIPTION_NEEDED"),USER_PREFIX:i("USER_PREFIX"),ANONYMOUS_TOKEN:i("ANONYMOUS_TOKEN")})),[]);t((()=>{!c&&p&&(async()=>{try{const o=await a({});console.debug("CODICENT: ACCESS TOKEN",o),E(o)}catch(o){console.debug("CODICENT: Failed to get access token",o);const e=o;if(e&&"object"==typeof e&&"error"in e&&"login_required"===e.error)console.warn("CODICENT: Login required"),S();else if(e&&"object"==typeof e&&"error"in e&&"consent_required"===e.error)try{const o=await g();if(!o)return void C("Failed to get access token: no token from auth0 with popup");console.log("CODICENT: GOT ACCESS TOKEN"),E(o)}catch(o){console.warn("CODICENT: Failed to get access token with popup",o),S()}else C("Failed to get access token: "+(e.message?.toString()||e.toString())),console.log("CODICENT: ACCESS TOKEN ERROR",e)}})().then((()=>{}))}),[p,g,a,j,c]),t((()=>{if(m&&m.sub&&P&&void 0===d){let o=!0;return I.loginUser(m.sub,P).then((e=>{o&&(null===e?T(!1):""===e?C("Kontrollera internetanslutningen och försök igen."):(I.setToken(P),I.getNickname().then(h),T(!0)))})).catch((()=>{o&&(C("Ett fel uppstod. Försök igen senare."),T(!1))})),()=>{o=!1}}}),[m,P,d,I]);const S=s((()=>{I.logout(),E(null),C(null),T(void 0),h(""),l({logoutParams:{returnTo:i("AUTH_REDIRECT_URL")}})}),[I,l]),O=s((async o=>{const e=await I.registerUser(o,m.email,m.sub,P);return e&&(I.setToken(P),T(!0)),e}),[I,m,P]);t((()=>{I.onUnauthorized=S}),[I]);const N=s((async o=>{try{await u({authorizationParams:{connection:"email",login_hint:o}})}catch(o){console.error("Passwordless login failed:",o),C(`Passwordless login failed: ${o}`)}}),[u]);return e((()=>({isAuthenticated:p,isRegistered:d,accessToken:P,authError:_,isLoading:c,user:m,nickname:A,logout:S,registerUser:O,codicentService:I,loginWithRedirect:j,loginPasswordless:N})),[p,d,P,_,c,m,A,S,O,I,j,N])};export{r as default};
@@ -1 +1 @@
1
- import{useState as e,useEffect as s,useCallback as t}from"react";import{chatStore as o}from"../stores/chatStore.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import r from"../utils/logging.js";import"react/jsx-runtime";import"../_virtual/index.js";import"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";function n(n){const[a,i]=e(o.getState()),{service:c}=n;s((()=>o.subscribe(i)),[c]);const d=t((async()=>{const e=o.getConversationId();if(e){console.log("Reloading chat history to check for missed messages...");try{const s=await c.getChatHistory(e),t=o.getMessages();return s.length>t.length?(console.log(`Found ${s.length-t.length} missed messages, updating chat...`),o.reset(),s.forEach(((e,s)=>{const t={id:e.id,sender:s%2==0?"user":"bot",content:e.content};o.addMessage(t)})),o.setConversationId(e),r("chat-history-reloaded"),!0):(console.log("No missed messages found"),!1)}catch(e){return console.error("Failed to reload chat history:",e),!1}}return!1}),[c]),g=t(((e,s=0)=>{if(""===e.trim())return;const t=`$user-msg-${Date.now()}`,n={id:t,sender:"user",content:e},i=a.messages.length>0?a.messages[a.messages.length-1].id:void 0;o.addMessage(n),o.setBotTyping(!0),r("chat-send");const l=Promise.race([c.chat(e,i),new Promise(((e,s)=>{setTimeout((()=>s(new Error("Request timeout - please try again"))),36e4)}))]).then((e=>{const{id:s,content:t}=e,n={id:s,sender:"bot",content:t,isNew:!0};o.setConversationId(s),o.addMessage(n),o.setBotTyping(!1),r("chat-receive"),t.startsWith("Error code: ")&&r("chat-error: "+t)})).catch((async n=>{console.error("Chat error details:",{error:n,message:n?.message,name:n?.name,stack:n?.stack,tempId:t,lastMessageId:i,retryCount:s,timestamp:(new Date).toISOString()});if(0===s&&("AbortError"===n?.name||n?.message?.includes("timeout")||n?.message?.includes("Failed to fetch")||n?.message?.includes("NetworkError")))return console.log("Auto-retrying chat request..."),o.removeMessage(t),o.setBotTyping(!1),void setTimeout((()=>g(e,s+1)),2e3);function a(){let e="An error occurred while sending the message. Please try again.";if(c.onUnauthorized&&n?.toString().includes("401"))return alert("Session expired. Please log in again."),void c.onUnauthorized();"AbortError"===n?.name||n?.message?.includes("timeout")?(e="Request timed out. Please check your connection and try again.",r("chat-timeout")):n?.message?.includes("HTTP error: 500")?(e="Server error. Please try again in a moment.",r("chat-server-error")):(n?.message?.includes("Failed to fetch")||n?.message?.includes("NetworkError"))&&(e="Network error. Please check your connection and try again.",r("chat-network-error")),console.warn(e),o.removeMessage(t),o.setBotTyping(!1),r("chat-error")}"AbortError"===n?.name||n?.message?.includes("timeout")||n?.message?.includes("Failed to fetch")||n?.message?.includes("NetworkError")||n?.message?.includes("WebSocket")||n?.message?.includes("SignalR")||n?.message?.includes("Connection")?(console.log("Potential SignalR/connection issue detected, checking for missed messages..."),setTimeout((async()=>{if(await d())return o.removeMessage(t),o.setBotTyping(!1),console.log("Recovered missed message(s) from server"),void r("chat-recovered");a()}),2e3)):a()}));o.addPendingRequest(t,l)}),[c,a.messages,d]),l=t((()=>{o.reset(),o.clearMessages(),r("new-chat")}),[]),m=t((e=>{o.reset(),o.clearMessages(),r("open-chat"),c.getChatHistory(e).then((e=>{e.forEach(((e,s)=>{const t={id:e.id,sender:s%2==0?"user":"bot",content:e.content};o.addMessage(t)}))}))}),[c]);return{messages:a.messages,isBotTyping:a.isBotTyping,handleSend:g,newChat:l,openChat:m,reloadChatHistory:d}}export{n as useChat};
1
+ import{useState as e,useEffect as s,useCallback as t}from"react";import{chatStore as o}from"../stores/chatStore.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import r from"../utils/logging.js";import"react/jsx-runtime";import"../_virtual/index.js";import"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";function n(n){const[a,i]=e(o.getState()),{service:c}=n;s((()=>o.subscribe(i)),[c]);const d=t((async()=>{const e=o.getConversationId();if(e){console.log("Reloading chat history to check for missed messages...");try{const s=await c.getChatHistory(e),t=o.getMessages();return s.length>t.length?(console.log(`Found ${s.length-t.length} missed messages, updating chat...`),o.reset(),s.forEach(((e,s)=>{const t={id:e.id,sender:s%2==0?"user":"bot",content:e.content};o.addMessage(t)})),o.setConversationId(e),r("chat-history-reloaded"),!0):(console.log("No missed messages found"),!1)}catch(e){return console.error("Failed to reload chat history:",e),!1}}return!1}),[c]),g=t(((e,s=0)=>{if(""===e.trim())return;const t=`$user-msg-${Date.now()}`,n={id:t,sender:"user",content:e},i=a.messages.length>0?a.messages[a.messages.length-1].id:void 0;o.addMessage(n),o.setBotTyping(!0),r("chat-send");const l=Promise.race([c.chat(e,i),new Promise(((e,s)=>{setTimeout((()=>s(new Error("Request timeout - please try again"))),36e4)}))]).then((e=>{const{id:s,content:t}=e,n={id:s,sender:"bot",content:t,isNew:!0};o.setConversationId(s),o.addMessage(n),o.setBotTyping(!1),r("chat-receive"),t.startsWith("Error code: ")&&r("chat-error: "+t)})).catch((async n=>{console.error("Chat error details:",{error:n,message:n?.message,name:n?.name,stack:n?.stack,tempId:t,lastMessageId:i,retryCount:s,timestamp:(new Date).toISOString()});if(0===s&&("AbortError"===n?.name||n?.message?.includes("timeout")||n?.message?.includes("Failed to fetch")||n?.message?.includes("NetworkError")))return console.log("Auto-retrying chat request..."),o.removeMessage(t),o.setBotTyping(!1),void setTimeout((()=>g(e,s+1)),2e3);function a(){let e="An error occurred while sending the message. Please try again.";if(c.onUnauthorized&&n?.toString().includes("401"))return alert("Session expired. Please log in again."),void c.onUnauthorized();"AbortError"===n?.name||n?.message?.includes("timeout")?(e="Request timed out. Please check your connection and try again.",r("chat-timeout")):n?.message?.includes("HTTP error: 500")?(e="Server error. Please try again in a moment.",r("chat-server-error")):(n?.message?.includes("Failed to fetch")||n?.message?.includes("NetworkError"))&&(e="Network error. Please check your connection and try again.",r("chat-network-error")),console.warn(e),o.removeMessage(t),o.setBotTyping(!1),r("chat-error")}"AbortError"===n?.name||n?.message?.includes("timeout")||n?.message?.includes("Failed to fetch")||n?.message?.includes("NetworkError")||n?.message?.includes("WebSocket")||n?.message?.includes("SignalR")||n?.message?.includes("Connection")?(console.log("Potential SignalR/connection issue detected, checking for missed messages..."),setTimeout((async()=>{if(await d())return o.removeMessage(t),o.setBotTyping(!1),console.log("Recovered missed message(s) from server"),void r("chat-recovered");a()}),2e3)):a()}));o.addPendingRequest(t,l)}),[c,a.messages,d]),l=t((()=>{o.reset(),o.clearMessages(),r("new-chat")}),[]),m=t((e=>{o.reset(),o.clearMessages(),r("open-chat"),c.getChatHistory(e).then((e=>{e.forEach(((e,s)=>{const t={id:e.id,sender:s%2==0?"user":"bot",content:e.content};o.addMessage(t)}))}))}),[c]);return{messages:a.messages,isBotTyping:a.isBotTyping,handleSend:g,newChat:l,openChat:m,reloadChatHistory:d}}export{n as useChat};
@@ -1 +1 @@
1
- import{useRef as e,useState as t,useCallback as r,useMemo as n,useEffect as s}from"react";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"react/jsx-runtime";import{createAppStateMachine as o}from"../utils/appState.js";import"../_virtual/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{useAudioRecorder as i}from"./useAudioRecorder.js";import a from"./useAuthState.js";import c from"./useRealtimeVoiceAI.js";import u from"./useTools.js";import{getConfigValue as l}from"../config/index.js";const m=({auth0:m,toolsConfig:p})=>{const d=a(m),f=e(o(d.codicentService,(()=>{}))),[g,h]=t(),{service:v,context:k}=f.current,{nickname:A,name:w,error:j,errorType:y,selectedApp:b}=k,x=r(((e,t)=>{const r=e.get("file").name;v.uploadFile(r,e).then((e=>{v.sendMessage(`#transcribe ${""!==t?(t.startsWith("#")?"":"#")+t+" ":""}#file:${e}`).then((()=>{})).catch(console.warn)}))}),[v]),C=i(x),[S,T]=t(),[_,I]=t(),[N,R]=t(!1),E=n((()=>new Audio("./notification.mp3")),[]),M=r((()=>R(!0)),[]),O=u(v,T,I,E,S,M,p),J=n((()=>l("REALTIME_VOICE_API_KEY")||""),[]),L=c(v,J,O);s((()=>{N&&(L?.disconnectConversation(),R(!1))}),[N,L]),s((()=>{d.isAuthenticated&&d.user&&d.accessToken&&f.current.updateContext({isAuthenticated:d.isAuthenticated,user:{sub:d.user.sub,email:d.user.email},accessToken:d.accessToken})}),[d.isAuthenticated,d.user,d.accessToken]),s((()=>f.current.updateContext({nickname:d.nickname})),[d.nickname]),s((()=>{f.current.update();let e,t=f.current.getCurrentStateName();h(f.current.getCurrentStateName()),JSON.stringify(f.current.context);let r=!1;const n=s=>setInterval((()=>{const s=f.current.getCurrentStateName();if("hasAccess"===s&&!r)return console.log("🎯 Reached stable state - switching to slower polling (1000ms)"),r=!0,clearInterval(e),void(e=n(1e3));if("hasAccess"!==s&&r)return console.log("🚨 Left stable state - switching to fast polling (200ms)"),r=!1,clearInterval(e),void(e=n(200));const o=JSON.stringify(f.current.context);f.current.update();const i=JSON.stringify(f.current.context),a=f.current.getCurrentStateName();a===t&&o===i||(h(a),t=a)}),s);return e=n(200),()=>clearInterval(e)}),[]);const B=r((e=>e.replace("{nickname}",A||"unknown").replace("{token}",encodeURIComponent(d.accessToken||"unknown")).replace("{app}",b||"unknown")),[A,d.accessToken,b]),U=r((e=>{f.current.updateContext({isAnonymous:e})}),[]),V=r((()=>f.current.isBusy()),[]);return n((()=>({audio:C,auth:d,currentStateName:g,stateMachine:f.current,service:v,context:k,state:g,nickname:A,name:w,error:j,errorType:y,fixAppUrl:B,setAnonymous:U,allStates:f.current.allStates,isBusy:V,voice:L,html:S,setHtml:T,script:_})),[g,A,w,j,y,S,_,d.isAuthenticated,d.isLoading,C.isRecording,L?.isConnected,B,U,V])};export{m as useCodicentApp};
1
+ import{useRef as e,useState as t,useCallback as r,useMemo as n,useEffect as s}from"react";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"react/jsx-runtime";import{createAppStateMachine as o}from"../utils/appState.js";import"../_virtual/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"../utils/cacheManager.js";import{useAudioRecorder as i}from"./useAudioRecorder.js";import a from"./useAuthState.js";import c from"./useRealtimeVoiceAI.js";import u from"./useTools.js";import{getConfigValue as l}from"../config/index.js";const m=({auth0:m,toolsConfig:p})=>{const d=a(m),g=e(o(d.codicentService,(()=>{}))),[f,h]=t(),{service:v,context:k}=g.current,{nickname:A,name:j,error:w,errorType:y,selectedApp:b}=k,x=r(((e,t)=>{const r=e.get("file").name;v.uploadFile(r,e).then((e=>{v.sendMessage(`#transcribe ${""!==t?(t.startsWith("#")?"":"#")+t+" ":""}#file:${e}`).then((()=>{})).catch(console.warn)}))}),[v]),C=i(x),[S,T]=t(),[_,I]=t(),[N,R]=t(!1),M=n((()=>new Audio("./notification.mp3")),[]),E=r((()=>R(!0)),[]),O=u(v,T,I,M,S,E,p),J=n((()=>l("REALTIME_VOICE_API_KEY")||""),[]),L=c(v,J,O);s((()=>{N&&(L?.disconnectConversation(),R(!1))}),[N,L]),s((()=>{d.isAuthenticated&&d.user&&d.accessToken&&g.current.updateContext({isAuthenticated:d.isAuthenticated,user:{sub:d.user.sub,email:d.user.email},accessToken:d.accessToken})}),[d.isAuthenticated,d.user,d.accessToken]),s((()=>g.current.updateContext({nickname:d.nickname})),[d.nickname]),s((()=>{g.current.update();let e,t=g.current.getCurrentStateName();h(g.current.getCurrentStateName()),JSON.stringify(g.current.context);let r=!1;const n=s=>setInterval((()=>{const s=g.current.getCurrentStateName();if("hasAccess"===s&&!r)return console.log("🎯 Reached stable state - switching to slower polling (1000ms)"),r=!0,clearInterval(e),void(e=n(1e3));if("hasAccess"!==s&&r)return console.log("🚨 Left stable state - switching to fast polling (200ms)"),r=!1,clearInterval(e),void(e=n(200));const o=JSON.stringify(g.current.context);g.current.update();const i=JSON.stringify(g.current.context),a=g.current.getCurrentStateName();a===t&&o===i||(h(a),t=a)}),s);return e=n(200),()=>clearInterval(e)}),[]);const B=r((e=>e.replace("{nickname}",A||"unknown").replace("{token}",encodeURIComponent(d.accessToken||"unknown")).replace("{app}",b||"unknown")),[A,d.accessToken,b]),U=r((e=>{g.current.updateContext({isAnonymous:e})}),[]),V=r((()=>g.current.isBusy()),[]);return n((()=>({audio:C,auth:d,currentStateName:f,stateMachine:g.current,service:v,context:k,state:f,nickname:A,name:j,error:w,errorType:y,fixAppUrl:B,setAnonymous:U,allStates:g.current.allStates,isBusy:V,voice:L,html:S,setHtml:T,script:_})),[f,A,j,w,y,S,_,d.isAuthenticated,d.isLoading,C.isRecording,L?.isConnected,B,U,V])};export{m as useCodicentApp};
@@ -1 +1 @@
1
- import{useState as t,useRef as o,useCallback as s,useEffect as e}from"react";import p from"./useStateWithLocalStorage.js";import"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"react/jsx-runtime";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import{getConfigValue as r}from"../config/index.js";import"../stores/chatStore.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./useLocalization.js";import"./useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import"../pages/AppFrame.js";import"../pages/Chat.js";import"../pages/Compose.js";import"../pages/Snap.js";import"../pages/Search.js";import"../pages/Login.js";import"../pages/CrmPage.js";import"../pages/CrmPagePersistent.js";import"../pages/ImageView.js";import"../pages/FormInvite.js";import"../pages/FormAccept.js";import"../pages/Sales.js";import"../pages/Purchase.js";const i=i=>{const[n,m]=p("APP_WELCOME_STATE_TEXT_"+i.context.selectedApp,""),[a,c]=p("CODICENT_STATE_LAST_TIMESTAMP_"+i.context.selectedApp,0),{service:j,current:l}=i,[g,T]=t(!1),S=o(!1),u=s((async()=>{if(!S.current){S.current=!0;try{const t=await j.getMessagesFast(r("LOGBOOK_TAGS").split(",").filter((t=>"chat"!==t))),o=t.length>0?t[0].createdAt.getTime():a;if(o>a){c(o),T(!0);const t=await j.chat(r("WELCOME_STATUS_PROMPT"));m(t.content)}}finally{T(!1),S.current=!1}}}),[j,a,c,m]),_=s((()=>{j&&r("CHAT_INSTRUCTIONS")}),[j]);return e((()=>{l===i.allStates.hasAccess&&r("WELCOME_STATUS_PROMPT")?(u(),_()):r("WELCOME_STATUS_PROMPT")||m("")}),[l,i,u,_,m]),{welcomeStatusText:n,updating:g}};export{i as default};
1
+ import{useState as t,useRef as o,useCallback as s,useEffect as e}from"react";import p from"./useStateWithLocalStorage.js";import"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"react/jsx-runtime";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import{getConfigValue as r}from"../config/index.js";import"../stores/chatStore.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./useLocalization.js";import"./useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import"../pages/AppFrame.js";import"../pages/Chat.js";import"../pages/Compose.js";import"../pages/Snap.js";import"../pages/Search.js";import"../pages/Login.js";import"../pages/CrmPage.js";import"../pages/CrmPagePersistent.js";import"../pages/ImageView.js";import"../pages/FormInvite.js";import"../pages/FormAccept.js";import"../pages/Sales.js";import"../pages/Purchase.js";const i=i=>{const[n,m]=p("APP_WELCOME_STATE_TEXT_"+i.context.selectedApp,""),[a,c]=p("CODICENT_STATE_LAST_TIMESTAMP_"+i.context.selectedApp,0),{service:j,current:l}=i,[g,T]=t(!1),u=o(!1),S=s((async()=>{if(!u.current){u.current=!0;try{const t=await j.getMessagesFast(r("LOGBOOK_TAGS").split(",").filter((t=>"chat"!==t))),o=t.length>0?t[0].createdAt.getTime():a;if(o>a){c(o),T(!0);const t=await j.chat(r("WELCOME_STATUS_PROMPT"));m(t.content)}}finally{T(!1),u.current=!1}}}),[j,a,c,m]),_=s((()=>{j&&r("CHAT_INSTRUCTIONS")}),[j]);return e((()=>{l===i.allStates.hasAccess&&r("WELCOME_STATUS_PROMPT")?(S(),_()):r("WELCOME_STATUS_PROMPT")||m("")}),[l,i,S,_,m]),{welcomeStatusText:n,updating:g}};export{i as default};
@@ -1 +1 @@
1
- {"version":3,"file":"useRealtimeVoiceAI.d.ts","sourceRoot":"","sources":["../../../src/hooks/useRealtimeVoiceAI.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAK/E,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE;QACV,KAAK,CAAC,EAAE,UAAU,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE,GAAG,CAAC;KACZ,CAAC;CACH;AAED;;GAEG;AACH,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACpD,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACpD,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACjD,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C,mBAAmB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,sBAAsB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,sBAAsB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,gBAAgB,EAAE,MAAM,MAAM,CAAC;IAC/B,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,kBAAkB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,QAAA,MAAM,kBAAkB,oBACL,eAAe,UACxB,MAAM,SACP;IAAE,UAAU,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,EAAE,UACtD,MAAM,KACb,aAAa,GAAG,SA2iBlB,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"useRealtimeVoiceAI.d.ts","sourceRoot":"","sources":["../../../src/hooks/useRealtimeVoiceAI.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAK/E,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE;QACV,KAAK,CAAC,EAAE,UAAU,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE,GAAG,CAAC;KACZ,CAAC;CACH;AAED;;GAEG;AACH,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACpD,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACpD,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACjD,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C,mBAAmB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,sBAAsB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,sBAAsB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,iBAAiB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,gBAAgB,EAAE,MAAM,MAAM,CAAC;IAC/B,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,kBAAkB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,QAAA,MAAM,kBAAkB,oBACL,eAAe,UACxB,MAAM,SACP;IAAE,UAAU,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,QAAQ,CAAA;CAAE,EAAE,UACtD,MAAM,KACb,aAAa,GAAG,SA0pBlB,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- import{useRef as e,useState as t,useCallback as n,useEffect as r,useMemo as o}from"react";import{WavRenderer as a}from"../utils/wav_renderer.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import{WavStreamPlayer as s}from"../lib/wavtools/lib/wav_stream_player.js";import{WavRecorder as i}from"../lib/wavtools/lib/wav_recorder.js";import{getConfigValue as c}from"../config/index.js";const l=(l,u,d,p)=>{const m=!!c("APP_CONFIG"),f=!!c("APP_BUTTONS");m||console.warn("APP_CONFIG is not set. Voice AI will not be available."),f||console.warn("APP_BUTTONS is not set. Voice AI will not be available.");const g=c("APP_CONFIG"),w=c("APP_BUTTONS");c("API_BASE_URL").replace(/\/$/,""),c("USE_REALTIME_SESSION_ENDPOINT"),c("REALTIME_SESSION_ENDPOINT");const h=p||c("REALTIME_VOICE_MODEL")||"alloy",y=["alloy","shimmer","echo"],_=y.includes(h)?h:"alloy";h!==_&&console.warn(`[codicent-app-sdk] Voice "${h}" is not supported in the current SDK version. Supported voices: ${y.join(", ")}. Falling back to "${_}".`);const v=e(new i({sampleRate:24e3})),S=e(new s({sampleRate:24e3})),O=e(null),I=e(null),T=e(null),E=e(null),N=e(!1),C=e(null),R=e(null),A=e(null),b=e((new Date).toISOString()),[P,D]=t([]),[k,F]=t([]),[L,M]=t(!1),[x,$]=t(!1),[U,j]=t(!1),J=e(0),B=e(0),[V,G]=t(""),[q,W]=t("en-US"),[H,z]=t((()=>m&&f&&w&&g&&g.apps&&g.apps[w]?g.apps[w].voiceInstructions||g.REALTIME_VOICE_INSTRUCTIONS||"":g&&g.REALTIME_VOICE_INSTRUCTIONS||"")),K=n((e=>{const t=b.current,n=new Date(t).valueOf(),r=new Date(e).valueOf()-n,o=Math.floor(r/10)%100,a=Math.floor(r/1e3)%60,s=e=>{let t=e+"";for(;t.length<2;)t="0"+t;return t};return`${s(Math.floor(r/6e4)%60)}:${s(a)}.${s(o)}`}),[]),Q=n((async()=>{try{b.current=(new Date).toISOString(),M(!0),F([]),D([]);const e=await l.getRealtimeSessionToken(_);if(!e)throw new Error("No ephemeral key returned from session endpoint");const t=new RTCPeerConnection;O.current=t,T.current||(T.current=new Audio,T.current.autoplay=!0),t.ontrack=e=>{T.current&&e.streams[0]&&(T.current.srcObject=e.streams[0])};const n=await navigator.mediaDevices.getUserMedia({audio:!0});E.current=n;const r=n.getTracks()[0];t.addTrack(r,n);const o=t.createDataChannel("oai-events");I.current=o,o.addEventListener("message",(e=>{try{const t=JSON.parse(e.data);"session.created"===t.type||("conversation.item.created"===t.type?D((e=>[...e,t.item])):"conversation.item.input_audio_transcription.completed"===t.type?D((e=>{const n=[...e],r=n.findIndex((e=>e.id===t.item_id));return-1!==r&&n[r].formatted&&(n[r].formatted.transcript=t.transcript),n})):"response.audio_transcript.delta"===t.type||"response.audio_transcript.done"===t.type||"error"===t.type&&console.error("Server error:",t.error))}catch(t){console.warn("Invalid message:",e.data)}})),o.onopen=()=>{console.log("Data channel opened, configuring session"),o.send(JSON.stringify({type:"session.update",session:{instructions:H.replace("{{name}}",V).replace("{{language}}",q).replace("{{time}}",(new Date).toISOString()),modalities:["text","audio"],input_audio_transcription:{model:"whisper-1"},turn_detection:{type:"server_vad",threshold:.5,prefix_padding_ms:300,silence_duration_ms:500},voice:_,temperature:.8,max_response_output_tokens:4096,input_audio_format:"pcm16",output_audio_format:"pcm16",tools:d.map((e=>({type:"function",...e.definition})))}}))},o.onclose=()=>{console.log("Data channel closed")};const a=await t.createOffer();await t.setLocalDescription(a);let s="gpt-4o-realtime-preview";try{if(c("REALTIME_CONFIG_ENDPOINT")){const e=await l.getRealtimeConfig();e&&e.model&&(s=e.model)}}catch(e){console.warn("Failed to fetch realtime config, using default model:",e)}const i="https://api.openai.com/v1/realtime",u=await fetch(`${i}?model=${s}`,{method:"POST",body:a.sdp,headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/sdp"}});if(!u.ok)throw new Error(`Failed to get SDP answer: ${u.statusText}`);const p={type:"answer",sdp:await u.text()};await t.setRemoteDescription(p),$(!1);const m=v.current,f=S.current;await m.begin(),await f.connect()}catch(e){throw console.error("[codicent-app-sdk] Failed to establish WebRTC connection:",e),M(!1),e}}),[l,_,H,V,q,d]),X=n((async()=>{M(!1),F([]),D([]),I.current&&(I.current.close(),I.current=null),O.current&&(O.current.close(),O.current=null),E.current&&(E.current.getTracks().forEach((e=>e.stop())),E.current=null),T.current&&(T.current.pause(),T.current.srcObject=null);const e=v.current;await e.end();const t=S.current;await t.interrupt()}),[]),Y=n((async e=>{const t=I.current;t&&"open"===t.readyState&&t.send(JSON.stringify({type:"conversation.item.delete",item_id:e}))}),[]),Z=n((async()=>{j(!0);const e=I.current;e&&"open"===e.readyState&&e.send(JSON.stringify({type:"input_audio_buffer.commit"}))}),[]),ee=n((async()=>{j(!1);const e=I.current;e&&"open"===e.readyState&&e.send(JSON.stringify({type:"response.create"}))}),[]),te=n((async e=>{const t=I.current;t&&"open"===t.readyState&&t.send(JSON.stringify({type:"session.update",session:{turn_detection:"none"===e?null:{type:"server_vad"}}})),$("none"===e)}),[]);r((()=>{if(V&&L){const e=I.current;e&&"open"===e.readyState&&e.send(JSON.stringify({type:"session.update",session:{instructions:H.replace("{{name}}",V).replace("{{language}}",q).replace("{{time}}",(new Date).toISOString())}}))}}),[H,V,q,L]),r((()=>{let e=!0;const t=v.current,n=C.current;let r=null;const o=S.current,s=R.current;let i=null;const c=()=>{if(e){if(n&&(n.width&&n.height||(n.width=n.offsetWidth,n.height=n.offsetHeight),r=r||n.getContext("2d"),r)){r.clearRect(0,0,n.width,n.height);const e=t.recording?t.getFrequencies("voice"):{values:new Float32Array([0])},o=1-Math.max(...e.values);J.current=o,a.drawCircularBars(n,r,e.values,"#0099ff",20,0,8)}if(s&&(s.width&&s.height||(s.width=s.offsetWidth,s.height=s.offsetHeight),i=i||s.getContext("2d"),i)){i.clearRect(0,0,s.width,s.height);const e=o.analyser?o.getFrequencies("voice"):{values:new Float32Array([0])},t=1-Math.max(...e.values);B.current=t,a.drawCircularBars(s,i,e.values,"#009900",20,0,8)}window.requestAnimationFrame(c)}};return c(),()=>{e=!1}}),[]),r((()=>{!N.current&&d&&H&&(N.current=!0)}),[d,H]);const ne=n((e=>{const t=e.replace("{{name}}",V).replace("{{language}}",q).replace("{{time}}",(new Date).toISOString()),n=I.current;n&&"open"===n.readyState&&n.send(JSON.stringify({type:"session.update",session:{instructions:t}})),z(e)}),[V,q]);return o((()=>{if(m&&f)return{items:P,realtimeEvents:k,isConnected:L,canPushToTalk:x,isRecording:U,clientCanvasRef:C,serverCanvasRef:R,eventsScrollRef:A,formatTime:K,connectConversation:Q,disconnectConversation:X,deleteConversationItem:Y,startRecording:Z,stopRecording:ee,changeTurnEndType:te,getRecorderLevel:()=>J.current,getStreamLevel:()=>B.current,setUsername:G,updateInstructions:ne,setLanguage:W}}),[m,f,P,k,L,x,U,C,R,A])};export{l as default};
1
+ import{useRef as e,useState as t,useCallback as n,useEffect as r,useMemo as o}from"react";import{WavRenderer as a}from"../utils/wav_renderer.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import{WavStreamPlayer as i}from"../lib/wavtools/lib/wav_stream_player.js";import{WavRecorder as s}from"../lib/wavtools/lib/wav_recorder.js";import{getConfigValue as c}from"../config/index.js";const l=(l,u,d,p)=>{const m=!!c("APP_CONFIG"),f=!!c("APP_BUTTONS");m||console.warn("APP_CONFIG is not set. Voice AI will not be available."),f||console.warn("APP_BUTTONS is not set. Voice AI will not be available.");const g=c("APP_CONFIG"),y=c("APP_BUTTONS");c("API_BASE_URL").replace(/\/$/,""),c("USE_REALTIME_SESSION_ENDPOINT"),c("REALTIME_SESSION_ENDPOINT");const _=p||c("REALTIME_VOICE_MODEL")||"alloy",w=["alloy","shimmer","echo"],h=w.includes(_)?_:"alloy";_!==h&&console.warn(`[codicent-app-sdk] Voice "${_}" is not supported in the current SDK version. Supported voices: ${w.join(", ")}. Falling back to "${h}".`);const S=e(new s({sampleRate:24e3})),v=e(new i({sampleRate:24e3})),O=e(null),I=e(null),T=e(null),N=e(null),E=e(!1),A=e(null),C=e(null),R=e(null),P=e((new Date).toISOString()),[b,D]=t([]),[F,J]=t([]),[$,x]=t(!1),[M,k]=t(!1),[L,V]=t(!1),U=e(0),j=e(0),[B,G]=t(""),[q,W]=t("en-US"),H=e(new Map),[z,K]=t((()=>m&&f&&y&&g&&g.apps&&g.apps[y]?g.apps[y].voiceInstructions||g.REALTIME_VOICE_INSTRUCTIONS||"":g&&g.REALTIME_VOICE_INSTRUCTIONS||"")),Q=n((e=>{const t=P.current,n=new Date(t).valueOf(),r=new Date(e).valueOf()-n,o=Math.floor(r/10)%100,a=Math.floor(r/1e3)%60,i=e=>{let t=e+"";for(;t.length<2;)t="0"+t;return t};return`${i(Math.floor(r/6e4)%60)}:${i(a)}.${i(o)}`}),[]),X=n((async()=>{try{P.current=(new Date).toISOString(),x(!0),J([]),D([]),H.current.clear();const e=await l.getRealtimeSessionToken(h);if(!e)throw new Error("No ephemeral key returned from session endpoint");const t=new RTCPeerConnection;O.current=t,T.current||(T.current=new Audio,T.current.autoplay=!0),t.ontrack=e=>{T.current&&e.streams[0]&&(T.current.srcObject=e.streams[0])};const n=await navigator.mediaDevices.getUserMedia({audio:!0});N.current=n;const r=n.getTracks()[0];t.addTrack(r,n);const o=t.createDataChannel("oai-events");I.current=o,o.addEventListener("message",(e=>{try{const t=JSON.parse(e.data);if("session.created"===t.type);else if("conversation.item.created"===t.type)D((e=>[...e,t.item]));else if("conversation.item.input_audio_transcription.completed"===t.type)D((e=>{const n=[...e],r=n.findIndex((e=>e.id===t.item_id));return-1!==r&&n[r].formatted&&(n[r].formatted.transcript=t.transcript),n}));else if("response.audio_transcript.delta"===t.type);else if("response.audio_transcript.done"===t.type);else if("response.output_item.added"===t.type){const e=t.item;"function_call"===e?.type&&(console.log("[Voice AI] Function call initiated:",e.name),H.current.set(e.id,{name:e.name||"",arguments:"",call_id:e.call_id||e.id}))}else if("response.function_call_arguments.delta"===t.type){const e=t.item_id,n=t.delta,r=H.current.get(e);r&&n&&(r.arguments+=n,H.current.set(e,r))}else if("response.function_call_arguments.done"===t.type){const e=t.item_id,n=H.current.get(e);if(n){console.log(`[Voice AI] Executing tool: ${n.name}`);const t=d.find((e=>e.definition.name===n.name));if(t){let e={};try{e=n.arguments?JSON.parse(n.arguments):{}}catch(t){console.error("[Voice AI] Failed to parse tool arguments:",t),e={}}Promise.resolve(t.handler(e)).then((e=>{console.log(`[Voice AI] Tool ${n.name} completed:`,e),o&&"open"===o.readyState&&(o.send(JSON.stringify({type:"conversation.item.create",item:{type:"function_call_output",call_id:n.call_id,output:JSON.stringify(e)}})),o.send(JSON.stringify({type:"response.create"})))})).catch((e=>{console.error(`[Voice AI] Tool ${n.name} failed:`,e),o&&"open"===o.readyState&&(o.send(JSON.stringify({type:"conversation.item.create",item:{type:"function_call_output",call_id:n.call_id,output:JSON.stringify({error:e.message||"Tool execution failed"})}})),o.send(JSON.stringify({type:"response.create"})))}))}else console.error(`[Voice AI] Tool not found: ${n.name}`);H.current.delete(e)}}else"error"===t.type&&console.error("Server error:",t.error)}catch(t){console.warn("Invalid message:",e.data)}})),o.onopen=()=>{console.log("Data channel opened, configuring session"),o.send(JSON.stringify({type:"session.update",session:{instructions:z.replace("{{name}}",B).replace("{{language}}",q).replace("{{time}}",(new Date).toISOString()),modalities:["text","audio"],input_audio_transcription:{model:"whisper-1"},turn_detection:{type:"server_vad",threshold:.5,prefix_padding_ms:300,silence_duration_ms:500},voice:h,temperature:.8,max_response_output_tokens:4096,input_audio_format:"pcm16",output_audio_format:"pcm16",tools:d.map((e=>({type:"function",...e.definition})))}}))},o.onclose=()=>{console.log("Data channel closed")};const a=await t.createOffer();await t.setLocalDescription(a);let i="gpt-4o-realtime-preview";try{if(c("REALTIME_CONFIG_ENDPOINT")){const e=await l.getRealtimeConfig();e&&e.model&&(i=e.model)}}catch(e){console.warn("Failed to fetch realtime config, using default model:",e)}const s="https://api.openai.com/v1/realtime",u=await fetch(`${s}?model=${i}`,{method:"POST",body:a.sdp,headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/sdp"}});if(!u.ok)throw new Error(`Failed to get SDP answer: ${u.statusText}`);const p={type:"answer",sdp:await u.text()};await t.setRemoteDescription(p),k(!1);const m=S.current,f=v.current;await m.begin(),await f.connect()}catch(e){throw console.error("[codicent-app-sdk] Failed to establish WebRTC connection:",e),x(!1),e}}),[l,h,z,B,q,d]),Y=n((async()=>{x(!1),J([]),D([]),H.current.clear(),I.current&&(I.current.close(),I.current=null),O.current&&(O.current.close(),O.current=null),N.current&&(N.current.getTracks().forEach((e=>e.stop())),N.current=null),T.current&&(T.current.pause(),T.current.srcObject=null);const e=S.current;await e.end();const t=v.current;await t.interrupt()}),[]),Z=n((async e=>{const t=I.current;t&&"open"===t.readyState&&t.send(JSON.stringify({type:"conversation.item.delete",item_id:e}))}),[]),ee=n((async()=>{V(!0);const e=I.current;e&&"open"===e.readyState&&e.send(JSON.stringify({type:"input_audio_buffer.commit"}))}),[]),te=n((async()=>{V(!1);const e=I.current;e&&"open"===e.readyState&&e.send(JSON.stringify({type:"response.create"}))}),[]),ne=n((async e=>{const t=I.current;t&&"open"===t.readyState&&t.send(JSON.stringify({type:"session.update",session:{turn_detection:"none"===e?null:{type:"server_vad"}}})),k("none"===e)}),[]);r((()=>{if(B&&$){const e=I.current;e&&"open"===e.readyState&&e.send(JSON.stringify({type:"session.update",session:{instructions:z.replace("{{name}}",B).replace("{{language}}",q).replace("{{time}}",(new Date).toISOString())}}))}}),[z,B,q,$]),r((()=>{let e=!0;const t=S.current,n=A.current;let r=null;const o=v.current,i=C.current;let s=null;const c=()=>{if(e){if(n&&(n.width&&n.height||(n.width=n.offsetWidth,n.height=n.offsetHeight),r=r||n.getContext("2d"),r)){r.clearRect(0,0,n.width,n.height);const e=t.recording?t.getFrequencies("voice"):{values:new Float32Array([0])},o=1-Math.max(...e.values);U.current=o,a.drawCircularBars(n,r,e.values,"#0099ff",20,0,8)}if(i&&(i.width&&i.height||(i.width=i.offsetWidth,i.height=i.offsetHeight),s=s||i.getContext("2d"),s)){s.clearRect(0,0,i.width,i.height);const e=o.analyser?o.getFrequencies("voice"):{values:new Float32Array([0])},t=1-Math.max(...e.values);j.current=t,a.drawCircularBars(i,s,e.values,"#009900",20,0,8)}window.requestAnimationFrame(c)}};return c(),()=>{e=!1}}),[]),r((()=>{!E.current&&d&&z&&(E.current=!0)}),[d,z]);const re=n((e=>{const t=e.replace("{{name}}",B).replace("{{language}}",q).replace("{{time}}",(new Date).toISOString()),n=I.current;n&&"open"===n.readyState&&n.send(JSON.stringify({type:"session.update",session:{instructions:t}})),K(e)}),[B,q]);return o((()=>{if(m&&f)return{items:b,realtimeEvents:F,isConnected:$,canPushToTalk:M,isRecording:L,clientCanvasRef:A,serverCanvasRef:C,eventsScrollRef:R,formatTime:Q,connectConversation:X,disconnectConversation:Y,deleteConversationItem:Z,startRecording:ee,stopRecording:te,changeTurnEndType:ne,getRecorderLevel:()=>U.current,getStreamLevel:()=>j.current,setUsername:G,updateInstructions:re,setLanguage:W}}),[m,f,b,F,$,M,L,A,C,R])};export{l as default};
package/dist/esm/index.js CHANGED
@@ -1 +1 @@
1
- export{CodicentService}from"./services/codicent.js";export{default as Markdown}from"./components/Markdown.js";export{Textarea}from"./components/Textarea.js";export{Button}from"./components/Button.js";export{CompoundButton}from"./components/CompoundButton.js";export{Title}from"./components/Title.js";export{Text}from"./components/Text.js";export{Spinner}from"./components/Spinner.js";export{Label}from"./components/Label.js";export{Input}from"./components/Input.js";export{default as TextHeader}from"./components/TextHeader.js";export{default as TypingIndicator}from"./components/TypingIndicator.js";export{default as Prompt}from"./components/Prompt.js";export{default as ChatInput}from"./components/ChatInput.js";export{CombinedPlaceholderDialog}from"./components/CombinedPlaceholderDialog.js";export{default as ChatMessage}from"./components/ChatMessage.js";export{Header}from"./components/Header.js";export{default as VoiceIcon}from"./components/VoiceIcon.js";export{default as AudioIcon}from"./components/AudioIcon.js";export{FileThumbnail}from"./components/FileThumbnail.js";export{default as MessageInput}from"./components/MessageInput.js";export{default as UploadFile}from"./components/UploadFile.js";export{default as SnapFooter}from"./components/SnapFooter.js";export{default as Profile}from"./components/Profile.js";export{default as MessageItem}from"./components/MessageItem.js";export{default as Content}from"./components/Content.js";export{default as AiInput}from"./components/AiInput.js";export{default as SearchBox}from"./components/SearchBox.js";export{default as HtmlView}from"./components/HtmlView.js";export{Footer}from"./components/Footer.js";export{Page}from"./components/Page.js";export{UrlProcessor}from"./components/UrlProcessor.js";export{DatePicker}from"./components/DatePicker.js";export{ColorPicker}from"./components/ColorPicker.js";export{TimePicker}from"./components/TimePicker.js";export{default as useStateWithLocalStorage}from"./hooks/useStateWithLocalStorage.js";export{default as useAuthState}from"./hooks/useAuthState.js";export{useChat}from"./hooks/useChat.js";export{default as useCodicentState}from"./hooks/useCodicentState.js";export{useAudioRecorder}from"./hooks/useAudioRecorder.js";export{default as useTools}from"./hooks/useTools.js";export{default as useRealtimeVoiceAI}from"./hooks/useRealtimeVoiceAI.js";export{default as useLocalization}from"./hooks/useLocalization.js";export{useTemplateVariables}from"./hooks/useTemplateVariables.js";export{useCodicentApp}from"./hooks/useCodicentApp.js";export{default as useAppStyles}from"./hooks/useAppStyles.js";export{default as useToaster}from"./hooks/useToaster.js";export{default as MessageContent}from"./utils/MessageContent.js";export{default as generateBrandVariants}from"./utils/theme.js";export{default as log}from"./utils/logging.js";export{default as withWakeLock}from"./utils/withWakeLock.js";export{AppStateMachine,createAppStateMachine}from"./utils/appState.js";import{d as e}from"./_virtual/index.js";import"./lib/wavtools/lib/wav_packer.js";import"./lib/wavtools/lib/analysis/audio_analysis.js";export{WavStreamPlayer}from"./lib/wavtools/lib/wav_stream_player.js";export{WavRecorder}from"./lib/wavtools/lib/wav_recorder.js";export{getGpsLocation,isMobileDevice}from"./utils/device.js";export{getTimeString}from"./utils/helpers.js";export{AppConfig,getConfigValue,initCodicentApp}from"./config/index.js";export{default as AppFrame}from"./pages/AppFrame.js";export{default as Chat}from"./pages/Chat.js";export{Compose}from"./pages/Compose.js";export{default as Snap}from"./pages/Snap.js";export{default as Search}from"./pages/Search.js";export{default as Login}from"./pages/Login.js";export{Logout}from"./pages/Logout.js";export{CrmPage}from"./pages/CrmPage.js";export{CrmPagePersistent}from"./pages/CrmPagePersistent.js";export{default as ImageView}from"./pages/ImageView.js";export{default as FormInvite}from"./pages/FormInvite.js";export{default as FormAccept}from"./pages/FormAccept.js";export{Sales}from"./pages/Sales.js";export{default as HtmlViewer}from"./pages/HtmlViewer.js";export{Purchase}from"./pages/Purchase.js";var o=e.StateMachine;export{o as StateMachine};
1
+ export{CodicentService}from"./services/codicent.js";export{default as Markdown}from"./components/Markdown.js";export{Textarea}from"./components/Textarea.js";export{Button}from"./components/Button.js";export{CompoundButton}from"./components/CompoundButton.js";export{Title}from"./components/Title.js";export{Text}from"./components/Text.js";export{Spinner}from"./components/Spinner.js";export{Label}from"./components/Label.js";export{Input}from"./components/Input.js";export{default as TextHeader}from"./components/TextHeader.js";export{default as TypingIndicator}from"./components/TypingIndicator.js";export{default as Prompt}from"./components/Prompt.js";export{default as ChatInput}from"./components/ChatInput.js";export{CombinedPlaceholderDialog}from"./components/CombinedPlaceholderDialog.js";export{default as ChatMessage}from"./components/ChatMessage.js";export{Header}from"./components/Header.js";export{default as VoiceIcon}from"./components/VoiceIcon.js";export{default as AudioIcon}from"./components/AudioIcon.js";export{FileThumbnail}from"./components/FileThumbnail.js";export{default as MessageInput}from"./components/MessageInput.js";export{default as UploadFile}from"./components/UploadFile.js";export{default as SnapFooter}from"./components/SnapFooter.js";export{default as Profile}from"./components/Profile.js";export{default as MessageItem}from"./components/MessageItem.js";export{default as Content}from"./components/Content.js";export{default as AiInput}from"./components/AiInput.js";export{default as SearchBox}from"./components/SearchBox.js";export{default as HtmlView}from"./components/HtmlView.js";export{Footer}from"./components/Footer.js";export{Page}from"./components/Page.js";export{UrlProcessor}from"./components/UrlProcessor.js";export{DatePicker}from"./components/DatePicker.js";export{ColorPicker}from"./components/ColorPicker.js";export{TimePicker}from"./components/TimePicker.js";export{default as useStateWithLocalStorage}from"./hooks/useStateWithLocalStorage.js";export{default as useAuthState}from"./hooks/useAuthState.js";export{useChat}from"./hooks/useChat.js";export{default as useCodicentState}from"./hooks/useCodicentState.js";export{useAudioRecorder}from"./hooks/useAudioRecorder.js";export{default as useTools}from"./hooks/useTools.js";export{default as useRealtimeVoiceAI}from"./hooks/useRealtimeVoiceAI.js";export{default as useLocalization}from"./hooks/useLocalization.js";export{useTemplateVariables}from"./hooks/useTemplateVariables.js";export{useCodicentApp}from"./hooks/useCodicentApp.js";export{default as useAppStyles}from"./hooks/useAppStyles.js";export{default as useToaster}from"./hooks/useToaster.js";export{default as MessageContent}from"./utils/MessageContent.js";export{default as generateBrandVariants}from"./utils/theme.js";export{default as log}from"./utils/logging.js";export{default as withWakeLock}from"./utils/withWakeLock.js";export{AppStateMachine,createAppStateMachine}from"./utils/appState.js";import{d as e}from"./_virtual/index.js";import"./lib/wavtools/lib/wav_packer.js";import"./lib/wavtools/lib/analysis/audio_analysis.js";export{WavStreamPlayer}from"./lib/wavtools/lib/wav_stream_player.js";export{WavRecorder}from"./lib/wavtools/lib/wav_recorder.js";export{getGpsLocation,isMobileDevice}from"./utils/device.js";export{getTimeString}from"./utils/helpers.js";export{CacheManager,stateMachineCacheManager}from"./utils/cacheManager.js";export{AppConfig,getConfigValue,initCodicentApp}from"./config/index.js";export{default as AppFrame}from"./pages/AppFrame.js";export{default as Chat}from"./pages/Chat.js";export{Compose}from"./pages/Compose.js";export{default as Snap}from"./pages/Snap.js";export{default as Search}from"./pages/Search.js";export{default as Login}from"./pages/Login.js";export{Logout}from"./pages/Logout.js";export{CrmPage}from"./pages/CrmPage.js";export{CrmPagePersistent}from"./pages/CrmPagePersistent.js";export{default as ImageView}from"./pages/ImageView.js";export{default as FormInvite}from"./pages/FormInvite.js";export{default as FormAccept}from"./pages/FormAccept.js";export{Sales}from"./pages/Sales.js";export{default as HtmlViewer}from"./pages/HtmlViewer.js";export{Purchase}from"./pages/Purchase.js";var o=e.StateMachine;export{o as StateMachine};
@@ -1 +1 @@
1
- import{jsx as o}from"react/jsx-runtime";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"react";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as t}from"../components/Page.js";import{makeStyles as e}from"../node_modules/@griffel/react/makeStyles.esm.js";const s=e({iframe:{width:"100%",height:"100%",border:"none"},scrollable:{overflow:"auto"},nonScrollable:{overflow:"hidden"},fixFrameHeight:{height:"calc(100% - 5px)"}}),r=({src:e,showFooter:r,title:i})=>{const m=s();return r?o(t,{hideFooter:!r,hideHeader:!0,children:o("iframe",{title:i,src:e,className:`${m.iframe} ${r?m.fixFrameHeight:""}`})}):o("iframe",{title:i,src:e,className:m.iframe})};export{r as default};
1
+ import{jsx as o}from"react/jsx-runtime";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"react";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as t}from"../components/Page.js";import{makeStyles as e}from"../node_modules/@griffel/react/makeStyles.esm.js";const s=e({iframe:{width:"100%",height:"100%",border:"none"},scrollable:{overflow:"auto"},nonScrollable:{overflow:"hidden"},fixFrameHeight:{height:"calc(100% - 5px)"}}),r=({src:e,showFooter:r,title:i})=>{const m=s();return r?o(t,{hideFooter:!r,hideHeader:!0,children:o("iframe",{title:i,src:e,className:`${m.iframe} ${r?m.fixFrameHeight:""}`})}):o("iframe",{title:i,src:e,className:m.iframe})};export{r as default};
@@ -1 +1 @@
1
- import{jsxs as e,jsx as o}from"react/jsx-runtime";import{useRef as t,useState as n,useEffect as r}from"react";import{useNavigate as s,useSearchParams as i}from"react-router-dom";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import a from"../components/TextHeader.js";import l from"../components/TypingIndicator.js";import m from"../components/Prompt.js";import p from"../components/ChatInput.js";import{CombinedPlaceholderDialog as c}from"../components/CombinedPlaceholderDialog.js";import d from"../components/ChatMessage.js";import"../components/Header.js";import h from"../hooks/useStateWithLocalStorage.js";import{CodicentService as u}from"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as g}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import{useChat as f}from"../hooks/useChat.js";import j from"../hooks/useLocalization.js";import{useTemplateVariables as b}from"../hooks/useTemplateVariables.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as x}from"../components/Page.js";import{makeStyles as C}from"../node_modules/@griffel/react/makeStyles.esm.js";import{CalendarWeekStart24Regular as w}from"../node_modules/@fluentui/react-icons/lib/sizedIcons/chunk-3.js";const y=C({chatContainer:{width:"100%",flex:1,maxWidth:"800px",height:"100%",display:"flex",flexDirection:"column",margin:"0 auto",overflow:"hidden","@media (max-width: 768px)":{maxWidth:"100%",borderRadius:"0"},"@media (max-width: 480px)":{},backgroundPosition:"calc(50%) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",touchAction:"pan-y"},chatMessages:{display:"flex",flexDirection:"column",flex:1,padding:"16px",overflowY:"auto",touchAction:"pan-y"}}),v=({state:C})=>{const v=y(),{t:S,tAsync:k,getLanguageInfo:F}=j(),I=s(),{messages:P,isBotTyping:T,handleSend:_,newChat:A,openChat:M}=f(C.stateMachine),H=t(null),[V,N]=i(),[B,L]=n(null),[R,O]=n(!1),[W,E]=n(!1),{service:U,currentStateName:z}=C,[D,G]=n([]),[Y,$]=n([]),[K,q]=n(!1),[J,Q]=n(),[X,Z]=h(C.context.selectedApp+"_prompts",[]),[ee,oe]=n(!1),{extractTemplateVariables:te,replaceTemplateVariables:ne,extractFilePlaceholders:re,replaceFilePlaceholders:se,handleSelectFiles:ie}=b(U.uploadFile),ae=t(!1),le=t(null);r((()=>{const e=window.history.length>1,o=Boolean(document.referrer&&document.referrer!==window.location.href);E(e||o)}),[]);r((()=>{g("SHOW_CHAT_PROMPTS")&&0===P.length&&C.service.getAppPrompts().then(Z).catch((e=>{console.error("Failed to get prompts",e)}))}),[C.service,Z,P.length]),r((()=>{setTimeout((()=>{H.current?.scrollIntoView({behavior:"smooth"})}),10)}),[P]),r((()=>{if(ae.current)return;ae.current=!0;const e=V.get("text"),o=V.get("id"),t=V.get("fid");if(e){(async()=>{const o=re(e),t=te(e);A(),o.length>0||t.length>0?($(o),G(t),q(!0),L(S(e))):L(S(e))})()}else o?M(o):t&&Q(t)}),[]),r((()=>{J&&"anonymous"===z&&le.current!==J&&(le.current=J,U.getFormById(J).then((async e=>{A();const o=F().language,t=e.prompt.replace("{{fid}}",J).replace("{{fname}}",e.name).replace("{{language}}",o);oe(!0);const n=await k(t);oe(!1),L(n),E(!1)})))}),[J,A,U,L,z,k,F,oe]),r((()=>{if(B&&!K){let e=B;Y.length>0&&(e=se(e,Y)),D.length>0&&(e=ne(e,D)),_(e),N({},{replace:!0}),L(null),G([]),$([])}}),[B,K,_,N,se,ne,Y,D]);const me=e=>{const o=V.get("append");o&&(e+="\n---\n"+o),_(e)};return e(x,{hideHeader:!0,hideFooter:!!J,children:[e("div",{id:"chat-container",className:v.chatContainer,style:{backgroundImage:`url(${g("CHAT_BACKGROUND_IMAGE_URL")})`},children:[W&&o("button",{onClick:()=>{W&&I(-1)},"aria-label":S("Tillbaka"),style:{position:"absolute",top:12,left:12,zIndex:100,background:"var(--colorNeutralBackground1)",border:"none",cursor:"pointer",padding:8,borderRadius:8,boxShadow:"0 2px 8px rgba(0,0,0,0.08)",display:"flex",alignItems:"center",justifyContent:"center"},children:o(w,{style:{transform:"rotate(180deg)"}})}),o("div",{style:{marginLeft:W?40:0},children:o(a,{title:S(g("APP_CHAT_TITLE")||"Chatt"),onNewChat:J?void 0:()=>O(!0)})}),e("div",{className:v.chatMessages,children:[g("SHOW_CHAT_PROMPTS")&&X.length>0&&0===P.length&&o(d,{sender:"bot",content:S(g("CHAT_WELCOME")||"Välkommen!"),children:X.map(((t,n)=>e("div",{children:["> ",o("a",{href:"./#/chat",onClick:()=>{me(t.title+"\n---\n"+t.prompt)},children:S(t.title)}),o("br",{})]},`prompt-${n}`)))}),P.map(((t,n)=>e("div",{children:[(T&&n===P.length-1||!T&&n===P.length-2)&&o("div",{ref:H}),o(d,{sender:t.sender,content:t.content,isNew:t.isNew,showSuggestions:n===P.length-1,onSuggestionClicked:_},t.id)]},t.id))),ee&&o(d,{sender:"user",content:S("Översätter...")}),T&&o(l,{})]}),o(p,{codicent:C.context.selectedApp,disableSend:T,onSend:me,onSelectFiles:ie,getImageUrl:u.getImageUrl,getFileInfo:e=>U.getFileInfo(e)})]}),o(m,{open:R,title:S("Vill du rensa chatten?"),content:S("En ny startas, men chatten kommer först sparas."),onYes:()=>{O(!1),A()},onNo:()=>O(!1)}),o(c,{open:K,templateVariables:D,filePlaceholders:Y,onTemplateVariablesChange:G,onFilePlaceholdersChange:$,onConfirm:()=>q(!1),onCancel:()=>{q(!1),L(null),G([]),$([])},uploadFile:U.uploadFile})]})};export{v as default};
1
+ import{jsxs as e,jsx as o}from"react/jsx-runtime";import{useRef as t,useState as n,useEffect as r}from"react";import{useNavigate as s,useSearchParams as i}from"react-router-dom";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import a from"../components/TextHeader.js";import l from"../components/TypingIndicator.js";import m from"../components/Prompt.js";import p from"../components/ChatInput.js";import{CombinedPlaceholderDialog as c}from"../components/CombinedPlaceholderDialog.js";import d from"../components/ChatMessage.js";import"../components/Header.js";import h from"../hooks/useStateWithLocalStorage.js";import{CodicentService as u}from"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as g}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import{useChat as j}from"../hooks/useChat.js";import f from"../hooks/useLocalization.js";import{useTemplateVariables as b}from"../hooks/useTemplateVariables.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as x}from"../components/Page.js";import{makeStyles as C}from"../node_modules/@griffel/react/makeStyles.esm.js";import{CalendarWeekStart24Regular as w}from"../node_modules/@fluentui/react-icons/lib/sizedIcons/chunk-3.js";const y=C({chatContainer:{width:"100%",flex:1,maxWidth:"800px",height:"100%",display:"flex",flexDirection:"column",margin:"0 auto",overflow:"hidden","@media (max-width: 768px)":{maxWidth:"100%",borderRadius:"0"},"@media (max-width: 480px)":{},backgroundPosition:"calc(50%) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",touchAction:"pan-y"},chatMessages:{display:"flex",flexDirection:"column",flex:1,padding:"16px",overflowY:"auto",touchAction:"pan-y"}}),v=({state:C})=>{const v=y(),{t:S,tAsync:k,getLanguageInfo:F}=f(),I=s(),{messages:P,isBotTyping:T,handleSend:_,newChat:A,openChat:M}=j(C.stateMachine),H=t(null),[V,N]=i(),[B,L]=n(null),[R,O]=n(!1),[W,E]=n(!1),{service:U,currentStateName:z}=C,[D,G]=n([]),[Y,$]=n([]),[K,q]=n(!1),[J,Q]=n(),[X,Z]=h(C.context.selectedApp+"_prompts",[]),[ee,oe]=n(!1),{extractTemplateVariables:te,replaceTemplateVariables:ne,extractFilePlaceholders:re,replaceFilePlaceholders:se,handleSelectFiles:ie}=b(U.uploadFile),ae=t(!1),le=t(null);r((()=>{const e=window.history.length>1,o=Boolean(document.referrer&&document.referrer!==window.location.href);E(e||o)}),[]);r((()=>{g("SHOW_CHAT_PROMPTS")&&0===P.length&&C.service.getAppPrompts().then(Z).catch((e=>{console.error("Failed to get prompts",e)}))}),[C.service,Z,P.length]),r((()=>{setTimeout((()=>{H.current?.scrollIntoView({behavior:"smooth"})}),10)}),[P]),r((()=>{if(ae.current)return;ae.current=!0;const e=V.get("text"),o=V.get("id"),t=V.get("fid");if(e){(async()=>{const o=re(e),t=te(e);A(),o.length>0||t.length>0?($(o),G(t),q(!0),L(S(e))):L(S(e))})()}else o?M(o):t&&Q(t)}),[]),r((()=>{J&&"anonymous"===z&&le.current!==J&&(le.current=J,U.getFormById(J).then((async e=>{A();const o=F().language,t=e.prompt.replace("{{fid}}",J).replace("{{fname}}",e.name).replace("{{language}}",o);oe(!0);const n=await k(t);oe(!1),L(n),E(!1)})))}),[J,A,U,L,z,k,F,oe]),r((()=>{if(B&&!K){let e=B;Y.length>0&&(e=se(e,Y)),D.length>0&&(e=ne(e,D)),_(e),N({},{replace:!0}),L(null),G([]),$([])}}),[B,K,_,N,se,ne,Y,D]);const me=e=>{const o=V.get("append");o&&(e+="\n---\n"+o),_(e)};return e(x,{hideHeader:!0,hideFooter:!!J,children:[e("div",{id:"chat-container",className:v.chatContainer,style:{backgroundImage:`url(${g("CHAT_BACKGROUND_IMAGE_URL")})`},children:[W&&o("button",{onClick:()=>{W&&I(-1)},"aria-label":S("Tillbaka"),style:{position:"absolute",top:12,left:12,zIndex:100,background:"var(--colorNeutralBackground1)",border:"none",cursor:"pointer",padding:8,borderRadius:8,boxShadow:"0 2px 8px rgba(0,0,0,0.08)",display:"flex",alignItems:"center",justifyContent:"center"},children:o(w,{style:{transform:"rotate(180deg)"}})}),o("div",{style:{marginLeft:W?40:0},children:o(a,{title:S(g("APP_CHAT_TITLE")||"Chatt"),onNewChat:J?void 0:()=>O(!0)})}),e("div",{className:v.chatMessages,children:[g("SHOW_CHAT_PROMPTS")&&X.length>0&&0===P.length&&o(d,{sender:"bot",content:S(g("CHAT_WELCOME")||"Välkommen!"),children:X.map(((t,n)=>e("div",{children:["> ",o("a",{href:"./#/chat",onClick:()=>{me(t.title+"\n---\n"+t.prompt)},children:S(t.title)}),o("br",{})]},`prompt-${n}`)))}),P.map(((t,n)=>e("div",{children:[(T&&n===P.length-1||!T&&n===P.length-2)&&o("div",{ref:H}),o(d,{sender:t.sender,content:t.content,isNew:t.isNew,showSuggestions:n===P.length-1,onSuggestionClicked:_},t.id)]},t.id))),ee&&o(d,{sender:"user",content:S("Översätter...")}),T&&o(l,{})]}),o(p,{codicent:C.context.selectedApp,disableSend:T,onSend:me,onSelectFiles:ie,getImageUrl:u.getImageUrl,getFileInfo:e=>U.getFileInfo(e)})]}),o(m,{open:R,title:S("Vill du rensa chatten?"),content:S("En ny startas, men chatten kommer först sparas."),onYes:()=>{O(!1),A()},onNo:()=>O(!1)}),o(c,{open:K,templateVariables:D,filePlaceholders:Y,onTemplateVariablesChange:G,onFilePlaceholdersChange:$,onConfirm:()=>q(!1),onCancel:()=>{q(!1),L(null),G([]),$([])},uploadFile:U.uploadFile})]})};export{v as default};
@@ -1 +1 @@
1
- import{jsx as o,jsxs as e}from"react/jsx-runtime";import{useState as t,useRef as i,useCallback as n,useEffect as r}from"react";import{useSearchParams as a,useNavigate as s}from"react-router-dom";import{getConfigValue as m}from"../config/index.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import l from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import{CodicentService as p}from"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{getGpsLocation as c}from"../utils/device.js";import"./AppFrame.js";import"./Chat.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import d from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import g from"../hooks/useToaster.js";import"../components/FileThumbnail.js";import u from"../components/MessageInput.js";import j from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as f}from"../components/Page.js";import{makeStyles as h}from"../node_modules/@griffel/react/makeStyles.esm.js";import{shorthands as S}from"../node_modules/@griffel/core/index.esm.js";import{tokens as v}from"../node_modules/@fluentui/tokens/lib/tokens.js";const _=h({main:{flexGrow:1,...S.padding("10px"),overflowY:"auto"},container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%"},root:{height:"100%"},item:{height:"auto",width:"auto",flexShrink:1,marginBottom:"1rem"},chat:{flexGrow:1,boxSizing:"border-box",overflow:"hidden",border:"none"},attachmentBar:{display:"none"},iconButton:{width:"24px",height:"24px"},imageCard:{alignContent:"center",borderRadius:v.borderRadiusLarge,height:"240px",textAlign:"left",position:"relative"}}),x=({state:h})=>{const S=_(),{t:v}=d(),[x,I]=t(!1),P=i(null),b=i(null),C=i(null),[F,w]=t(null),[U,A]=t([]),{service:E}=h,[y,M]=a(),[T,k]=t(void 0),[L,O]=t(),H=g(),$=s(),B=n((o=>{for(const e of o)E.getFileInfo(e).then((o=>{A((e=>[...e,o]))}))}),[E,A]),D=n((o=>{const e=new FormData;e.append("file",o),E.uploadFile(o.name,e).then((o=>{B([o])})).catch((()=>{H.notify(v("Error"),v("Error uploading pasted image"),"")}))}),[E,B,H,v]),G=o=>{I(o)};r((()=>{const o=y.get("text"),e=y.get("url"),t=y.get("parentId");o&&(k(o),y.delete("text")),t&&(O(t),y.delete("parentId")),e&&(y.delete("url"),k(((o||"")+" "+e).trim())),M(y,{replace:!0})}),[y,M,k,E,B]);return o(f,{hideHeader:!0,children:e("div",{className:S.container,style:{backgroundImage:`url(${m("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[o(l,{title:m("APP_SAVE_TITLE")?v(m("APP_SAVE_TITLE")):v("Spara")}),o(u,{disableSend:!0,defaultText:T,onSend:o=>{o=`${o}${F?" "+F:""}${U.length>0?"\n":""}${U.map((o=>`#file:${o.id}`)).join(" ")}`,E.sendMessage(o,L).then((()=>{H.notify(v("Meddelande"),v("Meddelandet är sparat."),""),L&&(O(void 0),$(-1))}))},files:U,onFilesChange:A,isUploading:x,onHandleDefaultFiles:B,onUploadFile:()=>{P.current?.triggerUpload(),console.log("attach-file")},onUploadImage:m("COMPOSE_SIMPLE_ATTACH_FILE")?void 0:()=>{b.current?.triggerUpload(),console.log("attach-image")},onUploadCamera:m("COMPOSE_SIMPLE_ATTACH_FILE")?void 0:()=>{C.current?.triggerUpload(),console.log("attach-camera")},getImageUrl:p.getImageUrl,onLocationChange:m("COMPOSE_HIDE_LOCATION")?void 0:o=>{o?(async()=>{console.log("attach-location");const o=await c();o?(H.notify(v("Position"),v("Position tillagd."),""),w(`#gps(${o.coords.latitude},${o.coords.longitude})`)):console.log("Failed to get GPS location")})():(w(null),H.notify(v("Position"),v("Position borttagen."),""),console.log("clear-location"))},hasLocation:!!F,onImagePasted:D}),o(j,{ref:P,onFileUploaded:B,onUploading:G,multiple:!0,codicentService:E}),o(j,{codicentService:E,ref:b,onFileUploaded:B,onUploading:G,multiple:!0,accept:"image/*"}),o(j,{codicentService:E,ref:C,onFileUploaded:B,onUploading:G,multiple:!0,accept:"image/*",capture:"environment"})]})})};export{x as Compose,x as default};
1
+ import{jsx as o,jsxs as e}from"react/jsx-runtime";import{useState as t,useRef as i,useCallback as n,useEffect as r}from"react";import{useSearchParams as a,useNavigate as s}from"react-router-dom";import{getConfigValue as m}from"../config/index.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import l from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import{CodicentService as p}from"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{getGpsLocation as c}from"../utils/device.js";import"./AppFrame.js";import"./Chat.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import d from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import g from"../hooks/useToaster.js";import"../components/FileThumbnail.js";import u from"../components/MessageInput.js";import j from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as f}from"../components/Page.js";import{makeStyles as h}from"../node_modules/@griffel/react/makeStyles.esm.js";import{shorthands as S}from"../node_modules/@griffel/core/index.esm.js";import{tokens as v}from"../node_modules/@fluentui/tokens/lib/tokens.js";const _=h({main:{flexGrow:1,...S.padding("10px"),overflowY:"auto"},container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%"},root:{height:"100%"},item:{height:"auto",width:"auto",flexShrink:1,marginBottom:"1rem"},chat:{flexGrow:1,boxSizing:"border-box",overflow:"hidden",border:"none"},attachmentBar:{display:"none"},iconButton:{width:"24px",height:"24px"},imageCard:{alignContent:"center",borderRadius:v.borderRadiusLarge,height:"240px",textAlign:"left",position:"relative"}}),x=({state:h})=>{const S=_(),{t:v}=d(),[x,I]=t(!1),P=i(null),b=i(null),C=i(null),[F,w]=t(null),[U,A]=t([]),{service:E}=h,[M,y]=a(),[T,k]=t(void 0),[L,O]=t(),H=g(),$=s(),B=n((o=>{for(const e of o)E.getFileInfo(e).then((o=>{A((e=>[...e,o]))}))}),[E,A]),D=n((o=>{const e=new FormData;e.append("file",o),E.uploadFile(o.name,e).then((o=>{B([o])})).catch((()=>{H.notify(v("Error"),v("Error uploading pasted image"),"")}))}),[E,B,H,v]),G=o=>{I(o)};r((()=>{const o=M.get("text"),e=M.get("url"),t=M.get("parentId");o&&(k(o),M.delete("text")),t&&(O(t),M.delete("parentId")),e&&(M.delete("url"),k(((o||"")+" "+e).trim())),y(M,{replace:!0})}),[M,y,k,E,B]);return o(f,{hideHeader:!0,children:e("div",{className:S.container,style:{backgroundImage:`url(${m("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[o(l,{title:m("APP_SAVE_TITLE")?v(m("APP_SAVE_TITLE")):v("Spara")}),o(u,{disableSend:!0,defaultText:T,onSend:o=>{o=`${o}${F?" "+F:""}${U.length>0?"\n":""}${U.map((o=>`#file:${o.id}`)).join(" ")}`,E.sendMessage(o,L).then((()=>{H.notify(v("Meddelande"),v("Meddelandet är sparat."),""),L&&(O(void 0),$(-1))}))},files:U,onFilesChange:A,isUploading:x,onHandleDefaultFiles:B,onUploadFile:()=>{P.current?.triggerUpload(),console.log("attach-file")},onUploadImage:m("COMPOSE_SIMPLE_ATTACH_FILE")?void 0:()=>{b.current?.triggerUpload(),console.log("attach-image")},onUploadCamera:m("COMPOSE_SIMPLE_ATTACH_FILE")?void 0:()=>{C.current?.triggerUpload(),console.log("attach-camera")},getImageUrl:p.getImageUrl,onLocationChange:m("COMPOSE_HIDE_LOCATION")?void 0:o=>{o?(async()=>{console.log("attach-location");const o=await c();o?(H.notify(v("Position"),v("Position tillagd."),""),w(`#gps(${o.coords.latitude},${o.coords.longitude})`)):console.log("Failed to get GPS location")})():(w(null),H.notify(v("Position"),v("Position borttagen."),""),console.log("clear-location"))},hasLocation:!!F,onImagePasted:D}),o(j,{ref:P,onFileUploaded:B,onUploading:G,multiple:!0,codicentService:E}),o(j,{codicentService:E,ref:b,onFileUploaded:B,onUploading:G,multiple:!0,accept:"image/*"}),o(j,{codicentService:E,ref:C,onFileUploaded:B,onUploading:G,multiple:!0,accept:"image/*",capture:"environment"})]})})};export{x as Compose,x as default};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as o}from"react/jsx-runtime";import{useState as t,useRef as n,useCallback as r,useEffect as i,useMemo as s}from"react";import{CodicentService as a}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import m from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import p from"../components/VoiceIcon.js";import l from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as c}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"../components/FileThumbnail.js";import d from"../components/MessageInput.js";import u from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as g}from"../components/Page.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import j from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import f from"../hooks/useToaster.js";import{useSearchParams as h}from"react-router-dom";import{l as v}from"../node_modules/lodash/lodash.js";import{makeStyles as k}from"../node_modules/@griffel/react/makeStyles.esm.js";import{shorthands as S}from"../node_modules/@griffel/core/index.esm.js";import{tokens as x}from"../node_modules/@fluentui/tokens/lib/tokens.js";import{MessageBar as b}from"../node_modules/@fluentui/react-message-bar/lib/components/MessageBar/MessageBar.js";import{MessageBarBody as w}from"../node_modules/@fluentui/react-message-bar/lib/components/MessageBarBody/MessageBarBody.js";const y=k({main:{flexGrow:1,...S.padding("10px"),overflowY:"auto"},container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%",position:"relative"},root:{height:"100%"},item:{height:"auto",width:"auto",flexShrink:1,marginBottom:"1rem"},chat:{flexGrow:1,boxSizing:"border-box",overflow:"hidden",border:"none"},attachmentBar:{display:"none"},iconButton:{width:"24px",height:"24px"},imageCard:{alignContent:"center",borderRadius:x.borderRadiusLarge,height:"240px",textAlign:"left",position:"relative"},review:{padding:"10px",wordBreak:"break-word",whiteSpace:"pre-line",maxWidth:"100%",overflowWrap:"break-word"},voiceIcon:{position:"absolute",top:"20px",right:"12px",zIndex:1001,cursor:"pointer"}}),_=({state:k,voice:S})=>{const x=y(),{t:_}=j(),[I,C]=t(!1),U=n(null),B=n(null),M=n(null),[A]=t(null),[F,P]=t([]),{service:T}=k,[E,N]=h(),[O,$]=t(""),[L,R]=t(void 0),V=f(),[H,z]=t(void 0),[D,G]=t("info"),W=r((e=>{for(const o of e)T.getFileInfo(o).then((e=>{P((o=>[...o,e]))}))}),[T,P]),J=r((e=>{const o=new FormData;o.append("file",e),T.uploadFile(e.name,o).then((e=>{W([e])})).catch((()=>{V.notify(_("Error"),_("Error uploading pasted image"),"")}))}),[T,W,V,_]),K=e=>{C(e)};i((()=>{const e=E.get("text"),o=E.get("url");e&&($(e),E.delete("text")),o&&(E.delete("url"),$(((e||"")+" "+o).trim())),N(E,{replace:!0})}),[E,N,$,T,W]);const X=r((async e=>{if(!e||e.length<10)return;z(_("Analyserar...")),G("info");const o=await T.chat((e=>`Skapa kort ja/nej-status över hur CRM-aktiviteten som följer, givet dessa punkter: \n1. Namn på kunden finns med? ja/nej \n2. Syftet med mötet finns (varför träffar du kunden, kan täckas av 3 nedan) ja/nej\n3. Vad som framkommer under mötet (viktiga punkter och diskussioner) ja/nej\n4. Nästa steg finns med (hur ni kommer att träffas igen, och om något har sålts) ja/nej. \n\nSvara endast med ja/nej för varje punkt, ett svar per rad i följande exempel i JSON-format:\n{\n "customerName": "true",\n "purpose": "false",\n "meetingNotes": "true",\n "nextSteps": "false",\n "shortSummary": "Syfte med mötet och nästa steg saknas."\n}\n\n---\nTEXT:\n\n${e}`)(e));if(o){const e=new l(o.content);try{const o=JSON.parse(e.content);console.log("json",o);let t=0;for(const e in o)"true"===o[e]&&t++;z(_(4===t?"Allt är med":o.shortSummary||"Något saknas")),G(4===t?"success":"warning")}catch{z("Error: "+e.content),G("error")}}}),[T]),Y=s((()=>v.debounce(X,2e3)),[X]);return i((()=>()=>{Y.cancel()}),[Y]),e(g,{hideHeader:!0,children:o("div",{className:x.container,style:{backgroundImage:`url(${c("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[S&&c("SHOW_VOICE_BUTTON")&&e("div",{className:x.voiceIcon,children:e(p,{voice:S})}),e(m,{title:c("APP_SAVE_TITLE")?_(c("APP_SAVE_TITLE")):_("Spara")}),e(d,{defaultText:O,onSend:e=>{e=`${e=`#crm\n${e.replace("#log ","")}\nSALESPERSON: ${k.context.name||k.context.user?.email||k.context.nickname||"-"}`}${A?" "+A:""}${F.length>0?"\n":""}${F.map((e=>`#file:${e.id}`)).join(" ")}`,T.sendMessage(e).then((()=>{V.notify(_("Meddelande"),_("Meddelandet är sparat."),"")}))},files:F,onFilesChange:P,isUploading:I,onUploadImage:()=>{B.current?.triggerUpload()},onUploadCamera:()=>{M.current?.triggerUpload()},getImageUrl:a.getImageUrl,hasLocation:!!A,disableSend:!0,rows:9,placeholder:_("Beskriv CRM-aktivitet här..."),onChange:e=>{e!==L&&(R(e),e&&e.trim().length>0?Y(e):(z(void 0),Y.cancel()))},onImagePasted:J}),H&&o("div",{className:x.review,children:[e("h3",{children:_("Analys")}),e(b,{intent:D,layout:"multiline",children:e(w,{children:_(H)})})]}),e(u,{ref:U,onFileUploaded:W,onUploading:K,multiple:!0,codicentService:T}),e(u,{codicentService:T,ref:B,onFileUploaded:W,onUploading:K,multiple:!0,accept:"image/*"}),e(u,{codicentService:T,ref:M,onFileUploaded:W,onUploading:K,multiple:!0,accept:"image/*",capture:"environment"})]})})};export{_ as CrmPage,_ as default};
1
+ import{jsx as e,jsxs as o}from"react/jsx-runtime";import{useState as t,useRef as n,useCallback as r,useEffect as i,useMemo as s}from"react";import{CodicentService as a}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import m from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import p from"../components/VoiceIcon.js";import l from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as c}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"../components/FileThumbnail.js";import d from"../components/MessageInput.js";import u from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as g}from"../components/Page.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import j from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import f from"../hooks/useToaster.js";import{useSearchParams as h}from"react-router-dom";import{l as v}from"../node_modules/lodash/lodash.js";import{makeStyles as k}from"../node_modules/@griffel/react/makeStyles.esm.js";import{shorthands as S}from"../node_modules/@griffel/core/index.esm.js";import{tokens as x}from"../node_modules/@fluentui/tokens/lib/tokens.js";import{MessageBar as b}from"../node_modules/@fluentui/react-message-bar/lib/components/MessageBar/MessageBar.js";import{MessageBarBody as w}from"../node_modules/@fluentui/react-message-bar/lib/components/MessageBarBody/MessageBarBody.js";const y=k({main:{flexGrow:1,...S.padding("10px"),overflowY:"auto"},container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%",position:"relative"},root:{height:"100%"},item:{height:"auto",width:"auto",flexShrink:1,marginBottom:"1rem"},chat:{flexGrow:1,boxSizing:"border-box",overflow:"hidden",border:"none"},attachmentBar:{display:"none"},iconButton:{width:"24px",height:"24px"},imageCard:{alignContent:"center",borderRadius:x.borderRadiusLarge,height:"240px",textAlign:"left",position:"relative"},review:{padding:"10px",wordBreak:"break-word",whiteSpace:"pre-line",maxWidth:"100%",overflowWrap:"break-word"},voiceIcon:{position:"absolute",top:"20px",right:"12px",zIndex:1001,cursor:"pointer"}}),_=({state:k,voice:S})=>{const x=y(),{t:_}=j(),[I,C]=t(!1),M=n(null),U=n(null),B=n(null),[A]=t(null),[F,P]=t([]),{service:T}=k,[E,N]=h(),[O,$]=t(""),[L,R]=t(void 0),V=f(),[H,z]=t(void 0),[D,G]=t("info"),W=r((e=>{for(const o of e)T.getFileInfo(o).then((e=>{P((o=>[...o,e]))}))}),[T,P]),J=r((e=>{const o=new FormData;o.append("file",e),T.uploadFile(e.name,o).then((e=>{W([e])})).catch((()=>{V.notify(_("Error"),_("Error uploading pasted image"),"")}))}),[T,W,V,_]),K=e=>{C(e)};i((()=>{const e=E.get("text"),o=E.get("url");e&&($(e),E.delete("text")),o&&(E.delete("url"),$(((e||"")+" "+o).trim())),N(E,{replace:!0})}),[E,N,$,T,W]);const X=r((async e=>{if(!e||e.length<10)return;z(_("Analyserar...")),G("info");const o=await T.chat((e=>`Skapa kort ja/nej-status över hur CRM-aktiviteten som följer, givet dessa punkter: \n1. Namn på kunden finns med? ja/nej \n2. Syftet med mötet finns (varför träffar du kunden, kan täckas av 3 nedan) ja/nej\n3. Vad som framkommer under mötet (viktiga punkter och diskussioner) ja/nej\n4. Nästa steg finns med (hur ni kommer att träffas igen, och om något har sålts) ja/nej. \n\nSvara endast med ja/nej för varje punkt, ett svar per rad i följande exempel i JSON-format:\n{\n "customerName": "true",\n "purpose": "false",\n "meetingNotes": "true",\n "nextSteps": "false",\n "shortSummary": "Syfte med mötet och nästa steg saknas."\n}\n\n---\nTEXT:\n\n${e}`)(e));if(o){const e=new l(o.content);try{const o=JSON.parse(e.content);console.log("json",o);let t=0;for(const e in o)"true"===o[e]&&t++;z(_(4===t?"Allt är med":o.shortSummary||"Något saknas")),G(4===t?"success":"warning")}catch{z("Error: "+e.content),G("error")}}}),[T]),Y=s((()=>v.debounce(X,2e3)),[X]);return i((()=>()=>{Y.cancel()}),[Y]),e(g,{hideHeader:!0,children:o("div",{className:x.container,style:{backgroundImage:`url(${c("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[S&&c("SHOW_VOICE_BUTTON")&&e("div",{className:x.voiceIcon,children:e(p,{voice:S})}),e(m,{title:c("APP_SAVE_TITLE")?_(c("APP_SAVE_TITLE")):_("Spara")}),e(d,{defaultText:O,onSend:e=>{e=`${e=`#crm\n${e.replace("#log ","")}\nSALESPERSON: ${k.context.name||k.context.user?.email||k.context.nickname||"-"}`}${A?" "+A:""}${F.length>0?"\n":""}${F.map((e=>`#file:${e.id}`)).join(" ")}`,T.sendMessage(e).then((()=>{V.notify(_("Meddelande"),_("Meddelandet är sparat."),"")}))},files:F,onFilesChange:P,isUploading:I,onUploadImage:()=>{U.current?.triggerUpload()},onUploadCamera:()=>{B.current?.triggerUpload()},getImageUrl:a.getImageUrl,hasLocation:!!A,disableSend:!0,rows:9,placeholder:_("Beskriv CRM-aktivitet här..."),onChange:e=>{e!==L&&(R(e),e&&e.trim().length>0?Y(e):(z(void 0),Y.cancel()))},onImagePasted:J}),H&&o("div",{className:x.review,children:[e("h3",{children:_("Analys")}),e(b,{intent:D,layout:"multiline",children:e(w,{children:_(H)})})]}),e(u,{ref:M,onFileUploaded:W,onUploading:K,multiple:!0,codicentService:T}),e(u,{codicentService:T,ref:U,onFileUploaded:W,onUploading:K,multiple:!0,accept:"image/*"}),e(u,{codicentService:T,ref:B,onFileUploaded:W,onUploading:K,multiple:!0,accept:"image/*",capture:"environment"})]})})};export{_ as CrmPage,_ as default};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as o}from"react/jsx-runtime";import{useState as t,useRef as n,useCallback as r,useEffect as i,useMemo as a}from"react";import{CodicentService as s}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import l from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import m from"../components/VoiceIcon.js";import p from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as c}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{isMobileDevice as d}from"../utils/device.js";import"../components/FileThumbnail.js";import u from"../components/MessageInput.js";import f from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as g}from"../components/Page.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import h from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import j from"../hooks/useToaster.js";import{useSearchParams as x}from"react-router-dom";import{l as S}from"../node_modules/lodash/lodash.js";import{makeStyles as v}from"../node_modules/@griffel/react/makeStyles.esm.js";import{shorthands as y}from"../node_modules/@griffel/core/index.esm.js";import{tokens as k}from"../node_modules/@fluentui/tokens/lib/tokens.js";import{Text as w}from"../node_modules/@fluentui/react-text/lib/components/Text/Text.js";import{Spinner as b}from"../node_modules/@fluentui/react-spinner/lib/components/Spinner/Spinner.js";import{Card as C}from"../node_modules/@fluentui/react-card/lib/components/Card/Card.js";import{MessageBar as M}from"../node_modules/@fluentui/react-message-bar/lib/components/MessageBar/MessageBar.js";import{MessageBarBody as N}from"../node_modules/@fluentui/react-message-bar/lib/components/MessageBarBody/MessageBarBody.js";const _=v({main:{flexGrow:1,...y.padding("10px"),overflowY:"auto"},container:{display:"flex",flexDirection:"row",height:"100%",...y.gap("16px"),...y.padding("10px")},containerMobile:{display:"flex",flexDirection:"column",height:"100%",...y.gap("16px"),...y.padding("10px")},inputSection:{display:"flex",flexDirection:"column",flexGrow:1,maxWidth:"640px",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",position:"relative"},inputSectionMobile:{display:"flex",flexDirection:"column",width:"100%",position:"relative"},historySection:{flexBasis:"300px",flexShrink:0,display:"flex",flexDirection:"column",...y.gap("8px"),overflowY:"auto",...y.padding("8px")},historySectionMobile:{display:"flex",flexDirection:"column",...y.gap("8px"),overflowY:"auto",...y.padding("8px"),maxHeight:"300px"},historyCard:{...y.padding("12px"),cursor:"pointer","&:hover":{backgroundColor:k.colorNeutralBackground1Hover}},historyCardContent:{display:"flex",flexDirection:"column",...y.gap("4px")},historyDate:{fontSize:k.fontSizeBase200,color:k.colorNeutralForeground3},historyText:{fontSize:k.fontSizeBase300,wordBreak:"break-word",whiteSpace:"pre-wrap",maxHeight:"100px",overflow:"hidden",textOverflow:"ellipsis"},review:{padding:"10px",wordBreak:"break-word",whiteSpace:"pre-line",maxWidth:"100%",overflowWrap:"break-word"},voiceIcon:{position:"absolute",top:"20px",right:"12px",zIndex:1001,cursor:"pointer"},historyTitle:{fontSize:k.fontSizeBase400,fontWeight:k.fontWeightSemibold,marginBottom:"8px"},emptyState:{textAlign:"center",color:k.colorNeutralForeground3,padding:"20px"}}),T=({state:v,voice:y})=>{const k=_(),{t:T}=h(),[I,B]=t(!1),A=n(null),E=n(null),F=n(null),[U]=t(null),[D,$]=t([]),{service:P}=v,[O,z]=x(),[L,R]=t(""),[H,W]=t(void 0),V=j(),[G,J]=t(void 0),[Y,K]=t("info"),[X,q]=t([]),[Q,Z]=t(!1),ee=d(),oe=r((e=>{for(const o of e)P.getFileInfo(o).then((e=>{$((o=>[...o,e]))}))}),[P,$]),te=r((e=>{const o=new FormData;o.append("file",e),P.uploadFile(e.name,o).then((e=>{oe([e])})).catch((()=>{V.notify(T("Error"),T("Error uploading pasted image"),"")}))}),[P,oe,V,T]),ne=e=>{B(e)},re=r((async()=>{Z(!0);try{const e=await P.getMessages(["crm"]);q(e)}catch(e){console.error("Error loading CRM messages:",e),V.notify(T("Error"),T("Failed to load CRM messages"),"","error")}finally{Z(!1)}}),[P,V,T]);i((()=>{re()}),[re]),i((()=>{const e=O.get("text"),o=O.get("url");e&&(R(e),O.delete("text")),o&&(O.delete("url"),R(((e||"")+" "+o).trim())),z(O,{replace:!0})}),[O,z,R,P,oe]);const ie=e=>{e=`${e=`#crm\n${e.replace("#log ","")}\nSALESPERSON: ${v.context.name||v.context.user?.email||v.context.nickname||"-"}`}${U?" "+U:""}${D.length>0?"\n":""}${D.map((e=>`#file:${e.id}`)).join(" ")}`,P.sendMessage(e).then((()=>{V.notify(T("Meddelande"),T("Meddelandet är sparat."),""),re(),W(""),J(void 0)}))},ae=r((async e=>{if(!e||e.length<10)return;J(T("Analyserar...")),K("info");const o=await P.chat((e=>`Skapa kort ja/nej-status över hur CRM-aktiviteten som följer, givet dessa punkter: \n1. Namn på kunden finns med? ja/nej \n2. Syftet med mötet finns (varför träffar du kunden, kan täckas av 3 nedan) ja/nej\n3. Vad som framkommer under mötet (viktiga punkter och diskussioner) ja/nej\n4. Nästa steg finns med (hur ni kommer att träffas igen, och om något har sålts) ja/nej. \n\nSvara endast med ja/nej för varje punkt, ett svar per rad i följande exempel i JSON-format:\n{\n "customerName": "true",\n "purpose": "false",\n "meetingNotes": "true",\n "nextSteps": "false",\n "shortSummary": "Syfte med mötet och nästa steg saknas."\n}\n\n---\nTEXT:\n\n${e}`)(e));if(o){const e=new p(o.content);try{const o=JSON.parse(e.content);console.log("json",o);let t=0;for(const e in o)"true"===o[e]&&t++;J(T(4===t?"Allt är med":o.shortSummary||"Något saknas")),K(4===t?"success":"warning")}catch{J("Error: "+e.content),K("error")}}}),[P,T]),se=a((()=>S.debounce(ae,2e3)),[ae]);i((()=>()=>{se.cancel()}),[se]);const le=e=>{const o=new Date,t=new Date(e),n=o.getTime()-t.getTime(),r=Math.floor(n/6e4),i=Math.floor(n/36e5),a=Math.floor(n/864e5);return r<1?T("Just now"):r<60?`${r} ${T("minutes ago")}`:i<24?`${i} ${T("hours ago")}`:a<7?`${a} ${T("days ago")}`:t.toLocaleDateString()},me=e=>{const o=e.split("\n").filter((e=>!e.startsWith("#")&&!e.startsWith("SALESPERSON:")&&e.trim().length>0)).join("\n");return o.substring(0,150)+(o.length>150?"...":"")},pe=()=>o("div",{className:ee?k.historySectionMobile:k.historySection,children:[e(w,{className:k.historyTitle,children:T("Tidigare sparade")}),Q?e("div",{className:k.emptyState,children:e(b,{size:"small"})}):0===X.length?e("div",{className:k.emptyState,children:e(w,{children:T("Inga sparade meddelanden än")})}):X.map((t=>e(C,{className:k.historyCard,onClick:()=>(e=>{const o=me(e.content);W(o)})(t),children:o("div",{className:k.historyCardContent,children:[e(w,{className:k.historyDate,children:le(t.createdAt)}),e(w,{className:k.historyText,children:me(t.content)})]})},t.id)))]});return e(g,{hideHeader:!0,children:o("div",{className:ee?k.containerMobile:k.container,children:[!ee&&pe(),o("div",{className:ee?k.inputSectionMobile:k.inputSection,style:ee?void 0:{backgroundImage:`url(${c("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[y&&c("SHOW_VOICE_BUTTON")&&e("div",{className:k.voiceIcon,children:e(m,{voice:y})}),e(l,{title:c("APP_SAVE_TITLE")?T(c("APP_SAVE_TITLE")):T("Spara")}),e(u,{defaultText:L,onSend:ie,files:D,onFilesChange:$,isUploading:I,onUploadImage:()=>{E.current?.triggerUpload()},onUploadCamera:()=>{F.current?.triggerUpload()},getImageUrl:s.getImageUrl,hasLocation:!!U,disableSend:!0,rows:9,placeholder:T("Beskriv CRM-aktivitet här..."),onChange:e=>{e!==H&&(W(e),e&&e.trim().length>0?se(e):(J(void 0),se.cancel()))},onImagePasted:te}),G&&o("div",{className:k.review,children:[e("h3",{children:T("Analys")}),e(M,{intent:Y,layout:"multiline",children:e(N,{children:T(G)})})]}),e(f,{ref:A,onFileUploaded:oe,onUploading:ne,multiple:!0,codicentService:P}),e(f,{codicentService:P,ref:E,onFileUploaded:oe,onUploading:ne,multiple:!0,accept:"image/*"}),e(f,{codicentService:P,ref:F,onFileUploaded:oe,onUploading:ne,multiple:!0,accept:"image/*",capture:"environment"})]}),ee&&pe()]})})};export{T as CrmPagePersistent,T as default};
1
+ import{jsx as e,jsxs as o}from"react/jsx-runtime";import{useState as t,useRef as n,useCallback as r,useEffect as i,useMemo as a}from"react";import{CodicentService as s}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import l from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import m from"../components/VoiceIcon.js";import p from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as c}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{isMobileDevice as d}from"../utils/device.js";import"../components/FileThumbnail.js";import u from"../components/MessageInput.js";import f from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as g}from"../components/Page.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import h from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import j from"../hooks/useToaster.js";import{useSearchParams as x}from"react-router-dom";import{l as S}from"../node_modules/lodash/lodash.js";import{makeStyles as v}from"../node_modules/@griffel/react/makeStyles.esm.js";import{shorthands as y}from"../node_modules/@griffel/core/index.esm.js";import{tokens as k}from"../node_modules/@fluentui/tokens/lib/tokens.js";import{Text as w}from"../node_modules/@fluentui/react-text/lib/components/Text/Text.js";import{Spinner as b}from"../node_modules/@fluentui/react-spinner/lib/components/Spinner/Spinner.js";import{Card as C}from"../node_modules/@fluentui/react-card/lib/components/Card/Card.js";import{MessageBar as M}from"../node_modules/@fluentui/react-message-bar/lib/components/MessageBar/MessageBar.js";import{MessageBarBody as N}from"../node_modules/@fluentui/react-message-bar/lib/components/MessageBarBody/MessageBarBody.js";const _=v({main:{flexGrow:1,...y.padding("10px"),overflowY:"auto"},container:{display:"flex",flexDirection:"row",height:"100%",...y.gap("16px"),...y.padding("10px")},containerMobile:{display:"flex",flexDirection:"column",height:"100%",...y.gap("16px"),...y.padding("10px")},inputSection:{display:"flex",flexDirection:"column",flexGrow:1,maxWidth:"640px",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",position:"relative"},inputSectionMobile:{display:"flex",flexDirection:"column",width:"100%",position:"relative"},historySection:{flexBasis:"300px",flexShrink:0,display:"flex",flexDirection:"column",...y.gap("8px"),overflowY:"auto",...y.padding("8px")},historySectionMobile:{display:"flex",flexDirection:"column",...y.gap("8px"),overflowY:"auto",...y.padding("8px"),maxHeight:"300px"},historyCard:{...y.padding("12px"),cursor:"pointer","&:hover":{backgroundColor:k.colorNeutralBackground1Hover}},historyCardContent:{display:"flex",flexDirection:"column",...y.gap("4px")},historyDate:{fontSize:k.fontSizeBase200,color:k.colorNeutralForeground3},historyText:{fontSize:k.fontSizeBase300,wordBreak:"break-word",whiteSpace:"pre-wrap",maxHeight:"100px",overflow:"hidden",textOverflow:"ellipsis"},review:{padding:"10px",wordBreak:"break-word",whiteSpace:"pre-line",maxWidth:"100%",overflowWrap:"break-word"},voiceIcon:{position:"absolute",top:"20px",right:"12px",zIndex:1001,cursor:"pointer"},historyTitle:{fontSize:k.fontSizeBase400,fontWeight:k.fontWeightSemibold,marginBottom:"8px"},emptyState:{textAlign:"center",color:k.colorNeutralForeground3,padding:"20px"}}),T=({state:v,voice:y})=>{const k=_(),{t:T}=h(),[I,B]=t(!1),A=n(null),E=n(null),F=n(null),[U]=t(null),[D,$]=t([]),{service:P}=v,[O,z]=x(),[L,R]=t(""),[H,W]=t(void 0),V=j(),[G,J]=t(void 0),[Y,K]=t("info"),[X,q]=t([]),[Q,Z]=t(!1),ee=d(),oe=r((e=>{for(const o of e)P.getFileInfo(o).then((e=>{$((o=>[...o,e]))}))}),[P,$]),te=r((e=>{const o=new FormData;o.append("file",e),P.uploadFile(e.name,o).then((e=>{oe([e])})).catch((()=>{V.notify(T("Error"),T("Error uploading pasted image"),"")}))}),[P,oe,V,T]),ne=e=>{B(e)},re=r((async()=>{Z(!0);try{const e=await P.getMessages(["crm"]);q(e)}catch(e){console.error("Error loading CRM messages:",e),V.notify(T("Error"),T("Failed to load CRM messages"),"","error")}finally{Z(!1)}}),[P,V,T]);i((()=>{re()}),[re]),i((()=>{const e=O.get("text"),o=O.get("url");e&&(R(e),O.delete("text")),o&&(O.delete("url"),R(((e||"")+" "+o).trim())),z(O,{replace:!0})}),[O,z,R,P,oe]);const ie=e=>{e=`${e=`#crm\n${e.replace("#log ","")}\nSALESPERSON: ${v.context.name||v.context.user?.email||v.context.nickname||"-"}`}${U?" "+U:""}${D.length>0?"\n":""}${D.map((e=>`#file:${e.id}`)).join(" ")}`,P.sendMessage(e).then((()=>{V.notify(T("Meddelande"),T("Meddelandet är sparat."),""),re(),W(""),J(void 0)}))},ae=r((async e=>{if(!e||e.length<10)return;J(T("Analyserar...")),K("info");const o=await P.chat((e=>`Skapa kort ja/nej-status över hur CRM-aktiviteten som följer, givet dessa punkter: \n1. Namn på kunden finns med? ja/nej \n2. Syftet med mötet finns (varför träffar du kunden, kan täckas av 3 nedan) ja/nej\n3. Vad som framkommer under mötet (viktiga punkter och diskussioner) ja/nej\n4. Nästa steg finns med (hur ni kommer att träffas igen, och om något har sålts) ja/nej. \n\nSvara endast med ja/nej för varje punkt, ett svar per rad i följande exempel i JSON-format:\n{\n "customerName": "true",\n "purpose": "false",\n "meetingNotes": "true",\n "nextSteps": "false",\n "shortSummary": "Syfte med mötet och nästa steg saknas."\n}\n\n---\nTEXT:\n\n${e}`)(e));if(o){const e=new p(o.content);try{const o=JSON.parse(e.content);console.log("json",o);let t=0;for(const e in o)"true"===o[e]&&t++;J(T(4===t?"Allt är med":o.shortSummary||"Något saknas")),K(4===t?"success":"warning")}catch{J("Error: "+e.content),K("error")}}}),[P,T]),se=a((()=>S.debounce(ae,2e3)),[ae]);i((()=>()=>{se.cancel()}),[se]);const le=e=>{const o=new Date,t=new Date(e),n=o.getTime()-t.getTime(),r=Math.floor(n/6e4),i=Math.floor(n/36e5),a=Math.floor(n/864e5);return r<1?T("Just now"):r<60?`${r} ${T("minutes ago")}`:i<24?`${i} ${T("hours ago")}`:a<7?`${a} ${T("days ago")}`:t.toLocaleDateString()},me=e=>{const o=e.split("\n").filter((e=>!e.startsWith("#")&&!e.startsWith("SALESPERSON:")&&e.trim().length>0)).join("\n");return o.substring(0,150)+(o.length>150?"...":"")},pe=()=>o("div",{className:ee?k.historySectionMobile:k.historySection,children:[e(w,{className:k.historyTitle,children:T("Tidigare sparade")}),Q?e("div",{className:k.emptyState,children:e(b,{size:"small"})}):0===X.length?e("div",{className:k.emptyState,children:e(w,{children:T("Inga sparade meddelanden än")})}):X.map((t=>e(C,{className:k.historyCard,onClick:()=>(e=>{const o=me(e.content);W(o)})(t),children:o("div",{className:k.historyCardContent,children:[e(w,{className:k.historyDate,children:le(t.createdAt)}),e(w,{className:k.historyText,children:me(t.content)})]})},t.id)))]});return e(g,{hideHeader:!0,children:o("div",{className:ee?k.containerMobile:k.container,children:[!ee&&pe(),o("div",{className:ee?k.inputSectionMobile:k.inputSection,style:ee?void 0:{backgroundImage:`url(${c("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[y&&c("SHOW_VOICE_BUTTON")&&e("div",{className:k.voiceIcon,children:e(m,{voice:y})}),e(l,{title:c("APP_SAVE_TITLE")?T(c("APP_SAVE_TITLE")):T("Spara")}),e(u,{defaultText:L,onSend:ie,files:D,onFilesChange:$,isUploading:I,onUploadImage:()=>{E.current?.triggerUpload()},onUploadCamera:()=>{F.current?.triggerUpload()},getImageUrl:s.getImageUrl,hasLocation:!!U,disableSend:!0,rows:9,placeholder:T("Beskriv CRM-aktivitet här..."),onChange:e=>{e!==H&&(W(e),e&&e.trim().length>0?se(e):(J(void 0),se.cancel()))},onImagePasted:te}),G&&o("div",{className:k.review,children:[e("h3",{children:T("Analys")}),e(M,{intent:Y,layout:"multiline",children:e(N,{children:T(G)})})]}),e(f,{ref:A,onFileUploaded:oe,onUploading:ne,multiple:!0,codicentService:P}),e(f,{codicentService:P,ref:E,onFileUploaded:oe,onUploading:ne,multiple:!0,accept:"image/*"}),e(f,{codicentService:P,ref:F,onFileUploaded:oe,onUploading:ne,multiple:!0,accept:"image/*",capture:"environment"})]}),ee&&pe()]})})};export{T as CrmPagePersistent,T as default};
@@ -1 +1 @@
1
- import{jsx as o,jsxs as t,Fragment as e}from"react/jsx-runtime";import r from"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{Title as i}from"../components/Title.js";import{Text as n}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import{useState as s,useEffect as m}from"react";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as p}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{formatGuidToShorterReadableCode as a}from"../utils/helpers.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import c from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import l from"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as d}from"../components/Page.js";import{useSearchParams as j,useNavigate as u}from"react-router-dom";import{makeStyles as h}from"../node_modules/@griffel/react/makeStyles.esm.js";import{Button as g}from"../node_modules/@fluentui/react-button/lib/components/Button/Button.js";const f=h({container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%"},instructionParagraph:{fontWeight:"bold",marginBottom:"1em"},orderedList:{marginLeft:"20px",marginBottom:"1em",fontSize:"1.3em"}}),k=()=>{const{t:h,tAsync:k}=c(),[b]=j(),C=u(),_=b.get("id"),v=f(),[S,y]=s(""),[M,P]=s(!1);return m((()=>{(async()=>{const o=p("FORM_ACCEPT_MARKDOWN");if(o){P(!0);const t=await k(o);P(!1),y(t.replace("{{code}}",a(_||"")))}})()}),[k,_]),o(d,{hideFooter:!0,hideHeader:!0,children:o("div",{className:v.container,style:{backgroundImage:`url(${p("FORM_BACKGROUND_IMAGE_URL")})`},children:t(l,{children:[M&&o(n,{children:h("Översätter...")}),p("FORM_ACCEPT_MARKDOWN")&&S&&!M&&o(r,{content:S}),!p("FORM_ACCEPT_MARKDOWN")&&t(e,{children:[o(i,{children:h("Din kod för formuläret")}),o("p",{className:v.instructionParagraph,children:h("Instruktioner:")}),t("ol",{className:v.orderedList,children:[o("li",{children:h("Skriv ner eller kopiera den kod som visas nedan, du behöver den för att identifiera din session.")}),o("li",{children:h("Klicka på 'Starta' för att komma igång med chatten.")})]}),o(n,{size:500,children:h("Din kod är (skriv ner den):")}),o(n,{size:600,style:{userSelect:"all"},children:a(_||"")})]}),_&&o(g,{appearance:"primary",onClick:()=>C(`/chat?fid=${_}`),children:h("Starta")})]})})})};export{k as default};
1
+ import{jsx as o,jsxs as t,Fragment as e}from"react/jsx-runtime";import r from"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{Title as i}from"../components/Title.js";import{Text as n}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import{useState as s,useEffect as m}from"react";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as p}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{formatGuidToShorterReadableCode as a}from"../utils/helpers.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import c from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import l from"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as d}from"../components/Page.js";import{useSearchParams as j,useNavigate as u}from"react-router-dom";import{makeStyles as h}from"../node_modules/@griffel/react/makeStyles.esm.js";import{Button as g}from"../node_modules/@fluentui/react-button/lib/components/Button/Button.js";const f=h({container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%"},instructionParagraph:{fontWeight:"bold",marginBottom:"1em"},orderedList:{marginLeft:"20px",marginBottom:"1em",fontSize:"1.3em"}}),k=()=>{const{t:h,tAsync:k}=c(),[b]=j(),C=u(),_=b.get("id"),v=f(),[S,M]=s(""),[y,P]=s(!1);return m((()=>{(async()=>{const o=p("FORM_ACCEPT_MARKDOWN");if(o){P(!0);const t=await k(o);P(!1),M(t.replace("{{code}}",a(_||"")))}})()}),[k,_]),o(d,{hideFooter:!0,hideHeader:!0,children:o("div",{className:v.container,style:{backgroundImage:`url(${p("FORM_BACKGROUND_IMAGE_URL")})`},children:t(l,{children:[y&&o(n,{children:h("Översätter...")}),p("FORM_ACCEPT_MARKDOWN")&&S&&!y&&o(r,{content:S}),!p("FORM_ACCEPT_MARKDOWN")&&t(e,{children:[o(i,{children:h("Din kod för formuläret")}),o("p",{className:v.instructionParagraph,children:h("Instruktioner:")}),t("ol",{className:v.orderedList,children:[o("li",{children:h("Skriv ner eller kopiera den kod som visas nedan, du behöver den för att identifiera din session.")}),o("li",{children:h("Klicka på 'Starta' för att komma igång med chatten.")})]}),o(n,{size:500,children:h("Din kod är (skriv ner den):")}),o(n,{size:600,style:{userSelect:"all"},children:a(_||"")})]}),_&&o(g,{appearance:"primary",onClick:()=>C(`/chat?fid=${_}`),children:h("Starta")})]})})})};export{k as default};
@@ -1 +1 @@
1
- import{jsx as o,jsxs as e,Fragment as t}from"react/jsx-runtime";import{useState as n,useEffect as r}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as i}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as a}from"../components/Title.js";import"../components/Spinner.js";import{Label as s}from"../components/Label.js";import{Input as m}from"../components/Input.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import p from"../hooks/useStateWithLocalStorage.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as l}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{formatGuidToShorterReadableCode as c}from"../utils/helpers.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import d from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import u from"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as j}from"../components/Page.js";import{makeStyles as h}from"../node_modules/@griffel/react/makeStyles.esm.js";import{useId as k}from"../node_modules/@fluentui/react-utilities/lib/hooks/useId.js";import{Dropdown as g}from"../node_modules/@fluentui/react-combobox/lib/components/Dropdown/Dropdown.js";import{Option as f}from"../node_modules/@fluentui/react-combobox/lib/components/Option/Option.js";const v=h({inputAndButton:{display:"flex",gap:"10px"},input:{minWidth:"90%"},container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%"},generatedLinkTitle:{marginBottom:"0.5em",fontWeight:"bold"},orderedList:{marginLeft:"20px",marginBottom:"1em"},instructionParagraph:{marginBottom:"1em",fontWeight:"bold"}}),b=({state:h})=>{const b=v(),{service:w}=h,{t:x}=d(),[S,y]=p(h.context.selectedApp+"_forms",[]),[C,$]=n(),[_,L]=n(),[P,A]=n(!1),[I,T]=n(),B=k("form-dropdown");r((()=>{w.getForms().then((o=>{o.sort(((o,e)=>o.name.localeCompare(e.name))),y(o)}))}),[w,x,y]);const D=void 0!==navigator.share;return o(j,{children:o("div",{className:b.container,style:{backgroundImage:`url(${l("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:e(u,{children:[o(a,{children:x("Skapa länk till formulär")}),o("p",{className:b.instructionParagraph,children:x("Instruktioner")}),e("ol",{className:b.orderedList,children:[o("li",{children:x("Välj ett formulär från rullgardinsmenyn nedan. Detta formulär kommer att användas för den genererade länken.")}),o("li",{children:x("Klicka på 'Skapa länk' för att generera en unik länk. Länken visar var aktiv och kan användas för att svara på formuläret.")}),o("li",{children:x("När länken visas, kan du klicka på kopiera-ikonen för att kopiera länken till ditt urklipp.")}),o("li",{children:x("Om din enhet stödjer det, kan du även använda dela-knappen för att dela länken direkt.")}),o("li",{children:x("Kom ihåg att spara (skriva ner) koden")})]}),o("label",{id:B,className:b.instructionParagraph,children:x("Välj formulär")}),o(g,{"aria-labelledby":B,placeholder:"-",onOptionSelect:(o,e)=>T(e.optionValue),children:S.map((o=>e(f,{value:o.name,text:`${o.title} (${o.name})`,children:[`${o.title} (${o.name})`," "]},o.name)))}),o(i,{appearance:"primary",disabled:!I,onClick:()=>{const o=S.find((o=>o.name===I));o?.url?w.sendMessage(`#ss-link #${I}`).then((e=>{const t=new Date(Date.now()+2592e5);w.generateApiToken(t).then((t=>{const n=o.url.includes("?")?"&":"?",r=`${o.url}${n}token=${t}`;$(r);const i=c(e);L(i)}))})):w.sendMessage(`#ss-link #${I}`).then((o=>{const e=`${window.location.protocol}//${window.location.hostname}${window.location.port?":"+window.location.port:""}${window.location.pathname}`;$(`${e}#/formaccept?id=${o}`);const t=c(o);L(t)}))},children:x("Skapa länk")}),C&&e(t,{children:[o("p",{className:b.generatedLinkTitle,children:x("Här är din genererade länk (du kan kopiera eller dela den):")}),o("div",{className:b.inputAndButton,children:o(m,{className:b.input,value:C,readOnly:!0,onFocus:o=>o.target.select()})}),o("br",{}),e("div",{className:b.inputAndButton,children:[o(i,{appearance:"primary",title:x("Kopiera länk"),icon:"CopyRegular",onClick:()=>{C&&(navigator.clipboard.writeText(C),A(!0),setTimeout((()=>{A(!1),$(void 0)}),2e3))},children:x("Kopiera")}),D&&o(i,{appearance:"primary",title:x("Dela länk"),icon:"ShareRegular",onClick:()=>{C&&(navigator.share({url:C}),setTimeout((()=>{$(void 0)}),2e3))},children:x("Dela")})]}),P&&o(s,{children:x("Länk kopierad!")})]})]})})})};export{b as default};
1
+ import{jsx as o,jsxs as e,Fragment as t}from"react/jsx-runtime";import{useState as n,useEffect as r}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as i}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as a}from"../components/Title.js";import"../components/Spinner.js";import{Label as s}from"../components/Label.js";import{Input as m}from"../components/Input.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import p from"../hooks/useStateWithLocalStorage.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as l}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{formatGuidToShorterReadableCode as c}from"../utils/helpers.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import d from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import u from"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as j}from"../components/Page.js";import{makeStyles as h}from"../node_modules/@griffel/react/makeStyles.esm.js";import{useId as k}from"../node_modules/@fluentui/react-utilities/lib/hooks/useId.js";import{Dropdown as g}from"../node_modules/@fluentui/react-combobox/lib/components/Dropdown/Dropdown.js";import{Option as f}from"../node_modules/@fluentui/react-combobox/lib/components/Option/Option.js";const v=h({inputAndButton:{display:"flex",gap:"10px"},input:{minWidth:"90%"},container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%"},generatedLinkTitle:{marginBottom:"0.5em",fontWeight:"bold"},orderedList:{marginLeft:"20px",marginBottom:"1em"},instructionParagraph:{marginBottom:"1em",fontWeight:"bold"}}),b=({state:h})=>{const b=v(),{service:w}=h,{t:x}=d(),[S,y]=p(h.context.selectedApp+"_forms",[]),[C,$]=n(),[_,L]=n(),[P,A]=n(!1),[I,T]=n(),B=k("form-dropdown");r((()=>{w.getForms().then((o=>{o.sort(((o,e)=>o.name.localeCompare(e.name))),y(o)}))}),[w,x,y]);const D=void 0!==navigator.share;return o(j,{children:o("div",{className:b.container,style:{backgroundImage:`url(${l("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:e(u,{children:[o(a,{children:x("Skapa länk till formulär")}),o("p",{className:b.instructionParagraph,children:x("Instruktioner")}),e("ol",{className:b.orderedList,children:[o("li",{children:x("Välj ett formulär från rullgardinsmenyn nedan. Detta formulär kommer att användas för den genererade länken.")}),o("li",{children:x("Klicka på 'Skapa länk' för att generera en unik länk. Länken visar var aktiv och kan användas för att svara på formuläret.")}),o("li",{children:x("När länken visas, kan du klicka på kopiera-ikonen för att kopiera länken till ditt urklipp.")}),o("li",{children:x("Om din enhet stödjer det, kan du även använda dela-knappen för att dela länken direkt.")}),o("li",{children:x("Kom ihåg att spara (skriva ner) koden")})]}),o("label",{id:B,className:b.instructionParagraph,children:x("Välj formulär")}),o(g,{"aria-labelledby":B,placeholder:"-",onOptionSelect:(o,e)=>T(e.optionValue),children:S.map((o=>e(f,{value:o.name,text:`${o.title} (${o.name})`,children:[`${o.title} (${o.name})`," "]},o.name)))}),o(i,{appearance:"primary",disabled:!I,onClick:()=>{const o=S.find((o=>o.name===I));o?.url?w.sendMessage(`#ss-link #${I}`).then((e=>{const t=new Date(Date.now()+2592e5);w.generateApiToken(t).then((t=>{const n=o.url.includes("?")?"&":"?",r=`${o.url}${n}token=${t}`;$(r);const i=c(e);L(i)}))})):w.sendMessage(`#ss-link #${I}`).then((o=>{const e=`${window.location.protocol}//${window.location.hostname}${window.location.port?":"+window.location.port:""}${window.location.pathname}`;$(`${e}#/formaccept?id=${o}`);const t=c(o);L(t)}))},children:x("Skapa länk")}),C&&e(t,{children:[o("p",{className:b.generatedLinkTitle,children:x("Här är din genererade länk (du kan kopiera eller dela den):")}),o("div",{className:b.inputAndButton,children:o(m,{className:b.input,value:C,readOnly:!0,onFocus:o=>o.target.select()})}),o("br",{}),e("div",{className:b.inputAndButton,children:[o(i,{appearance:"primary",title:x("Kopiera länk"),icon:"CopyRegular",onClick:()=>{C&&(navigator.clipboard.writeText(C),A(!0),setTimeout((()=>{A(!1),$(void 0)}),2e3))},children:x("Kopiera")}),D&&o(i,{appearance:"primary",title:x("Dela länk"),icon:"ShareRegular",onClick:()=>{C&&(navigator.share({url:C}),setTimeout((()=>{$(void 0)}),2e3))},children:x("Dela")})]}),P&&o(s,{children:x("Länk kopierad!")})]})]})})})};export{b as default};
@@ -1 +1 @@
1
- import{jsx as o,jsxs as t}from"react/jsx-runtime";import{useState as e,useEffect as s}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{Text as i}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import n from"../components/HtmlView.js";import"../components/Footer.js";import{Page as r}from"../components/Page.js";import{Spinner as m}from"../node_modules/@fluentui/react-spinner/lib/components/Spinner/Spinner.js";const p=({state:p})=>{const c=window.location.hash.match(/^#\/html\/(.+)$/),a=c?decodeURIComponent(c[1]):"",[l,d]=e(),[h,j]=e(!1),[u,f]=e(),{service:g}=p;return s((()=>{a&&g?(j(!0),f(void 0),g.getMessagesFast([a],void 0,1).then((o=>{if(0===o.length)return void f(`No messages found with tag: ${a}`);const t=o[0].content;d((o=>{const t=o.indexOf("```html");if(-1!==t){const e=o.indexOf("```",t+7);return-1===e?o.substring(t+7):o.substring(t+7,e)}const e=[/<!DOCTYPE[^>]*>[\s\S]*?<\/html>/i,/<html[^>]*>[\s\S]*?<\/html>/i,/<div[^>]*>[\s\S]*?<\/div>/i,/<body[^>]*>[\s\S]*?<\/body>/i,/<article[^>]*>[\s\S]*?<\/article>/i,/<section[^>]*>[\s\S]*?<\/section>/i];for(const t of e){const e=o.match(t);if(e)return e[0]}if(o.includes("<html")||o.includes("<!DOCTYPE")||o.includes("<div")||o.includes("<p>")||o.includes("<span")){const t=["<!DOCTYPE","<html","<div","<body","<article","<section"];let e=-1;for(const s of t){const t=o.indexOf(s);-1!==t&&(-1===e||t<e)&&(e=t)}if(-1!==e){let t=o.substring(e);const s=["</html>","</body>","</div>"];for(const o of s){const e=t.lastIndexOf(o);if(-1!==e){t=t.substring(0,e+o.length);break}}return t}return o}return o})(t))})).catch((o=>{console.error("Error fetching message:",o),f(`Error fetching message: ${o.message||"Unknown error"}`)})).finally((()=>{j(!1)}))):f("No tag provided or service unavailable")}),[a,g]),h?o(r,{hideHeader:!0,hideFooter:!0,children:o("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:o(m,{})})}):u?o(r,{hideHeader:!0,hideFooter:!0,children:t("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh",flexDirection:"column",gap:"20px"},children:[o(i,{children:u}),t(i,{children:["Tag: ",a]})]})}):l?o(n,{html:l,onDismiss:()=>window.history.back()}):o(r,{hideHeader:!0,hideFooter:!0,children:o("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:o(i,{children:"No HTML content available"})})})};export{p as default};
1
+ import{jsx as o,jsxs as t}from"react/jsx-runtime";import{useState as e,useEffect as s}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{Text as i}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import n from"../components/HtmlView.js";import"../components/Footer.js";import{Page as r}from"../components/Page.js";import{Spinner as m}from"../node_modules/@fluentui/react-spinner/lib/components/Spinner/Spinner.js";const p=({state:p})=>{const c=window.location.hash.match(/^#\/html\/(.+)$/),a=c?decodeURIComponent(c[1]):"",[l,d]=e(),[h,j]=e(!1),[u,g]=e(),{service:f}=p;return s((()=>{a&&f?(j(!0),g(void 0),f.getMessagesFast([a],void 0,1).then((o=>{if(0===o.length)return void g(`No messages found with tag: ${a}`);const t=o[0].content;d((o=>{const t=o.indexOf("```html");if(-1!==t){const e=o.indexOf("```",t+7);return-1===e?o.substring(t+7):o.substring(t+7,e)}const e=[/<!DOCTYPE[^>]*>[\s\S]*?<\/html>/i,/<html[^>]*>[\s\S]*?<\/html>/i,/<div[^>]*>[\s\S]*?<\/div>/i,/<body[^>]*>[\s\S]*?<\/body>/i,/<article[^>]*>[\s\S]*?<\/article>/i,/<section[^>]*>[\s\S]*?<\/section>/i];for(const t of e){const e=o.match(t);if(e)return e[0]}if(o.includes("<html")||o.includes("<!DOCTYPE")||o.includes("<div")||o.includes("<p>")||o.includes("<span")){const t=["<!DOCTYPE","<html","<div","<body","<article","<section"];let e=-1;for(const s of t){const t=o.indexOf(s);-1!==t&&(-1===e||t<e)&&(e=t)}if(-1!==e){let t=o.substring(e);const s=["</html>","</body>","</div>"];for(const o of s){const e=t.lastIndexOf(o);if(-1!==e){t=t.substring(0,e+o.length);break}}return t}return o}return o})(t))})).catch((o=>{console.error("Error fetching message:",o),g(`Error fetching message: ${o.message||"Unknown error"}`)})).finally((()=>{j(!1)}))):g("No tag provided or service unavailable")}),[a,f]),h?o(r,{hideHeader:!0,hideFooter:!0,children:o("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:o(m,{})})}):u?o(r,{hideHeader:!0,hideFooter:!0,children:t("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh",flexDirection:"column",gap:"20px"},children:[o(i,{children:u}),t(i,{children:["Tag: ",a]})]})}):l?o(n,{html:l,onDismiss:()=>window.history.back()}):o(r,{hideHeader:!0,hideFooter:!0,children:o("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:o(i,{children:"No HTML content available"})})})};export{p as default};
@@ -1 +1 @@
1
- import{jsxs as e,jsx as t,Fragment as o}from"react/jsx-runtime";import{useState as n,useEffect as r}from"react";import{useSearchParams as i,useNavigate as s}from"react-router-dom";import a from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{CodicentService as l}from"../services/codicent.js";import{makeStyles as c}from"../node_modules/@griffel/react/makeStyles.esm.js";import{Button as d}from"../node_modules/@fluentui/react-button/lib/components/Button/Button.js";import{Dismiss24Regular as m}from"../node_modules/@fluentui/react-icons/lib/sizedIcons/chunk-5.js";import{Image as u}from"../node_modules/@fluentui/react-image/lib/components/Image/Image.js";const p=c({image:{zIndex:900,transition:"transform 0.1s ease-out",cursor:"grab","&:active":{cursor:"grabbing"}},transparent:{color:"transparent",backgroundColor:"transparent"},next:{cursor:"pointer",position:"absolute",top:"50%",width:"auto",marginTop:"-22px",padding:"16px",color:"white",fontWeight:"bold",fontSize:"18px",transition:"0.6s ease",userSelect:"none",right:0,borderRadius:"3px 0 0 3px",zIndex:1e3,backgroundColor:"#A0A0A080","&:hover":{backgroundColor:"#A0A0A0"}},prev:{cursor:"pointer",position:"absolute",top:"50%",width:"auto",marginTop:"-22px",padding:"16px",color:"white",fontWeight:"bold",fontSize:"18px",transition:"0.6s ease",borderRadius:"0 3px 3px 0",userSelect:"none",left:0,zIndex:1e3,backgroundColor:"#A0A0A080","&:hover":{backgroundColor:"#A0A0A0"}},content:{position:"fixed",top:0,left:0,bottom:0,right:0,display:"flex",justifyContent:"center",alignItems:"center"},closeButton:{position:"absolute",top:"10px",right:"10px",zIndex:1001,backgroundColor:"rgba(0, 0, 0, 0.5)",color:"white","&:hover":{backgroundColor:"rgba(0, 0, 0, 0.7)"}}}),g=({state:c})=>{const g=p(),[v]=i(),h=s(),[w,f]=n([]),[x,b]=n(0),[y,E]=n(),[k,L]=n(null),[j,C]=n(null),{service:A}=c,[I,_]=n(1),[z,S]=n({x:0,y:0}),[N,B]=n(!1),[M,X]=n({x:0,y:0});r((()=>{const e=e=>{"Escape"===e.key&&h(-1)},t=e=>{L(e.touches[0].clientX)},o=e=>{C(e.touches[0].clientX)},n=()=>{if(null!==k&&null!==j){const e=k-j;e>50?$(1):e<-50&&$(-1)}L(null),C(null)};return window.addEventListener("keydown",e),window.addEventListener("touchstart",t),window.addEventListener("touchmove",o),window.addEventListener("touchend",n),()=>{window.removeEventListener("keydown",e),window.removeEventListener("touchstart",t),window.removeEventListener("touchmove",o),window.removeEventListener("touchend",n)}}),[h,k,j]),r((()=>{E(l.getFileUrl(w[x]))}),[w,x]),r((()=>{const e=v.get("id"),t=v.get("file");e&&t&&A.getMessageContent(e).then((e=>{const o=a.findFileIds(e.content);Promise.all(o.map((e=>A.getFileInfo(e)))).then((e=>{f(e.filter((e=>e.contentType.startsWith("image"))).map((e=>e.id)));const o=w.indexOf(t);o>=0&&b(o)}))})).catch((()=>{}))}),[v,A]),r((()=>{_(1),S({x:0,y:0})}),[x]),r((()=>{const e=e=>{e.preventDefault();const t=-.01*e.deltaY;_((e=>Math.min(Math.max(1,e+t),5)))},t=e=>{const t=e;I>1&&(B(!0),X({x:t.clientX-z.x,y:t.clientY-z.y}))},o=e=>{const t=e;N&&S({x:t.clientX-M.x,y:t.clientY-M.y})},n=()=>{B(!1)},r=document.querySelector(`.${g.image}`);return r&&(r.addEventListener("wheel",e),r.addEventListener("mousedown",t),window.addEventListener("mousemove",o),window.addEventListener("mouseup",n)),()=>{r&&(r.removeEventListener("wheel",e),r.removeEventListener("mousedown",t),window.removeEventListener("mousemove",o),window.removeEventListener("mouseup",n))}}),[I,z,N,M,g.image]);const $=e=>{if(x+e<0||x+e>=w.length)return;const t=(x+e+w.length)%w.length;b(t)};return e("div",{className:g.content,children:[t(d,{icon:t(m,{}),className:g.closeButton,onClick:()=>h(-1)}),t(u,{className:g.image,src:y,alt:"Codicent Image",fit:"contain",width:"100%",height:"100%",style:{transform:`translate(${z.x}px, ${z.y}px) scale(${I})`,touchAction:"none"}}),w.length>1&&e(o,{children:[0!==x&&t("a",{className:g.prev,onClick:()=>$(-1),children:"❮"}),x<w.length-1&&t("a",{className:g.next,onClick:()=>$(1),children:"❯"})]})]})};export{g as default};
1
+ import{jsxs as e,jsx as t,Fragment as o}from"react/jsx-runtime";import{useState as n,useEffect as r}from"react";import{useSearchParams as i,useNavigate as s}from"react-router-dom";import a from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{CodicentService as l}from"../services/codicent.js";import{makeStyles as c}from"../node_modules/@griffel/react/makeStyles.esm.js";import{Button as d}from"../node_modules/@fluentui/react-button/lib/components/Button/Button.js";import{Dismiss24Regular as m}from"../node_modules/@fluentui/react-icons/lib/sizedIcons/chunk-5.js";import{Image as u}from"../node_modules/@fluentui/react-image/lib/components/Image/Image.js";const p=c({image:{zIndex:900,transition:"transform 0.1s ease-out",cursor:"grab","&:active":{cursor:"grabbing"}},transparent:{color:"transparent",backgroundColor:"transparent"},next:{cursor:"pointer",position:"absolute",top:"50%",width:"auto",marginTop:"-22px",padding:"16px",color:"white",fontWeight:"bold",fontSize:"18px",transition:"0.6s ease",userSelect:"none",right:0,borderRadius:"3px 0 0 3px",zIndex:1e3,backgroundColor:"#A0A0A080","&:hover":{backgroundColor:"#A0A0A0"}},prev:{cursor:"pointer",position:"absolute",top:"50%",width:"auto",marginTop:"-22px",padding:"16px",color:"white",fontWeight:"bold",fontSize:"18px",transition:"0.6s ease",borderRadius:"0 3px 3px 0",userSelect:"none",left:0,zIndex:1e3,backgroundColor:"#A0A0A080","&:hover":{backgroundColor:"#A0A0A0"}},content:{position:"fixed",top:0,left:0,bottom:0,right:0,display:"flex",justifyContent:"center",alignItems:"center"},closeButton:{position:"absolute",top:"10px",right:"10px",zIndex:1001,backgroundColor:"rgba(0, 0, 0, 0.5)",color:"white","&:hover":{backgroundColor:"rgba(0, 0, 0, 0.7)"}}}),g=({state:c})=>{const g=p(),[v]=i(),h=s(),[w,f]=n([]),[x,b]=n(0),[y,E]=n(),[j,k]=n(null),[L,C]=n(null),{service:A}=c,[I,_]=n(1),[z,S]=n({x:0,y:0}),[M,N]=n(!1),[B,X]=n({x:0,y:0});r((()=>{const e=e=>{"Escape"===e.key&&h(-1)},t=e=>{k(e.touches[0].clientX)},o=e=>{C(e.touches[0].clientX)},n=()=>{if(null!==j&&null!==L){const e=j-L;e>50?$(1):e<-50&&$(-1)}k(null),C(null)};return window.addEventListener("keydown",e),window.addEventListener("touchstart",t),window.addEventListener("touchmove",o),window.addEventListener("touchend",n),()=>{window.removeEventListener("keydown",e),window.removeEventListener("touchstart",t),window.removeEventListener("touchmove",o),window.removeEventListener("touchend",n)}}),[h,j,L]),r((()=>{E(l.getFileUrl(w[x]))}),[w,x]),r((()=>{const e=v.get("id"),t=v.get("file");e&&t&&A.getMessageContent(e).then((e=>{const o=a.findFileIds(e.content);Promise.all(o.map((e=>A.getFileInfo(e)))).then((e=>{f(e.filter((e=>e.contentType.startsWith("image"))).map((e=>e.id)));const o=w.indexOf(t);o>=0&&b(o)}))})).catch((()=>{}))}),[v,A]),r((()=>{_(1),S({x:0,y:0})}),[x]),r((()=>{const e=e=>{e.preventDefault();const t=-.01*e.deltaY;_((e=>Math.min(Math.max(1,e+t),5)))},t=e=>{const t=e;I>1&&(N(!0),X({x:t.clientX-z.x,y:t.clientY-z.y}))},o=e=>{const t=e;M&&S({x:t.clientX-B.x,y:t.clientY-B.y})},n=()=>{N(!1)},r=document.querySelector(`.${g.image}`);return r&&(r.addEventListener("wheel",e),r.addEventListener("mousedown",t),window.addEventListener("mousemove",o),window.addEventListener("mouseup",n)),()=>{r&&(r.removeEventListener("wheel",e),r.removeEventListener("mousedown",t),window.removeEventListener("mousemove",o),window.removeEventListener("mouseup",n))}}),[I,z,M,B,g.image]);const $=e=>{if(x+e<0||x+e>=w.length)return;const t=(x+e+w.length)%w.length;b(t)};return e("div",{className:g.content,children:[t(d,{icon:t(m,{}),className:g.closeButton,onClick:()=>h(-1)}),t(u,{className:g.image,src:y,alt:"Codicent Image",fit:"contain",width:"100%",height:"100%",style:{transform:`translate(${z.x}px, ${z.y}px) scale(${I})`,touchAction:"none"}}),w.length>1&&e(o,{children:[0!==x&&t("a",{className:g.prev,onClick:()=>$(-1),children:"❮"}),x<w.length-1&&t("a",{className:g.next,onClick:()=>$(1),children:"❯"})]})]})};export{g as default};
@@ -1 +1 @@
1
- import{jsxs as o,jsx as e,Fragment as t}from"react/jsx-runtime";import i,{useState as n}from"react";import"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as r}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as s}from"../components/Title.js";import{Text as m}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as a}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import p from"../hooks/useLocalization.js";import l from"../hooks/useAppStyles.js";import{makeStyles as c}from"../node_modules/@griffel/react/makeStyles.esm.js";import{Image as d}from"../node_modules/@fluentui/react-image/lib/components/Image/Image.js";import{Input as g}from"../node_modules/@fluentui/react-input/lib/components/Input/Input.js";import{mergeClasses as j}from"../node_modules/@griffel/core/mergeClasses.esm.js";const u=c({container:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100vh",backgroundPosition:"calc(50% - 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",gap:"20px",padding:"0 20px"},button:{minWidth:"15rem"},input:{minWidth:"15rem",marginBottom:"10px"},image:{maxHeight:"200px"}}),h=({state:c})=>{const{loginWithRedirect:h,loginPasswordless:_}=c.auth,I=u(),f=l(),{t:b}=p(),[E,k]=n(""),[C,L]=n(!1),y=a("LOGIN_REDIRECT"),N=a("AUTH0_PASSWORDLESS_ENABLED");i.useEffect((()=>{y&&h()}),[y]);return o("div",y?{className:I.container,style:{backgroundImage:`url(${a("HOME_BACKGROUND_IMAGE_URL")})`},children:[e(s,{children:`${b("Välkommen till")} ${a("INDEX_TITLE")}!`}),e(m,{size:400,children:b("Omdirigerar till inloggning...")})]}:{className:I.container,style:{backgroundImage:`url(${a("HOME_BACKGROUND_IMAGE_URL")})`},children:[a("LOGIN_LOGO_URL")&&e(d,{src:a("LOGIN_LOGO_URL"),alt:a("INDEX_TITLE"),className:I.image}),!a("LOGIN_HIDE_WELCOME")&&e(s,{children:`${b("Välkommen till")} ${a("INDEX_TITLE")}!`}),e(m,{size:400,children:b(a("LOGIN_WELCOME_TEXT")||"Logga in, eller registrera ett konto, för att komma igång.")}),o(t,N?{children:[e(g,{className:I.input,type:"email",placeholder:b("Ange din e-postadress"),value:E,onChange:o=>k(o.target.value),disabled:C}),e(r,{className:j(f.button,I.button),size:"large",appearance:"primary",onClick:async()=>{if(E.trim()){L(!0);try{await _(E)}catch(o){console.error("Passwordless login failed:",o)}finally{L(!1)}}},disabled:!E.trim()||C,children:b(C?"Skickar...":"Skicka inloggningslänk")})]}:{children:[e(r,{className:j(f.button,I.button),size:"large",appearance:"primary",onClick:()=>h(),children:b("Logga in")}),!a("HIDE_REGISTER_BUTTON")&&e(r,{className:j(f.button,I.button),size:"large",appearance:"primary",onClick:()=>h({authorizationParams:{screen_hint:"signup"}}),children:b("Registrera")})]})]})};export{h as default};
1
+ import{jsxs as o,jsx as e,Fragment as t}from"react/jsx-runtime";import i,{useState as r}from"react";import"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as n}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as s}from"../components/Title.js";import{Text as m}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as a}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import p from"../hooks/useLocalization.js";import l from"../hooks/useAppStyles.js";import{makeStyles as c}from"../node_modules/@griffel/react/makeStyles.esm.js";import{Image as g}from"../node_modules/@fluentui/react-image/lib/components/Image/Image.js";import{Input as d}from"../node_modules/@fluentui/react-input/lib/components/Input/Input.js";import{mergeClasses as j}from"../node_modules/@griffel/core/mergeClasses.esm.js";const u=c({container:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100vh",backgroundPosition:"calc(50% - 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",gap:"20px",padding:"0 20px"},button:{minWidth:"15rem"},input:{minWidth:"15rem",marginBottom:"10px"},image:{maxHeight:"200px"}}),h=({state:c})=>{const{loginWithRedirect:h,loginPasswordless:_}=c.auth,I=u(),f=l(),{t:b}=p(),[E,k]=r(""),[C,L]=r(!1),y=a("LOGIN_REDIRECT"),N=a("AUTH0_PASSWORDLESS_ENABLED");i.useEffect((()=>{y&&h()}),[y]);return o("div",y?{className:I.container,style:{backgroundImage:`url(${a("HOME_BACKGROUND_IMAGE_URL")})`},children:[e(s,{children:`${b("Välkommen till")} ${a("INDEX_TITLE")}!`}),e(m,{size:400,children:b("Omdirigerar till inloggning...")})]}:{className:I.container,style:{backgroundImage:`url(${a("HOME_BACKGROUND_IMAGE_URL")})`},children:[a("LOGIN_LOGO_URL")&&e(g,{src:a("LOGIN_LOGO_URL"),alt:a("INDEX_TITLE"),className:I.image}),!a("LOGIN_HIDE_WELCOME")&&e(s,{children:`${b("Välkommen till")} ${a("INDEX_TITLE")}!`}),e(m,{size:400,children:b(a("LOGIN_WELCOME_TEXT")||"Logga in, eller registrera ett konto, för att komma igång.")}),o(t,N?{children:[e(d,{className:I.input,type:"email",placeholder:b("Ange din e-postadress"),value:E,onChange:o=>k(o.target.value),disabled:C}),e(n,{className:j(f.button,I.button),size:"large",appearance:"primary",onClick:async()=>{if(E.trim()){L(!0);try{await _(E)}catch(o){console.error("Passwordless login failed:",o)}finally{L(!1)}}},disabled:!E.trim()||C,children:b(C?"Skickar...":"Skicka inloggningslänk")})]}:{children:[e(n,{className:j(f.button,I.button),size:"large",appearance:"primary",onClick:()=>h(),children:b("Logga in")}),!a("HIDE_REGISTER_BUTTON")&&e(n,{className:j(f.button,I.button),size:"large",appearance:"primary",onClick:()=>h({authorizationParams:{screen_hint:"signup"}}),children:b("Registrera")})]})]})};export{h as default};
@@ -1 +1 @@
1
- import{jsxs as o,jsx as t}from"react/jsx-runtime";import{useState as e,useEffect as r}from"react";import{Link as i}from"react-router-dom";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as n}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as s}from"../components/Title.js";import{Text as m}from"../components/Text.js";import{Spinner as a}from"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as p}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"../stores/chatStore.js";import"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import{makeStyles as c}from"../node_modules/@griffel/react/makeStyles.esm.js";import{tokens as l}from"../node_modules/@fluentui/tokens/lib/tokens.js";const d=c({container:{display:"flex",flexDirection:"column",alignItems:"center",gap:"20px",padding:"20px"},pricing:{padding:"20px",paddingLeft:"30px",border:"1px solid #ccc",borderRadius:"8px",backgroundColor:l.colorNeutralBackground1}}),j=({state:c})=>{const l=d(),[j,g]=e(!1),{service:u,stateMachine:h}=c,{updateContext:f}=h;r((()=>{new URLSearchParams(window.location.search).get("session_id")&&f({hasValidPurchase:void 0})}),[]);return o("div",{className:l.container,children:[t(s,{children:"Starta ditt abonnemang"}),t("div",{className:l.pricing,children:o("ul",{children:[t("li",{children:t(m,{size:400,children:"Kreditkort krävs inte"})}),t("li",{children:t(m,{size:400,children:"Gratis de 2 första månaderna"})}),t("li",{children:t(m,{size:400,children:"Därefter 89 kr/månad"})})]})}),t(n,{appearance:"primary",onClick:async()=>{try{g(!0),await u.redirectToCheckout(p("STRIPE_PRICE_ID"))}catch(o){console.error("Purchase error:",o)}finally{g(!1)}},disabled:j,children:j?t(a,{size:"tiny"}):"Starta abonnemang"}),t("div",{children:o(m,{size:400,children:["Har du redan ett abonnemang? Kanske har du loggat in med fel konto. ",t(i,{to:"/logout",children:"Logga ut"})," och sedan in igen för att komma igång."]})})]})};export{j as Purchase,j as default};
1
+ import{jsxs as o,jsx as t}from"react/jsx-runtime";import{useState as e,useEffect as r}from"react";import{Link as i}from"react-router-dom";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as n}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as s}from"../components/Title.js";import{Text as m}from"../components/Text.js";import{Spinner as a}from"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as p}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"../stores/chatStore.js";import"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import{makeStyles as c}from"../node_modules/@griffel/react/makeStyles.esm.js";import{tokens as l}from"../node_modules/@fluentui/tokens/lib/tokens.js";const d=c({container:{display:"flex",flexDirection:"column",alignItems:"center",gap:"20px",padding:"20px"},pricing:{padding:"20px",paddingLeft:"30px",border:"1px solid #ccc",borderRadius:"8px",backgroundColor:l.colorNeutralBackground1}}),j=({state:c})=>{const l=d(),[j,g]=e(!1),{service:u,stateMachine:h}=c,{updateContext:f}=h;r((()=>{new URLSearchParams(window.location.search).get("session_id")&&f({hasValidPurchase:void 0})}),[]);return o("div",{className:l.container,children:[t(s,{children:"Starta ditt abonnemang"}),t("div",{className:l.pricing,children:o("ul",{children:[t("li",{children:t(m,{size:400,children:"Kreditkort krävs inte"})}),t("li",{children:t(m,{size:400,children:"Gratis de 2 första månaderna"})}),t("li",{children:t(m,{size:400,children:"Därefter 89 kr/månad"})})]})}),t(n,{appearance:"primary",onClick:async()=>{try{g(!0),await u.redirectToCheckout(p("STRIPE_PRICE_ID"))}catch(o){console.error("Purchase error:",o)}finally{g(!1)}},disabled:j,children:j?t(a,{size:"tiny"}):"Starta abonnemang"}),t("div",{children:o(m,{size:400,children:["Har du redan ett abonnemang? Kanske har du loggat in med fel konto. ",t(i,{to:"/logout",children:"Logga ut"})," och sedan in igen för att komma igång."]})})]})};export{j as Purchase,j as default};