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