feat(chats): скрытие чатов групповых звонков + тоггл показа скрытых чатов

This commit is contained in:
klockky
2026-07-09 19:35:59 +03:00
parent 7dab8f09f7
commit cc5eb6299e
5 changed files with 61 additions and 23 deletions
+27 -20
View File
@@ -1104,7 +1104,7 @@ class ChatsModule {
return parsed; return parsed;
} }
final row = parsed.toDbRow(); final row = parsed.toDbRow();
row['in_list'] = inList ? 1 : 0; row['in_list'] = !inList ? 0 : (chat['status'] == 'HIDDEN' ? 2 : 1);
await AppDatabase.saveChats([row]); await AppDatabase.saveChats([row]);
_bump(); _bump();
return parsed; return parsed;
@@ -1144,23 +1144,24 @@ class ChatsModule {
row['id'] as int: CachedChat.fromDbRow(row), row['id'] as int: CachedChat.fromDbRow(row),
}; };
final rows = chats final rows = <Map<String, dynamic>>[];
.whereType<Map>() for (final c in chats.whereType<Map>()) {
.map( final map = c.cast<dynamic, dynamic>();
(c) => parseChatRow( final parsed = parseChatRow(
c.cast<dynamic, dynamic>(), map,
accountId, accountId,
currentUserId, currentUserId,
contactsMap, contactsMap,
chatsConfig, chatsConfig,
presenceMap, presenceMap,
existing, existing,
cachedAt, cachedAt,
), );
) if (parsed == null) continue;
.whereType<CachedChat>() final row = parsed.toDbRow();
.map((c) => c.toDbRow()..['in_list'] = 1) row['in_list'] = map['status'] == 'HIDDEN' ? 2 : 1;
.toList(); rows.add(row);
}
if (rows.isNotEmpty) { if (rows.isNotEmpty) {
await AppDatabase.saveChats(rows); await AppDatabase.saveChats(rows);
@@ -1171,9 +1172,15 @@ class ChatsModule {
} }
} }
Future<List<CachedChat>> getChats(int accountId) async { Future<List<CachedChat>> getChats(
int accountId, {
bool includeHidden = false,
}) async {
try { try {
final rows = await AppDatabase.loadChats(accountId); final rows = await AppDatabase.loadChats(
accountId,
includeHidden: includeHidden,
);
final chats = rows.map(CachedChat.fromDbRow).toList(); final chats = rows.map(CachedChat.fromDbRow).toList();
return chats; return chats;
} catch (e) { } catch (e) {
+9
View File
@@ -9,6 +9,7 @@ class KometSettings {
static const _kAntiRead = 'komet_anti_read'; static const _kAntiRead = 'komet_anti_read';
static const _kSelfOnlineCheck = 'komet_self_online_check'; static const _kSelfOnlineCheck = 'komet_self_online_check';
static const _kHideAllChatsFolder = 'komet_hide_all_chats_folder'; static const _kHideAllChatsFolder = 'komet_hide_all_chats_folder';
static const _kShowHiddenChats = 'komet_show_hidden_chats';
static final ValueNotifier<bool> viewDeleted = ValueNotifier(false); static final ValueNotifier<bool> viewDeleted = ValueNotifier(false);
static final ValueNotifier<bool> viewRedacted = ValueNotifier(false); static final ValueNotifier<bool> viewRedacted = ValueNotifier(false);
@@ -17,6 +18,7 @@ class KometSettings {
static final ValueNotifier<bool> antiRead = ValueNotifier(false); static final ValueNotifier<bool> antiRead = ValueNotifier(false);
static final ValueNotifier<bool> selfOnlineCheck = ValueNotifier(true); static final ValueNotifier<bool> selfOnlineCheck = ValueNotifier(true);
static final ValueNotifier<bool> hideAllChatsFolder = ValueNotifier(false); static final ValueNotifier<bool> hideAllChatsFolder = ValueNotifier(false);
static final ValueNotifier<bool> showHiddenChats = ValueNotifier(false);
static Future<void> load() async { static Future<void> load() async {
final prefs = await SharedPreferences.getInstance(); final prefs = await SharedPreferences.getInstance();
@@ -27,6 +29,7 @@ class KometSettings {
antiRead.value = prefs.getBool(_kAntiRead) ?? false; antiRead.value = prefs.getBool(_kAntiRead) ?? false;
selfOnlineCheck.value = prefs.getBool(_kSelfOnlineCheck) ?? true; selfOnlineCheck.value = prefs.getBool(_kSelfOnlineCheck) ?? true;
hideAllChatsFolder.value = prefs.getBool(_kHideAllChatsFolder) ?? false; hideAllChatsFolder.value = prefs.getBool(_kHideAllChatsFolder) ?? false;
showHiddenChats.value = prefs.getBool(_kShowHiddenChats) ?? false;
} }
static Future<void> setViewDeleted(bool value) async { static Future<void> setViewDeleted(bool value) async {
@@ -70,4 +73,10 @@ class KometSettings {
final prefs = await SharedPreferences.getInstance(); final prefs = await SharedPreferences.getInstance();
await prefs.setBool(_kHideAllChatsFolder, value); await prefs.setBool(_kHideAllChatsFolder, value);
} }
static Future<void> setShowHiddenChats(bool value) async {
showHiddenChats.value = value;
final prefs = await SharedPreferences.getInstance();
await prefs.setBool(_kShowHiddenChats, value);
}
} }
+7 -2
View File
@@ -709,11 +709,16 @@ class AppDatabase {
); );
} }
static Future<List<Map<String, dynamic>>> loadChats(int accountId) async { static Future<List<Map<String, dynamic>>> loadChats(
int accountId, {
bool includeHidden = false,
}) async {
final db = await _instance; final db = await _instance;
return db.query( return db.query(
'chats_cache', '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], whereArgs: [accountId],
orderBy: 'last_event_time DESC', orderBy: 'last_event_time DESC',
); );
@@ -549,6 +549,7 @@ class _ChatListScreenState extends State<ChatListScreen>
AppStories.current.addListener(_onStoriesEnabledChanged); AppStories.current.addListener(_onStoriesEnabledChanged);
storiesModule.storiesChanged.addListener(_onStoriesDataChanged); storiesModule.storiesChanged.addListener(_onStoriesDataChanged);
KometSettings.hideAllChatsFolder.addListener(_requestReload); KometSettings.hideAllChatsFolder.addListener(_requestReload);
KometSettings.showHiddenChats.addListener(_requestReload);
_maybeLoadStories(); _maybeLoadStories();
_typingSub = api.pushStream _typingSub = api.pushStream
.where((p) => p.opcode == Opcode.notifTyping) .where((p) => p.opcode == Opcode.notifTyping)
@@ -709,7 +710,10 @@ class _ChatListScreenState extends State<ChatListScreen>
} }
try { 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); var folders = await FoldersModule.loadFolders(p.id);
final foldersKnown = await FoldersModule.hasReceivedFoldersList(p.id); final foldersKnown = await FoldersModule.hasReceivedFoldersList(p.id);
final contactIds = (await ContactsModule.getContacts(p.id)) final contactIds = (await ContactsModule.getContacts(p.id))
@@ -1153,6 +1157,7 @@ class _ChatListScreenState extends State<ChatListScreen>
AppStories.current.removeListener(_onStoriesEnabledChanged); AppStories.current.removeListener(_onStoriesEnabledChanged);
storiesModule.storiesChanged.removeListener(_onStoriesDataChanged); storiesModule.storiesChanged.removeListener(_onStoriesDataChanged);
KometSettings.hideAllChatsFolder.removeListener(_requestReload); KometSettings.hideAllChatsFolder.removeListener(_requestReload);
KometSettings.showHiddenChats.removeListener(_requestReload);
_loginSub?.cancel(); _loginSub?.cancel();
_stateSub?.cancel(); _stateSub?.cancel();
_typingSub?.cancel(); _typingSub?.cancel();
@@ -86,6 +86,18 @@ class KometSettingsScreen extends StatelessWidget {
onChanged: KometSettings.setHideAllChatsFolder, onChanged: KometSettings.setHideAllChatsFolder,
), ),
), ),
ValueListenableBuilder<bool>(
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), const SizedBox(height: 20),