diff --git a/lib/backend/modules/chats.dart b/lib/backend/modules/chats.dart index e19533e..13f3c01 100644 --- a/lib/backend/modules/chats.dart +++ b/lib/backend/modules/chats.dart @@ -1104,7 +1104,7 @@ class ChatsModule { return parsed; } final row = parsed.toDbRow(); - row['in_list'] = inList ? 1 : 0; + row['in_list'] = !inList ? 0 : (chat['status'] == 'HIDDEN' ? 2 : 1); await AppDatabase.saveChats([row]); _bump(); return parsed; @@ -1144,23 +1144,24 @@ class ChatsModule { row['id'] as int: CachedChat.fromDbRow(row), }; - final rows = chats - .whereType() - .map( - (c) => parseChatRow( - c.cast(), - accountId, - currentUserId, - contactsMap, - chatsConfig, - presenceMap, - existing, - cachedAt, - ), - ) - .whereType() - .map((c) => c.toDbRow()..['in_list'] = 1) - .toList(); + final rows = >[]; + for (final c in chats.whereType()) { + final map = c.cast(); + final parsed = parseChatRow( + map, + accountId, + currentUserId, + contactsMap, + chatsConfig, + presenceMap, + existing, + cachedAt, + ); + if (parsed == null) continue; + final row = parsed.toDbRow(); + row['in_list'] = map['status'] == 'HIDDEN' ? 2 : 1; + rows.add(row); + } if (rows.isNotEmpty) { await AppDatabase.saveChats(rows); @@ -1171,9 +1172,15 @@ class ChatsModule { } } - Future> getChats(int accountId) async { + Future> getChats( + int accountId, { + bool includeHidden = false, + }) async { try { - final rows = await AppDatabase.loadChats(accountId); + final rows = await AppDatabase.loadChats( + accountId, + includeHidden: includeHidden, + ); final chats = rows.map(CachedChat.fromDbRow).toList(); return chats; } catch (e) { diff --git a/lib/core/config/komet_settings.dart b/lib/core/config/komet_settings.dart index 9e3b849..ce875f3 100644 --- a/lib/core/config/komet_settings.dart +++ b/lib/core/config/komet_settings.dart @@ -9,6 +9,7 @@ class KometSettings { static const _kAntiRead = 'komet_anti_read'; static const _kSelfOnlineCheck = 'komet_self_online_check'; static const _kHideAllChatsFolder = 'komet_hide_all_chats_folder'; + static const _kShowHiddenChats = 'komet_show_hidden_chats'; static final ValueNotifier viewDeleted = ValueNotifier(false); static final ValueNotifier viewRedacted = ValueNotifier(false); @@ -17,6 +18,7 @@ class KometSettings { static final ValueNotifier antiRead = ValueNotifier(false); static final ValueNotifier selfOnlineCheck = ValueNotifier(true); static final ValueNotifier hideAllChatsFolder = ValueNotifier(false); + static final ValueNotifier showHiddenChats = ValueNotifier(false); static Future load() async { final prefs = await SharedPreferences.getInstance(); @@ -27,6 +29,7 @@ class KometSettings { antiRead.value = prefs.getBool(_kAntiRead) ?? false; selfOnlineCheck.value = prefs.getBool(_kSelfOnlineCheck) ?? true; hideAllChatsFolder.value = prefs.getBool(_kHideAllChatsFolder) ?? false; + showHiddenChats.value = prefs.getBool(_kShowHiddenChats) ?? false; } static Future setViewDeleted(bool value) async { @@ -70,4 +73,10 @@ class KometSettings { final prefs = await SharedPreferences.getInstance(); await prefs.setBool(_kHideAllChatsFolder, value); } + + static Future setShowHiddenChats(bool value) async { + showHiddenChats.value = value; + final prefs = await SharedPreferences.getInstance(); + await prefs.setBool(_kShowHiddenChats, value); + } } diff --git a/lib/core/storage/app_database.dart b/lib/core/storage/app_database.dart index 810b4ab..b29486a 100644 --- a/lib/core/storage/app_database.dart +++ b/lib/core/storage/app_database.dart @@ -709,11 +709,16 @@ class AppDatabase { ); } - static Future>> loadChats(int accountId) async { + static Future>> loadChats( + int accountId, { + bool includeHidden = false, + }) async { final db = await _instance; return db.query( 'chats_cache', - where: 'account_id = ? AND in_list = 1', + where: includeHidden + ? 'account_id = ? AND in_list IN (1, 2)' + : 'account_id = ? AND in_list = 1', whereArgs: [accountId], orderBy: 'last_event_time DESC', ); diff --git a/lib/frontend/screens/chats/chat_list_screen.dart b/lib/frontend/screens/chats/chat_list_screen.dart index 04f107d..86b7229 100644 --- a/lib/frontend/screens/chats/chat_list_screen.dart +++ b/lib/frontend/screens/chats/chat_list_screen.dart @@ -549,6 +549,7 @@ class _ChatListScreenState extends State AppStories.current.addListener(_onStoriesEnabledChanged); storiesModule.storiesChanged.addListener(_onStoriesDataChanged); KometSettings.hideAllChatsFolder.addListener(_requestReload); + KometSettings.showHiddenChats.addListener(_requestReload); _maybeLoadStories(); _typingSub = api.pushStream .where((p) => p.opcode == Opcode.notifTyping) @@ -709,7 +710,10 @@ class _ChatListScreenState extends State } try { - final loadedChats = await chats.getChats(p.id); + final loadedChats = await chats.getChats( + p.id, + includeHidden: KometSettings.showHiddenChats.value, + ); var folders = await FoldersModule.loadFolders(p.id); final foldersKnown = await FoldersModule.hasReceivedFoldersList(p.id); final contactIds = (await ContactsModule.getContacts(p.id)) @@ -1153,6 +1157,7 @@ class _ChatListScreenState extends State AppStories.current.removeListener(_onStoriesEnabledChanged); storiesModule.storiesChanged.removeListener(_onStoriesDataChanged); KometSettings.hideAllChatsFolder.removeListener(_requestReload); + KometSettings.showHiddenChats.removeListener(_requestReload); _loginSub?.cancel(); _stateSub?.cancel(); _typingSub?.cancel(); diff --git a/lib/frontend/screens/profile/komet_settings_screen.dart b/lib/frontend/screens/profile/komet_settings_screen.dart index 1bcdc14..18545da 100644 --- a/lib/frontend/screens/profile/komet_settings_screen.dart +++ b/lib/frontend/screens/profile/komet_settings_screen.dart @@ -86,6 +86,18 @@ class KometSettingsScreen extends StatelessWidget { onChanged: KometSettings.setHideAllChatsFolder, ), ), + ValueListenableBuilder( + valueListenable: KometSettings.showHiddenChats, + builder: (context, value, _) => SettingsToggleTile( + icon: Symbols.visibility_lock, + label: 'Show hidden chats', + subtitle: + 'Показывать скрытые чаты (например, от групповых ' + 'звонков), которые обычно не отображаются в списке', + value: value, + onChanged: KometSettings.setShowHiddenChats, + ), + ), ], ), const SizedBox(height: 20),