open-chat-studio-widget 0.4.8 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +23 -20
  2. package/dist/cjs/{index-AhSI5tER.js → index-Du0PBL6n.js} +4 -2
  3. package/dist/cjs/index-Du0PBL6n.js.map +1 -0
  4. package/dist/cjs/loader.cjs.js +2 -2
  5. package/dist/cjs/open-chat-studio-widget.cjs.entry.js +1116 -301
  6. package/dist/cjs/open-chat-studio-widget.cjs.entry.js.map +1 -1
  7. package/dist/cjs/open-chat-studio-widget.cjs.js +2 -2
  8. package/dist/cjs/open-chat-studio-widget.entry.cjs.js.map +1 -1
  9. package/dist/collection/components/ocs-chat/{heroicons.js → icons.js} +23 -1
  10. package/dist/collection/components/ocs-chat/icons.js.map +1 -0
  11. package/dist/collection/components/ocs-chat/ocs-chat.css +596 -1983
  12. package/dist/collection/components/ocs-chat/ocs-chat.js +480 -273
  13. package/dist/collection/components/ocs-chat/ocs-chat.js.map +1 -1
  14. package/dist/collection/services/chat-session-service.js +145 -0
  15. package/dist/collection/services/chat-session-service.js.map +1 -0
  16. package/dist/collection/services/file-attachment-manager.js +125 -0
  17. package/dist/collection/services/file-attachment-manager.js.map +1 -0
  18. package/dist/collection/utils/cookies.js +5 -12
  19. package/dist/collection/utils/cookies.js.map +1 -1
  20. package/dist/collection/utils/markdown.js +1 -1
  21. package/dist/collection/utils/markdown.js.map +1 -1
  22. package/dist/collection/utils/translations.js +99 -0
  23. package/dist/collection/utils/translations.js.map +1 -0
  24. package/dist/components/open-chat-studio-widget.js +1122 -302
  25. package/dist/components/open-chat-studio-widget.js.map +1 -1
  26. package/dist/esm/{index-DkJ7OJTS.js → index-CX3v6rTy.js} +4 -3
  27. package/dist/esm/index-CX3v6rTy.js.map +1 -0
  28. package/dist/esm/loader.js +3 -3
  29. package/dist/esm/open-chat-studio-widget.entry.js +1116 -301
  30. package/dist/esm/open-chat-studio-widget.entry.js.map +1 -1
  31. package/dist/esm/open-chat-studio-widget.js +3 -3
  32. package/dist/open-chat-studio-widget/open-chat-studio-widget.entry.esm.js.map +1 -1
  33. package/dist/open-chat-studio-widget/open-chat-studio-widget.esm.js +1 -1
  34. package/dist/open-chat-studio-widget/p-90719a8b.entry.js +4 -0
  35. package/dist/open-chat-studio-widget/p-90719a8b.entry.js.map +1 -0
  36. package/dist/open-chat-studio-widget/p-CX3v6rTy.js +3 -0
  37. package/dist/open-chat-studio-widget/p-CX3v6rTy.js.map +1 -0
  38. package/dist/types/components/ocs-chat/{heroicons.d.ts → icons.d.ts} +19 -0
  39. package/dist/types/components/ocs-chat/ocs-chat.d.ts +52 -36
  40. package/dist/types/components.d.ts +22 -8
  41. package/dist/types/services/chat-session-service.d.ts +78 -0
  42. package/dist/types/services/file-attachment-manager.d.ts +40 -0
  43. package/dist/types/utils/translations.d.ts +23 -0
  44. package/package.json +8 -3
  45. package/dist/cjs/index-AhSI5tER.js.map +0 -1
  46. package/dist/collection/components/ocs-chat/heroicons.js.map +0 -1
  47. package/dist/esm/index-DkJ7OJTS.js.map +0 -1
  48. package/dist/open-chat-studio-widget/p-DkJ7OJTS.js +0 -3
  49. package/dist/open-chat-studio-widget/p-DkJ7OJTS.js.map +0 -1
  50. package/dist/open-chat-studio-widget/p-bde68fbd.entry.js +0 -4
  51. package/dist/open-chat-studio-widget/p-bde68fbd.entry.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ocs-chat.js","sourceRoot":"","sources":["../../../src/components/ocs-chat/ocs-chat.tsx"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport {Component, Host, h, Prop, State, Element, Watch} from '@stencil/core';\nimport {\n XMarkIcon,\n GripDotsVerticalIcon, PlusWithCircleIcon, ArrowsPointingOutIcon, ArrowsPointingInIcon,\n PaperClipIcon, CheckDocumentIcon, XIcon\n} from './heroicons';\nimport { renderMarkdownSync as renderMarkdownComplete } from '../../utils/markdown';\nimport { getCSRFToken } from '../../utils/cookies';\nimport { varToPixels } from '../../utils/utils';\n\ninterface ChatMessage {\n created_at: string;\n role: 'system' | 'user' | 'assistant';\n content: string;\n metadata?: any;\n attachments?: ChatAttachment[];\n}\n\ninterface ChatAttachment {\n name: string;\n content_type: string;\n size: number;\n}\n\ninterface UploadedFile {\n id: number;\n name: string;\n size: number;\n content_type: string;\n}\n\ninterface SelectedFile {\n file: File;\n uploaded?: UploadedFile;\n error?: string;\n}\n\ninterface ChatStartSessionResponse {\n session_id: string;\n chatbot: any;\n participant: any;\n seed_message_task_id?: string;\n}\n\ninterface ChatSendMessageResponse {\n task_id: string;\n status: 'processing' | 'completed' | 'error';\n error?: string;\n}\n\ninterface ChatTaskPollResponse {\n message?: ChatMessage;\n status: 'processing' | 'complete';\n error?: string;\n}\n\ninterface ChatPollResponse {\n messages: ChatMessage[];\n has_more: boolean;\n session_status: 'active' | 'ended';\n}\n\ninterface PointerEvent {\n clientX: number;\n clientY: number;\n}\n\ninterface SessionStorageData {\n sessionId?: string;\n messages: ChatMessage[];\n}\n\n@Component({\n tag: 'open-chat-studio-widget',\n styleUrl: 'ocs-chat.css',\n shadow: true,\n})\nexport class OcsChat {\n\n private static readonly TASK_POLLING_MAX_ATTEMPTS = 120;\n private static readonly TASK_POLLING_INTERVAL_MS = 1000;\n private static readonly MESSAGE_POLLING_INTERVAL_MS = 30000;\n\n private static readonly SCROLL_DELAY_MS = 100;\n private static readonly FOCUS_DELAY_MS = 100;\n\n private static readonly MOBILE_BREAKPOINT = 640;\n private static readonly WINDOW_MARGIN = 20;\n\n private static readonly LOCALSTORAGE_TEST_KEY = '__ocs_test__';\n\n private static readonly MAX_FILE_SIZE_MB = 50;\n private static readonly MAX_TOTAL_SIZE_MB = 50;\n private static readonly SUPPORTED_FILE_EXTENSIONS = ['.txt', '.pdf', '.doc', '.docx', '.xls', '.xlsx', '.csv', '.jpg', '.jpeg',\n '.png', '.gif', '.bmp', '.webp', '.svg', '.mp4', '.mov', '.avi', '.mp3', '.wav' ];\n\n /**\n * The ID of the chatbot to connect to.\n */\n @Prop() chatbotId!: string;\n\n /**\n * The base URL for the API (defaults to current origin).\n */\n @Prop() apiBaseUrl?: string = \"https://chatbots.dimagi.com\";\n\n /**\n * The text to display on the button.\n */\n @Prop() buttonText?: string;\n\n /**\n * URL of the icon to display on the button. If not provided, uses the default OCS logo.\n */\n @Prop() iconUrl?: string;\n\n /**\n * The shape of the chat button. 'round' makes it circular, 'square' keeps it rectangular.\n */\n @Prop() buttonShape: 'round' | 'square' = 'square';\n\n /**\n * The text to place in the header.\n */\n @Prop() headerText: '';\n\n /**\n * The message to display in the new chat confirmation dialog.\n */\n @Prop() newChatConfirmationMessage?: string = \"Starting a new chat will clear your current conversation. Continue?\";\n\n /**\n * Whether the chat widget is visible on load.\n */\n @Prop({ mutable: true }) visible: boolean = false;\n\n /**\n * The initial position of the chat widget on the screen.\n */\n @Prop({ mutable: true }) position: 'left' | 'center' | 'right' = 'right';\n\n /**\n * Welcome messages to display above starter questions (JSON array of strings)\n */\n @Prop() welcomeMessages?: string;\n\n /**\n * Array of starter questions that users can click to send (JSON array of strings)\n */\n @Prop() starterQuestions?: string;\n\n /**\n * Used to associate chat sessions with a specific user across multiple visits/sessions\n */\n @Prop() userId?: string;\n /**\n * Display name for the user.\n */\n @Prop() userName?: string;\n /**\n * Whether to persist session data to local storage to allow resuming previous conversations after page reload.\n */\n @Prop() persistentSession: boolean = true;\n\n /**\n * Minutes since the most recent message after which the session data in local storage will expire. Set this to\n * `0` to never expire.\n */\n @Prop() persistentSessionExpire: number = 60 * 24;\n\n /**\n * Allow the user to make the chat window full screen.\n */\n @Prop() allowFullScreen: boolean = true;\n\n /**\n * Allow the user to attach files to their messages.\n */\n @Prop() allowAttachments: boolean = false;\n\n /**\n * The text to display while the assistant is typing/preparing a response.\n */\n @Prop() typingIndicatorText?: string = \"Preparing response\";\n\n @State() error: string = \"\";\n @State() messages: ChatMessage[] = [];\n @State() sessionId?: string;\n @State() isLoading: boolean = false;\n @State() isTyping: boolean = false;\n @State() messageInput: string = \"\";\n @State() currentPollTaskId: string = \"\";\n @State() isDragging: boolean = false;\n @State() dragOffset: { x: number; y: number } = { x: 0, y: 0 };\n @State() windowPosition: { x: number; y: number } = { x: 0, y: 0 };\n @State() fullscreenPosition: { x: number } = { x: 0 };\n @State() parsedWelcomeMessages: string[] = [];\n @State() parsedStarterQuestions: string[] = [];\n @State() generatedUserId?: string;\n @State() isFullscreen: boolean = false;\n @State() showNewChatConfirmation: boolean = false;\n\n @State() selectedFiles: SelectedFile[] = [];\n @State() isUploadingFiles: boolean = false;\n\n private pollingIntervalRef?: any;\n private messageListRef?: HTMLDivElement;\n private textareaRef?: HTMLTextAreaElement;\n private chatWindowRef?: HTMLDivElement;\n private fileInputRef?: HTMLInputElement;\n private chatWindowHeight: number = 600;\n private chatWindowWidth: number = 450;\n private chatWindowFullscreenWidth: number = 1024;\n private positionInitialized: boolean = false;\n @Element() host: HTMLElement;\n\n\n componentWillLoad() {\n if (!this.chatbotId) {\n this.error = 'Chatbot ID is required';\n return;\n }\n // Always try to load existing session if localStorage is available\n if (this.persistentSession && this.isLocalStorageAvailable()) {\n const { sessionId, messages } = this.loadSessionFromStorage();\n if (sessionId && messages) {\n this.sessionId = sessionId;\n this.messages = messages;\n }\n }\n this.parseWelcomeMessages();\n this.parseStarterQuestions();\n }\n\n componentDidLoad() {\n const computedStyle = getComputedStyle(this.host);\n const windowHeightVar = computedStyle.getPropertyValue('--chat-window-height');\n const windowWidthVar = computedStyle.getPropertyValue('--chat-window-width');\n const fullscreenWidthVar = computedStyle.getPropertyValue('--chat-window-fullscreen-width');\n this.chatWindowHeight = varToPixels(windowHeightVar, window.innerHeight, this.chatWindowHeight);\n this.chatWindowWidth = varToPixels(windowWidthVar, window.innerWidth, this.chatWindowWidth);\n this.chatWindowFullscreenWidth = varToPixels(fullscreenWidthVar, window.innerWidth, this.chatWindowFullscreenWidth);\n if (this.visible) {\n this.initializePosition();\n }\n\n // Only auto-start session if we don't have an existing one\n if (this.visible && !this.sessionId) {\n this.startSession();\n } else if (this.visible && this.sessionId) {\n // Resume polling for existing session\n this.startPolling();\n }\n window.addEventListener('resize', this.handleWindowResize);\n }\n\n disconnectedCallback() {\n this.cleanup();\n this.removeEventListeners();\n window.removeEventListener('resize', this.handleWindowResize);\n }\n\n private addErrorMessage(errorText: string): void {\n const errorMessage: ChatMessage = {\n created_at: new Date().toISOString(),\n role: 'system',\n content: `**Error:** ${errorText}\\nPlease try again.`,\n attachments: []\n };\n\n this.messages = [...this.messages, errorMessage];\n this.saveSessionToStorage();\n this.scrollToBottom();\n }\n\n private handleError(errorText: string): void {\n // show as system message\n this.addErrorMessage(errorText);\n\n // Clear any loading/typing states\n this.isLoading = false;\n this.isTyping = false;\n this.isUploadingFiles = false;\n this.currentPollTaskId = '';\n }\n\n private parseJSONProp(propValue: string | undefined, propName: string): string[] {\n try {\n if (propValue) {\n try {\n return JSON.parse(propValue);\n } catch {\n const fixedValue = propValue.replace(/'/g, '\"');\n return JSON.parse(fixedValue);\n }\n }\n } catch (error) {\n console.warn(`Failed to parse ${propName}:`, error);\n }\n return [];\n }\n\n private parseWelcomeMessages() {\n this.parsedWelcomeMessages = this.parseJSONProp(this.welcomeMessages, 'welcome messages');\n }\n\n private parseStarterQuestions() {\n this.parsedStarterQuestions = this.parseJSONProp(this.starterQuestions, 'starter questions');\n }\n\n private cleanup() {\n if (this.pollingIntervalRef) {\n clearInterval(this.pollingIntervalRef);\n this.pollingIntervalRef = undefined;\n }\n this.currentPollTaskId = '';\n }\n\n private getApiBaseUrl(): string {\n return this.apiBaseUrl || window.location.origin;\n }\n\n private getApiHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n const csrfToken = getCSRFToken(this.getApiBaseUrl());\n if (csrfToken) {\n headers['X-CSRFToken'] = csrfToken;\n }\n\n return headers;\n }\n\n private async startSession(): Promise<void> {\n try {\n this.isLoading = true;\n\n const userId = this.getOrGenerateUserId();\n\n const requestBody: any = {\n chatbot_id: this.chatbotId,\n session_data: {\n source: 'widget',\n page_url: window.location.href\n },\n participant_remote_id: userId\n };\n\n if (this.userName) {\n requestBody.participant_name = this.userName;\n }\n\n const response = await fetch(`${this.getApiBaseUrl()}/api/chat/start/`, {\n method: 'POST',\n headers: this.getApiHeaders(),\n body: JSON.stringify(requestBody)\n });\n\n if (!response.ok) {\n this.handleError(`Failed to start session: ${response.statusText}`);\n return;\n }\n\n const data: ChatStartSessionResponse = await response.json();\n this.sessionId = data.session_id;\n this.saveSessionToStorage();\n\n // Handle seed message if present\n if (data.seed_message_task_id) {\n this.isTyping = true; // Show typing indicator for seed message\n this.currentPollTaskId = data.seed_message_task_id;\n await this.pollTaskResponse();\n }\n\n // Start polling for messages\n this.startPolling();\n } catch (error) {\n this.handleError('Failed to start chat session');\n } finally {\n this.isLoading = false;\n }\n }\n\n private markPendingFilesWithError(errorMessage: string): void {\n this.selectedFiles = this.selectedFiles.map(sf => {\n if (!sf.error && !sf.uploaded) {\n return { ...sf, error: errorMessage };\n }\n return sf;\n });\n }\n\n private async uploadFiles(): Promise<number[]> {\n if (this.selectedFiles.length === 0 || !this.sessionId || !this.allowAttachments) {\n return [];\n }\n\n this.isUploadingFiles = true;\n const uploadedIds: number[] = [];\n\n try {\n const formData = new FormData();\n\n // Add all files to form data\n for (const selectedFile of this.selectedFiles) {\n if (!selectedFile.error && !selectedFile.uploaded) {\n formData.append('files', selectedFile.file);\n } else if (selectedFile.uploaded) {\n uploadedIds.push(selectedFile.uploaded.id);\n }\n }\n\n // Add user ID and name to the form data\n const userId = this.getOrGenerateUserId();\n formData.append('participant_remote_id', userId);\n if (this.userName) {\n formData.append('participant_name', this.userName);\n }\n\n // Only upload if there are new files\n if (formData.has('files')) {\n const response = await fetch(`${this.getApiBaseUrl()}/api/chat/${this.sessionId}/upload/`, {\n method: 'POST',\n body: formData,\n });\n\n if (!response.ok) {\n const errorData = await response.json();\n const errorMessage = errorData.error || 'Failed to upload files';\n this.markPendingFilesWithError(errorMessage);\n return uploadedIds;\n }\n\n const data = await response.json();\n\n // Update selected files with upload results\n let fileIndex = 0;\n this.selectedFiles = this.selectedFiles.map(sf => {\n if (!sf.error && !sf.uploaded) {\n return { ...sf, uploaded: data.files[fileIndex++] };\n }\n return sf;\n });\n uploadedIds.push(...data.files.map((f: UploadedFile) => f.id));\n }\n\n return uploadedIds;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Failed to upload files';\n this.markPendingFilesWithError(errorMessage);\n return uploadedIds;\n } finally {\n this.isUploadingFiles = false;\n }\n }\n\n private async sendMessage(message: string): Promise<void> {\n if (!this.sessionId || !message.trim()) return;\n\n try {\n let attachmentIds: number[] = [];\n if (this.allowAttachments && this.selectedFiles.length > 0) {\n attachmentIds = await this.uploadFiles();\n\n // Check if any files have errors after upload attempt\n const hasErrors = this.selectedFiles.some(sf => sf.error);\n if (hasErrors) {\n // Don't send the message, let user fix file issues first\n this.handleError('Please remove or fix file errors before sending your message.');\n return;\n }\n }\n\n // If this is the first user message and there are welcome messages,\n // add them to chat history as assistant messages\n if (this.messages.length === 0 && this.parsedWelcomeMessages.length > 0) {\n const now = new Date();\n const welcomeMessages: ChatMessage[] = this.parsedWelcomeMessages.map((welcomeMsg, index) => ({\n created_at: new Date(now.getTime() - (this.parsedWelcomeMessages.length - index) * 1000).toISOString(),\n role: 'assistant' as const,\n content: welcomeMsg,\n attachments: []\n }));\n this.messages = [...this.messages, ...welcomeMessages];\n }\n\n // Add user message immediately with attachments info\n const userMessage: ChatMessage = {\n created_at: new Date().toISOString(),\n role: 'user',\n content: message.trim(),\n attachments: this.allowAttachments ? this.selectedFiles\n .filter(sf => !sf.error && sf.uploaded)\n .map(sf => ({\n name: sf.file.name,\n content_type: sf.file.type,\n size: sf.file.size,\n })) : []\n };\n this.messages = [...this.messages, userMessage];\n this.saveSessionToStorage();\n this.messageInput = '';\n if (this.allowAttachments) {\n this.selectedFiles = []; // Clear selected files after sending\n }\n this.scrollToBottom();\n\n // Start typing indicator - it will stay on during task polling\n this.isTyping = true;\n\n const requestBody: any = { message: message.trim() };\n if (this.allowAttachments && attachmentIds.length > 0) {\n requestBody.attachment_ids = attachmentIds;\n }\n\n const response = await fetch(`${this.getApiBaseUrl()}/api/chat/${this.sessionId}/message/`, {\n method: 'POST',\n headers: this.getApiHeaders(),\n body: JSON.stringify(requestBody)\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send message: ${response.statusText}`);\n }\n\n const data: ChatSendMessageResponse = await response.json();\n\n if (data.status === 'error') {\n throw new Error(data.error || 'Failed to send message');\n }\n\n // Poll for the response - typing indicator will be managed in pollTaskResponse\n this.currentPollTaskId = data.task_id;\n await this.pollTaskResponse();\n } catch (error) {\n const errorText = error instanceof Error ? error.message : 'Failed to send message';\n this.handleError(errorText);\n }\n }\n\n private handleStarterQuestionClick(question: string): void {\n this.sendMessage(question);\n }\n\n private async pollTaskResponse(): Promise<void> {\n if (!this.sessionId || !this.currentPollTaskId) return;\n\n // Stop message polling while task polling is active\n this.pauseMessagePolling();\n\n let attempts = 0;\n\n const poll = async (): Promise<void> => {\n if (!this.sessionId || !this.currentPollTaskId) return;\n\n try {\n const response = await fetch(`${this.getApiBaseUrl()}/api/chat/${this.sessionId}/${this.currentPollTaskId}/poll/`);\n\n if (!response.ok) {\n throw new Error(`Failed to poll task: ${response.statusText}`);\n }\n\n const data: ChatTaskPollResponse = await response.json();\n\n if (data.error) {\n throw new Error(data.error);\n }\n\n if (data.status === 'complete' && data.message) {\n this.messages = [...this.messages, data.message];\n this.saveSessionToStorage();\n this.scrollToBottom();\n // Task polling complete, clear typing indicator and resume message polling\n this.isTyping = false;\n this.currentPollTaskId = '';\n this.resumeMessagePolling();\n this.focusInput();\n return;\n }\n\n if (data.status === 'processing' && attempts < OcsChat.TASK_POLLING_MAX_ATTEMPTS) {\n attempts++;\n setTimeout(poll, OcsChat.TASK_POLLING_INTERVAL_MS);\n } else if (attempts >= OcsChat.TASK_POLLING_MAX_ATTEMPTS) {\n // Task polling timed out - add timeout message and resume polling\n const timeoutMessage: ChatMessage = {\n created_at: new Date().toISOString(),\n role: 'system',\n content: 'The response is taking longer than expected. The system may be experiencing delays. Please try sending your message again.',\n attachments: []\n };\n this.messages = [...this.messages, timeoutMessage];\n this.saveSessionToStorage();\n this.scrollToBottom();\n\n // Clear typing indicator and resume message polling\n this.isTyping = false;\n this.currentPollTaskId = '';\n this.resumeMessagePolling();\n this.focusInput();\n }\n } catch (error) {\n const errorText = error instanceof Error ? error.message : 'Failed to get response';\n this.handleError(errorText);\n // Clear states and resume polling\n this.currentPollTaskId = '';\n this.resumeMessagePolling();\n }\n };\n\n await poll();\n }\n\n private startPolling(): void {\n if (this.pollingIntervalRef) return;\n\n this.pollingIntervalRef = setInterval(async () => {\n // Only poll for messages if not currently polling for a task\n if (!this.currentPollTaskId) {\n await this.pollForMessages();\n }\n }, OcsChat.MESSAGE_POLLING_INTERVAL_MS);\n }\n\n private pauseMessagePolling(): void {\n if (this.pollingIntervalRef) {\n clearInterval(this.pollingIntervalRef);\n this.pollingIntervalRef = undefined;\n }\n }\n\n private resumeMessagePolling(): void {\n // Resume message polling after task polling is complete\n this.startPolling();\n }\n\n private async pollForMessages(): Promise<void> {\n if (!this.sessionId) return;\n\n try {\n const url = new URL(`${this.getApiBaseUrl()}/api/chat/${this.sessionId}/poll/`);\n if (this.messages && this.messages.length > 0) {\n url.searchParams.set('since', this.messages.at(-1).created_at);\n }\n\n const response = await fetch(url.toString());\n\n if (!response.ok) return; // Silently fail for polling\n\n const data: ChatPollResponse = await response.json();\n\n if (data.messages.length > 0) {\n this.messages = [...this.messages, ...data.messages];\n this.saveSessionToStorage();\n this.scrollToBottom();\n this.focusInput();\n }\n } catch {\n // Silently fail for polling\n }\n }\n\n /**\n * Scroll the message container to the bottom.\n * @param forceEnd When `false`, scroll the top of the last message into view.\n * When `true`, scroll all the way to the end of the last message.\n */\n private scrollToBottom(forceEnd: boolean =false): void {\n setTimeout(() => {\n if (this.messageListRef) {\n const lastChild = this.messageListRef.lastElementChild;\n if (!forceEnd && lastChild) {\n // scroll so that the top of the last message is in the centre of the message container\n const parentRect = this.messageListRef.getBoundingClientRect();\n const childRect = lastChild.getBoundingClientRect();\n const currentScrollTop = this.messageListRef.scrollTop;\n const childTopRelativeToParent = childRect.top - parentRect.top;\n const targetScroll = currentScrollTop + childTopRelativeToParent - (parentRect.height / 2);\n this.messageListRef.scrollTo({\n top: targetScroll,\n behavior: 'smooth'\n });\n } else {\n this.messageListRef.scrollTop = this.messageListRef.scrollHeight;\n }\n }\n }, OcsChat.SCROLL_DELAY_MS);\n }\n\n private focusInput(): void {\n setTimeout(() => {\n if (this.textareaRef && !this.isTyping) {\n this.textareaRef.focus();\n }\n }, OcsChat.FOCUS_DELAY_MS);\n }\n\n private handleKeyPress(event: KeyboardEvent): void {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.sendMessage(this.messageInput);\n }\n }\n\n private handleInputChange(event: Event): void {\n this.messageInput = (event.target as HTMLTextAreaElement).value;\n }\n\n private handleFileSelect(event: Event): void {\n if (!this.allowAttachments) return;\n\n const input = event.target as HTMLInputElement;\n if (!input.files || input.files.length === 0) return;\n\n const newFiles: SelectedFile[] = [];\n let totalSize = this.selectedFiles.reduce((sum, f) => sum + f.file.size, 0);\n\n for (let i = 0; i < input.files.length; i++) {\n const file = input.files[i];\n const ext = '.' + file.name.split('.').pop()?.toLowerCase();\n if (!OcsChat.SUPPORTED_FILE_EXTENSIONS.includes(ext)) {\n newFiles.push({\n file,\n error: `File type ${ext} not supported`\n });\n continue;\n }\n const fileSizeMB = file.size / (1024 * 1024);\n if (fileSizeMB > OcsChat.MAX_FILE_SIZE_MB) {\n newFiles.push({\n file,\n error: `File exceeds ${OcsChat.MAX_FILE_SIZE_MB}MB limit`\n });\n continue;\n }\n totalSize += file.size;\n const totalSizeMB = totalSize / (1024 * 1024);\n if (totalSizeMB > OcsChat.MAX_TOTAL_SIZE_MB) {\n newFiles.push({\n file,\n error: `Total size exceeds ${OcsChat.MAX_TOTAL_SIZE_MB}MB limit`\n });\n continue;\n }\n\n newFiles.push({ file });\n }\n this.selectedFiles = [...this.selectedFiles, ...newFiles];\n input.value = '';\n }\n\n private removeSelectedFile(index: number): void {\n if (!this.allowAttachments) return;\n this.selectedFiles = this.selectedFiles.filter((_, i) => i !== index);\n }\n\n private formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 KB';\n const k = 1024;\n\n if (bytes < k * k) {\n // Less than 1MB, show in KB\n return Math.round(bytes / k * 100) / 100 + ' KB';\n } else {\n return Math.round(bytes / (k * k) * 100) / 100 + ' MB';\n }\n }\n\n private formatTime(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n }\n\n private toggleWindowVisibility() {\n this.visible = !this.visible;\n }\n\n /**\n * Watch for changes to the `visible` attribute and update accordingly.\n *\n * @param visible - The new value for the field.\n */\n @Watch('visible')\n async visibilityHandler(visible: boolean) {\n if (visible) {\n this.initializePosition();\n }\n if (visible && !this.sessionId) {\n await this.startSession();\n } else if (!visible) {\n this.pauseMessagePolling()\n } else {\n this.scrollToBottom(true);\n this.resumeMessagePolling();\n }\n }\n\n setPosition(position: 'left' | 'center' | 'right') {\n if (position === this.position) return;\n this.position = position;\n }\n\n getPositionClasses() {\n if (this.isFullscreen) {\n return 'chat-window-fullscreen';\n }\n const baseClasses = 'chat-window-normal';\n const draggingClass = this.isDragging ? ' chat-window-dragging' : '';\n return baseClasses + draggingClass;\n }\n\n private getFullscreenBounds() {\n const windowWidth = window.innerWidth;\n const actualChatWidth = Math.min(windowWidth, this.chatWindowFullscreenWidth);\n const centeredX = (windowWidth - actualChatWidth) / 2;\n const maxOffset = (windowWidth - actualChatWidth) / 2;\n\n console.log( windowWidth, actualChatWidth, centeredX, maxOffset )\n return { windowWidth, actualChatWidth, centeredX, maxOffset };\n }\n\n getPositionStyles() {\n if (this.isFullscreen) {\n const { centeredX } = this.getFullscreenBounds();\n const finalX = centeredX + this.fullscreenPosition.x;\n\n return {\n left: `${finalX}px`,\n top: '0px',\n transform: 'none',\n };\n }\n return {\n left: `${this.windowPosition.x}px`,\n top: `${this.windowPosition.y}px`,\n };\n }\n\n private initializePosition(): void {\n if (this.positionInitialized) {\n return;\n }\n this.positionInitialized = true;\n\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n const chatWidth = windowWidth < OcsChat.MOBILE_BREAKPOINT ? windowWidth : this.chatWindowWidth;\n const isMobile = windowWidth < OcsChat.MOBILE_BREAKPOINT;\n\n if (isMobile) {\n this.windowPosition = { x: 0, y: 0 };\n return;\n }\n\n switch (this.position) {\n case 'left':\n this.windowPosition = {\n x: OcsChat.WINDOW_MARGIN,\n y: windowHeight - this.chatWindowHeight - OcsChat.WINDOW_MARGIN\n };\n break;\n case 'right':\n this.windowPosition = {\n x: windowWidth - chatWidth - OcsChat.WINDOW_MARGIN,\n y: windowHeight - this.chatWindowHeight - OcsChat.WINDOW_MARGIN\n };\n break;\n case 'center':\n this.windowPosition = {\n x: (windowWidth - chatWidth) / 2,\n y: (windowHeight - this.chatWindowHeight) / 2\n };\n break;\n }\n }\n\n private getPointerCoordinates(event: MouseEvent | TouchEvent): PointerEvent | null {\n if (event instanceof MouseEvent) {\n return { clientX: event.clientX, clientY: event.clientY };\n } else if (event instanceof TouchEvent && event.touches.length === 1) {\n const touch = event.touches[0];\n return { clientX: touch.clientX, clientY: touch.clientY };\n }\n return null;\n }\n\n private startDrag(pointer: PointerEvent): void {\n if (!this.chatWindowRef) return;\n\n this.isDragging = true;\n\n if (this.isFullscreen) {\n // For fullscreen, track relative to current position\n this.dragOffset = {\n x: pointer.clientX,\n y: pointer.clientY\n };\n } else {\n const rect = this.chatWindowRef.getBoundingClientRect();\n this.dragOffset = {\n x: pointer.clientX - rect.left,\n y: pointer.clientY - rect.top\n };\n }\n }\n\n private updateDragPosition(pointer: PointerEvent): void {\n if (!this.isDragging) return;\n\n if (this.isFullscreen) {\n // In fullscreen, only allow horizontal dragging\n const { maxOffset } = this.getFullscreenBounds();\n\n const deltaX = pointer.clientX - this.dragOffset.x;\n this.fullscreenPosition = {\n x: Math.max(-maxOffset, Math.min(maxOffset, deltaX))\n };\n } else {\n const newX = pointer.clientX - this.dragOffset.x;\n const newY = pointer.clientY - this.dragOffset.y;\n\n // Constrain chatbox to window\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n const chatWidth = windowWidth < OcsChat.MOBILE_BREAKPOINT ? windowWidth : this.chatWindowWidth;\n const chatHeight = this.chatWindowRef.offsetHeight;\n\n this.windowPosition = {\n x: Math.max(0, Math.min(newX, windowWidth - chatWidth)),\n y: Math.max(0, Math.min(newY, windowHeight - chatHeight))\n };\n }\n }\n\n private endDrag(): void {\n this.isDragging = false;\n this.removeEventListeners();\n }\n\n private addEventListeners(): void {\n document.addEventListener('mousemove', this.handleMouseMove);\n document.addEventListener('mouseup', this.handleMouseUp);\n document.addEventListener('touchmove', this.handleTouchMove, { passive: false });\n document.addEventListener('touchend', this.handleTouchEnd);\n }\n\n private removeEventListeners(): void {\n document.removeEventListener('mousemove', this.handleMouseMove);\n document.removeEventListener('mouseup', this.handleMouseUp);\n document.removeEventListener('touchmove', this.handleTouchMove);\n document.removeEventListener('touchend', this.handleTouchEnd);\n }\n\n private handleMouseDown = (event: MouseEvent): void => {\n if (!this.isFullscreen && window.innerWidth < OcsChat.MOBILE_BREAKPOINT) return;\n if ((event.target as HTMLElement).closest('button')) return;\n\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.startDrag(pointer);\n this.addEventListeners();\n event.preventDefault();\n };\n\n private handleMouseMove = (event: MouseEvent): void => {\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.updateDragPosition(pointer);\n };\n\n private handleMouseUp = (): void => {\n this.endDrag();\n };\n\n private handleTouchStart = (event: TouchEvent): void => {\n if ((event.target as HTMLElement).closest('button')) return;\n if (!this.chatWindowRef) return;\n\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.startDrag(pointer);\n this.addEventListeners();\n event.preventDefault();\n };\n\n private handleTouchMove = (event: TouchEvent): void => {\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.updateDragPosition(pointer);\n event.preventDefault();\n };\n\n private handleTouchEnd = (): void => {\n this.endDrag();\n };\n\n private handleWindowResize = (): void => {\n this.positionInitialized = false;\n this.initializePosition();\n };\n\n private getDefaultIconUrl(): string {\n return `${this.getApiBaseUrl()}/static/images/favicons/favicon.svg`;\n }\n\n private getButtonClasses(): string {\n const hasText = this.buttonText && this.buttonText.trim();\n const baseClass = hasText ? 'chat-btn-text' : 'chat-btn-icon';\n const shapeClass = this.buttonShape === 'round' ? 'round' : '';\n return `${baseClass} ${shapeClass}`.trim();\n }\n\n private renderButton() {\n const hasText = this.buttonText && this.buttonText.trim();\n const hasCustomIcon = this.iconUrl && this.iconUrl.trim();\n const iconSrc = hasCustomIcon ? this.iconUrl : this.getDefaultIconUrl();\n const buttonClasses = this.getButtonClasses();\n\n if (hasText) {\n return (\n <button\n class={buttonClasses}\n onClick={() => this.toggleWindowVisibility()}\n aria-label={`Open chat - ${this.buttonText}`}\n title={this.buttonText}\n >\n <img src={iconSrc} alt=\"\" />\n <span>{this.buttonText}</span>\n </button>\n );\n } else {\n return (\n <button\n class={buttonClasses}\n onClick={() => this.toggleWindowVisibility()}\n aria-label=\"Open chat\"\n title=\"Open chat\"\n >\n <img src={iconSrc} alt=\"Chat\" />\n </button>\n );\n }\n }\n\n private getStorageKeys() {\n return {\n sessionId: `ocs-chat-session-${this.chatbotId}`,\n messages: `ocs-chat-messages-${this.chatbotId}`,\n lastActivity: `ocs-chat-activity-${this.chatbotId}`\n };\n }\n\n private saveSessionToStorage(): void {\n if (!this.persistentSession) {\n return\n }\n const keys = this.getStorageKeys();\n try {\n if (this.sessionId) {\n localStorage.setItem(keys.sessionId, this.sessionId);\n localStorage.setItem(keys.lastActivity, new Date().toISOString());\n }\n localStorage.setItem(keys.messages, JSON.stringify(this.messages));\n } catch (error) {\n console.warn('Failed to save chat session to localStorage:', error);\n }\n }\n\n private loadSessionFromStorage(): SessionStorageData {\n const keys = this.getStorageKeys();\n try {\n if (this.persistentSessionExpire > 0) {\n const lastActivity = localStorage.getItem(keys.lastActivity);\n if (lastActivity) {\n const lastActivityDate = new Date(lastActivity);\n const minutesSinceActivity = (Date.now() - lastActivityDate.getTime()) / (1000 * 60);\n if (minutesSinceActivity > this.persistentSessionExpire) {\n this.clearSessionStorage();\n return {messages: []};\n }\n }\n }\n\n const storedSessionId = localStorage.getItem(keys.sessionId);\n const sessionId = storedSessionId ? storedSessionId : undefined;\n\n const messagesJson = localStorage.getItem(keys.messages);\n let messages: ChatMessage[] = [];\n\n if (messagesJson) {\n try {\n const parsedMessages = JSON.parse(messagesJson);\n messages = Array.isArray(parsedMessages) ? parsedMessages : [];\n } catch (parseError) {\n console.warn('Failed to parse messages from localStorage:', parseError);\n messages = [];\n }\n }\n\n return { sessionId, messages };\n } catch (error) {\n // fall back to starting a new session\n console.warn('Failed to load chat session from localStorage, starting new session:', error);\n return { messages: [] };\n }\n }\n\n private getOrGenerateUserId(): string {\n if (this.userId) {\n return this.userId;\n }\n\n if (this.generatedUserId) {\n return this.generatedUserId;\n }\n\n const storageKey = `ocs-user-id`;\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n this.generatedUserId = stored;\n return stored;\n }\n\n const array = new Uint8Array(9);\n window.crypto.getRandomValues(array);\n const randomString = Array.from(array, byte => byte.toString(36)).join('').substr(0, 9);\n const newUserId = `ocs:${Date.now()}_${randomString}`;\n this.generatedUserId = newUserId;\n localStorage.setItem(storageKey, newUserId);\n\n return newUserId;\n }\n\n private clearSessionStorage(): void {\n const keys = this.getStorageKeys();\n try {\n localStorage.removeItem(keys.sessionId);\n localStorage.removeItem(keys.messages);\n localStorage.removeItem(keys.lastActivity);\n } catch (error) {\n console.warn('Failed to clear chat session from localStorage:', error);\n }\n }\n\n private isLocalStorageAvailable(): boolean {\n try {\n localStorage.setItem(OcsChat.LOCALSTORAGE_TEST_KEY, 'test');\n localStorage.removeItem(OcsChat.LOCALSTORAGE_TEST_KEY);\n return true;\n } catch {\n return false;\n }\n }\n\n private showConfirmationDialog(): void {\n this.showNewChatConfirmation = true;\n }\n\n private hideConfirmationDialog(): void {\n this.showNewChatConfirmation = false;\n }\n\n private async confirmNewChat(): Promise<void> {\n this.hideConfirmationDialog();\n await this.actuallyStartNewChat();\n }\n\n private async actuallyStartNewChat(): Promise<void> {\n this.clearSessionStorage();\n this.sessionId = undefined;\n this.messages = [];\n this.isTyping = false;\n this.currentPollTaskId = '';\n if (this.allowAttachments) {\n this.selectedFiles = [];\n }\n this.cleanup();\n\n await this.startSession();\n }\n\n private toggleFullscreen(): void {\n this.isFullscreen = !this.isFullscreen;\n // Reset fullscreen position when toggling\n this.fullscreenPosition = { x: 0 };\n }\n\n render() {\n // Only show error state for critical errors that prevent the widget from functioning\n if (this.error && !this.sessionId) {\n return (\n <Host>\n <p class=\"error-message\">{this.error}</p>\n </Host>\n );\n }\n\n return (\n <Host>\n {this.renderButton()}\n {this.visible && (\n <div\n ref={(el) => this.chatWindowRef = el}\n id=\"ocs-chat-window\"\n class={this.getPositionClasses()}\n style={this.getPositionStyles()}\n >\n {/* Header */}\n <div\n class={`chat-header ${this.isDragging ? 'chat-header-dragging' : 'chat-header-draggable'}`}\n onMouseDown={this.handleMouseDown}\n onTouchStart={this.handleTouchStart}\n >\n {/* Drag indicator */}\n <div class=\"drag-indicator\">\n <div class=\"drag-dots header-button\">\n <GripDotsVerticalIcon/>\n </div>\n </div>\n <div class=\"header-text\">{this.headerText}</div>\n <div class=\"header-buttons\">\n {/* New Chat button */}\n {this.messages.length > 0 && (\n <button\n class=\"header-button\"\n onClick={() => this.showConfirmationDialog()}\n title=\"Start new chat\"\n aria-label=\"Start new chat\"\n >\n <PlusWithCircleIcon/>\n </button>\n )}\n {/* Fullscreen toggle button */}\n {this.allowFullScreen && <button\n class=\"header-button fullscreen-button\"\n onClick={() => this.toggleFullscreen()}\n title={this.isFullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"}\n aria-label={this.isFullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"}\n >\n {this.isFullscreen ? <ArrowsPointingInIcon/> : <ArrowsPointingOutIcon/>}\n </button>}\n <button\n class=\"header-button\"\n onClick={() => this.visible = false}\n aria-label=\"Close\"\n >\n <XMarkIcon/>\n </button>\n </div>\n </div>\n\n {this.showNewChatConfirmation && (\n <div class=\"confirmation-overlay\">\n <div class=\"confirmation-dialog\">\n <div class=\"confirmation-content\">\n <h3 class=\"confirmation-title\">Start New Chat</h3>\n <p class=\"confirmation-message\">\n {this.newChatConfirmationMessage}\n </p>\n <div class=\"confirmation-buttons\">\n <button\n class=\"confirmation-button confirmation-button-cancel\"\n onClick={() => this.hideConfirmationDialog()}\n >\n Cancel\n </button>\n <button\n class=\"confirmation-button confirmation-button-confirm\"\n onClick={() => this.confirmNewChat()}\n >\n Continue\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Chat Content */}\n <div class=\"chat-content\">\n {/* Loading State */}\n {this.isLoading && !this.sessionId && (\n <div class=\"loading-container\">\n <div class=\"loading-spinner\"></div>\n <span class=\"loading-text\">Starting chat...</span>\n </div>\n )}\n\n {/* Messages */}\n {(\n <div\n ref={(el) => this.messageListRef = el}\n class=\"messages-container\"\n >\n {this.messages.length === 0 && this.parsedWelcomeMessages.length > 0 && (\n <div class=\"welcome-messages\">\n {/* Welcome Messages */}\n {this.parsedWelcomeMessages.map((message, index) => (\n <div key={`welcome-${index}`} class=\"message-row message-row-assistant\">\n <div class=\"message-bubble message-bubble-assistant\">\n <div\n class=\"chat-markdown\"\n innerHTML={renderMarkdownComplete(message)}\n ></div>\n </div>\n </div>\n ))}\n </div>\n )}\n {/* Regular Chat Messages */}\n {this.messages.map((message, index) => (\n <div\n key={index}\n class={`message-row ${\n message.role === 'user' ? 'message-row-user' : 'message-row-assistant'\n }`}\n >\n <div\n class={`message-bubble ${\n message.role === 'user'\n ? 'message-bubble-user'\n : message.role === 'assistant'\n ? 'message-bubble-assistant'\n : 'message-bubble-system'\n }`}\n >\n <div\n class=\"chat-markdown\"\n innerHTML={renderMarkdownComplete(message.content)}\n ></div>\n {message.attachments && message.attachments.length > 0 && (\n <div class=\"message-attachments\">\n {message.attachments.map((attachment, attachmentIndex) => (\n <div key={attachmentIndex} class=\"flex items-center gap-[0.5em]\">\n <span class=\"message-attachment-icon\">\n <PaperClipIcon />\n </span>\n <span class=\"message-attachment-name\">{attachment.name}</span>\n </div>\n ))}\n </div>\n )}\n <div class=\"message-timestamp\">\n {this.formatTime(message.created_at)}\n </div>\n </div>\n </div>\n ))}\n {/* Typing Indicator */}\n {this.isTyping && (\n <div>\n <div class=\"typing-indicator\">\n <div class=\"typing-progress\"></div>\n </div>\n <div class=\"typing-text\">\n <span>{this.typingIndicatorText}</span>\n <span class=\"typing-dots\"></span>\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Starter Questions */}\n {this.messages.length === 0 && this.parsedStarterQuestions.length > 0 && (\n <div class=\"starter-questions\">\n {this.parsedStarterQuestions.map((question, index) => (\n <div key={`starter-${index}`} class=\"starter-question-row\">\n <button\n class=\"starter-question\"\n onClick={() => this.handleStarterQuestionClick(question)}\n >\n {question}\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* Selected Files Display */}\n {this.allowAttachments && this.selectedFiles.length > 0 && (\n <div class=\"selected-files-container\">\n <div class=\"space-y-[0.25em]\">\n {this.selectedFiles.map((selectedFile, index) => (\n <div key={index} class=\"selected-file-item\">\n <div class=\"flex items-center gap-[0.5em]\">\n <span class=\"selected-file-icon\">\n <PaperClipIcon/>\n </span>\n <span>{selectedFile.file.name}</span>\n <span class=\"selected-file-size\">({this.formatFileSize(selectedFile.file.size)})</span>\n {selectedFile.error && (\n <span class=\"selected-file-error\">{selectedFile.error}</span>\n )}\n {selectedFile.uploaded && (\n <span class=\"selected-file-success-icon\"><CheckDocumentIcon /></span>\n )}\n </div>\n <button\n onClick={() => this.removeSelectedFile(index)}\n class=\"selected-file-remove-button\"\n aria-label=\"Remove file\"\n ><XIcon />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Input Area */}\n {this.sessionId && (\n <div class=\"input-area\">\n <div class=\"input-container\">\n <textarea\n ref={(el) => this.textareaRef = el}\n class=\"message-textarea\"\n rows={1}\n placeholder=\"Type your message...\"\n value={this.messageInput}\n onInput={(e) => this.handleInputChange(e)}\n onKeyPress={(e) => this.handleKeyPress(e)}\n disabled={this.isTyping || this.isUploadingFiles}\n ></textarea>\n {/* File Upload Button */}\n {this.allowAttachments && (\n <input\n ref={(el) => {\n // Unclear why but after removing all attachments this is being set to `null`.\n if (el) {this.fileInputRef = el}\n }\n }\n id=\"ocs-file-input\"\n type=\"file\"\n multiple\n accept={OcsChat.SUPPORTED_FILE_EXTENSIONS.join(',')}\n onChange={(e) => this.handleFileSelect(e)}\n class=\"hidden\"\n />\n )}\n {this.allowAttachments && (\n <button\n class=\"file-attachment-button\"\n onClick={() => this.fileInputRef?.click()}\n disabled={this.isTyping || this.isUploadingFiles}\n title=\"Attach files\"\n aria-label=\"Attach files\"\n >\n <PaperClipIcon />\n </button>\n )}\n <button\n class={`send-button ${\n !this.isTyping && !!this.messageInput.trim()\n ? 'send-button-enabled'\n : 'send-button-disabled'\n }`}\n onClick={() => this.sendMessage(this.messageInput)}\n disabled={this.isTyping || this.isUploadingFiles || !this.messageInput.trim()}\n >\n {this.isUploadingFiles ? 'Uploading...' : 'Send'}\n </button>\n </div>\n </div>\n )}\n <div class=\"flex items-center justify-center text-[0.8em] font-light w-full text-slate-500 py-[2px]\">\n <p>Powered by <a class=\"underline\" href=\"https://www.dimagi.com\" target=\"_blank\">Dimagi</a></p>\n </div>\n </div>\n </div>\n )}\n </Host>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"ocs-chat.js","sourceRoot":"","sources":["../../../src/components/ocs-chat/ocs-chat.tsx"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport {Component, Host, h, Prop, State, Element, Watch, Env} from '@stencil/core';\nimport {\n XMarkIcon,\n GripDotsVerticalIcon, PlusWithCircleIcon, ArrowsPointingOutIcon, ArrowsPointingInIcon,\n PaperClipIcon, CheckDocumentIcon, XIcon, OcsWidgetAvatar\n} from './icons';\nimport { renderMarkdownSync as renderMarkdownComplete } from '../../utils/markdown';\nimport { varToPixels } from '../../utils/utils';\nimport {TranslationStrings, TranslationManager, defaultTranslations} from '../../utils/translations';\nimport {\n ChatSessionService,\n ChatMessage,\n MessagePollingHandle,\n TaskPollingHandle\n} from '../../services/chat-session-service';\nimport {\n FileAttachmentManager,\n SelectedFile\n} from '../../services/file-attachment-manager';\n\ninterface PointerEvent {\n clientX: number;\n clientY: number;\n}\n\ninterface SessionStorageData {\n sessionId?: string;\n messages: ChatMessage[];\n}\n\n@Component({\n tag: 'open-chat-studio-widget',\n styleUrl: 'ocs-chat.css',\n shadow: true,\n})\nexport class OcsChat {\n\n private static readonly TASK_POLLING_MAX_ATTEMPTS = 120;\n private static readonly TASK_POLLING_INTERVAL_MS = 1000;\n private static readonly MESSAGE_POLLING_INTERVAL_MS = 30000;\n\n private static readonly SCROLL_DELAY_MS = 100;\n private static readonly FOCUS_DELAY_MS = 100;\n\n private static readonly MOBILE_BREAKPOINT = 640;\n private static readonly WINDOW_MARGIN = 20;\n\n private static readonly LOCALSTORAGE_TEST_KEY = '__ocs_test__';\n\n private static readonly MAX_FILE_SIZE_MB = 50;\n private static readonly MAX_TOTAL_SIZE_MB = 50;\n private static readonly SUPPORTED_FILE_EXTENSIONS = ['.txt', '.pdf', '.doc', '.docx', '.xls', '.xlsx', '.csv', '.jpg', '.jpeg',\n '.png', '.gif', '.bmp', '.webp', '.svg', '.mp4', '.mov', '.avi', '.mp3', '.wav' ];\n\n /**\n * The ID of the chatbot to connect to.\n */\n @Prop() chatbotId!: string;\n\n /**\n * The base URL for the API.\n */\n @Prop() apiBaseUrl?: string = \"https://www.openchatstudio.com\";\n\n /**\n * The text to display on the button.\n */\n @Prop() buttonText?: string;\n\n /**\n * URL of the icon to display on the button. If not provided, uses the default OCS logo.\n */\n @Prop() iconUrl?: string;\n\n /**\n * Authentication key for embedded channels\n */\n @Prop() embedKey?: string;\n\n /**\n * The shape of the chat button. 'round' makes it circular, 'square' keeps it rectangular.\n */\n @Prop() buttonShape: 'round' | 'square' = 'square';\n\n /**\n * The text to place in the header.\n */\n @Prop() headerText: '';\n\n /**\n * The message to display in the new chat confirmation dialog.\n */\n @Prop() newChatConfirmationMessage?: string;\n\n /**\n * Whether the chat widget is visible on load.\n */\n @Prop({ mutable: true }) visible: boolean = false;\n\n /**\n * The initial position of the chat widget on the screen.\n */\n @Prop({ mutable: true }) position: 'left' | 'center' | 'right' = 'right';\n\n /**\n * Welcome messages to display above starter questions (JSON array of strings)\n */\n @Prop() welcomeMessages?: string;\n\n /**\n * Array of starter questions that users can click to send (JSON array of strings)\n */\n @Prop() starterQuestions?: string;\n\n /**\n * Used to associate chat sessions with a specific user across multiple visits/sessions\n */\n @Prop() userId?: string;\n /**\n * Display name for the user.\n */\n @Prop() userName?: string;\n /**\n * Whether to persist session data to local storage to allow resuming previous conversations after page reload.\n */\n @Prop() persistentSession: boolean = true;\n\n /**\n * Minutes since the most recent message after which the session data in local storage will expire. Set this to\n * `0` to never expire.\n */\n @Prop() persistentSessionExpire: number = 60 * 24;\n\n /**\n * Allow the user to make the chat window full screen.\n */\n @Prop() allowFullScreen: boolean = true;\n\n /**\n * Allow the user to attach files to their messages.\n */\n @Prop() allowAttachments: boolean = false;\n\n /**\n * The text to display while the assistant is typing/preparing a response.\n */\n @Prop() typingIndicatorText?: string;\n\n /**\n * The language code for the widget UI (e.g., 'en', 'es', 'fr'). Defaults to en\n */\n @Prop() language?: string;\n\n @Prop() translationsUrl?: string;\n\n @State() error: string = \"\";\n @State() messages: ChatMessage[] = [];\n @State() sessionId?: string;\n @State() isLoading: boolean = false;\n @State() isTyping: boolean = false;\n @State() messageInput: string = \"\";\n @State() currentPollTaskId: string = \"\";\n @State() isDragging: boolean = false;\n @State() dragOffset: { x: number; y: number } = { x: 0, y: 0 };\n @State() windowPosition: { x: number; y: number } = { x: 0, y: 0 };\n @State() fullscreenPosition: { x: number } = { x: 0 };\n @State() parsedWelcomeMessages: string[] = [];\n @State() parsedStarterQuestions: string[] = [];\n @State() generatedUserId?: string;\n @State() isFullscreen: boolean = false;\n @State() showNewChatConfirmation: boolean = false;\n\n @State() selectedFiles: SelectedFile[] = [];\n @State() isUploadingFiles: boolean = false;\n private buttonPosition: { x: number; y: number } = { x: 30, y: 30 };\n private buttonHorizontalSide: 'left' | 'right' = 'right';\n private buttonVerticalSide: 'top' | 'bottom' = 'bottom';\n @State() isButtonDragging: boolean = false;\n @State() buttonWasDragged: boolean = false;\n\n translationManager: TranslationManager = new TranslationManager();\n\n private chatService?: ChatSessionService;\n private messagePollingHandle?: MessagePollingHandle;\n private taskPollingHandle?: TaskPollingHandle;\n private attachmentManager = new FileAttachmentManager({\n supportedExtensions: OcsChat.SUPPORTED_FILE_EXTENSIONS,\n maxFileSizeMb: OcsChat.MAX_FILE_SIZE_MB,\n maxTotalSizeMb: OcsChat.MAX_TOTAL_SIZE_MB,\n });\n private messageListRef?: HTMLDivElement;\n private textareaRef?: HTMLTextAreaElement;\n private chatWindowRef?: HTMLDivElement;\n private fileInputRef?: HTMLInputElement;\n private buttonRef?: HTMLButtonElement;\n private buttonDragOffset: { x: number; y: number } = { x: 0, y: 0 };\n private rafId: number | null = null;\n private buttonListenersAttached: boolean = false;\n private chatWindowHeight: number = 600;\n private chatWindowWidth: number = 450;\n private chatWindowFullscreenWidth: number = 1024;\n private positionInitialized: boolean = false;\n @Element() host: HTMLElement;\n\n\n async componentWillLoad() {\n if (!this.chatbotId) {\n this.error = 'Chatbot ID is required';\n return;\n }\n\n await this.initializeTranslations();\n\n // Always try to load existing session if localStorage is available\n if (this.persistentSession && this.isLocalStorageAvailable()) {\n const { sessionId, messages } = this.loadSessionFromStorage();\n if (sessionId && messages) {\n this.sessionId = sessionId;\n this.messages = messages;\n }\n }\n this.parseWelcomeMessages();\n this.parseStarterQuestions();\n }\n\n componentDidLoad() {\n const computedStyle = getComputedStyle(this.host);\n const windowHeightVar = computedStyle.getPropertyValue('--chat-window-height');\n const windowWidthVar = computedStyle.getPropertyValue('--chat-window-width');\n const fullscreenWidthVar = computedStyle.getPropertyValue('--chat-window-fullscreen-width');\n this.chatWindowHeight = varToPixels(windowHeightVar, window.innerHeight, this.chatWindowHeight);\n this.chatWindowWidth = varToPixels(windowWidthVar, window.innerWidth, this.chatWindowWidth);\n this.chatWindowFullscreenWidth = varToPixels(fullscreenWidthVar, window.innerWidth, this.chatWindowFullscreenWidth);\n\n // Initialize button position from computed styles\n this.initializeButtonPosition();\n\n if (this.visible) {\n this.initializePosition();\n }\n\n // Only auto-start session if we don't have an existing one\n if (this.visible && !this.sessionId) {\n this.startSession();\n } else if (this.visible && this.sessionId) {\n // Resume polling for existing session\n this.startMessagePolling();\n }\n window.addEventListener('resize', this.handleWindowResize);\n }\n\n disconnectedCallback() {\n this.cleanup();\n this.removeEventListeners();\n this.removeButtonEventListeners();\n window.removeEventListener('resize', this.handleWindowResize);\n }\n\n private getChatService(): ChatSessionService {\n if (!this.chatService) {\n this.chatService = new ChatSessionService({\n apiBaseUrl: this.apiBaseUrl || 'https://www.openchatstudio.com',\n embedKey: this.embedKey,\n widgetVersion: Env.version,\n taskPollingIntervalMs: OcsChat.TASK_POLLING_INTERVAL_MS,\n taskPollingMaxAttempts: OcsChat.TASK_POLLING_MAX_ATTEMPTS,\n messagePollingIntervalMs: OcsChat.MESSAGE_POLLING_INTERVAL_MS,\n });\n }\n return this.chatService;\n }\n\n private addErrorMessage(errorText: string): void {\n const errorMessage: ChatMessage = {\n created_at: new Date().toISOString(),\n role: 'system',\n content: `**Error:** ${errorText}\\nPlease try again.`,\n attachments: []\n };\n\n this.messages = [...this.messages, errorMessage];\n this.saveSessionToStorage();\n this.scrollToBottom();\n }\n\n private handleError(errorText: string): void {\n // show as system message\n this.addErrorMessage(errorText);\n\n // Clear any loading/typing states\n this.isLoading = false;\n this.isTyping = false;\n this.isUploadingFiles = false;\n this.currentPollTaskId = '';\n }\n\n private parseJSONProp(propValue: string | undefined, propName: string): string[] {\n try {\n if (propValue) {\n try {\n return JSON.parse(propValue);\n } catch {\n const fixedValue = propValue.replace(/'/g, '\"');\n return JSON.parse(fixedValue);\n }\n }\n } catch (error) {\n console.warn(`Failed to parse ${propName}:`, error);\n }\n return [];\n }\n\n private parseWelcomeMessages() {\n this.parsedWelcomeMessages = this.parseJSONProp(this.welcomeMessages, 'welcome messages');\n }\n\n private parseStarterQuestions() {\n this.parsedStarterQuestions = this.parseJSONProp(this.starterQuestions, 'starter questions');\n }\n\n private async initializeTranslations() {\n let customTranslationsObj: Partial<TranslationStrings> | undefined;\n\n if (this.translationsUrl) {\n customTranslationsObj = await this.loadTranslationsFromUrl(this.translationsUrl);\n }\n this.translationManager = new TranslationManager(this.language, customTranslationsObj);\n }\n\n private async loadTranslationsFromUrl(url: string): Promise<Partial<TranslationStrings>> {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n const translations = await response.json();\n return translations as Partial<TranslationStrings>;\n } catch (error) {\n console.error('Error loading translations from URL:', error);\n return defaultTranslations\n }\n }\n\n private cleanup() {\n this.stopMessagePolling();\n if (this.taskPollingHandle) {\n this.taskPollingHandle.cancel();\n this.taskPollingHandle = undefined;\n }\n this.currentPollTaskId = '';\n }\n\n private async startSession(): Promise<void> {\n try {\n this.isLoading = true;\n\n const userId = this.getOrGenerateUserId();\n\n const requestBody: Record<string, unknown> = {\n chatbot_id: this.chatbotId,\n session_data: {\n source: 'widget',\n page_url: window.location.href\n },\n participant_remote_id: userId\n };\n\n if (this.userName) {\n requestBody.participant_name = this.userName;\n }\n\n const data = await this.getChatService().startSession(requestBody);\n this.sessionId = data.session_id;\n this.saveSessionToStorage();\n\n // Handle seed message if present\n if (data.seed_message_task_id) {\n this.startTaskPolling(data.seed_message_task_id);\n } else {\n this.startMessagePolling();\n }\n } catch (_error) {\n this.handleError('Failed to start chat session');\n } finally {\n this.isLoading = false;\n }\n }\n\n private async uploadFiles(): Promise<number[]> {\n if (this.selectedFiles.length === 0 || !this.sessionId || !this.allowAttachments) {\n return [];\n }\n\n this.isUploadingFiles = true;\n try {\n const uploadResult = await this.attachmentManager.uploadPendingFiles(this.selectedFiles, {\n apiBaseUrl: this.apiBaseUrl || 'https://www.openchatstudio.com',\n sessionId: this.sessionId,\n participantId: this.getOrGenerateUserId(),\n participantName: this.userName,\n });\n this.selectedFiles = uploadResult.selectedFiles;\n return uploadResult.uploadedIds;\n } finally {\n this.isUploadingFiles = false;\n }\n }\n\n private async sendMessage(message: string): Promise<void> {\n if (!this.sessionId || !message.trim()) return;\n\n try {\n let attachmentIds: number[] = [];\n if (this.allowAttachments && this.selectedFiles.length > 0) {\n attachmentIds = await this.uploadFiles();\n\n // Check if any files have errors after upload attempt\n const hasErrors = this.selectedFiles.some(sf => sf.error);\n if (hasErrors) {\n // Don't send the message, let user fix file issues first\n this.handleError('Please remove or fix file errors before sending your message.');\n return;\n }\n }\n\n // If this is the first user message and there are welcome messages,\n // add them to chat history as assistant messages\n if (this.messages.length === 0 && this.parsedWelcomeMessages.length > 0) {\n const now = new Date();\n const welcomeMessages: ChatMessage[] = this.parsedWelcomeMessages.map((welcomeMsg, index) => ({\n created_at: new Date(now.getTime() - (this.parsedWelcomeMessages.length - index) * 1000).toISOString(),\n role: 'assistant' as const,\n content: welcomeMsg,\n attachments: []\n }));\n this.messages = [...this.messages, ...welcomeMessages];\n }\n\n // Add user message immediately with attachments info\n const userMessage: ChatMessage = {\n created_at: new Date().toISOString(),\n role: 'user',\n content: message.trim(),\n attachments: this.allowAttachments ? this.selectedFiles\n .filter(sf => !sf.error && sf.uploaded)\n .map(sf => ({\n name: sf.file.name,\n content_type: sf.file.type,\n size: sf.file.size,\n })) : []\n };\n this.messages = [...this.messages, userMessage];\n this.saveSessionToStorage();\n this.messageInput = '';\n if (this.allowAttachments) {\n this.selectedFiles = []; // Clear selected files after sending\n }\n this.scrollToBottom();\n\n const requestBody: any = { message: message.trim() };\n if (this.allowAttachments && attachmentIds.length > 0) {\n requestBody.attachment_ids = attachmentIds;\n }\n\n const data = await this.getChatService().sendMessage(this.sessionId, requestBody);\n\n if (data.status === 'error') {\n throw new Error(data.error || 'Failed to send message');\n }\n\n this.startTaskPolling(data.task_id);\n } catch (error) {\n const errorText = error instanceof Error ? error.message : 'Failed to send message';\n this.handleError(errorText);\n }\n }\n\n private handleStarterQuestionClick(question: string): void {\n this.sendMessage(question);\n }\n\n /**\n * Scroll the message container to the bottom.\n * @param forceEnd When `false`, scroll the top of the last message into view.\n * When `true`, scroll all the way to the end of the last message.\n */\n private scrollToBottom(forceEnd: boolean =false): void {\n setTimeout(() => {\n if (this.messageListRef) {\n const lastChild = this.messageListRef.lastElementChild;\n if (!forceEnd && lastChild) {\n // scroll so that the top of the last message is in the centre of the message container\n const parentRect = this.messageListRef.getBoundingClientRect();\n const childRect = lastChild.getBoundingClientRect();\n const currentScrollTop = this.messageListRef.scrollTop;\n const childTopRelativeToParent = childRect.top - parentRect.top;\n const targetScroll = currentScrollTop + childTopRelativeToParent - (parentRect.height / 2);\n this.messageListRef.scrollTo({\n top: targetScroll,\n behavior: 'smooth'\n });\n } else {\n this.messageListRef.scrollTop = this.messageListRef.scrollHeight;\n }\n }\n }, OcsChat.SCROLL_DELAY_MS);\n }\n\n private focusInput(): void {\n setTimeout(() => {\n if (this.textareaRef && !this.isTyping) {\n this.textareaRef.focus();\n }\n }, OcsChat.FOCUS_DELAY_MS);\n }\n\n private handleKeyPress(event: KeyboardEvent): void {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.sendMessage(this.messageInput);\n }\n }\n\n private handleInputChange(event: Event): void {\n this.messageInput = (event.target as HTMLTextAreaElement).value;\n }\n\n private handleFileSelect(event: Event): void {\n if (!this.allowAttachments) return;\n\n const input = event.target as HTMLInputElement;\n if (!input.files || input.files.length === 0) return;\n\n this.selectedFiles = this.attachmentManager.addFiles(this.selectedFiles, input.files);\n input.value = '';\n }\n\n private removeSelectedFile(index: number): void {\n if (!this.allowAttachments) return;\n this.selectedFiles = this.attachmentManager.removeFile(this.selectedFiles, index);\n }\n\n private formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 KB';\n const k = 1024;\n\n if (bytes < k * k) {\n // Less than 1MB, show in KB\n return Math.round(bytes / k * 100) / 100 + ' KB';\n } else {\n return Math.round(bytes / (k * k) * 100) / 100 + ' MB';\n }\n }\n\n private formatTime(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\n }\n\n private toggleWindowVisibility() {\n this.visible = !this.visible;\n }\n\n /**\n * Watch for changes to the `visible` attribute and update accordingly.\n *\n * @param visible - The new value for the field.\n */\n @Watch('visible')\n async visibilityHandler(visible: boolean) {\n if (this.isButtonDragging) {\n this.isButtonDragging = false;\n this.buttonWasDragged = false;\n this.removeButtonEventListeners();\n }\n\n if (visible) {\n this.initializePosition();\n }\n if (visible && !this.sessionId) {\n await this.startSession();\n } else if (!visible) {\n this.stopMessagePolling();\n } else {\n this.scrollToBottom(true);\n this.startMessagePolling();\n }\n }\n\n private startTaskPolling(taskId: string): void {\n if (!this.sessionId) return;\n\n this.currentPollTaskId = taskId;\n this.isTyping = true;\n this.stopMessagePolling();\n\n if (this.taskPollingHandle) {\n this.taskPollingHandle.cancel();\n }\n\n this.taskPollingHandle = this.getChatService().pollTask(this.sessionId, taskId, {\n onMessage: (message) => {\n this.messages = [...this.messages, message];\n this.saveSessionToStorage();\n this.scrollToBottom();\n this.isTyping = false;\n this.currentPollTaskId = '';\n this.taskPollingHandle = undefined;\n this.startMessagePolling();\n this.focusInput();\n },\n onTimeout: () => {\n const timeoutMessage: ChatMessage = {\n created_at: new Date().toISOString(),\n role: 'system',\n content: 'The response is taking longer than expected. The system may be experiencing delays. Please try sending your message again.',\n attachments: []\n };\n this.messages = [...this.messages, timeoutMessage];\n this.saveSessionToStorage();\n this.scrollToBottom();\n this.isTyping = false;\n this.currentPollTaskId = '';\n this.taskPollingHandle = undefined;\n this.startMessagePolling();\n this.focusInput();\n },\n onError: (error) => {\n this.handleError(error.message);\n this.taskPollingHandle = undefined;\n this.startMessagePolling();\n }\n });\n }\n\n private startMessagePolling(): void {\n if (!this.sessionId || this.currentPollTaskId || !this.visible) {\n return;\n }\n\n if (this.messagePollingHandle) {\n return;\n }\n\n this.messagePollingHandle = this.getChatService().startMessagePolling(this.sessionId, {\n getSince: () => this.messages.length > 0 ? this.messages.at(-1)?.created_at : undefined,\n onMessages: (messages) => {\n if (messages.length === 0) return;\n this.messages = [...this.messages, ...messages];\n this.saveSessionToStorage();\n this.scrollToBottom();\n this.focusInput();\n },\n onError: () => {\n // Silently ignore polling errors to match previous behaviour\n }\n });\n }\n\n private stopMessagePolling(): void {\n if (this.messagePollingHandle) {\n this.messagePollingHandle.stop();\n this.messagePollingHandle = undefined;\n } else {\n this.chatService?.stopMessagePolling();\n }\n }\n\n setPosition(position: 'left' | 'center' | 'right') {\n if (position === this.position) return;\n this.position = position;\n }\n\n getPositionClasses() {\n if (this.isFullscreen) {\n return 'chat-window-fullscreen';\n }\n const baseClasses = 'chat-window-normal';\n const draggingClass = this.isDragging ? ' chat-window-dragging' : '';\n return baseClasses + draggingClass;\n }\n\n private getFullscreenBounds() {\n const windowWidth = window.innerWidth;\n const actualChatWidth = Math.min(windowWidth, this.chatWindowFullscreenWidth);\n const centeredX = (windowWidth - actualChatWidth) / 2;\n const maxOffset = (windowWidth - actualChatWidth) / 2;\n\n return { windowWidth, actualChatWidth, centeredX, maxOffset };\n }\n\n getPositionStyles() {\n if (this.isFullscreen) {\n const { centeredX } = this.getFullscreenBounds();\n const finalX = centeredX + this.fullscreenPosition.x;\n\n return {\n left: `${finalX}px`,\n top: '0px',\n transform: 'none',\n };\n }\n return {\n left: `${this.windowPosition.x}px`,\n top: `${this.windowPosition.y}px`,\n };\n }\n\n private initializePosition(): void {\n if (this.positionInitialized) {\n return;\n }\n this.positionInitialized = true;\n\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n const chatWidth = windowWidth < OcsChat.MOBILE_BREAKPOINT ? windowWidth : this.chatWindowWidth;\n const isMobile = windowWidth < OcsChat.MOBILE_BREAKPOINT;\n\n if (isMobile) {\n this.windowPosition = { x: 0, y: 0 };\n return;\n }\n\n switch (this.position) {\n case 'left':\n this.windowPosition = {\n x: OcsChat.WINDOW_MARGIN,\n y: windowHeight - this.chatWindowHeight - OcsChat.WINDOW_MARGIN\n };\n break;\n case 'right':\n this.windowPosition = {\n x: windowWidth - chatWidth - OcsChat.WINDOW_MARGIN,\n y: windowHeight - this.chatWindowHeight - OcsChat.WINDOW_MARGIN\n };\n break;\n case 'center':\n this.windowPosition = {\n x: (windowWidth - chatWidth) / 2,\n y: (windowHeight - this.chatWindowHeight) / 2\n };\n break;\n }\n }\n\n private getPointerCoordinates(event: MouseEvent | TouchEvent): PointerEvent | null {\n if (event instanceof MouseEvent) {\n return { clientX: event.clientX, clientY: event.clientY };\n } else if (event instanceof TouchEvent && event.touches.length === 1) {\n const touch = event.touches[0];\n return { clientX: touch.clientX, clientY: touch.clientY };\n }\n return null;\n }\n\n private startDrag(pointer: PointerEvent): void {\n if (!this.chatWindowRef) return;\n\n this.isDragging = true;\n\n if (this.isFullscreen) {\n // For fullscreen, track relative to current position\n this.dragOffset = {\n x: pointer.clientX,\n y: pointer.clientY\n };\n } else {\n const rect = this.chatWindowRef.getBoundingClientRect();\n this.dragOffset = {\n x: pointer.clientX - rect.left,\n y: pointer.clientY - rect.top\n };\n }\n }\n\n private updateDragPosition(pointer: PointerEvent): void {\n if (!this.isDragging) return;\n\n if (this.isFullscreen) {\n // In fullscreen, only allow horizontal dragging\n const { maxOffset } = this.getFullscreenBounds();\n\n const deltaX = pointer.clientX - this.dragOffset.x;\n this.fullscreenPosition = {\n x: Math.max(-maxOffset, Math.min(maxOffset, deltaX))\n };\n } else {\n const newX = pointer.clientX - this.dragOffset.x;\n const newY = pointer.clientY - this.dragOffset.y;\n\n // Constrain chatbox to window\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n const chatWidth = windowWidth < OcsChat.MOBILE_BREAKPOINT ? windowWidth : this.chatWindowWidth;\n const chatHeight = this.chatWindowRef.offsetHeight;\n\n this.windowPosition = {\n x: Math.max(0, Math.min(newX, windowWidth - chatWidth)),\n y: Math.max(0, Math.min(newY, windowHeight - chatHeight))\n };\n }\n }\n\n private endDrag(): void {\n this.isDragging = false;\n this.removeEventListeners();\n }\n\n private addEventListeners(): void {\n document.addEventListener('mousemove', this.handleMouseMove);\n document.addEventListener('mouseup', this.handleMouseUp);\n document.addEventListener('touchmove', this.handleTouchMove, { passive: false });\n document.addEventListener('touchend', this.handleTouchEnd);\n }\n\n private removeEventListeners(): void {\n document.removeEventListener('mousemove', this.handleMouseMove);\n document.removeEventListener('mouseup', this.handleMouseUp);\n document.removeEventListener('touchmove', this.handleTouchMove);\n document.removeEventListener('touchend', this.handleTouchEnd);\n }\n\n private handleMouseDown = (event: MouseEvent): void => {\n if (!this.isFullscreen && window.innerWidth < OcsChat.MOBILE_BREAKPOINT) return;\n if ((event.target as HTMLElement).closest('button')) return;\n\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.startDrag(pointer);\n this.addEventListeners();\n event.preventDefault();\n };\n\n private handleMouseMove = (event: MouseEvent): void => {\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.updateDragPosition(pointer);\n };\n\n private handleMouseUp = (): void => {\n this.endDrag();\n };\n\n private handleTouchStart = (event: TouchEvent): void => {\n if ((event.target as HTMLElement).closest('button')) return;\n if (!this.chatWindowRef) return;\n\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.startDrag(pointer);\n this.addEventListeners();\n event.preventDefault();\n };\n\n private handleTouchMove = (event: TouchEvent): void => {\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.updateDragPosition(pointer);\n event.preventDefault();\n };\n\n private handleTouchEnd = (): void => {\n this.endDrag();\n };\n\n private handleWindowResize = (): void => {\n this.positionInitialized = false;\n this.initializePosition();\n\n // Revalidate button position after resize to keep it within viewport bounds\n if (this.isButtonDraggable()) {\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n const buttonWidth = this.buttonRef?.offsetWidth || 60;\n const buttonHeight = this.buttonRef?.offsetHeight || 60;\n const minPadding = 10;\n\n this.buttonPosition = {\n x: Math.max(minPadding, Math.min(this.buttonPosition.x, windowWidth - buttonWidth - minPadding)),\n y: Math.max(minPadding, Math.min(this.buttonPosition.y, windowHeight - buttonHeight - minPadding))\n };\n\n this.updateHostPosition();\n }\n };\n\n // Button positioning and drag handlers\n private initializeButtonPosition(): void {\n const computedStyle = getComputedStyle(this.host);\n const position = computedStyle.getPropertyValue('position');\n\n // Only enable dragging if the host element is positioned fixed\n if (position !== 'fixed') {\n return;\n }\n\n const rect = this.host.getBoundingClientRect();\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n\n const left = computedStyle.getPropertyValue('left');\n const right = computedStyle.getPropertyValue('right');\n const top = computedStyle.getPropertyValue('top');\n const bottom = computedStyle.getPropertyValue('bottom');\n\n const hasLeft = !this.isAutoPosition(left);\n const hasTop = !this.isAutoPosition(top);\n\n this.buttonHorizontalSide = hasLeft ? 'left' : 'right';\n this.buttonVerticalSide = hasTop ? 'top' : 'bottom';\n\n const resolvedRight = this.getNumericPositionValue(right, Math.max(0, windowWidth - rect.right));\n const resolvedLeft = this.getNumericPositionValue(left, Math.max(0, rect.left));\n const resolvedBottom = this.getNumericPositionValue(bottom, Math.max(0, windowHeight - rect.bottom));\n const resolvedTop = this.getNumericPositionValue(top, Math.max(0, rect.top));\n\n const horizontalValue = this.buttonHorizontalSide === 'left' ? resolvedLeft : resolvedRight;\n const verticalValue = this.buttonVerticalSide === 'top' ? resolvedTop : resolvedBottom;\n\n this.buttonPosition = {\n x: horizontalValue,\n y: verticalValue\n };\n\n // Apply the position to the host\n this.updateHostPosition();\n }\n\n private updateHostPosition(): void {\n this.host.style.position = 'fixed';\n if (this.buttonHorizontalSide === 'left') {\n this.host.style.left = `${this.buttonPosition.x}px`;\n this.host.style.right = 'auto';\n } else {\n this.host.style.right = `${this.buttonPosition.x}px`;\n this.host.style.left = 'auto';\n }\n\n if (this.buttonVerticalSide === 'top') {\n this.host.style.top = `${this.buttonPosition.y}px`;\n this.host.style.bottom = 'auto';\n } else {\n this.host.style.bottom = `${this.buttonPosition.y}px`;\n this.host.style.top = 'auto';\n }\n }\n\n private isButtonDraggable(): boolean {\n const computedStyle = getComputedStyle(this.host);\n return computedStyle.getPropertyValue('position') === 'fixed';\n }\n\n private handleButtonMouseDown = (event: MouseEvent): void => {\n if (!this.buttonRef || !this.isButtonDraggable()) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.isButtonDragging = true;\n this.buttonWasDragged = false; // Reset the drag flag\n const rect = this.host.getBoundingClientRect();\n this.buttonDragOffset = {\n x: pointer.clientX - rect.left,\n y: pointer.clientY - rect.top\n };\n\n this.addButtonEventListeners();\n };\n\n private handleButtonTouchStart = (event: TouchEvent): void => {\n if (!this.buttonRef || !this.isButtonDraggable()) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.isButtonDragging = true;\n this.buttonWasDragged = false; // Reset the drag flag\n const rect = this.host.getBoundingClientRect();\n this.buttonDragOffset = {\n x: pointer.clientX - rect.left,\n y: pointer.clientY - rect.top\n };\n\n this.addButtonEventListeners();\n };\n\n private handleButtonMouseMove = (event: MouseEvent): void => {\n if (!this.isButtonDragging) return;\n\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.updateButtonPosition(pointer);\n };\n\n private handleButtonTouchMove = (event: TouchEvent): void => {\n if (!this.isButtonDragging) return;\n\n event.preventDefault();\n\n const pointer = this.getPointerCoordinates(event);\n if (!pointer) return;\n\n this.updateButtonPosition(pointer);\n };\n\n private updateButtonPosition(pointer: PointerEvent): void {\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n\n const buttonWidth = this.buttonRef?.offsetWidth || 60;\n const buttonHeight = this.buttonRef?.offsetHeight || 60;\n const minPadding = 10;\n\n const candidateLeft = pointer.clientX - this.buttonDragOffset.x;\n const candidateTop = pointer.clientY - this.buttonDragOffset.y;\n\n const minLeft = minPadding;\n const maxLeft = windowWidth - buttonWidth - minPadding;\n const minTop = minPadding;\n const maxTop = windowHeight - buttonHeight - minPadding;\n\n const constrainedLeft = Math.max(minLeft, Math.min(candidateLeft, maxLeft));\n const constrainedTop = Math.max(minTop, Math.min(candidateTop, maxTop));\n\n const newHorizontalValue = this.buttonHorizontalSide === 'left'\n ? constrainedLeft\n : Math.max(minPadding, windowWidth - (constrainedLeft + buttonWidth));\n const newVerticalValue = this.buttonVerticalSide === 'top'\n ? constrainedTop\n : Math.max(minPadding, windowHeight - (constrainedTop + buttonHeight));\n\n if (newHorizontalValue !== this.buttonPosition.x || newVerticalValue !== this.buttonPosition.y) {\n this.buttonWasDragged = true;\n this.buttonPosition = { x: newHorizontalValue, y: newVerticalValue };\n\n if (this.rafId === null) {\n this.rafId = requestAnimationFrame(() => {\n this.updateHostPosition();\n this.rafId = null;\n });\n }\n }\n }\n\n private handleButtonMouseUp = (): void => {\n if (this.isButtonDragging) {\n this.isButtonDragging = false;\n this.removeButtonEventListeners();\n }\n };\n\n private handleButtonTouchEnd = (): void => {\n if (this.isButtonDragging) {\n this.isButtonDragging = false;\n this.removeButtonEventListeners();\n }\n };\n\n private handleButtonClick = (): void => {\n // Only toggle visibility if the button wasn't dragged\n if (!this.buttonWasDragged) {\n this.toggleWindowVisibility();\n }\n // Reset the flag after handling the click\n this.buttonWasDragged = false;\n };\n\n private addButtonEventListeners(): void {\n if (this.buttonListenersAttached) {\n return;\n }\n\n document.addEventListener('mousemove', this.handleButtonMouseMove);\n document.addEventListener('mouseup', this.handleButtonMouseUp);\n document.addEventListener('touchmove', this.handleButtonTouchMove, { passive: false });\n document.addEventListener('touchend', this.handleButtonTouchEnd);\n this.buttonListenersAttached = true;\n }\n\n private removeButtonEventListeners(): void {\n if (!this.buttonListenersAttached) {\n return;\n }\n\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n\n document.removeEventListener('mousemove', this.handleButtonMouseMove);\n document.removeEventListener('mouseup', this.handleButtonMouseUp);\n document.removeEventListener('touchmove', this.handleButtonTouchMove);\n document.removeEventListener('touchend', this.handleButtonTouchEnd);\n this.buttonListenersAttached = false;\n }\n\n private isAutoPosition(value: string): boolean {\n const trimmed = value.trim();\n return trimmed === '' || trimmed === 'auto';\n }\n\n private parsePixelValue(value: string): number | null {\n const trimmed = value.trim();\n if (trimmed === '' || trimmed === 'auto') {\n return null;\n }\n\n if (trimmed.endsWith('px')) {\n const parsed = parseFloat(trimmed);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n const numeric = Number(trimmed);\n if (Number.isFinite(numeric)) {\n return numeric;\n }\n\n return null;\n }\n\n private getNumericPositionValue(value: string, fallback: number): number {\n const parsed = this.parsePixelValue(value);\n if (parsed !== null) {\n return parsed;\n }\n return fallback;\n }\n\n private getWelcomeMessages(): string[] {\n const translated = this.translationManager.getArray(\"content.welcomeMessages\");\n return translated && translated.length > 0\n ? translated\n : this.parsedWelcomeMessages;\n }\n\n private getStarterQuestions(): string[] {\n const translated = this.translationManager.getArray(\"content.starterQuestions\");\n return translated && translated.length > 0\n ? translated\n : this.parsedStarterQuestions;\n }\n\n private getButtonClasses(): string {\n const buttonText = this.translationManager.get('branding.buttonText', this.buttonText);\n const hasText = !!(buttonText && buttonText.trim());\n const baseClass = hasText ? 'chat-btn-text' : 'chat-btn-icon';\n const shapeClass = this.buttonShape === 'round' ? 'round' : '';\n return `${baseClass} ${shapeClass}`.trim();\n }\n\n private renderButton() {\n const buttonText = this.translationManager.get('branding.buttonText', this.buttonText);\n const hasText = !!(buttonText && buttonText.trim());\n const hasCustomIcon = this.iconUrl && this.iconUrl.trim();\n const buttonClasses = this.getButtonClasses();\n const finalButtonText = buttonText ?? '';\n const openLabel = this.translationManager.get('launcher.open') ?? '';\n const buttonAriaLabel = finalButtonText ? `${openLabel} - ${finalButtonText}` : openLabel;\n\n // Only show drag cursor if button is draggable\n const isDraggable = this.isButtonDraggable();\n const buttonStyle = isDraggable ? {\n cursor: this.isButtonDragging ? 'grabbing' : 'grab',\n } : {};\n\n if (hasText) {\n return (\n <button\n ref={(el) => this.buttonRef = el}\n class={buttonClasses}\n aria-label={buttonAriaLabel}\n title={finalButtonText || openLabel}\n style={buttonStyle}\n onClick={() => this.handleButtonClick()}\n onMouseDown={(e) => this.handleButtonMouseDown(e)}\n onTouchStart={(e) => this.handleButtonTouchStart(e)}\n aria-grabbed={this.isButtonDragging}\n aria-describedby={isDraggable ? \"chat-button-drag-hint\" : undefined}\n >\n {hasCustomIcon ? <img src={this.iconUrl} alt=\"\" /> : <OcsWidgetAvatar />}\n <span>{finalButtonText}</span>\n {isDraggable && (\n <span id=\"chat-button-drag-hint\" style={{ display: 'none' }}>\n Draggable. Use mouse or touch to reposition.\n </span>\n )}\n </button>\n );\n } else {\n return (\n <button\n ref={(el) => this.buttonRef = el}\n class={buttonClasses}\n aria-label={openLabel}\n title={openLabel}\n style={buttonStyle}\n onClick={() => this.handleButtonClick()}\n onMouseDown={(e) => this.handleButtonMouseDown(e)}\n onTouchStart={(e) => this.handleButtonTouchStart(e)}\n aria-grabbed={this.isButtonDragging}\n aria-describedby={isDraggable ? \"chat-button-drag-hint\" : undefined}\n >\n {hasCustomIcon ? <img src={this.iconUrl} alt=\"\" /> : <OcsWidgetAvatar />}\n {isDraggable && (\n <span id=\"chat-button-drag-hint\" style={{ display: 'none' }}>\n Draggable. Use mouse or touch to reposition.\n </span>\n )}\n </button>\n );\n }\n }\n\n private getStorageKeys() {\n return {\n sessionId: `ocs-chat-session-${this.chatbotId}`,\n messages: `ocs-chat-messages-${this.chatbotId}`,\n lastActivity: `ocs-chat-activity-${this.chatbotId}`\n };\n }\n\n private saveSessionToStorage(): void {\n if (!this.persistentSession) {\n return\n }\n const keys = this.getStorageKeys();\n try {\n if (this.sessionId) {\n localStorage.setItem(keys.sessionId, this.sessionId);\n localStorage.setItem(keys.lastActivity, new Date().toISOString());\n }\n localStorage.setItem(keys.messages, JSON.stringify(this.messages));\n } catch (error) {\n console.warn('Failed to save chat session to localStorage:', error);\n }\n }\n\n private loadSessionFromStorage(): SessionStorageData {\n const keys = this.getStorageKeys();\n try {\n if (this.persistentSessionExpire > 0) {\n const lastActivity = localStorage.getItem(keys.lastActivity);\n if (lastActivity) {\n const lastActivityDate = new Date(lastActivity);\n const minutesSinceActivity = (Date.now() - lastActivityDate.getTime()) / (1000 * 60);\n if (minutesSinceActivity > this.persistentSessionExpire) {\n this.clearSessionStorage();\n return {messages: []};\n }\n }\n }\n\n const storedSessionId = localStorage.getItem(keys.sessionId);\n const sessionId = storedSessionId ? storedSessionId : undefined;\n\n const messagesJson = localStorage.getItem(keys.messages);\n let messages: ChatMessage[] = [];\n\n if (messagesJson) {\n try {\n const parsedMessages = JSON.parse(messagesJson);\n messages = Array.isArray(parsedMessages) ? parsedMessages : [];\n } catch (parseError) {\n console.warn('Failed to parse messages from localStorage:', parseError);\n messages = [];\n }\n }\n\n return { sessionId, messages };\n } catch (error) {\n // fall back to starting a new session\n console.warn('Failed to load chat session from localStorage, starting new session:', error);\n return { messages: [] };\n }\n }\n\n private getOrGenerateUserId(): string {\n if (this.userId) {\n return this.userId;\n }\n\n if (this.generatedUserId) {\n return this.generatedUserId;\n }\n\n const storageKey = `ocs-user-id`;\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n this.generatedUserId = stored;\n return stored;\n }\n\n const array = new Uint8Array(9);\n window.crypto.getRandomValues(array);\n const randomString = Array.from(array, byte => byte.toString(36)).join('').substr(0, 9);\n const newUserId = `ocs:${Date.now()}_${randomString}`;\n this.generatedUserId = newUserId;\n localStorage.setItem(storageKey, newUserId);\n\n return newUserId;\n }\n\n private clearSessionStorage(): void {\n const keys = this.getStorageKeys();\n try {\n localStorage.removeItem(keys.sessionId);\n localStorage.removeItem(keys.messages);\n localStorage.removeItem(keys.lastActivity);\n } catch (error) {\n console.warn('Failed to clear chat session from localStorage:', error);\n }\n }\n\n private isLocalStorageAvailable(): boolean {\n try {\n localStorage.setItem(OcsChat.LOCALSTORAGE_TEST_KEY, 'test');\n localStorage.removeItem(OcsChat.LOCALSTORAGE_TEST_KEY);\n return true;\n } catch {\n return false;\n }\n }\n\n private showConfirmationDialog(): void {\n this.showNewChatConfirmation = true;\n }\n\n private hideConfirmationDialog(): void {\n this.showNewChatConfirmation = false;\n }\n\n private async confirmNewChat(): Promise<void> {\n this.hideConfirmationDialog();\n await this.actuallyStartNewChat();\n }\n\n private async actuallyStartNewChat(): Promise<void> {\n this.clearSessionStorage();\n this.sessionId = undefined;\n this.messages = [];\n this.isTyping = false;\n this.currentPollTaskId = '';\n if (this.allowAttachments) {\n this.selectedFiles = [];\n }\n this.cleanup();\n\n await this.startSession();\n }\n\n private toggleFullscreen(): void {\n this.isFullscreen = !this.isFullscreen;\n // Reset fullscreen position when toggling\n this.fullscreenPosition = { x: 0 };\n }\n\n render() {\n // Only show error state for critical errors that prevent the widget from functioning\n if (this.error && !this.sessionId) {\n return (\n <Host>\n <p class=\"error-message\">{this.error}</p>\n </Host>\n );\n }\n\n return (\n <Host>\n {this.renderButton()}\n {this.visible && (\n <div\n ref={(el) => this.chatWindowRef = el}\n id=\"ocs-chat-window\"\n class={this.getPositionClasses()}\n style={this.getPositionStyles()}\n >\n {/* Header */}\n <div\n class={`chat-header ${this.isDragging ? 'chat-header-dragging' : 'chat-header-draggable'}`}\n onMouseDown={this.handleMouseDown}\n onTouchStart={this.handleTouchStart}\n >\n {/* Drag indicator */}\n <div class=\"drag-indicator\">\n <div class=\"drag-dots header-button\">\n <GripDotsVerticalIcon/>\n </div>\n </div>\n <div class=\"header-text\">{this.translationManager.get('branding.headerText', this.headerText)}</div>\n <div class=\"header-buttons\">\n {/* New Chat button */}\n {this.messages.length > 0 && (\n <button\n class=\"header-button\"\n onClick={() => this.showConfirmationDialog()}\n title={this.translationManager.get('window.newChat')}\n aria-label={this.translationManager.get('window.newChat')}\n >\n <PlusWithCircleIcon/>\n </button>\n )}\n {/* Fullscreen toggle button */}\n {this.allowFullScreen && <button\n class=\"header-button fullscreen-button\"\n onClick={() => this.toggleFullscreen()}\n title={this.isFullscreen ? this.translationManager.get('window.exitFullscreen') : this.translationManager.get('window.fullscreen')}\n aria-label={this.isFullscreen ? this.translationManager.get('window.exitFullscreen') : this.translationManager.get('window.fullscreen')}\n >\n {this.isFullscreen ? <ArrowsPointingInIcon/> : <ArrowsPointingOutIcon/>}\n </button>}\n\n <button\n class=\"header-button\"\n onClick={() => this.visible = false}\n aria-label={this.translationManager.get('window.close')}\n >\n <XMarkIcon/>\n </button>\n </div>\n </div>\n\n {this.showNewChatConfirmation && (\n <div class=\"confirmation-overlay\">\n <div class=\"confirmation-dialog\">\n <div class=\"confirmation-content\">\n <h3 class=\"confirmation-title\">{this.translationManager.get('modal.newChatTitle')}</h3>\n <p class=\"confirmation-message\">\n {this.translationManager.get('modal.newChatBody', this.newChatConfirmationMessage)}\n </p>\n <div class=\"confirmation-buttons\">\n <button\n class=\"confirmation-button confirmation-button-cancel\"\n onClick={() => this.hideConfirmationDialog()}\n >\n {this.translationManager.get('modal.cancel')}\n </button>\n <button\n class=\"confirmation-button confirmation-button-confirm\"\n onClick={() => this.confirmNewChat()}\n >\n {this.translationManager.get('modal.confirm')}\n </button>\n </div>\n </div>\n </div>\n </div>\n )}\n\n {/* Chat Content */}\n <div class=\"chat-content\">\n {/* Loading State */}\n {this.isLoading && !this.sessionId && (\n <div class=\"loading-container\">\n <div class=\"loading-spinner\"></div>\n <span class=\"loading-text\">{this.translationManager.get('status.starting')}</span>\n </div>\n )}\n\n {/* Messages */}\n {(\n <div\n ref={(el) => this.messageListRef = el}\n class=\"messages-container\"\n >\n {this.messages.length === 0 && this.parsedWelcomeMessages.length > 0 && (\n <div class=\"welcome-messages\">\n {this.getWelcomeMessages().map((message, index) => (\n <div key={`welcome-${index}`} class=\"message-row message-row-assistant\">\n <div class=\"message-bubble message-bubble-assistant\">\n <div\n class=\"chat-markdown\"\n innerHTML={renderMarkdownComplete(message)}\n ></div>\n </div>\n </div>\n ))}\n </div>\n )}\n {/* Regular Chat Messages */}\n {this.messages.map((message, index) => (\n <div\n key={index}\n class={`message-row ${\n message.role === 'user' ? 'message-row-user' : 'message-row-assistant'\n }`}\n >\n <div\n class={`message-bubble ${\n message.role === 'user'\n ? 'message-bubble-user'\n : message.role === 'assistant'\n ? 'message-bubble-assistant'\n : 'message-bubble-system'\n }`}\n >\n <div\n class=\"chat-markdown\"\n innerHTML={renderMarkdownComplete(message.content)}\n ></div>\n {message.attachments && message.attachments.length > 0 && (\n <div class=\"message-attachments\">\n {message.attachments.map((attachment, attachmentIndex) => (\n <div key={attachmentIndex} class=\"flex items-center gap-[0.5em]\">\n <span class=\"message-attachment-icon\">\n <PaperClipIcon />\n </span>\n <span class=\"message-attachment-name\">{attachment.name}</span>\n </div>\n ))}\n </div>\n )}\n <div class=\"message-timestamp\">\n {this.formatTime(message.created_at)}\n </div>\n </div>\n </div>\n ))}\n {/* Typing Indicator */}\n {this.isTyping && (\n <div>\n <div class=\"typing-indicator\">\n <div class=\"typing-progress\"></div>\n </div>\n <div class=\"typing-text\">\n <span>{this.translationManager.get('status.typing', this.typingIndicatorText)}</span>\n <span class=\"typing-dots loading\"></span>\n </div>\n </div>\n )}\n </div>\n )}\n\n {/* Starter Questions */}\n {this.messages.length === 0 && this.parsedStarterQuestions.length > 0 && (\n <div class=\"starter-questions\">\n {this.getStarterQuestions().map((question, index) => (\n <div key={`starter-${index}`} class=\"starter-question-row\">\n <button\n class=\"starter-question\"\n onClick={() => this.handleStarterQuestionClick(question)}\n >\n {question}\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* Selected Files Display */}\n {this.allowAttachments && this.selectedFiles.length > 0 && (\n <div class=\"selected-files-container\">\n <div class=\"space-y-[0.25em]\">\n {this.selectedFiles.map((selectedFile, index) => (\n <div key={index} class=\"selected-file-item\">\n <div class=\"flex items-center gap-[0.5em]\">\n <span class=\"selected-file-icon\">\n <PaperClipIcon/>\n </span>\n <span>{selectedFile.file.name}</span>\n <span class=\"selected-file-size\">({this.formatFileSize(selectedFile.file.size)})</span>\n {selectedFile.error && (\n <span class=\"selected-file-error\">{selectedFile.error}</span>\n )}\n {selectedFile.uploaded && (\n <span class=\"selected-file-success-icon\"><CheckDocumentIcon /></span>\n )}\n </div>\n <button\n onClick={() => this.removeSelectedFile(index)}\n class=\"selected-file-remove-button\"\n aria-label={this.translationManager.get('attach.remove')}\n ><XIcon />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Input Area */}\n {this.sessionId && (\n <div class=\"input-area\">\n <div class=\"input-container\">\n <textarea\n ref={(el) => this.textareaRef = el}\n class=\"message-textarea\"\n rows={1}\n placeholder={this.translationManager.get('composer.placeholder')}\n value={this.messageInput}\n onInput={(e) => this.handleInputChange(e)}\n onKeyPress={(e) => this.handleKeyPress(e)}\n disabled={this.isTyping || this.isUploadingFiles}\n ></textarea>\n {/* File Upload Button */}\n {this.allowAttachments && (\n <input\n ref={(el) => {\n // Unclear why but after removing all attachments this is being set to `null`.\n if (el) {this.fileInputRef = el}\n }\n }\n id=\"ocs-file-input\"\n type=\"file\"\n multiple\n accept={OcsChat.SUPPORTED_FILE_EXTENSIONS.join(',')}\n onChange={(e) => this.handleFileSelect(e)}\n class=\"hidden\"\n />\n )}\n {this.allowAttachments && (\n <button\n class=\"file-attachment-button\"\n onClick={() => this.fileInputRef?.click()}\n disabled={this.isTyping || this.isUploadingFiles}\n title={this.translationManager.get('attach.add')}\n aria-label={this.translationManager.get('attach.add')}\n >\n <PaperClipIcon />\n </button>\n )}\n <button\n class={`send-button ${\n !this.isTyping && !!this.messageInput.trim()\n ? 'send-button-enabled'\n : 'send-button-disabled'\n }`}\n onClick={() => this.sendMessage(this.messageInput)}\n disabled={this.isTyping || this.isUploadingFiles || !this.messageInput.trim()}\n >\n {this.isUploadingFiles ? `${this.translationManager.get('status.uploading')}...` : this.translationManager.get('composer.send')}\n </button>\n </div>\n </div>\n )}\n <div class=\"flex items-center justify-center text-[0.8em] font-light w-full text-slate-500 py-[2px]\">\n <p>{this.translationManager.get('branding.poweredBy')}{' '} <a class=\"underline\" href=\"https://www.dimagi.com\" target=\"_blank\">Dimagi</a></p>\n </div>\n </div>\n </div>\n )}\n </Host>\n );\n }\n}\n"]}
@@ -0,0 +1,145 @@
1
+ import { getCSRFToken } from "../utils/cookies";
2
+ export class ChatSessionService {
3
+ constructor(options) {
4
+ var _a, _b, _c, _d;
5
+ this.apiBaseUrl = options.apiBaseUrl;
6
+ this.embedKey = options.embedKey;
7
+ this.widgetVersion = options.widgetVersion;
8
+ this.csrfTokenProvider = (_a = options.csrfTokenProvider) !== null && _a !== void 0 ? _a : getCSRFToken;
9
+ this.taskPollingIntervalMs = (_b = options.taskPollingIntervalMs) !== null && _b !== void 0 ? _b : 1000;
10
+ this.taskPollingMaxAttempts = (_c = options.taskPollingMaxAttempts) !== null && _c !== void 0 ? _c : 120;
11
+ this.messagePollingIntervalMs = (_d = options.messagePollingIntervalMs) !== null && _d !== void 0 ? _d : 30000;
12
+ }
13
+ async startSession(requestBody) {
14
+ const response = await fetch(`${this.apiBaseUrl}/api/chat/start/`, {
15
+ method: 'POST',
16
+ headers: this.getJsonHeaders(),
17
+ body: JSON.stringify(requestBody),
18
+ });
19
+ if (!response.ok) {
20
+ throw new Error(`Failed to start session: ${response.statusText}`);
21
+ }
22
+ return response.json();
23
+ }
24
+ async sendMessage(sessionId, payload) {
25
+ const response = await fetch(`${this.apiBaseUrl}/api/chat/${sessionId}/message/`, {
26
+ method: 'POST',
27
+ headers: this.getJsonHeaders(),
28
+ body: JSON.stringify(payload),
29
+ });
30
+ if (!response.ok) {
31
+ throw new Error(`Failed to send message: ${response.statusText}`);
32
+ }
33
+ return response.json();
34
+ }
35
+ async pollTaskOnce(sessionId, taskId) {
36
+ const response = await fetch(`${this.apiBaseUrl}/api/chat/${sessionId}/${taskId}/poll/`);
37
+ if (!response.ok) {
38
+ throw new Error(`Failed to poll task: ${response.statusText}`);
39
+ }
40
+ return response.json();
41
+ }
42
+ pollTask(sessionId, taskId, callbacks) {
43
+ let attempts = 0;
44
+ let cancelled = false;
45
+ let timeoutId;
46
+ const scheduleNextPoll = () => {
47
+ timeoutId = setTimeout(() => {
48
+ void poll();
49
+ }, this.taskPollingIntervalMs);
50
+ };
51
+ const poll = async () => {
52
+ if (cancelled) {
53
+ return;
54
+ }
55
+ try {
56
+ const data = await this.pollTaskOnce(sessionId, taskId);
57
+ if (data.error) {
58
+ throw new Error(data.error);
59
+ }
60
+ if (data.status === 'complete' && data.message) {
61
+ callbacks.onMessage(data.message);
62
+ return;
63
+ }
64
+ attempts += 1;
65
+ if (attempts >= this.taskPollingMaxAttempts) {
66
+ if (callbacks.onTimeout) {
67
+ callbacks.onTimeout();
68
+ }
69
+ return;
70
+ }
71
+ scheduleNextPoll();
72
+ }
73
+ catch (error) {
74
+ if (callbacks.onError) {
75
+ callbacks.onError(error instanceof Error ? error : new Error('Failed to get response'));
76
+ }
77
+ }
78
+ };
79
+ void poll();
80
+ return {
81
+ cancel: () => {
82
+ cancelled = true;
83
+ if (timeoutId) {
84
+ clearTimeout(timeoutId);
85
+ }
86
+ },
87
+ };
88
+ }
89
+ async fetchMessages(sessionId, since) {
90
+ const url = new URL(`${this.apiBaseUrl}/api/chat/${sessionId}/poll/`);
91
+ if (since) {
92
+ url.searchParams.set('since', since);
93
+ }
94
+ const response = await fetch(url.toString());
95
+ if (!response.ok) {
96
+ throw new Error(`Failed to poll messages: ${response.statusText}`);
97
+ }
98
+ return response.json();
99
+ }
100
+ startMessagePolling(sessionId, callbacks) {
101
+ const poll = async () => {
102
+ try {
103
+ const since = callbacks.getSince();
104
+ const data = await this.fetchMessages(sessionId, since);
105
+ if (data.messages.length > 0) {
106
+ callbacks.onMessages(data.messages);
107
+ }
108
+ }
109
+ catch (error) {
110
+ if (callbacks.onError) {
111
+ callbacks.onError(error instanceof Error ? error : new Error('Failed to poll messages'));
112
+ }
113
+ }
114
+ };
115
+ // perform an initial poll immediately
116
+ void poll();
117
+ this.messagePollingTimer = setInterval(() => {
118
+ void poll();
119
+ }, this.messagePollingIntervalMs);
120
+ return {
121
+ stop: () => this.stopMessagePolling(),
122
+ };
123
+ }
124
+ stopMessagePolling() {
125
+ if (this.messagePollingTimer) {
126
+ clearInterval(this.messagePollingTimer);
127
+ this.messagePollingTimer = undefined;
128
+ }
129
+ }
130
+ getJsonHeaders() {
131
+ const headers = {
132
+ 'Content-Type': 'application/json',
133
+ 'x-ocs-widget-version': this.widgetVersion,
134
+ };
135
+ const csrfToken = this.csrfTokenProvider(this.apiBaseUrl);
136
+ if (csrfToken) {
137
+ headers['X-CSRFToken'] = csrfToken;
138
+ }
139
+ if (this.embedKey) {
140
+ headers['X-Embed-Key'] = this.embedKey;
141
+ }
142
+ return headers;
143
+ }
144
+ }
145
+ //# sourceMappingURL=chat-session-service.js.map