/** * Docusaurus adapter for the chat widget * * Provides lifecycle hooks and context detection for Docusaurus sites. */ import { initChatWidget } from '../index.js'; import type { ChatWidgetConfig, PageContext, ChatWidgetAPI } from '../index.js'; export type { ChatWidgetConfig, PageContext }; /** * Docusaurus-specific configuration (omits getContext since we provide it) */ export type DocusaurusConfig = Omit; let widget: ChatWidgetAPI | null = null; let container: HTMLElement | null = null; /** * Initialize the chat widget for Docusaurus */ export function initChat(config: DocusaurusConfig): void { if (widget) return; // Create container container = document.createElement('div'); container.id = 'chat-widget-container'; document.body.appendChild(container); // Initialize widget with Docusaurus context detection widget = initChatWidget(container, { ...config, getContext: getDocusaurusContext, }); } /** * Destroy the chat widget */ export function destroyChat(): void { if (widget) { // Properly destroy widget to prevent memory leaks widget.destroy(); widget = null; } if (container) { container.remove(); container = null; } } /** * Docusaurus lifecycle hook - called on route change */ export function onRouteUpdate(): void { // Widget persists across route changes // Context is re-evaluated on each message send } /** * Detect page context from Docusaurus URL structure * * URL patterns: * - /{guide}/... → guide, latest version * - /{guide}/{version}/... → guide, specific version * - /{guide}/next/... → guide, next version */ export function getDocusaurusContext(): PageContext { const path = window.location.pathname; const segments = path.split('/').filter(Boolean); const context: PageContext = { site: 'docs', currentPage: path, }; if (segments.length === 0) return context; // First segment is typically the guide context.guide = segments[0]; // Check if second segment is a version (e.g., "2026.07.01" or "next") if (segments.length > 1) { const versionPattern = /^\d{4}\.\d{2}\.\d+$|^next$/; if (versionPattern.test(segments[1])) { context.version = segments[1]; } } return context; } /** * Create a Docusaurus client module export * * Usage in docusaurus.config.ts: * ```ts * clientModules: [ * require.resolve('@classic-homes/chat-widget/docusaurus') * ] * ``` */ export default { onRouteUpdate, };