From e76a5e274204ced68e3bc6e8b8ccf0c65517035d Mon Sep 17 00:00:00 2001
From: Matthias Nott <mnott@mnsoft.org>
Date: Tue, 24 Mar 2026 08:14:35 +0100
Subject: [PATCH] feat: persistent session drawer order via SharedPreferences

---
 lib/screens/chat_screen.dart |   30 ++++++++++++++++++++++++++++--
 1 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/lib/screens/chat_screen.dart b/lib/screens/chat_screen.dart
index 4b209cf..b9692c4 100644
--- a/lib/screens/chat_screen.dart
+++ b/lib/screens/chat_screen.dart
@@ -59,6 +59,7 @@
   bool _sessionReady = false;
   final List<Map<String, dynamic>> _pendingMessages = [];
   final Map<String, List<Message>> _catchUpPending = {};
+  List<String>? _cachedSessionOrder;
 
   @override
   void initState() {
@@ -72,7 +73,8 @@
     // Load persisted state BEFORE connecting
     final prefs = await SharedPreferences.getInstance();
     _lastSeq = prefs.getInt('lastSeq') ?? 0;
-    // Restore last active session so catch_up routes to the right session
+    // Restore saved session order and active session
+    _cachedSessionOrder = prefs.getStringList('sessionOrder');
     final savedSessionId = prefs.getString('activeSessionId');
     if (savedSessionId != null && mounted) {
       ref.read(activeSessionIdProvider.notifier).state = savedSessionId;
@@ -364,9 +366,11 @@
     final sessionsJson = msg['sessions'] as List<dynamic>?;
     if (sessionsJson == null) return;
 
-    final sessions = sessionsJson
+    var sessions = sessionsJson
         .map((s) => Session.fromJson(s as Map<String, dynamic>))
         .toList();
+    // Apply saved custom order (reordered sessions persist across updates)
+    sessions = _applyCustomOrder(sessions);
     ref.read(sessionsProvider.notifier).state = sessions;
 
     final activeId = ref.read(activeSessionIdProvider);
@@ -1242,6 +1246,28 @@
     final item = sessions.removeAt(oldIndex);
     sessions.insert(newIndex, item);
     ref.read(sessionsProvider.notifier).state = sessions;
+    // Persist custom order
+    _saveSessionOrder(sessions.map((s) => s.id).toList());
+  }
+
+  void _saveSessionOrder(List<String> ids) {
+    SharedPreferences.getInstance().then((p) => p.setStringList('sessionOrder', ids));
+  }
+
+  /// Apply saved custom order to a server-provided session list.
+  /// New sessions (not in saved order) are appended at the end.
+  List<Session> _applyCustomOrder(List<Session> sessions) {
+    if (_cachedSessionOrder == null || _cachedSessionOrder!.isEmpty) return sessions;
+    final order = _cachedSessionOrder!;
+    final byId = {for (final s in sessions) s.id: s};
+    final ordered = <Session>[];
+    for (final id in order) {
+      final s = byId.remove(id);
+      if (s != null) ordered.add(s);
+    }
+    // Append any new sessions not in saved order
+    ordered.addAll(byId.values);
+    return ordered;
   }
 
   void _refreshSessions() {

--
Gitblit v1.3.1