Skip to main content

Event Listeners

Event Listeners Overview

Chatislav widgets emit events throughout their lifecycle, allowing you to respond to user interactions, widget state changes, and AI agent activities. This enables integrated experiences, analytics tracking, and custom behaviors.

 

Available Events

Event NameDescriptionWhen Triggered
readyWidget initialization completeWhen widget finishes loading
openWidget openedWhen chat window becomes visible
closeWidget closedWhen chat window is hidden
messageNew message in conversationWhen user or AI sends a message
user-session-setUser session updatedWhen user identification is set
action-callClient-side action triggeredWhen AI agent executes a registered action
action-resultClient-side action completedWhen action returns a result
prompter-messageUser message sentWhen user sends a message
assistant-messageAI response receivedWhen AI agent responds

 

Adding Event Listeners

Use the add_event_listener method to register callback functions:

window.chatislav.add_event_listener('open', function(event) {
console.log('Chat widget opened!', event);
});

For specific widget instance:

window.chatislav.add_event_listener('open', function(event) {
console.log('Chat widget opened!', event);
}, 'ctslv_bbl');

Event with Data Processing:

window.chatislav.add_event_listener('message', function(event) {
console.log('New message:', event.data);
console.log('Timestamp:', event.timestamp);
console.log('Instance ID:', event.instanceId);

// Custom logic
trackMessageAnalytics(event.data);
}, 'ctslv_bbl');

 

Removing Event Listeners

function myEventHandler(event) {
console.log('Event triggered:', event);
}

// Add listener
window.chatislav.add_event_listener('close', myEventHandler, 'ctslv_bbl');

// Remove listener
window.chatislav.remove_event_listener('close', myEventHandler, 'ctslv_bbl');

 

Instance ID Parameter

The optional instance_id parameter allows you to target specific widget instances when you have multiple widgets on the same page. The instance ID corresponds to the instance name used when initializing the widget script.

All Widgets (no instance_id):

window.chatislav.add_event_listener('ready', function(event) {
console.log('Widget ready - applies to all widgets');
});

Specific Widget Instance:

window.chatislav.add_event_listener('ready', function(event) {
console.log('ctslv_bbl widget ready');
}, 'ctslv_bbl');

 

Event Object Structure

Every event callback receives an object with:

{
type: "event_name", // Event type (e.g., "open", "message")
data: { /* event data */ }, // Event-specific information
timestamp: Date, // When the event occurred
instanceId: "string" // Widget instance identifier
}

 

Widget Lifecycle Events

Ready Event:

window.chatislav.add_event_listener('ready', function(event) {
console.log('Widget ready:', event.data.elementId);
console.log('Instance ID:', event.instanceId);
enableCustomUI();
}, 'ctslv_bbl');

Open/Close Events:

window.chatislav.add_event_listener('open', function(event) {
console.log('Chat opened for instance:', event.instanceId);
gtag('event', 'chat_opened');
hideOtherHelpElements();
}, 'ctslv_bbl');

window.chatislav.add_event_listener('close', function(event) {
console.log('Chat closed for instance:', event.instanceId);
gtag('event', 'chat_closed');
showOtherHelpElements();
}, 'ctslv_bbl');

 

Message Events

User Message Event:

window.chatislav.add_event_listener('prompter-message', function(event) {
console.log('User sent:', event.data.content);
console.log('From instance:', event.instanceId);

// Trigger custom responses based on keywords
if (event.data.content.toLowerCase().includes('pricing')) {
highlightPricingSection();
}
}, 'ctslv_bbl');

AI Assistant Message Event:

window.chatislav.add_event_listener('assistant-message', function(event) {
console.log('AI responded:', event.data.content);
console.log('From instance:', event.instanceId);

if (event.data.content.includes('product recommendation')) {
showProductCarousel();
}
}, 'ctslv_bbl');

 

User Session Events

Monitor user identification changes. For detailed user session configuration, see User Session Identity.

window.chatislav.add_event_listener('user-session-set', function(event) {
console.log('User session updated:', event.data.userSession);
console.log('Instance ID:', event.instanceId);

if (event.data.userSession.user_metadata) {
updateUIForUser(event.data.userSession.user_metadata);
}
}, 'ctslv_bbl');

 

Client-Side Action Events

Action Call Event:

window.chatislav.add_event_listener('action-call', function(event) {
console.log('Action triggered:', event.data.action);
console.log('From instance:', event.instanceId);

if (event.data.action === 'process_payment') {
showPaymentLoading();
}
}, 'ctslv_bbl');

Action Result Event:

window.chatislav.add_event_listener('action-result', function(event) {
console.log('Action completed:', event.data.action, event.data.status);
console.log('From instance:', event.instanceId);

hideLoadingIndicators();

if (event.data.status === 'success') {
showSuccessMessage(event.data.result.message);
} else {
showErrorMessage(event.data.result.message);
}
}, 'ctslv_bbl');

 

Multiple Widget Instances

When working with multiple widget instances on the same page, use the instance ID to target specific widgets:

// Primary support widget
window.chatislav.add_event_listener('open', function(event) {
console.log('Primary support chat opened');
gtag('event', 'support_chat_opened');
}, 'ctslv_support');

// Sales widget
window.chatislav.add_event_listener('open', function(event) {
console.log('Sales chat opened');
gtag('event', 'sales_chat_opened');
}, 'ctslv_sales');

 

Comprehensive Integration Example

function setupChatIntegration() {
let sessionStartTime;
let messageCount = 0;

// Track session start
window.chatislav.add_event_listener('open', function(event) {
sessionStartTime = new Date();
messageCount = 0;
document.getElementById('help-button').style.display = 'none';
gtag('event', 'chat_session_started', {
instance_id: event.instanceId
});
}, 'ctslv_bbl');

// Track session end
window.chatislav.add_event_listener('close', function(event) {
if (sessionStartTime) {
const duration = new Date() - sessionStartTime;
gtag('event', 'chat_session_ended', {
duration_seconds: Math.round(duration / 1000),
message_count: messageCount,
instance_id: event.instanceId
});
}
document.getElementById('help-button').style.display = 'block';
}, 'ctslv_bbl');

// Count messages
window.chatislav.add_event_listener('message', function(event) {
messageCount++;
console.log('Message count:', messageCount, 'Instance:', event.instanceId);
}, 'ctslv_bbl');

// Handle action feedback
window.chatislav.add_event_listener('action-call', function(event) {
if (event.data.action === 'add_to_cart') {
showLoadingSpinner('Adding to cart...');
}
}, 'ctslv_bbl');

window.chatislav.add_event_listener('action-result', function(event) {
hideLoadingSpinner();
if (event.data.action === 'add_to_cart' && event.data.status === 'success') {
updateCartIcon();
showNotification('Item added!');
}
}, 'ctslv_bbl');
}

setupChatIntegration();

 

Voice Widget Events

Coming soon.

Error Handling

Always implement error handling in event listeners:

window.chatislav.add_event_listener('action-result', function(event) {
try {
if (event.data.status === 'error') {
console.error('Action failed:', event.data.result, 'Instance:', event.instanceId);
showUserFriendlyError('Something went wrong.');
} else {
processSuccessfulAction(event.data);
}
} catch (error) {
console.error('Error processing action result:', error, 'Instance:', event.instanceId);
}
}, 'ctslv_bbl');

 

Best Practices

1. Remove Unused Listeners - Clean up listeners to prevent memory leaks
2. Keep Handlers Lightweight - Move heavy processing to async functions
3. Handle Missing Data - Check if expected data exists before using it
4. Use Descriptive Names - Name handler functions clearly for debugging
5. Test Event Flows - Verify listeners work across different interaction patterns
6. Use Instance IDs - Always specify instance_id when working with multiple widgets