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) {
|
_socket!.on('new_message', (data) {
|
||||||
try {
|
try {
|
||||||
final message = ChatMessage.fromJson(data as Map<String, dynamic>);
|
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);
|
_messageController.add(message);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
_log.e('Error parsing new_message: $e');
|
_log.e('Error parsing new_message: $e');
|
||||||
@@ -305,6 +312,16 @@ class SocketService {
|
|||||||
_socket?.emit('mark_read', {'conversationId': conversationId});
|
_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() {
|
void dispose() {
|
||||||
disconnect();
|
disconnect();
|
||||||
_messageController.close();
|
_messageController.close();
|
||||||
|
|||||||
@@ -106,6 +106,10 @@ class MessagingNotifier extends StateNotifier<MessagingState> {
|
|||||||
final isMine = message.senderId == _currentUserId;
|
final isMine = message.senderId == _currentUserId;
|
||||||
if (isMine) return;
|
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);
|
currentMessages.insert(0, message);
|
||||||
final updatedMessages =
|
final updatedMessages =
|
||||||
Map<String, List<ChatMessage>>.from(state.messages)
|
Map<String, List<ChatMessage>>.from(state.messages)
|
||||||
|
|||||||
Reference in New Issue
Block a user