codicent-app-sdk 0.3.97 → 0.3.99
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/dist/cjs/components/AiInput.js +1 -1
- package/dist/cjs/components/AudioIcon.js +1 -1
- package/dist/cjs/components/ChatInput.js +1 -1
- package/dist/cjs/components/ChatMessage.js +1 -1
- package/dist/cjs/components/CombinedPlaceholderDialog.js +1 -1
- package/dist/cjs/components/Footer.js +1 -1
- package/dist/cjs/components/Header.js +1 -1
- package/dist/cjs/components/HtmlView.js +1 -1
- package/dist/cjs/components/MessageInput.js +1 -1
- package/dist/cjs/components/MessageItem.js +1 -1
- package/dist/cjs/components/Profile.js +1 -1
- package/dist/cjs/components/Prompt.js +1 -1
- package/dist/cjs/components/SnapFooter.js +1 -1
- package/dist/cjs/components/TextHeader.js +1 -1
- package/dist/cjs/components/TypingIndicator.js +1 -1
- package/dist/cjs/components/UploadFile.js +1 -1
- package/dist/cjs/components/UrlProcessor.js +1 -1
- package/dist/cjs/components/VoiceIcon.js +1 -1
- package/dist/cjs/config/index.d.ts +9 -0
- package/dist/cjs/config/index.d.ts.map +1 -1
- package/dist/cjs/config/index.js +1 -1
- package/dist/cjs/hooks/index.d.ts +1 -0
- package/dist/cjs/hooks/index.d.ts.map +1 -1
- package/dist/cjs/hooks/useAuthState.d.ts +1 -0
- package/dist/cjs/hooks/useAuthState.d.ts.map +1 -1
- package/dist/cjs/hooks/useAuthState.js +1 -1
- package/dist/cjs/hooks/useChat.js +1 -1
- package/dist/cjs/hooks/useCodicentApp.d.ts +5 -2
- package/dist/cjs/hooks/useCodicentApp.d.ts.map +1 -1
- package/dist/cjs/hooks/useCodicentApp.js +1 -1
- package/dist/cjs/hooks/useCodicentState.js +1 -1
- package/dist/cjs/hooks/useRealtimeVoiceAI.d.ts.map +1 -1
- package/dist/cjs/hooks/useRealtimeVoiceAI.js +1 -1
- package/dist/cjs/hooks/useTools.d.ts +20 -2
- package/dist/cjs/hooks/useTools.d.ts.map +1 -1
- package/dist/cjs/hooks/useTools.js +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/node_modules/@openai/realtime-api-beta/lib/api.js +1 -0
- package/dist/cjs/node_modules/@openai/realtime-api-beta/lib/client.js +1 -0
- package/dist/cjs/node_modules/@openai/realtime-api-beta/lib/conversation.js +1 -0
- package/dist/cjs/node_modules/@openai/realtime-api-beta/lib/event_handler.js +1 -0
- package/dist/cjs/node_modules/@openai/realtime-api-beta/lib/utils.js +1 -0
- package/dist/cjs/pages/AppFrame.js +1 -1
- package/dist/cjs/pages/Chat.js +1 -1
- package/dist/cjs/pages/Compose.js +1 -1
- package/dist/cjs/pages/CrmPage.js +1 -1
- package/dist/cjs/pages/CrmPagePersistent.d.ts +8 -0
- package/dist/cjs/pages/CrmPagePersistent.d.ts.map +1 -0
- package/dist/cjs/pages/CrmPagePersistent.js +1 -0
- package/dist/cjs/pages/FormAccept.js +1 -1
- package/dist/cjs/pages/FormInvite.js +1 -1
- package/dist/cjs/pages/HtmlViewer.js +1 -1
- package/dist/cjs/pages/ImageView.js +1 -1
- package/dist/cjs/pages/Login.d.ts.map +1 -1
- package/dist/cjs/pages/Login.js +1 -1
- package/dist/cjs/pages/Purchase.js +1 -1
- package/dist/cjs/pages/Sales.js +1 -1
- package/dist/cjs/pages/Search.js +1 -1
- package/dist/cjs/pages/Snap.js +1 -1
- package/dist/cjs/pages/index.d.ts +1 -0
- package/dist/cjs/pages/index.d.ts.map +1 -1
- package/dist/cjs/services/codicent.js +1 -1
- package/dist/cjs/utils/appState.d.ts +45 -0
- package/dist/cjs/utils/appState.d.ts.map +1 -1
- package/dist/cjs/utils/appState.js +1 -1
- package/dist/cjs/utils/cacheManager.d.ts +85 -0
- package/dist/cjs/utils/cacheManager.d.ts.map +1 -0
- package/dist/cjs/utils/cacheManager.js +1 -0
- package/dist/cjs/utils/index.d.ts +2 -0
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/esm/components/AiInput.js +1 -1
- package/dist/esm/components/AudioIcon.js +1 -1
- package/dist/esm/components/ChatInput.js +1 -1
- package/dist/esm/components/ChatMessage.js +1 -1
- package/dist/esm/components/CombinedPlaceholderDialog.js +1 -1
- package/dist/esm/components/Footer.js +1 -1
- package/dist/esm/components/Header.js +1 -1
- package/dist/esm/components/HtmlView.js +1 -1
- package/dist/esm/components/MessageInput.js +1 -1
- package/dist/esm/components/MessageItem.js +1 -1
- package/dist/esm/components/Profile.js +1 -1
- package/dist/esm/components/Prompt.js +1 -1
- package/dist/esm/components/SnapFooter.js +1 -1
- package/dist/esm/components/TextHeader.js +1 -1
- package/dist/esm/components/TypingIndicator.js +1 -1
- package/dist/esm/components/UploadFile.js +1 -1
- package/dist/esm/components/UrlProcessor.js +1 -1
- package/dist/esm/components/VoiceIcon.js +1 -1
- package/dist/esm/config/index.d.ts +9 -0
- package/dist/esm/config/index.d.ts.map +1 -1
- package/dist/esm/config/index.js +1 -1
- package/dist/esm/hooks/index.d.ts +1 -0
- package/dist/esm/hooks/index.d.ts.map +1 -1
- package/dist/esm/hooks/useAuthState.d.ts +1 -0
- package/dist/esm/hooks/useAuthState.d.ts.map +1 -1
- package/dist/esm/hooks/useAuthState.js +1 -1
- package/dist/esm/hooks/useChat.js +1 -1
- package/dist/esm/hooks/useCodicentApp.d.ts +5 -2
- package/dist/esm/hooks/useCodicentApp.d.ts.map +1 -1
- package/dist/esm/hooks/useCodicentApp.js +1 -1
- package/dist/esm/hooks/useCodicentState.js +1 -1
- package/dist/esm/hooks/useRealtimeVoiceAI.d.ts.map +1 -1
- package/dist/esm/hooks/useRealtimeVoiceAI.js +1 -1
- package/dist/esm/hooks/useTools.d.ts +20 -2
- package/dist/esm/hooks/useTools.d.ts.map +1 -1
- package/dist/esm/hooks/useTools.js +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/node_modules/@openai/realtime-api-beta/lib/api.js +1 -0
- package/dist/esm/node_modules/@openai/realtime-api-beta/lib/client.js +1 -0
- package/dist/esm/node_modules/@openai/realtime-api-beta/lib/conversation.js +1 -0
- package/dist/esm/node_modules/@openai/realtime-api-beta/lib/event_handler.js +1 -0
- package/dist/esm/node_modules/@openai/realtime-api-beta/lib/utils.js +1 -0
- package/dist/esm/pages/AppFrame.js +1 -1
- package/dist/esm/pages/Chat.js +1 -1
- package/dist/esm/pages/Compose.js +1 -1
- package/dist/esm/pages/CrmPage.js +1 -1
- package/dist/esm/pages/CrmPagePersistent.d.ts +8 -0
- package/dist/esm/pages/CrmPagePersistent.d.ts.map +1 -0
- package/dist/esm/pages/CrmPagePersistent.js +1 -0
- package/dist/esm/pages/FormAccept.js +1 -1
- package/dist/esm/pages/FormInvite.js +1 -1
- package/dist/esm/pages/HtmlViewer.js +1 -1
- package/dist/esm/pages/ImageView.js +1 -1
- package/dist/esm/pages/Login.d.ts.map +1 -1
- package/dist/esm/pages/Login.js +1 -1
- package/dist/esm/pages/Purchase.js +1 -1
- package/dist/esm/pages/Sales.js +1 -1
- package/dist/esm/pages/Search.js +1 -1
- package/dist/esm/pages/Snap.js +1 -1
- package/dist/esm/pages/index.d.ts +1 -0
- package/dist/esm/pages/index.d.ts.map +1 -1
- package/dist/esm/services/codicent.js +1 -1
- package/dist/esm/utils/appState.d.ts +45 -0
- package/dist/esm/utils/appState.d.ts.map +1 -1
- package/dist/esm/utils/appState.js +1 -1
- package/dist/esm/utils/cacheManager.d.ts +85 -0
- package/dist/esm/utils/cacheManager.d.ts.map +1 -0
- package/dist/esm/utils/cacheManager.js +1 -0
- package/dist/esm/utils/index.d.ts +2 -0
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/index.d.ts +170 -5
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useMemo as e}from"react";import{getConfigValue as t}from"../config/index.js";const s=(s,a=e=>{console.log(e)},n=e=>{console.log(e)},r,i,o=()=>{console.log("stopVoiceSession")})=>e((()=>{const e=[],
|
|
1
|
+
import{useMemo as e}from"react";import{getConfigValue as t}from"../config/index.js";const s=(s,a=e=>{console.log(e)},n=e=>{console.log(e)},r,i,o=()=>{console.log("stopVoiceSession")},p)=>e((()=>{const e=[],c=(t,s)=>{e.push({definition:t,handler:s})},d=async()=>{const e=t("APP_CONFIG"),a=t("APP_BUTTONS");return[...a&&e.apps[a]?e.apps[a].tasks:[],...await s.getAppTasks()]};c({name:"stop_voice_session",description:"Stops the voice session.",parameters:{type:"object",properties:{}}},(async()=>(console.log("TOOL: stop_voice_session"),a(void 0),o(),{ok:!0}))),c({name:"inject_script",description:"Injects a script into the html/canvas view.",parameters:{type:"object",properties:{script:{type:"string",description:"The script to inject"}},required:["script"]}},(async({script:e})=>(console.log("TOOL: inject_script",e),n(e),{ok:!0}))),c({name:"post_codicent_message",description:"Posts a message to Codicent, only when requested by the user.",parameters:{type:"object",properties:{content:{type:"string",description:'The codicent message text, e.g. "remember to call Linda"'},parent_id:{type:"string",description:'The parent message id of a previous message that you will add a new revision to, by setting parent_id to the origin message being "edited"'}},required:["content"]}},(async({content:e,parent_id:t})=>await s.sendMessage(e,t))),c({name:"update_codicent_message",description:"Posts an edited message, which replaces the old message.",parameters:{type:"object",properties:{content:{type:"string",description:'The updated codicent message text, e.g. "remember to call Johan", usually including the tags from the original message.'},parent_id:{type:"string",description:"The message id of a previous/old message to be updated."}},required:["content","parent_id"]}},(async({content:e,parent_id:t})=>await s.sendMessage(e,t))),c({name:"get_messages_list",description:"Gets messages tagged with given tag name, optionally limited by num_messages. The messages are listed in chronological order, latest first.",parameters:{type:"object",properties:{num_messages:{type:"integer",description:"The number of matching messages to return"},search_text:{type:"string",description:"Search text to filter messages by"},tag_name:{type:"string",description:"Name of tag to find messages by"},after_timestamp:{type:"string",description:"Only return messages after this timestamp"},before_timestamp:{type:"string",description:"Only return messages before this timestamp"}},required:["num_messages"]}},(async({num_messages:e,search_text:t,tag_name:a,after_timestamp:n,before_timestamp:r})=>{let i=await s.getMessages(a?[a]:[]);return t&&(i=i.filter((e=>e.content.includes(t)))),n&&(i=i.filter((e=>e.createdAt>n))),r&&(i=i.filter((e=>e.createdAt<r))),i.slice(0,e)})),c({name:"chat_with_codicent_ai",description:"Sends a message to Codicent AI and gets a response message back. Remember that you can always ask codicent via this tool to find out more about what you can achieve from chatting with the codicent AI.",parameters:{type:"object",properties:{message:{type:"string",description:"Text of message to the codicent"}},required:["message"]}},(async({message:e})=>await s.chat(e))),c({name:"create_todo",description:"Saves a todo message in Codicent.",parameters:{type:"object",properties:{text:{type:"string",description:"Text of todo"}},required:["text"]}},(async({text:e})=>await s.sendMessage("#todo "+e))),c({name:"place_order",description:"Places and order with the Codicent AI.",parameters:{type:"object",properties:{message:{type:"string",description:"The text message of the order as spoken by the user."}},required:["message"]}},(async({message:e})=>await s.sendMessage(`#do Jag kommer ge dig en text (nedan) på vad jag ska beställa. Använd bara den text du får av mig, inga tools.\n Du ska skapa en tabell med detaljerad information inklusive lagerstatus \n för varje artikel i beställningen. Svara först när du har all info på plats. Ställ inga frågor på vägen utan använd det du får av mig.\n \n ----\n EXEMPEL PÅ SVAR:\n ----\n Här är en tabell med detaljerad information inklusive lagerstatus för varje artikel i beställningen:\n \n Artikel\tHyresobjekt\tNamn\tLagertyp\tGrupp\tNamn.1\tSRA/SBEF\tLeverantör\tLevnr\tDepå\tLager\tReserverat\tUthyrt nu\tTillgängligt nu\tMärke/typ\tTillverkarnr\tTillv.år\tInköpsdato\tInköpspris\tVikt\n Elverk\t12345\tElverk 1\tHyresobjekt\tMaskiner\tElverk\tSRA\tLeverantör A\t001\tDepå 1\t5\t0\t1\t4\tHonda EU22i\t123456\t2020\t2020-01-01\t10000 SEK\t21 kg\n Elverk\t12345\tElverk 2\tHyresobjekt\tMaskiner\tElverk\tSRA\tLeverantör B\t002\tDepå 2\t3\t0\t1\t2\tYamaha EF2000iS\t654321\t2019\t2019-05-01\t9000 SEK\t20 kg\n Observera att denna tabell är baserad på den information som finns tillgänglig i lagerstatusen. Om du behöver ytterligare detaljer eller om något specifikt saknas, vänligen meddela mig.\n ----\n \n --- här följer texten på vad jag vill beställa ---\n \n \n ${e}`))),c({name:"remember_info",description:"Saves info in your internal memory for future use. Use this tool to save insights on how to perform our conversations and tasks related to them.",parameters:{type:"object",properties:{message:{type:"string",description:"Your insights to improve our future conversations."}},required:["message"]}},(async({message:e})=>await s.sendMessage(`#index #insights\n\n${e}`))),c({name:"save_to_crm",description:"Saves CRM related info to your memory (logbook).",parameters:{type:"object",properties:{message:{type:"string",description:"CRM log entry description/contents."},company:{type:"string",description:"Company name for CRM log entry."},contact:{type:"string",description:"Contact name for CRM log entry."}},required:["message","company"]}},(async({message:e,company:t,contact:a})=>await s.sendMessage(`#crm\n\nFöretag: ${t}\n\nInfo: ${e}${a?"\n\nKontakt: "+a:""}`))),c({name:"set_page_html",description:"Sets the innerHtml of the div covering the full app page. You can display any html/javascript/style/mermaid content here for the user to see ;-). This view is usually referred to as the canvas, or tavlan in Swedish.",parameters:{type:"object",properties:{html:{type:"string",description:"The inner html to set the page to."}},required:["html"]}},(async({html:e})=>(a(e),r.play(),{ok:!0}))),c({name:"hide_page_html",description:"Hides the inner html of the page.",parameters:{type:"object",properties:{}}},(async()=>(a(void 0),{ok:!0}))),c({name:"get_page_html",description:"Gets the inner html of the page.",parameters:{type:"object",properties:{}}},(async()=>({html:i}))),c({name:"get_tasks",description:"Gets the list of possible tasks that can be performed. This lists task names and their id:s. Use get_task to get the task instructions given a task id.",parameters:{type:"object",properties:{},required:[]}},(async e=>(await d()).map((e=>({id:e.id,name:e.title}))))),c({name:"get_task",description:"Gets the task instructions for a given task id. Use get_tasks to get a list of possible tasks (with their id:s).",parameters:{type:"object",properties:{task_id:{type:"string",description:"The task id to get instructions for."}},required:["task_id"]}},(async({task_id:e})=>{const t=(await d()).find((t=>t.id===e));return t?t.content:"Task not found"}));const{additionalTools:m=[],mergeStrategy:g="merge"}=p||{};return"replace"===g?m:"builtin-only"===g?e:[...e,...m]}),[s,a,n,i,r,p]);export{s as default};
|
package/dist/esm/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{CodicentService}from"./services/codicent.js";export{default as Markdown}from"./components/Markdown.js";export{Textarea}from"./components/Textarea.js";export{Button}from"./components/Button.js";export{CompoundButton}from"./components/CompoundButton.js";export{Title}from"./components/Title.js";export{Text}from"./components/Text.js";export{Spinner}from"./components/Spinner.js";export{Label}from"./components/Label.js";export{Input}from"./components/Input.js";export{default as TextHeader}from"./components/TextHeader.js";export{default as TypingIndicator}from"./components/TypingIndicator.js";export{default as Prompt}from"./components/Prompt.js";export{default as ChatInput}from"./components/ChatInput.js";export{CombinedPlaceholderDialog}from"./components/CombinedPlaceholderDialog.js";export{default as ChatMessage}from"./components/ChatMessage.js";export{Header}from"./components/Header.js";export{default as VoiceIcon}from"./components/VoiceIcon.js";export{default as AudioIcon}from"./components/AudioIcon.js";export{FileThumbnail}from"./components/FileThumbnail.js";export{default as MessageInput}from"./components/MessageInput.js";export{default as UploadFile}from"./components/UploadFile.js";export{default as SnapFooter}from"./components/SnapFooter.js";export{default as Profile}from"./components/Profile.js";export{default as MessageItem}from"./components/MessageItem.js";export{default as Content}from"./components/Content.js";export{default as AiInput}from"./components/AiInput.js";export{default as SearchBox}from"./components/SearchBox.js";export{default as HtmlView}from"./components/HtmlView.js";export{Footer}from"./components/Footer.js";export{Page}from"./components/Page.js";export{UrlProcessor}from"./components/UrlProcessor.js";export{DatePicker}from"./components/DatePicker.js";export{ColorPicker}from"./components/ColorPicker.js";export{TimePicker}from"./components/TimePicker.js";export{default as useStateWithLocalStorage}from"./hooks/useStateWithLocalStorage.js";export{default as useAuthState}from"./hooks/useAuthState.js";export{useChat}from"./hooks/useChat.js";export{default as useCodicentState}from"./hooks/useCodicentState.js";export{useAudioRecorder}from"./hooks/useAudioRecorder.js";export{default as useTools}from"./hooks/useTools.js";export{default as useRealtimeVoiceAI}from"./hooks/useRealtimeVoiceAI.js";export{default as useLocalization}from"./hooks/useLocalization.js";export{useTemplateVariables}from"./hooks/useTemplateVariables.js";export{useCodicentApp}from"./hooks/useCodicentApp.js";export{default as useAppStyles}from"./hooks/useAppStyles.js";export{default as useToaster}from"./hooks/useToaster.js";export{default as MessageContent}from"./utils/MessageContent.js";export{default as generateBrandVariants}from"./utils/theme.js";export{default as log}from"./utils/logging.js";export{default as withWakeLock}from"./utils/withWakeLock.js";export{AppStateMachine,createAppStateMachine}from"./utils/appState.js";import{d as e}from"./_virtual/index.js";import"./lib/wavtools/lib/wav_packer.js";import"./lib/wavtools/lib/analysis/audio_analysis.js";export{WavStreamPlayer}from"./lib/wavtools/lib/wav_stream_player.js";export{WavRecorder}from"./lib/wavtools/lib/wav_recorder.js";export{getGpsLocation,isMobileDevice}from"./utils/device.js";export{getTimeString}from"./utils/helpers.js";export{AppConfig,getConfigValue,initCodicentApp}from"./config/index.js";export{default as AppFrame}from"./pages/AppFrame.js";export{default as Chat}from"./pages/Chat.js";export{Compose}from"./pages/Compose.js";export{default as Snap}from"./pages/Snap.js";export{default as Search}from"./pages/Search.js";export{default as Login}from"./pages/Login.js";export{Logout}from"./pages/Logout.js";export{CrmPage}from"./pages/CrmPage.js";export{default as ImageView}from"./pages/ImageView.js";export{default as FormInvite}from"./pages/FormInvite.js";export{default as FormAccept}from"./pages/FormAccept.js";export{Sales}from"./pages/Sales.js";export{default as HtmlViewer}from"./pages/HtmlViewer.js";export{Purchase}from"./pages/Purchase.js";var o=e.StateMachine;export{o as StateMachine};
|
|
1
|
+
export{CodicentService}from"./services/codicent.js";export{default as Markdown}from"./components/Markdown.js";export{Textarea}from"./components/Textarea.js";export{Button}from"./components/Button.js";export{CompoundButton}from"./components/CompoundButton.js";export{Title}from"./components/Title.js";export{Text}from"./components/Text.js";export{Spinner}from"./components/Spinner.js";export{Label}from"./components/Label.js";export{Input}from"./components/Input.js";export{default as TextHeader}from"./components/TextHeader.js";export{default as TypingIndicator}from"./components/TypingIndicator.js";export{default as Prompt}from"./components/Prompt.js";export{default as ChatInput}from"./components/ChatInput.js";export{CombinedPlaceholderDialog}from"./components/CombinedPlaceholderDialog.js";export{default as ChatMessage}from"./components/ChatMessage.js";export{Header}from"./components/Header.js";export{default as VoiceIcon}from"./components/VoiceIcon.js";export{default as AudioIcon}from"./components/AudioIcon.js";export{FileThumbnail}from"./components/FileThumbnail.js";export{default as MessageInput}from"./components/MessageInput.js";export{default as UploadFile}from"./components/UploadFile.js";export{default as SnapFooter}from"./components/SnapFooter.js";export{default as Profile}from"./components/Profile.js";export{default as MessageItem}from"./components/MessageItem.js";export{default as Content}from"./components/Content.js";export{default as AiInput}from"./components/AiInput.js";export{default as SearchBox}from"./components/SearchBox.js";export{default as HtmlView}from"./components/HtmlView.js";export{Footer}from"./components/Footer.js";export{Page}from"./components/Page.js";export{UrlProcessor}from"./components/UrlProcessor.js";export{DatePicker}from"./components/DatePicker.js";export{ColorPicker}from"./components/ColorPicker.js";export{TimePicker}from"./components/TimePicker.js";export{default as useStateWithLocalStorage}from"./hooks/useStateWithLocalStorage.js";export{default as useAuthState}from"./hooks/useAuthState.js";export{useChat}from"./hooks/useChat.js";export{default as useCodicentState}from"./hooks/useCodicentState.js";export{useAudioRecorder}from"./hooks/useAudioRecorder.js";export{default as useTools}from"./hooks/useTools.js";export{default as useRealtimeVoiceAI}from"./hooks/useRealtimeVoiceAI.js";export{default as useLocalization}from"./hooks/useLocalization.js";export{useTemplateVariables}from"./hooks/useTemplateVariables.js";export{useCodicentApp}from"./hooks/useCodicentApp.js";export{default as useAppStyles}from"./hooks/useAppStyles.js";export{default as useToaster}from"./hooks/useToaster.js";export{default as MessageContent}from"./utils/MessageContent.js";export{default as generateBrandVariants}from"./utils/theme.js";export{default as log}from"./utils/logging.js";export{default as withWakeLock}from"./utils/withWakeLock.js";export{AppStateMachine,createAppStateMachine}from"./utils/appState.js";import{d as e}from"./_virtual/index.js";import"./lib/wavtools/lib/wav_packer.js";import"./lib/wavtools/lib/analysis/audio_analysis.js";export{WavStreamPlayer}from"./lib/wavtools/lib/wav_stream_player.js";export{WavRecorder}from"./lib/wavtools/lib/wav_recorder.js";export{getGpsLocation,isMobileDevice}from"./utils/device.js";export{getTimeString}from"./utils/helpers.js";export{CacheManager,stateMachineCacheManager}from"./utils/cacheManager.js";export{AppConfig,getConfigValue,initCodicentApp}from"./config/index.js";export{default as AppFrame}from"./pages/AppFrame.js";export{default as Chat}from"./pages/Chat.js";export{Compose}from"./pages/Compose.js";export{default as Snap}from"./pages/Snap.js";export{default as Search}from"./pages/Search.js";export{default as Login}from"./pages/Login.js";export{Logout}from"./pages/Logout.js";export{CrmPage}from"./pages/CrmPage.js";export{CrmPagePersistent}from"./pages/CrmPagePersistent.js";export{default as ImageView}from"./pages/ImageView.js";export{default as FormInvite}from"./pages/FormInvite.js";export{default as FormAccept}from"./pages/FormAccept.js";export{Sales}from"./pages/Sales.js";export{default as HtmlViewer}from"./pages/HtmlViewer.js";export{Purchase}from"./pages/Purchase.js";var o=e.StateMachine;export{o as StateMachine};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{RealtimeEventHandler as e}from"./event_handler.js";import{RealtimeUtils as t}from"./utils.js";class s extends e{constructor({url:e,apiKey:t,dangerouslyAllowAPIKeyInBrowser:s,debug:r}={}){if(super(),this.defaultUrl="wss://api.openai.com/v1/realtime",this.url=e||this.defaultUrl,this.apiKey=t||null,this.debug=!!r,this.ws=null,globalThis.document&&this.apiKey&&!s)throw new Error('Can not provide API key in the browser without "dangerouslyAllowAPIKeyInBrowser" set to true')}isConnected(){return!!this.ws}log(...e){const t=[`[Websocket/${(new Date).toISOString()}]`].concat(e).map((e=>"object"==typeof e&&null!==e?JSON.stringify(e,null,2):e));return this.debug&&console.log(...t),!0}async connect({model:e}={model:"gpt-4o-realtime-preview-2024-10-01"}){if(this.apiKey||this.url!==this.defaultUrl||console.warn(`No apiKey provided for connection to "${this.url}"`),this.isConnected())throw new Error("Already connected");if(globalThis.WebSocket){globalThis.document&&this.apiKey&&console.warn("Warning: Connecting using API key in the browser, this is not recommended");const e=new(0,globalThis.WebSocket)(`${this.url}`,["realtime",`websocket.api_key.${this.apiKey}`]);return e.addEventListener("message",(e=>{const t=JSON.parse(e.data);this.receive(t.type,t)})),new Promise(((t,s)=>{const r=()=>{this.disconnect(e),s(new Error(`Could not connect to "${this.url}"`))};e.addEventListener("error",r),e.addEventListener("open",(()=>{this.log(`Connected to "${this.url}"`),e.removeEventListener("error",r),e.addEventListener("error",(()=>{this.disconnect(e),this.log(`Error, disconnected from "${this.url}"`),this.dispatch("close",{error:!0})})),e.addEventListener("close",(()=>{this.disconnect(e),this.log(`Disconnected from "${this.url}"`),this.dispatch("close",{error:!1})})),this.ws=e,t(!0)}))}))}{const t="ws",s=new(0,(await import(t)).default)(`${this.url||"wss://api.openai.com/v1/realtime"}${e?`?model=${e}`:""}`,[],{finishRequest:e=>{e.setHeader("Authorization",`Bearer ${this.apiKey}`),e.setHeader("OpenAI-Beta","realtime=v1"),e.setHeader("api-key",this.apiKey),e.end()}});return s.on("message",(e=>{const t=JSON.parse(e.toString());this.receive(t.type,t)})),new Promise(((e,t)=>{const r=()=>{this.disconnect(s),t(new Error(`Could not connect to "${this.url}"`))};s.on("error",r),s.on("open",(()=>{this.log(`Connected to "${this.url}"`),s.removeListener("error",r),s.on("error",(()=>{this.disconnect(s),this.log(`Error, disconnected from "${this.url}"`),this.dispatch("close",{error:!0})})),s.on("close",(()=>{this.disconnect(s),this.log(`Disconnected from "${this.url}"`),this.dispatch("close",{error:!1})})),this.ws=s,e(!0)}))}))}}disconnect(e){if(!e||this.ws===e)return this.ws&&this.ws.close(),this.ws=null,!0}receive(e,t){return this.log("received:",e,t),this.dispatch(`server.${e}`,t),this.dispatch("server.*",t),!0}send(e,s){if(!this.isConnected())throw new Error("RealtimeAPI is not connected");if("object"!=typeof(s=s||{}))throw new Error("data must be an object");const r={event_id:t.generateId("evt_"),type:e,...s};return this.dispatch(`client.${e}`,r),this.dispatch("client.*",r),this.log("sent:",e,r),this.ws.send(JSON.stringify(r)),!0}}export{s as RealtimeAPI};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{RealtimeEventHandler as e}from"./event_handler.js";import{RealtimeAPI as t}from"./api.js";import{RealtimeConversation as i}from"./conversation.js";import{RealtimeUtils as s}from"./utils.js";class o extends e{constructor({url:e,apiKey:s,dangerouslyAllowAPIKeyInBrowser:o,debug:n}={}){super(),this.defaultSessionConfig={modalities:["text","audio"],instructions:"",voice:"alloy",input_audio_format:"pcm16",output_audio_format:"pcm16",input_audio_transcription:null,turn_detection:null,tools:[],tool_choice:"auto",temperature:.8,max_response_output_tokens:4096},this.sessionConfig={},this.transcriptionModels=[{model:"whisper-1"}],this.defaultServerVadConfig={type:"server_vad",threshold:.5,prefix_padding_ms:300,silence_duration_ms:200},this.realtime=new t({url:e,apiKey:s,dangerouslyAllowAPIKeyInBrowser:o,debug:n}),this.conversation=new i,this._resetConfig(),this._addAPIEventHandlers()}_resetConfig(){return this.sessionCreated=!1,this.tools={},this.sessionConfig=JSON.parse(JSON.stringify(this.defaultSessionConfig)),this.inputAudioBuffer=new Int16Array(0),!0}_addAPIEventHandlers(){this.realtime.on("client.*",(e=>{const t={time:(new Date).toISOString(),source:"client",event:e};this.dispatch("realtime.event",t)})),this.realtime.on("server.*",(e=>{const t={time:(new Date).toISOString(),source:"server",event:e};this.dispatch("realtime.event",t)})),this.realtime.on("server.session.created",(()=>this.sessionCreated=!0));const e=(e,...t)=>{const{item:i,delta:s}=this.conversation.processEvent(e,...t);return{item:i,delta:s}},t=(t,...i)=>{const{item:s,delta:o}=e(t,...i);return s&&this.dispatch("conversation.updated",{item:s,delta:o}),{item:s,delta:o}},i=async e=>{try{const t=JSON.parse(e.arguments),i=this.tools[e.name];if(!i)throw new Error(`Tool "${e.name}" has not been added`);const s=await i.handler(t);this.realtime.send("conversation.item.create",{item:{type:"function_call_output",call_id:e.call_id,output:JSON.stringify(s)}})}catch(t){this.realtime.send("conversation.item.create",{item:{type:"function_call_output",call_id:e.call_id,output:JSON.stringify({error:t.message})}})}this.createResponse()};return this.realtime.on("server.response.created",e),this.realtime.on("server.response.output_item.added",e),this.realtime.on("server.response.content_part.added",e),this.realtime.on("server.input_audio_buffer.speech_started",(t=>{e(t),this.dispatch("conversation.interrupted")})),this.realtime.on("server.input_audio_buffer.speech_stopped",(t=>e(t,this.inputAudioBuffer))),this.realtime.on("server.conversation.item.created",(e=>{const{item:i}=t(e);this.dispatch("conversation.item.appended",{item:i}),"completed"===i.status&&this.dispatch("conversation.item.completed",{item:i})})),this.realtime.on("server.conversation.item.truncated",t),this.realtime.on("server.conversation.item.deleted",t),this.realtime.on("server.conversation.item.input_audio_transcription.completed",t),this.realtime.on("server.response.audio_transcript.delta",t),this.realtime.on("server.response.audio.delta",t),this.realtime.on("server.response.text.delta",t),this.realtime.on("server.response.function_call_arguments.delta",t),this.realtime.on("server.response.output_item.done",(async e=>{const{item:s}=t(e);"completed"===s.status&&this.dispatch("conversation.item.completed",{item:s}),s.formatted.tool&&i(s.formatted.tool)})),!0}isConnected(){return this.realtime.isConnected()}reset(){return this.disconnect(),this.clearEventHandlers(),this.realtime.clearEventHandlers(),this._resetConfig(),this._addAPIEventHandlers(),!0}async connect(){if(this.isConnected())throw new Error("Already connected, use .disconnect() first");return await this.realtime.connect(),this.updateSession(),!0}async waitForSessionCreated(){if(!this.isConnected())throw new Error("Not connected, use .connect() first");for(;!this.sessionCreated;)await new Promise((e=>setTimeout((()=>e()),1)));return!0}disconnect(){this.sessionCreated=!1,this.realtime.isConnected()&&this.realtime.disconnect(),this.conversation.clear()}getTurnDetectionType(){return this.sessionConfig.turn_detection?.type||null}addTool(e,t){if(!e?.name)throw new Error("Missing tool name in definition");const i=e?.name;if(this.tools[i])throw new Error(`Tool "${i}" already added. Please use .removeTool("${i}") before trying to add again.`);if("function"!=typeof t)throw new Error(`Tool "${i}" handler must be a function`);return this.tools[i]={definition:e,handler:t},this.updateSession(),this.tools[i]}removeTool(e){if(!this.tools[e])throw new Error(`Tool "${e}" does not exist, can not be removed.`);return delete this.tools[e],!0}deleteItem(e){return this.realtime.send("conversation.item.delete",{item_id:e}),!0}updateSession({modalities:e,instructions:t,voice:i,input_audio_format:s,output_audio_format:o,input_audio_transcription:n,turn_detection:r,tools:a,tool_choice:d,temperature:u,max_response_output_tokens:c}={}){void 0!==e&&(this.sessionConfig.modalities=e),void 0!==t&&(this.sessionConfig.instructions=t),void 0!==i&&(this.sessionConfig.voice=i),void 0!==s&&(this.sessionConfig.input_audio_format=s),void 0!==o&&(this.sessionConfig.output_audio_format=o),void 0!==n&&(this.sessionConfig.input_audio_transcription=n),void 0!==r&&(this.sessionConfig.turn_detection=r),void 0!==a&&(this.sessionConfig.tools=a),void 0!==d&&(this.sessionConfig.tool_choice=d),void 0!==u&&(this.sessionConfig.temperature=u),void 0!==c&&(this.sessionConfig.max_response_output_tokens=c);const l=[].concat((a||[]).map((e=>{const t={type:"function",...e};if(this.tools[t?.name])throw new Error(`Tool "${t?.name}" has already been defined`);return t})),Object.keys(this.tools).map((e=>({type:"function",...this.tools[e].definition})))),m={...this.sessionConfig};return m.tools=l,this.realtime.isConnected()&&this.realtime.send("session.update",{session:m}),!0}sendUserMessageContent(e=[]){if(e.length){for(const t of e)"input_audio"===t.type&&(t.audio instanceof ArrayBuffer||t.audio instanceof Int16Array)&&(t.audio=s.arrayBufferToBase64(t.audio));this.realtime.send("conversation.item.create",{item:{type:"message",role:"user",content:e}})}return this.createResponse(),!0}appendInputAudio(e){return e.byteLength>0&&(this.realtime.send("input_audio_buffer.append",{audio:s.arrayBufferToBase64(e)}),this.inputAudioBuffer=s.mergeInt16Arrays(this.inputAudioBuffer,e)),!0}createResponse(){return null===this.getTurnDetectionType()&&this.inputAudioBuffer.byteLength>0&&(this.realtime.send("input_audio_buffer.commit"),this.conversation.queueInputAudio(this.inputAudioBuffer),this.inputAudioBuffer=new Int16Array(0)),this.realtime.send("response.create"),!0}cancelResponse(e,t=0){if(!e)return this.realtime.send("response.cancel"),{item:null};if(e){const i=this.conversation.getItem(e);if(!i)throw new Error(`Could not find item "${e}"`);if("message"!==i.type)throw new Error('Can only cancelResponse messages with type "message"');if("assistant"!==i.role)throw new Error('Can only cancelResponse messages with role "assistant"');this.realtime.send("response.cancel");const s=i.content.findIndex((e=>"audio"===e.type));if(-1===s)throw new Error("Could not find audio on item to cancel");return this.realtime.send("conversation.item.truncate",{item_id:e,content_index:s,audio_end_ms:Math.floor(t/this.conversation.defaultFrequency*1e3)}),{item:i}}}async waitForNextItem(){const e=await this.waitForNext("conversation.item.appended"),{item:t}=e;return{item:t}}async waitForNextCompletedItem(){const e=await this.waitForNext("conversation.item.completed"),{item:t}=e;return{item:t}}}export{o as RealtimeClient};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{RealtimeUtils as t}from"./utils.js";class e{defaultFrequency=24e3;EventProcessors={"conversation.item.created":t=>{const{item:e}=t,o=JSON.parse(JSON.stringify(e));if(this.itemLookup[o.id]||(this.itemLookup[o.id]=o,this.items.push(o)),o.formatted={},o.formatted.audio=new Int16Array(0),o.formatted.text="",o.formatted.transcript="",this.queuedSpeechItems[o.id]&&(o.formatted.audio=this.queuedSpeechItems[o.id].audio,delete this.queuedSpeechItems[o.id]),o.content){const t=o.content.filter((t=>["text","input_text"].includes(t.type)));for(const e of t)o.formatted.text+=e.text}return this.queuedTranscriptItems[o.id]&&(o.formatted.transcript=this.queuedTranscriptItems.transcript,delete this.queuedTranscriptItems[o.id]),"message"===o.type?"user"===o.role?(o.status="completed",this.queuedInputAudio&&(o.formatted.audio=this.queuedInputAudio,this.queuedInputAudio=null)):o.status="in_progress":"function_call"===o.type?(o.formatted.tool={type:"function",name:o.name,call_id:o.call_id,arguments:""},o.status="in_progress"):"function_call_output"===o.type&&(o.status="completed",o.formatted.output=o.output),{item:o,delta:null}},"conversation.item.truncated":t=>{const{item_id:e,audio_end_ms:o}=t,s=this.itemLookup[e];if(!s)throw new Error(`item.truncated: Item "${e}" not found`);const r=Math.floor(o*this.defaultFrequency/1e3);return s.formatted.transcript="",s.formatted.audio=s.formatted.audio.slice(0,r),{item:s,delta:null}},"conversation.item.deleted":t=>{const{item_id:e}=t,o=this.itemLookup[e];if(!o)throw new Error(`item.deleted: Item "${e}" not found`);delete this.itemLookup[o.id];const s=this.items.indexOf(o);return s>-1&&this.items.splice(s,1),{item:o,delta:null}},"conversation.item.input_audio_transcription.completed":t=>{const{item_id:e,content_index:o,transcript:s}=t,r=this.itemLookup[e],n=s||" ";return r?(r.content[o].transcript=s,r.formatted.transcript=n,{item:r,delta:{transcript:s}}):(this.queuedTranscriptItems[e]={transcript:n},{item:null,delta:null})},"input_audio_buffer.speech_started":t=>{const{item_id:e,audio_start_ms:o}=t;return this.queuedSpeechItems[e]={audio_start_ms:o},{item:null,delta:null}},"input_audio_buffer.speech_stopped":(t,e)=>{const{item_id:o,audio_end_ms:s}=t;this.queuedSpeechItems[o]||(this.queuedSpeechItems[o]={audio_start_ms:s});const r=this.queuedSpeechItems[o];if(r.audio_end_ms=s,e){const t=Math.floor(r.audio_start_ms*this.defaultFrequency/1e3),o=Math.floor(r.audio_end_ms*this.defaultFrequency/1e3);r.audio=e.slice(t,o)}return{item:null,delta:null}},"response.created":t=>{const{response:e}=t;return this.responseLookup[e.id]||(this.responseLookup[e.id]=e,this.responses.push(e)),{item:null,delta:null}},"response.output_item.added":t=>{const{response_id:e,item:o}=t,s=this.responseLookup[e];if(!s)throw new Error(`response.output_item.added: Response "${e}" not found`);return s.output.push(o.id),{item:null,delta:null}},"response.output_item.done":t=>{const{item:e}=t;if(!e)throw new Error('response.output_item.done: Missing "item"');const o=this.itemLookup[e.id];if(!o)throw new Error(`response.output_item.done: Item "${e.id}" not found`);return o.status=e.status,{item:o,delta:null}},"response.content_part.added":t=>{const{item_id:e,part:o}=t,s=this.itemLookup[e];if(!s)throw new Error(`response.content_part.added: Item "${e}" not found`);return s.content.push(o),{item:s,delta:null}},"response.audio_transcript.delta":t=>{const{item_id:e,content_index:o,delta:s}=t,r=this.itemLookup[e];if(!r)throw new Error(`response.audio_transcript.delta: Item "${e}" not found`);return r.content[o].transcript+=s,r.formatted.transcript+=s,{item:r,delta:{transcript:s}}},"response.audio.delta":e=>{const{item_id:o,content_index:s,delta:r}=e,n=this.itemLookup[o];if(!n)throw new Error(`response.audio.delta: Item "${o}" not found`);const i=t.base64ToArrayBuffer(r),u=new Int16Array(i);return n.formatted.audio=t.mergeInt16Arrays(n.formatted.audio,u),{item:n,delta:{audio:u}}},"response.text.delta":t=>{const{item_id:e,content_index:o,delta:s}=t,r=this.itemLookup[e];if(!r)throw new Error(`response.text.delta: Item "${e}" not found`);return r.content[o].text+=s,r.formatted.text+=s,{item:r,delta:{text:s}}},"response.function_call_arguments.delta":t=>{const{item_id:e,delta:o}=t,s=this.itemLookup[e];if(!s)throw new Error(`response.function_call_arguments.delta: Item "${e}" not found`);return s.arguments+=o,s.formatted.tool.arguments+=o,{item:s,delta:{arguments:o}}}};constructor(){this.clear()}clear(){return this.itemLookup={},this.items=[],this.responseLookup={},this.responses=[],this.queuedSpeechItems={},this.queuedTranscriptItems={},this.queuedInputAudio=null,!0}queueInputAudio(t){return this.queuedInputAudio=t,t}processEvent(t,...e){if(!t.event_id)throw console.error(t),new Error('Missing "event_id" on event');if(!t.type)throw console.error(t),new Error('Missing "type" on event');const o=this.EventProcessors[t.type];if(!o)throw new Error(`Missing conversation event processor for "${t.type}"`);return o.call(this,t,...e)}getItem(t){return this.itemLookup[t]||null}getItems(){return this.items.slice()}}export{e as RealtimeConversation};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=e=>new Promise((t=>setTimeout((()=>t()),e)));class t{constructor(){this.eventHandlers={},this.nextEventHandlers={}}clearEventHandlers(){return this.eventHandlers={},this.nextEventHandlers={},!0}on(e,t){return this.eventHandlers[e]=this.eventHandlers[e]||[],this.eventHandlers[e].push(t),t}onNext(e,t){return this.nextEventHandlers[e]=this.nextEventHandlers[e]||[],this.nextEventHandlers[e].push(t),t}off(e,t){const n=this.eventHandlers[e]||[];if(t){const s=n.indexOf(t);if(-1===s)throw new Error(`Could not turn off specified event listener for "${e}": not found as a listener`);n.splice(s,1)}else delete this.eventHandlers[e];return!0}offNext(e,t){const n=this.nextEventHandlers[e]||[];if(t){const s=n.indexOf(t);if(-1===s)throw new Error(`Could not turn off specified next event listener for "${e}": not found as a listener`);n.splice(s,1)}else delete this.nextEventHandlers[e];return!0}async waitForNext(t,n=null){const s=Date.now();let r;for(this.onNext(t,(e=>r=e));!r;){if(n){if(Date.now()-s>n)return null}await e(1)}return r}dispatch(e,t){const n=[].concat(this.eventHandlers[e]||[]);for(const e of n)e(t);const s=[].concat(this.nextEventHandlers[e]||[]);for(const e of s)e(t);return delete this.nextEventHandlers[e],!0}}export{t as RealtimeEventHandler};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const t=globalThis.atob,r=globalThis.btoa;class e{static floatTo16BitPCM(t){const r=new ArrayBuffer(2*t.length),e=new DataView(r);let n=0;for(let r=0;r<t.length;r++,n+=2){let a=Math.max(-1,Math.min(1,t[r]));e.setInt16(n,a<0?32768*a:32767*a,!0)}return r}static base64ToArrayBuffer(r){const e=t(r),n=e.length,a=new Uint8Array(n);for(let t=0;t<n;t++)a[t]=e.charCodeAt(t);return a.buffer}static arrayBufferToBase64(t){t instanceof Float32Array?t=this.floatTo16BitPCM(t):t instanceof Int16Array&&(t=t.buffer);let e="",n=new Uint8Array(t);for(let t=0;t<n.length;t+=32768){let r=n.subarray(t,t+32768);e+=String.fromCharCode.apply(null,r)}return r(e)}static mergeInt16Arrays(t,r){if(t instanceof ArrayBuffer&&(t=new Int16Array(t)),r instanceof ArrayBuffer&&(r=new Int16Array(r)),!(t instanceof Int16Array&&r instanceof Int16Array))throw new Error("Both items must be Int16Array");const e=new Int16Array(t.length+r.length);for(let r=0;r<t.length;r++)e[r]=t[r];for(let n=0;n<r.length;n++)e[t.length+n]=r[n];return e}static generateId(t,r=21){const e="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";return`${t}${Array(r-t.length).fill(0).map((t=>e[Math.floor(58*Math.random())])).join("")}`}}export{e as RealtimeUtils};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as o}from"react/jsx-runtime";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"react";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as t}from"../components/Page.js";import{makeStyles as e}from"../node_modules/@griffel/react/makeStyles.esm.js";const s=e({iframe:{width:"100%",height:"100%",border:"none"},scrollable:{overflow:"auto"},nonScrollable:{overflow:"hidden"},fixFrameHeight:{height:"calc(100% - 5px)"}}),r=({src:e,showFooter:r,title:i})=>{const m=s();return r?o(t,{hideFooter:!r,hideHeader:!0,children:o("iframe",{title:i,src:e,className:`${m.iframe} ${r?m.fixFrameHeight:""}`})}):o("iframe",{title:i,src:e,className:m.iframe})};export{r as default};
|
|
1
|
+
import{jsx as o}from"react/jsx-runtime";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"react";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as t}from"../components/Page.js";import{makeStyles as e}from"../node_modules/@griffel/react/makeStyles.esm.js";const s=e({iframe:{width:"100%",height:"100%",border:"none"},scrollable:{overflow:"auto"},nonScrollable:{overflow:"hidden"},fixFrameHeight:{height:"calc(100% - 5px)"}}),r=({src:e,showFooter:r,title:i})=>{const m=s();return r?o(t,{hideFooter:!r,hideHeader:!0,children:o("iframe",{title:i,src:e,className:`${m.iframe} ${r?m.fixFrameHeight:""}`})}):o("iframe",{title:i,src:e,className:m.iframe})};export{r as default};
|
package/dist/esm/pages/Chat.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsxs as e,jsx as o}from"react/jsx-runtime";import{useRef as t,useState as n,useEffect as r}from"react";import{useNavigate as s,useSearchParams as i}from"react-router-dom";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import a from"../components/TextHeader.js";import l from"../components/TypingIndicator.js";import m from"../components/Prompt.js";import p from"../components/ChatInput.js";import{CombinedPlaceholderDialog as c}from"../components/CombinedPlaceholderDialog.js";import d from"../components/ChatMessage.js";import"../components/Header.js";import h from"../hooks/useStateWithLocalStorage.js";import{CodicentService as u}from"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as g}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import{useChat as
|
|
1
|
+
import{jsxs as e,jsx as o}from"react/jsx-runtime";import{useRef as t,useState as n,useEffect as r}from"react";import{useNavigate as s,useSearchParams as i}from"react-router-dom";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import a from"../components/TextHeader.js";import l from"../components/TypingIndicator.js";import m from"../components/Prompt.js";import p from"../components/ChatInput.js";import{CombinedPlaceholderDialog as c}from"../components/CombinedPlaceholderDialog.js";import d from"../components/ChatMessage.js";import"../components/Header.js";import h from"../hooks/useStateWithLocalStorage.js";import{CodicentService as u}from"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as g}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import{useChat as j}from"../hooks/useChat.js";import f from"../hooks/useLocalization.js";import{useTemplateVariables as b}from"../hooks/useTemplateVariables.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as x}from"../components/Page.js";import{makeStyles as C}from"../node_modules/@griffel/react/makeStyles.esm.js";import{CalendarWeekStart24Regular as w}from"../node_modules/@fluentui/react-icons/lib/sizedIcons/chunk-3.js";const y=C({chatContainer:{width:"100%",flex:1,maxWidth:"800px",height:"100%",display:"flex",flexDirection:"column",margin:"0 auto",overflow:"hidden","@media (max-width: 768px)":{maxWidth:"100%",borderRadius:"0"},"@media (max-width: 480px)":{},backgroundPosition:"calc(50%) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",touchAction:"pan-y"},chatMessages:{display:"flex",flexDirection:"column",flex:1,padding:"16px",overflowY:"auto",touchAction:"pan-y"}}),v=({state:C})=>{const v=y(),{t:S,tAsync:k,getLanguageInfo:F}=f(),I=s(),{messages:P,isBotTyping:T,handleSend:_,newChat:A,openChat:M}=j(C.stateMachine),H=t(null),[V,N]=i(),[B,L]=n(null),[R,O]=n(!1),[W,E]=n(!1),{service:U,currentStateName:z}=C,[D,G]=n([]),[Y,$]=n([]),[K,q]=n(!1),[J,Q]=n(),[X,Z]=h(C.context.selectedApp+"_prompts",[]),[ee,oe]=n(!1),{extractTemplateVariables:te,replaceTemplateVariables:ne,extractFilePlaceholders:re,replaceFilePlaceholders:se,handleSelectFiles:ie}=b(U.uploadFile),ae=t(!1),le=t(null);r((()=>{const e=window.history.length>1,o=Boolean(document.referrer&&document.referrer!==window.location.href);E(e||o)}),[]);r((()=>{g("SHOW_CHAT_PROMPTS")&&0===P.length&&C.service.getAppPrompts().then(Z).catch((e=>{console.error("Failed to get prompts",e)}))}),[C.service,Z,P.length]),r((()=>{setTimeout((()=>{H.current?.scrollIntoView({behavior:"smooth"})}),10)}),[P]),r((()=>{if(ae.current)return;ae.current=!0;const e=V.get("text"),o=V.get("id"),t=V.get("fid");if(e){(async()=>{const o=re(e),t=te(e);A(),o.length>0||t.length>0?($(o),G(t),q(!0),L(S(e))):L(S(e))})()}else o?M(o):t&&Q(t)}),[]),r((()=>{J&&"anonymous"===z&&le.current!==J&&(le.current=J,U.getFormById(J).then((async e=>{A();const o=F().language,t=e.prompt.replace("{{fid}}",J).replace("{{fname}}",e.name).replace("{{language}}",o);oe(!0);const n=await k(t);oe(!1),L(n),E(!1)})))}),[J,A,U,L,z,k,F,oe]),r((()=>{if(B&&!K){let e=B;Y.length>0&&(e=se(e,Y)),D.length>0&&(e=ne(e,D)),_(e),N({},{replace:!0}),L(null),G([]),$([])}}),[B,K,_,N,se,ne,Y,D]);const me=e=>{const o=V.get("append");o&&(e+="\n---\n"+o),_(e)};return e(x,{hideHeader:!0,hideFooter:!!J,children:[e("div",{id:"chat-container",className:v.chatContainer,style:{backgroundImage:`url(${g("CHAT_BACKGROUND_IMAGE_URL")})`},children:[W&&o("button",{onClick:()=>{W&&I(-1)},"aria-label":S("Tillbaka"),style:{position:"absolute",top:12,left:12,zIndex:100,background:"var(--colorNeutralBackground1)",border:"none",cursor:"pointer",padding:8,borderRadius:8,boxShadow:"0 2px 8px rgba(0,0,0,0.08)",display:"flex",alignItems:"center",justifyContent:"center"},children:o(w,{style:{transform:"rotate(180deg)"}})}),o("div",{style:{marginLeft:W?40:0},children:o(a,{title:S(g("APP_CHAT_TITLE")||"Chatt"),onNewChat:J?void 0:()=>O(!0)})}),e("div",{className:v.chatMessages,children:[g("SHOW_CHAT_PROMPTS")&&X.length>0&&0===P.length&&o(d,{sender:"bot",content:S(g("CHAT_WELCOME")||"Välkommen!"),children:X.map(((t,n)=>e("div",{children:["> ",o("a",{href:"./#/chat",onClick:()=>{me(t.title+"\n---\n"+t.prompt)},children:S(t.title)}),o("br",{})]},`prompt-${n}`)))}),P.map(((t,n)=>e("div",{children:[(T&&n===P.length-1||!T&&n===P.length-2)&&o("div",{ref:H}),o(d,{sender:t.sender,content:t.content,isNew:t.isNew,showSuggestions:n===P.length-1,onSuggestionClicked:_},t.id)]},t.id))),ee&&o(d,{sender:"user",content:S("Översätter...")}),T&&o(l,{})]}),o(p,{codicent:C.context.selectedApp,disableSend:T,onSend:me,onSelectFiles:ie,getImageUrl:u.getImageUrl,getFileInfo:e=>U.getFileInfo(e)})]}),o(m,{open:R,title:S("Vill du rensa chatten?"),content:S("En ny startas, men chatten kommer först sparas."),onYes:()=>{O(!1),A()},onNo:()=>O(!1)}),o(c,{open:K,templateVariables:D,filePlaceholders:Y,onTemplateVariablesChange:G,onFilePlaceholdersChange:$,onConfirm:()=>q(!1),onCancel:()=>{q(!1),L(null),G([]),$([])},uploadFile:U.uploadFile})]})};export{v as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as o,jsxs as e}from"react/jsx-runtime";import{useState as t,useRef as i,useCallback as n,useEffect as r}from"react";import{useSearchParams as a,useNavigate as s}from"react-router-dom";import{getConfigValue as m}from"../config/index.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import l from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import{CodicentService as p}from"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{getGpsLocation as c}from"../utils/device.js";import"./AppFrame.js";import"./Chat.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import d from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import g from"../hooks/useToaster.js";import"../components/FileThumbnail.js";import u from"../components/MessageInput.js";import j from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as f}from"../components/Page.js";import{makeStyles as h}from"../node_modules/@griffel/react/makeStyles.esm.js";import{shorthands as S}from"../node_modules/@griffel/core/index.esm.js";import{tokens as v}from"../node_modules/@fluentui/tokens/lib/tokens.js";const _=h({main:{flexGrow:1,...S.padding("10px"),overflowY:"auto"},container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%"},root:{height:"100%"},item:{height:"auto",width:"auto",flexShrink:1,marginBottom:"1rem"},chat:{flexGrow:1,boxSizing:"border-box",overflow:"hidden",border:"none"},attachmentBar:{display:"none"},iconButton:{width:"24px",height:"24px"},imageCard:{alignContent:"center",borderRadius:v.borderRadiusLarge,height:"240px",textAlign:"left",position:"relative"}}),x=({state:h})=>{const S=_(),{t:v}=d(),[x,I]=t(!1),
|
|
1
|
+
import{jsx as o,jsxs as e}from"react/jsx-runtime";import{useState as t,useRef as i,useCallback as n,useEffect as r}from"react";import{useSearchParams as a,useNavigate as s}from"react-router-dom";import{getConfigValue as m}from"../config/index.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import l from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import{CodicentService as p}from"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{getGpsLocation as c}from"../utils/device.js";import"./AppFrame.js";import"./Chat.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import d from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import g from"../hooks/useToaster.js";import"../components/FileThumbnail.js";import u from"../components/MessageInput.js";import j from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as f}from"../components/Page.js";import{makeStyles as h}from"../node_modules/@griffel/react/makeStyles.esm.js";import{shorthands as S}from"../node_modules/@griffel/core/index.esm.js";import{tokens as v}from"../node_modules/@fluentui/tokens/lib/tokens.js";const _=h({main:{flexGrow:1,...S.padding("10px"),overflowY:"auto"},container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%"},root:{height:"100%"},item:{height:"auto",width:"auto",flexShrink:1,marginBottom:"1rem"},chat:{flexGrow:1,boxSizing:"border-box",overflow:"hidden",border:"none"},attachmentBar:{display:"none"},iconButton:{width:"24px",height:"24px"},imageCard:{alignContent:"center",borderRadius:v.borderRadiusLarge,height:"240px",textAlign:"left",position:"relative"}}),x=({state:h})=>{const S=_(),{t:v}=d(),[x,I]=t(!1),P=i(null),b=i(null),C=i(null),[F,w]=t(null),[U,A]=t([]),{service:E}=h,[M,y]=a(),[T,k]=t(void 0),[L,O]=t(),H=g(),$=s(),B=n((o=>{for(const e of o)E.getFileInfo(e).then((o=>{A((e=>[...e,o]))}))}),[E,A]),D=n((o=>{const e=new FormData;e.append("file",o),E.uploadFile(o.name,e).then((o=>{B([o])})).catch((()=>{H.notify(v("Error"),v("Error uploading pasted image"),"")}))}),[E,B,H,v]),G=o=>{I(o)};r((()=>{const o=M.get("text"),e=M.get("url"),t=M.get("parentId");o&&(k(o),M.delete("text")),t&&(O(t),M.delete("parentId")),e&&(M.delete("url"),k(((o||"")+" "+e).trim())),y(M,{replace:!0})}),[M,y,k,E,B]);return o(f,{hideHeader:!0,children:e("div",{className:S.container,style:{backgroundImage:`url(${m("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[o(l,{title:m("APP_SAVE_TITLE")?v(m("APP_SAVE_TITLE")):v("Spara")}),o(u,{disableSend:!0,defaultText:T,onSend:o=>{o=`${o}${F?" "+F:""}${U.length>0?"\n":""}${U.map((o=>`#file:${o.id}`)).join(" ")}`,E.sendMessage(o,L).then((()=>{H.notify(v("Meddelande"),v("Meddelandet är sparat."),""),L&&(O(void 0),$(-1))}))},files:U,onFilesChange:A,isUploading:x,onHandleDefaultFiles:B,onUploadFile:()=>{P.current?.triggerUpload(),console.log("attach-file")},onUploadImage:m("COMPOSE_SIMPLE_ATTACH_FILE")?void 0:()=>{b.current?.triggerUpload(),console.log("attach-image")},onUploadCamera:m("COMPOSE_SIMPLE_ATTACH_FILE")?void 0:()=>{C.current?.triggerUpload(),console.log("attach-camera")},getImageUrl:p.getImageUrl,onLocationChange:m("COMPOSE_HIDE_LOCATION")?void 0:o=>{o?(async()=>{console.log("attach-location");const o=await c();o?(H.notify(v("Position"),v("Position tillagd."),""),w(`#gps(${o.coords.latitude},${o.coords.longitude})`)):console.log("Failed to get GPS location")})():(w(null),H.notify(v("Position"),v("Position borttagen."),""),console.log("clear-location"))},hasLocation:!!F,onImagePasted:D}),o(j,{ref:P,onFileUploaded:B,onUploading:G,multiple:!0,codicentService:E}),o(j,{codicentService:E,ref:b,onFileUploaded:B,onUploading:G,multiple:!0,accept:"image/*"}),o(j,{codicentService:E,ref:C,onFileUploaded:B,onUploading:G,multiple:!0,accept:"image/*",capture:"environment"})]})})};export{x as Compose,x as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as e,jsxs as o}from"react/jsx-runtime";import{useState as t,useRef as n,useCallback as r,useEffect as i,useMemo as s}from"react";import{CodicentService as a}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import m from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import p from"../components/VoiceIcon.js";import l from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as c}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"../components/FileThumbnail.js";import d from"../components/MessageInput.js";import u from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as g}from"../components/Page.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import j from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import f from"../hooks/useToaster.js";import{useSearchParams as h}from"react-router-dom";import{l as v}from"../node_modules/lodash/lodash.js";import{makeStyles as k}from"../node_modules/@griffel/react/makeStyles.esm.js";import{shorthands as S}from"../node_modules/@griffel/core/index.esm.js";import{tokens as x}from"../node_modules/@fluentui/tokens/lib/tokens.js";import{MessageBar as b}from"../node_modules/@fluentui/react-message-bar/lib/components/MessageBar/MessageBar.js";import{MessageBarBody as w}from"../node_modules/@fluentui/react-message-bar/lib/components/MessageBarBody/MessageBarBody.js";const y=k({main:{flexGrow:1,...S.padding("10px"),overflowY:"auto"},container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%",position:"relative"},root:{height:"100%"},item:{height:"auto",width:"auto",flexShrink:1,marginBottom:"1rem"},chat:{flexGrow:1,boxSizing:"border-box",overflow:"hidden",border:"none"},attachmentBar:{display:"none"},iconButton:{width:"24px",height:"24px"},imageCard:{alignContent:"center",borderRadius:x.borderRadiusLarge,height:"240px",textAlign:"left",position:"relative"},review:{padding:"10px",wordBreak:"break-word",whiteSpace:"pre-line",maxWidth:"100%",overflowWrap:"break-word"},voiceIcon:{position:"absolute",top:"20px",right:"12px",zIndex:1001,cursor:"pointer"}}),_=({state:k,voice:S})=>{const x=y(),{t:_}=j(),[I,C]=t(!1),
|
|
1
|
+
import{jsx as e,jsxs as o}from"react/jsx-runtime";import{useState as t,useRef as n,useCallback as r,useEffect as i,useMemo as s}from"react";import{CodicentService as a}from"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import"../components/Spinner.js";import m from"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import p from"../components/VoiceIcon.js";import l from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as c}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"../components/FileThumbnail.js";import d from"../components/MessageInput.js";import u from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as g}from"../components/Page.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import j from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import f from"../hooks/useToaster.js";import{useSearchParams as h}from"react-router-dom";import{l as v}from"../node_modules/lodash/lodash.js";import{makeStyles as k}from"../node_modules/@griffel/react/makeStyles.esm.js";import{shorthands as S}from"../node_modules/@griffel/core/index.esm.js";import{tokens as x}from"../node_modules/@fluentui/tokens/lib/tokens.js";import{MessageBar as b}from"../node_modules/@fluentui/react-message-bar/lib/components/MessageBar/MessageBar.js";import{MessageBarBody as w}from"../node_modules/@fluentui/react-message-bar/lib/components/MessageBarBody/MessageBarBody.js";const y=k({main:{flexGrow:1,...S.padding("10px"),overflowY:"auto"},container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%",position:"relative"},root:{height:"100%"},item:{height:"auto",width:"auto",flexShrink:1,marginBottom:"1rem"},chat:{flexGrow:1,boxSizing:"border-box",overflow:"hidden",border:"none"},attachmentBar:{display:"none"},iconButton:{width:"24px",height:"24px"},imageCard:{alignContent:"center",borderRadius:x.borderRadiusLarge,height:"240px",textAlign:"left",position:"relative"},review:{padding:"10px",wordBreak:"break-word",whiteSpace:"pre-line",maxWidth:"100%",overflowWrap:"break-word"},voiceIcon:{position:"absolute",top:"20px",right:"12px",zIndex:1001,cursor:"pointer"}}),_=({state:k,voice:S})=>{const x=y(),{t:_}=j(),[I,C]=t(!1),M=n(null),U=n(null),B=n(null),[A]=t(null),[F,P]=t([]),{service:T}=k,[E,N]=h(),[O,$]=t(""),[L,R]=t(void 0),V=f(),[H,z]=t(void 0),[D,G]=t("info"),W=r((e=>{for(const o of e)T.getFileInfo(o).then((e=>{P((o=>[...o,e]))}))}),[T,P]),J=r((e=>{const o=new FormData;o.append("file",e),T.uploadFile(e.name,o).then((e=>{W([e])})).catch((()=>{V.notify(_("Error"),_("Error uploading pasted image"),"")}))}),[T,W,V,_]),K=e=>{C(e)};i((()=>{const e=E.get("text"),o=E.get("url");e&&($(e),E.delete("text")),o&&(E.delete("url"),$(((e||"")+" "+o).trim())),N(E,{replace:!0})}),[E,N,$,T,W]);const X=r((async e=>{if(!e||e.length<10)return;z(_("Analyserar...")),G("info");const o=await T.chat((e=>`Skapa kort ja/nej-status över hur CRM-aktiviteten som följer, givet dessa punkter: \n1. Namn på kunden finns med? ja/nej \n2. Syftet med mötet finns (varför träffar du kunden, kan täckas av 3 nedan) ja/nej\n3. Vad som framkommer under mötet (viktiga punkter och diskussioner) ja/nej\n4. Nästa steg finns med (hur ni kommer att träffas igen, och om något har sålts) ja/nej. \n\nSvara endast med ja/nej för varje punkt, ett svar per rad i följande exempel i JSON-format:\n{\n "customerName": "true",\n "purpose": "false",\n "meetingNotes": "true",\n "nextSteps": "false",\n "shortSummary": "Syfte med mötet och nästa steg saknas."\n}\n\n---\nTEXT:\n\n${e}`)(e));if(o){const e=new l(o.content);try{const o=JSON.parse(e.content);console.log("json",o);let t=0;for(const e in o)"true"===o[e]&&t++;z(_(4===t?"Allt är med":o.shortSummary||"Något saknas")),G(4===t?"success":"warning")}catch{z("Error: "+e.content),G("error")}}}),[T]),Y=s((()=>v.debounce(X,2e3)),[X]);return i((()=>()=>{Y.cancel()}),[Y]),e(g,{hideHeader:!0,children:o("div",{className:x.container,style:{backgroundImage:`url(${c("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[S&&c("SHOW_VOICE_BUTTON")&&e("div",{className:x.voiceIcon,children:e(p,{voice:S})}),e(m,{title:c("APP_SAVE_TITLE")?_(c("APP_SAVE_TITLE")):_("Spara")}),e(d,{defaultText:O,onSend:e=>{e=`${e=`#crm\n${e.replace("#log ","")}\nSALESPERSON: ${k.context.name||k.context.user?.email||k.context.nickname||"-"}`}${A?" "+A:""}${F.length>0?"\n":""}${F.map((e=>`#file:${e.id}`)).join(" ")}`,T.sendMessage(e).then((()=>{V.notify(_("Meddelande"),_("Meddelandet är sparat."),"")}))},files:F,onFilesChange:P,isUploading:I,onUploadImage:()=>{U.current?.triggerUpload()},onUploadCamera:()=>{B.current?.triggerUpload()},getImageUrl:a.getImageUrl,hasLocation:!!A,disableSend:!0,rows:9,placeholder:_("Beskriv CRM-aktivitet här..."),onChange:e=>{e!==L&&(R(e),e&&e.trim().length>0?Y(e):(z(void 0),Y.cancel()))},onImagePasted:J}),H&&o("div",{className:x.review,children:[e("h3",{children:_("Analys")}),e(b,{intent:D,layout:"multiline",children:e(w,{children:_(H)})})]}),e(u,{ref:M,onFileUploaded:W,onUploading:K,multiple:!0,codicentService:T}),e(u,{codicentService:T,ref:U,onFileUploaded:W,onUploading:K,multiple:!0,accept:"image/*"}),e(u,{codicentService:T,ref:B,onFileUploaded:W,onUploading:K,multiple:!0,accept:"image/*",capture:"environment"})]})})};export{_ as CrmPage,_ as default};
|
|
@@ -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"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{isMobileDevice as d}from"../utils/device.js";import"../components/FileThumbnail.js";import u from"../components/MessageInput.js";import f from"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as g}from"../components/Page.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import h from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import j from"../hooks/useToaster.js";import{useSearchParams as x}from"react-router-dom";import{l as S}from"../node_modules/lodash/lodash.js";import{makeStyles as v}from"../node_modules/@griffel/react/makeStyles.esm.js";import{shorthands as y}from"../node_modules/@griffel/core/index.esm.js";import{tokens as k}from"../node_modules/@fluentui/tokens/lib/tokens.js";import{Text as w}from"../node_modules/@fluentui/react-text/lib/components/Text/Text.js";import{Spinner as b}from"../node_modules/@fluentui/react-spinner/lib/components/Spinner/Spinner.js";import{Card as C}from"../node_modules/@fluentui/react-card/lib/components/Card/Card.js";import{MessageBar as M}from"../node_modules/@fluentui/react-message-bar/lib/components/MessageBar/MessageBar.js";import{MessageBarBody as N}from"../node_modules/@fluentui/react-message-bar/lib/components/MessageBarBody/MessageBarBody.js";const _=v({main:{flexGrow:1,...y.padding("10px"),overflowY:"auto"},container:{display:"flex",flexDirection:"row",height:"100%",...y.gap("16px"),...y.padding("10px")},containerMobile:{display:"flex",flexDirection:"column",height:"100%",...y.gap("16px"),...y.padding("10px")},inputSection:{display:"flex",flexDirection:"column",flexGrow:1,maxWidth:"640px",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",position:"relative"},inputSectionMobile:{display:"flex",flexDirection:"column",width:"100%",position:"relative"},historySection:{flexBasis:"300px",flexShrink:0,display:"flex",flexDirection:"column",...y.gap("8px"),overflowY:"auto",...y.padding("8px")},historySectionMobile:{display:"flex",flexDirection:"column",...y.gap("8px"),overflowY:"auto",...y.padding("8px"),maxHeight:"300px"},historyCard:{...y.padding("12px"),cursor:"pointer","&:hover":{backgroundColor:k.colorNeutralBackground1Hover}},historyCardContent:{display:"flex",flexDirection:"column",...y.gap("4px")},historyDate:{fontSize:k.fontSizeBase200,color:k.colorNeutralForeground3},historyText:{fontSize:k.fontSizeBase300,wordBreak:"break-word",whiteSpace:"pre-wrap",maxHeight:"100px",overflow:"hidden",textOverflow:"ellipsis"},review:{padding:"10px",wordBreak:"break-word",whiteSpace:"pre-line",maxWidth:"100%",overflowWrap:"break-word"},voiceIcon:{position:"absolute",top:"20px",right:"12px",zIndex:1001,cursor:"pointer"},historyTitle:{fontSize:k.fontSizeBase400,fontWeight:k.fontWeightSemibold,marginBottom:"8px"},emptyState:{textAlign:"center",color:k.colorNeutralForeground3,padding:"20px"}}),T=({state:v,voice:y})=>{const k=_(),{t:T}=h(),[I,B]=t(!1),A=n(null),E=n(null),F=n(null),[U]=t(null),[D,$]=t([]),{service:P}=v,[O,z]=x(),[L,R]=t(""),[H,W]=t(void 0),V=j(),[G,J]=t(void 0),[Y,K]=t("info"),[X,q]=t([]),[Q,Z]=t(!1),ee=d(),oe=r((e=>{for(const o of e)P.getFileInfo(o).then((e=>{$((o=>[...o,e]))}))}),[P,$]),te=r((e=>{const o=new FormData;o.append("file",e),P.uploadFile(e.name,o).then((e=>{oe([e])})).catch((()=>{V.notify(T("Error"),T("Error uploading pasted image"),"")}))}),[P,oe,V,T]),ne=e=>{B(e)},re=r((async()=>{Z(!0);try{const e=await P.getMessages(["crm"]);q(e)}catch(e){console.error("Error loading CRM messages:",e),V.notify(T("Error"),T("Failed to load CRM messages"),"","error")}finally{Z(!1)}}),[P,V,T]);i((()=>{re()}),[re]),i((()=>{const e=O.get("text"),o=O.get("url");e&&(R(e),O.delete("text")),o&&(O.delete("url"),R(((e||"")+" "+o).trim())),z(O,{replace:!0})}),[O,z,R,P,oe]);const ie=e=>{e=`${e=`#crm\n${e.replace("#log ","")}\nSALESPERSON: ${v.context.name||v.context.user?.email||v.context.nickname||"-"}`}${U?" "+U:""}${D.length>0?"\n":""}${D.map((e=>`#file:${e.id}`)).join(" ")}`,P.sendMessage(e).then((()=>{V.notify(T("Meddelande"),T("Meddelandet är sparat."),""),re(),W(""),J(void 0)}))},ae=r((async e=>{if(!e||e.length<10)return;J(T("Analyserar...")),K("info");const o=await P.chat((e=>`Skapa kort ja/nej-status över hur CRM-aktiviteten som följer, givet dessa punkter: \n1. Namn på kunden finns med? ja/nej \n2. Syftet med mötet finns (varför träffar du kunden, kan täckas av 3 nedan) ja/nej\n3. Vad som framkommer under mötet (viktiga punkter och diskussioner) ja/nej\n4. Nästa steg finns med (hur ni kommer att träffas igen, och om något har sålts) ja/nej. \n\nSvara endast med ja/nej för varje punkt, ett svar per rad i följande exempel i JSON-format:\n{\n "customerName": "true",\n "purpose": "false",\n "meetingNotes": "true",\n "nextSteps": "false",\n "shortSummary": "Syfte med mötet och nästa steg saknas."\n}\n\n---\nTEXT:\n\n${e}`)(e));if(o){const e=new p(o.content);try{const o=JSON.parse(e.content);console.log("json",o);let t=0;for(const e in o)"true"===o[e]&&t++;J(T(4===t?"Allt är med":o.shortSummary||"Något saknas")),K(4===t?"success":"warning")}catch{J("Error: "+e.content),K("error")}}}),[P,T]),se=a((()=>S.debounce(ae,2e3)),[ae]);i((()=>()=>{se.cancel()}),[se]);const le=e=>{const o=new Date,t=new Date(e),n=o.getTime()-t.getTime(),r=Math.floor(n/6e4),i=Math.floor(n/36e5),a=Math.floor(n/864e5);return r<1?T("Just now"):r<60?`${r} ${T("minutes ago")}`:i<24?`${i} ${T("hours ago")}`:a<7?`${a} ${T("days ago")}`:t.toLocaleDateString()},me=e=>{const o=e.split("\n").filter((e=>!e.startsWith("#")&&!e.startsWith("SALESPERSON:")&&e.trim().length>0)).join("\n");return o.substring(0,150)+(o.length>150?"...":"")},pe=()=>o("div",{className:ee?k.historySectionMobile:k.historySection,children:[e(w,{className:k.historyTitle,children:T("Tidigare sparade")}),Q?e("div",{className:k.emptyState,children:e(b,{size:"small"})}):0===X.length?e("div",{className:k.emptyState,children:e(w,{children:T("Inga sparade meddelanden än")})}):X.map((t=>e(C,{className:k.historyCard,onClick:()=>(e=>{const o=me(e.content);W(o)})(t),children:o("div",{className:k.historyCardContent,children:[e(w,{className:k.historyDate,children:le(t.createdAt)}),e(w,{className:k.historyText,children:me(t.content)})]})},t.id)))]});return e(g,{hideHeader:!0,children:o("div",{className:ee?k.containerMobile:k.container,children:[!ee&&pe(),o("div",{className:ee?k.inputSectionMobile:k.inputSection,style:ee?void 0:{backgroundImage:`url(${c("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:[y&&c("SHOW_VOICE_BUTTON")&&e("div",{className:k.voiceIcon,children:e(m,{voice:y})}),e(l,{title:c("APP_SAVE_TITLE")?T(c("APP_SAVE_TITLE")):T("Spara")}),e(u,{defaultText:L,onSend:ie,files:D,onFilesChange:$,isUploading:I,onUploadImage:()=>{E.current?.triggerUpload()},onUploadCamera:()=>{F.current?.triggerUpload()},getImageUrl:s.getImageUrl,hasLocation:!!U,disableSend:!0,rows:9,placeholder:T("Beskriv CRM-aktivitet här..."),onChange:e=>{e!==H&&(W(e),e&&e.trim().length>0?se(e):(J(void 0),se.cancel()))},onImagePasted:te}),G&&o("div",{className:k.review,children:[e("h3",{children:T("Analys")}),e(M,{intent:Y,layout:"multiline",children:e(N,{children:T(G)})})]}),e(f,{ref:A,onFileUploaded:oe,onUploading:ne,multiple:!0,codicentService:P}),e(f,{codicentService:P,ref:E,onFileUploaded:oe,onUploading:ne,multiple:!0,accept:"image/*"}),e(f,{codicentService:P,ref:F,onFileUploaded:oe,onUploading:ne,multiple:!0,accept:"image/*",capture:"environment"})]}),ee&&pe()]})})};export{T as CrmPagePersistent,T as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as o,jsxs as t,Fragment as e}from"react/jsx-runtime";import r from"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{Title as i}from"../components/Title.js";import{Text as n}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import{useState as s,useEffect as m}from"react";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as p}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{formatGuidToShorterReadableCode as a}from"../utils/helpers.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./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
|
|
1
|
+
import{jsx as o,jsxs as t,Fragment as e}from"react/jsx-runtime";import r from"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{Title as i}from"../components/Title.js";import{Text as n}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import{useState as s,useEffect as m}from"react";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as p}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{formatGuidToShorterReadableCode as a}from"../utils/helpers.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import c from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import l from"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as d}from"../components/Page.js";import{useSearchParams as j,useNavigate as u}from"react-router-dom";import{makeStyles as h}from"../node_modules/@griffel/react/makeStyles.esm.js";import{Button as g}from"../node_modules/@fluentui/react-button/lib/components/Button/Button.js";const f=h({container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%"},instructionParagraph:{fontWeight:"bold",marginBottom:"1em"},orderedList:{marginLeft:"20px",marginBottom:"1em",fontSize:"1.3em"}}),k=()=>{const{t:h,tAsync:k}=c(),[b]=j(),C=u(),_=b.get("id"),v=f(),[S,M]=s(""),[y,P]=s(!1);return m((()=>{(async()=>{const o=p("FORM_ACCEPT_MARKDOWN");if(o){P(!0);const t=await k(o);P(!1),M(t.replace("{{code}}",a(_||"")))}})()}),[k,_]),o(d,{hideFooter:!0,hideHeader:!0,children:o("div",{className:v.container,style:{backgroundImage:`url(${p("FORM_BACKGROUND_IMAGE_URL")})`},children:t(l,{children:[y&&o(n,{children:h("Översätter...")}),p("FORM_ACCEPT_MARKDOWN")&&S&&!y&&o(r,{content:S}),!p("FORM_ACCEPT_MARKDOWN")&&t(e,{children:[o(i,{children:h("Din kod för formuläret")}),o("p",{className:v.instructionParagraph,children:h("Instruktioner:")}),t("ol",{className:v.orderedList,children:[o("li",{children:h("Skriv ner eller kopiera den kod som visas nedan, du behöver den för att identifiera din session.")}),o("li",{children:h("Klicka på 'Starta' för att komma igång med chatten.")})]}),o(n,{size:500,children:h("Din kod är (skriv ner den):")}),o(n,{size:600,style:{userSelect:"all"},children:a(_||"")})]}),_&&o(g,{appearance:"primary",onClick:()=>C(`/chat?fid=${_}`),children:h("Starta")})]})})})};export{k as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as o,jsxs as e,Fragment as t}from"react/jsx-runtime";import{useState as n,useEffect as r}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as i}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as a}from"../components/Title.js";import"../components/Spinner.js";import{Label as s}from"../components/Label.js";import{Input as m}from"../components/Input.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import
|
|
1
|
+
import{jsx as o,jsxs as e,Fragment as t}from"react/jsx-runtime";import{useState as n,useEffect as r}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as i}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as a}from"../components/Title.js";import"../components/Spinner.js";import{Label as s}from"../components/Label.js";import{Input as m}from"../components/Input.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import p from"../hooks/useStateWithLocalStorage.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as l}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{formatGuidToShorterReadableCode as c}from"../utils/helpers.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import d from"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import u from"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import{Page as j}from"../components/Page.js";import{makeStyles as h}from"../node_modules/@griffel/react/makeStyles.esm.js";import{useId as k}from"../node_modules/@fluentui/react-utilities/lib/hooks/useId.js";import{Dropdown as g}from"../node_modules/@fluentui/react-combobox/lib/components/Dropdown/Dropdown.js";import{Option as f}from"../node_modules/@fluentui/react-combobox/lib/components/Option/Option.js";const v=h({inputAndButton:{display:"flex",gap:"10px"},input:{minWidth:"90%"},container:{maxWidth:"640px",margin:"0 auto",backgroundPosition:"calc(50% + 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",height:"100%"},generatedLinkTitle:{marginBottom:"0.5em",fontWeight:"bold"},orderedList:{marginLeft:"20px",marginBottom:"1em"},instructionParagraph:{marginBottom:"1em",fontWeight:"bold"}}),b=({state:h})=>{const b=v(),{service:w}=h,{t:x}=d(),[S,y]=p(h.context.selectedApp+"_forms",[]),[C,$]=n(),[_,L]=n(),[P,A]=n(!1),[I,T]=n(),B=k("form-dropdown");r((()=>{w.getForms().then((o=>{o.sort(((o,e)=>o.name.localeCompare(e.name))),y(o)}))}),[w,x,y]);const D=void 0!==navigator.share;return o(j,{children:o("div",{className:b.container,style:{backgroundImage:`url(${l("COMPOSE_BACKGROUND_IMAGE_URL")})`},children:e(u,{children:[o(a,{children:x("Skapa länk till formulär")}),o("p",{className:b.instructionParagraph,children:x("Instruktioner")}),e("ol",{className:b.orderedList,children:[o("li",{children:x("Välj ett formulär från rullgardinsmenyn nedan. Detta formulär kommer att användas för den genererade länken.")}),o("li",{children:x("Klicka på 'Skapa länk' för att generera en unik länk. Länken visar var aktiv och kan användas för att svara på formuläret.")}),o("li",{children:x("När länken visas, kan du klicka på kopiera-ikonen för att kopiera länken till ditt urklipp.")}),o("li",{children:x("Om din enhet stödjer det, kan du även använda dela-knappen för att dela länken direkt.")}),o("li",{children:x("Kom ihåg att spara (skriva ner) koden")})]}),o("label",{id:B,className:b.instructionParagraph,children:x("Välj formulär")}),o(g,{"aria-labelledby":B,placeholder:"-",onOptionSelect:(o,e)=>T(e.optionValue),children:S.map((o=>e(f,{value:o.name,text:`${o.title} (${o.name})`,children:[`${o.title} (${o.name})`," "]},o.name)))}),o(i,{appearance:"primary",disabled:!I,onClick:()=>{const o=S.find((o=>o.name===I));o?.url?w.sendMessage(`#ss-link #${I}`).then((e=>{const t=new Date(Date.now()+2592e5);w.generateApiToken(t).then((t=>{const n=o.url.includes("?")?"&":"?",r=`${o.url}${n}token=${t}`;$(r);const i=c(e);L(i)}))})):w.sendMessage(`#ss-link #${I}`).then((o=>{const e=`${window.location.protocol}//${window.location.hostname}${window.location.port?":"+window.location.port:""}${window.location.pathname}`;$(`${e}#/formaccept?id=${o}`);const t=c(o);L(t)}))},children:x("Skapa länk")}),C&&e(t,{children:[o("p",{className:b.generatedLinkTitle,children:x("Här är din genererade länk (du kan kopiera eller dela den):")}),o("div",{className:b.inputAndButton,children:o(m,{className:b.input,value:C,readOnly:!0,onFocus:o=>o.target.select()})}),o("br",{}),e("div",{className:b.inputAndButton,children:[o(i,{appearance:"primary",title:x("Kopiera länk"),icon:"CopyRegular",onClick:()=>{C&&(navigator.clipboard.writeText(C),A(!0),setTimeout((()=>{A(!1),$(void 0)}),2e3))},children:x("Kopiera")}),D&&o(i,{appearance:"primary",title:x("Dela länk"),icon:"ShareRegular",onClick:()=>{C&&(navigator.share({url:C}),setTimeout((()=>{$(void 0)}),2e3))},children:x("Dela")})]}),P&&o(s,{children:x("Länk kopierad!")})]})]})})})};export{b as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsx as o,jsxs as t}from"react/jsx-runtime";import{useState as e,useEffect as s}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{Text as i}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import n from"../components/HtmlView.js";import"../components/Footer.js";import{Page as r}from"../components/Page.js";import{Spinner as m}from"../node_modules/@fluentui/react-spinner/lib/components/Spinner/Spinner.js";const p=({state:p})=>{const c=window.location.hash.match(/^#\/html\/(.+)$/),a=c?decodeURIComponent(c[1]):"",[l,d]=e(),[h,j]=e(!1),[u,
|
|
1
|
+
import{jsx as o,jsxs as t}from"react/jsx-runtime";import{useState as e,useEffect as s}from"react";import"../components/Markdown.js";import"../components/Textarea.js";import"../components/Button.js";import"../components/CompoundButton.js";import{Text as i}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import n from"../components/HtmlView.js";import"../components/Footer.js";import{Page as r}from"../components/Page.js";import{Spinner as m}from"../node_modules/@fluentui/react-spinner/lib/components/Spinner/Spinner.js";const p=({state:p})=>{const c=window.location.hash.match(/^#\/html\/(.+)$/),a=c?decodeURIComponent(c[1]):"",[l,d]=e(),[h,j]=e(!1),[u,g]=e(),{service:f}=p;return s((()=>{a&&f?(j(!0),g(void 0),f.getMessagesFast([a],void 0,1).then((o=>{if(0===o.length)return void g(`No messages found with tag: ${a}`);const t=o[0].content;d((o=>{const t=o.indexOf("```html");if(-1!==t){const e=o.indexOf("```",t+7);return-1===e?o.substring(t+7):o.substring(t+7,e)}const e=[/<!DOCTYPE[^>]*>[\s\S]*?<\/html>/i,/<html[^>]*>[\s\S]*?<\/html>/i,/<div[^>]*>[\s\S]*?<\/div>/i,/<body[^>]*>[\s\S]*?<\/body>/i,/<article[^>]*>[\s\S]*?<\/article>/i,/<section[^>]*>[\s\S]*?<\/section>/i];for(const t of e){const e=o.match(t);if(e)return e[0]}if(o.includes("<html")||o.includes("<!DOCTYPE")||o.includes("<div")||o.includes("<p>")||o.includes("<span")){const t=["<!DOCTYPE","<html","<div","<body","<article","<section"];let e=-1;for(const s of t){const t=o.indexOf(s);-1!==t&&(-1===e||t<e)&&(e=t)}if(-1!==e){let t=o.substring(e);const s=["</html>","</body>","</div>"];for(const o of s){const e=t.lastIndexOf(o);if(-1!==e){t=t.substring(0,e+o.length);break}}return t}return o}return o})(t))})).catch((o=>{console.error("Error fetching message:",o),g(`Error fetching message: ${o.message||"Unknown error"}`)})).finally((()=>{j(!1)}))):g("No tag provided or service unavailable")}),[a,f]),h?o(r,{hideHeader:!0,hideFooter:!0,children:o("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:o(m,{})})}):u?o(r,{hideHeader:!0,hideFooter:!0,children:t("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh",flexDirection:"column",gap:"20px"},children:[o(i,{children:u}),t(i,{children:["Tag: ",a]})]})}):l?o(n,{html:l,onDismiss:()=>window.history.back()}):o(r,{hideHeader:!0,hideFooter:!0,children:o("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:o(i,{children:"No HTML content available"})})})};export{p as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsxs as e,jsx as t,Fragment as o}from"react/jsx-runtime";import{useState as n,useEffect as r}from"react";import{useSearchParams as i,useNavigate as s}from"react-router-dom";import a from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{CodicentService as l}from"../services/codicent.js";import{makeStyles as c}from"../node_modules/@griffel/react/makeStyles.esm.js";import{Button as d}from"../node_modules/@fluentui/react-button/lib/components/Button/Button.js";import{Dismiss24Regular as m}from"../node_modules/@fluentui/react-icons/lib/sizedIcons/chunk-5.js";import{Image as u}from"../node_modules/@fluentui/react-image/lib/components/Image/Image.js";const p=c({image:{zIndex:900,transition:"transform 0.1s ease-out",cursor:"grab","&:active":{cursor:"grabbing"}},transparent:{color:"transparent",backgroundColor:"transparent"},next:{cursor:"pointer",position:"absolute",top:"50%",width:"auto",marginTop:"-22px",padding:"16px",color:"white",fontWeight:"bold",fontSize:"18px",transition:"0.6s ease",userSelect:"none",right:0,borderRadius:"3px 0 0 3px",zIndex:1e3,backgroundColor:"#A0A0A080","&:hover":{backgroundColor:"#A0A0A0"}},prev:{cursor:"pointer",position:"absolute",top:"50%",width:"auto",marginTop:"-22px",padding:"16px",color:"white",fontWeight:"bold",fontSize:"18px",transition:"0.6s ease",borderRadius:"0 3px 3px 0",userSelect:"none",left:0,zIndex:1e3,backgroundColor:"#A0A0A080","&:hover":{backgroundColor:"#A0A0A0"}},content:{position:"fixed",top:0,left:0,bottom:0,right:0,display:"flex",justifyContent:"center",alignItems:"center"},closeButton:{position:"absolute",top:"10px",right:"10px",zIndex:1001,backgroundColor:"rgba(0, 0, 0, 0.5)",color:"white","&:hover":{backgroundColor:"rgba(0, 0, 0, 0.7)"}}}),g=({state:c})=>{const g=p(),[v]=i(),h=s(),[w,f]=n([]),[x,b]=n(0),[y,E]=n(),[k
|
|
1
|
+
import{jsxs as e,jsx as t,Fragment as o}from"react/jsx-runtime";import{useState as n,useEffect as r}from"react";import{useSearchParams as i,useNavigate as s}from"react-router-dom";import a from"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import{CodicentService as l}from"../services/codicent.js";import{makeStyles as c}from"../node_modules/@griffel/react/makeStyles.esm.js";import{Button as d}from"../node_modules/@fluentui/react-button/lib/components/Button/Button.js";import{Dismiss24Regular as m}from"../node_modules/@fluentui/react-icons/lib/sizedIcons/chunk-5.js";import{Image as u}from"../node_modules/@fluentui/react-image/lib/components/Image/Image.js";const p=c({image:{zIndex:900,transition:"transform 0.1s ease-out",cursor:"grab","&:active":{cursor:"grabbing"}},transparent:{color:"transparent",backgroundColor:"transparent"},next:{cursor:"pointer",position:"absolute",top:"50%",width:"auto",marginTop:"-22px",padding:"16px",color:"white",fontWeight:"bold",fontSize:"18px",transition:"0.6s ease",userSelect:"none",right:0,borderRadius:"3px 0 0 3px",zIndex:1e3,backgroundColor:"#A0A0A080","&:hover":{backgroundColor:"#A0A0A0"}},prev:{cursor:"pointer",position:"absolute",top:"50%",width:"auto",marginTop:"-22px",padding:"16px",color:"white",fontWeight:"bold",fontSize:"18px",transition:"0.6s ease",borderRadius:"0 3px 3px 0",userSelect:"none",left:0,zIndex:1e3,backgroundColor:"#A0A0A080","&:hover":{backgroundColor:"#A0A0A0"}},content:{position:"fixed",top:0,left:0,bottom:0,right:0,display:"flex",justifyContent:"center",alignItems:"center"},closeButton:{position:"absolute",top:"10px",right:"10px",zIndex:1001,backgroundColor:"rgba(0, 0, 0, 0.5)",color:"white","&:hover":{backgroundColor:"rgba(0, 0, 0, 0.7)"}}}),g=({state:c})=>{const g=p(),[v]=i(),h=s(),[w,f]=n([]),[x,b]=n(0),[y,E]=n(),[j,k]=n(null),[L,C]=n(null),{service:A}=c,[I,_]=n(1),[z,S]=n({x:0,y:0}),[M,N]=n(!1),[B,X]=n({x:0,y:0});r((()=>{const e=e=>{"Escape"===e.key&&h(-1)},t=e=>{k(e.touches[0].clientX)},o=e=>{C(e.touches[0].clientX)},n=()=>{if(null!==j&&null!==L){const e=j-L;e>50?$(1):e<-50&&$(-1)}k(null),C(null)};return window.addEventListener("keydown",e),window.addEventListener("touchstart",t),window.addEventListener("touchmove",o),window.addEventListener("touchend",n),()=>{window.removeEventListener("keydown",e),window.removeEventListener("touchstart",t),window.removeEventListener("touchmove",o),window.removeEventListener("touchend",n)}}),[h,j,L]),r((()=>{E(l.getFileUrl(w[x]))}),[w,x]),r((()=>{const e=v.get("id"),t=v.get("file");e&&t&&A.getMessageContent(e).then((e=>{const o=a.findFileIds(e.content);Promise.all(o.map((e=>A.getFileInfo(e)))).then((e=>{f(e.filter((e=>e.contentType.startsWith("image"))).map((e=>e.id)));const o=w.indexOf(t);o>=0&&b(o)}))})).catch((()=>{}))}),[v,A]),r((()=>{_(1),S({x:0,y:0})}),[x]),r((()=>{const e=e=>{e.preventDefault();const t=-.01*e.deltaY;_((e=>Math.min(Math.max(1,e+t),5)))},t=e=>{const t=e;I>1&&(N(!0),X({x:t.clientX-z.x,y:t.clientY-z.y}))},o=e=>{const t=e;M&&S({x:t.clientX-B.x,y:t.clientY-B.y})},n=()=>{N(!1)},r=document.querySelector(`.${g.image}`);return r&&(r.addEventListener("wheel",e),r.addEventListener("mousedown",t),window.addEventListener("mousemove",o),window.addEventListener("mouseup",n)),()=>{r&&(r.removeEventListener("wheel",e),r.removeEventListener("mousedown",t),window.removeEventListener("mousemove",o),window.removeEventListener("mouseup",n))}}),[I,z,M,B,g.image]);const $=e=>{if(x+e<0||x+e>=w.length)return;const t=(x+e+w.length)%w.length;b(t)};return e("div",{className:g.content,children:[t(d,{icon:t(m,{}),className:g.closeButton,onClick:()=>h(-1)}),t(u,{className:g.image,src:y,alt:"Codicent Image",fit:"contain",width:"100%",height:"100%",style:{transform:`translate(${z.x}px, ${z.y}px) scale(${I})`,touchAction:"none"}}),w.length>1&&e(o,{children:[0!==x&&t("a",{className:g.prev,onClick:()=>$(-1),children:"❮"}),x<w.length-1&&t("a",{className:g.next,onClick:()=>$(1),children:"❯"})]})]})};export{g as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Login.d.ts","sourceRoot":"","sources":["../../../src/pages/Login.tsx"],"names":[],"mappings":"AAWA,OAAO,
|
|
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"}
|
package/dist/esm/pages/Login.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsxs as o,jsx as t}from"react/jsx-runtime";import
|
|
1
|
+
import{jsxs as o,jsx as e,Fragment as t}from"react/jsx-runtime";import i,{useState as r}from"react";import"../services/codicent.js";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as n}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as s}from"../components/Title.js";import{Text as m}from"../components/Text.js";import"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as a}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"./Purchase.js";import"../stores/chatStore.js";import p from"../hooks/useLocalization.js";import l from"../hooks/useAppStyles.js";import{makeStyles as c}from"../node_modules/@griffel/react/makeStyles.esm.js";import{Image as g}from"../node_modules/@fluentui/react-image/lib/components/Image/Image.js";import{Input as d}from"../node_modules/@fluentui/react-input/lib/components/Input/Input.js";import{mergeClasses as j}from"../node_modules/@griffel/core/mergeClasses.esm.js";const u=c({container:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100vh",backgroundPosition:"calc(50% - 100px) center",backgroundRepeat:"no-repeat",backgroundSize:"contain",gap:"20px",padding:"0 20px"},button:{minWidth:"15rem"},input:{minWidth:"15rem",marginBottom:"10px"},image:{maxHeight:"200px"}}),h=({state:c})=>{const{loginWithRedirect:h,loginPasswordless:_}=c.auth,I=u(),f=l(),{t:b}=p(),[E,k]=r(""),[C,L]=r(!1),y=a("LOGIN_REDIRECT"),N=a("AUTH0_PASSWORDLESS_ENABLED");i.useEffect((()=>{y&&h()}),[y]);return o("div",y?{className:I.container,style:{backgroundImage:`url(${a("HOME_BACKGROUND_IMAGE_URL")})`},children:[e(s,{children:`${b("Välkommen till")} ${a("INDEX_TITLE")}!`}),e(m,{size:400,children:b("Omdirigerar till inloggning...")})]}:{className:I.container,style:{backgroundImage:`url(${a("HOME_BACKGROUND_IMAGE_URL")})`},children:[a("LOGIN_LOGO_URL")&&e(g,{src:a("LOGIN_LOGO_URL"),alt:a("INDEX_TITLE"),className:I.image}),!a("LOGIN_HIDE_WELCOME")&&e(s,{children:`${b("Välkommen till")} ${a("INDEX_TITLE")}!`}),e(m,{size:400,children:b(a("LOGIN_WELCOME_TEXT")||"Logga in, eller registrera ett konto, för att komma igång.")}),o(t,N?{children:[e(d,{className:I.input,type:"email",placeholder:b("Ange din e-postadress"),value:E,onChange:o=>k(o.target.value),disabled:C}),e(n,{className:j(f.button,I.button),size:"large",appearance:"primary",onClick:async()=>{if(E.trim()){L(!0);try{await _(E)}catch(o){console.error("Passwordless login failed:",o)}finally{L(!1)}}},disabled:!E.trim()||C,children:b(C?"Skickar...":"Skicka inloggningslänk")})]}:{children:[e(n,{className:j(f.button,I.button),size:"large",appearance:"primary",onClick:()=>h(),children:b("Logga in")}),!a("HIDE_REGISTER_BUTTON")&&e(n,{className:j(f.button,I.button),size:"large",appearance:"primary",onClick:()=>h({authorizationParams:{screen_hint:"signup"}}),children:b("Registrera")})]})]})};export{h as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsxs as o,jsx as t}from"react/jsx-runtime";import{useState as e,useEffect as r}from"react";import{Link as i}from"react-router-dom";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as n}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as s}from"../components/Title.js";import{Text as m}from"../components/Text.js";import{Spinner as a}from"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as p}from"../config/index.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./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,
|
|
1
|
+
import{jsxs as o,jsx as t}from"react/jsx-runtime";import{useState as e,useEffect as r}from"react";import{Link as i}from"react-router-dom";import"../components/Markdown.js";import"../components/Textarea.js";import{Button as n}from"../components/Button.js";import"../components/CompoundButton.js";import{Title as s}from"../components/Title.js";import{Text as m}from"../components/Text.js";import{Spinner as a}from"../components/Spinner.js";import"../components/TextHeader.js";import"../components/TypingIndicator.js";import"../components/Dialog.js";import"../components/ChatInput.js";import"../components/CombinedPlaceholderDialog.js";import"../components/ChatMessage.js";import"../components/Header.js";import"../services/codicent.js";import"../utils/MessageContent.js";import"../node_modules/tinycolor2/esm/tinycolor.js";import"../_virtual/index.js";import{getConfigValue as p}from"../config/index.js";import"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Sales.js";import"../stores/chatStore.js";import"../hooks/useLocalization.js";import"../hooks/useAppStyles.js";import"../components/FileThumbnail.js";import"../components/MessageInput.js";import"../components/UploadFile.js";import"../components/SnapFooter.js";import"../components/Profile.js";import"../components/MessageItem.js";import"../components/Content.js";import"../components/AiInput.js";import"../components/SearchBox.js";import"../components/HtmlView.js";import"../components/Footer.js";import"../components/Page.js";import{makeStyles as c}from"../node_modules/@griffel/react/makeStyles.esm.js";import{tokens as l}from"../node_modules/@fluentui/tokens/lib/tokens.js";const d=c({container:{display:"flex",flexDirection:"column",alignItems:"center",gap:"20px",padding:"20px"},pricing:{padding:"20px",paddingLeft:"30px",border:"1px solid #ccc",borderRadius:"8px",backgroundColor:l.colorNeutralBackground1}}),j=({state:c})=>{const l=d(),[j,g]=e(!1),{service:u,stateMachine:h}=c,{updateContext:f}=h;r((()=>{new URLSearchParams(window.location.search).get("session_id")&&f({hasValidPurchase:void 0})}),[]);return o("div",{className:l.container,children:[t(s,{children:"Starta ditt abonnemang"}),t("div",{className:l.pricing,children:o("ul",{children:[t("li",{children:t(m,{size:400,children:"Kreditkort krävs inte"})}),t("li",{children:t(m,{size:400,children:"Gratis de 2 första månaderna"})}),t("li",{children:t(m,{size:400,children:"Därefter 89 kr/månad"})})]})}),t(n,{appearance:"primary",onClick:async()=>{try{g(!0),await u.redirectToCheckout(p("STRIPE_PRICE_ID"))}catch(o){console.error("Purchase error:",o)}finally{g(!1)}},disabled:j,children:j?t(a,{size:"tiny"}):"Starta abonnemang"}),t("div",{children:o(m,{size:400,children:["Har du redan ett abonnemang? Kanske har du loggat in med fel konto. ",t(i,{to:"/logout",children:"Logga ut"})," och sedan in igen för att komma igång."]})})]})};export{j as Purchase,j as default};
|
package/dist/esm/pages/Sales.js
CHANGED
|
@@ -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,
|
|
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"../utils/cacheManager.js";import"../lib/wavtools/lib/wav_packer.js";import"../lib/wavtools/lib/analysis/audio_analysis.js";import"../lib/wavtools/lib/wav_stream_player.js";import"../lib/wavtools/lib/wav_recorder.js";import"./AppFrame.js";import"./Chat.js";import"./Compose.js";import"./Snap.js";import"./Search.js";import"./Login.js";import"./CrmPage.js";import"./CrmPagePersistent.js";import"./ImageView.js";import"./FormInvite.js";import"./FormAccept.js";import"./Purchase.js";import"../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),[M,S]=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:M,onChange:e=>S(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${M}`),B(!1),S("")},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};
|