codicent-app-sdk 0.3.97 → 0.3.98

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 (106) hide show
  1. package/dist/cjs/components/AiInput.js +1 -1
  2. package/dist/cjs/components/AudioIcon.js +1 -1
  3. package/dist/cjs/components/ChatInput.js +1 -1
  4. package/dist/cjs/components/ChatMessage.js +1 -1
  5. package/dist/cjs/components/CombinedPlaceholderDialog.js +1 -1
  6. package/dist/cjs/components/Footer.js +1 -1
  7. package/dist/cjs/components/Header.js +1 -1
  8. package/dist/cjs/components/HtmlView.js +1 -1
  9. package/dist/cjs/components/MessageInput.js +1 -1
  10. package/dist/cjs/components/MessageItem.js +1 -1
  11. package/dist/cjs/components/Profile.js +1 -1
  12. package/dist/cjs/components/Prompt.js +1 -1
  13. package/dist/cjs/components/SnapFooter.js +1 -1
  14. package/dist/cjs/components/TextHeader.js +1 -1
  15. package/dist/cjs/components/TypingIndicator.js +1 -1
  16. package/dist/cjs/components/UploadFile.js +1 -1
  17. package/dist/cjs/components/UrlProcessor.js +1 -1
  18. package/dist/cjs/components/VoiceIcon.js +1 -1
  19. package/dist/cjs/config/index.d.ts +1 -0
  20. package/dist/cjs/config/index.d.ts.map +1 -1
  21. package/dist/cjs/config/index.js +1 -1
  22. package/dist/cjs/hooks/index.d.ts +1 -0
  23. package/dist/cjs/hooks/index.d.ts.map +1 -1
  24. package/dist/cjs/hooks/useAuthState.d.ts +1 -0
  25. package/dist/cjs/hooks/useAuthState.d.ts.map +1 -1
  26. package/dist/cjs/hooks/useAuthState.js +1 -1
  27. package/dist/cjs/hooks/useCodicentApp.d.ts +5 -2
  28. package/dist/cjs/hooks/useCodicentApp.d.ts.map +1 -1
  29. package/dist/cjs/hooks/useCodicentApp.js +1 -1
  30. package/dist/cjs/hooks/useCodicentState.js +1 -1
  31. package/dist/cjs/hooks/useTools.d.ts +20 -2
  32. package/dist/cjs/hooks/useTools.d.ts.map +1 -1
  33. package/dist/cjs/hooks/useTools.js +1 -1
  34. package/dist/cjs/index.js +1 -1
  35. package/dist/cjs/pages/AppFrame.js +1 -1
  36. package/dist/cjs/pages/Chat.js +1 -1
  37. package/dist/cjs/pages/Compose.js +1 -1
  38. package/dist/cjs/pages/CrmPage.js +1 -1
  39. package/dist/cjs/pages/CrmPagePersistent.d.ts +8 -0
  40. package/dist/cjs/pages/CrmPagePersistent.d.ts.map +1 -0
  41. package/dist/cjs/pages/CrmPagePersistent.js +1 -0
  42. package/dist/cjs/pages/FormAccept.js +1 -1
  43. package/dist/cjs/pages/FormInvite.js +1 -1
  44. package/dist/cjs/pages/HtmlViewer.js +1 -1
  45. package/dist/cjs/pages/Login.d.ts.map +1 -1
  46. package/dist/cjs/pages/Login.js +1 -1
  47. package/dist/cjs/pages/Purchase.js +1 -1
  48. package/dist/cjs/pages/Sales.js +1 -1
  49. package/dist/cjs/pages/Search.js +1 -1
  50. package/dist/cjs/pages/Snap.js +1 -1
  51. package/dist/cjs/pages/index.d.ts +1 -0
  52. package/dist/cjs/pages/index.d.ts.map +1 -1
  53. package/dist/esm/components/AiInput.js +1 -1
  54. package/dist/esm/components/AudioIcon.js +1 -1
  55. package/dist/esm/components/ChatInput.js +1 -1
  56. package/dist/esm/components/ChatMessage.js +1 -1
  57. package/dist/esm/components/CombinedPlaceholderDialog.js +1 -1
  58. package/dist/esm/components/Footer.js +1 -1
  59. package/dist/esm/components/Header.js +1 -1
  60. package/dist/esm/components/HtmlView.js +1 -1
  61. package/dist/esm/components/MessageInput.js +1 -1
  62. package/dist/esm/components/MessageItem.js +1 -1
  63. package/dist/esm/components/Profile.js +1 -1
  64. package/dist/esm/components/Prompt.js +1 -1
  65. package/dist/esm/components/SnapFooter.js +1 -1
  66. package/dist/esm/components/TextHeader.js +1 -1
  67. package/dist/esm/components/TypingIndicator.js +1 -1
  68. package/dist/esm/components/UploadFile.js +1 -1
  69. package/dist/esm/components/UrlProcessor.js +1 -1
  70. package/dist/esm/components/VoiceIcon.js +1 -1
  71. package/dist/esm/config/index.d.ts +1 -0
  72. package/dist/esm/config/index.d.ts.map +1 -1
  73. package/dist/esm/config/index.js +1 -1
  74. package/dist/esm/hooks/index.d.ts +1 -0
  75. package/dist/esm/hooks/index.d.ts.map +1 -1
  76. package/dist/esm/hooks/useAuthState.d.ts +1 -0
  77. package/dist/esm/hooks/useAuthState.d.ts.map +1 -1
  78. package/dist/esm/hooks/useAuthState.js +1 -1
  79. package/dist/esm/hooks/useCodicentApp.d.ts +5 -2
  80. package/dist/esm/hooks/useCodicentApp.d.ts.map +1 -1
  81. package/dist/esm/hooks/useCodicentApp.js +1 -1
  82. package/dist/esm/hooks/useCodicentState.js +1 -1
  83. package/dist/esm/hooks/useTools.d.ts +20 -2
  84. package/dist/esm/hooks/useTools.d.ts.map +1 -1
  85. package/dist/esm/hooks/useTools.js +1 -1
  86. package/dist/esm/index.js +1 -1
  87. package/dist/esm/pages/AppFrame.js +1 -1
  88. package/dist/esm/pages/Chat.js +1 -1
  89. package/dist/esm/pages/Compose.js +1 -1
  90. package/dist/esm/pages/CrmPage.js +1 -1
  91. package/dist/esm/pages/CrmPagePersistent.d.ts +8 -0
  92. package/dist/esm/pages/CrmPagePersistent.d.ts.map +1 -0
  93. package/dist/esm/pages/CrmPagePersistent.js +1 -0
  94. package/dist/esm/pages/FormAccept.js +1 -1
  95. package/dist/esm/pages/FormInvite.js +1 -1
  96. package/dist/esm/pages/HtmlViewer.js +1 -1
  97. package/dist/esm/pages/Login.d.ts.map +1 -1
  98. package/dist/esm/pages/Login.js +1 -1
  99. package/dist/esm/pages/Purchase.js +1 -1
  100. package/dist/esm/pages/Sales.js +1 -1
  101. package/dist/esm/pages/Search.js +1 -1
  102. package/dist/esm/pages/Snap.js +1 -1
  103. package/dist/esm/pages/index.d.ts +1 -0
  104. package/dist/esm/pages/index.d.ts.map +1 -1
  105. package/dist/index.d.ts +32 -5
  106. package/package.json +1 -1
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import { CodicentAppState, RealtimeVoice } from "../hooks";
3
+ export declare const CrmPagePersistent: React.FC<{
4
+ state: CodicentAppState;
5
+ voice?: RealtimeVoice;
6
+ }>;
7
+ export default CrmPagePersistent;
8
+ //# sourceMappingURL=CrmPagePersistent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CrmPagePersistent.d.ts","sourceRoot":"","sources":["../../../src/pages/CrmPagePersistent.tsx"],"names":[],"mappings":"AAWA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAWjF,OAAO,EAAE,gBAAgB,EAA+B,aAAa,EAAE,MAAM,UAAU,CAAC;AAiHxF,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,KAAK,EAAE,gBAAgB,CAAC;IAAC,KAAK,CAAC,EAAE,aAAa,CAAA;CAAE,CAqT1F,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as o}from"react/jsx-runtime";import{useState as t,useRef as n,useCallback as r,useEffect as i,useMemo as a}from"react";import{CodicentService as s}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import l from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import m from"../components/VoiceIcon.js";import p from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as c}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{isMobileDevice as d}from"../utils/device.js";import"../components/FileThumbnail.js";import u from"../components/MessageInput.js";import f from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as g}from"../components/Page.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import h from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import j from"../hooks/useToaster.js";import{useSearchParams as x}from"react-router-dom";import{l as S}from"../node_modules/lodash/lodash.js";import{makeStyles as v}from"../node_modules/@griffel/react/makeStyles.esm.js";import{shorthands as y}from"../node_modules/@griffel/core/index.esm.js";import{tokens as k}from"../node_modules/@fluentui/tokens/lib/tokens.js";import{Text as w}from"../node_modules/@fluentui/react-text/lib/components/Text/Text.js";import{Spinner as b}from"../node_modules/@fluentui/react-spinner/lib/components/Spinner/Spinner.js";import{Card as C}from"../node_modules/@fluentui/react-card/lib/components/Card/Card.js";import{MessageBar as M}from"../node_modules/@fluentui/react-message-bar/lib/components/MessageBar/MessageBar.js";import{MessageBarBody as N}from"../node_modules/@fluentui/react-message-bar/lib/components/MessageBarBody/MessageBarBody.js";const _=v({main:{flexGrow:1,...y.padding("10px"),overflowY:"auto"},container:{display:"flex",flexDirection:"row",height:"100%",...y.gap("16px"),...y.padding("10px")},containerMobile:{display:"flex",flexDirection:"column",height:"100%",...y.gap("16px"),...y.padding("10px")},inputSection:{display:"flex",flexDirection:"column",flexGrow:1,maxWidth:"640px",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",position:"relative"},inputSectionMobile:{display:"flex",flexDirection:"column",width:"100%",position:"relative"},historySection:{flexBasis:"300px",flexShrink:0,display:"flex",flexDirection:"column",...y.gap("8px"),overflowY:"auto",...y.padding("8px")},historySectionMobile:{display:"flex",flexDirection:"column",...y.gap("8px"),overflowY:"auto",...y.padding("8px"),maxHeight:"300px"},historyCard:{...y.padding("12px"),cursor:"pointer","&:hover":{backgroundColor:k.colorNeutralBackground1Hover}},historyCardContent:{display:"flex",flexDirection:"column",...y.gap("4px")},historyDate:{fontSize:k.fontSizeBase200,color:k.colorNeutralForeground3},historyText:{fontSize:k.fontSizeBase300,wordBreak:"break-word",whiteSpace:"pre-wrap",maxHeight:"100px",overflow:"hidden",textOverflow:"ellipsis"},review:{padding:"10px",wordBreak:"break-word",whiteSpace:"pre-line",maxWidth:"100%",overflowWrap:"break-word"},voiceIcon:{position:"absolute",top:"20px",right:"12px",zIndex:1001,cursor:"pointer"},historyTitle:{fontSize:k.fontSizeBase400,fontWeight:k.fontWeightSemibold,marginBottom:"8px"},emptyState:{textAlign:"center",color:k.colorNeutralForeground3,padding:"20px"}}),T=({state:v,voice:y})=>{const k=_(),{t:T}=h(),[I,B]=t(!1),A=n(null),E=n(null),F=n(null),[U]=t(null),[D,$]=t([]),{service:P}=v,[O,z]=x(),[L,R]=t(""),[H,W]=t(void 0),V=j(),[G,J]=t(void 0),[Y,K]=t("info"),[X,q]=t([]),[Q,Z]=t(!1),ee=d(),oe=r((e=>{for(const o of e)P.getFileInfo(o).then((e=>{$((o=>[...o,e]))}))}),[P,$]),te=r((e=>{const o=new FormData;o.append("file",e),P.uploadFile(e.name,o).then((e=>{oe([e])})).catch((()=>{V.notify(T("Error"),T("Error uploading pasted image"),"")}))}),[P,oe,V,T]),ne=e=>{B(e)},re=r((async()=>{Z(!0);try{const e=await P.getMessages(["crm"]);q(e)}catch(e){console.error("Error loading CRM messages:",e),V.notify(T("Error"),T("Failed to load CRM messages"),"","error")}finally{Z(!1)}}),[P,V,T]);i((()=>{re()}),[re]),i((()=>{const e=O.get("text"),o=O.get("url");e&&(R(e),O.delete("text")),o&&(O.delete("url"),R(((e||"")+" "+o).trim())),z(O,{replace:!0})}),[O,z,R,P,oe]);const ie=e=>{e=`${e=`#crm\n${e.replace("#log ","")}\nSALESPERSON: ${v.context.name||v.context.user?.email||v.context.nickname||"-"}`}${U?" "+U:""}${D.length>0?"\n":""}${D.map((e=>`#file:${e.id}`)).join(" ")}`,P.sendMessage(e).then((()=>{V.notify(T("Meddelande"),T("Meddelandet är sparat."),""),re(),W(""),J(void 0)}))},ae=r((async e=>{if(!e||e.length<10)return;J(T("Analyserar...")),K("info");const o=await P.chat((e=>`Skapa kort ja/nej-status över hur CRM-aktiviteten som följer, givet dessa punkter: \n1. Namn på kunden finns med? ja/nej \n2. Syftet med mötet finns (varför träffar du kunden, kan täckas av 3 nedan) ja/nej\n3. Vad som framkommer under mötet (viktiga punkter och diskussioner) ja/nej\n4. Nästa steg finns med (hur ni kommer att träffas igen, och om något har sålts) ja/nej. \n\nSvara endast med ja/nej för varje punkt, ett svar per rad i följande exempel i JSON-format:\n{\n "customerName": "true",\n "purpose": "false",\n "meetingNotes": "true",\n "nextSteps": "false",\n "shortSummary": "Syfte med mötet och nästa steg saknas."\n}\n\n---\nTEXT:\n\n${e}`)(e));if(o){const e=new p(o.content);try{const o=JSON.parse(e.content);console.log("json",o);let t=0;for(const e in o)"true"===o[e]&&t++;J(T(4===t?"Allt är med":o.shortSummary||"Något saknas")),K(4===t?"success":"warning")}catch{J("Error: "+e.content),K("error")}}}),[P,T]),se=a((()=>S.debounce(ae,2e3)),[ae]);i((()=>()=>{se.cancel()}),[se]);const le=e=>{const o=new Date,t=new Date(e),n=o.getTime()-t.getTime(),r=Math.floor(n/6e4),i=Math.floor(n/36e5),a=Math.floor(n/864e5);return r<1?T("Just now"):r<60?`${r} ${T("minutes ago")}`:i<24?`${i} ${T("hours ago")}`:a<7?`${a} ${T("days ago")}`:t.toLocaleDateString()},me=e=>{const o=e.split("\n").filter((e=>!e.startsWith("#")&&!e.startsWith("SALESPERSON:")&&e.trim().length>0)).join("\n");return o.substring(0,150)+(o.length>150?"...":"")},pe=()=>o("div",{className:ee?k.historySectionMobile:k.historySection,children:[e(w,{className:k.historyTitle,children:T("Tidigare sparade")}),Q?e("div",{className:k.emptyState,children:e(b,{size:"small"})}):0===X.length?e("div",{className:k.emptyState,children:e(w,{children:T("Inga sparade meddelanden än")})}):X.map((t=>e(C,{className:k.historyCard,onClick:()=>(e=>{const o=me(e.content);W(o)})(t),children:o("div",{className:k.historyCardContent,children:[e(w,{className:k.historyDate,children:le(t.createdAt)}),e(w,{className:k.historyText,children:me(t.content)})]})},t.id)))]});return e(g,{hideHeader:!0,children:o("div",{className:ee?k.containerMobile:k.container,children:[!ee&&pe(),o("div",{className:ee?k.inputSectionMobile:k.inputSection,style:ee?void 0:{backgroundImage:`url(${c("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[y&&c("SHOW_VOICE_BUTTON")&&e("div",{className:k.voiceIcon,children:e(m,{voice:y})}),e(l,{title:c("APP_SAVE_TITLE")?T(c("APP_SAVE_TITLE")):T("Spara")}),e(u,{defaultText:L,onSend:ie,files:D,onFilesChange:$,isUploading:I,onUploadImage:()=>{E.current?.triggerUpload()},onUploadCamera:()=>{F.current?.triggerUpload()},getImageUrl:s.getImageUrl,hasLocation:!!U,disableSend:!0,rows:9,placeholder:T("Beskriv CRM-aktivitet här..."),onChange:e=>{e!==H&&(W(e),e&&e.trim().length>0?se(e):(J(void 0),se.cancel()))},onImagePasted:te}),G&&o("div",{className:k.review,children:[e("h3",{children:T("Analys")}),e(M,{intent:Y,layout:"multiline",children:e(N,{children:T(G)})})]}),e(f,{ref:A,onFileUploaded:oe,onUploading:ne,multiple:!0,codicentService:P}),e(f,{codicentService:P,ref:E,onFileUploaded:oe,onUploading:ne,multiple:!0,accept:"image/*"}),e(f,{codicentService:P,ref:F,onFileUploaded:oe,onUploading:ne,multiple:!0,accept:"image/*",capture:"environment"})]}),ee&&pe()]})})};export{T as CrmPagePersistent,T as default};
@@ -1 +1 @@
1
- import{jsx as o,jsxs as t,Fragment as e}from"react/jsx-runtime";import r from"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{Title as i}from"../components/Title.js";import{Text as n}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import{useState as s,useEffect as m}from"react";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as p}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{formatGuidToShorterReadableCode as a}from"../utils/helpers.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./ImageView.js";import"./FormInvite.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import c from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import l from"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as d}from"../components/Page.js";import{useSearchParams as j,useNavigate as u}from"react-router-dom";import{makeStyles as h}from"../node_modules/@griffel/react/makeStyles.esm.js";import{Button as f}from"../node_modules/@fluentui/react-button/lib/components/Button/Button.js";const g=h({container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%"},instructionParagraph:{fontWeight:"bold",marginBottom:"1em"},orderedList:{marginLeft:"20px",marginBottom:"1em",fontSize:"1.3em"}}),k=()=>{const{t:h,tAsync:k}=c(),[b]=j(),_=u(),C=b.get("id"),v=g(),[S,y]=s(""),[M,x]=s(!1);return m((()=>{(async()=>{const o=p("FORM_ACCEPT_MARKDOWN");if(o){x(!0);const t=await k(o);x(!1),y(t.replace("{{code}}",a(C||"")))}})()}),[k,C]),o(d,{hideFooter:!0,hideHeader:!0,children:o("div",{className:v.container,style:{backgroundImage:`url(${p("FORM_BACKGROUND_IMAGE_URL")})`},children:t(l,{children:[M&&o(n,{children:h("Översätter...")}),p("FORM_ACCEPT_MARKDOWN")&&S&&!M&&o(r,{content:S}),!p("FORM_ACCEPT_MARKDOWN")&&t(e,{children:[o(i,{children:h("Din kod för formuläret")}),o("p",{className:v.instructionParagraph,children:h("Instruktioner:")}),t("ol",{className:v.orderedList,children:[o("li",{children:h("Skriv ner eller kopiera den kod som visas nedan, du behöver den för att identifiera din session.")}),o("li",{children:h("Klicka på 'Starta' för att komma igång med chatten.")})]}),o(n,{size:500,children:h("Din kod är (skriv ner den):")}),o(n,{size:600,style:{userSelect:"all"},children:a(C||"")})]}),C&&o(f,{appearance:"primary",onClick:()=>_(`/chat?fid=${C}`),children:h("Starta")})]})})})};export{k as default};
1
+ import{jsx as o,jsxs as t,Fragment as e}from"react/jsx-runtime";import r from"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{Title as i}from"../components/Title.js";import{Text as n}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import{useState as s,useEffect as m}from"react";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as p}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{formatGuidToShorterReadableCode as a}from"../utils/helpers.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import c from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import l from"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as d}from"../components/Page.js";import{useSearchParams as j,useNavigate as u}from"react-router-dom";import{makeStyles as h}from"../node_modules/@griffel/react/makeStyles.esm.js";import{Button as g}from"../node_modules/@fluentui/react-button/lib/components/Button/Button.js";const f=h({container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%"},instructionParagraph:{fontWeight:"bold",marginBottom:"1em"},orderedList:{marginLeft:"20px",marginBottom:"1em",fontSize:"1.3em"}}),k=()=>{const{t:h,tAsync:k}=c(),[b]=j(),C=u(),_=b.get("id"),v=f(),[S,y]=s(""),[M,P]=s(!1);return m((()=>{(async()=>{const o=p("FORM_ACCEPT_MARKDOWN");if(o){P(!0);const t=await k(o);P(!1),y(t.replace("{{code}}",a(_||"")))}})()}),[k,_]),o(d,{hideFooter:!0,hideHeader:!0,children:o("div",{className:v.container,style:{backgroundImage:`url(${p("FORM_BACKGROUND_IMAGE_URL")})`},children:t(l,{children:[M&&o(n,{children:h("Översätter...")}),p("FORM_ACCEPT_MARKDOWN")&&S&&!M&&o(r,{content:S}),!p("FORM_ACCEPT_MARKDOWN")&&t(e,{children:[o(i,{children:h("Din kod för formuläret")}),o("p",{className:v.instructionParagraph,children:h("Instruktioner:")}),t("ol",{className:v.orderedList,children:[o("li",{children:h("Skriv ner eller kopiera den kod som visas nedan, du behöver den för att identifiera din session.")}),o("li",{children:h("Klicka på 'Starta' för att komma igång med chatten.")})]}),o(n,{size:500,children:h("Din kod är (skriv ner den):")}),o(n,{size:600,style:{userSelect:"all"},children:a(_||"")})]}),_&&o(g,{appearance:"primary",onClick:()=>C(`/chat?fid=${_}`),children:h("Starta")})]})})})};export{k as default};
@@ -1 +1 @@
1
- import{jsx as o,jsxs as e,Fragment as t}from"react/jsx-runtime";import{useState as n,useEffect as r}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as i}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as a}from"../components/Title.js";import"../components/Spinner.js";import{Label as s}from"../components/Label.js";import{Input as m}from"../components/Input.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import l 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 p}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{formatGuidToShorterReadableCode as c}from"../utils/helpers.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./ImageView.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import d from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import u from"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as j}from"../components/Page.js";import{makeStyles as h}from"../node_modules/@griffel/react/makeStyles.esm.js";import{useId as k}from"../node_modules/@fluentui/react-utilities/lib/hooks/useId.js";import{Dropdown as g}from"../node_modules/@fluentui/react-combobox/lib/components/Dropdown/Dropdown.js";import{Option as f}from"../node_modules/@fluentui/react-combobox/lib/components/Option/Option.js";const v=h({inputAndButton:{display:"flex",gap:"10px"},input:{minWidth:"90%"},container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%"},generatedLinkTitle:{marginBottom:"0.5em",fontWeight:"bold"},orderedList:{marginLeft:"20px",marginBottom:"1em"},instructionParagraph:{marginBottom:"1em",fontWeight:"bold"}}),b=({state:h})=>{const b=v(),{service:w}=h,{t:x}=d(),[S,y]=l(h.context.selectedApp+"_forms",[]),[C,$]=n(),[_,L]=n(),[A,I]=n(!1),[T,B]=n(),D=k("form-dropdown");r((()=>{w.getForms().then((o=>{o.sort(((o,e)=>o.name.localeCompare(e.name))),y(o)}))}),[w,x,y]);const N=void 0!==navigator.share;return o(j,{children:o("div",{className:b.container,style:{backgroundImage:`url(${p("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:e(u,{children:[o(a,{children:x("Skapa länk till formulär")}),o("p",{className:b.instructionParagraph,children:x("Instruktioner")}),e("ol",{className:b.orderedList,children:[o("li",{children:x("Välj ett formulär från rullgardinsmenyn nedan. Detta formulär kommer att användas för den genererade länken.")}),o("li",{children:x("Klicka på 'Skapa länk' för att generera en unik länk. Länken visar var aktiv och kan användas för att svara på formuläret.")}),o("li",{children:x("När länken visas, kan du klicka på kopiera-ikonen för att kopiera länken till ditt urklipp.")}),o("li",{children:x("Om din enhet stödjer det, kan du även använda dela-knappen för att dela länken direkt.")}),o("li",{children:x("Kom ihåg att spara (skriva ner) koden")})]}),o("label",{id:D,className:b.instructionParagraph,children:x("Välj formulär")}),o(g,{"aria-labelledby":D,placeholder:"-",onOptionSelect:(o,e)=>B(e.optionValue),children:S.map((o=>e(f,{value:o.name,text:`${o.title} (${o.name})`,children:[`${o.title} (${o.name})`," "]},o.name)))}),o(i,{appearance:"primary",disabled:!T,onClick:()=>{const o=S.find((o=>o.name===T));o?.url?w.sendMessage(`#ss-link #${T}`).then((e=>{const t=new Date(Date.now()+2592e5);w.generateApiToken(t).then((t=>{const n=o.url.includes("?")?"&":"?",r=`${o.url}${n}token=${t}`;$(r);const i=c(e);L(i)}))})):w.sendMessage(`#ss-link #${T}`).then((o=>{const e=`${window.location.protocol}//${window.location.hostname}${window.location.port?":"+window.location.port:""}${window.location.pathname}`;$(`${e}#/formaccept?id=${o}`);const t=c(o);L(t)}))},children:x("Skapa länk")}),C&&e(t,{children:[o("p",{className:b.generatedLinkTitle,children:x("Här är din genererade länk (du kan kopiera eller dela den):")}),o("div",{className:b.inputAndButton,children:o(m,{className:b.input,value:C,readOnly:!0,onFocus:o=>o.target.select()})}),o("br",{}),e("div",{className:b.inputAndButton,children:[o(i,{appearance:"primary",title:x("Kopiera länk"),icon:"CopyRegular",onClick:()=>{C&&(navigator.clipboard.writeText(C),I(!0),setTimeout((()=>{I(!1),$(void 0)}),2e3))},children:x("Kopiera")}),N&&o(i,{appearance:"primary",title:x("Dela länk"),icon:"ShareRegular",onClick:()=>{C&&(navigator.share({url:C}),setTimeout((()=>{$(void 0)}),2e3))},children:x("Dela")})]}),A&&o(s,{children:x("Länk kopierad!")})]})]})})})};export{b as default};
1
+ import{jsx as o,jsxs as e,Fragment as t}from"react/jsx-runtime";import{useState as n,useEffect as r}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as i}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as a}from"../components/Title.js";import"../components/Spinner.js";import{Label as s}from"../components/Label.js";import{Input as m}from"../components/Input.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import p from"../hooks/useStateWithLocalStorage.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as l}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{formatGuidToShorterReadableCode as c}from"../utils/helpers.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import d from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import u from"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as j}from"../components/Page.js";import{makeStyles as h}from"../node_modules/@griffel/react/makeStyles.esm.js";import{useId as k}from"../node_modules/@fluentui/react-utilities/lib/hooks/useId.js";import{Dropdown as g}from"../node_modules/@fluentui/react-combobox/lib/components/Dropdown/Dropdown.js";import{Option as f}from"../node_modules/@fluentui/react-combobox/lib/components/Option/Option.js";const v=h({inputAndButton:{display:"flex",gap:"10px"},input:{minWidth:"90%"},container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%"},generatedLinkTitle:{marginBottom:"0.5em",fontWeight:"bold"},orderedList:{marginLeft:"20px",marginBottom:"1em"},instructionParagraph:{marginBottom:"1em",fontWeight:"bold"}}),b=({state:h})=>{const b=v(),{service:w}=h,{t:x}=d(),[S,y]=p(h.context.selectedApp+"_forms",[]),[C,$]=n(),[_,L]=n(),[P,A]=n(!1),[I,T]=n(),B=k("form-dropdown");r((()=>{w.getForms().then((o=>{o.sort(((o,e)=>o.name.localeCompare(e.name))),y(o)}))}),[w,x,y]);const D=void 0!==navigator.share;return o(j,{children:o("div",{className:b.container,style:{backgroundImage:`url(${l("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:e(u,{children:[o(a,{children:x("Skapa länk till formulär")}),o("p",{className:b.instructionParagraph,children:x("Instruktioner")}),e("ol",{className:b.orderedList,children:[o("li",{children:x("Välj ett formulär från rullgardinsmenyn nedan. Detta formulär kommer att användas för den genererade länken.")}),o("li",{children:x("Klicka på 'Skapa länk' för att generera en unik länk. Länken visar var aktiv och kan användas för att svara på formuläret.")}),o("li",{children:x("När länken visas, kan du klicka på kopiera-ikonen för att kopiera länken till ditt urklipp.")}),o("li",{children:x("Om din enhet stödjer det, kan du även använda dela-knappen för att dela länken direkt.")}),o("li",{children:x("Kom ihåg att spara (skriva ner) koden")})]}),o("label",{id:B,className:b.instructionParagraph,children:x("Välj formulär")}),o(g,{"aria-labelledby":B,placeholder:"-",onOptionSelect:(o,e)=>T(e.optionValue),children:S.map((o=>e(f,{value:o.name,text:`${o.title} (${o.name})`,children:[`${o.title} (${o.name})`," "]},o.name)))}),o(i,{appearance:"primary",disabled:!I,onClick:()=>{const o=S.find((o=>o.name===I));o?.url?w.sendMessage(`#ss-link #${I}`).then((e=>{const t=new Date(Date.now()+2592e5);w.generateApiToken(t).then((t=>{const n=o.url.includes("?")?"&":"?",r=`${o.url}${n}token=${t}`;$(r);const i=c(e);L(i)}))})):w.sendMessage(`#ss-link #${I}`).then((o=>{const e=`${window.location.protocol}//${window.location.hostname}${window.location.port?":"+window.location.port:""}${window.location.pathname}`;$(`${e}#/formaccept?id=${o}`);const t=c(o);L(t)}))},children:x("Skapa länk")}),C&&e(t,{children:[o("p",{className:b.generatedLinkTitle,children:x("Här är din genererade länk (du kan kopiera eller dela den):")}),o("div",{className:b.inputAndButton,children:o(m,{className:b.input,value:C,readOnly:!0,onFocus:o=>o.target.select()})}),o("br",{}),e("div",{className:b.inputAndButton,children:[o(i,{appearance:"primary",title:x("Kopiera länk"),icon:"CopyRegular",onClick:()=>{C&&(navigator.clipboard.writeText(C),A(!0),setTimeout((()=>{A(!1),$(void 0)}),2e3))},children:x("Kopiera")}),D&&o(i,{appearance:"primary",title:x("Dela länk"),icon:"ShareRegular",onClick:()=>{C&&(navigator.share({url:C}),setTimeout((()=>{$(void 0)}),2e3))},children:x("Dela")})]}),P&&o(s,{children:x("Länk kopierad!")})]})]})})})};export{b as default};
@@ -1 +1 @@
1
- import{jsx as o,jsxs as t}from"react/jsx-runtime";import{useState as e,useEffect as s}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{Text as i}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import n from"../components/HtmlView.js";import"../components/Footer.js";import{Page as r}from"../components/Page.js";import{Spinner as m}from"../node_modules/@fluentui/react-spinner/lib/components/Spinner/Spinner.js";const p=({state:p})=>{const c=window.location.hash.match(/^#\/html\/(.+)$/),a=c?decodeURIComponent(c[1]):"",[l,d]=e(),[h,j]=e(!1),[u,f]=e(),{service:g}=p;return s((()=>{a&&g?(j(!0),f(void 0),g.getMessagesFast([a],void 0,1).then((o=>{if(0===o.length)return void f(`No messages found with tag: ${a}`);const t=o[0].content;d((o=>{const t=o.indexOf("```html");if(-1!==t){const e=o.indexOf("```",t+7);return-1===e?o.substring(t+7):o.substring(t+7,e)}const e=[/<!DOCTYPE[^>]*>[\s\S]*?<\/html>/i,/<html[^>]*>[\s\S]*?<\/html>/i,/<div[^>]*>[\s\S]*?<\/div>/i,/<body[^>]*>[\s\S]*?<\/body>/i,/<article[^>]*>[\s\S]*?<\/article>/i,/<section[^>]*>[\s\S]*?<\/section>/i];for(const t of e){const e=o.match(t);if(e)return e[0]}if(o.includes("<html")||o.includes("<!DOCTYPE")||o.includes("<div")||o.includes("<p>")||o.includes("<span")){const t=["<!DOCTYPE","<html","<div","<body","<article","<section"];let e=-1;for(const s of t){const t=o.indexOf(s);-1!==t&&(-1===e||t<e)&&(e=t)}if(-1!==e){let t=o.substring(e);const s=["</html>","</body>","</div>"];for(const o of s){const e=t.lastIndexOf(o);if(-1!==e){t=t.substring(0,e+o.length);break}}return t}return o}return o})(t))})).catch((o=>{console.error("Error fetching message:",o),f(`Error fetching message: ${o.message||"Unknown error"}`)})).finally((()=>{j(!1)}))):f("No tag provided or service unavailable")}),[a,g]),h?o(r,{hideHeader:!0,hideFooter:!0,children:o("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:o(m,{})})}):u?o(r,{hideHeader:!0,hideFooter:!0,children:t("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh",flexDirection:"column",gap:"20px"},children:[o(i,{children:u}),t(i,{children:["Tag: ",a]})]})}):l?o(n,{html:l,onDismiss:()=>window.history.back()}):o(r,{hideHeader:!0,hideFooter:!0,children:o("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:o(i,{children:"No HTML content available"})})})};export{p as default};
1
+ import{jsx as o,jsxs as t}from"react/jsx-runtime";import{useState as e,useEffect as s}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{Text as i}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import n from"../components/HtmlView.js";import"../components/Footer.js";import{Page as r}from"../components/Page.js";import{Spinner as m}from"../node_modules/@fluentui/react-spinner/lib/components/Spinner/Spinner.js";const p=({state:p})=>{const c=window.location.hash.match(/^#\/html\/(.+)$/),a=c?decodeURIComponent(c[1]):"",[l,d]=e(),[h,j]=e(!1),[u,f]=e(),{service:g}=p;return s((()=>{a&&g?(j(!0),f(void 0),g.getMessagesFast([a],void 0,1).then((o=>{if(0===o.length)return void f(`No messages found with tag: ${a}`);const t=o[0].content;d((o=>{const t=o.indexOf("```html");if(-1!==t){const e=o.indexOf("```",t+7);return-1===e?o.substring(t+7):o.substring(t+7,e)}const e=[/<!DOCTYPE[^>]*>[\s\S]*?<\/html>/i,/<html[^>]*>[\s\S]*?<\/html>/i,/<div[^>]*>[\s\S]*?<\/div>/i,/<body[^>]*>[\s\S]*?<\/body>/i,/<article[^>]*>[\s\S]*?<\/article>/i,/<section[^>]*>[\s\S]*?<\/section>/i];for(const t of e){const e=o.match(t);if(e)return e[0]}if(o.includes("<html")||o.includes("<!DOCTYPE")||o.includes("<div")||o.includes("<p>")||o.includes("<span")){const t=["<!DOCTYPE","<html","<div","<body","<article","<section"];let e=-1;for(const s of t){const t=o.indexOf(s);-1!==t&&(-1===e||t<e)&&(e=t)}if(-1!==e){let t=o.substring(e);const s=["</html>","</body>","</div>"];for(const o of s){const e=t.lastIndexOf(o);if(-1!==e){t=t.substring(0,e+o.length);break}}return t}return o}return o})(t))})).catch((o=>{console.error("Error fetching message:",o),f(`Error fetching message: ${o.message||"Unknown error"}`)})).finally((()=>{j(!1)}))):f("No tag provided or service unavailable")}),[a,g]),h?o(r,{hideHeader:!0,hideFooter:!0,children:o("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:o(m,{})})}):u?o(r,{hideHeader:!0,hideFooter:!0,children:t("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh",flexDirection:"column",gap:"20px"},children:[o(i,{children:u}),t(i,{children:["Tag: ",a]})]})}):l?o(n,{html:l,onDismiss:()=>window.history.back()}):o(r,{hideHeader:!0,hideFooter:!0,children:o("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:o(i,{children:"No HTML content available"})})})};export{p as default};
@@ -1 +1 @@
1
- {"version":3,"file":"Login.d.ts","sourceRoot":"","sources":["../../../src/pages/Login.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,gBAAgB,EAAiC,MAAM,UAAU,CAAC;AA0B3E,QAAA,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,KAAK,EAAE,gBAAgB,CAAA;CAAE,CAyDhD,CAAC;AAEF,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"Login.d.ts","sourceRoot":"","sources":["../../../src/pages/Login.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,EAAE,gBAAgB,EAAiC,MAAM,UAAU,CAAC;AA8B3E,QAAA,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,KAAK,EAAE,gBAAgB,CAAA;CAAE,CAuGhD,CAAC;AAEF,eAAe,KAAK,CAAC"}
@@ -1 +1 @@
1
- import{jsxs as o,jsx as t}from"react/jsx-runtime";import e from"react";import"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as r}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as i}from"../components/Title.js";import{Text as s}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as n}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./CrmPage.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import m from"../hooks/useLocalization.js";import p from"../hooks/useAppStyles.js";import{makeStyles as a}from"../node_modules/@griffel/react/makeStyles.esm.js";import{Image as c}from"../node_modules/@fluentui/react-image/lib/components/Image/Image.js";import{mergeClasses as l}from"../node_modules/@griffel/core/mergeClasses.esm.js";const j=a({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"},image:{maxHeight:"200px"}}),g=({state:a})=>{const{loginWithRedirect:g}=a.auth,d=j(),u=p(),{t:_}=m(),I=n("LOGIN_REDIRECT");return e.useEffect((()=>{I&&g()}),[I]),o("div",I?{className:d.container,style:{backgroundImage:`url(${n("HOME_BACKGROUND_IMAGE_URL")})`},children:[t(i,{children:`${_("Välkommen till")} ${n("INDEX_TITLE")}!`}),t(s,{size:400,children:_("Omdirigerar till inloggning...")})]}:{className:d.container,style:{backgroundImage:`url(${n("HOME_BACKGROUND_IMAGE_URL")})`},children:[n("LOGIN_LOGO_URL")&&t(c,{src:n("LOGIN_LOGO_URL"),alt:n("INDEX_TITLE"),className:d.image}),!n("LOGIN_HIDE_WELCOME")&&t(i,{children:`${_("Välkommen till")} ${n("INDEX_TITLE")}!`}),t(s,{size:400,children:_(n("LOGIN_WELCOME_TEXT")||"Logga in, eller registrera ett konto, för att komma igång.")}),t(r,{className:l(u.button,d.button),size:"large",appearance:"primary",onClick:()=>g(),children:_("Logga in")}),!n("HIDE_REGISTER_BUTTON")&&t(r,{className:l(u.button,d.button),size:"large",appearance:"primary",onClick:()=>g({authorizationParams:{screen_hint:"signup"}}),children:_("Registrera")})]})};export{g as default};
1
+ import{jsxs as o,jsx as e,Fragment as t}from"react/jsx-runtime";import i,{useState as n}from"react";import"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as r}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as s}from"../components/Title.js";import{Text as m}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as a}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import p from"../hooks/useLocalization.js";import l from"../hooks/useAppStyles.js";import{makeStyles as c}from"../node_modules/@griffel/react/makeStyles.esm.js";import{Image as d}from"../node_modules/@fluentui/react-image/lib/components/Image/Image.js";import{Input as g}from"../node_modules/@fluentui/react-input/lib/components/Input/Input.js";import{mergeClasses as j}from"../node_modules/@griffel/core/mergeClasses.esm.js";const u=c({container:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100vh",backgroundPosition:"calc(50% - 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",gap:"20px",padding:"0 20px"},button:{minWidth:"15rem"},input:{minWidth:"15rem",marginBottom:"10px"},image:{maxHeight:"200px"}}),h=({state:c})=>{const{loginWithRedirect:h,loginPasswordless:_}=c.auth,I=u(),f=l(),{t:b}=p(),[E,k]=n(""),[C,L]=n(!1),y=a("LOGIN_REDIRECT"),N=a("AUTH0_PASSWORDLESS_ENABLED");i.useEffect((()=>{y&&h()}),[y]);return o("div",y?{className:I.container,style:{backgroundImage:`url(${a("HOME_BACKGROUND_IMAGE_URL")})`},children:[e(s,{children:`${b("Välkommen till")} ${a("INDEX_TITLE")}!`}),e(m,{size:400,children:b("Omdirigerar till inloggning...")})]}:{className:I.container,style:{backgroundImage:`url(${a("HOME_BACKGROUND_IMAGE_URL")})`},children:[a("LOGIN_LOGO_URL")&&e(d,{src:a("LOGIN_LOGO_URL"),alt:a("INDEX_TITLE"),className:I.image}),!a("LOGIN_HIDE_WELCOME")&&e(s,{children:`${b("Välkommen till")} ${a("INDEX_TITLE")}!`}),e(m,{size:400,children:b(a("LOGIN_WELCOME_TEXT")||"Logga in, eller registrera ett konto, för att komma igång.")}),o(t,N?{children:[e(g,{className:I.input,type:"email",placeholder:b("Ange din e-postadress"),value:E,onChange:o=>k(o.target.value),disabled:C}),e(r,{className:j(f.button,I.button),size:"large",appearance:"primary",onClick:async()=>{if(E.trim()){L(!0);try{await _(E)}catch(o){console.error("Passwordless login failed:",o)}finally{L(!1)}}},disabled:!E.trim()||C,children:b(C?"Skickar...":"Skicka inloggningslänk")})]}:{children:[e(r,{className:j(f.button,I.button),size:"large",appearance:"primary",onClick:()=>h(),children:b("Logga in")}),!a("HIDE_REGISTER_BUTTON")&&e(r,{className:j(f.button,I.button),size:"large",appearance:"primary",onClick:()=>h({authorizationParams:{screen_hint:"signup"}}),children:b("Registrera")})]})]})};export{h as default};
@@ -1 +1 @@
1
- import{jsxs as o,jsx as t}from"react/jsx-runtime";import{useState as e,useEffect as r}from"react";import{Link as i}from"react-router-dom";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as n}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as s}from"../components/Title.js";import{Text as m}from"../components/Text.js";import{Spinner as a}from"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as p}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"../stores/chatStore.js";import"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import{makeStyles as c}from"../node_modules/@griffel/react/makeStyles.esm.js";import{tokens as l}from"../node_modules/@fluentui/tokens/lib/tokens.js";const d=c({container:{display:"flex",flexDirection:"column",alignItems:"center",gap:"20px",padding:"20px"},pricing:{padding:"20px",paddingLeft:"30px",border:"1px solid #ccc",borderRadius:"8px",backgroundColor:l.colorNeutralBackground1}}),j=({state:c})=>{const l=d(),[j,u]=e(!1),{service:g,stateMachine:h}=c,{updateContext:f}=h;r((()=>{new URLSearchParams(window.location.search).get("session_id")&&f({hasValidPurchase:void 0})}),[]);return o("div",{className:l.container,children:[t(s,{children:"Starta ditt abonnemang"}),t("div",{className:l.pricing,children:o("ul",{children:[t("li",{children:t(m,{size:400,children:"Kreditkort krävs inte"})}),t("li",{children:t(m,{size:400,children:"Gratis de 2 första månaderna"})}),t("li",{children:t(m,{size:400,children:"Därefter 89 kr/månad"})})]})}),t(n,{appearance:"primary",onClick:async()=>{try{u(!0),await g.redirectToCheckout(p("STRIPE_PRICE_ID"))}catch(o){console.error("Purchase error:",o)}finally{u(!1)}},disabled:j,children:j?t(a,{size:"tiny"}):"Starta abonnemang"}),t("div",{children:o(m,{size:400,children:["Har du redan ett abonnemang? Kanske har du loggat in med fel konto. ",t(i,{to:"/logout",children:"Logga ut"})," och sedan in igen för att komma igång."]})})]})};export{j as Purchase,j as default};
1
+ import{jsxs as o,jsx as t}from"react/jsx-runtime";import{useState as e,useEffect as r}from"react";import{Link as i}from"react-router-dom";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as n}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as s}from"../components/Title.js";import{Text as m}from"../components/Text.js";import{Spinner as a}from"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as p}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"../stores/chatStore.js";import"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import{makeStyles as c}from"../node_modules/@griffel/react/makeStyles.esm.js";import{tokens as l}from"../node_modules/@fluentui/tokens/lib/tokens.js";const d=c({container:{display:"flex",flexDirection:"column",alignItems:"center",gap:"20px",padding:"20px"},pricing:{padding:"20px",paddingLeft:"30px",border:"1px solid #ccc",borderRadius:"8px",backgroundColor:l.colorNeutralBackground1}}),j=({state:c})=>{const l=d(),[j,g]=e(!1),{service:u,stateMachine:h}=c,{updateContext:f}=h;r((()=>{new URLSearchParams(window.location.search).get("session_id")&&f({hasValidPurchase:void 0})}),[]);return o("div",{className:l.container,children:[t(s,{children:"Starta ditt abonnemang"}),t("div",{className:l.pricing,children:o("ul",{children:[t("li",{children:t(m,{size:400,children:"Kreditkort krävs inte"})}),t("li",{children:t(m,{size:400,children:"Gratis de 2 första månaderna"})}),t("li",{children:t(m,{size:400,children:"Därefter 89 kr/månad"})})]})}),t(n,{appearance:"primary",onClick:async()=>{try{g(!0),await u.redirectToCheckout(p("STRIPE_PRICE_ID"))}catch(o){console.error("Purchase error:",o)}finally{g(!1)}},disabled:j,children:j?t(a,{size:"tiny"}):"Starta abonnemang"}),t("div",{children:o(m,{size:400,children:["Har du redan ett abonnemang? Kanske har du loggat in med fel konto. ",t(i,{to:"/logout",children:"Logga ut"})," och sedan in igen för att komma igång."]})})]})};export{j as Purchase,j as default};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as o,Fragment as t}from"react/jsx-runtime";import{useState as n,useCallback as i,useEffect as r}from"react";import"../components/Markdown.js";import{Textarea as s}from"../components/Textarea.js";import{Button as a}from"../components/Button.js";import"../components/CompoundButton.js";import{Text as l}from"../components/Text.js";import"../components/Spinner.js";import{Input as c}from"../components/Input.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import{Dialog as m,DialogTitle as p,DialogContent as d,DialogActions as h}from"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as g}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./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"./Purchase.js";import"../stores/chatStore.js";import u from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as j}from"../components/Page.js";import{makeStyles as f}from"../node_modules/@griffel/react/makeStyles.esm.js";import{tokens as x}from"../node_modules/@fluentui/tokens/lib/tokens.js";import{shorthands as C}from"../node_modules/@griffel/core/index.esm.js";import{Image as _}from"../node_modules/@fluentui/react-image/lib/components/Image/Image.js";import{mergeClasses as k}from"../node_modules/@griffel/core/mergeClasses.esm.js";const b=f({root:{display:"flex",flexDirection:"column",height:"100%",touchAction:"pan-y"},header:{display:"flex",justifyContent:"space-between",alignItems:"center",backgroundColor:g("APP_HEADER_COLOR")||x.colorBrandBackground,color:x.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"}}),v={opened:"#1a5614",not_home:"#f44336",sales:"#2196F3",call_back:"#FF9800"},w=()=>{const f=b(),{t:x}=u(),[C,w]=n(""),[y,I]=n(),[A,F]=n({opened:0,not_home:0,sales:0,call_back:0}),[P,$]=n([]),[N,B]=n(!1),[S,M]=n(""),[D,H]=n(""),[O,T]=n(""),[L,z]=n(!1),[E,G]=n(!1),R=i((()=>new Promise((e=>{navigator.geolocation?navigator.geolocation.getCurrentPosition((o=>{const t=`#position (${o.coords.latitude},${o.coords.longitude})`;e(t)})):e(void 0)}))),[I]);r((()=>{window.Codicent.getDataMessages({codicent:g("APP_NAME"),tags:["sales_code"]}).then((e=>{e=e.filter((e=>"1"!==e.data.inactive)),$(e)})).catch(console.error),R()}),[]);const U=async()=>{if(!C)return;const e=["not_home","sales","call_back","opened"],o=new Date;o.setHours(0,0,0,0);const t={...A};for(const n of e){const e=await window.Codicent.getMessages({search:`#${n} #sales_code_${C}`,afterTimestamp:o,length:1e4});t[n]=e.filter((e=>e.content.includes(`#${n} `)&&e.content.includes(`#sales_code_${C}`))).length}F(t)},W=async(e,o="")=>{const t=await R();console.log("Got position",t);const n=`@${g("APP_NAME")} #sales_code_${C} #${e} ${t||""} ${o.trim().length>0?"#comment ":""}${o}`.trim();await window.Codicent.postMessage({message:n}),U()};return e(j,{hideHeader:!0,children:o("div",{className:f.root,children:[o("div",{className:f.header,children:[e(_,{src:D||g("APP_ICON_URL")||"https://via.placeholder.com/100",className:f.logo,onClick:()=>O&&G(!0)}),e("div",{className:f.inputContainer,children:e(c,{value:C,onChange:e=>w(e.target.value),onBlur:()=>{const e=P.find((e=>e.data.code===C));if(e)H(`https://codicent.com/app/GetImage?fileId=${e.fileId}&width=100`),T(e.data.link),z(!0),U();else{const e=P.find((e=>e.data.code2===C.toUpperCase()));e?(H(`https://codicent.com/app/GetImage?fileId=${e.fileIds&&e.fileIds.length>1?e.fileIds[1]:e.fileId}&width=100`),T(e.data.link2),z(!0),U()):(z(!1),alert(x("Fel försäljningskod!")))}},placeholder:x("Fyll i försäljningskod"),maxLength:16,size:"large"})})]}),L&&o(t,{children:[e("div",{className:f.dashboard,children:Object.keys(A).map((o=>{return e("div",{className:(t=o,k(f.statBox,f[t])),children:e(l,{weight:"bold",size:400,children:A[o]})},o);var t}))}),e("div",{className:f.buttonContainer,children:Object.entries(v).map((([o,t])=>e(a,{size:"large",className:f.actionButton,style:{backgroundColor:t,color:"white"},onClick:()=>{W(o),"opened"===o&&B(!0),"sales"===o&&G(!0)},children:o.charAt(0).toUpperCase()+o.slice(1).replace("_"," ")},o)))}),o(m,{open:N,children:[e(p,{children:x("Skriv in avvikelse")}),e(d,{children:e("div",{className:f.textAreaContainer,children:e(s,{value:S,onChange:e=>M(e.target.value),placeholder:x("Skriv din text här..."),rows:4,size:"large"})})}),e(h,{children:e(a,{appearance:"primary",onClick:()=>{W("anomaly",`\n${S}`),B(!1),M("")},children:x("Spara")})})]}),o(m,{open:E,children:[e(p,{children:x("Godkännande")}),e(d,{children:x("Är kunden över 23 år?")}),o(h,{children:[e(a,{appearance:"primary",onClick:()=>window.open(O,"_blank"),children:x("OK")}),e(a,{appearance:"secondary",onClick:()=>G(!1),children:x("Avbryt")})]})]})]})]})})};export{w as Sales,w as default};
1
+ import{jsx as e,jsxs as o,Fragment as t}from"react/jsx-runtime";import{useState as n,useCallback as i,useEffect as r}from"react";import"../components/Markdown.js";import{Textarea as s}from"../components/Textarea.js";import{Button as a}from"../components/Button.js";import"../components/CompoundButton.js";import{Text as l}from"../components/Text.js";import"../components/Spinner.js";import{Input as c}from"../components/Input.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import{Dialog as m,DialogTitle as p,DialogContent as d,DialogActions as h}from"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as g}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./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"../stores/chatStore.js";import u from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as j}from"../components/Page.js";import{makeStyles as f}from"../node_modules/@griffel/react/makeStyles.esm.js";import{tokens as x}from"../node_modules/@fluentui/tokens/lib/tokens.js";import{shorthands as C}from"../node_modules/@griffel/core/index.esm.js";import{Image as _}from"../node_modules/@fluentui/react-image/lib/components/Image/Image.js";import{mergeClasses as k}from"../node_modules/@griffel/core/mergeClasses.esm.js";const b=f({root:{display:"flex",flexDirection:"column",height:"100%",touchAction:"pan-y"},header:{display:"flex",justifyContent:"space-between",alignItems:"center",backgroundColor:g("APP_HEADER_COLOR")||x.colorBrandBackground,color:x.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"}}),v={opened:"#1a5614",not_home:"#f44336",sales:"#2196F3",call_back:"#FF9800"},w=()=>{const f=b(),{t:x}=u(),[C,w]=n(""),[y,I]=n(),[A,P]=n({opened:0,not_home:0,sales:0,call_back:0}),[F,$]=n([]),[N,B]=n(!1),[S,M]=n(""),[D,H]=n(""),[O,T]=n(""),[L,z]=n(!1),[E,G]=n(!1),R=i((()=>new Promise((e=>{navigator.geolocation?navigator.geolocation.getCurrentPosition((o=>{const t=`#position (${o.coords.latitude},${o.coords.longitude})`;e(t)})):e(void 0)}))),[I]);r((()=>{window.Codicent.getDataMessages({codicent:g("APP_NAME"),tags:["sales_code"]}).then((e=>{e=e.filter((e=>"1"!==e.data.inactive)),$(e)})).catch(console.error),R()}),[]);const U=async()=>{if(!C)return;const e=["not_home","sales","call_back","opened"],o=new Date;o.setHours(0,0,0,0);const t={...A};for(const n of e){const e=await window.Codicent.getMessages({search:`#${n} #sales_code_${C}`,afterTimestamp:o,length:1e4});t[n]=e.filter((e=>e.content.includes(`#${n} `)&&e.content.includes(`#sales_code_${C}`))).length}P(t)},W=async(e,o="")=>{const t=await R();console.log("Got position",t);const n=`@${g("APP_NAME")} #sales_code_${C} #${e} ${t||""} ${o.trim().length>0?"#comment ":""}${o}`.trim();await window.Codicent.postMessage({message:n}),U()};return e(j,{hideHeader:!0,children:o("div",{className:f.root,children:[o("div",{className:f.header,children:[e(_,{src:D||g("APP_ICON_URL")||"https://via.placeholder.com/100",className:f.logo,onClick:()=>O&&G(!0)}),e("div",{className:f.inputContainer,children:e(c,{value:C,onChange:e=>w(e.target.value),onBlur:()=>{const e=F.find((e=>e.data.code===C));if(e)H(`https://codicent.com/app/GetImage?fileId=${e.fileId}&width=100`),T(e.data.link),z(!0),U();else{const e=F.find((e=>e.data.code2===C.toUpperCase()));e?(H(`https://codicent.com/app/GetImage?fileId=${e.fileIds&&e.fileIds.length>1?e.fileIds[1]:e.fileId}&width=100`),T(e.data.link2),z(!0),U()):(z(!1),alert(x("Fel försäljningskod!")))}},placeholder:x("Fyll i försäljningskod"),maxLength:16,size:"large"})})]}),L&&o(t,{children:[e("div",{className:f.dashboard,children:Object.keys(A).map((o=>{return e("div",{className:(t=o,k(f.statBox,f[t])),children:e(l,{weight:"bold",size:400,children:A[o]})},o);var t}))}),e("div",{className:f.buttonContainer,children:Object.entries(v).map((([o,t])=>e(a,{size:"large",className:f.actionButton,style:{backgroundColor:t,color:"white"},onClick:()=>{W(o),"opened"===o&&B(!0),"sales"===o&&G(!0)},children:o.charAt(0).toUpperCase()+o.slice(1).replace("_"," ")},o)))}),o(m,{open:N,children:[e(p,{children:x("Skriv in avvikelse")}),e(d,{children:e("div",{className:f.textAreaContainer,children:e(s,{value:S,onChange:e=>M(e.target.value),placeholder:x("Skriv din text här..."),rows:4,size:"large"})})}),e(h,{children:e(a,{appearance:"primary",onClick:()=>{W("anomaly",`\n${S}`),B(!1),M("")},children:x("Spara")})})]}),o(m,{open:E,children:[e(p,{children:x("Godkännande")}),e(d,{children:x("Är kunden över 23 år?")}),o(h,{children:[e(a,{appearance:"primary",onClick:()=>window.open(O,"_blank"),children:x("OK")}),e(a,{appearance:"secondary",onClick:()=>G(!1),children:x("Avbryt")})]})]})]})]})})};export{w as Sales,w as default};
@@ -1 +1 @@
1
- import{jsx as o,jsxs as e}from"react/jsx-runtime";import{useRef as t,useState as n,useEffect as i}from"react";import r from"../components/Markdown.js";import"../components/Textarea.js";import{Button as s}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as a}from"../components/Title.js";import"../components/Spinner.js";import"../components/TextHeader.js";import m from"../components/TypingIndicator.js";import"../components/Dialog.js";import p from"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import l from"../hooks/useStateWithLocalStorage.js";import{CodicentService as c}from"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as d}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Login.js";import"./CrmPage.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import{useChat as u}from"../hooks/useChat.js";import g from"../hooks/useLocalization.js";import{useTemplateVariables as f}from"../hooks/useTemplateVariables.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as h}from"../components/Page.js";import{makeStyles as j}from"../node_modules/@griffel/react/makeStyles.esm.js";import{tokens as x}from"../node_modules/@fluentui/tokens/lib/tokens.js";const C=j({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",backgroundColor:d("CHAT_BOT_BACKGROUND_COLOR")||x.colorBrandBackground2,padding:"12px",borderRadius:"16px",marginBottom:"24px"},title:{marginLeft:"12px",padding:"16px"}}),A=({state:j})=>{const x=C(),{t:A}=g(),{messages:w,isBotTyping:T,handleSend:_,newChat:b}=u(j.stateMachine),v=t(null),{service:k}=j,[N,y]=l(j.context.selectedApp+"_searchprompts",["Leta information","Vad kan jag göra?","Sök supportställe"]),[S,I]=n(),[O,B]=n(null),[P,F]=n(!1);f(k.uploadFile);i((()=>{T&&F(!0)}),[T]),i((()=>{b();const o=d("APP_CONFIG"),e=d("APP_BUTTONS");e?o.apps[e].questions&&y(o.apps[e].questions.map((o=>A(o)))):console.error("APP_BUTTONS is not defined in the configuration."),void 0!==d("ANONYMOUS_CODICENT")&&void 0!==d("ANONYMOUS_TOKEN")?(k.codicent=d("ANONYMOUS_CODICENT"),k.setToken(d("ANONYMOUS_TOKEN"))):console.error("Anonymous Codicent or Token is not defined in the configuration.")}),[b,k,y,A]),i((()=>{setTimeout((()=>{v.current?.scrollIntoView({behavior:"smooth"})}),10)}),[w]);const M=o=>{I(o),_(o)};return i((()=>{const o=w.filter((o=>"bot"===o.sender));let e=o.length>0?o[o.length-1]:null;B({...e,createdAt:new Date}),e&&F(!1)}),[w]),o(h,{hideHeader:!0,hideFooter:!0,children:e("div",{id:"search-container",className:x.chatContainer,style:{backgroundImage:`url(${d("CHAT_BACKGROUND_IMAGE_URL")})`},children:[o("div",{className:x.title,children:o(a,{children:A(d("APP_SEARCH_TITLE")||"Frågor")})}),e("div",{className:x.inputArea,children:[o(p,{noMemory:!0,defaultText:S,codicent:j.context.selectedApp,disableSend:T,onSend:M,rows:3,getImageUrl:c.getImageUrl,getFileInfo:o=>k.getFileInfo(o),selectAll:!0}),o("div",{className:x.promptButtons,children:N.length>0&&N.map(((e,t)=>o(s,{onClick:()=>M(e),size:"large",appearance:"primary",shape:"circular",children:e},`search-prompt-${t}`)))}),P&&o(m,{}),O&&!T&&e("div",{className:x.answerArea,children:[o("div",{ref:v}),o(r,{content:O.content})]})]})]})})};export{A as default};
1
+ import{jsx as o,jsxs as e}from"react/jsx-runtime";import{useRef as t,useState as n,useEffect as i}from"react";import r from"../components/Markdown.js";import"../components/Textarea.js";import{Button as s}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as a}from"../components/Title.js";import"../components/Spinner.js";import"../components/TextHeader.js";import m from"../components/TypingIndicator.js";import"../components/Dialog.js";import p from"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import l from"../hooks/useStateWithLocalStorage.js";import{CodicentService as c}from"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as d}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import{useChat as g}from"../hooks/useChat.js";import u from"../hooks/useLocalization.js";import{useTemplateVariables as f}from"../hooks/useTemplateVariables.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as j}from"../components/Page.js";import{makeStyles as h}from"../node_modules/@griffel/react/makeStyles.esm.js";import{tokens as x}from"../node_modules/@fluentui/tokens/lib/tokens.js";const C=h({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",backgroundColor:d("CHAT_BOT_BACKGROUND_COLOR")||x.colorBrandBackground2,padding:"12px",borderRadius:"16px",marginBottom:"24px"},title:{marginLeft:"12px",padding:"16px"}}),A=({state:h})=>{const x=C(),{t:A}=u(),{messages:w,isBotTyping:T,handleSend:_,newChat:b}=g(h.stateMachine),v=t(null),{service:k}=h,[N,y]=l(h.context.selectedApp+"_searchprompts",["Leta information","Vad kan jag göra?","Sök supportställe"]),[S,I]=n(),[O,B]=n(null),[P,F]=n(!1);f(k.uploadFile);i((()=>{T&&F(!0)}),[T]),i((()=>{b();const o=d("APP_CONFIG"),e=d("APP_BUTTONS");e?o.apps[e].questions&&y(o.apps[e].questions.map((o=>A(o)))):console.error("APP_BUTTONS is not defined in the configuration."),void 0!==d("ANONYMOUS_CODICENT")&&void 0!==d("ANONYMOUS_TOKEN")?(k.codicent=d("ANONYMOUS_CODICENT"),k.setToken(d("ANONYMOUS_TOKEN"))):console.error("Anonymous Codicent or Token is not defined in the configuration.")}),[b,k,y,A]),i((()=>{setTimeout((()=>{v.current?.scrollIntoView({behavior:"smooth"})}),10)}),[w]);const M=o=>{I(o),_(o)};return i((()=>{const o=w.filter((o=>"bot"===o.sender));let e=o.length>0?o[o.length-1]:null;B({...e,createdAt:new Date}),e&&F(!1)}),[w]),o(j,{hideHeader:!0,hideFooter:!0,children:e("div",{id:"search-container",className:x.chatContainer,style:{backgroundImage:`url(${d("CHAT_BACKGROUND_IMAGE_URL")})`},children:[o("div",{className:x.title,children:o(a,{children:A(d("APP_SEARCH_TITLE")||"Frågor")})}),e("div",{className:x.inputArea,children:[o(p,{noMemory:!0,defaultText:S,codicent:h.context.selectedApp,disableSend:T,onSend:M,rows:3,getImageUrl:c.getImageUrl,getFileInfo:o=>k.getFileInfo(o),selectAll:!0}),o("div",{className:x.promptButtons,children:N.length>0&&N.map(((e,t)=>o(s,{onClick:()=>M(e),size:"large",appearance:"primary",shape:"circular",children:e},`search-prompt-${t}`)))}),P&&o(m,{}),O&&!T&&e("div",{className:x.answerArea,children:[o("div",{ref:v}),o(r,{content:O.content})]})]})]})})};export{A as default};
@@ -1 +1 @@
1
- import{jsxs as o,jsx as e}from"react/jsx-runtime";import{useState as t,useRef as i,useMemo as n,useCallback as r,useEffect as s}from"react";import{useSearchParams as a,useNavigate as p}from"react-router-dom";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{Text as m}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import{CombinedPlaceholderDialog as l}from"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import c from"../hooks/useLocalization.js";import{useTemplateVariables as d}from"../hooks/useTemplateVariables.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import h from"../components/MessageInput.js";import"../components/UploadFile.js";import u from"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import{makeStyles as g}from"../node_modules/@griffel/react/makeStyles.esm.js";const f=g({container:{position:"relative",height:"100vh",width:"100vw",overflow:"auto"},flashOverlay:{position:"fixed",top:0,left:0,width:"100%",height:"100%",backgroundColor:"transparent",transition:"background-color 0.2s ease-out",pointerEvents:"none",zIndex:3},video:{position:"absolute",top:0,left:0,width:"100%",height:"100%",objectFit:"cover",zIndex:1},canvas:{display:"none"},bottomControls:{position:"fixed",bottom:"100px",width:"100%",display:"flex",justifyContent:"center",alignItems:"center",zIndex:2,boxSizing:"border-box"},controlContainer:{width:"100%",maxWidth:"600px",position:"relative"},sendButton:{position:"absolute",right:"10px",bottom:"10px",width:"50px",height:"50px",borderRadius:"50%",backgroundColor:"#0078d4",color:"white",border:"none",cursor:"pointer",display:"flex",justifyContent:"center",alignItems:"center"},topControls:{position:"fixed",top:"20px",width:"100%",display:"flex",justifyContent:"space-between",alignItems:"center",zIndex:2,padding:"0 10px",boxSizing:"border-box"},backButton:{width:"60px",height:"60px",borderRadius:"50%",backgroundColor:"transparent",color:"white",border:"none",cursor:"pointer"},input:{padding:"5px",width:"200px",fontSize:"larger",backgroundColor:"#fff8"},bottomButtons:{position:"fixed",bottom:"0px",width:"100%",display:"flex",justifyContent:"space-around",alignItems:"center",zIndex:2,boxSizing:"border-box"},iconButton:{width:"60px",height:"60px",borderRadius:"50%",backgroundColor:"transparent",color:"white",border:"none",cursor:"pointer"},centerText:{position:"fixed",top:"30%",left:"50%",transform:"translate(-50%, -50%)",zIndex:2,textAlign:"center"}}),w=({state:g,audio:w})=>{const j=f(),{service:b}=g,[x,v]=t(null),[y,C]=t(!0),k=i(null),I=i(null),[F]=a(),S=F.get("extra"),T=F.get("template"),[z,V]=t(""),[$]=t("log"),B=n((()=>new Audio("/audio/camera.mp3")),[]),[E,M]=t(!1),P=p(),{t:N}=c(),{extractTemplateVariables:_}=d(b.uploadFile),[A,H]=t(_(T||"")),[D,L]=t(A.length>0),[O,R]=t(""),[U,W]=t(100),K=r((()=>A.map((o=>`#${o.value}`)).join(" ")),[A]);s((()=>{const o=K();R(`${S?" #"+S:""}${o.length>0?" "+o:""}`.trim())}),[A,S,K]),s((()=>{if(window.visualViewport){const o=()=>{const o=window.visualViewport?window.innerHeight-window.visualViewport.height:0;W(o>150?o+20:100)};return window.visualViewport.addEventListener("resize",o),o(),()=>{window.visualViewport&&window.visualViewport.removeEventListener("resize",o)}}}),[]);const q=async o=>{try{const e=new FormData;e.append("file",o);const t=await b.uploadFile(o.name,e),i=K(),n=`${$?" #"+$:""}${S?" #"+S:""}${i.length>0?" "+i:""} #photo #file:${t}`;await b.sendMessage(n)}catch(o){alert(N("Failed to send image:")+" "+o)}};return s((()=>()=>{x&&x.getTracks().forEach((o=>o.stop()))}),[x]),o("div",{className:j.container,children:[e("div",{className:j.flashOverlay,style:{backgroundColor:E?"#ffffff":"transparent"}}),e("video",{ref:k,autoPlay:!0,playsInline:!0,className:j.video}),e("canvas",{ref:I,width:"640",height:"480",className:j.canvas}),!x&&e(m,{weight:"semibold",size:400,className:j.centerText,children:N("Klicka på Byt kamera för att starta!")}),e("div",{className:j.bottomControls,style:{bottom:`${U}px`},children:e("div",{className:j.controlContainer,children:e(h,{defaultText:z,onSend:async()=>{if(""===z.trim())return;const o=K(),e=`${$?" #"+$:""}${S?" #"+S:""}${o.length>0?" "+o:""} ${z}`;try{await b.sendMessage(e),V("")}catch(o){alert(N("Failed to send message: ")+o)}},rows:4,onChange:V,disableSend:!0})})}),e("div",{className:j.bottomButtons,children:e(u,{audio:w,onHome:()=>P("/"),onTakePhoto:()=>{const o=I.current,e=k.current;if(o&&e){o.width=e.videoWidth,o.height=e.videoHeight;const t=o.getContext("2d");t&&(B.play(),M(!0),setTimeout((()=>M(!1)),100),t.drawImage(e,0,0,o.width,o.height),o.toBlob((o=>{if(o){const e=new File([o],"snapshot.png",{type:"image/png"});q(e)}})))}},onSwichCamera:()=>{C((o=>!o)),(async()=>{x&&x.getTracks().forEach((o=>o.stop()));const o={video:{facingMode:y?"user":"environment"},audio:!1};try{const e=await navigator.mediaDevices.getUserMedia(o);v(e),k.current&&(k.current.srcObject=e,k.current.play())}catch(o){console.error("Error accessing the camera: ",o),o instanceof Error?alert(N("Error accessing the camera:")+" "+o.message):alert(N("Error accessing the camera"))}})()},tag:O})}),e(l,{open:D,templateVariables:A,filePlaceholders:[],onTemplateVariablesChange:H,onFilePlaceholdersChange:()=>{},onConfirm:()=>L(!1),onCancel:()=>{L(!1),P(-1)},uploadFile:b.uploadFile})]})};export{w as default};
1
+ import{jsxs as o,jsx as e}from"react/jsx-runtime";import{useState as t,useRef as i,useMemo as n,useCallback as r,useEffect as s}from"react";import{useSearchParams as a,useNavigate as p}from"react-router-dom";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{Text as m}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import{CombinedPlaceholderDialog as l}from"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import c from"../hooks/useLocalization.js";import{useTemplateVariables as d}from"../hooks/useTemplateVariables.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import h from"../components/MessageInput.js";import"../components/UploadFile.js";import u from"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import{makeStyles as g}from"../node_modules/@griffel/react/makeStyles.esm.js";const f=g({container:{position:"relative",height:"100vh",width:"100vw",overflow:"auto"},flashOverlay:{position:"fixed",top:0,left:0,width:"100%",height:"100%",backgroundColor:"transparent",transition:"background-color 0.2s ease-out",pointerEvents:"none",zIndex:3},video:{position:"absolute",top:0,left:0,width:"100%",height:"100%",objectFit:"cover",zIndex:1},canvas:{display:"none"},bottomControls:{position:"fixed",bottom:"100px",width:"100%",display:"flex",justifyContent:"center",alignItems:"center",zIndex:2,boxSizing:"border-box"},controlContainer:{width:"100%",maxWidth:"600px",position:"relative"},sendButton:{position:"absolute",right:"10px",bottom:"10px",width:"50px",height:"50px",borderRadius:"50%",backgroundColor:"#0078d4",color:"white",border:"none",cursor:"pointer",display:"flex",justifyContent:"center",alignItems:"center"},topControls:{position:"fixed",top:"20px",width:"100%",display:"flex",justifyContent:"space-between",alignItems:"center",zIndex:2,padding:"0 10px",boxSizing:"border-box"},backButton:{width:"60px",height:"60px",borderRadius:"50%",backgroundColor:"transparent",color:"white",border:"none",cursor:"pointer"},input:{padding:"5px",width:"200px",fontSize:"larger",backgroundColor:"#fff8"},bottomButtons:{position:"fixed",bottom:"0px",width:"100%",display:"flex",justifyContent:"space-around",alignItems:"center",zIndex:2,boxSizing:"border-box"},iconButton:{width:"60px",height:"60px",borderRadius:"50%",backgroundColor:"transparent",color:"white",border:"none",cursor:"pointer"},centerText:{position:"fixed",top:"30%",left:"50%",transform:"translate(-50%, -50%)",zIndex:2,textAlign:"center"}}),w=({state:g,audio:w})=>{const j=f(),{service:b}=g,[x,v]=t(null),[y,C]=t(!0),k=i(null),I=i(null),[F]=a(),S=F.get("extra"),T=F.get("template"),[z,V]=t(""),[$]=t("log"),P=n((()=>new Audio("/audio/camera.mp3")),[]),[B,E]=t(!1),M=p(),{t:N}=c(),{extractTemplateVariables:_}=d(b.uploadFile),[A,H]=t(_(T||"")),[D,L]=t(A.length>0),[O,R]=t(""),[U,W]=t(100),K=r((()=>A.map((o=>`#${o.value}`)).join(" ")),[A]);s((()=>{const o=K();R(`${S?" #"+S:""}${o.length>0?" "+o:""}`.trim())}),[A,S,K]),s((()=>{if(window.visualViewport){const o=()=>{const o=window.visualViewport?window.innerHeight-window.visualViewport.height:0;W(o>150?o+20:100)};return window.visualViewport.addEventListener("resize",o),o(),()=>{window.visualViewport&&window.visualViewport.removeEventListener("resize",o)}}}),[]);const q=async o=>{try{const e=new FormData;e.append("file",o);const t=await b.uploadFile(o.name,e),i=K(),n=`${$?" #"+$:""}${S?" #"+S:""}${i.length>0?" "+i:""} #photo #file:${t}`;await b.sendMessage(n)}catch(o){alert(N("Failed to send image:")+" "+o)}};return s((()=>()=>{x&&x.getTracks().forEach((o=>o.stop()))}),[x]),o("div",{className:j.container,children:[e("div",{className:j.flashOverlay,style:{backgroundColor:B?"#ffffff":"transparent"}}),e("video",{ref:k,autoPlay:!0,playsInline:!0,className:j.video}),e("canvas",{ref:I,width:"640",height:"480",className:j.canvas}),!x&&e(m,{weight:"semibold",size:400,className:j.centerText,children:N("Klicka på Byt kamera för att starta!")}),e("div",{className:j.bottomControls,style:{bottom:`${U}px`},children:e("div",{className:j.controlContainer,children:e(h,{defaultText:z,onSend:async()=>{if(""===z.trim())return;const o=K(),e=`${$?" #"+$:""}${S?" #"+S:""}${o.length>0?" "+o:""} ${z}`;try{await b.sendMessage(e),V("")}catch(o){alert(N("Failed to send message: ")+o)}},rows:4,onChange:V,disableSend:!0})})}),e("div",{className:j.bottomButtons,children:e(u,{audio:w,onHome:()=>M("/"),onTakePhoto:()=>{const o=I.current,e=k.current;if(o&&e){o.width=e.videoWidth,o.height=e.videoHeight;const t=o.getContext("2d");t&&(P.play(),E(!0),setTimeout((()=>E(!1)),100),t.drawImage(e,0,0,o.width,o.height),o.toBlob((o=>{if(o){const e=new File([o],"snapshot.png",{type:"image/png"});q(e)}})))}},onSwichCamera:()=>{C((o=>!o)),(async()=>{x&&x.getTracks().forEach((o=>o.stop()));const o={video:{facingMode:y?"user":"environment"},audio:!1};try{const e=await navigator.mediaDevices.getUserMedia(o);v(e),k.current&&(k.current.srcObject=e,k.current.play())}catch(o){console.error("Error accessing the camera: ",o),o instanceof Error?alert(N("Error accessing the camera:")+" "+o.message):alert(N("Error accessing the camera"))}})()},tag:O})}),e(l,{open:D,templateVariables:A,filePlaceholders:[],onTemplateVariablesChange:H,onFilePlaceholdersChange:()=>{},onConfirm:()=>L(!1),onCancel:()=>{L(!1),M(-1)},uploadFile:b.uploadFile})]})};export{w as default};
@@ -6,6 +6,7 @@ export { default as Search } from "./Search";
6
6
  export { default as Login } from "./Login";
7
7
  export { default as Logout } from "./Logout";
8
8
  export { default as CrmPage } from "./CrmPage";
9
+ export { default as CrmPagePersistent } from "./CrmPagePersistent";
9
10
  export { default as ImageView } from "./ImageView";
10
11
  export { default as FormInvite } from "./FormInvite";
11
12
  export { default as FormAccept } from "./FormAccept";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pages/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEzC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAG7C,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pages/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEzC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAG7C,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.d.ts CHANGED
@@ -295,6 +295,7 @@ interface UseAuthState {
295
295
  registerUser: (nickname: string) => Promise<string>;
296
296
  codicentService: CodicentService;
297
297
  loginWithRedirect: (options?: RedirectLoginOptions<AppState>) => Promise<void>;
298
+ loginPasswordless: (email: string) => Promise<void>;
298
299
  }
299
300
  declare const useAuthState: (auth0: Auth0ContextInterface) => UseAuthState;
300
301
 
@@ -462,10 +463,28 @@ interface AudioRecorder extends RecordingState {
462
463
  }
463
464
  declare const useAudioRecorder: (onNewRecording: (file: FormData, tag: string) => void) => AudioRecorderState;
464
465
 
465
- declare const useTools: (api: CodicentService, setHtml: ((html: string | undefined) => void) | undefined, injectScript: ((script: string) => void) | undefined, beep: HTMLAudioElement, html?: string, stopVoiceSession?: () => void) => {
466
+ /**
467
+ * Represents a single tool with its definition and handler function
468
+ */
469
+ interface Tool {
466
470
  definition: any;
467
471
  handler: any;
468
- }[];
472
+ }
473
+ /**
474
+ * Strategy for merging custom tools with built-in tools
475
+ * - 'merge': Combine custom tools with built-in tools
476
+ * - 'replace': Use only custom tools, ignore built-in tools
477
+ * - 'builtin-only': Use only built-in tools, ignore custom tools
478
+ */
479
+ type ToolMergeStrategy = "merge" | "replace" | "builtin-only";
480
+ /**
481
+ * Configuration options for tools
482
+ */
483
+ interface ToolsConfig {
484
+ additionalTools?: Tool[];
485
+ mergeStrategy?: ToolMergeStrategy;
486
+ }
487
+ declare const useTools: (api: CodicentService, setHtml: ((html: string | undefined) => void) | undefined, injectScript: ((script: string) => void) | undefined, beep: HTMLAudioElement, html?: string, stopVoiceSession?: () => void, toolsConfig?: ToolsConfig) => Tool[];
469
488
 
470
489
  /**
471
490
  * Type for conversation items
@@ -572,9 +591,11 @@ interface CodicentAppState {
572
591
  script: string;
573
592
  currentStateName: string;
574
593
  }
575
- declare const useCodicentApp: ({ auth0 }: {
594
+ interface UseCodicentAppOptions {
576
595
  auth0: Auth0ContextInterface;
577
- }) => CodicentAppState;
596
+ toolsConfig?: ToolsConfig;
597
+ }
598
+ declare const useCodicentApp: ({ auth0, toolsConfig }: UseCodicentAppOptions) => CodicentAppState;
578
599
 
579
600
  declare const useAppStyles: () => Record<"button" | "roundButton" | "menuButton" | "pointer", string>;
580
601
 
@@ -814,6 +835,7 @@ interface AppConfigOptions {
814
835
  AUTH0_AUDIENCE: string;
815
836
  AUTH0_CLIENT_ID: string;
816
837
  AUTH0_DOMAIN: string;
838
+ AUTH0_PASSWORDLESS_ENABLED: boolean;
817
839
  AUTH0_PROVIDER_SCOPE: string;
818
840
  AUTH0_SCOPE: string;
819
841
  AUTH0_USER_DOMAIN: undefined | string;
@@ -935,6 +957,11 @@ declare const CrmPage: React__default.FC<{
935
957
  voice?: RealtimeVoice;
936
958
  }>;
937
959
 
960
+ declare const CrmPagePersistent: React__default.FC<{
961
+ state: CodicentAppState;
962
+ voice?: RealtimeVoice;
963
+ }>;
964
+
938
965
  declare const ImageViewer: ({ state }: {
939
966
  state: CodicentAppState;
940
967
  }) => react_jsx_runtime.JSX.Element;
@@ -958,4 +985,4 @@ declare const Purchase: ({ state }: {
958
985
  state: CodicentAppState;
959
986
  }) => react_jsx_runtime.JSX.Element;
960
987
 
961
- export { AiInput, AppConfig, AppConfigOptions, AppFrame, AppInfo, AppStateDefinition, AppStateMachine, AudioIcon, AudioRecorder, AudioRecorderState, Button, Chat, ChatInput, ChatMessage, CodicentAppState, CodicentService, CodicentServiceOptions, ColorPicker, CombinedPlaceholderDialog, Compose, CompoundButton, Content, CrmPage, DatePicker, FilePlaceholder, FileThumbnail, Footer, Form, FormAccept, FormInvite, Header, HtmlView, HtmlViewer, ImageViewer as ImageView, Input, ItemType, Label, Login, Logout, Markdown, Message$1 as Message, Content$1 as MessageContent, MessageInput, MessageItem, Page, Profile, Prompt, Purchase, RealtimeVoice, Sales, Search, SearchBox, Snap, SnapFooter, Spinner, StateContext, TemplateVariable, Text, TextHeader, Textarea, TimePicker, Title, TypingIndicator, UploadFile, UploadFileProps, UploadFileRef, UrlProcessor, UseAuthState, UserInfo, VoiceIcon, WavRecorder, WavStreamPlayer, createAppStateMachine, generateBrandVariants, getConfigValue, getGpsLocation, getTimeString, initCodicentApp, isMobileDevice, log, useAppStyles, useAudioRecorder, useAuthState, useChat, useCodicentApp, useCodicentState, useLocalization, useRealtimeVoiceAI, useStateWithLocalStorage, useTemplateVariables, useToaster, useTools, withWakeLock };
988
+ export { AiInput, AppConfig, AppConfigOptions, AppFrame, AppInfo, AppStateDefinition, AppStateMachine, AudioIcon, AudioRecorder, AudioRecorderState, Button, Chat, ChatInput, ChatMessage, CodicentAppState, CodicentService, CodicentServiceOptions, ColorPicker, CombinedPlaceholderDialog, Compose, CompoundButton, Content, CrmPage, CrmPagePersistent, DatePicker, FilePlaceholder, FileThumbnail, Footer, Form, FormAccept, FormInvite, Header, HtmlView, HtmlViewer, ImageViewer as ImageView, Input, ItemType, Label, Login, Logout, Markdown, Message$1 as Message, Content$1 as MessageContent, MessageInput, MessageItem, Page, Profile, Prompt, Purchase, RealtimeVoice, Sales, Search, SearchBox, Snap, SnapFooter, Spinner, StateContext, TemplateVariable, Text, TextHeader, Textarea, TimePicker, Title, Tool, ToolMergeStrategy, ToolsConfig, TypingIndicator, UploadFile, UploadFileProps, UploadFileRef, UrlProcessor, UseAuthState, UseCodicentAppOptions, UserInfo, VoiceIcon, WavRecorder, WavStreamPlayer, createAppStateMachine, generateBrandVariants, getConfigValue, getGpsLocation, getTimeString, initCodicentApp, isMobileDevice, log, useAppStyles, useAudioRecorder, useAuthState, useChat, useCodicentApp, useCodicentState, useLocalization, useRealtimeVoiceAI, useStateWithLocalStorage, useTemplateVariables, useToaster, useTools, withWakeLock };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codicent-app-sdk",
3
- "version": "0.3.97",
3
+ "version": "0.3.98",
4
4
  "description": "SDK for building AI-powered applications with Codicent",
5
5
  "type": "module",
6
6
  "main": "dist/cjs/index.js",