TIF_E41211115_Genso_quiz_app/lib/data/services/socket_service.dart

133 lines
3.4 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 _quizStartedController = StreamController<void>.broadcast();
final _errorController = StreamController<String>.broadcast();
Stream<Map<String, dynamic>> get roomMessages => _roomMessageController.stream;
Stream<Map<String, dynamic>> get chatMessages => _chatMessageController.stream;
Stream<void> get quizStarted => _quizStartedController.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('Message from ${data['from']}: ${data['message']}');
_chatMessageController.add(Map<String, dynamic>.from(data));
});
socket.on('quiz_started', (_) {
logC.i('Quiz has started!');
_quizStartedController.add(null);
});
socket.on('error', (data) {
logC.i('Socket error: $data');
_errorController.add(data.toString());
});
}
void joinRoom({required String sessionCode, required String userId}) {
var data = {
'session_code': sessionCode,
'user_id': userId,
};
print(data);
socket.emit(
'join_room',
data,
);
}
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,
});
}
/// Emit when admin starts the quiz
void startQuiz({required String sessionCode}) {
socket.emit('start_quiz', {
'session_code': sessionCode,
});
}
/// Emit user's answer during quiz
void sendAnswer({
required String sessionId,
required String userId,
required int questionIndex,
required dynamic answer,
}) {
socket.emit('submit_answer', {
'session_id': sessionId,
'user_id': userId,
'question_index': questionIndex,
'answer': answer,
});
}
/// Emit when user finishes the quiz
void doneQuiz({
required String sessionId,
required String userId,
}) {
socket.emit('quiz_done', {
'session_id': sessionId,
'user_id': userId,
});
}
void dispose() {
socket.dispose();
_roomMessageController.close();
_chatMessageController.close();
_quizStartedController.close();
_errorController.close();
}
}