From 1c57bb6f40304efceadfff17aefbbfcc64c9ad5f Mon Sep 17 00:00:00 2001
From: Matthias Nott <mnott@mnsoft.org>
Date: Sun, 22 Mar 2026 16:30:07 +0100
Subject: [PATCH] fix: disable catch_up replay to prevent message loss
---
lib/screens/chat_screen.dart | 21 +++++++++------------
1 files changed, 9 insertions(+), 12 deletions(-)
diff --git a/lib/screens/chat_screen.dart b/lib/screens/chat_screen.dart
index d0f67d1..1982f27 100644
--- a/lib/screens/chat_screen.dart
+++ b/lib/screens/chat_screen.dart
@@ -73,10 +73,11 @@
_initConnection();
}
- void _saveLastSeq() {
- SharedPreferences.getInstance().then((prefs) {
- prefs.setInt('lastSeq', _lastSeq);
- });
+ SharedPreferences? _prefs;
+
+ Future<void> _saveLastSeq() async {
+ _prefs ??= await SharedPreferences.getInstance();
+ await _prefs!.setInt('lastSeq', _lastSeq);
}
@override
@@ -206,18 +207,14 @@
final sessionId = msg['sessionId'] as String?;
if (sessionId != null) _incrementUnread(sessionId);
case 'catch_up':
+ // Only update lastSeq — don't replay messages.
+ // Local storage already has our messages. Replaying causes duplicates
+ // and overwrites user messages. New messages arriving while offline
+ // are stored via _storeForSession from the DIRECT broadcast path.
final serverSeq = msg['serverSeq'] as int?;
if (serverSeq != null && serverSeq > _lastSeq) {
_lastSeq = serverSeq;
_saveLastSeq();
- }
- final messages = msg['messages'] as List<dynamic>?;
- if (messages != null && messages.isNotEmpty) {
- _isCatchingUp = true;
- for (final m in messages) {
- _handleMessage(m as Map<String, dynamic>);
- }
- _isCatchingUp = false;
}
case 'pong':
break; // heartbeat response, ignore
--
Gitblit v1.3.1