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(
|
Future<void> updateMessageContent(
|
||||||
int messageId,
|
int messageId,
|
||||||
String content,
|
String content,
|
||||||
|
|
|
||||||
|
|
@ -3561,18 +3561,14 @@ class _ChatScreenState extends State<ChatScreen> with RouteAware {
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
Future.delayed(const Duration(milliseconds: 500), () async {
|
Future.delayed(const Duration(milliseconds: 500), () async {
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
// Если чат пуст или нет непрочитанных — сразу отправляем прочтение
|
|
||||||
final hasUnread = messages.any(
|
final hasUnread = messages.any(
|
||||||
(m) => !m.isMe && m.status != MessageStatus.read,
|
(m) => !m.isMe && m.status != MessageStatus.read,
|
||||||
);
|
);
|
||||||
final positions = _itemPositionsListener.itemPositions.value;
|
final positions = _itemPositionsListener.itemPositions.value;
|
||||||
print(
|
final isAtBottom = positions.isNotEmpty && positions.any((p) => p.index == 0);
|
||||||
'Отправка прочтения: ${(!hasUnread || (positions.isNotEmpty && positions.last.index > 5))}',
|
if (!hasUnread || isAtBottom) {
|
||||||
);
|
|
||||||
// Если пользователь уже внизу (сразу после загрузки)
|
|
||||||
if (!hasUnread ||
|
|
||||||
(positions.isNotEmpty && positions.last.index > 5)) {
|
|
||||||
_socketService.sendReadAllChat(widget.contact.id);
|
_socketService.sendReadAllChat(widget.contact.id);
|
||||||
|
_markAllLocalMessagesAsRead();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -4357,6 +4353,46 @@ class _ChatScreenState extends State<ChatScreen> with RouteAware {
|
||||||
}
|
}
|
||||||
|
|
||||||
_showScrollButtonNotifier.value = showScrollButton;
|
_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 {
|
Future<void> _scrollToBottom() async {
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,11 @@ async def send_system_notification(db: AsyncSession, receiver_id: int, plain_tex
|
||||||
try:
|
try:
|
||||||
unread_res = await db.execute(
|
unread_res = await db.execute(
|
||||||
select(func.count(models.Message.id))
|
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
|
unread_count = unread_res.scalar() or 0
|
||||||
fcm_message = messaging.Message(
|
fcm_message = messaging.Message(
|
||||||
|
|
|
||||||
|
|
@ -172,7 +172,11 @@ async def websocket_endpoint(websocket: WebSocket, token: str = Query(None), db:
|
||||||
|
|
||||||
unread_res = await db.execute(
|
unread_res = await db.execute(
|
||||||
select(func.count(models.Message.id))
|
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
|
unread_count = unread_res.scalar() or 0
|
||||||
|
|
||||||
|
|
@ -347,13 +351,16 @@ async def websocket_endpoint(websocket: WebSocket, token: str = Query(None), db:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
||||||
|
sender_id = int(msg.sender_id)
|
||||||
unread_res = await db.execute(
|
unread_res = await db.execute(
|
||||||
select(func.count(models.Message.id))
|
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
|
unread_count = unread_res.scalar() or 0
|
||||||
|
|
||||||
sender_id = int(msg.sender_id)
|
|
||||||
await manager.send_personal_message({
|
await manager.send_personal_message({
|
||||||
"type": "message_read",
|
"type": "message_read",
|
||||||
"sender_id": sender_id,
|
"sender_id": sender_id,
|
||||||
|
|
@ -394,14 +401,14 @@ async def websocket_endpoint(websocket: WebSocket, token: str = Query(None), db:
|
||||||
|
|
||||||
await manager.send_personal_message({
|
await manager.send_personal_message({
|
||||||
"type": "all_chat_read",
|
"type": "all_chat_read",
|
||||||
"sender_id": sender_id,
|
"sender_id": contact_id,
|
||||||
"reader_id": user_id,
|
"reader_id": user_id,
|
||||||
"timestamp": read_at_time.isoformat(),
|
"timestamp": read_at_time.isoformat(),
|
||||||
}, str(contact_id))
|
}, str(contact_id))
|
||||||
|
|
||||||
await manager.send_personal_message({
|
await manager.send_personal_message({
|
||||||
"type": "all_chat_read",
|
"type": "all_chat_read",
|
||||||
"sender_id": sender_id,
|
"sender_id": contact_id,
|
||||||
"reader_id": user_id,
|
"reader_id": user_id,
|
||||||
"timestamp": read_at_time.isoformat(),
|
"timestamp": read_at_time.isoformat(),
|
||||||
}, str(user_id))
|
}, str(user_id))
|
||||||
|
|
|
||||||
|
|
@ -133,7 +133,6 @@
|
||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
line-height: 1.2;
|
line-height: 1.2;
|
||||||
background: linear-gradient(135deg, #ffffff 40%, #d1c4e9 100%);
|
background: linear-gradient(135deg, #ffffff 40%, #d1c4e9 100%);
|
||||||
-webkit-background-clip: text;
|
|
||||||
-webkit-text-fill-color: transparent;
|
-webkit-text-fill-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue