import 'dart:async'; import 'package:quiz_app/core/endpoint/api_endpoint.dart'; import 'package:socket_io_client/socket_io_client.dart' as io; class SocketService { late io.Socket socket; final _roomMessageController = StreamController>.broadcast(); final _chatMessageController = StreamController>.broadcast(); final _errorController = StreamController.broadcast(); Stream> get roomMessages => _roomMessageController.stream; Stream> get chatMessages => _chatMessageController.stream; Stream get errors => _errorController.stream; void initSocketConnection() { socket = io.io( APIEndpoint.baseUrl, io.OptionBuilder() .setTransports(['websocket']) // WebSocket mode .disableAutoConnect() .build(), ); socket.connect(); socket.onConnect((_) { print('Connected: ${socket.id}'); }); socket.onDisconnect((_) { print('Disconnected'); }); socket.on('connection_response', (data) { print('Connection response: $data'); }); socket.on('room_message', (data) { print('Room Message: $data'); _roomMessageController.add(Map.from(data)); }); socket.on('receive_message', (data) { print('Message from ${data['from']}: ${data['message']}'); _chatMessageController.add(Map.from(data)); }); socket.on('error', (data) { print('Socket error: $data'); _errorController.add(data.toString()); }); } void joinRoom({required String sessionCode, required String userId}) { socket.emit('join_room', { 'session_code': sessionCode, 'user_id': userId, }); } void leaveRoom({required String sessionId, String username = "anonymous"}) { socket.emit('leave_room', { 'session_id': sessionId, 'username': username, }); } void sendMessage({ required String sessionId, required String message, String username = "anonymous", }) { socket.emit('send_message', { 'session_id': sessionId, 'message': message, 'username': username, }); } void dispose() { socket.dispose(); _roomMessageController.close(); _chatMessageController.close(); _errorController.close(); } }