feat: implement automatic message delivery acknowledgement to trigger real-time double-tick status updates

This commit is contained in:
pradeepkumar
2026-04-07 19:53:12 +05:30
parent 2913947a34
commit 821e1a0689
2 changed files with 21 additions and 0 deletions

View File

@@ -139,6 +139,13 @@ class SocketService {
_socket!.on('new_message', (data) {
try {
final message = ChatMessage.fromJson(data as Map<String, dynamic>);
// Auto-ack delivery so sender gets real-time double-tick
try {
_socket?.emit('message_received', {
'messageId': message.id,
'conversationId': message.conversationId,
});
} catch (_) {}
_messageController.add(message);
} catch (e) {
_log.e('Error parsing new_message: $e');
@@ -305,6 +312,16 @@ class SocketService {
_socket?.emit('mark_read', {'conversationId': conversationId});
}
/// Acknowledge that we (the receiver) have received a message via socket.
/// Backend marks it as DELIVERED and emits `message_delivered` to the sender,
/// making the sender's tick update from single → double in real time.
void ackMessageReceived(String conversationId, String messageId) {
_socket?.emit('message_received', {
'conversationId': conversationId,
'messageId': messageId,
});
}
void dispose() {
disconnect();
_messageController.close();

View File

@@ -106,6 +106,10 @@ class MessagingNotifier extends StateNotifier<MessagingState> {
final isMine = message.senderId == _currentUserId;
if (isMine) return;
// Immediately ack delivery to backend so sender's tick goes single → double.
// This works regardless of Redis presence state and avoids races on send.
_socket.ackMessageReceived(convId, message.id);
currentMessages.insert(0, message);
final updatedMessages =
Map<String, List<ChatMessage>>.from(state.messages)