Matthias Nott
2026-03-24 e76a5e274204ced68e3bc6e8b8ccf0c65517035d
lib/screens/chat_screen.dart
....@@ -59,6 +59,7 @@
5959 bool _sessionReady = false;
6060 final List<Map<String, dynamic>> _pendingMessages = [];
6161 final Map<String, List<Message>> _catchUpPending = {};
62
+ List<String>? _cachedSessionOrder;
6263
6364 @override
6465 void initState() {
....@@ -72,7 +73,8 @@
7273 // Load persisted state BEFORE connecting
7374 final prefs = await SharedPreferences.getInstance();
7475 _lastSeq = prefs.getInt('lastSeq') ?? 0;
75
- // Restore last active session so catch_up routes to the right session
76
+ // Restore saved session order and active session
77
+ _cachedSessionOrder = prefs.getStringList('sessionOrder');
7678 final savedSessionId = prefs.getString('activeSessionId');
7779 if (savedSessionId != null && mounted) {
7880 ref.read(activeSessionIdProvider.notifier).state = savedSessionId;
....@@ -364,9 +366,11 @@
364366 final sessionsJson = msg['sessions'] as List<dynamic>?;
365367 if (sessionsJson == null) return;
366368
367
- final sessions = sessionsJson
369
+ var sessions = sessionsJson
368370 .map((s) => Session.fromJson(s as Map<String, dynamic>))
369371 .toList();
372
+ // Apply saved custom order (reordered sessions persist across updates)
373
+ sessions = _applyCustomOrder(sessions);
370374 ref.read(sessionsProvider.notifier).state = sessions;
371375
372376 final activeId = ref.read(activeSessionIdProvider);
....@@ -1242,6 +1246,28 @@
12421246 final item = sessions.removeAt(oldIndex);
12431247 sessions.insert(newIndex, item);
12441248 ref.read(sessionsProvider.notifier).state = sessions;
1249
+ // Persist custom order
1250
+ _saveSessionOrder(sessions.map((s) => s.id).toList());
1251
+ }
1252
+
1253
+ void _saveSessionOrder(List<String> ids) {
1254
+ SharedPreferences.getInstance().then((p) => p.setStringList('sessionOrder', ids));
1255
+ }
1256
+
1257
+ /// Apply saved custom order to a server-provided session list.
1258
+ /// New sessions (not in saved order) are appended at the end.
1259
+ List<Session> _applyCustomOrder(List<Session> sessions) {
1260
+ if (_cachedSessionOrder == null || _cachedSessionOrder!.isEmpty) return sessions;
1261
+ final order = _cachedSessionOrder!;
1262
+ final byId = {for (final s in sessions) s.id: s};
1263
+ final ordered = <Session>[];
1264
+ for (final id in order) {
1265
+ final s = byId.remove(id);
1266
+ if (s != null) ordered.add(s);
1267
+ }
1268
+ // Append any new sessions not in saved order
1269
+ ordered.addAll(byId.values);
1270
+ return ordered;
12451271 }
12461272
12471273 void _refreshSessions() {