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.
- package/README.md +7 -0
- package/dist/cjs/components/AiInput.js +1 -1
- package/dist/cjs/components/AudioIcon.js +1 -1
- package/dist/cjs/components/ChatInput.js +1 -1
- package/dist/cjs/components/ChatMessage.js +1 -1
- package/dist/cjs/components/CombinedPlaceholderDialog.js +1 -1
- package/dist/cjs/components/Footer.js +1 -1
- package/dist/cjs/components/Header.d.ts.map +1 -1
- package/dist/cjs/components/Header.js +1 -1
- package/dist/cjs/components/HtmlView.js +1 -1
- package/dist/cjs/components/MessageInput.js +1 -1
- package/dist/cjs/components/MessageItem.js +1 -1
- package/dist/cjs/components/Profile.js +1 -1
- package/dist/cjs/components/Prompt.js +1 -1
- package/dist/cjs/components/SnapFooter.js +1 -1
- package/dist/cjs/components/TextHeader.js +1 -1
- package/dist/cjs/components/TypingIndicator.js +1 -1
- package/dist/cjs/components/UploadFile.js +1 -1
- package/dist/cjs/components/UrlProcessor.js +1 -1
- package/dist/cjs/components/VoiceIcon.js +1 -1
- package/dist/cjs/config/index.d.ts +8 -0
- package/dist/cjs/config/index.d.ts.map +1 -1
- package/dist/cjs/config/index.js +1 -1
- package/dist/cjs/hooks/useAuthState.js +1 -1
- package/dist/cjs/hooks/useChat.js +1 -1
- package/dist/cjs/hooks/useCodicentApp.js +1 -1
- package/dist/cjs/hooks/useCodicentState.js +1 -1
- package/dist/cjs/hooks/useRealtimeVoiceAI.d.ts.map +1 -1
- package/dist/cjs/hooks/useRealtimeVoiceAI.js +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/pages/AppFrame.js +1 -1
- package/dist/cjs/pages/Chat.js +1 -1
- package/dist/cjs/pages/Compose.js +1 -1
- package/dist/cjs/pages/CrmPage.js +1 -1
- package/dist/cjs/pages/CrmPagePersistent.js +1 -1
- package/dist/cjs/pages/FormAccept.js +1 -1
- package/dist/cjs/pages/FormInvite.js +1 -1
- package/dist/cjs/pages/HtmlViewer.js +1 -1
- package/dist/cjs/pages/ImageView.js +1 -1
- package/dist/cjs/pages/Login.js +1 -1
- package/dist/cjs/pages/Purchase.js +1 -1
- package/dist/cjs/pages/Sales.js +1 -1
- package/dist/cjs/pages/Search.js +1 -1
- package/dist/cjs/pages/Snap.js +1 -1
- package/dist/cjs/services/codicent.js +1 -1
- package/dist/cjs/utils/appState.d.ts +45 -0
- package/dist/cjs/utils/appState.d.ts.map +1 -1
- package/dist/cjs/utils/appState.js +1 -1
- package/dist/cjs/utils/cacheManager.d.ts +85 -0
- package/dist/cjs/utils/cacheManager.d.ts.map +1 -0
- package/dist/cjs/utils/cacheManager.js +1 -0
- package/dist/cjs/utils/index.d.ts +2 -0
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/esm/components/AiInput.js +1 -1
- package/dist/esm/components/AudioIcon.js +1 -1
- package/dist/esm/components/ChatInput.js +1 -1
- package/dist/esm/components/ChatMessage.js +1 -1
- package/dist/esm/components/CombinedPlaceholderDialog.js +1 -1
- package/dist/esm/components/Footer.js +1 -1
- package/dist/esm/components/Header.d.ts.map +1 -1
- package/dist/esm/components/Header.js +1 -1
- package/dist/esm/components/HtmlView.js +1 -1
- package/dist/esm/components/MessageInput.js +1 -1
- package/dist/esm/components/MessageItem.js +1 -1
- package/dist/esm/components/Profile.js +1 -1
- package/dist/esm/components/Prompt.js +1 -1
- package/dist/esm/components/SnapFooter.js +1 -1
- package/dist/esm/components/TextHeader.js +1 -1
- package/dist/esm/components/TypingIndicator.js +1 -1
- package/dist/esm/components/UploadFile.js +1 -1
- package/dist/esm/components/UrlProcessor.js +1 -1
- package/dist/esm/components/VoiceIcon.js +1 -1
- package/dist/esm/config/index.d.ts +8 -0
- package/dist/esm/config/index.d.ts.map +1 -1
- package/dist/esm/config/index.js +1 -1
- package/dist/esm/hooks/useAuthState.js +1 -1
- package/dist/esm/hooks/useChat.js +1 -1
- package/dist/esm/hooks/useCodicentApp.js +1 -1
- package/dist/esm/hooks/useCodicentState.js +1 -1
- package/dist/esm/hooks/useRealtimeVoiceAI.d.ts.map +1 -1
- package/dist/esm/hooks/useRealtimeVoiceAI.js +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/pages/AppFrame.js +1 -1
- package/dist/esm/pages/Chat.js +1 -1
- package/dist/esm/pages/Compose.js +1 -1
- package/dist/esm/pages/CrmPage.js +1 -1
- package/dist/esm/pages/CrmPagePersistent.js +1 -1
- package/dist/esm/pages/FormAccept.js +1 -1
- package/dist/esm/pages/FormInvite.js +1 -1
- package/dist/esm/pages/HtmlViewer.js +1 -1
- package/dist/esm/pages/ImageView.js +1 -1
- package/dist/esm/pages/Login.js +1 -1
- package/dist/esm/pages/Purchase.js +1 -1
- package/dist/esm/pages/Sales.js +1 -1
- package/dist/esm/pages/Search.js +1 -1
- package/dist/esm/pages/Snap.js +1 -1
- package/dist/esm/services/codicent.js +1 -1
- package/dist/esm/utils/appState.d.ts +45 -0
- package/dist/esm/utils/appState.d.ts.map +1 -1
- package/dist/esm/utils/appState.js +1 -1
- package/dist/esm/utils/cacheManager.d.ts +85 -0
- package/dist/esm/utils/cacheManager.d.ts.map +1 -0
- package/dist/esm/utils/cacheManager.js +1 -0
- package/dist/esm/utils/index.d.ts +2 -0
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/index.d.ts +139 -1
- 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),
|
|
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),
|
|
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,
|
|
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
|
|
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};
|
package/dist/esm/pages/Chat.js
CHANGED
|
@@ -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
|
|
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
|
|
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),
|
|
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,
|
|
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,
|
|
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
|
|
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};
|
package/dist/esm/pages/Login.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsxs as o,jsx as e,Fragment as t}from"react/jsx-runtime";import i,{useState as
|
|
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};
|