import { io } from 'socket.io-client'; const WS_URL = import.meta.env.VITE_WS_URL || 'http://localhost:3000'; class SocketService { constructor() { this.socket = null; this.listeners = new Map(); } connect() { if (this.socket?.connected) { return this.socket; } this.socket = io(WS_URL, { withCredentials: true, transports: ['websocket', 'polling'], }); this.socket.on('connect', () => { console.log('WebSocket connected:', this.socket.id); }); this.socket.on('disconnect', () => { console.log('WebSocket disconnected'); }); this.socket.on('error', (error) => { console.error('WebSocket error:', error); }); return this.socket; } disconnect() { if (this.socket) { this.socket.disconnect(); this.socket = null; } } on(event, callback) { if (!this.socket) { this.connect(); } this.socket.on(event, callback); if (!this.listeners.has(event)) { this.listeners.set(event, []); } this.listeners.get(event).push(callback); } off(event, callback) { if (this.socket) { this.socket.off(event, callback); } if (this.listeners.has(event)) { const callbacks = this.listeners.get(event); const index = callbacks.indexOf(callback); if (index > -1) { callbacks.splice(index, 1); } } } emit(event, data) { if (!this.socket) { this.connect(); } this.socket.emit(event, data); } // Game-specific methods joinRoom(roomCode, userId) { this.emit('joinRoom', { roomCode, userId }); } startGame(roomId, roomCode) { this.emit('startGame', { roomId, roomCode }); } revealAnswer(roomCode, answerIndex) { this.emit('revealAnswer', { roomCode, answerIndex }); } updateScore(participantId, score, roomCode) { this.emit('updateScore', { participantId, score, roomCode }); } nextQuestion(roomCode) { this.emit('nextQuestion', { roomCode }); } endGame(roomId, roomCode) { this.emit('endGame', { roomId, roomCode }); } } export default new SocketService();