22-06-2026+11-32
This commit is contained in:
parent
7471b6cab6
commit
5044cb6020
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue