1
0
Fork 0
forked from Nexus/nexus

allow redacting/removing reactions

This commit is contained in:
Henry Hiles 2026-04-12 14:56:08 -04:00
commit 4954fb8c09
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
2 changed files with 46 additions and 3 deletions

View file

@ -12,6 +12,7 @@ import "package:nexus/controllers/rooms_controller.dart";
import "package:nexus/controllers/selected_room_controller.dart"; import "package:nexus/controllers/selected_room_controller.dart";
import "package:nexus/models/configs/messages_config.dart"; import "package:nexus/models/configs/messages_config.dart";
import "package:nexus/models/configs/message_config.dart"; import "package:nexus/models/configs/message_config.dart";
import "package:nexus/models/requests/get_related_events_request.dart";
import "package:nexus/models/requests/get_room_state_request.dart"; import "package:nexus/models/requests/get_room_state_request.dart";
import "package:nexus/models/requests/paginate_request.dart"; import "package:nexus/models/requests/paginate_request.dart";
import "package:nexus/models/requests/redact_event_request.dart"; import "package:nexus/models/requests/redact_event_request.dart";
@ -329,6 +330,39 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
return await controller.scrollToMessage(message.id); return await controller.scrollToMessage(message.id);
} }
Future<void> removeReaction(
String reaction,
Message message,
String userId,
) async {
final client = ref.watch(ClientController.provider.notifier);
final allReactionEvents = await client.getRelatedEvents(
GetRelatedEventsRequest(
roomId: roomId,
eventId: message.id,
relationType: "m.annotation",
),
);
final reactionEvents = allReactionEvents
?.where((event) => event.redactedBy == null)
.toIList();
final reactionEvent = reactionEvents?.firstWhereOrNull(
(event) =>
event.authorId == userId &&
event.content["m.relates_to"]?["key"] == reaction,
);
if (reactionEvent != null) {
await ref
.watch(ClientController.provider.notifier)
.redactEvent(
RedactEventRequest(eventId: reactionEvent.eventId, roomId: roomId),
);
}
}
Future<void> sendReaction(String reaction, Message message) async { Future<void> sendReaction(String reaction, Message message) async {
final client = ref.watch(ClientController.provider.notifier); final client = ref.watch(ClientController.provider.notifier);

View file

@ -9,6 +9,7 @@ import "package:nexus/controllers/room_chat_controller.dart";
import "package:nexus/controllers/selected_room_controller.dart"; import "package:nexus/controllers/selected_room_controller.dart";
import "package:nexus/helpers/extensions/get_headers.dart"; import "package:nexus/helpers/extensions/get_headers.dart";
import "package:nexus/helpers/extensions/mxc_to_https.dart"; import "package:nexus/helpers/extensions/mxc_to_https.dart";
import "package:nexus/main.dart";
class ReactionRow extends ConsumerWidget { class ReactionRow extends ConsumerWidget {
final Message message; final Message message;
@ -56,16 +57,24 @@ class ReactionRow extends ConsumerWidget {
(value) => value?.metadata?.id, (value) => value?.metadata?.id,
), ),
); );
if (roomId == null) return; if (roomId == null || clientState.userId == null) return;
final controller = ref.watch( final controller = ref.watch(
RoomChatController.provider(roomId).notifier, RoomChatController.provider(roomId).notifier,
); );
if (selected) { if (selected) {
// TODO: remove await controller
.removeReaction(
reaction,
message,
clientState.userId!,
)
.onError(showError);
} else { } else {
await controller.sendReaction(reaction, message); await controller
.sendReaction(reaction, message)
.onError(showError);
} }
}, },
), ),