UNPKG

mcp-quiz-server

Version:

🧠 AI-Powered Quiz Management via Model Context Protocol (MCP) - Create, manage, and take quizzes directly from VS Code, Claude, and other AI agents.

161 lines 6.38 kB
import { AuthManager } from './components/AuthManager'; import { Dashboard } from './components/Dashboard'; import { QuizContent } from './components/quiz/QuizContent'; import { QuizList } from './components/QuizList'; import { ResultsModal } from './components/ResultsModal'; import { SettingsMenu } from './components/SettingsMenu'; import { SidebarToggle } from './components/SidebarToggle'; import { ThemeSelector } from './components/ThemeSelector'; import { TourModal } from './components/TourModal'; import { SettingsService } from './services/SettingsService'; import { ThemeService } from './services/ThemeService'; import { TimerService } from './services/TimerService'; import { TourService } from './services/TourService'; import { AppStore } from './store/AppStore'; import { DOMUtils } from './utils/index'; class QuizApp { constructor() { this.store = AppStore.getInstance(); this.themeService = ThemeService.getInstance(); this.settingsService = SettingsService.getInstance(); this.timerService = TimerService.getInstance(); this.tourService = TourService.getInstance(); this.components = { authManager: AuthManager.getInstance(), quizList: new QuizList(), quizContent: new QuizContent(), themeSelector: new ThemeSelector(), resultsModal: new ResultsModal(), settingsMenu: new SettingsMenu(), sidebarToggle: new SidebarToggle(), tourModal: new TourModal(), }; } async initialize() { try { this.themeService.initialize(); Object.values(this.components).forEach(component => { component.mount(); }); await this.store.loadQuizzes(); this.initializeTourSystem(); this.setupErrorHandling(); console.log('✅ Quiz Platform initialized successfully'); } catch (error) { console.error('❌ Failed to initialize Quiz Platform:', error); DOMUtils.showToast('Failed to initialize application', 'error'); } } initializeTourSystem() { try { this.addTourAttributes(); if (this.tourService.shouldShowWelcomeTour()) { setTimeout(() => { console.log('🎯 Starting welcome tour for first-time user'); this.tourService.startTour('welcome'); }, 1500); } this.addTourTriggers(); console.log('✨ Tour system initialized successfully'); } catch (error) { console.error('❌ Failed to initialize tour system:', error); } } addTourAttributes() { const settingsBtn = document.querySelector('#settings-btn, [data-settings-trigger]'); if (settingsBtn) { settingsBtn.setAttribute('data-tour', 'settings-button'); } const timerToggle = document.querySelector('#timer-toggle'); if (timerToggle) { timerToggle.setAttribute('data-tour', 'timer-toggle'); } const viewToggle = document.querySelector('#view-mode-toggle, [data-view-toggle]'); if (viewToggle) { viewToggle.setAttribute('data-tour', 'view-toggle'); } const navButtons = document.querySelector('.nav-buttons, #navigation-buttons'); if (navButtons) { navButtons.setAttribute('data-tour', 'navigation-buttons'); } } addTourTriggers() { const settingsMenu = document.querySelector('#settings-dropdown'); if (settingsMenu) { const tourButton = document.createElement('button'); tourButton.className = 'tour-trigger-btn w-full text-left px-4 py-2 text-sm text-surface-700 dark:text-surface-300 hover:bg-surface-100 dark:hover:bg-surface-600 flex items-center gap-2'; tourButton.innerHTML = ` <i data-lucide="help-circle" class="w-4 h-4"></i> <span>Take Tour</span> `; tourButton.addEventListener('click', () => { console.log('🎯 User requested tour'); this.tourService.startTour('welcome'); }); const lastItem = settingsMenu.querySelector(':scope > :last-child'); if (lastItem) { settingsMenu.insertBefore(tourButton, lastItem); } else { settingsMenu.appendChild(tourButton); } if (typeof window.lucide !== 'undefined') { window.lucide.createIcons(); } } } setupErrorHandling() { window.addEventListener('error', event => { console.error('Global error:', event.error); DOMUtils.showToast('An unexpected error occurred', 'error'); }); window.addEventListener('unhandledrejection', event => { console.error('Unhandled promise rejection:', event.reason); DOMUtils.showToast('An unexpected error occurred', 'error'); }); } getSettingsService() { return this.settingsService; } getStore() { return this.store; } getComponents() { return this.components; } destroy() { Object.values(this.components).forEach(component => { component?.unmount(); }); } } export async function initializeDashboard() { try { console.log('🚀 Initializing Dashboard Application...'); const store = AppStore.getInstance(); const themeService = ThemeService.getInstance(); const settingsService = SettingsService.getInstance(); await themeService.initialize(); const dashboard = new Dashboard(); await dashboard.mount(); console.log('✅ Dashboard Application initialized successfully'); window.__dashboard = dashboard; window.__store = store; } catch (error) { console.error('❌ Dashboard initialization failed:', error); throw error; } } document.addEventListener('DOMContentLoaded', async () => { if (!window.location.pathname.includes('/dashboard')) { const app = new QuizApp(); await app.initialize(); window.__quizApp = app; } }); export default QuizApp; //# sourceMappingURL=main.js.map