feat(chats): скрытие чатов групповых звонков + тоггл показа скрытых чатов
This commit is contained in:
@@ -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,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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
Reference in New Issue
Block a user