open-chat-studio-widget 0.6.0 → 0.8.0

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 (45) hide show
  1. package/README.md +28 -25
  2. package/dist/cjs/{index-CcvroTR_.js → index-Cf6K60f1.js} +3 -3
  3. package/dist/cjs/{index-CcvroTR_.js.map → index-Cf6K60f1.js.map} +1 -1
  4. package/dist/cjs/loader.cjs.js +2 -2
  5. package/dist/cjs/open-chat-studio-widget.cjs.entry.js +480 -178
  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/icons.js +2 -2
  10. package/dist/collection/components/ocs-chat/icons.js.map +1 -1
  11. package/dist/collection/components/ocs-chat/ocs-chat.css +29 -34
  12. package/dist/collection/components/ocs-chat/ocs-chat.js +374 -102
  13. package/dist/collection/components/ocs-chat/ocs-chat.js.map +1 -1
  14. package/dist/collection/services/chat-session-service.js +39 -1
  15. package/dist/collection/services/chat-session-service.js.map +1 -1
  16. package/dist/collection/services/file-attachment-manager.js +4 -7
  17. package/dist/collection/services/file-attachment-manager.js.map +1 -1
  18. package/dist/collection/utils/cookies.js.map +1 -1
  19. package/dist/collection/utils/markdown.js +43 -17
  20. package/dist/collection/utils/markdown.js.map +1 -1
  21. package/dist/collection/utils/translations.js +1 -3
  22. package/dist/collection/utils/translations.js.map +1 -1
  23. package/dist/collection/utils/utils.js +2 -2
  24. package/dist/collection/utils/utils.js.map +1 -1
  25. package/dist/components/open-chat-studio-widget.js +487 -178
  26. package/dist/components/open-chat-studio-widget.js.map +1 -1
  27. package/dist/esm/{index-BKVXO_5E.js → index-DXf2dIht.js} +3 -3
  28. package/dist/esm/{index-BKVXO_5E.js.map → index-DXf2dIht.js.map} +1 -1
  29. package/dist/esm/loader.js +3 -3
  30. package/dist/esm/open-chat-studio-widget.entry.js +480 -178
  31. package/dist/esm/open-chat-studio-widget.entry.js.map +1 -1
  32. package/dist/esm/open-chat-studio-widget.js +3 -3
  33. package/dist/open-chat-studio-widget/open-chat-studio-widget.entry.esm.js.map +1 -1
  34. package/dist/open-chat-studio-widget/open-chat-studio-widget.esm.js +1 -1
  35. package/dist/open-chat-studio-widget/{p-BKVXO_5E.js → p-DXf2dIht.js} +2 -2
  36. package/dist/open-chat-studio-widget/{p-BKVXO_5E.js.map → p-DXf2dIht.js.map} +1 -1
  37. package/dist/open-chat-studio-widget/p-ff47dabf.entry.js +4 -0
  38. package/dist/open-chat-studio-widget/p-ff47dabf.entry.js.map +1 -0
  39. package/dist/types/components/ocs-chat/ocs-chat.d.ts +44 -2
  40. package/dist/types/components.d.ts +33 -4
  41. package/dist/types/services/chat-session-service.d.ts +7 -0
  42. package/dist/types/utils/markdown.d.ts +8 -0
  43. package/package.json +7 -2
  44. package/dist/open-chat-studio-widget/p-a0d04423.entry.js +0 -4
  45. package/dist/open-chat-studio-widget/p-a0d04423.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, 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',\n '.jpeg', '.png', '.gif', '.bmp', '.webp', '.svg', '.mp4', '.mov', '.avi', '.mp3', '.wav', '.html', '.htm', '.css',\n '.js', '.xml', '.md', '.ics', '.vcf', '.rtf', '.tsv', '.yaml', '.yml', '.py', '.c'];\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 /**\n * Optional context object to send with each message. This provides page-specific context to the bot.\n */\n @Prop({ mutable: true }) pageContext?: Record<string, any>;\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 private internalPageContext?: Record<string, any>;\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 this.loadInternalPageContext();\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 // Initialize button position from computed styles\n this.initializeButtonPosition();\n\n // Defer position initialization to avoid state changes during componentDidLoad\n setTimeout(() => {\n if (this.visible) {\n this.initializePosition();\n }\n\n // Resume polling for existing session (don't auto-start new sessions)\n if (this.visible && this.sessionId) {\n this.startMessagePolling();\n }\n }, 0);\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 loadInternalPageContext() {\n if (this.pageContext === undefined || this.pageContext === null) {\n return;\n }\n\n if (typeof this.pageContext !== 'object' || Array.isArray(this.pageContext)) {\n console.error(\"pageContext is expected to be a plain JavaScript object.\");\n return;\n }\n\n this.internalPageContext = this.pageContext;\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 this.startMessagePolling();\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 (!message.trim()) return;\n\n // Start session if we don't have one yet\n if (!this.sessionId) {\n // Prevent concurrent session initialization\n if (this.isLoading) {\n return;\n }\n await this.startSession();\n // Check if session started successfully\n if (!this.sessionId) {\n return; // startSession already handled the error\n }\n }\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 const welcomeMessagesToAdd = this.getWelcomeMessages();\n if (this.messages.length === 0 && welcomeMessagesToAdd.length > 0) {\n const now = new Date();\n const welcomeMessages: ChatMessage[] = welcomeMessagesToAdd.map((welcomeMsg, index) => ({\n created_at: new Date(now.getTime() - (welcomeMessagesToAdd.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 if (this.internalPageContext) {\n requestBody.context = this.internalPageContext;\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.internalPageContext = undefined;\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 `pageContext` prop and sync to internal variable.\n *\n * @param pageContext - The new value for the field.\n */\n @Watch('pageContext')\n pageContextHandler() {\n this.loadInternalPageContext()\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 // Resume polling for existing session (don't auto-start new sessions)\n if (this.sessionId) {\n this.scrollToBottom(true);\n this.startMessagePolling();\n }\n } else {\n this.stopMessagePolling();\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.clearSession();\n }\n\n /**\n * This clears out all data related to the previous session. A new session\n * will start when the user sends a message.\n */\n private async clearSession(): 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\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.getWelcomeMessages().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.getStarterQuestions().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 <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 || this.isLoading}\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(',') + ',text/*'}\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 || this.isLoading}\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.isLoading && !!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.isLoading || !this.messageInput.trim()}\n >\n {this.isUploadingFiles ? `${this.translationManager.get('status.uploading')}...` : this.translationManager.get('composer.send')}\n </button>\n </div>\n </div>\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"]}
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,\n PlusWithCircleIcon,\n ArrowsPointingOutIcon,\n ArrowsPointingInIcon,\n PaperClipIcon,\n CheckDocumentIcon,\n XIcon,\n OcsWidgetAvatar,\n} from './icons';\nimport { renderMarkdownSync as renderMarkdownComplete } from '../../utils/markdown';\nimport { varToPixels } from '../../utils/utils';\nimport { TranslationStrings, TranslationManager, defaultTranslations } from '../../utils/translations';\nimport { ChatSessionService, ChatMessage, MessagePollingHandle, TaskPollingHandle } from '../../services/chat-session-service';\nimport { FileAttachmentManager, SelectedFile } 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 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 = [\n '.txt',\n '.pdf',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.csv',\n '.jpg',\n '.jpeg',\n '.png',\n '.gif',\n '.bmp',\n '.webp',\n '.svg',\n '.mp4',\n '.mov',\n '.avi',\n '.mp3',\n '.wav',\n '.html',\n '.htm',\n '.css',\n '.js',\n '.xml',\n '.md',\n '.ics',\n '.vcf',\n '.rtf',\n '.tsv',\n '.yaml',\n '.yml',\n '.py',\n '.c',\n ];\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 * Whether to show the launcher button. Set to false to hide the button\n * and open the chat window programmatically via the `visible` property.\n */\n @Prop() showButton: boolean = true;\n\n /**\n * The operating mode of the widget.\n * - 'standard': Default floating window with launcher button.\n * - 'kiosk': Fills parent container, always visible, no header or launcher button.\n * The parent element must establish a containing block (e.g. `position: relative`).\n */\n @Prop() mode: 'standard' | 'kiosk' = 'standard';\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 * Ignored when `sessionId` is provided.\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 /**\n * Optional context object to send with each message. This provides page-specific context to the bot.\n */\n @Prop({ mutable: true }) pageContext?: Record<string, any>;\n\n /**\n * @internal\n * Optional version number of the chatbot to use. Requires authentication.\n * This is for internal use only and is not intended for public-facing widgets.\n */\n @Prop() versionNumber?: number;\n\n /**\n * The ID of an existing chat session to connect to. When provided, the widget\n * is bound to that session: local session persistence is disabled and the\n * message history is loaded from the server. Intended for host pages that\n * create the session server-side (e.g. the OCS web chat page).\n */\n @Prop() sessionId?: string;\n\n @State() error: string = '';\n @State() messages: ChatMessage[] = [];\n @State() activeSessionId?: string;\n @State() isLoading: boolean = false;\n @State() isTyping: boolean = false;\n @State() typingProgressMessage: string = '';\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 private internalPageContext?: Record<string, any>;\n private sessionEpoch: number = 0;\n @Element() host: HTMLElement;\n\n async componentWillLoad() {\n if (!this.chatbotId) {\n this.error = 'Chatbot ID is required';\n return;\n }\n\n if (this.isKioskMode()) {\n this.visible = true;\n }\n\n await this.initializeTranslations();\n\n if (this.isSessionBound()) {\n // Bound to an externally-managed session: the host page is the source of truth.\n this.activeSessionId = this.sessionId;\n } else if (this.persistentSession && this.isLocalStorageAvailable()) {\n // Always try to load existing session if localStorage is available\n const { sessionId, messages } = this.loadSessionFromStorage();\n if (sessionId && messages) {\n this.activeSessionId = sessionId;\n this.messages = messages;\n }\n }\n this.parseWelcomeMessages();\n this.parseStarterQuestions();\n this.loadInternalPageContext();\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 // Initialize button position from computed styles\n if (this.showButton && !this.isKioskMode()) {\n this.initializeButtonPosition();\n }\n\n // Defer state changes to avoid triggering them during componentDidLoad\n setTimeout(() => {\n // Restore visible state after dimensions are read so initializePosition\n // uses the correct CSS-derived chatWindowWidth/chatWindowHeight.\n if (!this.isKioskMode() && this.showButton && this.persistentSession && this.isLocalStorageAvailable()) {\n this.restoreVisibleState();\n }\n\n if (this.visible) {\n if (!this.isKioskMode()) {\n this.initializePosition();\n }\n }\n\n // Resume polling for existing session (don't auto-start new sessions)\n if (this.visible && this.activeSessionId) {\n if (this.isSessionBound()) {\n void this.loadBoundSessionHistory();\n } else {\n this.startMessagePolling();\n }\n }\n }, 0);\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 loadInternalPageContext() {\n if (this.pageContext === undefined || this.pageContext === null) {\n return;\n }\n\n if (typeof this.pageContext !== 'object' || Array.isArray(this.pageContext)) {\n console.error('pageContext is expected to be a plain JavaScript object.');\n return;\n }\n\n this.internalPageContext = this.pageContext;\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 const epoch = this.sessionEpoch;\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 if (this.versionNumber != null) {\n requestBody.version_number = this.versionNumber;\n }\n\n const data = await this.getChatService().startSession(requestBody);\n if (epoch !== this.sessionEpoch) return;\n this.activeSessionId = data.session_id;\n this.saveSessionToStorage();\n\n this.startMessagePolling();\n } catch (_error) {\n if (epoch !== this.sessionEpoch) return;\n this.handleError('Failed to start chat session');\n } finally {\n this.isLoading = false;\n }\n }\n\n /**\n * Load the full message history for a session provided via the `session-id`\n * prop, then begin regular polling.\n */\n private async loadBoundSessionHistory(): Promise<void> {\n const epoch = this.sessionEpoch;\n try {\n const history = await this.getChatService().fetchAllMessages(this.activeSessionId);\n if (epoch !== this.sessionEpoch) return;\n // Keep messages added while the history was loading (e.g. an optimistic\n // user message) by appending any that aren't part of the fetched history.\n const known = new Set(history.map(m => `${m.created_at}|${m.role}|${m.content}`));\n const pending = this.messages.filter(m => !known.has(`${m.created_at}|${m.role}|${m.content}`));\n this.messages = [...history, ...pending];\n this.scrollToBottom(true);\n } catch (error) {\n if (epoch !== this.sessionEpoch) return;\n console.warn('Failed to load chat history:', error);\n }\n this.startMessagePolling();\n }\n\n private async uploadFiles(): Promise<number[]> {\n if (this.selectedFiles.length === 0 || !this.activeSessionId || !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.activeSessionId,\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 (!message.trim()) return;\n const epoch = this.sessionEpoch;\n\n // Start session if we don't have one yet\n if (!this.activeSessionId) {\n // Prevent concurrent session initialization\n if (this.isLoading) {\n return;\n }\n await this.startSession();\n // Check if session started successfully\n if (!this.activeSessionId) {\n return; // startSession already handled the error\n }\n }\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 const welcomeMessagesToAdd = this.getWelcomeMessages();\n if (this.messages.length === 0 && welcomeMessagesToAdd.length > 0) {\n const now = new Date();\n const welcomeMessages: ChatMessage[] = welcomeMessagesToAdd.map((welcomeMsg, index) => ({\n created_at: new Date(now.getTime() - (welcomeMessagesToAdd.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\n ? 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 };\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 if (this.internalPageContext) {\n requestBody.context = this.internalPageContext;\n }\n if (this.versionNumber != null) {\n requestBody.version_number = this.versionNumber;\n }\n\n const data = await this.getChatService().sendMessage(this.activeSessionId, requestBody);\n if (epoch !== this.sessionEpoch) return;\n\n if (data.status === 'error') {\n throw new Error(data.error || 'Failed to send message');\n }\n\n this.internalPageContext = undefined;\n this.startTaskPolling(data.task_id);\n } catch (error) {\n if (epoch !== this.sessionEpoch) return;\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 `pageContext` prop and sync to internal variable.\n *\n * @param pageContext - The new value for the field.\n */\n @Watch('pageContext')\n pageContextHandler() {\n this.loadInternalPageContext();\n }\n\n @Watch('chatbotId')\n @Watch('versionNumber')\n async chatbotConfigHandler() {\n await this.clearSession();\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 // Kiosk mode is always visible\n if (this.isKioskMode() && !visible) {\n this.visible = true;\n return;\n }\n\n this.saveVisibleState(visible);\n\n if (this.isButtonDragging) {\n this.isButtonDragging = false;\n this.buttonWasDragged = false;\n this.removeButtonEventListeners();\n }\n\n if (visible) {\n if (!this.isKioskMode()) {\n this.initializePosition();\n }\n\n // Resume polling for existing session (don't auto-start new sessions)\n if (this.activeSessionId) {\n this.scrollToBottom(true);\n if (this.isSessionBound() && this.messages.length === 0) {\n // A bound widget that was hidden at load has not fetched its history yet.\n void this.loadBoundSessionHistory();\n } else {\n this.startMessagePolling();\n }\n }\n } else {\n this.stopMessagePolling();\n }\n }\n\n private startTaskPolling(taskId: string): void {\n if (!this.activeSessionId) 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.activeSessionId, taskId, {\n onMessage: message => {\n this.messages = [...this.messages, message];\n this.saveSessionToStorage();\n this.scrollToBottom();\n this.isTyping = false;\n this.typingProgressMessage = '';\n this.currentPollTaskId = '';\n this.taskPollingHandle = undefined;\n this.startMessagePolling();\n this.focusInput();\n },\n onProgress: message => {\n this.typingProgressMessage = message;\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.typingProgressMessage = '';\n this.currentPollTaskId = '';\n this.taskPollingHandle = undefined;\n this.startMessagePolling();\n this.focusInput();\n },\n onError: error => {\n this.typingProgressMessage = '';\n this.handleError(error.message);\n this.taskPollingHandle = undefined;\n this.startMessagePolling();\n },\n });\n }\n\n private startMessagePolling(): void {\n if (!this.activeSessionId || this.currentPollTaskId || !this.visible) {\n return;\n }\n\n if (this.messagePollingHandle) {\n return;\n }\n\n this.messagePollingHandle = this.getChatService().startMessagePolling(this.activeSessionId, {\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.isKioskMode()) {\n return 'chat-window-kiosk';\n }\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.isKioskMode()) {\n return {};\n }\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 if (this.isKioskMode()) return;\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' ? constrainedLeft : Math.max(minPadding, windowWidth - (constrainedLeft + buttonWidth));\n const newVerticalValue = this.buttonVerticalSide === 'top' ? constrainedTop : 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 ? translated : this.parsedWelcomeMessages;\n }\n\n private getStarterQuestions(): string[] {\n const translated = this.translationManager.getArray('content.starterQuestions');\n return translated && translated.length > 0 ? translated : 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 if (!this.showButton || this.isKioskMode()) {\n return null;\n }\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 ? {\n cursor: this.isButtonDragging ? 'grabbing' : 'grab',\n }\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 visible: `ocs-chat-visible-${this.chatbotId}`,\n };\n }\n\n private saveSessionToStorage(): void {\n if (!this.persistentSession || this.isSessionBound()) {\n return;\n }\n const keys = this.getStorageKeys();\n try {\n if (this.activeSessionId) {\n localStorage.setItem(keys.sessionId, this.activeSessionId);\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 let stored: string | null = null;\n try {\n stored = localStorage.getItem(storageKey);\n } catch {\n // localStorage blocked; fall through to in-memory id generation\n }\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))\n .join('')\n .substr(0, 9);\n const newUserId = `ocs:${Date.now()}_${randomString}`;\n this.generatedUserId = newUserId;\n try {\n localStorage.setItem(storageKey, newUserId);\n } catch {\n // localStorage blocked; the generated id lives in component state for this page\n }\n\n return newUserId;\n }\n\n private saveVisibleState(visible: boolean): void {\n if (!this.persistentSession) return;\n try {\n const keys = this.getStorageKeys();\n localStorage.setItem(keys.visible, visible ? '1' : '0');\n } catch {\n // ignore\n }\n }\n\n private restoreVisibleState(): void {\n try {\n const keys = this.getStorageKeys();\n const stored = localStorage.getItem(keys.visible);\n if (stored === '1') {\n this.visible = true;\n }\n } catch {\n // ignore\n }\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 localStorage.removeItem(keys.visible);\n } catch (error) {\n console.warn('Failed to clear chat session from localStorage:', error);\n }\n }\n\n private isKioskMode(): boolean {\n return this.mode === 'kiosk';\n }\n\n private isSessionBound(): boolean {\n return !!this.sessionId;\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.clearSession();\n }\n\n /**\n * This clears out all data related to the previous session. A new session\n * will start when the user sends a message.\n */\n private async clearSession(): Promise<void> {\n this.sessionEpoch += 1;\n this.clearSessionStorage();\n // A session provided by the host page (session-id prop) cannot be cleared;\n // stay bound to it. Unbound widgets start a new session on the next message.\n this.activeSessionId = this.sessionId;\n this.messages = [];\n this.isTyping = false;\n this.currentPollTaskId = '';\n if (this.allowAttachments) {\n this.selectedFiles = [];\n }\n this.cleanup();\n if (this.isSessionBound()) {\n // The host-owned session cannot be cleared: reload its history and\n // resume polling so the widget doesn't end up in a dead state.\n void this.loadBoundSessionHistory();\n }\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.activeSessionId) {\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 ref={el => (this.chatWindowRef = el)} id=\"ocs-chat-window\" class={this.getPositionClasses()} style={this.getPositionStyles()}>\n {/* Header — hidden in kiosk mode */}\n {!this.isKioskMode() && (\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 — hidden for bound sessions (the host page owns the session lifecycle) */}\n {this.messages.length > 0 && !this.isSessionBound() && (\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 && (\n <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\n <button class=\"header-button\" onClick={() => (this.visible = false)} aria-label={this.translationManager.get('window.close')}>\n <XMarkIcon />\n </button>\n </div>\n </div>\n )}\n\n {!this.isKioskMode() && 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\">{this.translationManager.get('modal.newChatBody', this.newChatConfirmationMessage)}</p>\n <div class=\"confirmation-buttons\">\n <button class=\"confirmation-button confirmation-button-cancel\" onClick={() => this.hideConfirmationDialog()}>\n {this.translationManager.get('modal.cancel')}\n </button>\n <button class=\"confirmation-button confirmation-button-confirm\" onClick={() => this.confirmNewChat()}>\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.activeSessionId && (\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 ref={el => (this.messageListRef = el)} class=\"messages-container\">\n {this.messages.length === 0 && this.getWelcomeMessages().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 class=\"chat-markdown\" innerHTML={renderMarkdownComplete(message)}></div>\n </div>\n </div>\n ))}\n </div>\n )}\n {/* Regular Chat Messages */}\n {this.messages.map((message, index) => (\n <div key={index} class={`message-row ${message.role === 'user' ? 'message-row-user' : 'message-row-assistant'}`}>\n <div\n class={`message-bubble ${\n message.role === 'user' ? 'message-bubble-user' : message.role === 'assistant' ? 'message-bubble-assistant' : 'message-bubble-system'\n }`}\n >\n <div class=\"chat-markdown\" innerHTML={renderMarkdownComplete(message.content)}></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\">{this.formatTime(message.created_at)}</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.typingProgressMessage || 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.getStarterQuestions().length > 0 && (\n <div class=\"starter-questions\">\n {this.getStarterQuestions().map((question, index) => (\n <div key={`starter-${index}`} class=\"starter-question-row\">\n <button class=\"starter-question\" onClick={() => this.handleStarterQuestionClick(question)}>\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 && <span class=\"selected-file-error\">{selectedFile.error}</span>}\n {selectedFile.uploaded && (\n <span class=\"selected-file-success-icon\">\n <CheckDocumentIcon />\n </span>\n )}\n </div>\n <button onClick={() => this.removeSelectedFile(index)} class=\"selected-file-remove-button\" aria-label={this.translationManager.get('attach.remove')}>\n <XIcon />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Input Area */}\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 || this.isLoading}\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) {\n this.fileInputRef = el;\n }\n }}\n id=\"ocs-file-input\"\n type=\"file\"\n multiple\n accept={OcsChat.SUPPORTED_FILE_EXTENSIONS.join(',') + ',text/*'}\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 || this.isLoading}\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 ${!this.isTyping && !this.isLoading && !!this.messageInput.trim() ? 'send-button-enabled' : 'send-button-disabled'}`}\n onClick={() => this.sendMessage(this.messageInput)}\n disabled={this.isTyping || this.isUploadingFiles || this.isLoading || !this.messageInput.trim()}\n >\n {this.isUploadingFiles ? `${this.translationManager.get('status.uploading')}...` : this.translationManager.get('composer.send')}\n </button>\n </div>\n </div>\n <div class=\"flex items-center justify-center text-[0.8em] font-light w-full text-slate-500 py-[2px]\">\n <p>\n {this.translationManager.get('branding.poweredBy')}{' '}\n <a class=\"underline\" href=\"https://www.dimagi.com\" target=\"_blank\" rel=\"noopener noreferrer\">\n Dimagi\n </a>\n </p>\n </div>\n </div>\n </div>\n )}\n </Host>\n );\n }\n}\n"]}