@channlize/react 0.1.0-alpha.2 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context/ChannlizeContext.tsx","../src/hooks/useContactForm.ts","../src/hooks/useChatSession.ts","../src/components/Form.tsx","../src/components/ContactForm.tsx","../src/components/SupportChat.tsx","../src/components/ChannlizeChat.tsx"],"sourcesContent":["import { createContext, useContext, ReactNode } from 'react';\nimport { ChannlizeClient, ChannlizeConfig } from '@channlize/core';\n\ninterface ChannlizeContextValue {\n client: ChannlizeClient;\n config: ChannlizeConfig;\n}\n\nconst ChannlizeContext = createContext<ChannlizeContextValue | null>(null);\n\nexport interface ChannlizeProviderProps {\n config: ChannlizeConfig;\n children: ReactNode;\n}\n\n/**\n * Provider component that makes Channlize client available to all child components\n */\nexport function ChannlizeProvider({ config, children }: ChannlizeProviderProps) {\n const client = new ChannlizeClient(config);\n\n return (\n <ChannlizeContext.Provider value={{ client, config }}>\n {children}\n </ChannlizeContext.Provider>\n );\n}\n\n/**\n * Hook to access the Channlize client and configuration\n */\nexport function useChannlize(): ChannlizeContextValue {\n const context = useContext(ChannlizeContext);\n \n if (!context) {\n throw new Error('useChannlize must be used within a ChannlizeProvider');\n }\n \n return context;\n}\n","import { useState, useCallback } from 'react';\nimport { useChannlize } from '../context/ChannlizeContext';\nimport type { ContactFormData, CreateContactResponse, ChannlizeError } from '@channlize/core';\n\nexport interface UseContactFormOptions {\n onSuccess?: (response: CreateContactResponse) => void;\n onError?: (error: ChannlizeError) => void;\n}\n\nexport interface UseContactFormReturn {\n submit: (data: ContactFormData) => Promise<void>;\n isSubmitting: boolean;\n isSuccess: boolean;\n error: ChannlizeError | null;\n reset: () => void;\n}\n\n/**\n * Hook for handling contact form submissions\n */\nexport function useContactForm(options: UseContactFormOptions = {}): UseContactFormReturn {\n const { client } = useChannlize();\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isSuccess, setIsSuccess] = useState(false);\n const [error, setError] = useState<ChannlizeError | null>(null);\n\n const submit = useCallback(\n async (data: ContactFormData) => {\n setIsSubmitting(true);\n setError(null);\n setIsSuccess(false);\n\n try {\n const response = await client.submitContactForm(data);\n setIsSuccess(true);\n options.onSuccess?.(response);\n } catch (err) {\n const error = err as ChannlizeError;\n setError(error);\n options.onError?.(error);\n } finally {\n setIsSubmitting(false);\n }\n },\n [client, options]\n );\n\n const reset = useCallback(() => {\n setIsSubmitting(false);\n setIsSuccess(false);\n setError(null);\n }, []);\n\n return {\n submit,\n isSubmitting,\n isSuccess,\n error,\n reset,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useChannlize } from '../context/ChannlizeContext';\nimport type {\n ChatSession,\n ChatMessage,\n CreateChatSessionResponse,\n ChannlizeError,\n} from '@channlize/core';\n\nexport interface UseChatSessionOptions {\n autoConnect?: boolean;\n metadata?: Record<string, unknown>;\n onMessage?: (message: ChatMessage) => void;\n onError?: (error: ChannlizeError) => void;\n sessionId?: string; // Optional: Resume existing session\n persistSession?: boolean; // Whether to persist session in localStorage\n storageKey?: string; // Custom localStorage key\n}\n\nexport interface UseChatSessionReturn {\n session: ChatSession | null;\n messages: ChatMessage[];\n isConnecting: boolean;\n isConnected: boolean;\n error: ChannlizeError | null;\n sendMessage: (content: string, attachments?: File[]) => Promise<void>;\n startSession: () => Promise<void>;\n endSession: () => Promise<void>;\n}\n\n/**\n * Hook for managing chat sessions with real-time messaging\n */\nexport function useChatSession(options: UseChatSessionOptions = {}): UseChatSessionReturn {\n const { client, config } = useChannlize();\n const [session, setSession] = useState<ChatSession | null>(null);\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isConnecting, setIsConnecting] = useState(false);\n const [isConnected, setIsConnected] = useState(false);\n const [error, setError] = useState<ChannlizeError | null>(null);\n \n const eventSourceRef = useRef<EventSource | null>(null);\n const sessionRef = useRef<ChatSession | null>(null);\n const isInitializedRef = useRef(false);\n const baseUrl = config.baseUrl || 'https://api.channlize.com';\n \n const storageKey = options.storageKey || `channlize_session_${config.apiKey}`;\n const persistSession = options.persistSession ?? true; // Default to true\n\n // Update ref when session changes\n useEffect(() => {\n sessionRef.current = session;\n }, [session]);\n\n // LocalStorage helpers\n const saveSessionToStorage = useCallback((sessionId: string) => {\n if (persistSession && typeof window !== 'undefined') {\n try {\n localStorage.setItem(storageKey, sessionId);\n } catch (err) {\n console.warn('Failed to save session to localStorage:', err);\n }\n }\n }, [persistSession, storageKey]);\n\n const getSessionFromStorage = useCallback((): string | null => {\n if (persistSession && typeof window !== 'undefined') {\n try {\n return localStorage.getItem(storageKey);\n } catch (err) {\n console.warn('Failed to get session from localStorage:', err);\n }\n }\n return null;\n }, [persistSession, storageKey]);\n\n const clearSessionFromStorage = useCallback(() => {\n if (persistSession && typeof window !== 'undefined') {\n try {\n localStorage.removeItem(storageKey);\n } catch (err) {\n console.warn('Failed to clear session from localStorage:', err);\n }\n }\n }, [persistSession, storageKey]);\n\n const connectToSSE = useCallback((sseEndpoint: string) => {\n if (eventSourceRef.current) {\n eventSourceRef.current.close();\n }\n\n // Construct full URL for SSE endpoint\n const fullUrl = sseEndpoint.startsWith('http') \n ? sseEndpoint \n : `${baseUrl}${sseEndpoint}`;\n \n console.log('[Channlize SSE] Connecting to:', fullUrl);\n \n const eventSource = new EventSource(fullUrl);\n eventSourceRef.current = eventSource;\n\n eventSource.onopen = () => {\n console.log('[Channlize SSE] Connection opened');\n setIsConnected(true);\n setError(null);\n };\n\n // Listen for 'connected' event\n eventSource.addEventListener('connected', (event) => {\n console.log('SSE connected:', event.data);\n });\n\n // Listen for 'message' event (custom event type from backend)\n eventSource.addEventListener('message', (event: MessageEvent) => {\n try {\n console.log('SSE message:', event.data);\n const message = JSON.parse(event.data);\n \n // Backend sends message object directly in event.data\n const chatMessage: ChatMessage = {\n ...message,\n timestamp: message.timestamp ? new Date(message.timestamp) : new Date(),\n };\n \n // Add message only if it doesn't already exist (avoid duplicates from optimistic updates)\n setMessages(prev => {\n const exists = prev.some(m => m.id === chatMessage.id);\n return exists ? prev : [...prev, chatMessage];\n });\n options.onMessage?.(chatMessage);\n } catch (err) {\n console.warn('Failed to parse SSE message:', err, event.data);\n }\n });\n\n // Also handle default onmessage for backwards compatibility\n eventSource.onmessage = (event) => {\n try {\n const data = JSON.parse(event.data);\n \n // Handle wrapped format: {type: 'message', message: {...}}\n if (data.type === 'message' && data.message) {\n const message: ChatMessage = {\n ...data.message,\n timestamp: data.message.timestamp ? new Date(data.message.timestamp) : new Date(),\n };\n \n setMessages(prev => {\n const exists = prev.some(m => m.id === message.id);\n return exists ? prev : [...prev, message];\n });\n options.onMessage?.(message);\n }\n } catch (err) {\n console.warn('Failed to parse default SSE message:', err);\n }\n };\n\n eventSource.onerror = (event) => {\n console.error('[Channlize SSE] Connection error', {\n readyState: eventSource.readyState,\n url: fullUrl,\n event,\n });\n \n // ReadyState: 0 = CONNECTING, 1 = OPEN, 2 = CLOSED\n const stateMessage = eventSource.readyState === 0 \n ? 'Failed to connect (CONNECTING)' \n : eventSource.readyState === 1\n ? 'Connection error while OPEN'\n : 'Connection closed';\n \n setIsConnected(false);\n eventSource.close();\n eventSourceRef.current = null;\n const error = new Error(`SSE ${stateMessage}`) as ChannlizeError;\n error.code = 'SSE_ERROR';\n setError(error);\n options.onError?.(error);\n };\n }, [baseUrl, options.onError, options.onMessage]);\n\n const startSession = useCallback(async () => {\n if (isConnecting || session) return;\n\n setIsConnecting(true);\n setError(null);\n\n try {\n // Check for existing session ID (from options or localStorage)\n const existingSessionId = options.sessionId || getSessionFromStorage();\n \n if (existingSessionId) {\n // Try to resume existing session\n try {\n console.log('📦 Resuming session from storage:', existingSessionId);\n const existingSession = await client.getChatSession(existingSessionId);\n const existingMessages = await client.getChatMessages(existingSessionId);\n \n setSession(existingSession);\n \n // Normalize message timestamps\n const normalizedMessages = existingMessages.map(msg => ({\n ...msg,\n timestamp: msg.timestamp ? new Date(msg.timestamp) : new Date()\n }));\n setMessages(normalizedMessages);\n \n // Reconnect to SSE\n const sseEndpoint = `/v1/chat/sessions/${existingSessionId}/events`;\n connectToSSE(sseEndpoint);\n \n console.log('✅ Session resumed successfully');\n return;\n } catch (err) {\n console.warn('⚠️ Failed to resume session, creating new one:', err);\n // Clear invalid session from storage\n clearSessionFromStorage();\n }\n }\n \n // Create new session\n console.log('🆕 Creating new chat session');\n const response: CreateChatSessionResponse = await client.createChatSession(options.metadata);\n \n setSession(response.session);\n \n // Save session ID to localStorage\n saveSessionToStorage(response.session.id);\n \n // Normalize message timestamps to ensure they're valid Date objects\n const normalizedMessages = (response.session.messages || []).map(msg => ({\n ...msg,\n timestamp: msg.timestamp ? new Date(msg.timestamp) : new Date()\n }));\n setMessages(normalizedMessages);\n \n if (response.sseEndpoint) {\n connectToSSE(response.sseEndpoint);\n }\n \n console.log('✅ New session created:', response.session.id);\n } catch (err) {\n const error = err as ChannlizeError;\n setError(error);\n options.onError?.(error);\n } finally {\n setIsConnecting(false);\n }\n }, [client, connectToSSE, options.metadata, options.onError, options.sessionId, getSessionFromStorage, saveSessionToStorage, clearSessionFromStorage, isConnecting, session]);\n\n const sendMessage = useCallback(\n async (content: string, attachments?: File[]) => {\n if (!sessionRef.current) {\n throw new Error('No active chat session');\n }\n\n try {\n const response = await client.sendMessage(\n sessionRef.current.id,\n content,\n attachments\n );\n \n // Only add if not already present (SSE might have already added it)\n setMessages(prev => {\n const exists = prev.some(m => m.id === response.message.id);\n if (exists) return prev;\n \n const message = {\n ...response.message,\n timestamp: response.message.timestamp \n ? new Date(response.message.timestamp)\n : new Date()\n };\n return [...prev, message];\n });\n } catch (err) {\n const error = err as ChannlizeError;\n setError(error);\n options.onError?.(error);\n throw error;\n }\n },\n [client, options.onError]\n );\n\n const endSession = useCallback(async () => {\n if (!sessionRef.current) return;\n\n try {\n await client.closeChatSession(sessionRef.current.id);\n \n if (eventSourceRef.current) {\n eventSourceRef.current.close();\n eventSourceRef.current = null;\n }\n \n // Clear session from localStorage\n clearSessionFromStorage();\n \n setSession(null);\n setMessages([]);\n setIsConnected(false);\n \n console.log('✅ Session ended and cleared from storage');\n } catch (err) {\n const error = err as ChannlizeError;\n setError(error);\n options.onError?.(error);\n }\n }, [client, options.onError, clearSessionFromStorage]);\n\n // Auto-connect when autoConnect becomes true\n useEffect(() => {\n if (options.autoConnect && !session && !isConnecting && !isInitializedRef.current) {\n isInitializedRef.current = true;\n startSession();\n }\n \n return () => {\n if (eventSourceRef.current) {\n eventSourceRef.current.close();\n }\n };\n }, [options.autoConnect, session, isConnecting, startSession]);\n\n return {\n session,\n messages,\n isConnecting,\n isConnected,\n error,\n sendMessage,\n startSession,\n endSession,\n };\n}\n","import { useState, FormEvent } from 'react';\nimport { useContactForm } from '../hooks/useContactForm';\nimport type { ContactFormData } from '@channlize/core';\n\nexport interface FormProps {\n /** Custom fields to include in the form */\n customFields?: Array<{\n name: string;\n label: string;\n type: 'text' | 'email' | 'textarea' | 'select';\n required?: boolean;\n options?: string[]; // For select fields\n }>;\n /** Callback when form is successfully submitted */\n onSuccess?: () => void;\n /** Callback when form submission fails */\n onError?: (error: Error) => void;\n /** Custom CSS classes */\n className?: string;\n /** Custom styles for form elements */\n styles?: {\n form?: React.CSSProperties;\n field?: React.CSSProperties;\n label?: React.CSSProperties;\n input?: React.CSSProperties;\n textarea?: React.CSSProperties;\n button?: React.CSSProperties;\n error?: React.CSSProperties;\n success?: React.CSSProperties;\n };\n /** Button text */\n submitText?: string;\n /** Success message */\n successMessage?: string;\n}\n\n/**\n * Form component that submits inquiries to Channlize\n */\nexport function Form({\n customFields = [],\n onSuccess,\n onError,\n className = '',\n styles = {},\n submitText = 'Send Message',\n successMessage = 'Thank you! Your message has been sent.',\n}: FormProps) {\n const [formData, setFormData] = useState<Partial<ContactFormData>>({\n name: '',\n email: '',\n subject: '',\n message: '',\n customFields: {},\n });\n\n const { submit, isSubmitting, isSuccess, error, reset } = useContactForm({\n onSuccess: () => {\n setFormData({\n name: '',\n email: '',\n subject: '',\n message: '',\n customFields: {},\n });\n onSuccess?.();\n },\n onError,\n });\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n \n if (!formData.name || !formData.email || !formData.message) {\n return;\n }\n\n await submit(formData as ContactFormData);\n };\n\n const handleInputChange = (field: keyof ContactFormData, value: string) => {\n setFormData(prev => ({ ...prev, [field]: value }));\n };\n\n const handleCustomFieldChange = (fieldName: string, value: string) => {\n setFormData(prev => ({\n ...prev,\n customFields: {\n ...prev.customFields,\n [fieldName]: value,\n },\n }));\n };\n\n if (isSuccess) {\n return (\n <div className={`channlize-form-success ${className}`} style={styles.success}>\n <p>{successMessage}</p>\n <button\n type=\"button\"\n onClick={reset}\n style={styles.button}\n >\n Send Another Message\n </button>\n </div>\n );\n }\n\n return (\n <form\n className={`channlize-form ${className}`}\n style={styles.form}\n onSubmit={handleSubmit}\n >\n <div className=\"channlize-field\" style={styles.field}>\n <label htmlFor=\"channlize-name\" style={styles.label}>\n Name *\n </label>\n <input\n id=\"channlize-name\"\n type=\"text\"\n value={formData.name || ''}\n onChange={e => handleInputChange('name', e.target.value)}\n required\n style={styles.input}\n />\n </div>\n\n <div className=\"channlize-field\" style={styles.field}>\n <label htmlFor=\"channlize-email\" style={styles.label}>\n Email *\n </label>\n <input\n id=\"channlize-email\"\n type=\"email\"\n value={formData.email || ''}\n onChange={e => handleInputChange('email', e.target.value)}\n required\n style={styles.input}\n />\n </div>\n\n <div className=\"channlize-field\" style={styles.field}>\n <label htmlFor=\"channlize-subject\" style={styles.label}>\n Subject\n </label>\n <input\n id=\"channlize-subject\"\n type=\"text\"\n value={formData.subject || ''}\n onChange={e => handleInputChange('subject', e.target.value)}\n style={styles.input}\n />\n </div>\n\n {customFields.map(field => (\n <div key={field.name} className=\"channlize-field\" style={styles.field}>\n <label htmlFor={`channlize-${field.name}`} style={styles.label}>\n {field.label} {field.required && '*'}\n </label>\n \n {field.type === 'select' ? (\n <select\n id={`channlize-${field.name}`}\n value={formData.customFields?.[field.name] as string || ''}\n onChange={e => handleCustomFieldChange(field.name, e.target.value)}\n required={field.required}\n style={styles.input}\n >\n <option value=\"\">Select...</option>\n {field.options?.map(option => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n ) : field.type === 'textarea' ? (\n <textarea\n id={`channlize-${field.name}`}\n value={formData.customFields?.[field.name] as string || ''}\n onChange={e => handleCustomFieldChange(field.name, e.target.value)}\n required={field.required}\n style={styles.textarea}\n />\n ) : (\n <input\n id={`channlize-${field.name}`}\n type={field.type}\n value={formData.customFields?.[field.name] as string || ''}\n onChange={e => handleCustomFieldChange(field.name, e.target.value)}\n required={field.required}\n style={styles.input}\n />\n )}\n </div>\n ))}\n\n <div className=\"channlize-field\" style={styles.field}>\n <label htmlFor=\"channlize-message\" style={styles.label}>\n Message *\n </label>\n <textarea\n id=\"channlize-message\"\n value={formData.message || ''}\n onChange={e => handleInputChange('message', e.target.value)}\n required\n rows={4}\n style={styles.textarea}\n />\n </div>\n\n {error && (\n <div className=\"channlize-error\" style={styles.error}>\n {error.message}\n </div>\n )}\n\n <button\n type=\"submit\"\n disabled={isSubmitting}\n style={styles.button}\n >\n {isSubmitting ? 'Sending...' : submitText}\n </button>\n </form>\n );\n}\n\n\n","import { Form, FormProps } from './Form';\n\n/**\n * ContactForm component - Alias for Form component\n * Provides a form for collecting contact information and messages\n */\nexport function ContactForm(props: FormProps) {\n return <Form {...props} />;\n}\n\n// Re-export FormProps as ContactFormProps for convenience\nexport type ContactFormProps = FormProps;\n\n","import { useState, useEffect, useRef, FormEvent } from 'react';\nimport { useChatSession, UseChatSessionOptions } from '../hooks/useChatSession';\nimport type { ChatMessage } from '@channlize/core';\n\nexport interface SupportChatProps extends UseChatSessionOptions {\n /** Custom CSS classes */\n className?: string;\n /** Custom styles for chat elements */\n styles?: {\n container?: React.CSSProperties;\n header?: React.CSSProperties;\n messagesContainer?: React.CSSProperties;\n message?: React.CSSProperties;\n userMessage?: React.CSSProperties;\n agentMessage?: React.CSSProperties;\n inputContainer?: React.CSSProperties;\n input?: React.CSSProperties;\n button?: React.CSSProperties;\n error?: React.CSSProperties;\n timestamp?: React.CSSProperties;\n };\n /** Placeholder text for message input */\n placeholder?: string;\n /** Header title */\n title?: string;\n /** Button text */\n sendButtonText?: string;\n /** Show timestamps on messages */\n showTimestamps?: boolean;\n /** Allow file attachments */\n allowAttachments?: boolean;\n}\n\n/**\n * SupportChat component - Real-time chat interface\n * Provides a complete chat UI with message history and real-time updates\n */\nexport function SupportChat({\n autoConnect = true,\n metadata,\n onMessage,\n onError,\n sessionId,\n persistSession,\n storageKey,\n className = '',\n styles = {},\n placeholder = 'Type your message...',\n title = 'Support Chat',\n sendButtonText = 'Send',\n showTimestamps = true,\n allowAttachments = false,\n}: SupportChatProps) {\n const [messageInput, setMessageInput] = useState('');\n const [attachments, setAttachments] = useState<File[]>([]);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n const {\n session,\n messages,\n isConnecting,\n isConnected,\n error,\n sendMessage,\n startSession,\n endSession,\n } = useChatSession({\n autoConnect,\n metadata,\n onMessage,\n onError,\n sessionId,\n persistSession,\n storageKey,\n });\n\n // Auto-scroll to bottom when new messages arrive\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages]);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n \n if (!messageInput.trim() && attachments.length === 0) return;\n\n try {\n await sendMessage(messageInput, attachments.length > 0 ? attachments : undefined);\n setMessageInput('');\n setAttachments([]);\n } catch (err) {\n console.error('Failed to send message:', err);\n }\n };\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files) {\n setAttachments(Array.from(e.target.files));\n }\n };\n\n const formatTimestamp = (date: Date) => {\n // Check if date is valid\n if (!date || isNaN(date.getTime())) {\n return '';\n }\n \n try {\n return new Intl.DateTimeFormat('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n }).format(date);\n } catch (error) {\n console.warn('Failed to format timestamp:', error);\n return '';\n }\n };\n\n if (!session && !isConnecting) {\n return (\n <div className={`channlize-chat-container ${className}`} style={styles.container}>\n <div className=\"channlize-chat-header\" style={styles.header}>\n <h3>{title}</h3>\n </div>\n <div className=\"channlize-chat-start\">\n <button onClick={startSession} style={styles.button}>\n Start Chat\n </button>\n </div>\n {error && (\n <div className=\"channlize-error\" style={styles.error}>\n {error.message}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div className={`channlize-chat-container ${className}`} style={styles.container}>\n <div className=\"channlize-chat-header\" style={styles.header}>\n <h3>{title}</h3>\n <div className=\"channlize-chat-status\" style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n {isConnecting && (\n <>\n <span style={{ \n display: 'inline-block',\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: '#f59e0b',\n }} />\n <span>Connecting...</span>\n </>\n )}\n {isConnected && (\n <>\n <span style={{ \n display: 'inline-block',\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: '#10b981',\n }} />\n <span>Connected</span>\n </>\n )}\n {!isConnected && !isConnecting && (\n <>\n <span style={{ \n display: 'inline-block',\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: '#ef4444',\n }} />\n <span>Disconnected</span>\n </>\n )}\n </div>\n {session && (\n <button\n onClick={endSession}\n style={{ ...styles.button, fontSize: '0.875rem' }}\n type=\"button\"\n >\n End Chat\n </button>\n )}\n </div>\n\n <div className=\"channlize-messages\" style={styles.messagesContainer}>\n {messages.length === 0 && (\n <div style={{ textAlign: 'center', padding: '2rem', color: '#666' }}>\n No messages yet. Start the conversation!\n </div>\n )}\n \n {messages.map((message: ChatMessage, index: number) => (\n <div\n key={message.id || index}\n className={`channlize-message ${\n message.author === 'user' ? 'channlize-message-user' : 'channlize-message-agent'\n }`}\n style={{\n ...styles.message,\n ...(message.author === 'user' ? styles.userMessage : styles.agentMessage),\n }}\n >\n <div className=\"channlize-message-content\">\n {message.content}\n </div>\n {showTimestamps && (\n <div className=\"channlize-message-timestamp\" style={styles.timestamp}>\n {formatTimestamp(message.timestamp)}\n </div>\n )}\n </div>\n ))}\n <div ref={messagesEndRef} />\n </div>\n\n {error && (\n <div className=\"channlize-error\" style={styles.error}>\n {error.message}\n </div>\n )}\n\n <form\n className=\"channlize-chat-input-container\"\n style={styles.inputContainer}\n onSubmit={handleSubmit}\n >\n {allowAttachments && (\n <div>\n <input\n type=\"file\"\n multiple\n onChange={handleFileChange}\n style={{ fontSize: '0.875rem' }}\n />\n {attachments.length > 0 && (\n <div style={{ fontSize: '0.75rem', marginTop: '0.25rem' }}>\n {attachments.length} file(s) selected\n </div>\n )}\n </div>\n )}\n \n <div style={{ display: 'flex', gap: '0.5rem' }}>\n <input\n type=\"text\"\n value={messageInput}\n onChange={e => setMessageInput(e.target.value)}\n placeholder={placeholder}\n disabled={!session || isConnecting}\n style={{ ...styles.input, flex: 1 }}\n />\n <button\n type=\"submit\"\n disabled={!session || isConnecting || (!messageInput.trim() && attachments.length === 0)}\n style={styles.button}\n >\n {sendButtonText}\n </button>\n </div>\n </form>\n </div>\n );\n}\n\n","import { useState, useEffect, ReactNode } from 'react';\nimport { ChannlizeProvider } from '../context/ChannlizeContext';\nimport { SupportChat } from './SupportChat';\nimport type { ChannlizeConfig } from '@channlize/core';\nimport type { SupportChatProps } from './SupportChat';\n\nexport interface ChannlizeChatProps {\n /** Channlize configuration */\n config: ChannlizeConfig;\n \n /** Position of the floating button */\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n \n /** Offset from edges in pixels */\n offset?: { x?: number; y?: number };\n \n /** Custom button element (overrides default button) */\n buttonElement?: ReactNode;\n \n /** Custom button icon (only used if buttonElement is not provided) */\n buttonIcon?: ReactNode;\n \n /** Button size in pixels */\n buttonSize?: number;\n \n /** Button colors */\n buttonColors?: {\n background?: string;\n hover?: string;\n text?: string;\n };\n \n /** Chat window props (passed to SupportChat) */\n chatProps?: Omit<SupportChatProps, 'autoConnect'>;\n \n /** Whether to start closed or open */\n defaultOpen?: boolean;\n \n /** Whether to show badge with unread count */\n showBadge?: boolean;\n \n /** Unread count (for badge) */\n unreadCount?: number;\n \n /** Custom z-index */\n zIndex?: number;\n \n /** Whether to show on mobile */\n showOnMobile?: boolean;\n \n /** Callback when chat opens */\n onOpen?: () => void;\n \n /** Callback when chat closes */\n onClose?: () => void;\n \n /** Whether to enable animations */\n enableAnimations?: boolean;\n \n /** Custom class for button container */\n buttonClassName?: string;\n \n /** Custom class for chat container */\n chatClassName?: string;\n}\n\n/**\n * ChannlizeChat - All-in-one floating chat widget with provider\n * \n * Drop this component anywhere in your React app for instant live chat support.\n * Includes the provider, floating button, and chat window.\n * \n * @example\n * ```tsx\n * <ChannlizeChat\n * config={{\n * apiKey: \"your-widget-key\",\n * projectId: \"your-project-id\",\n * }}\n * position=\"bottom-right\"\n * chatProps={{\n * title: \"Customer Support\",\n * placeholder: \"How can we help?\"\n * }}\n * />\n * ```\n */\nexport function ChannlizeChat({\n config,\n position = 'bottom-right',\n offset = { x: 24, y: 24 },\n buttonElement,\n buttonIcon,\n buttonSize = 56,\n buttonColors = {\n background: '#3b82f6',\n hover: '#2563eb',\n text: '#ffffff',\n },\n chatProps = {},\n defaultOpen = false,\n showBadge = false,\n unreadCount = 0,\n zIndex = 1000,\n showOnMobile = true,\n onOpen,\n onClose,\n enableAnimations = true,\n buttonClassName = '',\n chatClassName = '',\n}: ChannlizeChatProps) {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n const [isMounted, setIsMounted] = useState(false);\n const [isDarkMode, setIsDarkMode] = useState(false);\n\n // Only render on client to avoid hydration mismatch\n useEffect(() => {\n setIsMounted(true);\n }, []);\n\n // Detect dark mode preference\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n setIsDarkMode(mediaQuery.matches);\n\n const handler = (e: MediaQueryListEvent) => setIsDarkMode(e.matches);\n mediaQuery.addEventListener('change', handler);\n return () => mediaQuery.removeEventListener('change', handler);\n }, []);\n\n // Don't render on server to avoid hydration issues\n if (!isMounted) {\n return null;\n }\n\n const handleToggle = () => {\n const newState = !isOpen;\n setIsOpen(newState);\n \n if (newState) {\n onOpen?.();\n // Start session when chat is opened\n // The session will be started by the SupportChat component with autoConnect based on isOpen\n } else {\n onClose?.();\n }\n };\n\n // Calculate position styles\n const positionStyles: React.CSSProperties = {\n position: 'fixed',\n zIndex,\n ...(position.includes('bottom') ? { bottom: `${offset.y}px` } : { top: `${offset.y}px` }),\n ...(position.includes('right') ? { right: `${offset.x}px` } : { left: `${offset.x}px` }),\n };\n\n const buttonStyle: React.CSSProperties = {\n width: `${buttonSize}px`,\n height: `${buttonSize}px`,\n borderRadius: '50%',\n backgroundColor: buttonColors.background,\n color: buttonColors.text,\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n transition: enableAnimations ? 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)' : 'none',\n transform: enableAnimations && isOpen ? 'scale(0.9)' : 'scale(1)',\n };\n\n const chatContainerStyle: React.CSSProperties = {\n ...positionStyles,\n opacity: isOpen ? 1 : 0,\n visibility: isOpen ? 'visible' : 'hidden',\n transform: enableAnimations \n ? isOpen ? 'scale(1) translateY(0)' : 'scale(0.95) translateY(10px)'\n : 'none',\n transition: enableAnimations \n ? 'opacity 0.2s, transform 0.2s, visibility 0.2s'\n : 'none',\n };\n\n const defaultIcon = (\n <svg\n width={buttonSize * 0.5}\n height={buttonSize * 0.5}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {isOpen ? (\n <>\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </>\n ) : (\n <>\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n <path d=\"M8 10h.01\" />\n <path d=\"M12 10h.01\" />\n <path d=\"M16 10h.01\" />\n </>\n )}\n </svg>\n );\n\n return (\n <ChannlizeProvider config={config}>\n {/* Floating Button */}\n {!isOpen && (\n <div\n style={{\n ...positionStyles,\n display: !showOnMobile && typeof window !== 'undefined' && window.innerWidth < 768 ? 'none' : 'block',\n }}\n className={buttonClassName}\n >\n {buttonElement ? (\n <div onClick={handleToggle} style={{ cursor: 'pointer' }}>\n {buttonElement}\n </div>\n ) : (\n <button\n onClick={handleToggle}\n style={buttonStyle}\n onMouseEnter={(e) => {\n if (enableAnimations) {\n e.currentTarget.style.backgroundColor = buttonColors.hover || buttonColors.background || '#2563eb';\n e.currentTarget.style.transform = 'scale(1.05)';\n }\n }}\n onMouseLeave={(e) => {\n if (enableAnimations) {\n e.currentTarget.style.backgroundColor = buttonColors.background || '#3b82f6';\n e.currentTarget.style.transform = 'scale(1)';\n }\n }}\n aria-label={isOpen ? 'Close chat' : 'Open chat'}\n >\n {buttonIcon || defaultIcon}\n {showBadge && unreadCount > 0 && (\n <span\n style={{\n position: 'absolute',\n top: '-4px',\n right: '-4px',\n backgroundColor: '#ef4444',\n color: 'white',\n borderRadius: '10px',\n padding: '2px 6px',\n fontSize: '12px',\n fontWeight: '600',\n minWidth: '20px',\n textAlign: 'center',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)',\n }}\n >\n {unreadCount > 99 ? '99+' : unreadCount}\n </span>\n )}\n </button>\n )}\n </div>\n )}\n\n {/* Chat Window */}\n <div\n style={chatContainerStyle}\n className={chatClassName}\n >\n <SupportChat\n autoConnect={isOpen}\n persistSession={true}\n title=\"Support Chat\"\n placeholder=\"Type your message...\"\n showTimestamps={true}\n {...chatProps}\n styles={{\n container: {\n width: '384px',\n height: '600px',\n maxHeight: 'calc(100vh - 120px)',\n borderRadius: '16px',\n overflow: 'hidden',\n boxShadow: isDarkMode \n ? '0 20px 25px -5px rgb(0 0 0 / 0.4), 0 8px 10px -6px rgb(0 0 0 / 0.5)'\n : '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)',\n backgroundColor: isDarkMode ? '#1f2937' : '#ffffff',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n ...chatProps.styles?.container,\n },\n header: {\n background: 'linear-gradient(135deg, #3b82f6 0%, #9333ea 100%)',\n padding: '20px',\n borderRadius: '16px 16px 0 0',\n color: 'white',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n ...chatProps.styles?.header,\n },\n messagesContainer: {\n flex: 1,\n overflowY: 'auto',\n padding: '20px',\n backgroundColor: isDarkMode ? '#111827' : '#f9fafb',\n ...chatProps.styles?.messagesContainer,\n },\n inputContainer: {\n padding: '16px',\n backgroundColor: isDarkMode ? '#1f2937' : 'white',\n borderTop: `1px solid ${isDarkMode ? '#374151' : '#e5e7eb'}`,\n ...chatProps.styles?.inputContainer,\n },\n input: {\n ...chatProps.styles?.input,\n borderRadius: '12px',\n padding: '12px 16px',\n fontSize: '14px',\n border: `1px solid ${isDarkMode ? '#374151' : '#d1d5db'}`,\n outline: 'none',\n backgroundColor: isDarkMode ? '#374151' : '#ffffff',\n color: isDarkMode ? '#f9fafb' : '#111827',\n fontWeight: '400',\n },\n button: {\n backgroundColor: '#3b82f6',\n color: 'white',\n borderRadius: '12px',\n padding: '12px 24px',\n fontSize: '14px',\n fontWeight: '500',\n border: 'none',\n cursor: 'pointer',\n transition: 'background-color 0.2s',\n ...chatProps.styles?.button,\n },\n userMessage: {\n backgroundColor: '#3b82f6',\n color: 'white',\n padding: '10px 14px',\n borderRadius: '12px 12px 4px 12px',\n marginBottom: '8px',\n marginLeft: 'auto',\n maxWidth: '80%',\n width: 'fit-content',\n ...chatProps.styles?.userMessage,\n },\n agentMessage: {\n backgroundColor: isDarkMode ? '#374151' : 'white',\n color: isDarkMode ? '#f9fafb' : '#1f2937',\n padding: '10px 14px',\n borderRadius: '12px 12px 12px 4px',\n marginBottom: '8px',\n marginRight: 'auto',\n maxWidth: '80%',\n width: 'fit-content',\n boxShadow: isDarkMode \n ? '0 1px 2px 0 rgb(0 0 0 / 0.3)'\n : '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n ...chatProps.styles?.agentMessage,\n },\n timestamp: {\n fontSize: '11px',\n opacity: 0.7,\n marginTop: '4px',\n color: isDarkMode ? '#d1d5db' : 'inherit',\n ...chatProps.styles?.timestamp,\n },\n error: {\n backgroundColor: isDarkMode ? '#7f1d1d' : '#fee2e2',\n color: isDarkMode ? '#fca5a5' : '#991b1b',\n padding: '12px',\n margin: '8px 16px',\n borderRadius: '8px',\n fontSize: '14px',\n ...chatProps.styles?.error,\n },\n }}\n />\n \n {/* Close Button Overlay */}\n <button\n onClick={handleToggle}\n style={{\n position: 'absolute',\n top: '16px',\n right: '16px',\n width: '32px',\n height: '32px',\n borderRadius: '50%',\n backgroundColor: 'rgba(255, 255, 255, 0.2)',\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'white',\n transition: 'background-color 0.2s',\n zIndex: 10,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.3)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.2)';\n }}\n aria-label=\"Close chat\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n </ChannlizeProvider>\n );\n}\n\n"],"mappings":"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","names":["error","useState","useCallback","useState","useCallback","error","normalizedMessages","useState","jsx","useState","jsx","useState","useEffect","useRef","jsx","jsxs","useState","useRef","useEffect","error","useState","useEffect","Fragment","jsx","jsxs","useState","useEffect"]}
1
+ {"version":3,"sources":["../src/context/ChannlizeContext.tsx","../src/hooks/useContactForm.ts","../src/hooks/useChatSession.ts","../src/hooks/useChannlizeAnalytics.ts","../src/components/Form.tsx","../src/components/ContactForm.tsx","../src/components/SupportChat.tsx","../src/components/ChannlizeChat.tsx"],"sourcesContent":["import { createContext, useContext, ReactNode } from 'react';\nimport { ChannlizeClient, ChannlizeConfig } from '@channlize/core';\n\ninterface ChannlizeContextValue {\n client: ChannlizeClient;\n config: ChannlizeConfig;\n}\n\nconst ChannlizeContext = createContext<ChannlizeContextValue | null>(null);\n\nexport interface ChannlizeProviderProps {\n config: ChannlizeConfig;\n children: ReactNode;\n}\n\n/**\n * Provider component that makes Channlize client available to all child components\n */\nexport function ChannlizeProvider({\n config,\n children,\n}: ChannlizeProviderProps) {\n const client = new ChannlizeClient(config);\n\n return (\n <ChannlizeContext.Provider value={{ client, config }}>\n {children}\n </ChannlizeContext.Provider>\n );\n}\n\n/**\n * Hook to access the Channlize client and configuration\n */\nexport function useChannlize(): ChannlizeContextValue {\n const context = useContext(ChannlizeContext);\n\n if (!context) {\n throw new Error('useChannlize must be used within a ChannlizeProvider');\n }\n\n return context;\n}\n","import { useState, useCallback } from 'react';\nimport { useChannlize } from '../context/ChannlizeContext';\nimport type {\n ContactFormData,\n CreateContactResponse,\n ChannlizeError,\n} from '@channlize/core';\n\nexport interface UseContactFormOptions {\n onSuccess?: (response: CreateContactResponse) => void;\n onError?: (error: ChannlizeError) => void;\n}\n\nexport interface UseContactFormReturn {\n submit: (data: ContactFormData) => Promise<void>;\n isSubmitting: boolean;\n isSuccess: boolean;\n error: ChannlizeError | null;\n reset: () => void;\n}\n\n/**\n * Hook for handling contact form submissions\n */\nexport function useContactForm(\n options: UseContactFormOptions = {}\n): UseContactFormReturn {\n const { client } = useChannlize();\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isSuccess, setIsSuccess] = useState(false);\n const [error, setError] = useState<ChannlizeError | null>(null);\n\n const submit = useCallback(\n async (data: ContactFormData) => {\n setIsSubmitting(true);\n setError(null);\n setIsSuccess(false);\n\n try {\n const response = await client.submitContactForm(data);\n setIsSuccess(true);\n options.onSuccess?.(response);\n } catch (err) {\n const error = err as ChannlizeError;\n setError(error);\n options.onError?.(error);\n } finally {\n setIsSubmitting(false);\n }\n },\n [client, options]\n );\n\n const reset = useCallback(() => {\n setIsSubmitting(false);\n setIsSuccess(false);\n setError(null);\n }, []);\n\n return {\n submit,\n isSubmitting,\n isSuccess,\n error,\n reset,\n };\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { useChannlize } from '../context/ChannlizeContext';\nimport type {\n ChatSession,\n ChatMessage,\n CreateChatSessionResponse,\n ChannlizeError,\n} from '@channlize/core';\n\nexport interface UseChatSessionOptions {\n autoConnect?: boolean;\n metadata?: Record<string, unknown>;\n onMessage?: (message: ChatMessage) => void;\n onError?: (error: ChannlizeError) => void;\n sessionId?: string; // Optional: Resume existing session\n persistSession?: boolean; // Whether to persist session in localStorage\n storageKey?: string; // Custom localStorage key\n}\n\nexport interface UseChatSessionReturn {\n session: ChatSession | null;\n messages: ChatMessage[];\n isConnecting: boolean;\n isConnected: boolean;\n error: ChannlizeError | null;\n sendMessage: (content: string, attachments?: File[]) => Promise<void>;\n startSession: () => Promise<void>;\n endSession: () => Promise<void>;\n}\n\n/**\n * Hook for managing chat sessions with real-time messaging\n */\nexport function useChatSession(\n options: UseChatSessionOptions = {}\n): UseChatSessionReturn {\n const { client, config } = useChannlize();\n const [session, setSession] = useState<ChatSession | null>(null);\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [isConnecting, setIsConnecting] = useState(false);\n const [isConnected, setIsConnected] = useState(false);\n const [error, setError] = useState<ChannlizeError | null>(null);\n\n const eventSourceRef = useRef<EventSource | null>(null);\n const sessionRef = useRef<ChatSession | null>(null);\n const isInitializedRef = useRef(false);\n const baseUrl = config.baseUrl || 'https://api.channlize.com';\n\n const storageKey = options.storageKey || `channlize_session_${config.apiKey}`;\n const persistSession = options.persistSession ?? true; // Default to true\n\n // Update ref when session changes\n useEffect(() => {\n sessionRef.current = session;\n }, [session]);\n\n // LocalStorage helpers\n const saveSessionToStorage = useCallback(\n (sessionId: string) => {\n if (persistSession && typeof window !== 'undefined') {\n try {\n localStorage.setItem(storageKey, sessionId);\n } catch (err) {\n console.warn('Failed to save session to localStorage:', err);\n }\n }\n },\n [persistSession, storageKey]\n );\n\n const getSessionFromStorage = useCallback((): string | null => {\n if (persistSession && typeof window !== 'undefined') {\n try {\n return localStorage.getItem(storageKey);\n } catch (err) {\n console.warn('Failed to get session from localStorage:', err);\n }\n }\n return null;\n }, [persistSession, storageKey]);\n\n const clearSessionFromStorage = useCallback(() => {\n if (persistSession && typeof window !== 'undefined') {\n try {\n localStorage.removeItem(storageKey);\n } catch (err) {\n console.warn('Failed to clear session from localStorage:', err);\n }\n }\n }, [persistSession, storageKey]);\n\n const connectToSSE = useCallback(\n (sseEndpoint: string) => {\n if (eventSourceRef.current) {\n eventSourceRef.current.close();\n }\n\n // Construct full URL for SSE endpoint\n const fullUrl = sseEndpoint.startsWith('http')\n ? sseEndpoint\n : `${baseUrl}${sseEndpoint}`;\n\n console.log('[Channlize SSE] Connecting to:', fullUrl);\n\n const eventSource = new EventSource(fullUrl);\n eventSourceRef.current = eventSource;\n\n eventSource.onopen = () => {\n console.log('[Channlize SSE] Connection opened');\n setIsConnected(true);\n setError(null);\n };\n\n // Listen for 'connected' event\n eventSource.addEventListener('connected', event => {\n console.log('SSE connected:', event.data);\n });\n\n // Listen for 'message' event (custom event type from backend)\n eventSource.addEventListener('message', (event: MessageEvent) => {\n try {\n console.log('SSE message:', event.data);\n const message = JSON.parse(event.data);\n\n // Backend sends message object directly in event.data\n const chatMessage: ChatMessage = {\n ...message,\n timestamp: message.timestamp\n ? new Date(message.timestamp)\n : new Date(),\n };\n\n // Add message only if it doesn't already exist (avoid duplicates from optimistic updates)\n setMessages(prev => {\n const exists = prev.some(m => m.id === chatMessage.id);\n return exists ? prev : [...prev, chatMessage];\n });\n options.onMessage?.(chatMessage);\n } catch (err) {\n console.warn('Failed to parse SSE message:', err, event.data);\n }\n });\n\n // Also handle default onmessage for backwards compatibility\n eventSource.onmessage = event => {\n try {\n const data = JSON.parse(event.data);\n\n // Handle wrapped format: {type: 'message', message: {...}}\n if (data.type === 'message' && data.message) {\n const message: ChatMessage = {\n ...data.message,\n timestamp: data.message.timestamp\n ? new Date(data.message.timestamp)\n : new Date(),\n };\n\n setMessages(prev => {\n const exists = prev.some(m => m.id === message.id);\n return exists ? prev : [...prev, message];\n });\n options.onMessage?.(message);\n }\n } catch (err) {\n console.warn('Failed to parse default SSE message:', err);\n }\n };\n\n eventSource.onerror = event => {\n // The server ends each stream after ~50s (serverless time limit).\n // The browser then reconnects on its own and resumes from the last\n // message id, so only a CLOSED source is a real failure.\n if (eventSource.readyState === EventSource.CONNECTING) {\n setIsConnected(false);\n return;\n }\n\n console.error('[Channlize SSE] Connection error', {\n readyState: eventSource.readyState,\n url: fullUrl,\n event,\n });\n\n // ReadyState: 0 = CONNECTING, 1 = OPEN, 2 = CLOSED\n const stateMessage =\n eventSource.readyState === 0\n ? 'Failed to connect (CONNECTING)'\n : eventSource.readyState === 1\n ? 'Connection error while OPEN'\n : 'Connection closed';\n\n setIsConnected(false);\n eventSource.close();\n eventSourceRef.current = null;\n const error = new Error(`SSE ${stateMessage}`) as ChannlizeError;\n error.code = 'SSE_ERROR';\n setError(error);\n options.onError?.(error);\n };\n },\n [baseUrl, options.onError, options.onMessage]\n );\n\n const startSession = useCallback(async () => {\n if (isConnecting || session) return;\n\n setIsConnecting(true);\n setError(null);\n\n try {\n // Check for existing session ID (from options or localStorage)\n const existingSessionId = options.sessionId || getSessionFromStorage();\n\n if (existingSessionId) {\n // Try to resume existing session\n try {\n console.log('📦 Resuming session from storage:', existingSessionId);\n const existingSession =\n await client.getChatSession(existingSessionId);\n const existingMessages =\n await client.getChatMessages(existingSessionId);\n\n setSession(existingSession);\n\n // Normalize message timestamps\n const normalizedMessages = existingMessages.map(\n (msg: ChatMessage) => ({\n ...msg,\n timestamp: msg.timestamp ? new Date(msg.timestamp) : new Date(),\n })\n );\n setMessages(normalizedMessages);\n\n // Reconnect to SSE\n const sseEndpoint = `/v1/chat/sessions/${existingSessionId}/events`;\n connectToSSE(sseEndpoint);\n\n console.log('✅ Session resumed successfully');\n return;\n } catch (err) {\n console.warn('⚠️ Failed to resume session, creating new one:', err);\n // Clear invalid session from storage\n clearSessionFromStorage();\n }\n }\n\n // Create new session\n console.log('🆕 Creating new chat session');\n const response: CreateChatSessionResponse =\n await client.createChatSession(options.metadata);\n\n setSession(response.session);\n\n // Save session ID to localStorage\n saveSessionToStorage(response.session.id);\n\n // Normalize message timestamps to ensure they're valid Date objects\n const normalizedMessages = (response.session.messages || []).map(\n (msg: ChatMessage) => ({\n ...msg,\n timestamp: msg.timestamp ? new Date(msg.timestamp) : new Date(),\n })\n );\n setMessages(normalizedMessages);\n\n if (response.sseEndpoint) {\n connectToSSE(response.sseEndpoint);\n }\n\n console.log('✅ New session created:', response.session.id);\n } catch (err) {\n const error = err as ChannlizeError;\n setError(error);\n options.onError?.(error);\n } finally {\n setIsConnecting(false);\n }\n }, [\n client,\n connectToSSE,\n options.metadata,\n options.onError,\n options.sessionId,\n getSessionFromStorage,\n saveSessionToStorage,\n clearSessionFromStorage,\n isConnecting,\n session,\n ]);\n\n const sendMessage = useCallback(\n async (content: string, attachments?: File[]) => {\n if (!sessionRef.current) {\n throw new Error('No active chat session');\n }\n\n try {\n const response = await client.sendMessage(\n sessionRef.current.id,\n content,\n attachments\n );\n\n // Only add if not already present (SSE might have already added it)\n setMessages(prev => {\n const exists = prev.some(m => m.id === response.message.id);\n if (exists) return prev;\n\n const message = {\n ...response.message,\n timestamp: response.message.timestamp\n ? new Date(response.message.timestamp)\n : new Date(),\n };\n return [...prev, message];\n });\n } catch (err) {\n const error = err as ChannlizeError;\n setError(error);\n options.onError?.(error);\n throw error;\n }\n },\n [client, options.onError]\n );\n\n const endSession = useCallback(async () => {\n if (!sessionRef.current) return;\n\n try {\n await client.closeChatSession(sessionRef.current.id);\n\n if (eventSourceRef.current) {\n eventSourceRef.current.close();\n eventSourceRef.current = null;\n }\n\n // Clear session from localStorage\n clearSessionFromStorage();\n\n setSession(null);\n setMessages([]);\n setIsConnected(false);\n\n console.log('✅ Session ended and cleared from storage');\n } catch (err) {\n const error = err as ChannlizeError;\n setError(error);\n options.onError?.(error);\n }\n }, [client, options.onError, clearSessionFromStorage]);\n\n // Auto-connect when autoConnect becomes true\n useEffect(() => {\n if (\n options.autoConnect &&\n !session &&\n !isConnecting &&\n !isInitializedRef.current\n ) {\n isInitializedRef.current = true;\n startSession();\n }\n }, [options.autoConnect, session, isConnecting, startSession]);\n\n // Close the stream on unmount only. A cleanup on the effect above would run\n // whenever `session` or `isConnecting` changes, which happens right after\n // the stream opens, and close it for good.\n useEffect(() => {\n return () => {\n if (eventSourceRef.current) {\n eventSourceRef.current.close();\n eventSourceRef.current = null;\n }\n };\n }, []);\n\n return {\n session,\n messages,\n isConnecting,\n isConnected,\n error,\n sendMessage,\n startSession,\n endSession,\n };\n}\n","import { useCallback } from 'react';\nimport { useChannlize } from '../context/ChannlizeContext';\nimport type { TrackEventOptions } from '@channlize/core';\n\n/**\n * Returns a stable `track` function bound to the provider client for event tracking (browser / widget key).\n */\nexport function useChannlizeAnalytics() {\n const { client } = useChannlize();\n\n const track = useCallback(\n (name: string, options?: TrackEventOptions) =>\n client.trackEvent(name, options),\n [client]\n );\n\n return { track };\n}\n","import { useState, FormEvent } from 'react';\nimport { useContactForm } from '../hooks/useContactForm';\nimport type { ContactFormData } from '@channlize/core';\n\nexport interface FormProps {\n /** Custom fields to include in the form */\n customFields?: Array<{\n name: string;\n label: string;\n type: 'text' | 'email' | 'textarea' | 'select';\n required?: boolean;\n options?: string[]; // For select fields\n }>;\n /** Callback when form is successfully submitted */\n onSuccess?: () => void;\n /** Callback when form submission fails */\n onError?: (error: Error) => void;\n /** Custom CSS classes */\n className?: string;\n /** Custom styles for form elements */\n styles?: {\n form?: React.CSSProperties;\n field?: React.CSSProperties;\n label?: React.CSSProperties;\n input?: React.CSSProperties;\n textarea?: React.CSSProperties;\n button?: React.CSSProperties;\n error?: React.CSSProperties;\n success?: React.CSSProperties;\n };\n /** Button text */\n submitText?: string;\n /** Success message */\n successMessage?: string;\n}\n\n/**\n * Form component that submits inquiries to Channlize\n */\nexport function Form({\n customFields = [],\n onSuccess,\n onError,\n className = '',\n styles = {},\n submitText = 'Send Message',\n successMessage = 'Thank you! Your message has been sent.',\n}: FormProps) {\n const [formData, setFormData] = useState<Partial<ContactFormData>>({\n name: '',\n email: '',\n subject: '',\n message: '',\n customFields: {},\n });\n\n const { submit, isSubmitting, isSuccess, error, reset } = useContactForm({\n onSuccess: () => {\n setFormData({\n name: '',\n email: '',\n subject: '',\n message: '',\n customFields: {},\n });\n onSuccess?.();\n },\n onError,\n });\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n\n if (!formData.name || !formData.email || !formData.message) {\n return;\n }\n\n await submit(formData as ContactFormData);\n };\n\n const handleInputChange = (field: keyof ContactFormData, value: string) => {\n setFormData((prev: Partial<ContactFormData>) => ({\n ...prev,\n [field]: value,\n }));\n };\n\n const handleCustomFieldChange = (fieldName: string, value: string) => {\n setFormData((prev: Partial<ContactFormData>) => ({\n ...prev,\n customFields: {\n ...prev.customFields,\n [fieldName]: value,\n },\n }));\n };\n\n if (isSuccess) {\n return (\n <div\n className={`channlize-form-success ${className}`}\n style={styles.success}\n >\n <p>{successMessage}</p>\n <button type=\"button\" onClick={reset} style={styles.button}>\n Send Another Message\n </button>\n </div>\n );\n }\n\n return (\n <form\n className={`channlize-form ${className}`}\n style={styles.form}\n onSubmit={handleSubmit}\n >\n <div className=\"channlize-field\" style={styles.field}>\n <label htmlFor=\"channlize-name\" style={styles.label}>\n Name *\n </label>\n <input\n id=\"channlize-name\"\n type=\"text\"\n value={formData.name || ''}\n onChange={e => handleInputChange('name', e.target.value)}\n required\n style={styles.input}\n />\n </div>\n\n <div className=\"channlize-field\" style={styles.field}>\n <label htmlFor=\"channlize-email\" style={styles.label}>\n Email *\n </label>\n <input\n id=\"channlize-email\"\n type=\"email\"\n value={formData.email || ''}\n onChange={e => handleInputChange('email', e.target.value)}\n required\n style={styles.input}\n />\n </div>\n\n <div className=\"channlize-field\" style={styles.field}>\n <label htmlFor=\"channlize-subject\" style={styles.label}>\n Subject\n </label>\n <input\n id=\"channlize-subject\"\n type=\"text\"\n value={formData.subject || ''}\n onChange={e => handleInputChange('subject', e.target.value)}\n style={styles.input}\n />\n </div>\n\n {customFields.map(field => (\n <div key={field.name} className=\"channlize-field\" style={styles.field}>\n <label htmlFor={`channlize-${field.name}`} style={styles.label}>\n {field.label} {field.required && '*'}\n </label>\n\n {field.type === 'select' ? (\n <select\n id={`channlize-${field.name}`}\n value={(formData.customFields?.[field.name] as string) || ''}\n onChange={e =>\n handleCustomFieldChange(field.name, e.target.value)\n }\n required={field.required}\n style={styles.input}\n >\n <option value=\"\">Select...</option>\n {field.options?.map(option => (\n <option key={option} value={option}>\n {option}\n </option>\n ))}\n </select>\n ) : field.type === 'textarea' ? (\n <textarea\n id={`channlize-${field.name}`}\n value={(formData.customFields?.[field.name] as string) || ''}\n onChange={e =>\n handleCustomFieldChange(field.name, e.target.value)\n }\n required={field.required}\n style={styles.textarea}\n />\n ) : (\n <input\n id={`channlize-${field.name}`}\n type={field.type}\n value={(formData.customFields?.[field.name] as string) || ''}\n onChange={e =>\n handleCustomFieldChange(field.name, e.target.value)\n }\n required={field.required}\n style={styles.input}\n />\n )}\n </div>\n ))}\n\n <div className=\"channlize-field\" style={styles.field}>\n <label htmlFor=\"channlize-message\" style={styles.label}>\n Message *\n </label>\n <textarea\n id=\"channlize-message\"\n value={formData.message || ''}\n onChange={e => handleInputChange('message', e.target.value)}\n required\n rows={4}\n style={styles.textarea}\n />\n </div>\n\n {error && (\n <div className=\"channlize-error\" style={styles.error}>\n {error.message}\n </div>\n )}\n\n <button type=\"submit\" disabled={isSubmitting} style={styles.button}>\n {isSubmitting ? 'Sending...' : submitText}\n </button>\n </form>\n );\n}\n","import { Form, FormProps } from './Form';\n\n/**\n * ContactForm component - Alias for Form component\n * Provides a form for collecting contact information and messages\n */\nexport function ContactForm(props: FormProps) {\n return <Form {...props} />;\n}\n\n// Re-export FormProps as ContactFormProps for convenience\nexport type ContactFormProps = FormProps;\n","import { useState, useEffect, useRef, FormEvent } from 'react';\nimport { useChatSession, UseChatSessionOptions } from '../hooks/useChatSession';\nimport type { ChatMessage } from '@channlize/core';\n\nexport interface SupportChatProps extends UseChatSessionOptions {\n /** Custom CSS classes */\n className?: string;\n /** Custom styles for chat elements */\n styles?: {\n container?: React.CSSProperties;\n header?: React.CSSProperties;\n messagesContainer?: React.CSSProperties;\n message?: React.CSSProperties;\n userMessage?: React.CSSProperties;\n agentMessage?: React.CSSProperties;\n inputContainer?: React.CSSProperties;\n input?: React.CSSProperties;\n button?: React.CSSProperties;\n error?: React.CSSProperties;\n timestamp?: React.CSSProperties;\n };\n /** Placeholder text for message input */\n placeholder?: string;\n /** Header title */\n title?: string;\n /** Button text */\n sendButtonText?: string;\n /** Show timestamps on messages */\n showTimestamps?: boolean;\n /** Allow file attachments */\n allowAttachments?: boolean;\n}\n\n/**\n * SupportChat component - Real-time chat interface\n * Provides a complete chat UI with message history and real-time updates\n */\nexport function SupportChat({\n autoConnect = true,\n metadata,\n onMessage,\n onError,\n sessionId,\n persistSession,\n storageKey,\n className = '',\n styles = {},\n placeholder = 'Type your message...',\n title = 'Support Chat',\n sendButtonText = 'Send',\n showTimestamps = true,\n allowAttachments = false,\n}: SupportChatProps) {\n const [messageInput, setMessageInput] = useState('');\n const [attachments, setAttachments] = useState<File[]>([]);\n const messagesEndRef = useRef<HTMLDivElement>(null);\n\n const {\n session,\n messages,\n isConnecting,\n isConnected,\n error,\n sendMessage,\n startSession,\n endSession,\n } = useChatSession({\n autoConnect,\n metadata,\n onMessage,\n onError,\n sessionId,\n persistSession,\n storageKey,\n });\n\n // Auto-scroll to bottom when new messages arrive\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n }, [messages]);\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n\n if (!messageInput.trim() && attachments.length === 0) return;\n\n try {\n await sendMessage(\n messageInput,\n attachments.length > 0 ? attachments : undefined\n );\n setMessageInput('');\n setAttachments([]);\n } catch (err) {\n console.error('Failed to send message:', err);\n }\n };\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.files) {\n setAttachments(Array.from(e.target.files));\n }\n };\n\n const formatTimestamp = (date: Date) => {\n // Check if date is valid\n if (!date || isNaN(date.getTime())) {\n return '';\n }\n\n try {\n return new Intl.DateTimeFormat('en-US', {\n hour: 'numeric',\n minute: '2-digit',\n hour12: true,\n }).format(date);\n } catch (error) {\n console.warn('Failed to format timestamp:', error);\n return '';\n }\n };\n\n if (!session && !isConnecting) {\n return (\n <div\n className={`channlize-chat-container ${className}`}\n style={styles.container}\n >\n <div className=\"channlize-chat-header\" style={styles.header}>\n <h3>{title}</h3>\n </div>\n <div className=\"channlize-chat-start\">\n <button onClick={startSession} style={styles.button}>\n Start Chat\n </button>\n </div>\n {error && (\n <div className=\"channlize-error\" style={styles.error}>\n {error.message}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div\n className={`channlize-chat-container ${className}`}\n style={styles.container}\n >\n <div className=\"channlize-chat-header\" style={styles.header}>\n <h3>{title}</h3>\n <div\n className=\"channlize-chat-status\"\n style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}\n >\n {isConnecting && (\n <>\n <span\n style={{\n display: 'inline-block',\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: '#f59e0b',\n }}\n />\n <span>Connecting...</span>\n </>\n )}\n {isConnected && (\n <>\n <span\n style={{\n display: 'inline-block',\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: '#10b981',\n }}\n />\n <span>Connected</span>\n </>\n )}\n {!isConnected && !isConnecting && (\n <>\n <span\n style={{\n display: 'inline-block',\n width: '8px',\n height: '8px',\n borderRadius: '50%',\n backgroundColor: '#ef4444',\n }}\n />\n <span>Disconnected</span>\n </>\n )}\n </div>\n {session && (\n <button\n onClick={endSession}\n style={{ ...styles.button, fontSize: '0.875rem' }}\n type=\"button\"\n >\n End Chat\n </button>\n )}\n </div>\n\n <div className=\"channlize-messages\" style={styles.messagesContainer}>\n {messages.length === 0 && (\n <div style={{ textAlign: 'center', padding: '2rem', color: '#666' }}>\n No messages yet. Start the conversation!\n </div>\n )}\n\n {messages.map((message: ChatMessage, index: number) => (\n <div\n key={message.id || index}\n className={`channlize-message ${\n message.author === 'user'\n ? 'channlize-message-user'\n : 'channlize-message-agent'\n }`}\n style={{\n ...styles.message,\n ...(message.author === 'user'\n ? styles.userMessage\n : styles.agentMessage),\n }}\n >\n <div className=\"channlize-message-content\">{message.content}</div>\n {showTimestamps && (\n <div\n className=\"channlize-message-timestamp\"\n style={styles.timestamp}\n >\n {formatTimestamp(message.timestamp)}\n </div>\n )}\n </div>\n ))}\n <div ref={messagesEndRef} />\n </div>\n\n {error && (\n <div className=\"channlize-error\" style={styles.error}>\n {error.message}\n </div>\n )}\n\n <form\n className=\"channlize-chat-input-container\"\n style={styles.inputContainer}\n onSubmit={handleSubmit}\n >\n {allowAttachments && (\n <div>\n <input\n type=\"file\"\n multiple\n onChange={handleFileChange}\n style={{ fontSize: '0.875rem' }}\n />\n {attachments.length > 0 && (\n <div style={{ fontSize: '0.75rem', marginTop: '0.25rem' }}>\n {attachments.length} file(s) selected\n </div>\n )}\n </div>\n )}\n\n <div style={{ display: 'flex', gap: '0.5rem' }}>\n <input\n type=\"text\"\n value={messageInput}\n onChange={e => setMessageInput(e.target.value)}\n placeholder={placeholder}\n disabled={!session || isConnecting}\n style={{ ...styles.input, flex: 1 }}\n />\n <button\n type=\"submit\"\n disabled={\n !session ||\n isConnecting ||\n (!messageInput.trim() && attachments.length === 0)\n }\n style={styles.button}\n >\n {sendButtonText}\n </button>\n </div>\n </form>\n </div>\n );\n}\n","import { useState, useSyncExternalStore, ReactNode } from 'react';\nimport { ChannlizeProvider } from '../context/ChannlizeContext';\nimport { SupportChat } from './SupportChat';\nimport type { ChannlizeConfig } from '@channlize/core';\nimport type { SupportChatProps } from './SupportChat';\n\nexport interface ChannlizeChatProps {\n /** Channlize configuration */\n config: ChannlizeConfig;\n\n /** Position of the floating button */\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';\n\n /** Offset from edges in pixels */\n offset?: { x?: number; y?: number };\n\n /** Custom button element (overrides default button) */\n buttonElement?: ReactNode;\n\n /** Custom button icon (only used if buttonElement is not provided) */\n buttonIcon?: ReactNode;\n\n /** Button size in pixels */\n buttonSize?: number;\n\n /** Button colors */\n buttonColors?: {\n background?: string;\n hover?: string;\n text?: string;\n };\n\n /** Chat window props (passed to SupportChat) */\n chatProps?: Omit<SupportChatProps, 'autoConnect'>;\n\n /** Whether to start closed or open */\n defaultOpen?: boolean;\n\n /** Whether to show badge with unread count */\n showBadge?: boolean;\n\n /** Unread count (for badge) */\n unreadCount?: number;\n\n /** Custom z-index */\n zIndex?: number;\n\n /** Whether to show on mobile */\n showOnMobile?: boolean;\n\n /** Callback when chat opens */\n onOpen?: () => void;\n\n /** Callback when chat closes */\n onClose?: () => void;\n\n /** Whether to enable animations */\n enableAnimations?: boolean;\n\n /** Custom class for button container */\n buttonClassName?: string;\n\n /** Custom class for chat container */\n chatClassName?: string;\n}\n\nconst emptySubscribe = () => () => {};\n\nfunction subscribeDarkMode(onStoreChange: () => void) {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n mediaQuery.addEventListener('change', onStoreChange);\n return () => mediaQuery.removeEventListener('change', onStoreChange);\n}\n\nfunction getDarkModeSnapshot() {\n return window.matchMedia('(prefers-color-scheme: dark)').matches;\n}\n\n/**\n * ChannlizeChat - All-in-one floating chat widget with provider\n *\n * Drop this component anywhere in your React app for instant live chat support.\n * Includes the provider, floating button, and chat window.\n *\n * @example\n * ```tsx\n * <ChannlizeChat\n * config={{\n * apiKey: \"your-widget-key\",\n * projectId: \"your-project-id\",\n * }}\n * position=\"bottom-right\"\n * chatProps={{\n * title: \"Customer Support\",\n * placeholder: \"How can we help?\"\n * }}\n * />\n * ```\n */\nexport function ChannlizeChat({\n config,\n position = 'bottom-right',\n offset = { x: 24, y: 24 },\n buttonElement,\n buttonIcon,\n buttonSize = 56,\n buttonColors = {\n background: '#3b82f6',\n hover: '#2563eb',\n text: '#ffffff',\n },\n chatProps = {},\n defaultOpen = false,\n showBadge = false,\n unreadCount = 0,\n zIndex = 1000,\n showOnMobile = true,\n onOpen,\n onClose,\n enableAnimations = true,\n buttonClassName = '',\n chatClassName = '',\n}: ChannlizeChatProps) {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n // Client-only render without setState-in-effect (eslint-plugin-react-hooks v7)\n const isMounted = useSyncExternalStore(\n emptySubscribe,\n () => true,\n () => false\n );\n const isDarkMode = useSyncExternalStore(\n subscribeDarkMode,\n getDarkModeSnapshot,\n () => false\n );\n\n // Don't render on server to avoid hydration issues\n if (!isMounted) {\n return null;\n }\n\n const handleToggle = () => {\n const newState = !isOpen;\n setIsOpen(newState);\n\n if (newState) {\n onOpen?.();\n // Start session when chat is opened\n // The session will be started by the SupportChat component with autoConnect based on isOpen\n } else {\n onClose?.();\n }\n };\n\n // Calculate position styles\n const positionStyles: React.CSSProperties = {\n position: 'fixed',\n zIndex,\n ...(position.includes('bottom')\n ? { bottom: `${offset.y}px` }\n : { top: `${offset.y}px` }),\n ...(position.includes('right')\n ? { right: `${offset.x}px` }\n : { left: `${offset.x}px` }),\n };\n\n const buttonStyle: React.CSSProperties = {\n width: `${buttonSize}px`,\n height: `${buttonSize}px`,\n borderRadius: '50%',\n backgroundColor: buttonColors.background,\n color: buttonColors.text,\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n transition: enableAnimations\n ? 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)'\n : 'none',\n transform: enableAnimations && isOpen ? 'scale(0.9)' : 'scale(1)',\n };\n\n const chatContainerStyle: React.CSSProperties = {\n ...positionStyles,\n opacity: isOpen ? 1 : 0,\n visibility: isOpen ? 'visible' : 'hidden',\n transform: enableAnimations\n ? isOpen\n ? 'scale(1) translateY(0)'\n : 'scale(0.95) translateY(10px)'\n : 'none',\n transition: enableAnimations\n ? 'opacity 0.2s, transform 0.2s, visibility 0.2s'\n : 'none',\n };\n\n const defaultIcon = (\n <svg\n width={buttonSize * 0.5}\n height={buttonSize * 0.5}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {isOpen ? (\n <>\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </>\n ) : (\n <>\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n <path d=\"M8 10h.01\" />\n <path d=\"M12 10h.01\" />\n <path d=\"M16 10h.01\" />\n </>\n )}\n </svg>\n );\n\n return (\n <ChannlizeProvider config={config}>\n {/* Floating Button */}\n {!isOpen && (\n <div\n style={{\n ...positionStyles,\n display:\n !showOnMobile &&\n typeof window !== 'undefined' &&\n window.innerWidth < 768\n ? 'none'\n : 'block',\n }}\n className={buttonClassName}\n >\n {buttonElement ? (\n <div onClick={handleToggle} style={{ cursor: 'pointer' }}>\n {buttonElement}\n </div>\n ) : (\n <button\n onClick={handleToggle}\n style={buttonStyle}\n onMouseEnter={e => {\n if (enableAnimations) {\n e.currentTarget.style.backgroundColor =\n buttonColors.hover || buttonColors.background || '#2563eb';\n e.currentTarget.style.transform = 'scale(1.05)';\n }\n }}\n onMouseLeave={e => {\n if (enableAnimations) {\n e.currentTarget.style.backgroundColor =\n buttonColors.background || '#3b82f6';\n e.currentTarget.style.transform = 'scale(1)';\n }\n }}\n aria-label={isOpen ? 'Close chat' : 'Open chat'}\n >\n {buttonIcon || defaultIcon}\n {showBadge && unreadCount > 0 && (\n <span\n style={{\n position: 'absolute',\n top: '-4px',\n right: '-4px',\n backgroundColor: '#ef4444',\n color: 'white',\n borderRadius: '10px',\n padding: '2px 6px',\n fontSize: '12px',\n fontWeight: '600',\n minWidth: '20px',\n textAlign: 'center',\n boxShadow: '0 2px 4px rgba(0,0,0,0.2)',\n }}\n >\n {unreadCount > 99 ? '99+' : unreadCount}\n </span>\n )}\n </button>\n )}\n </div>\n )}\n\n {/* Chat Window */}\n <div style={chatContainerStyle} className={chatClassName}>\n <SupportChat\n autoConnect={isOpen}\n persistSession={true}\n title=\"Support Chat\"\n placeholder=\"Type your message...\"\n showTimestamps={true}\n {...chatProps}\n styles={{\n container: {\n width: '384px',\n height: '600px',\n maxHeight: 'calc(100vh - 120px)',\n borderRadius: '16px',\n overflow: 'hidden',\n boxShadow: isDarkMode\n ? '0 20px 25px -5px rgb(0 0 0 / 0.4), 0 8px 10px -6px rgb(0 0 0 / 0.5)'\n : '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)',\n backgroundColor: isDarkMode ? '#1f2937' : '#ffffff',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n ...chatProps.styles?.container,\n },\n header: {\n background: 'linear-gradient(135deg, #3b82f6 0%, #9333ea 100%)',\n padding: '20px',\n borderRadius: '16px 16px 0 0',\n color: 'white',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n ...chatProps.styles?.header,\n },\n messagesContainer: {\n flex: 1,\n overflowY: 'auto',\n padding: '20px',\n backgroundColor: isDarkMode ? '#111827' : '#f9fafb',\n ...chatProps.styles?.messagesContainer,\n },\n inputContainer: {\n padding: '16px',\n backgroundColor: isDarkMode ? '#1f2937' : 'white',\n borderTop: `1px solid ${isDarkMode ? '#374151' : '#e5e7eb'}`,\n ...chatProps.styles?.inputContainer,\n },\n input: {\n ...chatProps.styles?.input,\n borderRadius: '12px',\n padding: '12px 16px',\n fontSize: '14px',\n border: `1px solid ${isDarkMode ? '#374151' : '#d1d5db'}`,\n outline: 'none',\n backgroundColor: isDarkMode ? '#374151' : '#ffffff',\n color: isDarkMode ? '#f9fafb' : '#111827',\n fontWeight: '400',\n },\n button: {\n backgroundColor: '#3b82f6',\n color: 'white',\n borderRadius: '12px',\n padding: '12px 24px',\n fontSize: '14px',\n fontWeight: '500',\n border: 'none',\n cursor: 'pointer',\n transition: 'background-color 0.2s',\n ...chatProps.styles?.button,\n },\n userMessage: {\n backgroundColor: '#3b82f6',\n color: 'white',\n padding: '10px 14px',\n borderRadius: '12px 12px 4px 12px',\n marginBottom: '8px',\n marginLeft: 'auto',\n maxWidth: '80%',\n width: 'fit-content',\n ...chatProps.styles?.userMessage,\n },\n agentMessage: {\n backgroundColor: isDarkMode ? '#374151' : 'white',\n color: isDarkMode ? '#f9fafb' : '#1f2937',\n padding: '10px 14px',\n borderRadius: '12px 12px 12px 4px',\n marginBottom: '8px',\n marginRight: 'auto',\n maxWidth: '80%',\n width: 'fit-content',\n boxShadow: isDarkMode\n ? '0 1px 2px 0 rgb(0 0 0 / 0.3)'\n : '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n ...chatProps.styles?.agentMessage,\n },\n timestamp: {\n fontSize: '11px',\n opacity: 0.7,\n marginTop: '4px',\n color: isDarkMode ? '#d1d5db' : 'inherit',\n ...chatProps.styles?.timestamp,\n },\n error: {\n backgroundColor: isDarkMode ? '#7f1d1d' : '#fee2e2',\n color: isDarkMode ? '#fca5a5' : '#991b1b',\n padding: '12px',\n margin: '8px 16px',\n borderRadius: '8px',\n fontSize: '14px',\n ...chatProps.styles?.error,\n },\n }}\n />\n\n {/* Close Button Overlay */}\n <button\n onClick={handleToggle}\n style={{\n position: 'absolute',\n top: '16px',\n right: '16px',\n width: '32px',\n height: '32px',\n borderRadius: '50%',\n backgroundColor: 'rgba(255, 255, 255, 0.2)',\n border: 'none',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n color: 'white',\n transition: 'background-color 0.2s',\n zIndex: 10,\n }}\n onMouseEnter={e => {\n e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.3)';\n }}\n onMouseLeave={e => {\n e.currentTarget.style.backgroundColor = 'rgba(255, 255, 255, 0.2)';\n }}\n aria-label=\"Close chat\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n </ChannlizeProvider>\n );\n}\n"],"mappings":"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","names":["error","useState","useCallback","useState","useCallback","error","normalizedMessages","useCallback","useCallback","useState","jsx","useState","jsx","useState","useEffect","useRef","jsx","jsxs","useState","useRef","useEffect","error","useState","Fragment","jsx","jsxs","useState"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@channlize/react",
3
- "version": "0.1.0-alpha.2",
3
+ "version": "0.1.1",
4
4
  "description": "Channlize React SDK - React components for Channlize platform",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -18,9 +18,9 @@
18
18
  "scripts": {
19
19
  "build": "tsup",
20
20
  "dev": "tsup --watch",
21
- "lint": "eslint src --ext .ts,.tsx",
22
- "lint:fix": "eslint src --ext .ts,.tsx --fix",
23
- "type-check": "tsc --noEmit",
21
+ "lint": "eslint src",
22
+ "lint:fix": "eslint src --fix",
23
+ "type-check": "tsc6 --noEmit",
24
24
  "clean": "rm -rf dist"
25
25
  },
26
26
  "keywords": [
@@ -33,24 +33,22 @@
33
33
  "author": "Channlize Team",
34
34
  "license": "MIT",
35
35
  "dependencies": {
36
- "@channlize/core": "^0.1.0-alpha.1"
36
+ "@channlize/core": "^0.1.0"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "react": ">=16.8.0",
40
40
  "react-dom": ">=16.8.0"
41
41
  },
42
42
  "devDependencies": {
43
- "@types/react": "^18.2.48",
44
- "@types/react-dom": "^18.2.18",
45
- "@typescript-eslint/eslint-plugin": "^6.21.0",
46
- "@typescript-eslint/parser": "^6.21.0",
47
- "eslint": "^8.56.0",
43
+ "@types/react": "^19.0.0",
44
+ "@types/react-dom": "^19.0.0",
45
+ "eslint": "^10.0.0",
48
46
  "eslint-plugin-react": "^7.33.2",
49
- "eslint-plugin-react-hooks": "^4.6.0",
50
- "react": "^18.2.0",
51
- "react-dom": "^18.2.0",
52
- "tsup": "^8.0.1",
53
- "typescript": "^5.3.3"
47
+ "eslint-plugin-react-hooks": "^7.1.1",
48
+ "react": "^19.0.0",
49
+ "react-dom": "^19.0.0",
50
+ "tsup": "^9.0.0",
51
+ "typescript": "npm:@typescript/typescript6@^6.0.2"
54
52
  },
55
53
  "publishConfig": {
56
54
  "access": "public"
@@ -60,4 +58,4 @@
60
58
  "url": "git+https://github.com/channlize/sdk.git",
61
59
  "directory": "packages/react"
62
60
  }
63
- }
61
+ }