Skip to content

JavaScript API

Complete reference for programmatically controlling the Infinity Widget and handling events.

Getting Widget Reference

javascript
// Get widget element
const widget = document.querySelector('infinity-widget');

// Or by ID
const widget = document.getElementById('my-widget');

// Wait for widget to be ready
await customElements.whenDefined('infinity-widget');

Methods

Message Management

javascript
// Send a message programmatically
widget.sendMessage('Hello from JavaScript!');

// Clear all messages
widget.clearMessages();

// Get current message history
const messages = widget.getMessages();

Connection Management

javascript
// Connect to WebSocket server
widget.connect();

// Disconnect from server
widget.disconnect();

// Check connection status
const isConnected = widget.isConnected();

Theme & Appearance

javascript
// Set theme programmatically
widget.setTheme('dark'); // 'light', 'dark', 'auto'

// Toggle theme
widget.toggleTheme();

// Get current theme
const currentTheme = widget.getTheme();

Floating Mode

javascript
// Toggle floating mode
widget.toggleFloatingMode();

// Minimize widget (floating mode only)
widget.minimize();

// Expand widget (floating mode only)
widget.expand();

// Check if minimized
const isMinimized = widget.isMinimized();

Language & Internationalization

javascript
// Set language
widget.setLanguage('es'); // ISO 639-1 language code

// Get current language
const currentLang = widget.getLanguage();

// Get available languages
const languages = widget.getAvailableLanguages();

State Management

javascript
// Get widget state
const state = widget.getState();

// Check if widget is disabled
const isDisabled = widget.isDisabled();

// Enable/disable widget
widget.setDisabled(true);
widget.setDisabled(false);

Events

The widget dispatches custom events for various interactions:

Connection Events

javascript
// Widget connected to server
widget.addEventListener('infinity-widget-connected', (event) => {
  console.log('Connected:', event.detail.url);
});

// Widget disconnected from server
widget.addEventListener('infinity-widget-disconnected', (event) => {
  console.log('Disconnected:', event.detail.reason);
});

// Connection error
widget.addEventListener('infinity-widget-connection-error', (event) => {
  console.log('Connection error:', event.detail.error);
});

Message Events

javascript
// Message sent by user
widget.addEventListener('infinity-widget-message-sent', (event) => {
  console.log('User sent:', event.detail.message);
  console.log('Timestamp:', event.detail.timestamp);
});

// Message received from bot
widget.addEventListener('infinity-widget-message-received', (event) => {
  console.log('Bot replied:', event.detail.message);
  console.log('Message ID:', event.detail.id);
});

// Chat cleared
widget.addEventListener('infinity-widget-chat-cleared', (event) => {
  console.log('Chat history cleared');
});

Theme Events

javascript
// Theme changed
widget.addEventListener('theme-changed', (event) => {
  console.log('Theme changed to:', event.detail.theme);
});

// System theme changed (auto mode)
widget.addEventListener('system-theme-changed', (event) => {
  console.log('System theme:', event.detail.theme);
});

Language Events

javascript
// Language changed
widget.addEventListener('infinity-widget-language-changed', (event) => {
  console.log('Language changed to:', event.detail.language);
  console.log('Previous language:', event.detail.previousLanguage);
});

UI Events

javascript
// Widget minimized (floating mode)
widget.addEventListener('infinity-widget-minimized', (event) => {
  console.log('Widget minimized');
});

// Widget expanded (floating mode)
widget.addEventListener('infinity-widget-expanded', (event) => {
  console.log('Widget expanded');
});

// Input focus/blur
widget.addEventListener('infinity-widget-input-focus', (event) => {
  console.log('Input focused');
});

widget.addEventListener('infinity-widget-input-blur', (event) => {
  console.log('Input blurred');
});

Advanced Usage

Custom Message Handling

javascript
// Intercept outgoing messages
widget.addEventListener('infinity-widget-message-sent', (event) => {
  const message = event.detail.message;
  
  // Add custom processing
  if (message.includes('/help')) {
    // Show custom help dialog
    showCustomHelp();
  }
});

// Process incoming messages
widget.addEventListener('infinity-widget-message-received', (event) => {
  const message = event.detail.message;
  
  // Custom message processing
  if (message.includes('special-command')) {
    // Trigger custom action
    handleSpecialCommand(message);
  }
});

Dynamic Configuration

javascript
// Update configuration dynamically
widget.setAttribute('theme', 'dark');
widget.setAttribute('welcome-message', 'New welcome message');

// React to attribute changes
const observer = new MutationObserver((mutations) => {
  mutations.forEach((mutation) => {
    if (mutation.type === 'attributes') {
      console.log(`Attribute ${mutation.attributeName} changed`);
    }
  });
});

observer.observe(widget, { 
  attributes: true, 
  attributeFilter: ['theme', 'language', 'disabled'] 
});

Error Handling

javascript
// Global error handling
widget.addEventListener('infinity-widget-error', (event) => {
  console.error('Widget error:', event.detail.error);
  console.error('Error type:', event.detail.type);
  
  // Handle different error types
  switch (event.detail.type) {
    case 'connection':
      showConnectionError();
      break;
    case 'validation':
      showValidationError(event.detail.message);
      break;
    default:
      showGenericError();
  }
});

TypeScript Support

The widget includes TypeScript definitions:

typescript
interface InfinityWidget extends HTMLElement {
  sendMessage(message: string): void;
  clearMessages(): void;
  getMessages(): Message[];
  connect(): void;
  disconnect(): void;
  isConnected(): boolean;
  setTheme(theme: 'light' | 'dark' | 'auto'): void;
  getTheme(): string;
  setLanguage(language: string): void;
  getLanguage(): string;
}

interface MessageEvent extends CustomEvent {
  detail: {
    message: string;
    timestamp: number;
    id?: string;
  };
}

Built with ❤️ by CI&T