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