From 1b77941196a8d4d4a1bd441f9d8500f85387594f Mon Sep 17 00:00:00 2001 From: klockky Date: Sun, 21 Jun 2026 14:31:04 +0000 Subject: [PATCH] =?UTF-8?q?fix(chats):=20=D0=BF=D1=80=D0=BE=D1=81=D0=BC?= =?UTF-8?q?=D0=BE=D1=82=D1=80=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=B0?= =?UTF-8?q?=D0=BD=D0=B0=D0=BB=20=D0=BD=D0=B5=20=D0=BF=D0=BE=D0=BF=D0=B0?= =?UTF-8?q?=D0=B4=D0=B0=D0=B5=D1=82=20=D0=B2=20=D1=81=D0=BF=D0=B8=D1=81?= =?UTF-8?q?=D0=BE=D0=BA=20=D1=87=D0=B0=D1=82=D0=BE=D0=B2=20(=D1=84=D0=BB?= =?UTF-8?q?=D0=B0=D0=B3=20in=5Flist)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/backend/modules/chats.dart | 9 ++++++--- lib/core/storage/app_database.dart | 14 ++++++++++---- lib/frontend/screens/chats/chat_screen.dart | 5 +++++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/lib/backend/modules/chats.dart b/lib/backend/modules/chats.dart index 14f1af8..08f9f30 100644 --- a/lib/backend/modules/chats.dart +++ b/lib/backend/modules/chats.dart @@ -846,6 +846,7 @@ class ChatsModule { Map chat, int accountId, { Map? preloadedExisting, + bool inList = true, }) async { final cachedAt = DateTime.now().millisecondsSinceEpoch; final id = chat['id']; @@ -876,7 +877,9 @@ class ChatsModule { if (ex != null && _sameContent(ex, parsed)) { return parsed; } - await AppDatabase.saveChats([parsed.toDbRow()]); + final row = parsed.toDbRow(); + row['in_list'] = inList ? 1 : 0; + await AppDatabase.saveChats([row]); _bump(); return parsed; } @@ -953,7 +956,7 @@ class ChatsModule { ), ) .whereType() - .map((c) => c.toDbRow()) + .map((c) => c.toDbRow()..['in_list'] = 1) .toList(); if (rows.isNotEmpty) { @@ -1295,7 +1298,7 @@ class ChatsModule { try { final info = await getChatInfo(api, chatId); if (info == null) return false; - await cacheServerChat(info, accountId); + await cacheServerChat(info, accountId, inList: false); return true; } catch (e) { logger.w('ensureChatCached failed for $chatId: $e'); diff --git a/lib/core/storage/app_database.dart b/lib/core/storage/app_database.dart index 68ddc71..f604cbf 100644 --- a/lib/core/storage/app_database.dart +++ b/lib/core/storage/app_database.dart @@ -185,7 +185,7 @@ class AppDatabase { await _migrateLegacyDb(target); return openDatabase( target, - version: 13, + version: 14, onOpen: (db) => db.execute('PRAGMA foreign_keys = ON'), onCreate: (db, _) => _createTables(db), onUpgrade: (db, oldVersion, newVersion) async { @@ -248,6 +248,11 @@ class AppDatabase { 'ALTER TABLE messages ADD COLUMN deleted INTEGER NOT NULL DEFAULT 0', ); } + if (oldVersion < 14) { + await db.execute( + 'ALTER TABLE chats_cache ADD COLUMN in_list INTEGER NOT NULL DEFAULT 1', + ); + } }, ); } @@ -335,6 +340,7 @@ class AppDatabase { options TEXT, owner INTEGER, admins TEXT, + in_list INTEGER NOT NULL DEFAULT 1, PRIMARY KEY (id, account_id) ) '''; @@ -534,7 +540,7 @@ class AppDatabase { final db = await _instance; return db.query( 'chats_cache', - where: 'account_id = ?', + where: 'account_id = ? AND in_list = 1', whereArgs: [accountId], orderBy: 'last_event_time DESC', ); @@ -543,8 +549,8 @@ class AppDatabase { static Future sumUnread(int accountId, {int? excludeChatId}) async { final db = await _instance; final where = excludeChatId != null - ? 'account_id = ? AND id != ?' - : 'account_id = ?'; + ? 'account_id = ? AND in_list = 1 AND id != ?' + : 'account_id = ? AND in_list = 1'; final args = excludeChatId != null ? [accountId, excludeChatId] : [accountId]; diff --git a/lib/frontend/screens/chats/chat_screen.dart b/lib/frontend/screens/chats/chat_screen.dart index 0da0204..3364e7d 100644 --- a/lib/frontend/screens/chats/chat_screen.dart +++ b/lib/frontend/screens/chats/chat_screen.dart @@ -164,6 +164,7 @@ class _ChatScreenState extends State late AnimationController _shimmerController; Timer? _shimmerStartTimer; bool _historyKickedOff = false; + bool _previewChat = false; List _messages = []; final ValueNotifier _messagesRev = ValueNotifier(0); final Set _deletingIds = {}; @@ -411,6 +412,7 @@ class _ChatScreenState extends State try { final cachedRows = await AppDatabase.loadChat(_myId, widget.chatId); if (cachedRows.isEmpty) { + _previewChat = true; await ChatsModule.ensureChatCached(api, _myId, widget.chatId); await ChatsModule.subscribeChat(api, widget.chatId); } @@ -537,6 +539,9 @@ class _ChatScreenState extends State @override void dispose() { + if (_previewChat) { + unawaited(ChatsModule.subscribeChat(api, widget.chatId, subscribe: false)); + } WidgetsBinding.instance.removeObserver(this); ChatsModule.chatsChanged.removeListener(_onChatsBump); _otherUnread.dispose();