From 3c426f2a14766d01dd736582c43f01617c21fa8a Mon Sep 17 00:00:00 2001 From: pradeepkumar Date: Sat, 28 Mar 2026 20:13:25 +0530 Subject: [PATCH] feat: implement message delivery status tracking via socket events and provider state updates --- .../messaging/data/socket_service.dart | 7 ++++ .../providers/messaging_provider.dart | 32 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/lib/features/messaging/data/socket_service.dart b/lib/features/messaging/data/socket_service.dart index 0ac01de..49047ce 100644 --- a/lib/features/messaging/data/socket_service.dart +++ b/lib/features/messaging/data/socket_service.dart @@ -36,6 +36,7 @@ class SocketService { final _supportTypingStopController = StreamController>.broadcast(); final _connectionRequestController = StreamController>.broadcast(); final _connectionResponseController = StreamController>.broadcast(); + final _deliveredController = StreamController>.broadcast(); Stream get onNewMessage => _messageController.stream; Stream> get onTypingStart => _typingStartController.stream; @@ -48,6 +49,7 @@ class SocketService { Stream> get onSupportTypingStop => _supportTypingStopController.stream; Stream> get onConnectionRequest => _connectionRequestController.stream; Stream> get onConnectionResponse => _connectionResponseController.stream; + Stream> get onMessageDelivered => _deliveredController.stream; bool get isConnected => _isConnected; Future connect() async { @@ -186,6 +188,10 @@ class SocketService { _connectionResponseController.add(Map.from(data as Map)); }); + _socket!.on('message_delivered', (data) { + _deliveredController.add(Map.from(data as Map)); + }); + _socket!.connect(); } @@ -312,5 +318,6 @@ class SocketService { _supportTypingStopController.close(); _connectionRequestController.close(); _connectionResponseController.close(); + _deliveredController.close(); } } diff --git a/lib/features/messaging/presentation/providers/messaging_provider.dart b/lib/features/messaging/presentation/providers/messaging_provider.dart index ef5d3ed..5db0893 100644 --- a/lib/features/messaging/presentation/providers/messaging_provider.dart +++ b/lib/features/messaging/presentation/providers/messaging_provider.dart @@ -171,6 +171,38 @@ class MessagingNotifier extends StateNotifier { } })); + // Delivered receipts — update single tick → double tick + _subscriptions.add(_socket.onMessageDelivered.listen((data) { + if (!mounted) return; + final convId = data['conversationId'] as String?; + final messageId = data['messageId'] as String?; + final deliveredAt = data['deliveredAt'] as String?; + if (convId == null) return; + + final currentMessages = List.from(state.messages[convId] ?? []); + bool changed = false; + + final updatedMessages = currentMessages.map((m) { + // Update specific message or all sent messages in this conversation + if (messageId != null && m.id == messageId && m.status == MessageStatus.sent) { + changed = true; + return m.copyWith(status: MessageStatus.delivered, deliveredAt: deliveredAt); + } + // If no specific messageId, mark all sent messages as delivered + if (messageId == null && m.senderId == _currentUserId && m.status == MessageStatus.sent) { + changed = true; + return m.copyWith(status: MessageStatus.delivered, deliveredAt: deliveredAt); + } + return m; + }).toList(); + + if (changed) { + final newMessages = Map>.from(state.messages) + ..[convId] = updatedMessages; + state = state.copyWith(messages: newMessages); + } + })); + // Read receipts — update message ticks and conversation unread count _subscriptions.add(_socket.onMessagesRead.listen((data) { if (!mounted) return;