догрузка сообщений в чатах при прокрутке вверх

This commit is contained in:
jganenok
2025-12-04 08:40:13 +07:00
parent 9fa633dafb
commit 6463a3b016
5 changed files with 285 additions and 94 deletions

View File

@@ -726,6 +726,53 @@ extension ApiServiceChats on ApiService {
}
}
/// Загружает старые сообщения начиная с указанного timestamp
/// [fromTimestamp] - timestamp в миллисекундах самого старого загруженного сообщения
/// [backward] - количество сообщений для загрузки (по умолчанию 30)
Future<List<Message>> loadOlderMessagesByTimestamp(
int chatId,
int fromTimestamp, {
int backward = 30,
}) async {
await waitUntilOnline();
print(
"📜 Запрашиваем старые сообщения для чата $chatId начиная с timestamp $fromTimestamp (backward: $backward)",
);
final payload = {
"chatId": chatId,
"from": fromTimestamp,
"forward": 0,
"backward": backward,
"getMessages": true,
};
try {
final int seq = _sendMessage(49, payload);
final response = await messages
.firstWhere((msg) => msg['seq'] == seq)
.timeout(const Duration(seconds: 15));
if (response['cmd'] == 3) {
final error = response['payload'];
print('❌ Ошибка получения старых сообщений: $error');
return [];
}
final List<dynamic> messagesJson = response['payload']?['messages'] ?? [];
final messagesList =
messagesJson.map((json) => Message.fromJson(json)).toList()
..sort((a, b) => a.time.compareTo(b.time));
print('✅ Получено ${messagesList.length} старых сообщений');
return messagesList;
} catch (e) {
print('❌ Ошибка при получении старых сообщений: $e');
return [];
}
}
void sendNavEvent(String event, {int? screenTo, int? screenFrom}) {
if (_userId == null) return;

View File

@@ -248,23 +248,17 @@ extension ApiServiceContacts on ApiService {
}
Future<int?> getChatIdByUserId(int userId) async {
// Используем формулу: chatId = userId1 ^ userId2
// где userId1 - наш ID, userId2 - ID собеседника
// ПИДОРИСТИЧЕСКАЯ ФОРМУЛА ОТ ДЕДА chatId = userId1 ^ userId2
if (_userId == null) {
print('⚠️ Не удалось вычислить chatId: наш userId не установлен');
return null;
}
final chatId = _userId! ^ userId;
print('✅ Вычислен chatId для диалога: наш userId=$_userId, собеседник userId=$userId, chatId=$chatId');
return chatId;
}
Future<List<Contact>> fetchContactsByIds(List<int> contactIds) async {
if (contactIds.isEmpty) {
print(
'⚠️ [fetchContactsByIds] Пустой список contactIds - пропускаем запрос',
);
return [];
}