codicent-app-sdk 0.4.15 → 0.4.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/README.md +410 -375
  2. package/dist/cjs/components/AiInput.js +1 -1
  3. package/dist/cjs/components/AudioIcon.js +1 -1
  4. package/dist/cjs/components/ChatInput.js +1 -1
  5. package/dist/cjs/components/ChatMessage.js +1 -1
  6. package/dist/cjs/components/CombinedPlaceholderDialog.js +1 -1
  7. package/dist/cjs/components/DataMessagePicker.d.ts +33 -0
  8. package/dist/cjs/components/DataMessagePicker.d.ts.map +1 -0
  9. package/dist/cjs/components/DataMessagePicker.js +1 -0
  10. package/dist/cjs/components/Footer.js +1 -1
  11. package/dist/cjs/components/Header.js +1 -1
  12. package/dist/cjs/components/HtmlView.js +1 -1
  13. package/dist/cjs/components/MermaidChart.d.ts.map +1 -1
  14. package/dist/cjs/components/MermaidChart.js +1 -1
  15. package/dist/cjs/components/MessageInput.js +1 -1
  16. package/dist/cjs/components/MessageItem.js +1 -1
  17. package/dist/cjs/components/Profile.js +1 -1
  18. package/dist/cjs/components/Prompt.js +1 -1
  19. package/dist/cjs/components/SnapFooter.js +1 -1
  20. package/dist/cjs/components/TextHeader.js +1 -1
  21. package/dist/cjs/components/TypingIndicator.js +1 -1
  22. package/dist/cjs/components/UploadFile.js +1 -1
  23. package/dist/cjs/components/UrlProcessor.js +1 -1
  24. package/dist/cjs/components/VoiceIcon.js +1 -1
  25. package/dist/cjs/components/index.d.ts +2 -0
  26. package/dist/cjs/components/index.d.ts.map +1 -1
  27. package/dist/cjs/config/index.d.ts.map +1 -1
  28. package/dist/cjs/config/index.js +1 -1
  29. package/dist/cjs/hooks/useAuthState.js +1 -1
  30. package/dist/cjs/hooks/useCodicentState.js +1 -1
  31. package/dist/cjs/hooks/useLocalization.d.ts.map +1 -1
  32. package/dist/cjs/hooks/useLocalization.js +1 -1
  33. package/dist/cjs/hooks/useRealtimeVoiceAI.d.ts.map +1 -1
  34. package/dist/cjs/hooks/useRealtimeVoiceAI.js +1 -1
  35. package/dist/cjs/index.js +1 -1
  36. package/dist/cjs/pages/AppFrame.js +1 -1
  37. package/dist/cjs/pages/Chat.js +1 -1
  38. package/dist/cjs/pages/Compose.js +1 -1
  39. package/dist/cjs/pages/CrmPage.js +1 -1
  40. package/dist/cjs/pages/CrmPagePersistent.js +1 -1
  41. package/dist/cjs/pages/FormAccept.js +1 -1
  42. package/dist/cjs/pages/FormInvite.js +1 -1
  43. package/dist/cjs/pages/HtmlViewer.js +1 -1
  44. package/dist/cjs/pages/Login.js +1 -1
  45. package/dist/cjs/pages/Purchase.js +1 -1
  46. package/dist/cjs/pages/Sales.js +1 -1
  47. package/dist/cjs/pages/Search.js +1 -1
  48. package/dist/cjs/pages/Snap.js +1 -1
  49. package/dist/cjs/services/codicent.d.ts +1 -0
  50. package/dist/cjs/services/codicent.d.ts.map +1 -1
  51. package/dist/esm/components/AiInput.js +1 -1
  52. package/dist/esm/components/AudioIcon.js +1 -1
  53. package/dist/esm/components/ChatInput.js +1 -1
  54. package/dist/esm/components/ChatMessage.js +1 -1
  55. package/dist/esm/components/CombinedPlaceholderDialog.js +1 -1
  56. package/dist/esm/components/DataMessagePicker.d.ts +33 -0
  57. package/dist/esm/components/DataMessagePicker.d.ts.map +1 -0
  58. package/dist/esm/components/DataMessagePicker.js +1 -0
  59. package/dist/esm/components/Footer.js +1 -1
  60. package/dist/esm/components/Header.js +1 -1
  61. package/dist/esm/components/HtmlView.js +1 -1
  62. package/dist/esm/components/MermaidChart.d.ts.map +1 -1
  63. package/dist/esm/components/MermaidChart.js +1 -1
  64. package/dist/esm/components/MessageInput.js +1 -1
  65. package/dist/esm/components/MessageItem.js +1 -1
  66. package/dist/esm/components/Profile.js +1 -1
  67. package/dist/esm/components/Prompt.js +1 -1
  68. package/dist/esm/components/SnapFooter.js +1 -1
  69. package/dist/esm/components/TextHeader.js +1 -1
  70. package/dist/esm/components/TypingIndicator.js +1 -1
  71. package/dist/esm/components/UploadFile.js +1 -1
  72. package/dist/esm/components/UrlProcessor.js +1 -1
  73. package/dist/esm/components/VoiceIcon.js +1 -1
  74. package/dist/esm/components/index.d.ts +2 -0
  75. package/dist/esm/components/index.d.ts.map +1 -1
  76. package/dist/esm/config/index.d.ts.map +1 -1
  77. package/dist/esm/config/index.js +1 -1
  78. package/dist/esm/hooks/useAuthState.js +1 -1
  79. package/dist/esm/hooks/useCodicentState.js +1 -1
  80. package/dist/esm/hooks/useLocalization.d.ts.map +1 -1
  81. package/dist/esm/hooks/useLocalization.js +1 -1
  82. package/dist/esm/hooks/useRealtimeVoiceAI.d.ts.map +1 -1
  83. package/dist/esm/hooks/useRealtimeVoiceAI.js +1 -1
  84. package/dist/esm/index.js +1 -1
  85. package/dist/esm/pages/AppFrame.js +1 -1
  86. package/dist/esm/pages/Chat.js +1 -1
  87. package/dist/esm/pages/Compose.js +1 -1
  88. package/dist/esm/pages/CrmPage.js +1 -1
  89. package/dist/esm/pages/CrmPagePersistent.js +1 -1
  90. package/dist/esm/pages/FormAccept.js +1 -1
  91. package/dist/esm/pages/FormInvite.js +1 -1
  92. package/dist/esm/pages/HtmlViewer.js +1 -1
  93. package/dist/esm/pages/Login.js +1 -1
  94. package/dist/esm/pages/Purchase.js +1 -1
  95. package/dist/esm/pages/Sales.js +1 -1
  96. package/dist/esm/pages/Search.js +1 -1
  97. package/dist/esm/pages/Snap.js +1 -1
  98. package/dist/esm/services/codicent.d.ts +1 -0
  99. package/dist/esm/services/codicent.d.ts.map +1 -1
  100. package/dist/index.d.ts +264 -233
  101. package/package.json +1 -1
@@ -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,cAAc,EAAE,OAAO,CAAC;IACxB,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,aACH,MAAM,KAChB,aAAa,GAAG,SAkrBlB,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
1
+ {"version":3,"file":"useRealtimeVoiceAI.d.ts","sourceRoot":"","sources":["../../../src/hooks/useRealtimeVoiceAI.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAK/E,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE;QACV,KAAK,CAAC,EAAE,UAAU,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE,GAAG,CAAC;KACZ,CAAC;CACH;AAED;;GAEG;AACH,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,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,aACH,MAAM,KAChB,aAAa,GAAG,SA6rBlB,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- import{useRef as e,useState as t,useCallback as n,useEffect as r,useMemo as o}from"react";import{WavRenderer as a}from"../utils/wav_renderer.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import{WavStreamPlayer as s}from"../lib/wavtools/lib/wav_stream_player.js";import{WavRecorder as i}from"../lib/wavtools/lib/wav_recorder.js";import{getConfigValue as c}from"../config/index.js";const l=(l,u,d,p,m)=>{const f=!!c("APP_CONFIG"),g=!!c("APP_BUTTONS");f||console.warn("APP_CONFIG is not set. Voice AI will not be available."),g||console.warn("APP_BUTTONS is not set. Voice AI will not be available.");const y=c("APP_CONFIG"),_=c("APP_BUTTONS");c("API_BASE_URL").replace(/\/$/,""),c("USE_REALTIME_SESSION_ENDPOINT"),c("REALTIME_SESSION_ENDPOINT");const w=p||c("REALTIME_VOICE_MODEL")||"alloy",h=m||c("REALTIME_VOICE_PROVIDER")||"openai",S=["alloy","shimmer","echo"],v=S.includes(w)?w:"alloy";w!==v&&console.warn(`[codicent-app-sdk] Voice "${w}" is not supported in the current SDK version. Supported voices: ${S.join(", ")}. Falling back to "${v}".`);const O=e(new i({sampleRate:24e3})),I=e(new s({sampleRate:24e3})),T=e(null),N=e(null),E=e(null),R=e(null),A=e(!1),C=e(null),P=e(null),b=e(null),D=e((new Date).toISOString()),[F,J]=t([]),[M,$]=t([]),[x,L]=t(!1),[V,k]=t(!1),[U,j]=t(!1),[B,G]=t(!1),q=e(0),W=e(0),[H,z]=t(""),[K,Q]=t("en-US"),X=e(new Map),Y=e(null),[Z,ee]=t((()=>f&&g&&_&&y&&y.apps&&y.apps[_]?y.apps[_].voiceInstructions||y.REALTIME_VOICE_INSTRUCTIONS||"":y&&y.REALTIME_VOICE_INSTRUCTIONS||"")),te=n((e=>{const t=D.current,n=new Date(t).valueOf(),r=new Date(e).valueOf()-n,o=Math.floor(r/10)%100,a=Math.floor(r/1e3)%60,s=e=>{let t=e+"";for(;t.length<2;)t="0"+t;return t};return`${s(Math.floor(r/6e4)%60)}:${s(a)}.${s(o)}`}),[]),ne=n((async()=>{try{D.current=(new Date).toISOString(),L(!0),$([]),J([]),X.current.clear();const e=await l.getRealtimeSessionToken(v,h);if(!e)throw new Error("No ephemeral key returned from session endpoint");const t=new RTCPeerConnection;T.current=t,E.current||(E.current=new Audio,E.current.autoplay=!0),t.ontrack=e=>{E.current&&e.streams[0]&&(E.current.srcObject=e.streams[0])};const n=await navigator.mediaDevices.getUserMedia({audio:!0});R.current=n;const r=n.getTracks()[0];t.addTrack(r,n);const o=t.createDataChannel("oai-events");N.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)J((e=>[...e,t.item]));else if("conversation.item.input_audio_transcription.completed"===t.type)J((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),X.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=X.current.get(e);r&&n&&(r.arguments+=n,X.current.set(e,r))}else if("response.function_call_arguments.done"===t.type){const e=t.item_id,n=X.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}`);X.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");const e=Y.current||Z;Y.current=null,o.send(JSON.stringify({type:"session.update",session:{instructions:e.replace("{{name}}",H).replace("{{language}}",K).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:v,temperature:.8,max_response_output_tokens:4096,input_audio_format:"pcm16",output_audio_format:"pcm16",tools:d.map((e=>({type:"function",...e.definition})))}})),k(!0)},o.onclose=()=>{console.log("Data channel closed"),k(!1)};const a=await t.createOffer();await t.setLocalDescription(a);let s="gpt-4o-realtime-preview";try{if(c("REALTIME_CONFIG_ENDPOINT")){const e=await l.getRealtimeConfig();e&&e.model&&(s=e.model)}}catch(e){console.warn("Failed to fetch realtime config, using default model:",e)}const i="https://api.openai.com/v1/realtime",u=await fetch(`${i}?model=${s}`,{method:"POST",body:a.sdp,headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/sdp"}});if(!u.ok)throw new Error(`Failed to get SDP answer: ${u.statusText}`);const p={type:"answer",sdp:await u.text()};await t.setRemoteDescription(p),j(!1);const m=O.current,f=I.current;await m.begin(),await f.connect()}catch(e){throw console.error("[codicent-app-sdk] Failed to establish WebRTC connection:",e),L(!1),e}}),[l,v,Z,H,K,d]),re=n((async()=>{L(!1),k(!1),$([]),J([]),X.current.clear(),Y.current=null,N.current&&(N.current.close(),N.current=null),T.current&&(T.current.close(),T.current=null),R.current&&(R.current.getTracks().forEach((e=>e.stop())),R.current=null),E.current&&(E.current.pause(),E.current.srcObject=null);const e=O.current;await e.end();const t=I.current;await t.interrupt()}),[]),oe=n((async e=>{const t=N.current;t&&"open"===t.readyState&&t.send(JSON.stringify({type:"conversation.item.delete",item_id:e}))}),[]),ae=n((async()=>{G(!0);const e=N.current;e&&"open"===e.readyState&&e.send(JSON.stringify({type:"input_audio_buffer.commit"}))}),[]),se=n((async()=>{G(!1);const e=N.current;e&&"open"===e.readyState&&e.send(JSON.stringify({type:"response.create"}))}),[]),ie=n((async e=>{const t=N.current;t&&"open"===t.readyState&&t.send(JSON.stringify({type:"session.update",session:{turn_detection:"none"===e?null:{type:"server_vad"}}})),j("none"===e)}),[]);r((()=>{if(H&&V){const e=N.current;e&&"open"===e.readyState&&e.send(JSON.stringify({type:"session.update",session:{instructions:Z.replace("{{name}}",H).replace("{{language}}",K).replace("{{time}}",(new Date).toISOString())}}))}}),[Z,H,K,V]),r((()=>{let e=!0;const t=O.current,n=C.current;let r=null;const o=I.current,s=P.current;let i=null;const c=()=>{if(e){if(n&&(n.width&&n.height||(n.width=n.offsetWidth,n.height=n.offsetHeight),r=r||n.getContext("2d"),r)){r.clearRect(0,0,n.width,n.height);const e=t.recording?t.getFrequencies("voice"):{values:new Float32Array([0])},o=1-Math.max(...e.values);q.current=o,a.drawCircularBars(n,r,e.values,"#0099ff",20,0,8)}if(s&&(s.width&&s.height||(s.width=s.offsetWidth,s.height=s.offsetHeight),i=i||s.getContext("2d"),i)){i.clearRect(0,0,s.width,s.height);const e=o.analyser?o.getFrequencies("voice"):{values:new Float32Array([0])},t=1-Math.max(...e.values);W.current=t,a.drawCircularBars(s,i,e.values,"#009900",20,0,8)}window.requestAnimationFrame(c)}};return c(),()=>{e=!1}}),[]),r((()=>{!A.current&&d&&Z&&(A.current=!0)}),[d,Z]);const ce=n((e=>{ee(e);const t=N.current;if(t&&"open"===t.readyState){const n=e.replace("{{name}}",H).replace("{{language}}",K).replace("{{time}}",(new Date).toISOString());t.send(JSON.stringify({type:"session.update",session:{instructions:n}}))}else Y.current=e}),[H,K]);return o((()=>{if(f&&g)return{items:F,realtimeEvents:M,isConnected:x,isSessionReady:V,canPushToTalk:U,isRecording:B,clientCanvasRef:C,serverCanvasRef:P,eventsScrollRef:b,formatTime:te,connectConversation:ne,disconnectConversation:re,deleteConversationItem:oe,startRecording:ae,stopRecording:se,changeTurnEndType:ie,getRecorderLevel:()=>q.current,getStreamLevel:()=>W.current,setUsername:z,updateInstructions:ce,setLanguage:Q}}),[f,g,F,M,x,V,U,B,C,P,b])};export{l as default};
1
+ import{useRef as e,useState as t,useCallback as n,useEffect as r,useMemo as o}from"react";import{WavRenderer as a}from"../utils/wav_renderer.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import{WavStreamPlayer as s}from"../lib/wavtools/lib/wav_stream_player.js";import{WavRecorder as i}from"../lib/wavtools/lib/wav_recorder.js";import{getConfigValue as c}from"../config/index.js";const l=(l,u,d,p,m)=>{const f=!!c("APP_CONFIG"),g=!!c("APP_BUTTONS");f||console.warn("APP_CONFIG is not set. Voice AI will not be available."),g||console.warn("APP_BUTTONS is not set. Voice AI will not be available.");const y=c("APP_CONFIG"),_=c("APP_BUTTONS");c("API_BASE_URL").replace(/\/$/,""),c("USE_REALTIME_SESSION_ENDPOINT"),c("REALTIME_SESSION_ENDPOINT");const w=p||c("REALTIME_VOICE_MODEL")||"alloy",h=m||c("REALTIME_VOICE_PROVIDER")||"openai",S=["alloy","shimmer","echo","verse","nova","fable","onyx"],v=S.includes(w)?w:"alloy";w!==v&&console.warn(`[codicent-app-sdk] Voice "${w}" is not supported in the current SDK version. Supported voices: ${S.join(", ")}. Falling back to "${v}".`);const O=e(new i({sampleRate:24e3})),I=e(new s({sampleRate:24e3})),T=e(null),N=e(null),E=e(null),C=e(null),R=e(!1),A=e(null),P=e(null),b=e(null),D=e((new Date).toISOString()),[L,x]=t([]),[F,J]=t([]),[M,k]=t(!1),[V,$]=t(!1),[U,j]=t(!1),[B,G]=t(!1),q=e(0),z=e(0),[W,H]=t(""),[K,Q]=t("en-US"),X=e(new Map),Y=e(null),[Z,ee]=t((()=>f&&g&&_&&y&&y.apps&&y.apps[_]?y.apps[_].voiceInstructions||y.REALTIME_VOICE_INSTRUCTIONS||"":y&&y.REALTIME_VOICE_INSTRUCTIONS||"")),te=n((e=>{const t=D.current,n=new Date(t).valueOf(),r=new Date(e).valueOf()-n,o=Math.floor(r/10)%100,a=Math.floor(r/1e3)%60,s=e=>{let t=e+"";for(;t.length<2;)t="0"+t;return t};return`${s(Math.floor(r/6e4)%60)}:${s(a)}.${s(o)}`}),[]),ne=n((async()=>{try{D.current=(new Date).toISOString(),k(!0),J([]),x([]),X.current.clear();const e=await l.getRealtimeSessionToken(v,h);if(!e)throw new Error("No ephemeral key returned from session endpoint");const t=new RTCPeerConnection;T.current=t,E.current||(E.current=new Audio,E.current.autoplay=!0),t.ontrack=e=>{E.current&&e.streams[0]&&(E.current.srcObject=e.streams[0])};const n=await navigator.mediaDevices.getUserMedia({audio:!0});C.current=n;const r=n.getTracks()[0];t.addTrack(r,n);const o=t.createDataChannel("oai-events");N.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)x((e=>[...e,t.item]));else if("conversation.item.input_audio_transcription.completed"===t.type)x((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),X.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=X.current.get(e);r&&n&&(r.arguments+=n,X.current.set(e,r))}else if("response.function_call_arguments.done"===t.type){const e=t.item_id,n=X.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}`);X.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");const e=Y.current||Z;Y.current=null,o.send(JSON.stringify({type:"session.update",session:{instructions:e.replace("{{name}}",W).replace("{{language}}",K).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:v,temperature:.8,max_response_output_tokens:4096,input_audio_format:"pcm16",output_audio_format:"pcm16",tools:d.map((e=>({type:"function",...e.definition})))}})),$(!0)},o.onclose=()=>{console.log("Data channel closed"),$(!1)};const a=await t.createOffer();await t.setLocalDescription(a);let s="gpt-4o-realtime-preview",i=null;try{const e=c("REALTIME_CONFIG_ENDPOINT"),t="azure"===h.toLowerCase();if(e||t){const e=await l.getRealtimeConfig(h);e&&e.model&&(s=e.model),e&&e.url&&(i=e.url)}}catch(e){console.warn("Failed to fetch realtime config, using default model:",e)}const u="azure"===h.toLowerCase(),p=i??`https://api.openai.com/v1/realtime?model=${s}`,m=u?{"api-key":e,"Content-Type":"application/sdp"}:{Authorization:`Bearer ${e}`,"Content-Type":"application/sdp"},f=await fetch(p,{method:"POST",body:a.sdp,headers:m});if(!f.ok)throw new Error(`Failed to get SDP answer: ${f.statusText}`);const g={type:"answer",sdp:await f.text()};await t.setRemoteDescription(g),j(!1);const y=O.current,_=I.current;await y.begin(),await _.connect()}catch(e){throw console.error("[codicent-app-sdk] Failed to establish WebRTC connection:",e),k(!1),e}}),[l,v,Z,W,K,d]),re=n((async()=>{k(!1),$(!1),J([]),x([]),X.current.clear(),Y.current=null,N.current&&(N.current.close(),N.current=null),T.current&&(T.current.close(),T.current=null),C.current&&(C.current.getTracks().forEach((e=>e.stop())),C.current=null),E.current&&(E.current.pause(),E.current.srcObject=null);const e=O.current;await e.end();const t=I.current;await t.interrupt()}),[]),oe=n((async e=>{const t=N.current;t&&"open"===t.readyState&&t.send(JSON.stringify({type:"conversation.item.delete",item_id:e}))}),[]),ae=n((async()=>{G(!0);const e=N.current;e&&"open"===e.readyState&&e.send(JSON.stringify({type:"input_audio_buffer.commit"}))}),[]),se=n((async()=>{G(!1);const e=N.current;e&&"open"===e.readyState&&e.send(JSON.stringify({type:"response.create"}))}),[]),ie=n((async e=>{const t=N.current;t&&"open"===t.readyState&&t.send(JSON.stringify({type:"session.update",session:{turn_detection:"none"===e?null:{type:"server_vad"}}})),j("none"===e)}),[]);r((()=>{if(W&&V){const e=N.current;e&&"open"===e.readyState&&e.send(JSON.stringify({type:"session.update",session:{instructions:Z.replace("{{name}}",W).replace("{{language}}",K).replace("{{time}}",(new Date).toISOString())}}))}}),[Z,W,K,V]),r((()=>{let e=!0;const t=O.current,n=A.current;let r=null;const o=I.current,s=P.current;let i=null;const c=()=>{if(e){if(n&&(n.width&&n.height||(n.width=n.offsetWidth,n.height=n.offsetHeight),r=r||n.getContext("2d"),r)){r.clearRect(0,0,n.width,n.height);const e=t.recording?t.getFrequencies("voice"):{values:new Float32Array([0])},o=1-Math.max(...e.values);q.current=o,a.drawCircularBars(n,r,e.values,"#0099ff",20,0,8)}if(s&&(s.width&&s.height||(s.width=s.offsetWidth,s.height=s.offsetHeight),i=i||s.getContext("2d"),i)){i.clearRect(0,0,s.width,s.height);const e=o.analyser?o.getFrequencies("voice"):{values:new Float32Array([0])},t=1-Math.max(...e.values);z.current=t,a.drawCircularBars(s,i,e.values,"#009900",20,0,8)}window.requestAnimationFrame(c)}};return c(),()=>{e=!1}}),[]),r((()=>{!R.current&&d&&Z&&(R.current=!0)}),[d,Z]);const ce=n((e=>{ee(e);const t=N.current;if(t&&"open"===t.readyState){const n=e.replace("{{name}}",W).replace("{{language}}",K).replace("{{time}}",(new Date).toISOString());t.send(JSON.stringify({type:"session.update",session:{instructions:n}}))}else Y.current=e}),[W,K]);return o((()=>{if(f&&g)return{items:L,realtimeEvents:F,isConnected:M,isSessionReady:V,canPushToTalk:U,isRecording:B,clientCanvasRef:A,serverCanvasRef:P,eventsScrollRef:b,formatTime:te,connectConversation:ne,disconnectConversation:re,deleteConversationItem:oe,startRecording:ae,stopRecording:se,changeTurnEndType:ie,getRecorderLevel:()=>q.current,getStreamLevel:()=>z.current,setUsername:H,updateInstructions:ce,setLanguage:Q}}),[f,g,L,F,M,V,U,B,A,P,b])};export{l as default};
package/dist/esm/index.js CHANGED
@@ -1 +1 @@
1
- export{CodicentService,setBaseUrl}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{QrCodeDialog}from"./components/QrCodeDialog.js";export{default as QrScanner}from"./components/QrScanner.js";export{default as GenericJsonRenderer}from"./components/GenericJsonRenderer.js";export{default as ErrorBoundary}from"./components/ErrorBoundary.js";export{default as OfflineMessage}from"./components/OfflineMessage.js";export{LanguageSelector}from"./components/LanguageSelector.js";export{default as ListView}from"./components/ListView.js";export{RecordModal}from"./components/RecordModal.js";export{default as BulkUploadDialog}from"./components/BulkUploadDialog.js";export{CookieBanner}from"./components/CookieBanner.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 useDebugLogs}from"./hooks/useDebugLogs.js";export{useObserveDataSchemas}from"./hooks/useObserveDataSchemas.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";export{default as Help}from"./pages/Help.js";export{default as Debug}from"./pages/Debug.js";export{default as SchemaEditor}from"./pages/SchemaEditor.js";export{default as QrScan}from"./pages/QrScan.js";export{default as FormPage}from"./pages/FormPage.js";export{createCodicentApp}from"./bootstrap.js";var o=e.StateMachine;export{o as StateMachine};
1
+ export{CodicentService,setBaseUrl}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 DataMessagePicker}from"./components/DataMessagePicker.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{QrCodeDialog}from"./components/QrCodeDialog.js";export{default as QrScanner}from"./components/QrScanner.js";export{default as GenericJsonRenderer}from"./components/GenericJsonRenderer.js";export{default as ErrorBoundary}from"./components/ErrorBoundary.js";export{default as OfflineMessage}from"./components/OfflineMessage.js";export{LanguageSelector}from"./components/LanguageSelector.js";export{default as ListView}from"./components/ListView.js";export{RecordModal}from"./components/RecordModal.js";export{default as BulkUploadDialog}from"./components/BulkUploadDialog.js";export{CookieBanner}from"./components/CookieBanner.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 useDebugLogs}from"./hooks/useDebugLogs.js";export{useObserveDataSchemas}from"./hooks/useObserveDataSchemas.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";export{default as Help}from"./pages/Help.js";export{default as Debug}from"./pages/Debug.js";export{default as SchemaEditor}from"./pages/SchemaEditor.js";export{default as QrScan}from"./pages/QrScan.js";export{default as FormPage}from"./pages/FormPage.js";export{createCodicentApp}from"./bootstrap.js";var o=e.StateMachine;export{o as StateMachine};
@@ -1 +1 @@
1
- import{jsx as o}from"react/jsx-runtime";import{makeStyles as t}from"@fluentui/react-components";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"@fluentui/react-icons";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"../components/Content.js";import{Page as e}from"../components/Page.js";import"./QrScan.js";import"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"react-router-dom";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const s=t({iframe:{width:"100%",height:"100%",border:"none"},scrollable:{overflow:"auto"},nonScrollable:{overflow:"hidden"},fixFrameHeight:{height:"calc(100% - 5px)"}}),r=({src:t,showFooter:r,title:i})=>{const m=s();return r?o(e,{hideFooter:!r,hideHeader:!0,children:o("iframe",{title:i,src:t,className:`${m.iframe} ${r?m.fixFrameHeight:""}`})}):o("iframe",{title:i,src:t,className:m.iframe})};export{r as default};
1
+ import{jsx as o}from"react/jsx-runtime";import{makeStyles as t}from"@fluentui/react-components";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"@fluentui/react-icons";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"../components/Content.js";import{Page as e}from"../components/Page.js";import"./QrScan.js";import"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"react-router-dom";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const s=t({iframe:{width:"100%",height:"100%",border:"none"},scrollable:{overflow:"auto"},nonScrollable:{overflow:"hidden"},fixFrameHeight:{height:"calc(100% - 5px)"}}),r=({src:t,showFooter:r,title:i})=>{const m=s();return r?o(e,{hideFooter:!r,hideHeader:!0,children:o("iframe",{title:i,src:t,className:`${m.iframe} ${r?m.fixFrameHeight:""}`})}):o("iframe",{title:i,src:t,className:m.iframe})};export{r as default};
@@ -1 +1 @@
1
- import{jsxs as e,jsx as o}from"react/jsx-runtime";import{useRef as t,useState as n,useEffect as r}from"react";import{makeStyles as s}from"@fluentui/react-components";import{useNavigate as i,useSearchParams as a}from"react-router-dom";import{CalendarWeekStart24Regular as m}from"@fluentui/react-icons";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 p from"../components/TypingIndicator.js";import c from"../components/Prompt.js";import d from"../components/ChatInput.js";import{CombinedPlaceholderDialog as h}from"../components/CombinedPlaceholderDialog.js";import g from"../components/ChatMessage.js";import"../components/Header.js";import u from"../hooks/useStateWithLocalStorage.js";import{CodicentService as j}from"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as f}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"../components/Content.js";import{Page as b}from"../components/Page.js";import"./QrScan.js";import C from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import{useChat as x}from"../hooks/useChat.js";import{useTemplateVariables as w}from"../hooks/useTemplateVariables.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const S=s({chatContainer:{width:"100%",flex:1,maxWidth:"1600px",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:s,hideFooter:v,codicent:y,title:k,welcomeMessage:F})=>{const P=S(),{t:T,tAsync:I,getLanguageInfo:_}=C(),A=i(),M=t(null),[L,H]=a(),V=L.get("codicent"),B=V||y,{messages:R,isBotTyping:N,handleSend:U,newChat:O,openChat:D}=x(s.stateMachine,B||void 0),[W,E]=n(null),[z,Q]=n(!1),[G,Y]=n(!1),{service:$,currentStateName:K}=s,[q,J]=n([]),[X,Z]=n([]),[ee,oe]=n(!1),[te,ne]=n(),[re,se]=u(s.context.selectedApp+"_prompts",[]),[ie,ae]=n(!1),{extractTemplateVariables:me,replaceTemplateVariables:le,extractFilePlaceholders:pe,replaceFilePlaceholders:ce,handleSelectFiles:de}=w($.uploadFile),he=t(!1),ge=t(null);r((()=>{const e=window.history.length>1,o=Boolean(document.referrer&&document.referrer!==window.location.href);Y(e||o)}),[]);r((()=>{f("SHOW_CHAT_PROMPTS")&&0===R.length&&s.service.getAppPrompts().then(se).catch((e=>{console.error("Failed to get prompts",e)}))}),[s.service,se,R.length]),r((()=>{setTimeout((()=>{M.current?.scrollIntoView({behavior:"smooth"})}),10)}),[R]),r((()=>{if(he.current)return;he.current=!0;const e=L.get("text"),o=L.get("id"),t=L.get("fid");if(V){console.log("Using temporary codicent from URL param:",V);const e=new URLSearchParams(L);e.delete("codicent"),H(e,{replace:!0})}if(e){(async()=>{const o=pe(e),t=me(e);O(),o.length>0||t.length>0?(Z(o),J(t),oe(!0),E(T(e))):E(T(e))})()}else o?D(o):t&&ne(t)}),[]),r((()=>{te&&"anonymous"===K&&ge.current!==te&&(ge.current=te,$.getFormById(te).then((async e=>{O();const o=_().language,t=e.prompt.replace("{{fid}}",te).replace("{{fname}}",e.name).replace("{{language}}",o);ae(!0);const n=await I(t);ae(!1),E(n),Y(!1)})))}),[te,O,$,E,K,I,_,ae]),r((()=>{if(W&&!ee){let e=W;X.length>0&&(e=ce(e,X)),q.length>0&&(e=le(e,q)),U(e),H({},{replace:!0}),E(null),J([]),Z([])}}),[W,ee,U,H,ce,le,X,q]);const ue=e=>{const o=L.get("append");o&&(e+="\n---\n"+o),U(e)};return e(b,{hideHeader:!0,hideFooter:!!te||v,children:[e("div",{id:"chat-container",className:P.chatContainer,style:{backgroundImage:`url(${f("CHAT_BACKGROUND_IMAGE_URL")})`},children:[G&&o("button",{onClick:()=>{G&&A(-1)},"aria-label":T("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(m,{style:{transform:"rotate(180deg)"}})}),o("div",{style:{marginLeft:G?40:0},children:o(l,{title:k||T(f("APP_CHAT_TITLE")||"Chatt"),onNewChat:te?void 0:()=>Q(!0)})}),e("div",{className:P.chatMessages,children:[F&&o(g,{sender:"bot",content:F}),f("SHOW_CHAT_PROMPTS")&&re.length>0&&0===R.length&&o(g,{sender:"bot",content:T(f("CHAT_WELCOME")||T("Välkommen!")),children:re.map(((t,n)=>e("div",{children:["> ",o("a",{href:"./#/chat",onClick:()=>{ue(t.title+"\n---\n"+t.prompt)},children:T(t.title)}),o("br",{})]},`prompt-${n}`)))}),R.map(((t,n)=>e("div",{children:[(N&&n===R.length-1||!N&&n===R.length-2)&&o("div",{ref:M}),o(g,{sender:t.sender,content:t.content,isNew:t.isNew,showSuggestions:n===R.length-1,onSuggestionClicked:U},t.id)]},t.id))),ie&&o(g,{sender:"user",content:T("Översätter...")}),N&&o(p,{})]}),o(d,{codicent:B||s.context.selectedApp,disableSend:N,onSend:ue,onSelectFiles:de,getImageUrl:j.getImageUrl,getFileInfo:e=>$.getFileInfo(e)})]}),o(c,{open:z,title:T("Vill du rensa chatten?"),content:T("En ny startas, men chatten kommer först sparas."),onYes:()=>{Q(!1),O()},onNo:()=>Q(!1)}),o(h,{open:ee,templateVariables:q,filePlaceholders:X,onTemplateVariablesChange:J,onFilePlaceholdersChange:Z,onConfirm:()=>oe(!1),onCancel:()=>{oe(!1),E(null),J([]),Z([])},uploadFile:$.uploadFile})]})};export{v as default};
1
+ import{jsxs as e,jsx as o}from"react/jsx-runtime";import{useRef as t,useState as n,useEffect as r}from"react";import{makeStyles as s}from"@fluentui/react-components";import{useNavigate as i,useSearchParams as a}from"react-router-dom";import{CalendarWeekStart24Regular as m}from"@fluentui/react-icons";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import p from"../components/TextHeader.js";import c from"../components/TypingIndicator.js";import l from"../components/Prompt.js";import d from"../components/ChatInput.js";import{CombinedPlaceholderDialog as h}from"../components/CombinedPlaceholderDialog.js";import g from"../components/ChatMessage.js";import"../components/Header.js";import u from"../hooks/useStateWithLocalStorage.js";import{CodicentService as j}from"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as f}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"../components/Content.js";import{Page as b}from"../components/Page.js";import"./QrScan.js";import C from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import{useChat as x}from"../hooks/useChat.js";import{useTemplateVariables as w}from"../hooks/useTemplateVariables.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const S=s({chatContainer:{width:"100%",flex:1,maxWidth:"1600px",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:s,hideFooter:v,codicent:y,title:k,welcomeMessage:P})=>{const F=S(),{t:T,tAsync:I,getLanguageInfo:_}=C(),A=i(),M=t(null),[L,H]=a(),V=L.get("codicent"),B=V||y,{messages:R,isBotTyping:N,handleSend:U,newChat:D,openChat:O}=x(s.stateMachine,B||void 0),[W,E]=n(null),[z,Q]=n(!1),[G,Y]=n(!1),{service:$,currentStateName:K}=s,[q,J]=n([]),[X,Z]=n([]),[ee,oe]=n(!1),[te,ne]=n(),[re,se]=u(s.context.selectedApp+"_prompts",[]),[ie,ae]=n(!1),{extractTemplateVariables:me,replaceTemplateVariables:pe,extractFilePlaceholders:ce,replaceFilePlaceholders:le,handleSelectFiles:de}=w($.uploadFile),he=t(!1),ge=t(null);r((()=>{const e=window.history.length>1,o=Boolean(document.referrer&&document.referrer!==window.location.href);Y(e||o)}),[]);r((()=>{f("SHOW_CHAT_PROMPTS")&&0===R.length&&s.service.getAppPrompts().then(se).catch((e=>{console.error("Failed to get prompts",e)}))}),[s.service,se,R.length]),r((()=>{setTimeout((()=>{M.current?.scrollIntoView({behavior:"smooth"})}),10)}),[R]),r((()=>{if(he.current)return;he.current=!0;const e=L.get("text"),o=L.get("id"),t=L.get("fid");if(V){console.log("Using temporary codicent from URL param:",V);const e=new URLSearchParams(L);e.delete("codicent"),H(e,{replace:!0})}if(e){(async()=>{const o=ce(e),t=me(e);D(),o.length>0||t.length>0?(Z(o),J(t),oe(!0),E(T(e))):E(T(e))})()}else o?O(o):t&&ne(t)}),[]),r((()=>{te&&"anonymous"===K&&ge.current!==te&&(ge.current=te,$.getFormById(te).then((async e=>{D();const o=_().language,t=e.prompt.replace("{{fid}}",te).replace("{{fname}}",e.name).replace("{{language}}",o);ae(!0);const n=await I(t);ae(!1),E(n),Y(!1)})))}),[te,D,$,E,K,I,_,ae]),r((()=>{if(W&&!ee){let e=W;X.length>0&&(e=le(e,X)),q.length>0&&(e=pe(e,q)),U(e),H({},{replace:!0}),E(null),J([]),Z([])}}),[W,ee,U,H,le,pe,X,q]);const ue=e=>{const o=L.get("append");o&&(e+="\n---\n"+o),U(e)};return e(b,{hideHeader:!0,hideFooter:!!te||v,children:[e("div",{id:"chat-container",className:F.chatContainer,style:{backgroundImage:`url(${f("CHAT_BACKGROUND_IMAGE_URL")})`},children:[G&&o("button",{onClick:()=>{G&&A(-1)},"aria-label":T("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(m,{style:{transform:"rotate(180deg)"}})}),o("div",{style:{marginLeft:G?40:0},children:o(p,{title:k||T(f("APP_CHAT_TITLE")||"Chatt"),onNewChat:te?void 0:()=>Q(!0)})}),e("div",{className:F.chatMessages,children:[P&&o(g,{sender:"bot",content:P}),f("SHOW_CHAT_PROMPTS")&&re.length>0&&0===R.length&&o(g,{sender:"bot",content:T(f("CHAT_WELCOME")||T("Välkommen!")),children:re.map(((t,n)=>e("div",{children:["> ",o("a",{href:"./#/chat",onClick:()=>{ue(t.title+"\n---\n"+t.prompt)},children:T(t.title)}),o("br",{})]},`prompt-${n}`)))}),R.map(((t,n)=>e("div",{children:[(N&&n===R.length-1||!N&&n===R.length-2)&&o("div",{ref:M}),o(g,{sender:t.sender,content:t.content,isNew:t.isNew,showSuggestions:n===R.length-1,onSuggestionClicked:U},t.id)]},t.id))),ie&&o(g,{sender:"user",content:T("Översätter...")}),N&&o(c,{})]}),o(d,{codicent:B||s.context.selectedApp,disableSend:N,onSend:ue,onSelectFiles:de,getImageUrl:j.getImageUrl,getFileInfo:e=>$.getFileInfo(e)})]}),o(l,{open:z,title:T("Vill du rensa chatten?"),content:T("En ny startas, men chatten kommer först sparas."),onYes:()=>{Q(!1),D()},onNo:()=>Q(!1)}),o(h,{open:ee,templateVariables:q,filePlaceholders:X,onTemplateVariablesChange:J,onFilePlaceholdersChange:Z,onConfirm:()=>oe(!1),onCancel:()=>{oe(!1),E(null),J([]),Z([])},uploadFile:$.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 n,useCallback as i,useEffect as r}from"react";import{makeStyles as a,shorthands as s,tokens as m}from"@fluentui/react-components";import{useSearchParams as p,useNavigate as l}from"react-router-dom";import{getConfigValue as c}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 d 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"@fluentui/react-icons";import{CodicentService as g}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 u}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"../components/Content.js";import{Page as j}from"../components/Page.js";import"./QrScan.js";import h from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import f from"../hooks/useToaster.js";import S from"../components/MessageInput.js";import C from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const v=a({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:m.borderRadiusLarge,height:"240px",textAlign:"left",position:"relative"}}),I=({state:a})=>{const s=v(),{t:m}=h(),[I,P]=t(!1),_=n(null),x=n(null),b=n(null),[U,w]=t(null),[F,M]=t([]),{service:A}=a,[E,O]=p(),[T,L]=t(void 0),[y,k]=t(),$=f(),B=l(),D=i((o=>{for(const e of o)A.getFileInfo(e).then((o=>{M((e=>[...e,o]))}))}),[A,M]),H=i((o=>{const e=new FormData;e.append("file",o),A.uploadFile(o.name,e).then((o=>{D([o])})).catch((()=>{$.notify(m("Error"),m("Error uploading pasted image"),"")}))}),[A,D,$,m]),R=o=>{P(o)};r((()=>{const o=E.get("text"),e=E.get("url"),t=E.get("parentId");o&&(L(o),E.delete("text")),t&&(k(t),E.delete("parentId")),e&&(E.delete("url"),L(((o||"")+" "+e).trim())),O(E,{replace:!0})}),[E,O,L,A,D]),r((()=>{c("COMPOSE_AUTO_LOCATION")&&u().then((o=>{o&&w(`#gps(${o.coords.latitude},${o.coords.longitude})`)}))}),[]);return o(j,{hideHeader:!0,children:e("div",{className:s.container,style:{backgroundImage:`url(${c("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[o(d,{title:c("APP_SAVE_TITLE")?m(c("APP_SAVE_TITLE")):m("Spara")}),o(S,{disableSend:!0,defaultText:T,onSend:o=>{o=`${o}${U?" "+U:""}${F.length>0?"\n":""}${F.map((o=>`#file:${o.id}`)).join(" ")}`,A.sendMessage(o,y).then((()=>{$.notify(m("Meddelande"),m("Meddelandet är sparat."),""),y&&(k(void 0),B(-1))}))},files:F,onFilesChange:M,isUploading:I,onHandleDefaultFiles:D,onUploadFile:()=>{_.current?.triggerUpload(),console.log("attach-file")},onUploadImage:c("COMPOSE_SIMPLE_ATTACH_FILE")?void 0:()=>{x.current?.triggerUpload(),console.log("attach-image")},onUploadCamera:c("COMPOSE_SIMPLE_ATTACH_FILE")?void 0:()=>{b.current?.triggerUpload(),console.log("attach-camera")},getImageUrl:g.getImageUrl,onLocationChange:c("COMPOSE_HIDE_LOCATION")?void 0:o=>{o?(async()=>{console.log("attach-location");const o=await u();o?($.notify(m("Position"),m("Position tillagd."),""),w(`#gps(${o.coords.latitude},${o.coords.longitude})`)):console.log("Failed to get GPS location")})():(w(null),$.notify(m("Position"),m("Position borttagen."),""),console.log("clear-location"))},hasLocation:!!U,onImagePasted:H}),o(C,{ref:_,onFileUploaded:D,onUploading:R,multiple:!0,codicentService:A}),o(C,{codicentService:A,ref:x,onFileUploaded:D,onUploading:R,multiple:!0,accept:"image/*"}),o(C,{codicentService:A,ref:b,onFileUploaded:D,onUploading:R,multiple:!0,accept:"image/*",capture:"environment"})]})})};export{I as Compose,I as default};
1
+ import{jsx as o,jsxs as e}from"react/jsx-runtime";import{useState as t,useRef as n,useCallback as i,useEffect as r}from"react";import{makeStyles as a,shorthands as s,tokens as m}from"@fluentui/react-components";import{useSearchParams as p,useNavigate as l}from"react-router-dom";import{getConfigValue as c}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 d 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"@fluentui/react-icons";import{CodicentService as g}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 u}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"../components/Content.js";import{Page as j}from"../components/Page.js";import"./QrScan.js";import h from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import f from"../hooks/useToaster.js";import S from"../components/MessageInput.js";import C from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const P=a({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:m.borderRadiusLarge,height:"240px",textAlign:"left",position:"relative"}}),v=({state:a})=>{const s=P(),{t:m}=h(),[v,I]=t(!1),_=n(null),x=n(null),b=n(null),[M,U]=t(null),[w,F]=t([]),{service:A}=a,[E,O]=p(),[T,L]=t(void 0),[y,k]=t(),$=f(),B=l(),D=i((o=>{for(const e of o)A.getFileInfo(e).then((o=>{F((e=>[...e,o]))}))}),[A,F]),H=i((o=>{const e=new FormData;e.append("file",o),A.uploadFile(o.name,e).then((o=>{D([o])})).catch((()=>{$.notify(m("Error"),m("Error uploading pasted image"),"")}))}),[A,D,$,m]),R=o=>{I(o)};r((()=>{const o=E.get("text"),e=E.get("url"),t=E.get("parentId");o&&(L(o),E.delete("text")),t&&(k(t),E.delete("parentId")),e&&(E.delete("url"),L(((o||"")+" "+e).trim())),O(E,{replace:!0})}),[E,O,L,A,D]),r((()=>{c("COMPOSE_AUTO_LOCATION")&&u().then((o=>{o&&U(`#gps(${o.coords.latitude},${o.coords.longitude})`)}))}),[]);return o(j,{hideHeader:!0,children:e("div",{className:s.container,style:{backgroundImage:`url(${c("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[o(d,{title:c("APP_SAVE_TITLE")?m(c("APP_SAVE_TITLE")):m("Spara")}),o(S,{disableSend:!0,defaultText:T,onSend:o=>{o=`${o}${M?" "+M:""}${w.length>0?"\n":""}${w.map((o=>`#file:${o.id}`)).join(" ")}`,A.sendMessage(o,y).then((()=>{$.notify(m("Meddelande"),m("Meddelandet är sparat."),""),y&&(k(void 0),B(-1))}))},files:w,onFilesChange:F,isUploading:v,onHandleDefaultFiles:D,onUploadFile:()=>{_.current?.triggerUpload(),console.log("attach-file")},onUploadImage:c("COMPOSE_SIMPLE_ATTACH_FILE")?void 0:()=>{x.current?.triggerUpload(),console.log("attach-image")},onUploadCamera:c("COMPOSE_SIMPLE_ATTACH_FILE")?void 0:()=>{b.current?.triggerUpload(),console.log("attach-camera")},getImageUrl:g.getImageUrl,onLocationChange:c("COMPOSE_HIDE_LOCATION")?void 0:o=>{o?(async()=>{console.log("attach-location");const o=await u();o?($.notify(m("Position"),m("Position tillagd."),""),U(`#gps(${o.coords.latitude},${o.coords.longitude})`)):console.log("Failed to get GPS location")})():(U(null),$.notify(m("Position"),m("Position borttagen."),""),console.log("clear-location"))},hasLocation:!!M,onImagePasted:H}),o(C,{ref:_,onFileUploaded:D,onUploading:R,multiple:!0,codicentService:A}),o(C,{codicentService:A,ref:x,onFileUploaded:D,onUploading:R,multiple:!0,accept:"image/*"}),o(C,{codicentService:A,ref:b,onFileUploaded:D,onUploading:R,multiple:!0,accept:"image/*",capture:"environment"})]})})};export{v as Compose,v 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{makeStyles as s,shorthands as m,tokens as p,Button as c,MessageBar as l,MessageBarBody as d}from"@fluentui/react-components";import{ArrowLeft24Regular as u}from"@fluentui/react-icons";import{CodicentService as j}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 g 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 h from"../components/VoiceIcon.js";import f from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as v}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 k from"../components/MessageInput.js";import S 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 x}from"../components/Page.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import b from"../hooks/useLocalization.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.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"./QrScan.js";import"react-dom/client";import{useNavigate as w,useSearchParams as C}from"react-router-dom";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import I from"../hooks/useToaster.js";import{l as y}from"../node_modules/lodash/lodash.js";const U=s({main:{flexGrow:1,...m.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:p.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"},backButton:{marginBottom:"10px"}}),_=({state:s,voice:m})=>{const p=U(),{t:_}=b(),A=w(),[B,M]=t(!1),T=n(null),F=n(null),N=n(null),[P]=t(null),[E,L]=t([]),{service:O}=s,[R,$]=C(),[V,D]=t(""),[H,z]=t(void 0),G=I(),[W,Q]=t(void 0),[J,K]=t("info"),X=r((e=>{for(const o of e)O.getFileInfo(o).then((e=>{L((o=>[...o,e]))}))}),[O,L]),Y=r((e=>{const o=new FormData;o.append("file",e),O.uploadFile(e.name,o).then((e=>{X([e])})).catch((()=>{G.notify(_("Error"),_("Error uploading pasted image"),"")}))}),[O,X,G,_]),q=e=>{M(e)};i((()=>{const e=R.get("text"),o=R.get("url");e&&(D(e),R.delete("text")),o&&(R.delete("url"),D(((e||"")+" "+o).trim())),$(R,{replace:!0})}),[R,$,D,O,X]);const Z=r((async e=>{if(!e||e.length<10)return;Q(_("Analyserar...")),K("info");const o=await O.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 f(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++;Q(_(4===t?"Allt är med":o.shortSummary||"Något saknas")),K(4===t?"success":"warning")}catch{Q("Error: "+e.content),K("error")}}}),[O]),ee=a((()=>y.debounce(Z,2e3)),[Z]);return i((()=>()=>{ee.cancel()}),[ee]),e(x,{hideHeader:!0,children:o("div",{className:p.container,style:{backgroundImage:`url(${v("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[m&&v("SHOW_VOICE_BUTTON")&&e("div",{className:p.voiceIcon,children:e(h,{voice:m})}),e("div",{className:p.backButton,children:e(c,{appearance:"subtle",icon:e(u,{}),onClick:()=>A(-1),children:_("Tillbaka")})}),e(g,{title:v("APP_SAVE_TITLE")?_(v("APP_SAVE_TITLE")):_("Spara")}),e(k,{defaultText:V,onSend:e=>{e=`${e=`#crm\n${e.replace("#log ","")}\nSALESPERSON: ${s.context.name||s.context.user?.email||s.context.nickname||"-"}`}${P?" "+P:""}${E.length>0?"\n":""}${E.map((e=>`#file:${e.id}`)).join(" ")}`,O.sendMessage(e).then((()=>{G.notify(_("Meddelande"),_("Meddelandet är sparat."),"")}))},files:E,onFilesChange:L,isUploading:B,onUploadImage:()=>{F.current?.triggerUpload()},onUploadCamera:()=>{N.current?.triggerUpload()},getImageUrl:j.getImageUrl,hasLocation:!!P,disableSend:!0,rows:9,placeholder:_("Beskriv CRM-aktivitet här..."),onChange:e=>{e!==H&&(z(e),e&&e.trim().length>0?ee(e):(Q(void 0),ee.cancel()))},onImagePasted:Y}),W&&o("div",{className:p.review,children:[e("h3",{children:_("Analys")}),e(l,{intent:J,layout:"multiline",children:e(d,{children:_(W)})})]}),e(S,{ref:T,onFileUploaded:X,onUploading:q,multiple:!0,codicentService:O}),e(S,{codicentService:O,ref:F,onFileUploaded:X,onUploading:q,multiple:!0,accept:"image/*"}),e(S,{codicentService:O,ref:N,onFileUploaded:X,onUploading:q,multiple:!0,accept:"image/*",capture:"environment"})]})})};export{_ as CrmPage,_ as default};
1
+ import{jsx as e,jsxs as o}from"react/jsx-runtime";import{useState as t,useRef as n,useCallback as r,useEffect as i,useMemo as a}from"react";import{makeStyles as s,shorthands as m,tokens as p,Button as c,MessageBar as l,MessageBarBody as d}from"@fluentui/react-components";import{ArrowLeft24Regular as u}from"@fluentui/react-icons";import{CodicentService as j}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 g 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 h from"../components/VoiceIcon.js";import f from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as v}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 k from"../components/MessageInput.js";import S 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/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as x}from"../components/Page.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import b from"../hooks/useLocalization.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.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"./QrScan.js";import"react-dom/client";import{useNavigate as w,useSearchParams as C}from"react-router-dom";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import I from"../hooks/useToaster.js";import{l as y}from"../node_modules/lodash/lodash.js";const U=s({main:{flexGrow:1,...m.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:p.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"},backButton:{marginBottom:"10px"}}),_=({state:s,voice:m})=>{const p=U(),{t:_}=b(),M=w(),[A,B]=t(!1),P=n(null),T=n(null),F=n(null),[N]=t(null),[E,L]=t([]),{service:O}=s,[R,$]=C(),[V,D]=t(""),[H,z]=t(void 0),G=I(),[W,Q]=t(void 0),[J,K]=t("info"),X=r((e=>{for(const o of e)O.getFileInfo(o).then((e=>{L((o=>[...o,e]))}))}),[O,L]),Y=r((e=>{const o=new FormData;o.append("file",e),O.uploadFile(e.name,o).then((e=>{X([e])})).catch((()=>{G.notify(_("Error"),_("Error uploading pasted image"),"")}))}),[O,X,G,_]),q=e=>{B(e)};i((()=>{const e=R.get("text"),o=R.get("url");e&&(D(e),R.delete("text")),o&&(R.delete("url"),D(((e||"")+" "+o).trim())),$(R,{replace:!0})}),[R,$,D,O,X]);const Z=r((async e=>{if(!e||e.length<10)return;Q(_("Analyserar...")),K("info");const o=await O.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 f(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++;Q(_(4===t?"Allt är med":o.shortSummary||"Något saknas")),K(4===t?"success":"warning")}catch{Q("Error: "+e.content),K("error")}}}),[O]),ee=a((()=>y.debounce(Z,2e3)),[Z]);return i((()=>()=>{ee.cancel()}),[ee]),e(x,{hideHeader:!0,children:o("div",{className:p.container,style:{backgroundImage:`url(${v("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[m&&v("SHOW_VOICE_BUTTON")&&e("div",{className:p.voiceIcon,children:e(h,{voice:m})}),e("div",{className:p.backButton,children:e(c,{appearance:"subtle",icon:e(u,{}),onClick:()=>M(-1),children:_("Tillbaka")})}),e(g,{title:v("APP_SAVE_TITLE")?_(v("APP_SAVE_TITLE")):_("Spara")}),e(k,{defaultText:V,onSend:e=>{e=`${e=`#crm\n${e.replace("#log ","")}\nSALESPERSON: ${s.context.name||s.context.user?.email||s.context.nickname||"-"}`}${N?" "+N:""}${E.length>0?"\n":""}${E.map((e=>`#file:${e.id}`)).join(" ")}`,O.sendMessage(e).then((()=>{G.notify(_("Meddelande"),_("Meddelandet är sparat."),"")}))},files:E,onFilesChange:L,isUploading:A,onUploadImage:()=>{T.current?.triggerUpload()},onUploadCamera:()=>{F.current?.triggerUpload()},getImageUrl:j.getImageUrl,hasLocation:!!N,disableSend:!0,rows:9,placeholder:_("Beskriv CRM-aktivitet här..."),onChange:e=>{e!==H&&(z(e),e&&e.trim().length>0?ee(e):(Q(void 0),ee.cancel()))},onImagePasted:Y}),W&&o("div",{className:p.review,children:[e("h3",{children:_("Analys")}),e(l,{intent:J,layout:"multiline",children:e(d,{children:_(W)})})]}),e(S,{ref:P,onFileUploaded:X,onUploading:q,multiple:!0,codicentService:O}),e(S,{codicentService:O,ref:T,onFileUploaded:X,onUploading:q,multiple:!0,accept:"image/*"}),e(S,{codicentService:O,ref:F,onFileUploaded:X,onUploading:q,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{makeStyles as s,shorthands as l,tokens as m,Text as c,Spinner as p,Card as d,Button as u,MessageBar as g,MessageBarBody as h}from"@fluentui/react-components";import{ArrowLeft24Regular as f}from"@fluentui/react-icons";import{CodicentService as j}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 x 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 S from"../components/VoiceIcon.js";import v from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as y}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 k}from"../utils/device.js";import"../components/FileThumbnail.js";import w from"../components/MessageInput.js";import b 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 C}from"../components/Page.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import M from"../hooks/useLocalization.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.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"./QrScan.js";import"react-dom/client";import{useNavigate as N,useSearchParams as I}from"react-router-dom";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import T from"../hooks/useToaster.js";import{l as B}from"../node_modules/lodash/lodash.js";const D=s({main:{flexGrow:1,...l.padding("10px"),overflowY:"auto"},container:{display:"flex",flexDirection:"row",height:"100%",...l.gap("16px"),...l.padding("10px")},containerMobile:{display:"flex",flexDirection:"column",height:"100%",...l.gap("16px"),...l.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",...l.gap("8px"),overflowY:"auto",...l.padding("8px")},historySectionMobile:{display:"flex",flexDirection:"column",...l.gap("8px"),overflowY:"auto",...l.padding("8px"),maxHeight:"300px"},historyCard:{...l.padding("12px"),cursor:"pointer","&:hover":{backgroundColor:m.colorNeutralBackground1Hover}},historyCardContent:{display:"flex",flexDirection:"column",...l.gap("4px")},historyDate:{fontSize:m.fontSizeBase200,color:m.colorNeutralForeground3},historyText:{fontSize:m.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:m.fontSizeBase400,fontWeight:m.fontWeightSemibold,marginBottom:"8px"},emptyState:{textAlign:"center",color:m.colorNeutralForeground3,padding:"20px"},backButton:{marginBottom:"10px"}}),U=({state:s,voice:l})=>{const m=D(),{t:U}=M(),_=N(),[A,E]=t(!1),F=n(null),$=n(null),P=n(null),[O]=t(null),[L,z]=t([]),{service:R}=s,[H,V]=I(),[W,G]=t(""),[J,Q]=t(void 0),Y=T(),[K,X]=t(void 0),[q,Z]=t("info"),[ee,oe]=t([]),[te,ne]=t(!1),re=k(),ie=r((e=>{for(const o of e)R.getFileInfo(o).then((e=>{z((o=>[...o,e]))}))}),[R,z]),ae=r((e=>{const o=new FormData;o.append("file",e),R.uploadFile(e.name,o).then((e=>{ie([e])})).catch((()=>{Y.notify(U("Error"),U("Error uploading pasted image"),"")}))}),[R,ie,Y,U]),se=e=>{E(e)},le=r((async()=>{ne(!0);try{const e=await R.getMessages(["crm"]);oe(e)}catch(e){console.error("Error loading CRM messages:",e),Y.notify(U("Error"),U("Failed to load CRM messages"),"","error")}finally{ne(!1)}}),[R,Y,U]);i((()=>{le()}),[le]),i((()=>{const e=H.get("text"),o=H.get("url");e&&(G(e),H.delete("text")),o&&(H.delete("url"),G(((e||"")+" "+o).trim())),V(H,{replace:!0})}),[H,V,G,R,ie]);const me=e=>{e=`${e=`#crm\n${e.replace("#log ","")}\nSALESPERSON: ${s.context.name||s.context.user?.email||s.context.nickname||"-"}`}${O?" "+O:""}${L.length>0?"\n":""}${L.map((e=>`#file:${e.id}`)).join(" ")}`,R.sendMessage(e).then((()=>{Y.notify(U("Meddelande"),U("Meddelandet är sparat."),""),le(),Q(""),X(void 0)}))},ce=r((async e=>{if(!e||e.length<10)return;X(U("Analyserar...")),Z("info");const o=await R.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 v(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++;X(U(4===t?"Allt är med":o.shortSummary||"Något saknas")),Z(4===t?"success":"warning")}catch{X("Error: "+e.content),Z("error")}}}),[R,U]),pe=a((()=>B.debounce(ce,2e3)),[ce]);i((()=>()=>{pe.cancel()}),[pe]);const de=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?U("Just now"):r<60?`${r} ${U("minutes ago")}`:i<24?`${i} ${U("hours ago")}`:a<7?`${a} ${U("days ago")}`:t.toLocaleDateString()},ue=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?"...":"")},ge=()=>o("div",{className:re?m.historySectionMobile:m.historySection,children:[e(c,{className:m.historyTitle,children:U("Tidigare sparade")}),te?e("div",{className:m.emptyState,children:e(p,{size:"small"})}):0===ee.length?e("div",{className:m.emptyState,children:e(c,{children:U("Inga sparade meddelanden än")})}):ee.map((t=>e(d,{className:m.historyCard,onClick:()=>(e=>{const o=ue(e.content);Q(o)})(t),children:o("div",{className:m.historyCardContent,children:[e(c,{className:m.historyDate,children:de(t.createdAt)}),e(c,{className:m.historyText,children:ue(t.content)})]})},t.id)))]});return e(C,{hideHeader:!0,children:o("div",{className:re?m.containerMobile:m.container,children:[!re&&ge(),o("div",{className:re?m.inputSectionMobile:m.inputSection,style:re?void 0:{backgroundImage:`url(${y("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[l&&y("SHOW_VOICE_BUTTON")&&e("div",{className:m.voiceIcon,children:e(S,{voice:l})}),e("div",{className:m.backButton,children:e(u,{appearance:"subtle",icon:e(f,{}),onClick:()=>_(-1),children:U("Tillbaka")})}),e(x,{title:y("APP_SAVE_TITLE")?U(y("APP_SAVE_TITLE")):U("Spara")}),e(w,{defaultText:W,onSend:me,files:L,onFilesChange:z,isUploading:A,onUploadImage:()=>{$.current?.triggerUpload()},onUploadCamera:()=>{P.current?.triggerUpload()},getImageUrl:j.getImageUrl,hasLocation:!!O,disableSend:!0,rows:9,placeholder:U("Beskriv CRM-aktivitet här..."),onChange:e=>{e!==J&&(Q(e),e&&e.trim().length>0?pe(e):(X(void 0),pe.cancel()))},onImagePasted:ae}),K&&o("div",{className:m.review,children:[e("h3",{children:U("Analys")}),e(g,{intent:q,layout:"multiline",children:e(h,{children:U(K)})})]}),e(b,{ref:F,onFileUploaded:ie,onUploading:se,multiple:!0,codicentService:R}),e(b,{codicentService:R,ref:$,onFileUploaded:ie,onUploading:se,multiple:!0,accept:"image/*"}),e(b,{codicentService:R,ref:P,onFileUploaded:ie,onUploading:se,multiple:!0,accept:"image/*",capture:"environment"})]}),re&&ge()]})})};export{U as CrmPagePersistent,U 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{makeStyles as s,shorthands as l,tokens as m,Text as c,Spinner as p,Card as d,Button as u,MessageBar as g,MessageBarBody as h}from"@fluentui/react-components";import{ArrowLeft24Regular as f}from"@fluentui/react-icons";import{CodicentService as j}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 x 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 S from"../components/VoiceIcon.js";import v from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as y}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 k}from"../utils/device.js";import"../components/FileThumbnail.js";import w from"../components/MessageInput.js";import b 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/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as C}from"../components/Page.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import M from"../hooks/useLocalization.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.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"./QrScan.js";import"react-dom/client";import{useNavigate as N,useSearchParams as I}from"react-router-dom";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import T from"../hooks/useToaster.js";import{l as B}from"../node_modules/lodash/lodash.js";const D=s({main:{flexGrow:1,...l.padding("10px"),overflowY:"auto"},container:{display:"flex",flexDirection:"row",height:"100%",...l.gap("16px"),...l.padding("10px")},containerMobile:{display:"flex",flexDirection:"column",height:"100%",...l.gap("16px"),...l.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",...l.gap("8px"),overflowY:"auto",...l.padding("8px")},historySectionMobile:{display:"flex",flexDirection:"column",...l.gap("8px"),overflowY:"auto",...l.padding("8px"),maxHeight:"300px"},historyCard:{...l.padding("12px"),cursor:"pointer","&:hover":{backgroundColor:m.colorNeutralBackground1Hover}},historyCardContent:{display:"flex",flexDirection:"column",...l.gap("4px")},historyDate:{fontSize:m.fontSizeBase200,color:m.colorNeutralForeground3},historyText:{fontSize:m.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:m.fontSizeBase400,fontWeight:m.fontWeightSemibold,marginBottom:"8px"},emptyState:{textAlign:"center",color:m.colorNeutralForeground3,padding:"20px"},backButton:{marginBottom:"10px"}}),U=({state:s,voice:l})=>{const m=D(),{t:U}=M(),_=N(),[A,E]=t(!1),F=n(null),P=n(null),$=n(null),[O]=t(null),[L,z]=t([]),{service:R}=s,[H,V]=I(),[W,G]=t(""),[J,Q]=t(void 0),Y=T(),[K,X]=t(void 0),[q,Z]=t("info"),[ee,oe]=t([]),[te,ne]=t(!1),re=k(),ie=r((e=>{for(const o of e)R.getFileInfo(o).then((e=>{z((o=>[...o,e]))}))}),[R,z]),ae=r((e=>{const o=new FormData;o.append("file",e),R.uploadFile(e.name,o).then((e=>{ie([e])})).catch((()=>{Y.notify(U("Error"),U("Error uploading pasted image"),"")}))}),[R,ie,Y,U]),se=e=>{E(e)},le=r((async()=>{ne(!0);try{const e=await R.getMessages(["crm"]);oe(e)}catch(e){console.error("Error loading CRM messages:",e),Y.notify(U("Error"),U("Failed to load CRM messages"),"","error")}finally{ne(!1)}}),[R,Y,U]);i((()=>{le()}),[le]),i((()=>{const e=H.get("text"),o=H.get("url");e&&(G(e),H.delete("text")),o&&(H.delete("url"),G(((e||"")+" "+o).trim())),V(H,{replace:!0})}),[H,V,G,R,ie]);const me=e=>{e=`${e=`#crm\n${e.replace("#log ","")}\nSALESPERSON: ${s.context.name||s.context.user?.email||s.context.nickname||"-"}`}${O?" "+O:""}${L.length>0?"\n":""}${L.map((e=>`#file:${e.id}`)).join(" ")}`,R.sendMessage(e).then((()=>{Y.notify(U("Meddelande"),U("Meddelandet är sparat."),""),le(),Q(""),X(void 0)}))},ce=r((async e=>{if(!e||e.length<10)return;X(U("Analyserar...")),Z("info");const o=await R.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 v(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++;X(U(4===t?"Allt är med":o.shortSummary||"Något saknas")),Z(4===t?"success":"warning")}catch{X("Error: "+e.content),Z("error")}}}),[R,U]),pe=a((()=>B.debounce(ce,2e3)),[ce]);i((()=>()=>{pe.cancel()}),[pe]);const de=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?U("Just now"):r<60?`${r} ${U("minutes ago")}`:i<24?`${i} ${U("hours ago")}`:a<7?`${a} ${U("days ago")}`:t.toLocaleDateString()},ue=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?"...":"")},ge=()=>o("div",{className:re?m.historySectionMobile:m.historySection,children:[e(c,{className:m.historyTitle,children:U("Tidigare sparade")}),te?e("div",{className:m.emptyState,children:e(p,{size:"small"})}):0===ee.length?e("div",{className:m.emptyState,children:e(c,{children:U("Inga sparade meddelanden än")})}):ee.map((t=>e(d,{className:m.historyCard,onClick:()=>(e=>{const o=ue(e.content);Q(o)})(t),children:o("div",{className:m.historyCardContent,children:[e(c,{className:m.historyDate,children:de(t.createdAt)}),e(c,{className:m.historyText,children:ue(t.content)})]})},t.id)))]});return e(C,{hideHeader:!0,children:o("div",{className:re?m.containerMobile:m.container,children:[!re&&ge(),o("div",{className:re?m.inputSectionMobile:m.inputSection,style:re?void 0:{backgroundImage:`url(${y("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[l&&y("SHOW_VOICE_BUTTON")&&e("div",{className:m.voiceIcon,children:e(S,{voice:l})}),e("div",{className:m.backButton,children:e(u,{appearance:"subtle",icon:e(f,{}),onClick:()=>_(-1),children:U("Tillbaka")})}),e(x,{title:y("APP_SAVE_TITLE")?U(y("APP_SAVE_TITLE")):U("Spara")}),e(w,{defaultText:W,onSend:me,files:L,onFilesChange:z,isUploading:A,onUploadImage:()=>{P.current?.triggerUpload()},onUploadCamera:()=>{$.current?.triggerUpload()},getImageUrl:j.getImageUrl,hasLocation:!!O,disableSend:!0,rows:9,placeholder:U("Beskriv CRM-aktivitet här..."),onChange:e=>{e!==J&&(Q(e),e&&e.trim().length>0?pe(e):(X(void 0),pe.cancel()))},onImagePasted:ae}),K&&o("div",{className:m.review,children:[e("h3",{children:U("Analys")}),e(g,{intent:q,layout:"multiline",children:e(h,{children:U(K)})})]}),e(b,{ref:F,onFileUploaded:ie,onUploading:se,multiple:!0,codicentService:R}),e(b,{codicentService:R,ref:P,onFileUploaded:ie,onUploading:se,multiple:!0,accept:"image/*"}),e(b,{codicentService:R,ref:$,onFileUploaded:ie,onUploading:se,multiple:!0,accept:"image/*",capture:"environment"})]}),re&&ge()]})})};export{U as CrmPagePersistent,U 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{makeStyles as s,Button as m}from"@fluentui/react-components";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 p,useEffect as a}from"react";import"@fluentui/react-icons";import"../services/codicent.js";import"../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{formatGuidToShorterReadableCode as l}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 d from"../components/Content.js";import{Page as j}from"../components/Page.js";import"./QrScan.js";import u from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import{useSearchParams as h,useNavigate as g}from"react-router-dom";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const f=s({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:s,tAsync:k}=u(),[C]=h(),_=g(),b=C.get("id"),v=f(),[M,S]=p(""),[P,w]=p(!1);return a((()=>{(async()=>{const o=c("FORM_ACCEPT_MARKDOWN");if(o){w(!0);const t=await k(o);w(!1),S(t.replace("{{code}}",l(b||"")))}})()}),[k,b]),o(j,{hideFooter:!0,hideHeader:!0,children:o("div",{className:v.container,style:{backgroundImage:`url(${c("FORM_BACKGROUND_IMAGE_URL")})`},children:t(d,{children:[P&&o(n,{children:s("Översätter...")}),c("FORM_ACCEPT_MARKDOWN")&&M&&!P&&o(r,{content:M}),!c("FORM_ACCEPT_MARKDOWN")&&t(e,{children:[o(i,{children:s("Din kod för formuläret")}),o("p",{className:v.instructionParagraph,children:s("Instruktioner:")}),t("ol",{className:v.orderedList,children:[o("li",{children:s("Skriv ner eller kopiera den kod som visas nedan, du behöver den för att identifiera din session.")}),o("li",{children:s("Klicka på 'Starta' för att komma igång med chatten.")})]}),o(n,{size:500,children:s("Din kod är (skriv ner den):")}),o(n,{size:600,style:{userSelect:"all"},children:l(b||"")})]}),b&&o(m,{appearance:"primary",onClick:()=>_(`/chat?fid=${b}`),children:s("Starta")})]})})})};export{k as default};
1
+ import{jsx as o,jsxs as t,Fragment as e}from"react/jsx-runtime";import r from"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{Title as i}from"../components/Title.js";import{Text as n}from"../components/Text.js";import"../components/Spinner.js";import{makeStyles as s,Button as m}from"@fluentui/react-components";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 p,useEffect as a}from"react";import"@fluentui/react-icons";import"../services/codicent.js";import"../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{formatGuidToShorterReadableCode as l}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 d from"../components/Content.js";import{Page as j}from"../components/Page.js";import"./QrScan.js";import u from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import{useSearchParams as h,useNavigate as g}from"react-router-dom";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const f=s({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:s,tAsync:k}=u(),[C]=h(),M=g(),_=C.get("id"),b=f(),[v,S]=p(""),[P,w]=p(!1);return a((()=>{(async()=>{const o=c("FORM_ACCEPT_MARKDOWN");if(o){w(!0);const t=await k(o);w(!1),S(t.replace("{{code}}",l(_||"")))}})()}),[k,_]),o(j,{hideFooter:!0,hideHeader:!0,children:o("div",{className:b.container,style:{backgroundImage:`url(${c("FORM_BACKGROUND_IMAGE_URL")})`},children:t(d,{children:[P&&o(n,{children:s("Översätter...")}),c("FORM_ACCEPT_MARKDOWN")&&v&&!P&&o(r,{content:v}),!c("FORM_ACCEPT_MARKDOWN")&&t(e,{children:[o(i,{children:s("Din kod för formuläret")}),o("p",{className:b.instructionParagraph,children:s("Instruktioner:")}),t("ol",{className:b.orderedList,children:[o("li",{children:s("Skriv ner eller kopiera den kod som visas nedan, du behöver den för att identifiera din session.")}),o("li",{children:s("Klicka på 'Starta' för att komma igång med chatten.")})]}),o(n,{size:500,children:s("Din kod är (skriv ner den):")}),o(n,{size:600,style:{userSelect:"all"},children:l(_||"")})]}),_&&o(m,{appearance:"primary",onClick:()=>M(`/chat?fid=${_}`),children:s("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{makeStyles as i,useId as a,Dropdown as s,Option as m}from"@fluentui/react-components";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as p}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as l}from"../components/Title.js";import"../components/Spinner.js";import{Label as c}from"../components/Label.js";import{Input as d}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"@fluentui/react-icons";import u 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 j}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 h}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 k from"../components/Content.js";import{Page as g}from"../components/Page.js";import"./QrScan.js";import f from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"react-router-dom";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const v=i({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"}}),w=({state:i})=>{const w=v(),{service:b}=i,{t:C}=f(),[S,x]=u(i.context.selectedApp+"_forms",[]),[y,$]=n(),[L,B]=n(),[M,P]=n(!1),[_,A]=n(),T=a("form-dropdown");r((()=>{b.getForms().then((o=>{o.sort(((o,e)=>o.name.localeCompare(e.name))),x(o)}))}),[b,C,x]);const D=void 0!==navigator.share;return o(g,{children:o("div",{className:w.container,style:{backgroundImage:`url(${j("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:e(k,{children:[o(l,{children:C("Skapa länk till formulär")}),o("p",{className:w.instructionParagraph,children:C("Instruktioner")}),e("ol",{className:w.orderedList,children:[o("li",{children:C("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:C("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:C("När länken visas, kan du klicka på kopiera-ikonen för att kopiera länken till ditt urklipp.")}),o("li",{children:C("Om din enhet stödjer det, kan du även använda dela-knappen för att dela länken direkt.")}),o("li",{children:C("Kom ihåg att spara (skriva ner) koden")})]}),o("label",{id:T,className:w.instructionParagraph,children:C("Välj formulär")}),o(s,{"aria-labelledby":T,placeholder:"-",onOptionSelect:(o,e)=>A(e.optionValue),children:S.map((o=>e(m,{value:o.name,text:`${o.title} (${o.name})`,children:[`${o.title} (${o.name})`," "]},o.name)))}),o(p,{appearance:"primary",disabled:!_,onClick:()=>{const o=S.find((o=>o.name===_));o?.url?b.sendMessage(`#ss-link #${_}`).then((e=>{const t=new Date(Date.now()+2592e5);b.generateApiToken(t).then((t=>{const n=o.url.includes("?")?"&":"?",r=`${o.url}${n}token=${t}`;$(r);const i=h(e);B(i)}))})):b.sendMessage(`#ss-link #${_}`).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=h(o);B(t)}))},children:C("Skapa länk")}),y&&e(t,{children:[o("p",{className:w.generatedLinkTitle,children:C("Här är din genererade länk (du kan kopiera eller dela den):")}),o("div",{className:w.inputAndButton,children:o(d,{className:w.input,value:y,readOnly:!0,onFocus:o=>o.target.select()})}),o("br",{}),e("div",{className:w.inputAndButton,children:[o(p,{appearance:"primary",title:C("Kopiera länk"),icon:"CopyRegular",onClick:()=>{y&&(navigator.clipboard.writeText(y),P(!0),setTimeout((()=>{P(!1),$(void 0)}),2e3))},children:C("Kopiera")}),D&&o(p,{appearance:"primary",title:C("Dela länk"),icon:"ShareRegular",onClick:()=>{y&&(navigator.share({url:y}),setTimeout((()=>{$(void 0)}),2e3))},children:C("Dela")})]}),M&&o(c,{children:C("Länk kopierad!")})]})]})})})};export{w 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{makeStyles as i,useId as a,Dropdown as s,Option as m}from"@fluentui/react-components";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as p}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as l}from"../components/Title.js";import"../components/Spinner.js";import{Label as c}from"../components/Label.js";import{Input as d}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"@fluentui/react-icons";import u 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 j}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 h}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 k from"../components/Content.js";import{Page as g}from"../components/Page.js";import"./QrScan.js";import f from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"react-router-dom";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const v=i({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"}}),w=({state:i})=>{const w=v(),{service:b}=i,{t:C}=f(),[S,x]=u(i.context.selectedApp+"_forms",[]),[y,$]=n(),[L,M]=n(),[P,B]=n(!1),[_,A]=n(),D=a("form-dropdown");r((()=>{b.getForms().then((o=>{o.sort(((o,e)=>o.name.localeCompare(e.name))),x(o)}))}),[b,C,x]);const T=void 0!==navigator.share;return o(g,{children:o("div",{className:w.container,style:{backgroundImage:`url(${j("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:e(k,{children:[o(l,{children:C("Skapa länk till formulär")}),o("p",{className:w.instructionParagraph,children:C("Instruktioner")}),e("ol",{className:w.orderedList,children:[o("li",{children:C("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:C("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:C("När länken visas, kan du klicka på kopiera-ikonen för att kopiera länken till ditt urklipp.")}),o("li",{children:C("Om din enhet stödjer det, kan du även använda dela-knappen för att dela länken direkt.")}),o("li",{children:C("Kom ihåg att spara (skriva ner) koden")})]}),o("label",{id:D,className:w.instructionParagraph,children:C("Välj formulär")}),o(s,{"aria-labelledby":D,placeholder:"-",onOptionSelect:(o,e)=>A(e.optionValue),children:S.map((o=>e(m,{value:o.name,text:`${o.title} (${o.name})`,children:[`${o.title} (${o.name})`," "]},o.name)))}),o(p,{appearance:"primary",disabled:!_,onClick:()=>{const o=S.find((o=>o.name===_));o?.url?b.sendMessage(`#ss-link #${_}`).then((e=>{const t=new Date(Date.now()+2592e5);b.generateApiToken(t).then((t=>{const n=o.url.includes("?")?"&":"?",r=`${o.url}${n}token=${t}`;$(r);const i=h(e);M(i)}))})):b.sendMessage(`#ss-link #${_}`).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=h(o);M(t)}))},children:C("Skapa länk")}),y&&e(t,{children:[o("p",{className:w.generatedLinkTitle,children:C("Här är din genererade länk (du kan kopiera eller dela den):")}),o("div",{className:w.inputAndButton,children:o(d,{className:w.input,value:y,readOnly:!0,onFocus:o=>o.target.select()})}),o("br",{}),e("div",{className:w.inputAndButton,children:[o(p,{appearance:"primary",title:C("Kopiera länk"),icon:"CopyRegular",onClick:()=>{y&&(navigator.clipboard.writeText(y),B(!0),setTimeout((()=>{B(!1),$(void 0)}),2e3))},children:C("Kopiera")}),T&&o(p,{appearance:"primary",title:C("Dela länk"),icon:"ShareRegular",onClick:()=>{y&&(navigator.share({url:y}),setTimeout((()=>{$(void 0)}),2e3))},children:C("Dela")})]}),P&&o(c,{children:C("Länk kopierad!")})]})]})})})};export{w as default};
@@ -1 +1 @@
1
- import{jsx as o,jsxs as t}from"react/jsx-runtime";import{Spinner as e}from"@fluentui/react-components";import{useState as s,useEffect as i}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.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"@fluentui/react-icons";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"../components/Content.js";import{Page as r}from"../components/Page.js";import"./QrScan.js";import"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"react-router-dom";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import m from"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const p=({state:p})=>{const c=window.location.hash.match(/^#\/html\/(.+)$/),a=c?decodeURIComponent(c[1]):"",[l,d]=s(),[j,h]=s(!1),[u,g]=s(),{service:f}=p;return i((()=>{a&&f?(h(!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((()=>{h(!1)}))):g("No tag provided or service unavailable")}),[a,f]),j?o(r,{hideHeader:!0,hideFooter:!0,children:o("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:o(e,{})})}):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(n,{children:u}),t(n,{children:["Tag: ",a]})]})}):l?o(m,{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(n,{children:"No HTML content available"})})})};export{p as default};
1
+ import{jsx as o,jsxs as t}from"react/jsx-runtime";import{Spinner as e}from"@fluentui/react-components";import{useState as s,useEffect as i}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.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"@fluentui/react-icons";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"../components/Content.js";import{Page as r}from"../components/Page.js";import"./QrScan.js";import"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"react-router-dom";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import m from"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const p=({state:p})=>{const c=window.location.hash.match(/^#\/html\/(.+)$/),a=c?decodeURIComponent(c[1]):"",[l,d]=s(),[j,h]=s(!1),[u,g]=s(),{service:f}=p;return i((()=>{a&&f?(h(!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((()=>{h(!1)}))):g("No tag provided or service unavailable")}),[a,f]),j?o(r,{hideHeader:!0,hideFooter:!0,children:o("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:o(e,{})})}):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(n,{children:u}),t(n,{children:["Tag: ",a]})]})}):l?o(m,{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(n,{children:"No HTML content available"})})})};export{p as default};
@@ -1 +1 @@
1
- import{jsxs as o,jsx as t,Fragment as e}from"react/jsx-runtime";import i,{useState as n}from"react";import{makeStyles as r,Image as s,Input as m,mergeClasses as a}from"@fluentui/react-components";import"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as p}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as c}from"../components/Title.js";import{Text as l}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"@fluentui/react-icons";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as j}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"../components/QrCodeDialog.js";import"../components/QrScanner.js";import d from"../hooks/useLocalization.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.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"./QrScan.js";import"react-dom/client";import"react-router-dom";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import g from"../hooks/useAppStyles.js";const u=r({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:r})=>{const{loginWithRedirect:h,loginPasswordless:_}=r.auth,I=u(),f=g(),{t:E}=d(),[b,k]=n(""),[L,C]=n(!1),N=j("LOGIN_REDIRECT"),O=j("AUTH0_PASSWORDLESS_ENABLED");i.useEffect((()=>{N&&h()}),[N]);return o("div",N?{className:I.container,style:{backgroundImage:`url(${j("HOME_BACKGROUND_IMAGE_URL")})`},children:[t(c,{children:`${E("Välkommen till")} ${j("INDEX_TITLE")}!`}),t(l,{size:400,children:E("Omdirigerar till inloggning...")})]}:{className:I.container,style:{backgroundImage:`url(${j("HOME_BACKGROUND_IMAGE_URL")})`},children:[j("LOGIN_LOGO_URL")&&t(s,{src:j("LOGIN_LOGO_URL"),alt:j("INDEX_TITLE"),className:I.image}),!j("LOGIN_HIDE_WELCOME")&&t(c,{children:`${E("Välkommen till")} ${j("INDEX_TITLE")}!`}),t(l,{size:400,children:E(j("LOGIN_WELCOME_TEXT")||"Logga in, eller registrera ett konto, för att komma igång.")}),o(e,O?{children:[t(m,{className:I.input,type:"email",placeholder:E("Ange din e-postadress"),value:b,onChange:o=>k(o.target.value),disabled:L}),t(p,{className:a(f.button,I.button),size:"large",appearance:"primary",onClick:async()=>{if(b.trim()){C(!0);try{await _(b)}catch(o){console.error("Passwordless login failed:",o)}finally{C(!1)}}},disabled:!b.trim()||L,children:E(L?"Skickar...":"Skicka inloggningslänk")})]}:{children:[t(p,{className:a(f.button,I.button),size:"large",appearance:"primary",onClick:()=>h(),children:E("Logga in")}),!j("HIDE_REGISTER_BUTTON")&&t(p,{className:a(f.button,I.button),size:"large",appearance:"primary",onClick:()=>h({authorizationParams:{screen_hint:"signup"}}),children:E("Registrera")})]})]})};export{h as default};
1
+ import{jsxs as o,jsx as t,Fragment as e}from"react/jsx-runtime";import i,{useState as n}from"react";import{makeStyles as r,Image as s,Input as m,mergeClasses as a}from"@fluentui/react-components";import"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as p}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as c}from"../components/Title.js";import{Text as l}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"@fluentui/react-icons";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as j}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/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import d from"../hooks/useLocalization.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.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"./QrScan.js";import"react-dom/client";import"react-router-dom";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import g from"../hooks/useAppStyles.js";const u=r({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:r})=>{const{loginWithRedirect:h,loginPasswordless:_}=r.auth,I=u(),f=g(),{t:E}=d(),[b,k]=n(""),[L,C]=n(!1),N=j("LOGIN_REDIRECT"),O=j("AUTH0_PASSWORDLESS_ENABLED");i.useEffect((()=>{N&&h()}),[N]);return o("div",N?{className:I.container,style:{backgroundImage:`url(${j("HOME_BACKGROUND_IMAGE_URL")})`},children:[t(c,{children:`${E("Välkommen till")} ${j("INDEX_TITLE")}!`}),t(l,{size:400,children:E("Omdirigerar till inloggning...")})]}:{className:I.container,style:{backgroundImage:`url(${j("HOME_BACKGROUND_IMAGE_URL")})`},children:[j("LOGIN_LOGO_URL")&&t(s,{src:j("LOGIN_LOGO_URL"),alt:j("INDEX_TITLE"),className:I.image}),!j("LOGIN_HIDE_WELCOME")&&t(c,{children:`${E("Välkommen till")} ${j("INDEX_TITLE")}!`}),t(l,{size:400,children:E(j("LOGIN_WELCOME_TEXT")||"Logga in, eller registrera ett konto, för att komma igång.")}),o(e,O?{children:[t(m,{className:I.input,type:"email",placeholder:E("Ange din e-postadress"),value:b,onChange:o=>k(o.target.value),disabled:L}),t(p,{className:a(f.button,I.button),size:"large",appearance:"primary",onClick:async()=>{if(b.trim()){C(!0);try{await _(b)}catch(o){console.error("Passwordless login failed:",o)}finally{C(!1)}}},disabled:!b.trim()||L,children:E(L?"Skickar...":"Skicka inloggningslänk")})]}:{children:[t(p,{className:a(f.button,I.button),size:"large",appearance:"primary",onClick:()=>h(),children:E("Logga in")}),!j("HIDE_REGISTER_BUTTON")&&t(p,{className:a(f.button,I.button),size:"large",appearance:"primary",onClick:()=>h({authorizationParams:{screen_hint:"signup"}}),children:E("Registrera")})]})]})};export{h as default};
@@ -1 +1 @@
1
- import{jsxs as o,jsx as t}from"react/jsx-runtime";import{makeStyles as e,tokens as r}from"@fluentui/react-components";import{useState as i,useEffect as n}from"react";import{Link as s}from"react-router-dom";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as m}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as p}from"../components/Title.js";import{Text as a}from"../components/Text.js";import{Spinner as c}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"@fluentui/react-icons";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"./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"../components/Content.js";import"../components/Page.js";import"./QrScan.js";import"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const d=e({container:{display:"flex",flexDirection:"column",alignItems:"center",gap:"20px",padding:"20px"},pricing:{padding:"20px",paddingLeft:"30px",border:"1px solid #ccc",borderRadius:"8px",backgroundColor:r.colorNeutralBackground1}}),j=({state:e})=>{const r=d(),[j,u]=i(!1),{service:g,stateMachine:h}=e,{updateContext:f}=h;n((()=>{new URLSearchParams(window.location.search).get("session_id")&&f({hasValidPurchase:void 0})}),[]);return o("div",{className:r.container,children:[t(p,{children:"Starta ditt abonnemang"}),t("div",{className:r.pricing,children:o("ul",{children:[t("li",{children:t(a,{size:400,children:"Kreditkort krävs inte"})}),t("li",{children:t(a,{size:400,children:"Gratis de 2 första månaderna"})}),t("li",{children:t(a,{size:400,children:"Därefter 89 kr/månad"})})]})}),t(m,{appearance:"primary",onClick:async()=>{try{u(!0),await g.redirectToCheckout(l("STRIPE_PRICE_ID"))}catch(o){console.error("Purchase error:",o)}finally{u(!1)}},disabled:j,children:j?t(c,{size:"tiny"}):"Starta abonnemang"}),t("div",{children:o(a,{size:400,children:["Har du redan ett abonnemang? Kanske har du loggat in med fel konto. ",t(s,{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{makeStyles as e,tokens as r}from"@fluentui/react-components";import{useState as i,useEffect as n}from"react";import{Link as s}from"react-router-dom";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as m}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as p}from"../components/Title.js";import{Text as a}from"../components/Text.js";import{Spinner as c}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"@fluentui/react-icons";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"./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"../components/Content.js";import"../components/Page.js";import"./QrScan.js";import"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const d=e({container:{display:"flex",flexDirection:"column",alignItems:"center",gap:"20px",padding:"20px"},pricing:{padding:"20px",paddingLeft:"30px",border:"1px solid #ccc",borderRadius:"8px",backgroundColor:r.colorNeutralBackground1}}),j=({state:e})=>{const r=d(),[j,u]=i(!1),{service:g,stateMachine:h}=e,{updateContext:f}=h;n((()=>{new URLSearchParams(window.location.search).get("session_id")&&f({hasValidPurchase:void 0})}),[]);return o("div",{className:r.container,children:[t(p,{children:"Starta ditt abonnemang"}),t("div",{className:r.pricing,children:o("ul",{children:[t("li",{children:t(a,{size:400,children:"Kreditkort krävs inte"})}),t("li",{children:t(a,{size:400,children:"Gratis de 2 första månaderna"})}),t("li",{children:t(a,{size:400,children:"Därefter 89 kr/månad"})})]})}),t(m,{appearance:"primary",onClick:async()=>{try{u(!0),await g.redirectToCheckout(l("STRIPE_PRICE_ID"))}catch(o){console.error("Purchase error:",o)}finally{u(!1)}},disabled:j,children:j?t(c,{size:"tiny"}):"Starta abonnemang"}),t("div",{children:o(a,{size:400,children:["Har du redan ett abonnemang? Kanske har du loggat in med fel konto. ",t(s,{to:"/logout",children:"Logga ut"})," och sedan in igen för att komma igång."]})})]})};export{j as Purchase,j as default};
@@ -1 +1 @@
1
- import{jsx as o,jsxs as e,Fragment as t}from"react/jsx-runtime";import{useState as n,useCallback as i,useEffect as r}from"react";import{makeStyles as s,tokens as a,shorthands as c,Image as l,mergeClasses as p}from"@fluentui/react-components";import{useNavigate as m}from"react-router-dom";import"../components/Markdown.js";import{Textarea as d}from"../components/Textarea.js";import{Button as h}from"../components/Button.js";import"../components/CompoundButton.js";import{Text as g}from"../components/Text.js";import"../components/Spinner.js";import{Input as u}from"../components/Input.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import{Dialog as j,DialogTitle as f,DialogContent as x,DialogActions as C}from"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"@fluentui/react-icons";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as k}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"./Purchase.js";import"../components/Content.js";import{Page as b}from"../components/Page.js";import"./QrScan.js";import w from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{QrCodeDialog as v}from"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const _=s({root:{display:"flex",flexDirection:"column",height:"100%",touchAction:"pan-y"},header:{display:"flex",justifyContent:"space-between",alignItems:"center",color:a.colorNeutralForegroundOnBrand,...c.padding("10px","20px")},logo:{maxWidth:"100px",maxHeight:"50px",height:"auto",cursor:"pointer"},inputContainer:{display:"flex",justifyContent:"flex-end",alignItems:"center",maxWidth:"300px",width:"200px",paddingLeft:"10px"},dashboard:{display:"flex",justifyContent:"space-around",width:"100%",marginTop:"20px"},statBox:{...c.padding("10px"),...c.borderRadius("12px"),minWidth:"50px",textAlign:"center",color:"white"},buttonContainer:{display:"flex",flexDirection:"column",height:"100%",justifyContent:"center",gap:"30px",alignItems:"center",...c.padding("20px")},actionButton:{width:"14rem",minWidth:"15rem",height:"3rem"},textAreaContainer:{display:"flex",flexDirection:"column",gap:"10px"},opened:{backgroundColor:"#1a5614"},not_home:{backgroundColor:"#f44336"},sales:{backgroundColor:"#2196F3"},call_back:{backgroundColor:"#FF9800"},backButton:{position:"absolute",top:"10px",left:"10px",zIndex:1e3}}),y={opened:"#1a5614",not_home:"#f44336",sales:"#2196F3",call_back:"#FF9800"},I=()=>{const s=_(),{t:c}=w(),I=m(),[A,P]=n(""),[F,B]=n(),[$,N]=n({opened:0,not_home:0,sales:0,call_back:0}),[M,S]=n([]),[D,L]=n(!1),[O,T]=n(""),[H,z]=n(""),[R,U]=n(""),[E,G]=n(!1),[W,Q]=n(!1),[V,K]=n(!1),q={backgroundColor:k("APP_HEADER_COLOR")||a.colorBrandBackground},J=i((()=>new Promise((o=>{navigator.geolocation?navigator.geolocation.getCurrentPosition((e=>{const t=`#position (${e.coords.latitude},${e.coords.longitude})`;o(t)})):o(void 0)}))),[B]);r((()=>{window.Codicent.getDataMessages({codicent:k("APP_NAME"),tags:["sales_code"]}).then((o=>{o=o.filter((o=>"1"!==o.data.inactive)),S(o)})).catch(console.error),J()}),[]);const X=async()=>{if(!A)return;const o=["not_home","sales","call_back","opened"],e=new Date;e.setHours(0,0,0,0);const t={...$};for(const n of o){const o=await window.Codicent.getMessages({search:`#${n} #sales_code_${A}`,afterTimestamp:e,length:1e4});t[n]=o.filter((o=>o.content.includes(`#${n} `)&&o.content.includes(`#sales_code_${A}`))).length}N(t)},Y=async(o,e="")=>{const t=await J();console.log("Got position",t);const n=`@${k("APP_NAME")} #sales_code_${A} #${o} ${t||""} ${e.trim().length>0?"#comment ":""}${e}`.trim();await window.Codicent.postMessage({message:n}),X()};return o(b,{hideHeader:!0,children:e("div",{className:s.root,children:[o("div",{className:s.backButton,children:o(h,{appearance:"subtle",icon:"ArrowLeft24Regular",onClick:()=>I(-1),children:c("Tillbaka")})}),e("div",{className:s.header,style:q,children:[o(l,{src:H||k("APP_ICON_URL")||"https://via.placeholder.com/100",className:s.logo,onClick:()=>{H?K(!0):R&&Q(!0)}}),o("div",{className:s.inputContainer,children:o(u,{value:A,onChange:o=>P(o.target.value),onBlur:()=>{const o=M.find((o=>o.data.code===A));if(o)z(`https://codicent.com/app/GetImage?fileId=${o.fileId}&width=100`),U(o.data.link),G(!0),X();else{const o=M.find((o=>o.data.code2===A.toUpperCase()));o?(z(`https://codicent.com/app/GetImage?fileId=${o.fileIds&&o.fileIds.length>1?o.fileIds[1]:o.fileId}&width=100`),U(o.data.link2),G(!0),X()):(G(!1),alert(c("Fel försäljningskod!")))}},placeholder:c("Fyll i försäljningskod"),maxLength:16,size:"large"})})]}),E&&e(t,{children:[o("div",{className:s.dashboard,children:Object.keys($).map((e=>{return o("div",{className:(t=e,p(s.statBox,s[t])),children:o(g,{weight:"bold",size:400,children:$[e]})},e);var t}))}),o("div",{className:s.buttonContainer,children:Object.entries(y).map((([e,t])=>o(h,{size:"large",className:s.actionButton,style:{backgroundColor:t,color:"white"},onClick:()=>{Y(e),"opened"===e&&L(!0),"sales"===e&&Q(!0)},children:e.charAt(0).toUpperCase()+e.slice(1).replace("_"," ")},e)))}),e(j,{open:D,children:[o(f,{children:c("Skriv in avvikelse")}),o(x,{children:o("div",{className:s.textAreaContainer,children:o(d,{value:O,onChange:o=>T(o.target.value),placeholder:c("Skriv din text här..."),rows:4,size:"large"})})}),o(C,{children:o(h,{appearance:"primary",onClick:()=>{Y("anomaly",`\n${O}`),L(!1),T("")},children:c("Spara")})})]}),e(j,{open:W,children:[o(f,{children:c("Godkännande")}),o(x,{children:c("Är kunden över 23 år?")}),e(C,{children:[o(h,{appearance:"primary",onClick:()=>window.open(R,"_blank"),children:c("OK")}),o(h,{appearance:"secondary",onClick:()=>Q(!1),children:c("Avbryt")})]})]})]}),o(v,{isOpen:V,onDismiss:()=>K(!1),imageUrl:H})]})})};export{I as Sales,I as default};
1
+ import{jsx as o,jsxs as e,Fragment as t}from"react/jsx-runtime";import{useState as n,useCallback as i,useEffect as r}from"react";import{makeStyles as s,tokens as a,shorthands as c,Image as p,mergeClasses as l}from"@fluentui/react-components";import{useNavigate as m}from"react-router-dom";import"../components/Markdown.js";import{Textarea as d}from"../components/Textarea.js";import{Button as h}from"../components/Button.js";import"../components/CompoundButton.js";import{Text as g}from"../components/Text.js";import"../components/Spinner.js";import{Input as u}from"../components/Input.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import{Dialog as j,DialogTitle as f,DialogContent as x,DialogActions as C}from"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"@fluentui/react-icons";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as k}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"./Purchase.js";import"../components/Content.js";import{Page as b}from"../components/Page.js";import"./QrScan.js";import w from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import{QrCodeDialog as v}from"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const _=s({root:{display:"flex",flexDirection:"column",height:"100%",touchAction:"pan-y"},header:{display:"flex",justifyContent:"space-between",alignItems:"center",color:a.colorNeutralForegroundOnBrand,...c.padding("10px","20px")},logo:{maxWidth:"100px",maxHeight:"50px",height:"auto",cursor:"pointer"},inputContainer:{display:"flex",justifyContent:"flex-end",alignItems:"center",maxWidth:"300px",width:"200px",paddingLeft:"10px"},dashboard:{display:"flex",justifyContent:"space-around",width:"100%",marginTop:"20px"},statBox:{...c.padding("10px"),...c.borderRadius("12px"),minWidth:"50px",textAlign:"center",color:"white"},buttonContainer:{display:"flex",flexDirection:"column",height:"100%",justifyContent:"center",gap:"30px",alignItems:"center",...c.padding("20px")},actionButton:{width:"14rem",minWidth:"15rem",height:"3rem"},textAreaContainer:{display:"flex",flexDirection:"column",gap:"10px"},opened:{backgroundColor:"#1a5614"},not_home:{backgroundColor:"#f44336"},sales:{backgroundColor:"#2196F3"},call_back:{backgroundColor:"#FF9800"},backButton:{position:"absolute",top:"10px",left:"10px",zIndex:1e3}}),y={opened:"#1a5614",not_home:"#f44336",sales:"#2196F3",call_back:"#FF9800"},I=()=>{const s=_(),{t:c}=w(),I=m(),[A,P]=n(""),[F,B]=n(),[$,M]=n({opened:0,not_home:0,sales:0,call_back:0}),[N,D]=n([]),[S,L]=n(!1),[O,T]=n(""),[H,z]=n(""),[R,U]=n(""),[E,G]=n(!1),[W,Q]=n(!1),[V,K]=n(!1),q={backgroundColor:k("APP_HEADER_COLOR")||a.colorBrandBackground},J=i((()=>new Promise((o=>{navigator.geolocation?navigator.geolocation.getCurrentPosition((e=>{const t=`#position (${e.coords.latitude},${e.coords.longitude})`;o(t)})):o(void 0)}))),[B]);r((()=>{window.Codicent.getDataMessages({codicent:k("APP_NAME"),tags:["sales_code"]}).then((o=>{o=o.filter((o=>"1"!==o.data.inactive)),D(o)})).catch(console.error),J()}),[]);const X=async()=>{if(!A)return;const o=["not_home","sales","call_back","opened"],e=new Date;e.setHours(0,0,0,0);const t={...$};for(const n of o){const o=await window.Codicent.getMessages({search:`#${n} #sales_code_${A}`,afterTimestamp:e,length:1e4});t[n]=o.filter((o=>o.content.includes(`#${n} `)&&o.content.includes(`#sales_code_${A}`))).length}M(t)},Y=async(o,e="")=>{const t=await J();console.log("Got position",t);const n=`@${k("APP_NAME")} #sales_code_${A} #${o} ${t||""} ${e.trim().length>0?"#comment ":""}${e}`.trim();await window.Codicent.postMessage({message:n}),X()};return o(b,{hideHeader:!0,children:e("div",{className:s.root,children:[o("div",{className:s.backButton,children:o(h,{appearance:"subtle",icon:"ArrowLeft24Regular",onClick:()=>I(-1),children:c("Tillbaka")})}),e("div",{className:s.header,style:q,children:[o(p,{src:H||k("APP_ICON_URL")||"https://via.placeholder.com/100",className:s.logo,onClick:()=>{H?K(!0):R&&Q(!0)}}),o("div",{className:s.inputContainer,children:o(u,{value:A,onChange:o=>P(o.target.value),onBlur:()=>{const o=N.find((o=>o.data.code===A));if(o)z(`https://codicent.com/app/GetImage?fileId=${o.fileId}&width=100`),U(o.data.link),G(!0),X();else{const o=N.find((o=>o.data.code2===A.toUpperCase()));o?(z(`https://codicent.com/app/GetImage?fileId=${o.fileIds&&o.fileIds.length>1?o.fileIds[1]:o.fileId}&width=100`),U(o.data.link2),G(!0),X()):(G(!1),alert(c("Fel försäljningskod!")))}},placeholder:c("Fyll i försäljningskod"),maxLength:16,size:"large"})})]}),E&&e(t,{children:[o("div",{className:s.dashboard,children:Object.keys($).map((e=>{return o("div",{className:(t=e,l(s.statBox,s[t])),children:o(g,{weight:"bold",size:400,children:$[e]})},e);var t}))}),o("div",{className:s.buttonContainer,children:Object.entries(y).map((([e,t])=>o(h,{size:"large",className:s.actionButton,style:{backgroundColor:t,color:"white"},onClick:()=>{Y(e),"opened"===e&&L(!0),"sales"===e&&Q(!0)},children:e.charAt(0).toUpperCase()+e.slice(1).replace("_"," ")},e)))}),e(j,{open:S,children:[o(f,{children:c("Skriv in avvikelse")}),o(x,{children:o("div",{className:s.textAreaContainer,children:o(d,{value:O,onChange:o=>T(o.target.value),placeholder:c("Skriv din text här..."),rows:4,size:"large"})})}),o(C,{children:o(h,{appearance:"primary",onClick:()=>{Y("anomaly",`\n${O}`),L(!1),T("")},children:c("Spara")})})]}),e(j,{open:W,children:[o(f,{children:c("Godkännande")}),o(x,{children:c("Är kunden över 23 år?")}),e(C,{children:[o(h,{appearance:"primary",onClick:()=>window.open(R,"_blank"),children:c("OK")}),o(h,{appearance:"secondary",onClick:()=>Q(!1),children:c("Avbryt")})]})]})]}),o(v,{isOpen:V,onDismiss:()=>K(!1),imageUrl:H})]})})};export{I as Sales,I as default};
@@ -1 +1 @@
1
- import{jsx as o,jsxs as t}from"react/jsx-runtime";import{useRef as e,useState as n,useEffect as r}from"react";import{makeStyles as i,tokens as s}from"@fluentui/react-components";import a from"../components/Markdown.js";import"../components/Textarea.js";import{Button as p}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as m}from"../components/Title.js";import"../components/Spinner.js";import"../components/TextHeader.js";import c from"../components/TypingIndicator.js";import"../components/Dialog.js";import l from"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"@fluentui/react-icons";import d 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"./Chat.js";import"./Compose.js";import"./Snap.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"../components/Content.js";import{Page as j}from"../components/Page.js";import"./QrScan.js";import h from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"react-router-dom";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import{useChat as f}from"../hooks/useChat.js";import{useTemplateVariables as x}from"../hooks/useTemplateVariables.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const C=i({chatContainer:{width:"100%",flex:1,maxWidth:"800px",height:"100%",backgroundColor:"#ffffff",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",overflowY:"auto",marginBottom:"16px"},chatMessages:{display:"flex",flexDirection:"column",flex:1,padding:"16px",overflowY:"auto",touchAction:"pan-y"},inputArea:{display:"flex",flexDirection:"column",justifyContent:"start",alignItems:"center",height:"100%",padding:"0 16px"},promptButtons:{display:"flex",flexDirection:"row",flexWrap:"wrap",justifyContent:"start",alignItems:"center",gap:"8px",marginTop:"8px",marginLeft:"6px",marginRight:"2px",marginBottom:"12px"},answerArea:{width:"100%",marginLeft:"12px",marginRight:"12px",padding:"12px",borderRadius:"16px",marginBottom:"24px"},title:{marginLeft:"12px",padding:"16px"}}),A=({state:i})=>{const A=C(),{t:w}=h(),{messages:T,isBotTyping:_,handleSend:v,newChat:S}=f(i.stateMachine),N=e(null),{service:b}=i;g("CHAT_BOT_BACKGROUND_COLOR")||s.colorBrandBackground2;const[O,k]=d(i.context.selectedApp+"_searchprompts",["Leta information","Vad kan jag göra?","Sök supportställe"]),[y,I]=n(),[B,M]=n(null),[P,D]=n(!1);x(b.uploadFile);r((()=>{_&&D(!0)}),[_]),r((()=>{S();const o=g("APP_CONFIG"),t=g("APP_BUTTONS");t?o.apps[t].questions&&k(o.apps[t].questions.map((o=>w(o)))):console.error("APP_BUTTONS is not defined in the configuration."),void 0!==g("ANONYMOUS_CODICENT")&&void 0!==g("ANONYMOUS_TOKEN")?(b.codicent=g("ANONYMOUS_CODICENT"),b.setToken(g("ANONYMOUS_TOKEN"))):console.error("Anonymous Codicent or Token is not defined in the configuration.")}),[S,b,k,w]),r((()=>{setTimeout((()=>{N.current?.scrollIntoView({behavior:"smooth"})}),10)}),[T]);const F=o=>{I(o),v(o)};return r((()=>{const o=T.filter((o=>"bot"===o.sender));let t=o.length>0?o[o.length-1]:null;M({...t,createdAt:new Date}),t&&D(!1)}),[T]),o(j,{hideHeader:!0,hideFooter:!0,children:t("div",{id:"search-container",className:A.chatContainer,style:{backgroundImage:`url(${g("CHAT_BACKGROUND_IMAGE_URL")})`},children:[o("div",{className:A.title,children:o(m,{children:w(g("APP_SEARCH_TITLE")||"Frågor")})}),t("div",{className:A.inputArea,children:[o(l,{noMemory:!0,defaultText:y,codicent:i.context.selectedApp,disableSend:_,onSend:F,rows:3,getImageUrl:u.getImageUrl,getFileInfo:o=>b.getFileInfo(o),selectAll:!0}),o("div",{className:A.promptButtons,children:O.length>0&&O.map(((t,e)=>o(p,{onClick:()=>F(t),size:"large",appearance:"primary",shape:"circular",children:t},`search-prompt-${e}`)))}),P&&o(c,{}),B&&!_&&t("div",{className:A.answerArea,children:[o("div",{ref:N}),o(a,{content:B.content})]})]})]})})};export{A as default};
1
+ import{jsx as o,jsxs as t}from"react/jsx-runtime";import{useRef as e,useState as n,useEffect as r}from"react";import{makeStyles as i,tokens as s}from"@fluentui/react-components";import a from"../components/Markdown.js";import"../components/Textarea.js";import{Button as p}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as m}from"../components/Title.js";import"../components/Spinner.js";import"../components/TextHeader.js";import c from"../components/TypingIndicator.js";import"../components/Dialog.js";import l from"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"@fluentui/react-icons";import d 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"./Chat.js";import"./Compose.js";import"./Snap.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"../components/Content.js";import{Page as j}from"../components/Page.js";import"./QrScan.js";import h from"../hooks/useLocalization.js";import"../components/FileThumbnail.js";import"react-dom/client";import"react-router-dom";import"../node_modules/@auth0/auth0-react/dist/auth0-react.esm.js";import{useChat as f}from"../hooks/useChat.js";import{useTemplateVariables as x}from"../hooks/useTemplateVariables.js";import"../hooks/useAppStyles.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/DataMessagePicker.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/QrCodeDialog.js";import"../components/QrScanner.js";import"../components/OfflineMessage.js";import"../components/LanguageSelector.js";import"../components/ListView.js";import"../components/RecordModal.js";import"../components/BulkUploadDialog.js";import"../components/CookieBanner.js";const C=i({chatContainer:{width:"100%",flex:1,maxWidth:"800px",height:"100%",backgroundColor:"#ffffff",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",overflowY:"auto",marginBottom:"16px"},chatMessages:{display:"flex",flexDirection:"column",flex:1,padding:"16px",overflowY:"auto",touchAction:"pan-y"},inputArea:{display:"flex",flexDirection:"column",justifyContent:"start",alignItems:"center",height:"100%",padding:"0 16px"},promptButtons:{display:"flex",flexDirection:"row",flexWrap:"wrap",justifyContent:"start",alignItems:"center",gap:"8px",marginTop:"8px",marginLeft:"6px",marginRight:"2px",marginBottom:"12px"},answerArea:{width:"100%",marginLeft:"12px",marginRight:"12px",padding:"12px",borderRadius:"16px",marginBottom:"24px"},title:{marginLeft:"12px",padding:"16px"}}),A=({state:i})=>{const A=C(),{t:w}=h(),{messages:T,isBotTyping:_,handleSend:v,newChat:S}=f(i.stateMachine),N=e(null),{service:b}=i;g("CHAT_BOT_BACKGROUND_COLOR")||s.colorBrandBackground2;const[k,O]=d(i.context.selectedApp+"_searchprompts",["Leta information","Vad kan jag göra?","Sök supportställe"]),[y,I]=n(),[B,M]=n(null),[P,D]=n(!1);x(b.uploadFile);r((()=>{_&&D(!0)}),[_]),r((()=>{S();const o=g("APP_CONFIG"),t=g("APP_BUTTONS");t?o.apps[t].questions&&O(o.apps[t].questions.map((o=>w(o)))):console.error("APP_BUTTONS is not defined in the configuration."),void 0!==g("ANONYMOUS_CODICENT")&&void 0!==g("ANONYMOUS_TOKEN")?(b.codicent=g("ANONYMOUS_CODICENT"),b.setToken(g("ANONYMOUS_TOKEN"))):console.error("Anonymous Codicent or Token is not defined in the configuration.")}),[S,b,O,w]),r((()=>{setTimeout((()=>{N.current?.scrollIntoView({behavior:"smooth"})}),10)}),[T]);const F=o=>{I(o),v(o)};return r((()=>{const o=T.filter((o=>"bot"===o.sender));let t=o.length>0?o[o.length-1]:null;M({...t,createdAt:new Date}),t&&D(!1)}),[T]),o(j,{hideHeader:!0,hideFooter:!0,children:t("div",{id:"search-container",className:A.chatContainer,style:{backgroundImage:`url(${g("CHAT_BACKGROUND_IMAGE_URL")})`},children:[o("div",{className:A.title,children:o(m,{children:w(g("APP_SEARCH_TITLE")||"Frågor")})}),t("div",{className:A.inputArea,children:[o(l,{noMemory:!0,defaultText:y,codicent:i.context.selectedApp,disableSend:_,onSend:F,rows:3,getImageUrl:u.getImageUrl,getFileInfo:o=>b.getFileInfo(o),selectAll:!0}),o("div",{className:A.promptButtons,children:k.length>0&&k.map(((t,e)=>o(p,{onClick:()=>F(t),size:"large",appearance:"primary",shape:"circular",children:t},`search-prompt-${e}`)))}),P&&o(c,{}),B&&!_&&t("div",{className:A.answerArea,children:[o("div",{ref:N}),o(a,{content:B.content})]})]})]})})};export{A as default};