forked from Nexus/nexus
allow redacting/removing reactions
This commit is contained in:
parent
4ff507e93f
commit
4954fb8c09
2 changed files with 46 additions and 3 deletions
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue