feat: Implement support chat functionality, add 2FA verification screen and routing, and update dependencies.
This commit is contained in:
@@ -3,6 +3,7 @@ import 'package:logger/logger.dart';
|
||||
import 'package:real_estate_mobile/config/app_config.dart';
|
||||
import 'package:real_estate_mobile/core/storage/secure_storage.dart';
|
||||
import 'package:real_estate_mobile/features/messaging/data/models/message.dart';
|
||||
import 'package:real_estate_mobile/features/support_chat/data/models/support_chat_models.dart';
|
||||
|
||||
// We'll use a simple WebSocket approach for now since socket_io_client needs to be added
|
||||
// This will be a placeholder that uses REST polling until socket_io_client is added
|
||||
@@ -26,6 +27,9 @@ class SocketService {
|
||||
final _statusController = StreamController<Map<String, dynamic>>.broadcast();
|
||||
final _readController = StreamController<Map<String, dynamic>>.broadcast();
|
||||
final _connectionController = StreamController<bool>.broadcast();
|
||||
final _supportMessageController = StreamController<SupportMessage>.broadcast();
|
||||
final _supportTypingStartController = StreamController<Map<String, dynamic>>.broadcast();
|
||||
final _supportTypingStopController = StreamController<Map<String, dynamic>>.broadcast();
|
||||
|
||||
Stream<ChatMessage> get onNewMessage => _messageController.stream;
|
||||
Stream<Map<String, dynamic>> get onTypingStart => _typingStartController.stream;
|
||||
@@ -33,6 +37,9 @@ class SocketService {
|
||||
Stream<Map<String, dynamic>> get onStatusChange => _statusController.stream;
|
||||
Stream<Map<String, dynamic>> get onMessagesRead => _readController.stream;
|
||||
Stream<bool> get onConnectionChange => _connectionController.stream;
|
||||
Stream<SupportMessage> get onSupportMessage => _supportMessageController.stream;
|
||||
Stream<Map<String, dynamic>> get onSupportTypingStart => _supportTypingStartController.stream;
|
||||
Stream<Map<String, dynamic>> get onSupportTypingStop => _supportTypingStopController.stream;
|
||||
bool get isConnected => _isConnected;
|
||||
|
||||
Future<void> connect() async {
|
||||
@@ -113,6 +120,24 @@ class SocketService {
|
||||
_readController.add(Map<String, dynamic>.from(data as Map));
|
||||
});
|
||||
|
||||
// Support chat events
|
||||
_socket!.on('support_new_message', (data) {
|
||||
try {
|
||||
final message = SupportMessage.fromJson(data as Map<String, dynamic>);
|
||||
_supportMessageController.add(message);
|
||||
} catch (e) {
|
||||
_log.e('Error parsing support_new_message: $e');
|
||||
}
|
||||
});
|
||||
|
||||
_socket!.on('support_typing_start', (data) {
|
||||
_supportTypingStartController.add(Map<String, dynamic>.from(data as Map));
|
||||
});
|
||||
|
||||
_socket!.on('support_typing_stop', (data) {
|
||||
_supportTypingStopController.add(Map<String, dynamic>.from(data as Map));
|
||||
});
|
||||
|
||||
_socket!.connect();
|
||||
}
|
||||
|
||||
@@ -188,6 +213,11 @@ class SocketService {
|
||||
_socket?.emit('typing_stop', {'conversationId': conversationId});
|
||||
}
|
||||
|
||||
/// Emit a raw event (used by support chat)
|
||||
void emitRaw(String event, Map<String, dynamic> data) {
|
||||
_socket?.emit(event, data);
|
||||
}
|
||||
|
||||
void markAsRead(String conversationId) {
|
||||
_socket?.emit('mark_read', {'conversationId': conversationId});
|
||||
}
|
||||
@@ -200,5 +230,8 @@ class SocketService {
|
||||
_statusController.close();
|
||||
_readController.close();
|
||||
_connectionController.close();
|
||||
_supportMessageController.close();
|
||||
_supportTypingStartController.close();
|
||||
_supportTypingStopController.close();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user