diff --git a/lib/pods/messages_notifier.dart b/lib/pods/messages_notifier.dart index be0d9ac5..79b83f54 100644 --- a/lib/pods/messages_notifier.dart +++ b/lib/pods/messages_notifier.dart @@ -613,6 +613,16 @@ class MessagesNotifier extends _$MessagesNotifier { _sortMessages([localMessage, ...currentMessages]), ); } + + switch (remoteMessage.type) { + case "messages.delete": + await receiveMessageDeletion( + remoteMessage.meta['message_id'] ?? remoteMessage.id, + ); + case "messages.update": + case "messages.update.links": + await receiveMessageUpdate(remoteMessage); + } } Future receiveMessageUpdate(SnChatMessage remoteMessage) async { @@ -622,8 +632,12 @@ class MessagesNotifier extends _$MessagesNotifier { name: 'MessagesNotifier', ); + final targetId = remoteMessage.meta['message_id'] ?? remoteMessage.id; final updatedMessage = LocalChatMessage.fromRemoteMessage( - remoteMessage, + remoteMessage.copyWith( + id: targetId, + meta: Map.of(remoteMessage.meta)..remove('message_id'), + ), MessageStatus.sent, ); await _database.updateMessage(_database.messageToCompanion(updatedMessage)); diff --git a/lib/screens/chat/room.dart b/lib/screens/chat/room.dart index 26855e94..0855653a 100644 --- a/lib/screens/chat/room.dart +++ b/lib/screens/chat/room.dart @@ -280,6 +280,8 @@ class ChatRoomScreen extends HookConsumerWidget { if (message.chatRoomId != chatRoom.value?.id) return; switch (pkt.type) { case 'messages.new': + case 'messages.update': + case 'messages.delete': if (message.type.startsWith('call')) { // Handle the ongoing call. ref.invalidate(ongoingCallProvider(message.chatRoomId)); @@ -287,14 +289,6 @@ class ChatRoomScreen extends HookConsumerWidget { messagesNotifier.receiveMessage(message); // Send read receipt for new message sendReadReceipt(); - case 'messages.update': - messagesNotifier.receiveMessageUpdate(message).then((_) { - messagesNotifier.receiveMessage(message); - }); - case 'messages.delete': - messagesNotifier.receiveMessageDeletion(message.id).then((_) { - messagesNotifier.receiveMessage(message); - }); } } diff --git a/lib/widgets/post/post_item_creator.dart b/lib/widgets/post/post_item_creator.dart index 446c904b..261e85f0 100644 --- a/lib/widgets/post/post_item_creator.dart +++ b/lib/widgets/post/post_item_creator.dart @@ -1,5 +1,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:go_router/go_router.dart'; import 'package:gap/gap.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; @@ -80,9 +81,8 @@ class PostItemCreator extends HookConsumerWidget { title: 'copyLink'.tr(), image: MenuImage.icon(Symbols.link), callback: () { - context.pushNamed( - 'postDetail', - pathParameters: {'id': item.id}, + Clipboard.setData( + ClipboardData(text: 'https://solian.app/posts/${item.id}'), ); }, ), @@ -95,7 +95,7 @@ class PostItemCreator extends HookConsumerWidget { borderRadius: BorderRadius.circular(12), onTap: () { if (isOpenable) { - context.goNamed('postDetail', pathParameters: {'id': item.id}); + context.pushNamed('postDetail', pathParameters: {'id': item.id}); } }, child: Column(