import {
getAiChatExtensionSdk,
AiChatExtensionSdkEventType,
type AiChatExtensionSdkEvent,
} from '@sleek/ai-chat-extension-sdk';
// Track session durations
const sessionTimers = new Map<string, number>();
// Register event listener
getAiChatExtensionSdk().registerEventListener((event, tabDetails) => {
const baseProperties = {
tabId: tabDetails.tabId,
tabUrl: tabDetails.tabUrl,
timestamp: Date.now(),
};
switch (event.type) {
case AiChatExtensionSdkEventType.QUERY_CLASSIFIED:
analytics.track('ai_chat_query_classified', {
...baseProperties,
origin: event.data.origin,
classification: event.data.classification,
query: event.data.query,
isShoppingQuery: event.data.classification === 'shopping',
});
break;
case AiChatExtensionSdkEventType.CHAT_BADGE_SHOWN:
analytics.track('ai_chat_badge_shown', {
...baseProperties,
query: event.data.query,
promptCount: event.data.suggestedPrompts?.length ?? 0,
});
break;
case AiChatExtensionSdkEventType.CHAT_BADGE_CLICKED:
analytics.track('ai_chat_badge_clicked', {
...baseProperties,
clickedPrompt: event.data.prompt,
clickedSuggestedPrompt: !!event.data.prompt,
});
break;
case AiChatExtensionSdkEventType.CHAT_BADGE_CLOSED:
analytics.track('ai_chat_badge_dismissed', {
...baseProperties,
promptCount: event.data.suggestedPrompts?.length ?? 0,
});
break;
case AiChatExtensionSdkEventType.CHAT_PANEL_OPENED:
sessionTimers.set(event.data.chatSessionId, Date.now());
analytics.track('ai_chat_panel_opened', {
...baseProperties,
chatSessionId: event.data.chatSessionId,
hasInitialMessage: !!event.data.initialMessage,
initialMessage: event.data.initialMessage,
});
break;
case AiChatExtensionSdkEventType.CHAT_PANEL_MESSAGE_SENT:
analytics.track('ai_chat_message_sent', {
...baseProperties,
chatSessionId: event.data.chatSessionId,
});
break;
case AiChatExtensionSdkEventType.CHAT_PANEL_LINK_CLICKED:
analytics.track('ai_chat_link_clicked', {
...baseProperties,
chatSessionId: event.data.chatSessionId,
url: event.data.url,
merchantName: event.data.merchantName,
merchantUrl: event.data.merchantUrl,
});
break;
case AiChatExtensionSdkEventType.CHAT_PANEL_PRODUCTS_CLICKED:
analytics.track('ai_chat_product_clicked', {
...baseProperties,
chatSessionId: event.data.chatSessionId,
url: event.data.url,
merchantName: event.data.merchantName,
merchantUrl: event.data.merchantUrl,
});
break;
case AiChatExtensionSdkEventType.CHAT_PANEL_TOP_MERCHANTS_CLICKED:
analytics.track('ai_chat_merchant_clicked', {
...baseProperties,
chatSessionId: event.data.chatSessionId,
url: event.data.url,
merchantName: event.data.merchantName,
merchantUrl: event.data.merchantUrl,
});
break;
case AiChatExtensionSdkEventType.CHAT_PANEL_CLOSED:
const startTime = sessionTimers.get(event.data.chatSessionId);
const duration = startTime ? Date.now() - startTime : 0;
analytics.track('ai_chat_panel_closed', {
...baseProperties,
chatSessionId: event.data.chatSessionId,
sessionDurationMs: duration,
sessionDurationSeconds: Math.floor(duration / 1000),
});
sessionTimers.delete(event.data.chatSessionId);
break;
}
});