@rag-widget/chat-widget 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/hooks/useChatWidget.ts","../src/components/ChatBubble.tsx","../src/components/ChatWindow.tsx","../src/components/ChatWidget.tsx","../src/providers/ChatWidgetProvider.tsx"],"sourcesContent":["import { useState, useCallback, useRef, useEffect } from 'react';\r\nimport type { Message, WidgetConfig, ChatSession, ApiResponse } from '../types';\r\n\r\ninterface UseChatWidgetOptions {\r\n apiKey: string;\r\n widgetId: string;\r\n apiBaseUrl: string;\r\n onError?: (error: Error) => void;\r\n onMessageSent?: (message: string) => void;\r\n onMessageReceived?: (message: Message) => void;\r\n}\r\n\r\ninterface UseChatWidgetReturn {\r\n messages: Message[];\r\n isLoading: boolean;\r\n isConnected: boolean;\r\n config: WidgetConfig | null;\r\n error: Error | null;\r\n sendMessage: (content: string) => Promise<void>;\r\n clearMessages: () => void;\r\n retry: () => void;\r\n}\r\n\r\nexport function useChatWidget(options: UseChatWidgetOptions): UseChatWidgetReturn {\r\n const { apiKey, widgetId, apiBaseUrl, onError, onMessageSent, onMessageReceived } = options;\r\n\r\n const [messages, setMessages] = useState<Message[]>([]);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [isConnected, setIsConnected] = useState(false);\r\n const [config, setConfig] = useState<WidgetConfig | null>(null);\r\n const [error, setError] = useState<Error | null>(null);\r\n const [session, setSession] = useState<ChatSession | null>(null);\r\n\r\n const abortControllerRef = useRef<AbortController | null>(null);\r\n\r\n // Fetch widget configuration on mount\r\n useEffect(() => {\r\n fetchConfig();\r\n return () => {\r\n if (abortControllerRef.current) {\r\n abortControllerRef.current.abort();\r\n }\r\n };\r\n }, [apiKey, widgetId]);\r\n\r\n const fetchConfig = useCallback(async () => {\r\n try {\r\n const response = await fetch(`${apiBaseUrl}/api/v1/widget/${widgetId}/config`, {\r\n headers: {\r\n 'X-API-Key': apiKey\r\n }\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch config: ${response.status}`);\r\n }\r\n\r\n const result: ApiResponse<WidgetConfig> = await response.json();\r\n\r\n if (result.status === 'success' && result.data) {\r\n setConfig(result.data);\r\n setIsConnected(true);\r\n setError(null);\r\n } else {\r\n throw new Error(result.message || 'Failed to load widget configuration');\r\n }\r\n } catch (err) {\r\n const error = err instanceof Error ? err : new Error('Unknown error');\r\n setError(error);\r\n setIsConnected(false);\r\n onError?.(error);\r\n }\r\n }, [apiKey, widgetId, apiBaseUrl, onError]);\r\n\r\n const createSession = useCallback(async (): Promise<ChatSession> => {\r\n const response = await fetch(`${apiBaseUrl}/api/v1/widget/${widgetId}/sessions`, {\r\n method: 'POST',\r\n headers: {\r\n 'X-API-Key': apiKey,\r\n 'Content-Type': 'application/json'\r\n }\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to create session: ${response.status}`);\r\n }\r\n\r\n const result: ApiResponse<ChatSession> = await response.json();\r\n\r\n if (result.status === 'success' && result.data) {\r\n return result.data;\r\n }\r\n\r\n throw new Error(result.message || 'Failed to create session');\r\n }, [apiKey, widgetId, apiBaseUrl]);\r\n\r\n const sendMessage = useCallback(async (content: string) => {\r\n if (!content.trim() || isLoading) return;\r\n\r\n // Cancel any ongoing request\r\n if (abortControllerRef.current) {\r\n abortControllerRef.current.abort();\r\n }\r\n abortControllerRef.current = new AbortController();\r\n\r\n const userMessage: Message = {\r\n id: `msg-${Date.now()}`,\r\n role: 'user',\r\n content: content.trim(),\r\n timestamp: new Date()\r\n };\r\n\r\n setMessages(prev => [...prev, userMessage]);\r\n setIsLoading(true);\r\n setError(null);\r\n onMessageSent?.(content);\r\n\r\n try {\r\n // Ensure we have a session\r\n let currentSession = session;\r\n if (!currentSession || new Date() > new Date(currentSession.expiresAt)) {\r\n currentSession = await createSession();\r\n setSession(currentSession);\r\n }\r\n\r\n // Create placeholder for assistant message\r\n const assistantMessageId = `msg-${Date.now()}-assistant`;\r\n const assistantMessage: Message = {\r\n id: assistantMessageId,\r\n role: 'assistant',\r\n content: '',\r\n timestamp: new Date(),\r\n isStreaming: true\r\n };\r\n setMessages(prev => [...prev, assistantMessage]);\r\n\r\n // Send message with SSE streaming\r\n const response = await fetch(\r\n `${apiBaseUrl}/api/v1/widget/${widgetId}/sessions/${currentSession.sessionId}/messages`,\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'X-API-Key': apiKey,\r\n 'Content-Type': 'application/json',\r\n 'Accept': 'text/event-stream'\r\n },\r\n body: JSON.stringify({ message: content }),\r\n signal: abortControllerRef.current.signal\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to send message: ${response.status}`);\r\n }\r\n\r\n const reader = response.body?.getReader();\r\n const decoder = new TextDecoder();\r\n let fullContent = '';\r\n\r\n if (reader) {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n\r\n const chunk = decoder.decode(value, { stream: true });\r\n const lines = chunk.split('\\n');\r\n\r\n for (const line of lines) {\r\n if (line.startsWith('data: ')) {\r\n try {\r\n const data = JSON.parse(line.slice(6));\r\n\r\n if (data.type === 'chunk') {\r\n fullContent += data.content;\r\n setMessages(prev =>\r\n prev.map(msg =>\r\n msg.id === assistantMessageId\r\n ? { ...msg, content: fullContent }\r\n : msg\r\n )\r\n );\r\n } else if (data.type === 'done') {\r\n setMessages(prev =>\r\n prev.map(msg =>\r\n msg.id === assistantMessageId\r\n ? { ...msg, isStreaming: false, sources: data.sources }\r\n : msg\r\n )\r\n );\r\n\r\n const finalMessage: Message = {\r\n id: assistantMessageId,\r\n role: 'assistant',\r\n content: fullContent,\r\n timestamp: new Date(),\r\n sources: data.sources\r\n };\r\n onMessageReceived?.(finalMessage);\r\n }\r\n } catch {\r\n // Ignore parse errors for partial SSE data\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } catch (err) {\r\n if ((err as Error).name === 'AbortError') {\r\n // Request was cancelled, ignore\r\n return;\r\n }\r\n\r\n const error = err instanceof Error ? err : new Error('Failed to send message');\r\n setError(error);\r\n onError?.(error);\r\n\r\n // Remove the incomplete assistant message\r\n setMessages(prev => prev.filter(msg => !msg.isStreaming));\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }, [apiKey, widgetId, apiBaseUrl, session, isLoading, createSession, onError, onMessageSent, onMessageReceived]);\r\n\r\n const clearMessages = useCallback(() => {\r\n setMessages([]);\r\n setSession(null);\r\n }, []);\r\n\r\n const retry = useCallback(() => {\r\n setError(null);\r\n fetchConfig();\r\n }, [fetchConfig]);\r\n\r\n return {\r\n messages,\r\n isLoading,\r\n isConnected,\r\n config,\r\n error,\r\n sendMessage,\r\n clearMessages,\r\n retry\r\n };\r\n}\r\n","import React from 'react';\r\nimport type { ChatBubbleProps } from '../types';\r\n\r\nconst ChatIcon: React.FC = () => (\r\n <svg\r\n className=\"rag-chat-bubble-icon\"\r\n viewBox=\"0 0 24 24\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H5.17L4 17.17V4h16v12z\" />\r\n <path d=\"M7 9h10v2H7zm0-3h10v2H7z\" />\r\n </svg>\r\n);\r\n\r\nconst CloseIcon: React.FC = () => (\r\n <svg\r\n className=\"rag-chat-bubble-icon\"\r\n viewBox=\"0 0 24 24\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\r\n </svg>\r\n);\r\n\r\nexport const ChatBubble: React.FC<ChatBubbleProps> = ({\r\n isOpen,\r\n onClick,\r\n primaryColor = '#007bff',\r\n position = 'bottom-right',\r\n unreadCount = 0\r\n}) => {\r\n return (\r\n <button\r\n className={`rag-chat-bubble ${position}`}\r\n onClick={onClick}\r\n style={{ backgroundColor: primaryColor }}\r\n aria-label={isOpen ? 'Close chat' : 'Open chat'}\r\n type=\"button\"\r\n >\r\n {isOpen ? <CloseIcon /> : <ChatIcon />}\r\n {!isOpen && unreadCount > 0 && (\r\n <span className=\"rag-chat-bubble-badge\">\r\n {unreadCount > 9 ? '9+' : unreadCount}\r\n </span>\r\n )}\r\n </button>\r\n );\r\n};\r\n\r\nexport default ChatBubble;\r\n","import React, { useState, useRef, useEffect } from 'react';\r\nimport type { ChatWindowProps, Message } from '../types';\r\n\r\nconst CloseIcon: React.FC = () => (\r\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\r\n />\r\n </svg>\r\n);\r\n\r\nconst SendIcon: React.FC = () => (\r\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" />\r\n </svg>\r\n);\r\n\r\nconst LoadingDots: React.FC = () => (\r\n <div className=\"rag-chat-loading\">\r\n <div className=\"rag-chat-loading-dot\" />\r\n <div className=\"rag-chat-loading-dot\" />\r\n <div className=\"rag-chat-loading-dot\" />\r\n </div>\r\n);\r\n\r\ninterface MessageBubbleProps {\r\n message: Message;\r\n}\r\n\r\nconst MessageBubble: React.FC<MessageBubbleProps> = ({ message }) => (\r\n <div className={`rag-chat-message ${message.role}`}>\r\n {message.isStreaming && !message.content ? (\r\n <LoadingDots />\r\n ) : (\r\n <p className=\"rag-chat-message-content\">{message.content}</p>\r\n )}\r\n {message.sources && message.sources.length > 0 && (\r\n <div className=\"rag-chat-message-sources\">\r\n <div className=\"rag-chat-message-sources-title\">Sources:</div>\r\n {message.sources.map((source, index) => (\r\n <div key={index} className=\"rag-chat-message-source\">\r\n {source.title}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n);\r\n\r\nexport const ChatWindow: React.FC<ChatWindowProps> = ({\r\n isOpen,\r\n onClose,\r\n config,\r\n messages,\r\n isLoading,\r\n onSendMessage\r\n}) => {\r\n const [inputValue, setInputValue] = useState('');\r\n const messagesEndRef = useRef<HTMLDivElement>(null);\r\n const inputRef = useRef<HTMLTextAreaElement>(null);\r\n\r\n // Scroll to bottom when new messages arrive\r\n useEffect(() => {\r\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\r\n }, [messages]);\r\n\r\n // Focus input when window opens\r\n useEffect(() => {\r\n if (isOpen) {\r\n inputRef.current?.focus();\r\n }\r\n }, [isOpen]);\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (inputValue.trim() && !isLoading) {\r\n onSendMessage(inputValue.trim());\r\n setInputValue('');\r\n }\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\r\n if (e.key === 'Enter' && !e.shiftKey) {\r\n e.preventDefault();\r\n handleSubmit(e);\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n const position = config?.position || 'bottom-right';\r\n const primaryColor = config?.primaryColor || '#007bff';\r\n\r\n return (\r\n <div\r\n className={`rag-chat-window ${position}`}\r\n style={{ '--rag-primary-color': primaryColor } as React.CSSProperties}\r\n >\r\n <div className=\"rag-chat-header\" style={{ backgroundColor: primaryColor }}>\r\n <h3 className=\"rag-chat-header-title\">{config?.name || 'Chat'}</h3>\r\n <button\r\n className=\"rag-chat-header-close\"\r\n onClick={onClose}\r\n aria-label=\"Close chat\"\r\n type=\"button\"\r\n >\r\n <CloseIcon />\r\n </button>\r\n </div>\r\n\r\n <div className=\"rag-chat-messages\">\r\n {messages.length === 0 && (config?.uspText || config?.greeting) && (\r\n <div className=\"rag-chat-greeting\">\r\n {config?.uspText && (\r\n <p className=\"rag-chat-usp-text\">{config.uspText}</p>\r\n )}\r\n {config?.greeting && (\r\n <p className=\"rag-chat-greeting-text\">{config.greeting}</p>\r\n )}\r\n </div>\r\n )}\r\n\r\n {messages.map(message => (\r\n <MessageBubble key={message.id} message={message} />\r\n ))}\r\n\r\n <div ref={messagesEndRef} />\r\n </div>\r\n\r\n <form className=\"rag-chat-input-container\" onSubmit={handleSubmit}>\r\n <textarea\r\n ref={inputRef}\r\n className=\"rag-chat-input\"\r\n value={inputValue}\r\n onChange={e => setInputValue(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n placeholder={config?.placeholder || 'Type a message...'}\r\n rows={1}\r\n maxLength={config?.allowedMessageLength || 2000}\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"submit\"\r\n className=\"rag-chat-send-button\"\r\n disabled={!inputValue.trim() || isLoading}\r\n style={{ backgroundColor: primaryColor }}\r\n aria-label=\"Send message\"\r\n >\r\n <SendIcon />\r\n </button>\r\n </form>\r\n\r\n {config?.showPoweredBy && (\r\n <div className=\"rag-chat-powered-by\">\r\n Powered by <a href=\"https://rag-widget.com\" target=\"_blank\" rel=\"noopener noreferrer\">RAG Widget</a>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default ChatWindow;\r\n","import React, { useState } from 'react';\r\nimport { useChatWidget } from '../hooks/useChatWidget';\r\nimport { ChatBubble } from './ChatBubble';\r\nimport { ChatWindow } from './ChatWindow';\r\nimport type { ChatWidgetProps } from '../types';\r\nimport '../styles/widget.css';\r\n\r\nexport const ChatWidget: React.FC<ChatWidgetProps> = ({\r\n apiKey,\r\n widgetId,\r\n apiBaseUrl = '',\r\n position,\r\n primaryColor,\r\n greeting,\r\n placeholder,\r\n showPoweredBy,\r\n onError,\r\n onMessageSent,\r\n onMessageReceived\r\n}) => {\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n // Determine the API base URL\r\n const baseUrl = apiBaseUrl || (typeof window !== 'undefined' ? window.location.origin : '');\r\n\r\n const {\r\n messages,\r\n isLoading,\r\n isConnected,\r\n config,\r\n error,\r\n sendMessage,\r\n retry\r\n } = useChatWidget({\r\n apiKey,\r\n widgetId,\r\n apiBaseUrl: baseUrl,\r\n onError,\r\n onMessageSent,\r\n onMessageReceived\r\n });\r\n\r\n // Merge props with fetched config (props take precedence)\r\n const mergedConfig = config ? {\r\n ...config,\r\n position: position || config.position,\r\n primaryColor: primaryColor || config.primaryColor,\r\n greeting: greeting || config.greeting,\r\n placeholder: placeholder || config.placeholder,\r\n showPoweredBy: showPoweredBy !== undefined ? showPoweredBy : config.showPoweredBy\r\n } : null;\r\n\r\n const handleToggle = () => {\r\n setIsOpen(prev => !prev);\r\n };\r\n\r\n const handleClose = () => {\r\n setIsOpen(false);\r\n };\r\n\r\n // Show error state in the window if there's an error\r\n if (error && isOpen) {\r\n return (\r\n <div className=\"rag-chat-widget\">\r\n <ChatBubble\r\n isOpen={isOpen}\r\n onClick={handleToggle}\r\n primaryColor={primaryColor || '#007bff'}\r\n position={position || 'bottom-right'}\r\n />\r\n <div className={`rag-chat-window ${position || 'bottom-right'}`}>\r\n <div className=\"rag-chat-header\" style={{ backgroundColor: primaryColor || '#007bff' }}>\r\n <h3 className=\"rag-chat-header-title\">Chat</h3>\r\n <button className=\"rag-chat-header-close\" onClick={handleClose} type=\"button\">\r\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n <div className=\"rag-chat-error\">\r\n <p className=\"rag-chat-error-message\">\r\n {error.message || 'Unable to connect. Please try again.'}\r\n </p>\r\n <button className=\"rag-chat-error-retry\" onClick={retry} type=\"button\">\r\n Retry\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"rag-chat-widget\">\r\n <ChatBubble\r\n isOpen={isOpen}\r\n onClick={handleToggle}\r\n primaryColor={mergedConfig?.primaryColor || primaryColor || '#007bff'}\r\n position={mergedConfig?.position || position || 'bottom-right'}\r\n />\r\n {mergedConfig && (\r\n <ChatWindow\r\n isOpen={isOpen}\r\n onClose={handleClose}\r\n config={mergedConfig}\r\n messages={messages}\r\n isLoading={isLoading}\r\n onSendMessage={sendMessage}\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default ChatWidget;\r\n","import React, { createContext, useContext, useMemo } from 'react';\r\nimport type { ChatWidgetProps, WidgetConfig, Message } from '../types';\r\nimport { useChatWidget } from '../hooks/useChatWidget';\r\n\r\ninterface ChatWidgetContextValue {\r\n messages: Message[];\r\n isLoading: boolean;\r\n isConnected: boolean;\r\n config: WidgetConfig | null;\r\n error: Error | null;\r\n sendMessage: (content: string) => Promise<void>;\r\n clearMessages: () => void;\r\n retry: () => void;\r\n}\r\n\r\nconst ChatWidgetContext = createContext<ChatWidgetContextValue | null>(null);\r\n\r\nexport interface ChatWidgetProviderProps extends Omit<ChatWidgetProps, 'position' | 'primaryColor' | 'greeting' | 'placeholder' | 'showPoweredBy'> {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const ChatWidgetProvider: React.FC<ChatWidgetProviderProps> = ({\r\n apiKey,\r\n widgetId,\r\n apiBaseUrl = '',\r\n onError,\r\n onMessageSent,\r\n onMessageReceived,\r\n children\r\n}) => {\r\n const baseUrl = apiBaseUrl || (typeof window !== 'undefined' ? window.location.origin : '');\r\n\r\n const chatWidget = useChatWidget({\r\n apiKey,\r\n widgetId,\r\n apiBaseUrl: baseUrl,\r\n onError,\r\n onMessageSent,\r\n onMessageReceived\r\n });\r\n\r\n const value = useMemo(() => ({\r\n messages: chatWidget.messages,\r\n isLoading: chatWidget.isLoading,\r\n isConnected: chatWidget.isConnected,\r\n config: chatWidget.config,\r\n error: chatWidget.error,\r\n sendMessage: chatWidget.sendMessage,\r\n clearMessages: chatWidget.clearMessages,\r\n retry: chatWidget.retry\r\n }), [chatWidget]);\r\n\r\n return (\r\n <ChatWidgetContext.Provider value={value}>\r\n {children}\r\n </ChatWidgetContext.Provider>\r\n );\r\n};\r\n\r\nexport const useChatWidgetContext = (): ChatWidgetContextValue => {\r\n const context = useContext(ChatWidgetContext);\r\n if (!context) {\r\n throw new Error('useChatWidgetContext must be used within a ChatWidgetProvider');\r\n }\r\n return context;\r\n};\r\n\r\nexport default ChatWidgetProvider;\r\n"],"names":["useState","useRef","useEffect","useCallback","_jsxs","_jsx","CloseIcon","createContext","useMemo","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/hooks/useChatWidget.ts","../src/hooks/useViewNavigation.ts","../src/components/ChatBubble.tsx","../src/components/home/HeaderSection.tsx","../src/components/home/StartChatCard.tsx","../src/components/home/TicketCategoryList.tsx","../src/components/home/BookmarksRow.tsx","../src/components/views/HomeView.tsx","../src/components/ChatWidget.tsx","../src/components/ChatWindow.tsx","../src/providers/ChatWidgetProvider.tsx"],"sourcesContent":["import { useState, useCallback, useRef, useEffect } from 'react';\r\nimport type { Message, WidgetConfig, ChatSession, ApiResponse } from '../types';\r\n\r\ninterface UseChatWidgetOptions {\r\n apiKey: string;\r\n widgetId: string;\r\n apiBaseUrl: string;\r\n onError?: (error: Error) => void;\r\n onMessageSent?: (message: string) => void;\r\n onMessageReceived?: (message: Message) => void;\r\n}\r\n\r\ninterface UseChatWidgetReturn {\r\n messages: Message[];\r\n isLoading: boolean;\r\n isConnected: boolean;\r\n config: WidgetConfig | null;\r\n error: Error | null;\r\n sendMessage: (content: string) => Promise<void>;\r\n clearMessages: () => void;\r\n retry: () => void;\r\n}\r\n\r\nexport function useChatWidget(options: UseChatWidgetOptions): UseChatWidgetReturn {\r\n const { apiKey, widgetId, apiBaseUrl, onError, onMessageSent, onMessageReceived } = options;\r\n\r\n const [messages, setMessages] = useState<Message[]>([]);\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [isConnected, setIsConnected] = useState(false);\r\n const [config, setConfig] = useState<WidgetConfig | null>(null);\r\n const [error, setError] = useState<Error | null>(null);\r\n const [session, setSession] = useState<ChatSession | null>(null);\r\n\r\n const abortControllerRef = useRef<AbortController | null>(null);\r\n\r\n // Fetch widget configuration on mount\r\n useEffect(() => {\r\n fetchConfig();\r\n return () => {\r\n if (abortControllerRef.current) {\r\n abortControllerRef.current.abort();\r\n }\r\n };\r\n }, [apiKey, widgetId]);\r\n\r\n const fetchConfig = useCallback(async () => {\r\n try {\r\n const response = await fetch(`${apiBaseUrl}/api/v1/widget/${widgetId}/config`, {\r\n headers: {\r\n 'X-API-Key': apiKey\r\n }\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch config: ${response.status}`);\r\n }\r\n\r\n const result: ApiResponse<WidgetConfig> = await response.json();\r\n\r\n if (result.status === 'success' && result.data) {\r\n setConfig(result.data);\r\n setIsConnected(true);\r\n setError(null);\r\n } else {\r\n throw new Error(result.message || 'Failed to load widget configuration');\r\n }\r\n } catch (err) {\r\n const error = err instanceof Error ? err : new Error('Unknown error');\r\n setError(error);\r\n setIsConnected(false);\r\n onError?.(error);\r\n }\r\n }, [apiKey, widgetId, apiBaseUrl, onError]);\r\n\r\n const createSession = useCallback(async (): Promise<ChatSession> => {\r\n const response = await fetch(`${apiBaseUrl}/api/v1/widget/${widgetId}/sessions`, {\r\n method: 'POST',\r\n headers: {\r\n 'X-API-Key': apiKey,\r\n 'Content-Type': 'application/json'\r\n }\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to create session: ${response.status}`);\r\n }\r\n\r\n const result: ApiResponse<ChatSession> = await response.json();\r\n\r\n if (result.status === 'success' && result.data) {\r\n return result.data;\r\n }\r\n\r\n throw new Error(result.message || 'Failed to create session');\r\n }, [apiKey, widgetId, apiBaseUrl]);\r\n\r\n const sendMessage = useCallback(async (content: string) => {\r\n if (!content.trim() || isLoading) return;\r\n\r\n // Cancel any ongoing request\r\n if (abortControllerRef.current) {\r\n abortControllerRef.current.abort();\r\n }\r\n abortControllerRef.current = new AbortController();\r\n\r\n const userMessage: Message = {\r\n id: `msg-${Date.now()}`,\r\n role: 'user',\r\n content: content.trim(),\r\n timestamp: new Date()\r\n };\r\n\r\n setMessages(prev => [...prev, userMessage]);\r\n setIsLoading(true);\r\n setError(null);\r\n onMessageSent?.(content);\r\n\r\n try {\r\n // Ensure we have a session\r\n let currentSession = session;\r\n if (!currentSession || new Date() > new Date(currentSession.expiresAt)) {\r\n currentSession = await createSession();\r\n setSession(currentSession);\r\n }\r\n\r\n // Create placeholder for assistant message\r\n const assistantMessageId = `msg-${Date.now()}-assistant`;\r\n const assistantMessage: Message = {\r\n id: assistantMessageId,\r\n role: 'assistant',\r\n content: '',\r\n timestamp: new Date(),\r\n isStreaming: true\r\n };\r\n setMessages(prev => [...prev, assistantMessage]);\r\n\r\n // Send message with SSE streaming\r\n const response = await fetch(\r\n `${apiBaseUrl}/api/v1/widget/${widgetId}/sessions/${currentSession.sessionId}/messages`,\r\n {\r\n method: 'POST',\r\n headers: {\r\n 'X-API-Key': apiKey,\r\n 'Content-Type': 'application/json',\r\n 'Accept': 'text/event-stream'\r\n },\r\n body: JSON.stringify({ message: content }),\r\n signal: abortControllerRef.current.signal\r\n }\r\n );\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to send message: ${response.status}`);\r\n }\r\n\r\n const reader = response.body?.getReader();\r\n const decoder = new TextDecoder();\r\n let fullContent = '';\r\n\r\n if (reader) {\r\n while (true) {\r\n const { done, value } = await reader.read();\r\n if (done) break;\r\n\r\n const chunk = decoder.decode(value, { stream: true });\r\n const lines = chunk.split('\\n');\r\n\r\n for (const line of lines) {\r\n if (line.startsWith('data: ')) {\r\n try {\r\n const data = JSON.parse(line.slice(6));\r\n\r\n if (data.type === 'chunk') {\r\n fullContent += data.content;\r\n setMessages(prev =>\r\n prev.map(msg =>\r\n msg.id === assistantMessageId\r\n ? { ...msg, content: fullContent }\r\n : msg\r\n )\r\n );\r\n } else if (data.type === 'done') {\r\n setMessages(prev =>\r\n prev.map(msg =>\r\n msg.id === assistantMessageId\r\n ? { ...msg, isStreaming: false, sources: data.sources }\r\n : msg\r\n )\r\n );\r\n\r\n const finalMessage: Message = {\r\n id: assistantMessageId,\r\n role: 'assistant',\r\n content: fullContent,\r\n timestamp: new Date(),\r\n sources: data.sources\r\n };\r\n onMessageReceived?.(finalMessage);\r\n }\r\n } catch {\r\n // Ignore parse errors for partial SSE data\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } catch (err) {\r\n if ((err as Error).name === 'AbortError') {\r\n // Request was cancelled, ignore\r\n return;\r\n }\r\n\r\n const error = err instanceof Error ? err : new Error('Failed to send message');\r\n setError(error);\r\n onError?.(error);\r\n\r\n // Remove the incomplete assistant message\r\n setMessages(prev => prev.filter(msg => !msg.isStreaming));\r\n } finally {\r\n setIsLoading(false);\r\n }\r\n }, [apiKey, widgetId, apiBaseUrl, session, isLoading, createSession, onError, onMessageSent, onMessageReceived]);\r\n\r\n const clearMessages = useCallback(() => {\r\n setMessages([]);\r\n setSession(null);\r\n }, []);\r\n\r\n const retry = useCallback(() => {\r\n setError(null);\r\n fetchConfig();\r\n }, [fetchConfig]);\r\n\r\n return {\r\n messages,\r\n isLoading,\r\n isConnected,\r\n config,\r\n error,\r\n sendMessage,\r\n clearMessages,\r\n retry\r\n };\r\n}\r\n","import { useState, useCallback } from 'react';\r\nimport type { WidgetView } from '../types';\r\n\r\ninterface ViewNavigationState {\r\n currentView: WidgetView;\r\n previousView: WidgetView | null;\r\n}\r\n\r\nexport interface UseViewNavigationReturn {\r\n currentView: WidgetView;\r\n previousView: WidgetView | null;\r\n canGoBack: boolean;\r\n navigateToChat: () => void;\r\n navigateToHome: () => void;\r\n goBack: () => void;\r\n}\r\n\r\nexport const useViewNavigation = (\r\n initialView: WidgetView = 'home'\r\n): UseViewNavigationReturn => {\r\n const [state, setState] = useState<ViewNavigationState>({\r\n currentView: initialView,\r\n previousView: null,\r\n });\r\n\r\n const navigateToChat = useCallback(() => {\r\n setState((prev) => ({\r\n currentView: 'chat',\r\n previousView: prev.currentView,\r\n }));\r\n }, []);\r\n\r\n const navigateToHome = useCallback(() => {\r\n setState((prev) => ({\r\n currentView: 'home',\r\n previousView: prev.currentView,\r\n }));\r\n }, []);\r\n\r\n const goBack = useCallback(() => {\r\n if (state.currentView !== 'home') {\r\n setState((prev) => ({\r\n currentView: 'home',\r\n previousView: prev.currentView,\r\n }));\r\n }\r\n }, [state.currentView]);\r\n\r\n const canGoBack = state.currentView !== 'home';\r\n\r\n return {\r\n currentView: state.currentView,\r\n previousView: state.previousView,\r\n canGoBack,\r\n navigateToChat,\r\n navigateToHome,\r\n goBack,\r\n };\r\n};\r\n","import React from 'react';\r\nimport type { ChatBubbleProps } from '../types';\r\n\r\nconst ChatIcon: React.FC = () => (\r\n <svg\r\n className=\"rag-chat-bubble-icon\"\r\n viewBox=\"0 0 24 24\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H5.17L4 17.17V4h16v12z\" />\r\n <path d=\"M7 9h10v2H7zm0-3h10v2H7z\" />\r\n </svg>\r\n);\r\n\r\nconst CloseIcon: React.FC = () => (\r\n <svg\r\n className=\"rag-chat-bubble-icon\"\r\n viewBox=\"0 0 24 24\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\r\n </svg>\r\n);\r\n\r\nexport const ChatBubble: React.FC<ChatBubbleProps> = ({\r\n isOpen,\r\n onClick,\r\n primaryColor = '#007bff',\r\n position = 'bottom-right',\r\n unreadCount = 0\r\n}) => {\r\n return (\r\n <button\r\n className={`rag-chat-bubble ${position}`}\r\n onClick={onClick}\r\n style={{ backgroundColor: primaryColor }}\r\n aria-label={isOpen ? 'Close chat' : 'Open chat'}\r\n type=\"button\"\r\n >\r\n {isOpen ? <CloseIcon /> : <ChatIcon />}\r\n {!isOpen && unreadCount > 0 && (\r\n <span className=\"rag-chat-bubble-badge\">\r\n {unreadCount > 9 ? '9+' : unreadCount}\r\n </span>\r\n )}\r\n </button>\r\n );\r\n};\r\n\r\nexport default ChatBubble;\r\n","import React from 'react';\r\n\r\nexport interface HeaderSectionProps {\r\n greeting: string;\r\n logoUrl?: string;\r\n}\r\n\r\nexport const HeaderSection: React.FC<HeaderSectionProps> = ({\r\n greeting,\r\n logoUrl,\r\n}) => {\r\n return (\r\n <div className=\"rag-home-header\">\r\n {logoUrl && (\r\n <img\r\n src={logoUrl}\r\n alt=\"Logo\"\r\n className=\"rag-home-logo\"\r\n />\r\n )}\r\n <h2 className=\"rag-home-greeting\">{greeting}</h2>\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\n\r\nexport interface StartChatCardProps {\r\n onStartChat: () => void;\r\n subtitle?: string;\r\n}\r\n\r\nconst ChatIcon: React.FC = () => (\r\n <svg\r\n data-testid=\"chat-icon\"\r\n className=\"rag-start-chat-card__icon\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n);\r\n\r\nconst ArrowIcon: React.FC = () => (\r\n <svg\r\n data-testid=\"arrow-icon\"\r\n className=\"rag-start-chat-card__arrow\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M9 18l6-6-6-6\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n);\r\n\r\nexport const StartChatCard = React.forwardRef<HTMLButtonElement, StartChatCardProps>(({\r\n onStartChat,\r\n subtitle,\r\n}, ref) => {\r\n const handleKeyDown = (e: React.KeyboardEvent) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n onStartChat();\r\n }\r\n };\r\n\r\n return (\r\n <button\r\n ref={ref}\r\n type=\"button\"\r\n className=\"rag-start-chat-card\"\r\n onClick={onStartChat}\r\n onKeyDown={handleKeyDown}\r\n aria-label=\"Start new chat conversation\"\r\n >\r\n <ChatIcon />\r\n <div className=\"rag-start-chat-card__content\">\r\n <div className=\"rag-start-chat-card__title\">Start new chat</div>\r\n {subtitle && (\r\n <div className=\"rag-start-chat-card__subtitle\">{subtitle}</div>\r\n )}\r\n </div>\r\n <ArrowIcon />\r\n </button>\r\n );\r\n});\r\n\r\n// Display name for debugging\r\nStartChatCard.displayName = 'StartChatCard';\r\n","import React from 'react';\r\nimport type { TicketCategory } from '../../types';\r\n\r\nexport interface TicketCategoryListProps {\r\n categories: TicketCategory[];\r\n onCategoryClick: (categoryId: string) => void;\r\n}\r\n\r\nconst ChevronIcon: React.FC = () => (\r\n <svg\r\n className=\"rag-ticket-category__chevron\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M9 18l6-6-6-6\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"2\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n);\r\n\r\nexport const TicketCategoryList: React.FC<TicketCategoryListProps> = ({\r\n categories,\r\n onCategoryClick,\r\n}) => {\r\n const enabledCategories = categories.filter((cat) => cat.enabled);\r\n\r\n if (enabledCategories.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className=\"rag-ticket-section\">\r\n <div className=\"rag-ticket-section__title\">Submit a ticket</div>\r\n <div className=\"rag-ticket-list\">\r\n {enabledCategories.map((category) => (\r\n <button\r\n key={category.id}\r\n type=\"button\"\r\n className=\"rag-ticket-category\"\r\n onClick={() => onCategoryClick(category.id)}\r\n aria-label={`Submit ${category.label} ticket`}\r\n >\r\n <span className=\"rag-ticket-category__icon\">{category.icon}</span>\r\n <span className=\"rag-ticket-category__label\">{category.label}</span>\r\n <ChevronIcon />\r\n </button>\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport type { Bookmark } from '../../types';\r\n\r\nexport interface BookmarksRowProps {\r\n bookmarks: Bookmark[];\r\n}\r\n\r\nexport const BookmarksRow: React.FC<BookmarksRowProps> = ({ bookmarks }) => {\r\n if (bookmarks.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <nav className=\"rag-bookmarks-section\" role=\"navigation\" aria-label=\"Quick links\">\r\n <div className=\"rag-bookmarks-section__title\" id=\"bookmarks-title\">Bookmarks</div>\r\n <div className=\"rag-bookmarks-row\" aria-labelledby=\"bookmarks-title\">\r\n {bookmarks.map((bookmark) => (\r\n <a\r\n key={bookmark.id}\r\n href={bookmark.url}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"rag-bookmark\"\r\n aria-label={`${bookmark.label} - opens in new tab`}\r\n >\r\n <span className=\"rag-bookmark__icon\" aria-hidden=\"true\">{bookmark.icon}</span>\r\n <span className=\"rag-bookmark__label\">{bookmark.label}</span>\r\n </a>\r\n ))}\r\n </div>\r\n </nav>\r\n );\r\n};\r\n","import React, { useEffect, useRef } from 'react';\r\nimport type { WidgetConfig } from '../../types';\r\nimport { HeaderSection } from '../home/HeaderSection';\r\nimport { StartChatCard } from '../home/StartChatCard';\r\nimport { TicketCategoryList } from '../home/TicketCategoryList';\r\nimport { BookmarksRow } from '../home/BookmarksRow';\r\n\r\nexport interface HomeViewProps {\r\n config: WidgetConfig;\r\n onStartChat: () => void;\r\n onTicketCategoryClick?: (categoryId: string) => void;\r\n autoFocus?: boolean;\r\n}\r\n\r\nexport const HomeView: React.FC<HomeViewProps> = ({\r\n config,\r\n onStartChat,\r\n onTicketCategoryClick,\r\n autoFocus = false,\r\n}) => {\r\n const homeConfig = config.homeView;\r\n const startChatRef = useRef<HTMLButtonElement>(null);\r\n\r\n // Auto-focus first interactive element when autoFocus is enabled\r\n useEffect(() => {\r\n if (autoFocus && startChatRef.current) {\r\n startChatRef.current.focus();\r\n }\r\n }, [autoFocus]);\r\n\r\n // Don't render if home view is not enabled or missing\r\n if (!homeConfig?.enabled) {\r\n return null;\r\n }\r\n\r\n // Use homeView greeting, fallback to widget greeting\r\n const greeting = homeConfig.greeting || config.greeting;\r\n\r\n const handleTicketCategoryClick = (categoryId: string) => {\r\n if (onTicketCategoryClick) {\r\n onTicketCategoryClick(categoryId);\r\n } else {\r\n // Default behavior: log \"Coming soon\" message\r\n console.log('Ticket category clicked (Coming soon):', categoryId);\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"rag-home-view\" role=\"region\" aria-label=\"Help Center Home\">\r\n <HeaderSection\r\n greeting={greeting}\r\n logoUrl={homeConfig.logoUrl}\r\n />\r\n\r\n {homeConfig.showStartChat && (\r\n <StartChatCard\r\n ref={startChatRef}\r\n onStartChat={onStartChat}\r\n subtitle=\"How can we help you?\"\r\n />\r\n )}\r\n\r\n {homeConfig.ticketCategories && homeConfig.ticketCategories.length > 0 && (\r\n <TicketCategoryList\r\n categories={homeConfig.ticketCategories}\r\n onCategoryClick={handleTicketCategoryClick}\r\n />\r\n )}\r\n\r\n {homeConfig.bookmarks && homeConfig.bookmarks.length > 0 && (\r\n <BookmarksRow bookmarks={homeConfig.bookmarks} />\r\n )}\r\n\r\n {config.showPoweredBy && (\r\n <div className=\"rag-home-footer\">\r\n Powered by <a href=\"https://rag-widget.com\" target=\"_blank\" rel=\"noopener noreferrer\">RAG Widget</a>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n","import React, { useState, useEffect } from 'react';\r\nimport { useChatWidget } from '../hooks/useChatWidget';\r\nimport { useViewNavigation } from '../hooks/useViewNavigation';\r\nimport { ChatBubble } from './ChatBubble';\r\nimport { ChatWindow } from './ChatWindow';\r\nimport { HomeView } from './views/HomeView';\r\nimport type { ChatWidgetProps, WidgetView } from '../types';\r\nimport '../styles/widget.css';\r\n\r\nexport const ChatWidget: React.FC<ChatWidgetProps> = ({\r\n apiKey,\r\n widgetId,\r\n apiBaseUrl = '',\r\n position,\r\n primaryColor,\r\n greeting,\r\n placeholder,\r\n showPoweredBy,\r\n onError,\r\n onMessageSent,\r\n onMessageReceived\r\n}) => {\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n // Determine the API base URL\r\n const baseUrl = apiBaseUrl || (typeof window !== 'undefined' ? window.location.origin : '');\r\n\r\n const {\r\n messages,\r\n isLoading,\r\n config,\r\n error,\r\n sendMessage,\r\n retry\r\n } = useChatWidget({\r\n apiKey,\r\n widgetId,\r\n apiBaseUrl: baseUrl,\r\n onError,\r\n onMessageSent,\r\n onMessageReceived\r\n });\r\n\r\n // Merge props with fetched config (props take precedence)\r\n const mergedConfig = config ? {\r\n ...config,\r\n position: position || config.position,\r\n primaryColor: primaryColor || config.primaryColor,\r\n greeting: greeting || config.greeting,\r\n placeholder: placeholder || config.placeholder,\r\n showPoweredBy: showPoweredBy !== undefined ? showPoweredBy : config.showPoweredBy\r\n } : null;\r\n\r\n // Determine initial view based on home view configuration\r\n const homeViewEnabled = mergedConfig?.homeView?.enabled ?? false;\r\n const initialView: WidgetView = homeViewEnabled ? 'home' : 'chat';\r\n\r\n const {\r\n currentView,\r\n canGoBack,\r\n navigateToChat,\r\n navigateToHome,\r\n } = useViewNavigation(initialView);\r\n\r\n // Update view when config loads - fixes race condition where config isn't\r\n // available on first render but homeView.enabled is true\r\n useEffect(() => {\r\n if (mergedConfig?.homeView?.enabled && currentView === 'chat') {\r\n navigateToHome();\r\n }\r\n }, [mergedConfig?.homeView?.enabled]);\r\n\r\n const handleToggle = () => {\r\n setIsOpen(prev => !prev);\r\n };\r\n\r\n const handleClose = () => {\r\n setIsOpen(false);\r\n };\r\n\r\n const handleStartChat = () => {\r\n navigateToChat();\r\n };\r\n\r\n const handleBack = () => {\r\n navigateToHome();\r\n };\r\n\r\n const effectivePrimaryColor = mergedConfig?.primaryColor || primaryColor || '#007bff';\r\n const effectivePosition = mergedConfig?.position || position || 'bottom-right';\r\n\r\n // Show error state in the window if there's an error\r\n if (error && isOpen) {\r\n return (\r\n <div className=\"rag-chat-widget\">\r\n <ChatBubble\r\n isOpen={isOpen}\r\n onClick={handleToggle}\r\n primaryColor={effectivePrimaryColor}\r\n position={effectivePosition}\r\n />\r\n <div className={`rag-chat-window ${effectivePosition}`}>\r\n <div className=\"rag-chat-header\" style={{ backgroundColor: effectivePrimaryColor }}>\r\n <h3 className=\"rag-chat-header-title\">Chat</h3>\r\n <button\r\n className=\"rag-chat-header-close\"\r\n onClick={handleClose}\r\n type=\"button\"\r\n aria-label=\"Close chat\"\r\n >\r\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n <div className=\"rag-chat-error\">\r\n <p className=\"rag-chat-error-message\">\r\n {error.message || 'Unable to connect. Please try again.'}\r\n </p>\r\n <button className=\"rag-chat-error-retry\" onClick={retry} type=\"button\">\r\n Retry\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // Determine which view to render\r\n const shouldShowHomeView = currentView === 'home' && homeViewEnabled && mergedConfig;\r\n const shouldShowChatView = currentView === 'chat' || !homeViewEnabled;\r\n\r\n return (\r\n <div className=\"rag-chat-widget\">\r\n <ChatBubble\r\n isOpen={isOpen}\r\n onClick={handleToggle}\r\n primaryColor={effectivePrimaryColor}\r\n position={effectivePosition}\r\n />\r\n {isOpen && mergedConfig && (\r\n <div\r\n className={`rag-chat-window ${effectivePosition}`}\r\n style={{ '--rag-primary-color': effectivePrimaryColor } as React.CSSProperties}\r\n >\r\n {/* Header */}\r\n <div className=\"rag-chat-header\" style={{ backgroundColor: effectivePrimaryColor }}>\r\n <div className=\"rag-chat-header-left\">\r\n {canGoBack && (\r\n <button\r\n className=\"rag-chat-header-back\"\r\n onClick={handleBack}\r\n type=\"button\"\r\n aria-label=\"Back to home\"\r\n >\r\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z\"\r\n />\r\n </svg>\r\n </button>\r\n )}\r\n <h3 className=\"rag-chat-header-title\">{mergedConfig.name || 'Chat'}</h3>\r\n </div>\r\n <button\r\n className=\"rag-chat-header-close\"\r\n onClick={handleClose}\r\n aria-label=\"Close chat\"\r\n type=\"button\"\r\n >\r\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\r\n />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n {/* View Container */}\r\n <div className=\"rag-view-container\">\r\n {shouldShowHomeView && (\r\n <HomeView\r\n config={mergedConfig}\r\n onStartChat={handleStartChat}\r\n />\r\n )}\r\n {shouldShowChatView && (\r\n <ChatWindowContent\r\n config={mergedConfig}\r\n messages={messages}\r\n isLoading={isLoading}\r\n onSendMessage={sendMessage}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\n// Extracted chat window content (without header)\r\ninterface ChatWindowContentProps {\r\n config: NonNullable<ReturnType<typeof useChatWidget>['config']>;\r\n messages: ReturnType<typeof useChatWidget>['messages'];\r\n isLoading: boolean;\r\n onSendMessage: (message: string) => Promise<void>;\r\n}\r\n\r\nconst ChatWindowContent: React.FC<ChatWindowContentProps> = ({\r\n config,\r\n messages,\r\n isLoading,\r\n onSendMessage,\r\n}) => {\r\n const [inputValue, setInputValue] = React.useState('');\r\n const messagesEndRef = React.useRef<HTMLDivElement>(null);\r\n const inputRef = React.useRef<HTMLTextAreaElement>(null);\r\n\r\n // Scroll to bottom when new messages arrive\r\n React.useEffect(() => {\r\n if (messagesEndRef.current && typeof messagesEndRef.current.scrollIntoView === 'function') {\r\n messagesEndRef.current.scrollIntoView({ behavior: 'smooth' });\r\n }\r\n }, [messages]);\r\n\r\n // Focus input when content mounts\r\n React.useEffect(() => {\r\n inputRef.current?.focus();\r\n }, []);\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (inputValue.trim() && !isLoading) {\r\n onSendMessage(inputValue.trim());\r\n setInputValue('');\r\n }\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\r\n if (e.key === 'Enter' && !e.shiftKey) {\r\n e.preventDefault();\r\n handleSubmit(e);\r\n }\r\n };\r\n\r\n return (\r\n <>\r\n <div className=\"rag-chat-messages\">\r\n {messages.length === 0 && (config.uspText || config.greeting) && (\r\n <div className=\"rag-chat-greeting\">\r\n {config.uspText && (\r\n <p className=\"rag-chat-usp-text\">{config.uspText}</p>\r\n )}\r\n {config.greeting && (\r\n <p className=\"rag-chat-greeting-text\">{config.greeting}</p>\r\n )}\r\n </div>\r\n )}\r\n\r\n {messages.map(message => (\r\n <div key={message.id} className={`rag-chat-message ${message.role}`}>\r\n {message.isStreaming && !message.content ? (\r\n <div className=\"rag-chat-loading\">\r\n <div className=\"rag-chat-loading-dot\" />\r\n <div className=\"rag-chat-loading-dot\" />\r\n <div className=\"rag-chat-loading-dot\" />\r\n </div>\r\n ) : (\r\n <p className=\"rag-chat-message-content\">{message.content}</p>\r\n )}\r\n {message.sources && message.sources.length > 0 && (\r\n <div className=\"rag-chat-message-sources\">\r\n <div className=\"rag-chat-message-sources-title\">Sources:</div>\r\n {message.sources.map((source, index) => (\r\n <div key={index} className=\"rag-chat-message-source\">\r\n {source.title}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n ))}\r\n\r\n <div ref={messagesEndRef} />\r\n </div>\r\n\r\n <form className=\"rag-chat-input-container\" onSubmit={handleSubmit}>\r\n <textarea\r\n ref={inputRef}\r\n className=\"rag-chat-input\"\r\n value={inputValue}\r\n onChange={e => setInputValue(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n placeholder={config.placeholder || 'Type a message...'}\r\n rows={1}\r\n maxLength={config.allowedMessageLength || 2000}\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"submit\"\r\n className=\"rag-chat-send-button\"\r\n disabled={!inputValue.trim() || isLoading}\r\n style={{ backgroundColor: config.primaryColor }}\r\n aria-label=\"Send message\"\r\n >\r\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" />\r\n </svg>\r\n </button>\r\n </form>\r\n\r\n {config.showPoweredBy && (\r\n <div className=\"rag-chat-powered-by\">\r\n Powered by <a href=\"https://rag-widget.com\" target=\"_blank\" rel=\"noopener noreferrer\">RAG Widget</a>\r\n </div>\r\n )}\r\n </>\r\n );\r\n};\r\n\r\nexport default ChatWidget;\r\n","import React, { useState, useRef, useEffect } from 'react';\r\nimport type { ChatWindowProps, Message } from '../types';\r\n\r\nconst CloseIcon: React.FC = () => (\r\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"\r\n />\r\n </svg>\r\n);\r\n\r\nconst SendIcon: React.FC = () => (\r\n <svg viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" />\r\n </svg>\r\n);\r\n\r\nconst LoadingDots: React.FC = () => (\r\n <div className=\"rag-chat-loading\">\r\n <div className=\"rag-chat-loading-dot\" />\r\n <div className=\"rag-chat-loading-dot\" />\r\n <div className=\"rag-chat-loading-dot\" />\r\n </div>\r\n);\r\n\r\ninterface MessageBubbleProps {\r\n message: Message;\r\n}\r\n\r\nconst MessageBubble: React.FC<MessageBubbleProps> = ({ message }) => (\r\n <div className={`rag-chat-message ${message.role}`}>\r\n {message.isStreaming && !message.content ? (\r\n <LoadingDots />\r\n ) : (\r\n <p className=\"rag-chat-message-content\">{message.content}</p>\r\n )}\r\n {message.sources && message.sources.length > 0 && (\r\n <div className=\"rag-chat-message-sources\">\r\n <div className=\"rag-chat-message-sources-title\">Sources:</div>\r\n {message.sources.map((source, index) => (\r\n <div key={index} className=\"rag-chat-message-source\">\r\n {source.title}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n);\r\n\r\nexport const ChatWindow: React.FC<ChatWindowProps> = ({\r\n isOpen,\r\n onClose,\r\n config,\r\n messages,\r\n isLoading,\r\n onSendMessage\r\n}) => {\r\n const [inputValue, setInputValue] = useState('');\r\n const messagesEndRef = useRef<HTMLDivElement>(null);\r\n const inputRef = useRef<HTMLTextAreaElement>(null);\r\n\r\n // Scroll to bottom when new messages arrive\r\n useEffect(() => {\r\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\r\n }, [messages]);\r\n\r\n // Focus input when window opens\r\n useEffect(() => {\r\n if (isOpen) {\r\n inputRef.current?.focus();\r\n }\r\n }, [isOpen]);\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (inputValue.trim() && !isLoading) {\r\n onSendMessage(inputValue.trim());\r\n setInputValue('');\r\n }\r\n };\r\n\r\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\r\n if (e.key === 'Enter' && !e.shiftKey) {\r\n e.preventDefault();\r\n handleSubmit(e);\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n const position = config?.position || 'bottom-right';\r\n const primaryColor = config?.primaryColor || '#007bff';\r\n\r\n return (\r\n <div\r\n className={`rag-chat-window ${position}`}\r\n style={{ '--rag-primary-color': primaryColor } as React.CSSProperties}\r\n >\r\n <div className=\"rag-chat-header\" style={{ backgroundColor: primaryColor }}>\r\n <h3 className=\"rag-chat-header-title\">{config?.name || 'Chat'}</h3>\r\n <button\r\n className=\"rag-chat-header-close\"\r\n onClick={onClose}\r\n aria-label=\"Close chat\"\r\n type=\"button\"\r\n >\r\n <CloseIcon />\r\n </button>\r\n </div>\r\n\r\n <div className=\"rag-chat-messages\">\r\n {messages.length === 0 && (config?.uspText || config?.greeting) && (\r\n <div className=\"rag-chat-greeting\">\r\n {config?.uspText && (\r\n <p className=\"rag-chat-usp-text\">{config.uspText}</p>\r\n )}\r\n {config?.greeting && (\r\n <p className=\"rag-chat-greeting-text\">{config.greeting}</p>\r\n )}\r\n </div>\r\n )}\r\n\r\n {messages.map(message => (\r\n <MessageBubble key={message.id} message={message} />\r\n ))}\r\n\r\n <div ref={messagesEndRef} />\r\n </div>\r\n\r\n <form className=\"rag-chat-input-container\" onSubmit={handleSubmit}>\r\n <textarea\r\n ref={inputRef}\r\n className=\"rag-chat-input\"\r\n value={inputValue}\r\n onChange={e => setInputValue(e.target.value)}\r\n onKeyDown={handleKeyDown}\r\n placeholder={config?.placeholder || 'Type a message...'}\r\n rows={1}\r\n maxLength={config?.allowedMessageLength || 2000}\r\n disabled={isLoading}\r\n />\r\n <button\r\n type=\"submit\"\r\n className=\"rag-chat-send-button\"\r\n disabled={!inputValue.trim() || isLoading}\r\n style={{ backgroundColor: primaryColor }}\r\n aria-label=\"Send message\"\r\n >\r\n <SendIcon />\r\n </button>\r\n </form>\r\n\r\n {config?.showPoweredBy && (\r\n <div className=\"rag-chat-powered-by\">\r\n Powered by <a href=\"https://rag-widget.com\" target=\"_blank\" rel=\"noopener noreferrer\">RAG Widget</a>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default ChatWindow;\r\n","import React, { createContext, useContext, useMemo } from 'react';\r\nimport type { ChatWidgetProps, WidgetConfig, Message, WidgetView } from '../types';\r\nimport { useChatWidget } from '../hooks/useChatWidget';\r\nimport { useViewNavigation } from '../hooks/useViewNavigation';\r\n\r\ninterface ChatWidgetContextValue {\r\n // Chat state\r\n messages: Message[];\r\n isLoading: boolean;\r\n isConnected: boolean;\r\n config: WidgetConfig | null;\r\n error: Error | null;\r\n sendMessage: (content: string) => Promise<void>;\r\n clearMessages: () => void;\r\n retry: () => void;\r\n // View navigation\r\n currentView: WidgetView;\r\n previousView: WidgetView | null;\r\n canGoBack: boolean;\r\n navigateToChat: () => void;\r\n navigateToHome: () => void;\r\n goBack: () => void;\r\n}\r\n\r\nconst ChatWidgetContext = createContext<ChatWidgetContextValue | null>(null);\r\n\r\nexport interface ChatWidgetProviderProps extends Omit<ChatWidgetProps, 'position' | 'primaryColor' | 'greeting' | 'placeholder' | 'showPoweredBy'> {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport const ChatWidgetProvider: React.FC<ChatWidgetProviderProps> = ({\r\n apiKey,\r\n widgetId,\r\n apiBaseUrl = '',\r\n onError,\r\n onMessageSent,\r\n onMessageReceived,\r\n children\r\n}) => {\r\n const baseUrl = apiBaseUrl || (typeof window !== 'undefined' ? window.location.origin : '');\r\n\r\n const chatWidget = useChatWidget({\r\n apiKey,\r\n widgetId,\r\n apiBaseUrl: baseUrl,\r\n onError,\r\n onMessageSent,\r\n onMessageReceived\r\n });\r\n\r\n // Determine initial view based on config\r\n // If homeView is enabled, start with home; otherwise start with chat\r\n const homeViewEnabled = chatWidget.config?.homeView?.enabled ?? false;\r\n const initialView: WidgetView = homeViewEnabled ? 'home' : 'chat';\r\n\r\n const viewNavigation = useViewNavigation(initialView);\r\n\r\n const value = useMemo(() => ({\r\n // Chat state\r\n messages: chatWidget.messages,\r\n isLoading: chatWidget.isLoading,\r\n isConnected: chatWidget.isConnected,\r\n config: chatWidget.config,\r\n error: chatWidget.error,\r\n sendMessage: chatWidget.sendMessage,\r\n clearMessages: chatWidget.clearMessages,\r\n retry: chatWidget.retry,\r\n // View navigation\r\n currentView: viewNavigation.currentView,\r\n previousView: viewNavigation.previousView,\r\n canGoBack: viewNavigation.canGoBack,\r\n navigateToChat: viewNavigation.navigateToChat,\r\n navigateToHome: viewNavigation.navigateToHome,\r\n goBack: viewNavigation.goBack,\r\n }), [chatWidget, viewNavigation]);\r\n\r\n return (\r\n <ChatWidgetContext.Provider value={value}>\r\n {children}\r\n </ChatWidgetContext.Provider>\r\n );\r\n};\r\n\r\nexport const useChatWidgetContext = (): ChatWidgetContextValue => {\r\n const context = useContext(ChatWidgetContext);\r\n if (!context) {\r\n throw new Error('useChatWidgetContext must be used within a ChatWidgetProvider');\r\n }\r\n return context;\r\n};\r\n\r\nexport default ChatWidgetProvider;\r\n"],"names":["useState","useRef","useEffect","useCallback","ChatIcon","_jsxs","_jsx","CloseIcon","_Fragment","createContext","useMemo","useContext"],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react/jsx-runtime"),require("react")):"function"==typeof define&&define.amd?define(["exports","react/jsx-runtime","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).RAGChatWidget={},e.React,e.React)}(this,function(e,t,a){"use strict";function r(e){const{apiKey:t,widgetId:r,apiBaseUrl:o,onError:s,onMessageSent:n,onMessageReceived:i}=e,[c,l]=a.useState([]),[d,g]=a.useState(!1),[h,p]=a.useState(!1),[u,x]=a.useState(null),[f,m]=a.useState(null),[b,w]=a.useState(null),y=a.useRef(null);a.useEffect(()=>(v(),()=>{y.current&&y.current.abort()}),[t,r]);const v=a.useCallback(async()=>{try{const e=await fetch(`${o}/api/v1/widget/${r}/config`,{headers:{"X-API-Key":t}});if(!e.ok)throw new Error(`Failed to fetch config: ${e.status}`);const a=await e.json();if("success"!==a.status||!a.data)throw new Error(a.message||"Failed to load widget configuration");x(a.data),p(!0),m(null)}catch(e){const t=e instanceof Error?e:new Error("Unknown error");m(t),p(!1),null==s||s(t)}},[t,r,o,s]),j=a.useCallback(async()=>{const e=await fetch(`${o}/api/v1/widget/${r}/sessions`,{method:"POST",headers:{"X-API-Key":t,"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to create session: ${e.status}`);const a=await e.json();if("success"===a.status&&a.data)return a.data;throw new Error(a.message||"Failed to create session")},[t,r,o]),C=a.useCallback(async e=>{var a;if(!e.trim()||d)return;y.current&&y.current.abort(),y.current=new AbortController;const c={id:`msg-${Date.now()}`,role:"user",content:e.trim(),timestamp:new Date};l(e=>[...e,c]),g(!0),m(null),null==n||n(e);try{let s=b;(!s||new Date>new Date(s.expiresAt))&&(s=await j(),w(s));const n=`msg-${Date.now()}-assistant`,c={id:n,role:"assistant",content:"",timestamp:new Date,isStreaming:!0};l(e=>[...e,c]);const d=await fetch(`${o}/api/v1/widget/${r}/sessions/${s.sessionId}/messages`,{method:"POST",headers:{"X-API-Key":t,"Content-Type":"application/json",Accept:"text/event-stream"},body:JSON.stringify({message:e}),signal:y.current.signal});if(!d.ok)throw new Error(`Failed to send message: ${d.status}`);const g=null===(a=d.body)||void 0===a?void 0:a.getReader(),h=new TextDecoder;let p="";if(g)for(;;){const{done:e,value:t}=await g.read();if(e)break;const a=h.decode(t,{stream:!0}).split("\n");for(const e of a)if(e.startsWith("data: "))try{const t=JSON.parse(e.slice(6));if("chunk"===t.type)p+=t.content,l(e=>e.map(e=>e.id===n?{...e,content:p}:e));else if("done"===t.type){l(e=>e.map(e=>e.id===n?{...e,isStreaming:!1,sources:t.sources}:e));const e={id:n,role:"assistant",content:p,timestamp:new Date,sources:t.sources};null==i||i(e)}}catch(e){}}}catch(e){if("AbortError"===e.name)return;const t=e instanceof Error?e:new Error("Failed to send message");m(t),null==s||s(t),l(e=>e.filter(e=>!e.isStreaming))}finally{g(!1)}},[t,r,o,b,d,j,s,n,i]),k=a.useCallback(()=>{l([]),w(null)},[]),N=a.useCallback(()=>{m(null),v()},[v]);return{messages:c,isLoading:d,isConnected:h,config:u,error:f,sendMessage:C,clearMessages:k,retry:N}}const o=()=>t.jsxs("svg",{className:"rag-chat-bubble-icon",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:[t.jsx("path",{d:"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H5.17L4 17.17V4h16v12z"}),t.jsx("path",{d:"M7 9h10v2H7zm0-3h10v2H7z"})]}),s=()=>t.jsx("svg",{className:"rag-chat-bubble-icon",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:t.jsx("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})}),n=({isOpen:e,onClick:a,primaryColor:r="#007bff",position:n="bottom-right",unreadCount:i=0})=>t.jsxs("button",{className:`rag-chat-bubble ${n}`,onClick:a,style:{backgroundColor:r},"aria-label":e?"Close chat":"Open chat",type:"button",children:[e?t.jsx(s,{}):t.jsx(o,{}),!e&&i>0&&t.jsx("span",{className:"rag-chat-bubble-badge",children:i>9?"9+":i})]}),i=()=>t.jsx("svg",{viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:t.jsx("path",{fill:"currentColor",d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})}),c=()=>t.jsx("svg",{viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:t.jsx("path",{d:"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"})}),l=()=>t.jsxs("div",{className:"rag-chat-loading",children:[t.jsx("div",{className:"rag-chat-loading-dot"}),t.jsx("div",{className:"rag-chat-loading-dot"}),t.jsx("div",{className:"rag-chat-loading-dot"})]}),d=({message:e})=>t.jsxs("div",{className:`rag-chat-message ${e.role}`,children:[e.isStreaming&&!e.content?t.jsx(l,{}):t.jsx("p",{className:"rag-chat-message-content",children:e.content}),e.sources&&e.sources.length>0&&t.jsxs("div",{className:"rag-chat-message-sources",children:[t.jsx("div",{className:"rag-chat-message-sources-title",children:"Sources:"}),e.sources.map((e,a)=>t.jsx("div",{className:"rag-chat-message-source",children:e.title},a))]})]}),g=({isOpen:e,onClose:r,config:o,messages:s,isLoading:n,onSendMessage:l})=>{const[g,h]=a.useState(""),p=a.useRef(null),u=a.useRef(null);a.useEffect(()=>{var e;null===(e=p.current)||void 0===e||e.scrollIntoView({behavior:"smooth"})},[s]),a.useEffect(()=>{var t;e&&(null===(t=u.current)||void 0===t||t.focus())},[e]);const x=e=>{e.preventDefault(),g.trim()&&!n&&(l(g.trim()),h(""))};if(!e)return null;const f=(null==o?void 0:o.position)||"bottom-right",m=(null==o?void 0:o.primaryColor)||"#007bff";return t.jsxs("div",{className:`rag-chat-window ${f}`,style:{"--rag-primary-color":m},children:[t.jsxs("div",{className:"rag-chat-header",style:{backgroundColor:m},children:[t.jsx("h3",{className:"rag-chat-header-title",children:(null==o?void 0:o.name)||"Chat"}),t.jsx("button",{className:"rag-chat-header-close",onClick:r,"aria-label":"Close chat",type:"button",children:t.jsx(i,{})})]}),t.jsxs("div",{className:"rag-chat-messages",children:[0===s.length&&((null==o?void 0:o.uspText)||(null==o?void 0:o.greeting))&&t.jsxs("div",{className:"rag-chat-greeting",children:[(null==o?void 0:o.uspText)&&t.jsx("p",{className:"rag-chat-usp-text",children:o.uspText}),(null==o?void 0:o.greeting)&&t.jsx("p",{className:"rag-chat-greeting-text",children:o.greeting})]}),s.map(e=>t.jsx(d,{message:e},e.id)),t.jsx("div",{ref:p})]}),t.jsxs("form",{className:"rag-chat-input-container",onSubmit:x,children:[t.jsx("textarea",{ref:u,className:"rag-chat-input",value:g,onChange:e=>h(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),x(e))},placeholder:(null==o?void 0:o.placeholder)||"Type a message...",rows:1,maxLength:(null==o?void 0:o.allowedMessageLength)||2e3,disabled:n}),t.jsx("button",{type:"submit",className:"rag-chat-send-button",disabled:!g.trim()||n,style:{backgroundColor:m},"aria-label":"Send message",children:t.jsx(c,{})})]}),(null==o?void 0:o.showPoweredBy)&&t.jsxs("div",{className:"rag-chat-powered-by",children:["Powered by ",t.jsx("a",{href:"https://rag-widget.com",target:"_blank",rel:"noopener noreferrer",children:"RAG Widget"})]})]})};!function(e,t){void 0===t&&(t={});var a=t.insertAt;if("undefined"!=typeof document){var r=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css","top"===a&&r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}('.rag-chat-widget{--rag-primary-color:#007bff;--rag-bg-color:#fff;--rag-text-color:#333;--rag-border-color:#e0e0e0;--rag-shadow:0 4px 12px rgba(0,0,0,.15);--rag-font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,sans-serif;box-sizing:border-box;font-family:var(--rag-font-family);font-size:14px;line-height:1.5}.rag-chat-widget *,.rag-chat-widget :after,.rag-chat-widget :before{box-sizing:inherit}.rag-chat-bubble{align-items:center;background-color:var(--rag-primary-color);border:none;border-radius:50%;box-shadow:var(--rag-shadow);cursor:pointer;display:flex;height:60px;justify-content:center;position:fixed;transition:transform .2s ease,box-shadow .2s ease;width:60px;z-index:9998}.rag-chat-bubble:hover{box-shadow:0 6px 16px rgba(0,0,0,.2);transform:scale(1.05)}.rag-chat-bubble:active{transform:scale(.95)}.rag-chat-bubble.bottom-right{bottom:20px;right:20px}.rag-chat-bubble.bottom-left{bottom:20px;left:20px}.rag-chat-bubble.top-right{right:20px;top:20px}.rag-chat-bubble.top-left{left:20px;top:20px}.rag-chat-bubble-icon{fill:#fff;height:28px;width:28px}.rag-chat-bubble-badge{align-items:center;background-color:#f44;border-radius:10px;color:#fff;display:flex;font-size:12px;font-weight:700;height:20px;justify-content:center;min-width:20px;padding:0 6px;position:absolute;right:-5px;top:-5px}.rag-chat-window{animation:rag-slide-up .3s ease;background-color:var(--rag-bg-color);border-radius:12px;box-shadow:var(--rag-shadow);display:flex;flex-direction:column;height:520px;max-height:80vh;overflow:hidden;position:fixed;width:380px;z-index:9999}@keyframes rag-slide-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.rag-chat-window.bottom-right{bottom:90px;right:20px}.rag-chat-window.bottom-left{bottom:90px;left:20px}.rag-chat-window.top-right{right:20px;top:90px}.rag-chat-window.top-left{left:20px;top:90px}.rag-chat-header{align-items:center;background-color:var(--rag-primary-color);color:#fff;display:flex;justify-content:space-between;padding:16px}.rag-chat-header-title{font-size:16px;font-weight:600;margin:0}.rag-chat-header-close{align-items:center;background:none;border:none;border-radius:4px;color:#fff;cursor:pointer;display:flex;justify-content:center;padding:4px;transition:background-color .2s ease}.rag-chat-header-close:hover{background-color:hsla(0,0%,100%,.2)}.rag-chat-header-close svg{height:20px;width:20px}.rag-chat-messages{display:flex;flex:1;flex-direction:column;gap:12px;overflow-y:auto;padding:16px}.rag-chat-message{word-wrap:break-word;border-radius:12px;max-width:85%;padding:10px 14px}.rag-chat-message.user{align-self:flex-end;background-color:var(--rag-primary-color);border-bottom-right-radius:4px;color:#fff}.rag-chat-message.assistant{align-self:flex-start;background-color:#f0f0f0;border-bottom-left-radius:4px;color:var(--rag-text-color)}.rag-chat-message-content{margin:0;white-space:pre-wrap}.rag-chat-message-sources{border-top:1px solid rgba(0,0,0,.1);color:#666;font-size:12px;margin-top:8px;padding-top:8px}.rag-chat-message-sources-title{font-weight:600;margin-bottom:4px}.rag-chat-message-source{margin:2px 0}.rag-chat-loading{align-self:flex-start;background-color:#f0f0f0;border-radius:12px;display:flex;gap:4px;padding:10px 14px}.rag-chat-loading-dot{animation:rag-bounce 1.4s ease-in-out infinite both;background-color:#999;border-radius:50%;height:8px;width:8px}.rag-chat-loading-dot:first-child{animation-delay:-.32s}.rag-chat-loading-dot:nth-child(2){animation-delay:-.16s}@keyframes rag-bounce{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}.rag-chat-input-container{align-items:flex-end;border-top:1px solid var(--rag-border-color);display:flex;gap:8px;padding:12px 16px}.rag-chat-input{border:1px solid var(--rag-border-color);border-radius:20px;flex:1;font-family:inherit;font-size:14px;max-height:100px;outline:none;padding:10px 14px;resize:none;transition:border-color .2s ease}.rag-chat-input:focus{border-color:var(--rag-primary-color)}.rag-chat-input::-moz-placeholder{color:#999}.rag-chat-input::placeholder{color:#999}.rag-chat-send-button{align-items:center;background-color:var(--rag-primary-color);border:none;border-radius:50%;cursor:pointer;display:flex;height:40px;justify-content:center;transition:background-color .2s ease,transform .1s ease;width:40px}.rag-chat-send-button:hover:not(:disabled){filter:brightness(1.1)}.rag-chat-send-button:active:not(:disabled){transform:scale(.95)}.rag-chat-send-button:disabled{cursor:not-allowed;opacity:.5}.rag-chat-send-button svg{fill:#fff;height:20px;width:20px}.rag-chat-powered-by{background-color:#fafafa;color:#999;font-size:11px;padding:8px;text-align:center}.rag-chat-powered-by a{color:#666;text-decoration:none}.rag-chat-powered-by a:hover{text-decoration:underline}.rag-chat-error{color:#dc3545;padding:20px;text-align:center}.rag-chat-error-message{margin-bottom:12px}.rag-chat-error-retry{background-color:var(--rag-primary-color);border:none;border-radius:4px;color:#fff;cursor:pointer;font-size:14px;padding:8px 16px}.rag-chat-greeting{color:#666;padding:20px;text-align:center}.rag-chat-usp-text{color:#333;font-weight:700;margin:0 0 12px}.rag-chat-greeting-text{margin:0}@media (max-width:480px){.rag-chat-window{border-radius:12px;bottom:10px!important;height:calc(100vh - 100px);left:10px!important;max-height:none;right:10px!important;top:auto!important;width:calc(100vw - 20px)}.rag-chat-bubble{height:56px;width:56px}}');const h=({apiKey:e,widgetId:o,apiBaseUrl:s="",position:i,primaryColor:c,greeting:l,placeholder:d,showPoweredBy:h,onError:p,onMessageSent:u,onMessageReceived:x})=>{const[f,m]=a.useState(!1),b=s||("undefined"!=typeof window?window.location.origin:""),{messages:w,isLoading:y,isConnected:v,config:j,error:C,sendMessage:k,retry:N}=r({apiKey:e,widgetId:o,apiBaseUrl:b,onError:p,onMessageSent:u,onMessageReceived:x}),S=j?{...j,position:i||j.position,primaryColor:c||j.primaryColor,greeting:l||j.greeting,placeholder:d||j.placeholder,showPoweredBy:void 0!==h?h:j.showPoweredBy}:null,M=()=>{m(e=>!e)},E=()=>{m(!1)};return C&&f?t.jsxs("div",{className:"rag-chat-widget",children:[t.jsx(n,{isOpen:f,onClick:M,primaryColor:c||"#007bff",position:i||"bottom-right"}),t.jsxs("div",{className:`rag-chat-window ${i||"bottom-right"}`,children:[t.jsxs("div",{className:"rag-chat-header",style:{backgroundColor:c||"#007bff"},children:[t.jsx("h3",{className:"rag-chat-header-title",children:"Chat"}),t.jsx("button",{className:"rag-chat-header-close",onClick:E,type:"button",children:t.jsx("svg",{viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:t.jsx("path",{fill:"currentColor",d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})})})]}),t.jsxs("div",{className:"rag-chat-error",children:[t.jsx("p",{className:"rag-chat-error-message",children:C.message||"Unable to connect. Please try again."}),t.jsx("button",{className:"rag-chat-error-retry",onClick:N,type:"button",children:"Retry"})]})]})]}):t.jsxs("div",{className:"rag-chat-widget",children:[t.jsx(n,{isOpen:f,onClick:M,primaryColor:(null==S?void 0:S.primaryColor)||c||"#007bff",position:(null==S?void 0:S.position)||i||"bottom-right"}),S&&t.jsx(g,{isOpen:f,onClose:E,config:S,messages:w,isLoading:y,onSendMessage:k})]})},p=a.createContext(null);e.ChatBubble=n,e.ChatWidget=h,e.ChatWidgetProvider=({apiKey:e,widgetId:o,apiBaseUrl:s="",onError:n,onMessageSent:i,onMessageReceived:c,children:l})=>{const d=r({apiKey:e,widgetId:o,apiBaseUrl:s||("undefined"!=typeof window?window.location.origin:""),onError:n,onMessageSent:i,onMessageReceived:c}),g=a.useMemo(()=>({messages:d.messages,isLoading:d.isLoading,isConnected:d.isConnected,config:d.config,error:d.error,sendMessage:d.sendMessage,clearMessages:d.clearMessages,retry:d.retry}),[d]);return t.jsx(p.Provider,{value:g,children:l})},e.ChatWindow=g,e.default=h,e.useChatWidget=r,e.useChatWidgetContext=()=>{const e=a.useContext(p);if(!e)throw new Error("useChatWidgetContext must be used within a ChatWidgetProvider");return e},Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,a){"object"==typeof exports&&"undefined"!=typeof module?a(exports,require("react/jsx-runtime"),require("react")):"function"==typeof define&&define.amd?define(["exports","react/jsx-runtime","react"],a):a((e="undefined"!=typeof globalThis?globalThis:e||self).RAGChatWidget={},e.React,e.React)}(this,function(e,a,r){"use strict";function t(e){const{apiKey:a,widgetId:t,apiBaseUrl:o,onError:s,onMessageSent:i,onMessageReceived:n}=e,[c,l]=r.useState([]),[g,d]=r.useState(!1),[h,p]=r.useState(!1),[x,u]=r.useState(null),[m,f]=r.useState(null),[b,w]=r.useState(null),v=r.useRef(null);r.useEffect(()=>(k(),()=>{v.current&&v.current.abort()}),[a,t]);const k=r.useCallback(async()=>{try{const e=await fetch(`${o}/api/v1/widget/${t}/config`,{headers:{"X-API-Key":a}});if(!e.ok)throw new Error(`Failed to fetch config: ${e.status}`);const r=await e.json();if("success"!==r.status||!r.data)throw new Error(r.message||"Failed to load widget configuration");u(r.data),p(!0),f(null)}catch(e){const a=e instanceof Error?e:new Error("Unknown error");f(a),p(!1),null==s||s(a)}},[a,t,o,s]),y=r.useCallback(async()=>{const e=await fetch(`${o}/api/v1/widget/${t}/sessions`,{method:"POST",headers:{"X-API-Key":a,"Content-Type":"application/json"}});if(!e.ok)throw new Error(`Failed to create session: ${e.status}`);const r=await e.json();if("success"===r.status&&r.data)return r.data;throw new Error(r.message||"Failed to create session")},[a,t,o]),j=r.useCallback(async e=>{var r;if(!e.trim()||g)return;v.current&&v.current.abort(),v.current=new AbortController;const c={id:`msg-${Date.now()}`,role:"user",content:e.trim(),timestamp:new Date};l(e=>[...e,c]),d(!0),f(null),null==i||i(e);try{let s=b;(!s||new Date>new Date(s.expiresAt))&&(s=await y(),w(s));const i=`msg-${Date.now()}-assistant`,c={id:i,role:"assistant",content:"",timestamp:new Date,isStreaming:!0};l(e=>[...e,c]);const g=await fetch(`${o}/api/v1/widget/${t}/sessions/${s.sessionId}/messages`,{method:"POST",headers:{"X-API-Key":a,"Content-Type":"application/json",Accept:"text/event-stream"},body:JSON.stringify({message:e}),signal:v.current.signal});if(!g.ok)throw new Error(`Failed to send message: ${g.status}`);const d=null===(r=g.body)||void 0===r?void 0:r.getReader(),h=new TextDecoder;let p="";if(d)for(;;){const{done:e,value:a}=await d.read();if(e)break;const r=h.decode(a,{stream:!0}).split("\n");for(const e of r)if(e.startsWith("data: "))try{const a=JSON.parse(e.slice(6));if("chunk"===a.type)p+=a.content,l(e=>e.map(e=>e.id===i?{...e,content:p}:e));else if("done"===a.type){l(e=>e.map(e=>e.id===i?{...e,isStreaming:!1,sources:a.sources}:e));const e={id:i,role:"assistant",content:p,timestamp:new Date,sources:a.sources};null==n||n(e)}}catch(e){}}}catch(e){if("AbortError"===e.name)return;const a=e instanceof Error?e:new Error("Failed to send message");f(a),null==s||s(a),l(e=>e.filter(e=>!e.isStreaming))}finally{d(!1)}},[a,t,o,b,g,y,s,i,n]),C=r.useCallback(()=>{l([]),w(null)},[]),N=r.useCallback(()=>{f(null),k()},[k]);return{messages:c,isLoading:g,isConnected:h,config:x,error:m,sendMessage:j,clearMessages:C,retry:N}}const o=(e="home")=>{const[a,t]=r.useState({currentView:e,previousView:null}),o=r.useCallback(()=>{t(e=>({currentView:"chat",previousView:e.currentView}))},[]),s=r.useCallback(()=>{t(e=>({currentView:"home",previousView:e.currentView}))},[]),i=r.useCallback(()=>{"home"!==a.currentView&&t(e=>({currentView:"home",previousView:e.currentView}))},[a.currentView]),n="home"!==a.currentView;return{currentView:a.currentView,previousView:a.previousView,canGoBack:n,navigateToChat:o,navigateToHome:s,goBack:i}},s=()=>a.jsxs("svg",{className:"rag-chat-bubble-icon",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:[a.jsx("path",{d:"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H5.17L4 17.17V4h16v12z"}),a.jsx("path",{d:"M7 9h10v2H7zm0-3h10v2H7z"})]}),i=()=>a.jsx("svg",{className:"rag-chat-bubble-icon",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:a.jsx("path",{d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})}),n=({isOpen:e,onClick:r,primaryColor:t="#007bff",position:o="bottom-right",unreadCount:n=0})=>a.jsxs("button",{className:`rag-chat-bubble ${o}`,onClick:r,style:{backgroundColor:t},"aria-label":e?"Close chat":"Open chat",type:"button",children:[e?a.jsx(i,{}):a.jsx(s,{}),!e&&n>0&&a.jsx("span",{className:"rag-chat-bubble-badge",children:n>9?"9+":n})]}),c=({greeting:e,logoUrl:r})=>a.jsxs("div",{className:"rag-home-header",children:[r&&a.jsx("img",{src:r,alt:"Logo",className:"rag-home-logo"}),a.jsx("h2",{className:"rag-home-greeting",children:e})]}),l=()=>a.jsx("svg",{"data-testid":"chat-icon",className:"rag-start-chat-card__icon",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:a.jsx("path",{d:"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})}),g=()=>a.jsx("svg",{"data-testid":"arrow-icon",className:"rag-start-chat-card__arrow",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:a.jsx("path",{d:"M9 18l6-6-6-6",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})}),d=r.forwardRef(({onStartChat:e,subtitle:r},t)=>a.jsxs("button",{ref:t,type:"button",className:"rag-start-chat-card",onClick:e,onKeyDown:a=>{"Enter"!==a.key&&" "!==a.key||(a.preventDefault(),e())},"aria-label":"Start new chat conversation",children:[a.jsx(l,{}),a.jsxs("div",{className:"rag-start-chat-card__content",children:[a.jsx("div",{className:"rag-start-chat-card__title",children:"Start new chat"}),r&&a.jsx("div",{className:"rag-start-chat-card__subtitle",children:r})]}),a.jsx(g,{})]}));d.displayName="StartChatCard";const h=()=>a.jsx("svg",{className:"rag-ticket-category__chevron",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:a.jsx("path",{d:"M9 18l6-6-6-6",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})}),p=({categories:e,onCategoryClick:r})=>{const t=e.filter(e=>e.enabled);return 0===t.length?null:a.jsxs("div",{className:"rag-ticket-section",children:[a.jsx("div",{className:"rag-ticket-section__title",children:"Submit a ticket"}),a.jsx("div",{className:"rag-ticket-list",children:t.map(e=>a.jsxs("button",{type:"button",className:"rag-ticket-category",onClick:()=>r(e.id),"aria-label":`Submit ${e.label} ticket`,children:[a.jsx("span",{className:"rag-ticket-category__icon",children:e.icon}),a.jsx("span",{className:"rag-ticket-category__label",children:e.label}),a.jsx(h,{})]},e.id))})]})},x=({bookmarks:e})=>0===e.length?null:a.jsxs("nav",{className:"rag-bookmarks-section",role:"navigation","aria-label":"Quick links",children:[a.jsx("div",{className:"rag-bookmarks-section__title",id:"bookmarks-title",children:"Bookmarks"}),a.jsx("div",{className:"rag-bookmarks-row","aria-labelledby":"bookmarks-title",children:e.map(e=>a.jsxs("a",{href:e.url,target:"_blank",rel:"noopener noreferrer",className:"rag-bookmark","aria-label":`${e.label} - opens in new tab`,children:[a.jsx("span",{className:"rag-bookmark__icon","aria-hidden":"true",children:e.icon}),a.jsx("span",{className:"rag-bookmark__label",children:e.label})]},e.id))})]}),u=({config:e,onStartChat:t,onTicketCategoryClick:o,autoFocus:s=!1})=>{const i=e.homeView,n=r.useRef(null);if(r.useEffect(()=>{s&&n.current&&n.current.focus()},[s]),!(null==i?void 0:i.enabled))return null;const l=i.greeting||e.greeting;return a.jsxs("div",{className:"rag-home-view",role:"region","aria-label":"Help Center Home",children:[a.jsx(c,{greeting:l,logoUrl:i.logoUrl}),i.showStartChat&&a.jsx(d,{ref:n,onStartChat:t,subtitle:"How can we help you?"}),i.ticketCategories&&i.ticketCategories.length>0&&a.jsx(p,{categories:i.ticketCategories,onCategoryClick:e=>{o?o(e):console.log("Ticket category clicked (Coming soon):",e)}}),i.bookmarks&&i.bookmarks.length>0&&a.jsx(x,{bookmarks:i.bookmarks}),e.showPoweredBy&&a.jsxs("div",{className:"rag-home-footer",children:["Powered by ",a.jsx("a",{href:"https://rag-widget.com",target:"_blank",rel:"noopener noreferrer",children:"RAG Widget"})]})]})};!function(e,a){void 0===a&&(a={});var r=a.insertAt;if("undefined"!=typeof document){var t=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css","top"===r&&t.firstChild?t.insertBefore(o,t.firstChild):t.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}('.rag-chat-widget{--rag-primary-color:#007bff;--rag-bg-color:#fff;--rag-text-color:#333;--rag-border-color:#e0e0e0;--rag-shadow:0 4px 12px rgba(0,0,0,.15);--rag-font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,sans-serif;box-sizing:border-box;font-family:var(--rag-font-family);font-size:14px;line-height:1.5}.rag-chat-widget *,.rag-chat-widget :after,.rag-chat-widget :before{box-sizing:inherit}.rag-chat-bubble{align-items:center;background-color:var(--rag-primary-color);border:none;border-radius:50%;box-shadow:var(--rag-shadow);cursor:pointer;display:flex;height:60px;justify-content:center;position:fixed;transition:transform .2s ease,box-shadow .2s ease;width:60px;z-index:9998}.rag-chat-bubble:hover{box-shadow:0 6px 16px rgba(0,0,0,.2);transform:scale(1.05)}.rag-chat-bubble:active{transform:scale(.95)}.rag-chat-bubble.bottom-right{bottom:20px;right:20px}.rag-chat-bubble.bottom-left{bottom:20px;left:20px}.rag-chat-bubble.top-right{right:20px;top:20px}.rag-chat-bubble.top-left{left:20px;top:20px}.rag-chat-bubble-icon{fill:#fff;height:28px;width:28px}.rag-chat-bubble-badge{align-items:center;background-color:#f44;border-radius:10px;color:#fff;display:flex;font-size:12px;font-weight:700;height:20px;justify-content:center;min-width:20px;padding:0 6px;position:absolute;right:-5px;top:-5px}.rag-chat-window{animation:rag-slide-up .3s ease;background-color:var(--rag-bg-color);border-radius:12px;box-shadow:var(--rag-shadow);display:flex;flex-direction:column;height:520px;max-height:80vh;overflow:hidden;position:fixed;width:380px;z-index:9999}@keyframes rag-slide-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.rag-chat-window.bottom-right{bottom:90px;right:20px}.rag-chat-window.bottom-left{bottom:90px;left:20px}.rag-chat-window.top-right{right:20px;top:90px}.rag-chat-window.top-left{left:20px;top:90px}.rag-chat-header{align-items:center;background-color:var(--rag-primary-color);color:#fff;display:flex;justify-content:space-between;padding:16px}.rag-chat-header-title{font-size:16px;font-weight:600;margin:0}.rag-chat-header-close{align-items:center;background:none;border:none;border-radius:4px;color:#fff;cursor:pointer;display:flex;justify-content:center;padding:4px;transition:background-color .2s ease}.rag-chat-header-close:hover{background-color:hsla(0,0%,100%,.2)}.rag-chat-header-close svg{height:20px;width:20px}.rag-chat-messages{display:flex;flex:1;flex-direction:column;gap:12px;overflow-y:auto;padding:16px}.rag-chat-message{word-wrap:break-word;border-radius:12px;max-width:85%;padding:10px 14px}.rag-chat-message.user{align-self:flex-end;background-color:var(--rag-primary-color);border-bottom-right-radius:4px;color:#fff}.rag-chat-message.assistant{align-self:flex-start;background-color:#f0f0f0;border-bottom-left-radius:4px;color:var(--rag-text-color)}.rag-chat-message-content{margin:0;white-space:pre-wrap}.rag-chat-message-sources{border-top:1px solid rgba(0,0,0,.1);color:#666;font-size:12px;margin-top:8px;padding-top:8px}.rag-chat-message-sources-title{font-weight:600;margin-bottom:4px}.rag-chat-message-source{margin:2px 0}.rag-chat-loading{align-self:flex-start;background-color:#f0f0f0;border-radius:12px;display:flex;gap:4px;padding:10px 14px}.rag-chat-loading-dot{animation:rag-bounce 1.4s ease-in-out infinite both;background-color:#999;border-radius:50%;height:8px;width:8px}.rag-chat-loading-dot:first-child{animation-delay:-.32s}.rag-chat-loading-dot:nth-child(2){animation-delay:-.16s}@keyframes rag-bounce{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}.rag-chat-input-container{align-items:flex-end;border-top:1px solid var(--rag-border-color);display:flex;gap:8px;padding:12px 16px}.rag-chat-input{border:1px solid var(--rag-border-color);border-radius:20px;flex:1;font-family:inherit;font-size:14px;max-height:100px;outline:none;padding:10px 14px;resize:none;transition:border-color .2s ease}.rag-chat-input:focus{border-color:var(--rag-primary-color)}.rag-chat-input::-moz-placeholder{color:#999}.rag-chat-input::placeholder{color:#999}.rag-chat-send-button{align-items:center;background-color:var(--rag-primary-color);border:none;border-radius:50%;cursor:pointer;display:flex;height:40px;justify-content:center;transition:background-color .2s ease,transform .1s ease;width:40px}.rag-chat-send-button:hover:not(:disabled){filter:brightness(1.1)}.rag-chat-send-button:active:not(:disabled){transform:scale(.95)}.rag-chat-send-button:disabled{cursor:not-allowed;opacity:.5}.rag-chat-send-button svg{fill:#fff;height:20px;width:20px}.rag-chat-powered-by{background-color:#fafafa;color:#999;font-size:11px;padding:8px;text-align:center}.rag-chat-powered-by a{color:#666;text-decoration:none}.rag-chat-powered-by a:hover{text-decoration:underline}.rag-chat-error{color:#dc3545;padding:20px;text-align:center}.rag-chat-error-message{margin-bottom:12px}.rag-chat-error-retry{background-color:var(--rag-primary-color);border:none;border-radius:4px;color:#fff;cursor:pointer;font-size:14px;padding:8px 16px}.rag-chat-greeting{color:#666;padding:20px;text-align:center}.rag-chat-usp-text{color:#333;font-weight:700;margin:0 0 12px}.rag-chat-greeting-text{margin:0}.rag-home-view{gap:20px;height:100%;overflow-y:auto;padding:24px 20px}.rag-home-header,.rag-home-view{display:flex;flex-direction:column}.rag-home-header{gap:8px}.rag-home-logo{height:40px;-o-object-fit:contain;object-fit:contain;width:40px}.rag-home-greeting{color:var(--rag-text-color);font-size:24px;font-weight:600;margin:0}.rag-start-chat-card{align-items:center;background:var(--rag-bg-color);border:1px solid var(--rag-border-color);border-radius:12px;cursor:pointer;display:flex;padding:16px;text-align:left;transition:box-shadow .2s ease,border-color .2s ease;width:100%}.rag-start-chat-card:hover{border-color:var(--rag-primary-color);box-shadow:0 4px 12px rgba(0,0,0,.1)}.rag-start-chat-card:focus{outline:2px solid var(--rag-primary-color);outline-offset:2px}.rag-start-chat-card__icon{color:var(--rag-primary-color);flex-shrink:0;height:40px;margin-right:12px;width:40px}.rag-start-chat-card__content{flex:1;min-width:0}.rag-start-chat-card__title{color:var(--rag-text-color);font-size:15px;font-weight:600}.rag-start-chat-card__subtitle{color:#666;font-size:13px;margin-top:2px}.rag-start-chat-card__arrow{color:var(--rag-primary-color);flex-shrink:0;height:20px;width:20px}.rag-ticket-section{display:flex;flex-direction:column}.rag-ticket-section__title{color:#666;font-size:12px;font-weight:500;letter-spacing:.5px;margin-bottom:8px;text-transform:uppercase}.rag-ticket-list{display:flex;flex-direction:column}.rag-ticket-category{align-items:center;background:transparent;border:none;border-bottom:1px solid var(--rag-border-color);cursor:pointer;display:flex;padding:12px 0;text-align:left;transition:background-color .2s ease;width:100%}.rag-ticket-category:last-child{border-bottom:none}.rag-ticket-category:hover{background-color:#f8f9fa}.rag-ticket-category:focus{outline:2px solid var(--rag-primary-color);outline-offset:-2px}.rag-ticket-category__icon{color:#666;font-size:14px;margin-right:12px;width:20px}.rag-ticket-category__label{color:var(--rag-text-color);flex:1;font-size:14px;font-weight:500}.rag-ticket-category__chevron{color:#999;height:16px;width:16px}.rag-bookmarks-section{display:flex;flex-direction:column}.rag-bookmarks-section__title{color:#666;font-size:12px;font-weight:500;letter-spacing:.5px;margin-bottom:12px;text-transform:uppercase}.rag-bookmarks-row{display:flex;flex-wrap:wrap;gap:10px}.rag-bookmark{align-items:center;background:#f5f5f5;border-radius:6px;color:var(--rag-text-color);display:inline-flex;font-size:13px;gap:6px;padding:8px 12px;text-decoration:none;transition:background-color .2s ease}.rag-bookmark:hover{background:#e8e8e8}.rag-bookmark:focus{outline:2px solid var(--rag-primary-color);outline-offset:2px}.rag-bookmark__icon{font-size:14px}.rag-bookmark__label{font-weight:500}.rag-home-footer{color:#999;font-size:11px;margin-top:auto;padding-top:16px;text-align:center}.rag-home-footer a{color:#666;text-decoration:none}.rag-home-footer a:hover{text-decoration:underline}.rag-view-container{height:100%;overflow:hidden;position:relative}.rag-view-enter{animation:rag-slide-in-right .25s ease-out}.rag-view-exit{animation:rag-slide-out-left .2s ease-in}.rag-view-enter-back{animation:rag-slide-in-left .25s ease-out}.rag-view-exit-back{animation:rag-slide-out-right .2s ease-in}@keyframes rag-slide-in-right{0%{opacity:0;transform:translateX(100%)}to{opacity:1;transform:translateX(0)}}@keyframes rag-slide-out-left{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(-100%)}}@keyframes rag-slide-in-left{0%{opacity:0;transform:translateX(-100%)}to{opacity:1;transform:translateX(0)}}@keyframes rag-slide-out-right{0%{opacity:1;transform:translateX(0)}to{opacity:0;transform:translateX(100%)}}.rag-chat-header-back{align-items:center;background:none;border:none;border-radius:4px;color:#fff;cursor:pointer;display:flex;justify-content:center;margin-right:8px;padding:4px;transition:background-color .2s ease}.rag-chat-header-back:hover{background-color:hsla(0,0%,100%,.2)}.rag-chat-header-back svg{height:20px;width:20px}.rag-chat-header-left{align-items:center;display:flex}@media (prefers-reduced-motion:reduce){.rag-bookmark,.rag-chat-bubble,.rag-chat-header-back,.rag-chat-header-close,.rag-chat-send-button,.rag-chat-window,.rag-start-chat-card,.rag-ticket-category{transition:none}.rag-chat-loading-dot,.rag-chat-window,.rag-view-enter,.rag-view-enter-back,.rag-view-exit,.rag-view-exit-back{animation:none}}@media (max-width:480px){.rag-chat-window{border-radius:12px;bottom:10px!important;height:calc(100vh - 100px);left:10px!important;max-height:none;right:10px!important;top:auto!important;width:calc(100vw - 20px)}.rag-chat-bubble{height:56px;width:56px}.rag-home-view{gap:16px;padding:16px}.rag-home-greeting{font-size:20px}.rag-bookmarks-row{gap:8px}.rag-bookmark{font-size:12px;padding:6px 10px}}');const m=({apiKey:e,widgetId:s,apiBaseUrl:i="",position:c,primaryColor:l,greeting:g,placeholder:d,showPoweredBy:h,onError:p,onMessageSent:x,onMessageReceived:m})=>{var b,w,v;const[k,y]=r.useState(!1),j=i||("undefined"!=typeof window?window.location.origin:""),{messages:C,isLoading:N,config:_,error:S,sendMessage:z,retry:M}=t({apiKey:e,widgetId:s,apiBaseUrl:j,onError:p,onMessageSent:x,onMessageReceived:m}),B=_?{..._,position:c||_.position,primaryColor:l||_.primaryColor,greeting:g||_.greeting,placeholder:d||_.placeholder,showPoweredBy:void 0!==h?h:_.showPoweredBy}:null,V=null!==(w=null===(b=null==B?void 0:B.homeView)||void 0===b?void 0:b.enabled)&&void 0!==w&&w,L=V?"home":"chat",{currentView:T,canGoBack:E,navigateToChat:R,navigateToHome:$}=o(L);r.useEffect(()=>{var e;(null===(e=null==B?void 0:B.homeView)||void 0===e?void 0:e.enabled)&&"chat"===T&&$()},[null===(v=null==B?void 0:B.homeView)||void 0===v?void 0:v.enabled]);const P=()=>{y(e=>!e)},D=()=>{y(!1)},H=(null==B?void 0:B.primaryColor)||l||"#007bff",W=(null==B?void 0:B.position)||c||"bottom-right";if(S&&k)return a.jsxs("div",{className:"rag-chat-widget",children:[a.jsx(n,{isOpen:k,onClick:P,primaryColor:H,position:W}),a.jsxs("div",{className:`rag-chat-window ${W}`,children:[a.jsxs("div",{className:"rag-chat-header",style:{backgroundColor:H},children:[a.jsx("h3",{className:"rag-chat-header-title",children:"Chat"}),a.jsx("button",{className:"rag-chat-header-close",onClick:D,type:"button","aria-label":"Close chat",children:a.jsx("svg",{viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:a.jsx("path",{fill:"currentColor",d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})})})]}),a.jsxs("div",{className:"rag-chat-error",children:[a.jsx("p",{className:"rag-chat-error-message",children:S.message||"Unable to connect. Please try again."}),a.jsx("button",{className:"rag-chat-error-retry",onClick:M,type:"button",children:"Retry"})]})]})]});const I="home"===T&&V&&B,K="chat"===T||!V;return a.jsxs("div",{className:"rag-chat-widget",children:[a.jsx(n,{isOpen:k,onClick:P,primaryColor:H,position:W}),k&&B&&a.jsxs("div",{className:`rag-chat-window ${W}`,style:{"--rag-primary-color":H},children:[a.jsxs("div",{className:"rag-chat-header",style:{backgroundColor:H},children:[a.jsxs("div",{className:"rag-chat-header-left",children:[E&&a.jsx("button",{className:"rag-chat-header-back",onClick:()=>{$()},type:"button","aria-label":"Back to home",children:a.jsx("svg",{viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:a.jsx("path",{fill:"currentColor",d:"M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z"})})}),a.jsx("h3",{className:"rag-chat-header-title",children:B.name||"Chat"})]}),a.jsx("button",{className:"rag-chat-header-close",onClick:D,"aria-label":"Close chat",type:"button",children:a.jsx("svg",{viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:a.jsx("path",{fill:"currentColor",d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})})})]}),a.jsxs("div",{className:"rag-view-container",children:[I&&a.jsx(u,{config:B,onStartChat:()=>{R()}}),K&&a.jsx(f,{config:B,messages:C,isLoading:N,onSendMessage:z})]})]})]})},f=({config:e,messages:t,isLoading:o,onSendMessage:s})=>{const[i,n]=r.useState(""),c=r.useRef(null),l=r.useRef(null);r.useEffect(()=>{c.current&&"function"==typeof c.current.scrollIntoView&&c.current.scrollIntoView({behavior:"smooth"})},[t]),r.useEffect(()=>{var e;null===(e=l.current)||void 0===e||e.focus()},[]);const g=e=>{e.preventDefault(),i.trim()&&!o&&(s(i.trim()),n(""))};return a.jsxs(a.Fragment,{children:[a.jsxs("div",{className:"rag-chat-messages",children:[0===t.length&&(e.uspText||e.greeting)&&a.jsxs("div",{className:"rag-chat-greeting",children:[e.uspText&&a.jsx("p",{className:"rag-chat-usp-text",children:e.uspText}),e.greeting&&a.jsx("p",{className:"rag-chat-greeting-text",children:e.greeting})]}),t.map(e=>a.jsxs("div",{className:`rag-chat-message ${e.role}`,children:[e.isStreaming&&!e.content?a.jsxs("div",{className:"rag-chat-loading",children:[a.jsx("div",{className:"rag-chat-loading-dot"}),a.jsx("div",{className:"rag-chat-loading-dot"}),a.jsx("div",{className:"rag-chat-loading-dot"})]}):a.jsx("p",{className:"rag-chat-message-content",children:e.content}),e.sources&&e.sources.length>0&&a.jsxs("div",{className:"rag-chat-message-sources",children:[a.jsx("div",{className:"rag-chat-message-sources-title",children:"Sources:"}),e.sources.map((e,r)=>a.jsx("div",{className:"rag-chat-message-source",children:e.title},r))]})]},e.id)),a.jsx("div",{ref:c})]}),a.jsxs("form",{className:"rag-chat-input-container",onSubmit:g,children:[a.jsx("textarea",{ref:l,className:"rag-chat-input",value:i,onChange:e=>n(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),g(e))},placeholder:e.placeholder||"Type a message...",rows:1,maxLength:e.allowedMessageLength||2e3,disabled:o}),a.jsx("button",{type:"submit",className:"rag-chat-send-button",disabled:!i.trim()||o,style:{backgroundColor:e.primaryColor},"aria-label":"Send message",children:a.jsx("svg",{viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:a.jsx("path",{d:"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"})})})]}),e.showPoweredBy&&a.jsxs("div",{className:"rag-chat-powered-by",children:["Powered by ",a.jsx("a",{href:"https://rag-widget.com",target:"_blank",rel:"noopener noreferrer",children:"RAG Widget"})]})]})},b=()=>a.jsx("svg",{viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:a.jsx("path",{fill:"currentColor",d:"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"})}),w=()=>a.jsx("svg",{viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg",children:a.jsx("path",{d:"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z"})}),v=()=>a.jsxs("div",{className:"rag-chat-loading",children:[a.jsx("div",{className:"rag-chat-loading-dot"}),a.jsx("div",{className:"rag-chat-loading-dot"}),a.jsx("div",{className:"rag-chat-loading-dot"})]}),k=({message:e})=>a.jsxs("div",{className:`rag-chat-message ${e.role}`,children:[e.isStreaming&&!e.content?a.jsx(v,{}):a.jsx("p",{className:"rag-chat-message-content",children:e.content}),e.sources&&e.sources.length>0&&a.jsxs("div",{className:"rag-chat-message-sources",children:[a.jsx("div",{className:"rag-chat-message-sources-title",children:"Sources:"}),e.sources.map((e,r)=>a.jsx("div",{className:"rag-chat-message-source",children:e.title},r))]})]}),y=r.createContext(null);e.BookmarksRow=x,e.ChatBubble=n,e.ChatWidget=m,e.ChatWidgetProvider=({apiKey:e,widgetId:s,apiBaseUrl:i="",onError:n,onMessageSent:c,onMessageReceived:l,children:g})=>{var d,h,p;const x=t({apiKey:e,widgetId:s,apiBaseUrl:i||("undefined"!=typeof window?window.location.origin:""),onError:n,onMessageSent:c,onMessageReceived:l}),u=null!==(p=null===(h=null===(d=x.config)||void 0===d?void 0:d.homeView)||void 0===h?void 0:h.enabled)&&void 0!==p&&p,m=o(u?"home":"chat"),f=r.useMemo(()=>({messages:x.messages,isLoading:x.isLoading,isConnected:x.isConnected,config:x.config,error:x.error,sendMessage:x.sendMessage,clearMessages:x.clearMessages,retry:x.retry,currentView:m.currentView,previousView:m.previousView,canGoBack:m.canGoBack,navigateToChat:m.navigateToChat,navigateToHome:m.navigateToHome,goBack:m.goBack}),[x,m]);return a.jsx(y.Provider,{value:f,children:g})},e.ChatWindow=({isOpen:e,onClose:t,config:o,messages:s,isLoading:i,onSendMessage:n})=>{const[c,l]=r.useState(""),g=r.useRef(null),d=r.useRef(null);r.useEffect(()=>{var e;null===(e=g.current)||void 0===e||e.scrollIntoView({behavior:"smooth"})},[s]),r.useEffect(()=>{var a;e&&(null===(a=d.current)||void 0===a||a.focus())},[e]);const h=e=>{e.preventDefault(),c.trim()&&!i&&(n(c.trim()),l(""))};if(!e)return null;const p=(null==o?void 0:o.position)||"bottom-right",x=(null==o?void 0:o.primaryColor)||"#007bff";return a.jsxs("div",{className:`rag-chat-window ${p}`,style:{"--rag-primary-color":x},children:[a.jsxs("div",{className:"rag-chat-header",style:{backgroundColor:x},children:[a.jsx("h3",{className:"rag-chat-header-title",children:(null==o?void 0:o.name)||"Chat"}),a.jsx("button",{className:"rag-chat-header-close",onClick:t,"aria-label":"Close chat",type:"button",children:a.jsx(b,{})})]}),a.jsxs("div",{className:"rag-chat-messages",children:[0===s.length&&((null==o?void 0:o.uspText)||(null==o?void 0:o.greeting))&&a.jsxs("div",{className:"rag-chat-greeting",children:[(null==o?void 0:o.uspText)&&a.jsx("p",{className:"rag-chat-usp-text",children:o.uspText}),(null==o?void 0:o.greeting)&&a.jsx("p",{className:"rag-chat-greeting-text",children:o.greeting})]}),s.map(e=>a.jsx(k,{message:e},e.id)),a.jsx("div",{ref:g})]}),a.jsxs("form",{className:"rag-chat-input-container",onSubmit:h,children:[a.jsx("textarea",{ref:d,className:"rag-chat-input",value:c,onChange:e=>l(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),h(e))},placeholder:(null==o?void 0:o.placeholder)||"Type a message...",rows:1,maxLength:(null==o?void 0:o.allowedMessageLength)||2e3,disabled:i}),a.jsx("button",{type:"submit",className:"rag-chat-send-button",disabled:!c.trim()||i,style:{backgroundColor:x},"aria-label":"Send message",children:a.jsx(w,{})})]}),(null==o?void 0:o.showPoweredBy)&&a.jsxs("div",{className:"rag-chat-powered-by",children:["Powered by ",a.jsx("a",{href:"https://rag-widget.com",target:"_blank",rel:"noopener noreferrer",children:"RAG Widget"})]})]})},e.HeaderSection=c,e.HomeView=u,e.StartChatCard=d,e.TicketCategoryList=p,e.default=m,e.useChatWidget=t,e.useChatWidgetContext=()=>{const e=r.useContext(y);if(!e)throw new Error("useChatWidgetContext must be used within a ChatWidgetProvider");return e},e.useViewNavigation=o,Object.defineProperty(e,"__esModule",{value:!0})});
2
2
  //# sourceMappingURL=index.umd.js.map