From fe624747ca6cc55898a5717c082fde6b2d6b2a35 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Tue, 8 Jul 2025 11:27:43 -0400 Subject: [PATCH 1/3] feat: unpin message on redact to avoid pinned redactions --- lib/pages/chat/chat.dart | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 13238a6a8..c86e82685 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -855,7 +855,7 @@ class ChatController extends State future: () async { if (event.status.isSent) { if (event.canRedact) { - await event.redactEvent(reason: reason); + await redactAndUnpinEvent(event, reason: reason); } else { final client = currentRoomBundle.firstWhere( (cl) => selectedEvents.first.senderId == cl!.userID, @@ -865,7 +865,8 @@ class ChatController extends State return; } final room = client.getRoomById(roomId)!; - await Event.fromJson(event.toJson(), room).redactEvent( + await redactAndUnpinEvent( + Event.fromJson(event.toJson(), room), reason: reason, ); } @@ -1204,6 +1205,18 @@ class ChatController extends State ); } + Future redactAndUnpinEvent( + Event event, { + String? reason, + String? txid, + }) async { + final events = room.pinnedEventIds + ..removeWhere((oldEvent) => oldEvent == event.eventId); + room.setPinnedEvents(events); + + return await room.redactEvent(event.eventId, reason: reason, txid: txid); + } + Timer? _storeInputTimeoutTimer; static const Duration _storeInputTimeout = Duration(milliseconds: 500); From 9acc670d5bb4d988cf050bfeada216807ca74a0e Mon Sep 17 00:00:00 2001 From: Kelrap Date: Thu, 10 Jul 2025 12:15:44 -0400 Subject: [PATCH 2/3] fix: simplify code, check for pin permission --- lib/pages/chat/chat.dart | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index c86e82685..a0daa9409 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -855,7 +855,13 @@ class ChatController extends State future: () async { if (event.status.isSent) { if (event.canRedact) { - await redactAndUnpinEvent(event, reason: reason); + if (room.canChangeStateEvent(EventTypes.RoomPinnedEvents)) { + final pinnedEvents = room.pinnedEventIds + .where((e) => e != event.eventId) + .toList(); + await room.setPinnedEvents(pinnedEvents); + } + await event.redactEvent(reason: reason); } else { final client = currentRoomBundle.firstWhere( (cl) => selectedEvents.first.senderId == cl!.userID, @@ -865,8 +871,7 @@ class ChatController extends State return; } final room = client.getRoomById(roomId)!; - await redactAndUnpinEvent( - Event.fromJson(event.toJson(), room), + await Event.fromJson(event.toJson(), room).redactEvent( reason: reason, ); } @@ -1205,18 +1210,6 @@ class ChatController extends State ); } - Future redactAndUnpinEvent( - Event event, { - String? reason, - String? txid, - }) async { - final events = room.pinnedEventIds - ..removeWhere((oldEvent) => oldEvent == event.eventId); - room.setPinnedEvents(events); - - return await room.redactEvent(event.eventId, reason: reason, txid: txid); - } - Timer? _storeInputTimeoutTimer; static const Duration _storeInputTimeout = Duration(milliseconds: 500); From c556b2f5b60950d029fb3b674ccd8492ccb11c3a Mon Sep 17 00:00:00 2001 From: Kelrap Date: Fri, 18 Jul 2025 14:11:27 -0400 Subject: [PATCH 3/3] fix: Check whether redacted event is pinned before unpinning --- lib/pages/chat/chat.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index a0daa9409..ac7dd832d 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -855,7 +855,8 @@ class ChatController extends State future: () async { if (event.status.isSent) { if (event.canRedact) { - if (room.canChangeStateEvent(EventTypes.RoomPinnedEvents)) { + if (room.pinnedEventIds.contains(event.eventId) && + room.canChangeStateEvent(EventTypes.RoomPinnedEvents)) { final pinnedEvents = room.pinnedEventIds .where((e) => e != event.eventId) .toList();