TIF_E41211115_Genso_quiz_app/lib/data/services/socket_service.dart

163 lines
5.0 KiB
Dart

import 'dart:async';
import 'package:quiz_app/core/endpoint/api_endpoint.dart';
import 'package:quiz_app/core/utils/logger.dart';
import 'package:socket_io_client/socket_io_client.dart' as io;
class SocketService {
late io.Socket socket;
final _roomMessageController = StreamController<Map<String, dynamic>>.broadcast();
final _chatMessageController = StreamController<Map<String, dynamic>>.broadcast();
final _questionUpdateController = StreamController<Map<String, dynamic>>.broadcast();
final _quizStartedController = StreamController<void>.broadcast();
final _answerSubmittedController = StreamController<Map<String, dynamic>>.broadcast();
final _scoreUpdateController = StreamController<Map<String, dynamic>>.broadcast();
final _quizDoneController = StreamController<void>.broadcast();
final _roomClosedController = StreamController<String>.broadcast();
final _errorController = StreamController<String>.broadcast();
// Public streams
Stream<Map<String, dynamic>> get roomMessages => _roomMessageController.stream;
Stream<Map<String, dynamic>> get questionUpdate => _questionUpdateController.stream;
Stream<Map<String, dynamic>> get chatMessages => _chatMessageController.stream;
Stream<void> get quizStarted => _quizStartedController.stream;
Stream<Map<String, dynamic>> get answerSubmitted => _answerSubmittedController.stream;
Stream<Map<String, dynamic>> get scoreUpdates => _scoreUpdateController.stream;
Stream<void> get quizDone => _quizDoneController.stream;
Stream<String> get roomClosed => _roomClosedController.stream;
Stream<String> get errors => _errorController.stream;
void initSocketConnection() {
socket = io.io(
APIEndpoint.baseUrl,
io.OptionBuilder().setTransports(['websocket']).disableAutoConnect().build(),
);
socket.connect();
socket.onConnect((_) {
logC.i('✅ Connected: ${socket.id}');
});
socket.onDisconnect((_) {
logC.i('❌ Disconnected');
});
socket.on('connection_response', (data) {
logC.i('🟢 Connection response: $data');
});
socket.on('room_message', (data) {
logC.i('📥 Room Message: $data');
_roomMessageController.add(Map<String, dynamic>.from(data));
});
socket.on('receive_message', (data) {
logC.i('💬 Chat from ${data['from']}: ${data['message']}');
_chatMessageController.add(Map<String, dynamic>.from(data));
});
socket.on('quiz_started', (_) {
logC.i('🚀 Quiz Started!');
_quizStartedController.add(null);
});
socket.on('quiz_question', (data) {
logC.i('🚀 question getted!');
_questionUpdateController.add(Map<String, dynamic>.from(data));
});
socket.on('answer_submitted', (data) {
logC.i('✅ Answer Submitted: $data');
_answerSubmittedController.add(Map<String, dynamic>.from(data));
});
socket.on('score_update', (data) {
logC.i('📊 Score Update: $data');
_scoreUpdateController.add(Map<String, dynamic>.from(data));
});
socket.on('quiz_done', (_) {
logC.i('🏁 Quiz Finished!');
_quizDoneController.add(null);
});
socket.on('room_closed', (data) {
logC.i('🔒 Room Closed: $data');
_roomClosedController.add(data['room'].toString());
});
socket.on('error', (data) {
logC.e('⚠️ 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, required String userId, String username = "anonymous"}) {
socket.emit('leave_room', {
'session_id': sessionId,
'user_id': userId,
'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 startQuiz({required String sessionId}) {
socket.emit('start_quiz', {
'session_id': sessionId,
});
}
void sendAnswer({
required String sessionId,
required String userId,
required int questionIndex,
required int timeSpent,
required dynamic answer,
}) {
socket.emit('submit_answer', {
'session_id': sessionId,
'user_id': userId,
'question_index': questionIndex,
'answer': answer,
'time_spent': timeSpent,
});
}
void endSession({required String sessionId, required String userId}) {
socket.emit('end_session', {
'session_id': sessionId,
'user_id': userId,
});
}
void dispose() {
socket.dispose();
_roomMessageController.close();
_chatMessageController.close();
_quizStartedController.close();
_answerSubmittedController.close();
_scoreUpdateController.close();
_quizDoneController.close();
_roomClosedController.close();
_errorController.close();
}
}