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
JavaScript
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