Release IKAR 1.0.7: port navigation and sharing improvements, harden calls
Tests / test (push) Canceled after 0s
Build Android (FCM) / build-android-fcm (push) Canceled after 0s
Build Android / build-android (push) Canceled after 0s
Build iOS / build-ios (push) Canceled after 0s
Build Linux / build-linux (push) Canceled after 0s
Build macOS / build-macos (push) Canceled after 0s
Build Windows / build-windows (push) Canceled after 0s
Native crypto / native-crypto (push) Canceled after 0s
Release (main) / android (oneme) (push) Canceled after 0s
Release (main) / android (qlyra) (push) Canceled after 0s
Release (main) / windows (push) Canceled after 0s
Release (main) / linux (push) Canceled after 0s
Release (main) / macos (push) Canceled after 0s
Release (main) / ios (push) Canceled after 0s
Release (main) / release (push) Canceled after 0s

This commit is contained in:
sevenhill
2026-10-08 20:38:54 +03:00
parent 68f7957043
commit 317cfdae38
37 changed files with 1483 additions and 282 deletions
+19 -1
View File
@@ -201,7 +201,8 @@ class TranscriptionCache {
} else {
_expanded.remove(messageId);
}
for (final listener in _listeners[messageId]?.toList() ?? <VoidCallback>[]) {
for (final listener
in _listeners[messageId]?.toList() ?? <VoidCallback>[]) {
listener();
}
}
@@ -789,6 +790,23 @@ class MessagesModule {
}
// #***! история с сервера
Future<CachedMessage?> fetchMessage(
int accountId,
int chatId,
String id,
) async {
final messageId = int.tryParse(id);
if (messageId == null) return null;
final response = await _api.sendRequest(Opcode.msgGet, {
'chatId': chatId,
'messageId': messageId,
});
if (!response.isOk || response.payload is! Map) return null;
final raw = (response.payload as Map)['message'];
if (raw is! Map) return null;
return _parseMessage(raw, accountId, chatId);
}
Future<List<CachedMessage>> fetchHistory(
int accountId,
int chatId, {
@@ -0,0 +1,24 @@
import 'package:flutter/foundation.dart';
/// Pending UI removals are scoped to an account as well as a chat.
class PendingMessageDeletions extends ChangeNotifier {
PendingMessageDeletions();
static final instance = PendingMessageDeletions();
final Map<(int, int), Set<String>> _pending = {};
bool contains(int accountId, int chatId, String id) =>
_pending[(accountId, chatId)]?.contains(id) ?? false;
void hold(int accountId, int chatId, Iterable<String> ids) {
_pending.putIfAbsent((accountId, chatId), () => {}).addAll(ids);
notifyListeners();
}
void release(int accountId, int chatId, Iterable<String> ids) {
final pending = _pending[(accountId, chatId)];
if (pending == null) return;
pending.removeAll(ids);
if (pending.isEmpty) _pending.remove((accountId, chatId));
notifyListeners();
}
}