diff --git a/packages/neon/neon_talk/lib/src/blocs/room.dart b/packages/neon/neon_talk/lib/src/blocs/room.dart index edcb4bb32e2..93e38080d29 100644 --- a/packages/neon/neon_talk/lib/src/blocs/room.dart +++ b/packages/neon/neon_talk/lib/src/blocs/room.dart @@ -392,10 +392,15 @@ class _TalkRoomBloc extends InteractiveBloc implements TalkRoomBloc { // If there are multiple messages updating the same parent message only the newest is applied because it already contains all values for (final newHiddenMessage in newHiddenMessages) { final parent = newHiddenMessage.parent!; + if (message.id == parent.id) { // Conversion from ChatMessage to ChatMessageWithParent is necessary because parent messages can't have parents of their own return spreed.ChatMessageWithParent.fromJson(parent.toJson()); } + + if (message.parent?.id == parent.id) { + return message.rebuild((b) => b.parent.replace(parent)); + } } return message; diff --git a/packages/neon/neon_talk/test/room_bloc_test.dart b/packages/neon/neon_talk/test/room_bloc_test.dart index 73bab9c0d2c..bdb379f24f7 100644 --- a/packages/neon/neon_talk/test/room_bloc_test.dart +++ b/packages/neon/neon_talk/test/room_bloc_test.dart @@ -61,6 +61,9 @@ Account mockTalkAccount() { }, }), 200, + headers: { + 'content-type': 'application/json', + }, ); }, }, @@ -115,7 +118,17 @@ Account mockTalkAccount() { json.encode({ 'ocs': { 'meta': {'status': '', 'statuscode': 0}, - 'data': List.generate(messageCount, (i) => getChatMessage(id: messageCount - i - 1)), + 'data': List.generate( + messageCount, + (i) => getChatMessage( + id: messageCount - i - 1, + parent: messageCount - i - 2 >= 0 + ? getChatMessage( + id: messageCount - i - 2, + ) + : null, + ), + ), }, }), 200, @@ -357,8 +370,8 @@ void main() { roomBloc.messages.transformResult((e) => BuiltList(e.map((m) => m.parent?.id))), emitsInOrder([ Result>.loading(), - Result.success(BuiltList([null, null, null])), - Result.success(BuiltList([message.id, null, null, null])), + Result.success(BuiltList([1, 0, null])), + Result.success(BuiltList([1, 1, 0, null])), ]), ); @@ -590,6 +603,26 @@ void main() { ), ]), ); + expect( + roomBloc.messages.transformResult((e) => BuiltList(e.map((m) => m.parent?.messageType))), + emitsInOrder([ + Result>.loading(), + Result.success( + BuiltList([ + spreed.MessageType.comment, + spreed.MessageType.comment, + null, + ]), + ), + Result.success( + BuiltList([ + spreed.MessageType.commentDeleted, + null, + null, + ]), + ), + ]), + ); final message = MockChatMessage(); when(() => message.id).thenReturn(1); diff --git a/packages/nextcloud/test/fixtures/spreed/chat/delete_message.regexp b/packages/nextcloud/test/fixtures/spreed/chat/delete_message.regexp index aad7916430a..5c3f28487c7 100644 --- a/packages/nextcloud/test/fixtures/spreed/chat/delete_message.regexp +++ b/packages/nextcloud/test/fixtures/spreed/chat/delete_message.regexp @@ -1,11 +1,15 @@ -POST http://localhost/ocs/v2\.php/apps/spreed/api/v4/room\?roomType=3&invite=&roomName=Test&source=&objectType=&objectId= +POST http://localhost/ocs/v2\.php/apps/spreed/api/v4/room accept: application/json authorization: Bearer mock +content-type: application/json; charset=utf-8 ocs-apirequest: true -POST http://localhost/ocs/v2\.php/apps/spreed/api/v1/chat/[a-z0-9]{8}\?message=bla&actorDisplayName=&referenceId=&replyTo=0&silent=0 +\{"roomType":3,"invite":"","roomName":"Test","source":"","objectType":"","objectId":""\} +POST http://localhost/ocs/v2\.php/apps/spreed/api/v1/chat/[a-z0-9]{8} accept: application/json authorization: Bearer mock +content-type: application/json; charset=utf-8 ocs-apirequest: true +\{"message":"bla","actorDisplayName":"","referenceId":"","replyTo":0,"silent":false\} DELETE http://localhost/ocs/v2\.php/apps/spreed/api/v1/chat/[a-z0-9]{8}/[0-9]+ accept: application/json authorization: Bearer mock diff --git a/packages/nextcloud/test/spreed_test.dart b/packages/nextcloud/test/spreed_test.dart index 569b9c19df0..f84528fa742 100644 --- a/packages/nextcloud/test/spreed_test.dart +++ b/packages/nextcloud/test/spreed_test.dart @@ -415,7 +415,9 @@ void main() { final messageResponse = await client1.spreed.chat.sendMessage( token: room.token, - message: 'bla', + $body: spreed.ChatSendMessageRequestApplicationJson( + (b) => b..message = 'bla', + ), ); final response = await client1.spreed.chat.deleteMessage(