22-06-2026+11-32

This commit is contained in:
Artur 2026-06-22 11:32:19 +05:00
parent 7471b6cab6
commit 5044cb6020
5 changed files with 72 additions and 15 deletions

View File

@ -286,6 +286,17 @@ class LocalDbService extends _$LocalDbService {
);
}
Future<void> markAllAsRead(int contactId, int myId) async {
await (update(messages)
..where((tbl) =>
tbl.senderId.equals(contactId) &
tbl.receiverId.equals(myId) &
tbl.readAt.isNull()))
.write(
MessagesCompanion(readAt: Value(DateTime.now().toIso8601String())),
);
}
Future<void> updateMessageContent(
int messageId,
String content,

View File

@ -3561,18 +3561,14 @@ class _ChatScreenState extends State<ChatScreen> with RouteAware {
WidgetsBinding.instance.addPostFrameCallback((_) {
Future.delayed(const Duration(milliseconds: 500), () async {
if (mounted) {
// Если чат пуст или нет непрочитанных сразу отправляем прочтение
final hasUnread = messages.any(
(m) => !m.isMe && m.status != MessageStatus.read,
);
final positions = _itemPositionsListener.itemPositions.value;
print(
'Отправка прочтения: ${(!hasUnread || (positions.isNotEmpty && positions.last.index > 5))}',
);
// Если пользователь уже внизу (сразу после загрузки)
if (!hasUnread ||
(positions.isNotEmpty && positions.last.index > 5)) {
final isAtBottom = positions.isNotEmpty && positions.any((p) => p.index == 0);
if (!hasUnread || isAtBottom) {
_socketService.sendReadAllChat(widget.contact.id);
_markAllLocalMessagesAsRead();
}
}
});
@ -4357,6 +4353,46 @@ class _ChatScreenState extends State<ChatScreen> with RouteAware {
}
_showScrollButtonNotifier.value = showScrollButton;
// Если пользователь внизу и есть непрочитанные сообщения от собеседника, отправляем прочтение всех
if (!showScrollButton) {
final hasUnread = messages.any(
(m) => !m.isMe && m.status != MessageStatus.read,
);
if (hasUnread) {
print("DEBUG: Пользователь внизу чата, отправляем прочтение всех сообщений");
_socketService.sendReadAllChat(_currentContact.id);
_markAllLocalMessagesAsRead();
}
}
}
Future<void> _markAllLocalMessagesAsRead() async {
bool updated = false;
for (int i = 0; i < messages.length; i++) {
if (!messages[i].isMe && messages[i].status != MessageStatus.read) {
messages[i] = messages[i].copyWith(status: MessageStatus.read);
updated = true;
}
}
if (updated && mounted) {
setState(() {});
}
// Обновляем список контактов в провайдере
final contactProvider = context.read<ContactProvider>();
await contactProvider.updateContact(
_currentContact.id,
unreadCount: 0,
firstUnreadMessageId: 0,
);
// Обновляем локальную базу данных
try {
await _localDbService.markAllAsRead(_currentContact.id, myId);
} catch (e) {
print('Ошибка при пометке всех сообщений прочитанными в БД: $e');
}
}
Future<void> _scrollToBottom() async {

View File

@ -71,7 +71,11 @@ async def send_system_notification(db: AsyncSession, receiver_id: int, plain_tex
try:
unread_res = await db.execute(
select(func.count(models.Message.id))
.where(models.Message.receiver_id == receiver_id, models.Message.read_at == None)
.where(
models.Message.receiver_id == receiver_id,
models.Message.sender_id == 0,
models.Message.read_at.is_(None)
)
)
unread_count = unread_res.scalar() or 0
fcm_message = messaging.Message(

View File

@ -172,7 +172,11 @@ async def websocket_endpoint(websocket: WebSocket, token: str = Query(None), db:
unread_res = await db.execute(
select(func.count(models.Message.id))
.where(models.Message.receiver_id == receiver_id, models.Message.read_at == None)
.where(
models.Message.receiver_id == receiver_id,
models.Message.sender_id == user_id,
models.Message.read_at.is_(None)
)
)
unread_count = unread_res.scalar() or 0
@ -347,13 +351,16 @@ async def websocket_endpoint(websocket: WebSocket, token: str = Query(None), db:
continue
sender_id = int(msg.sender_id)
unread_res = await db.execute(
select(func.count(models.Message.id))
.where(models.Message.receiver_id == user_id, models.Message.read_at == None)
.where(
models.Message.receiver_id == user_id,
models.Message.sender_id == sender_id,
models.Message.read_at.is_(None)
)
)
unread_count = unread_res.scalar() or 0
sender_id = int(msg.sender_id)
await manager.send_personal_message({
"type": "message_read",
"sender_id": sender_id,
@ -394,14 +401,14 @@ async def websocket_endpoint(websocket: WebSocket, token: str = Query(None), db:
await manager.send_personal_message({
"type": "all_chat_read",
"sender_id": sender_id,
"sender_id": contact_id,
"reader_id": user_id,
"timestamp": read_at_time.isoformat(),
}, str(contact_id))
await manager.send_personal_message({
"type": "all_chat_read",
"sender_id": sender_id,
"sender_id": contact_id,
"reader_id": user_id,
"timestamp": read_at_time.isoformat(),
}, str(user_id))

View File

@ -133,7 +133,6 @@
margin-bottom: 16px;
line-height: 1.2;
background: linear-gradient(135deg, #ffffff 40%, #d1c4e9 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}