feat: implement automatic message delivery acknowledgement to trigger real-time double-tick status updates
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user