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;
}
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>()
.map(
(c) => parseChatRow(
c.cast<dynamic, dynamic>(),
accountId,
currentUserId,
contactsMap,
chatsConfig,
presenceMap,
existing,
cachedAt,
),
)
.whereType<CachedChat>()
.map((c) => c.toDbRow()..['in_list'] = 1)
.toList();
final rows = <Map<String, dynamic>>[];
for (final c in chats.whereType<Map>()) {
final map = c.cast<dynamic, dynamic>();
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<List<CachedChat>> getChats(int accountId) async {
Future<List<CachedChat>> 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) {
+9
View File
@@ -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<bool> viewDeleted = 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> selfOnlineCheck = ValueNotifier(true);
static final ValueNotifier<bool> hideAllChatsFolder = ValueNotifier(false);
static final ValueNotifier<bool> showHiddenChats = ValueNotifier(false);
static Future<void> 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<void> setViewDeleted(bool value) async {
@@ -70,4 +73,10 @@ class KometSettings {
final prefs = await SharedPreferences.getInstance();
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;
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',
);
@@ -549,6 +549,7 @@ class _ChatListScreenState extends State<ChatListScreen>
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<ChatListScreen>
}
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<ChatListScreen>
AppStories.current.removeListener(_onStoriesEnabledChanged);
storiesModule.storiesChanged.removeListener(_onStoriesDataChanged);
KometSettings.hideAllChatsFolder.removeListener(_requestReload);
KometSettings.showHiddenChats.removeListener(_requestReload);
_loginSub?.cancel();
_stateSub?.cancel();
_typingSub?.cancel();
@@ -86,6 +86,18 @@ class KometSettingsScreen extends StatelessWidget {
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),