Update reactions as they are modified
This commit is contained in:
parent
7b2a6b84ad
commit
e9b78a14d5
2 changed files with 60 additions and 6 deletions
|
|
@ -79,7 +79,8 @@ class MessageController extends AsyncNotifier<Message?> {
|
|||
);
|
||||
|
||||
final reactions = reactionEvents
|
||||
?.fold<IMap<String, IList<String>>>(IMap(), (acc, event) {
|
||||
?.where((event) => event.redactedBy == null)
|
||||
.fold<IMap<String, IList<String>>>(IMap(), (acc, event) {
|
||||
final key = event.content["m.relates_to"]?["key"];
|
||||
if (key == null) return acc;
|
||||
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ import "package:nexus/controllers/message_controller.dart";
|
|||
import "package:nexus/controllers/messages_controller.dart";
|
||||
import "package:nexus/controllers/new_events_controller.dart";
|
||||
import "package:nexus/controllers/rooms_controller.dart";
|
||||
import "package:nexus/controllers/selected_room_controller.dart";
|
||||
import "package:nexus/models/configs/messages_config.dart";
|
||||
import "package:nexus/models/configs/message_config.dart";
|
||||
import "package:nexus/models/requests/get_room_state_request.dart";
|
||||
|
|
@ -77,15 +78,67 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
|
|||
ref.onDispose(
|
||||
ref.listen(NewEventsController.provider(roomId), (_, next) async {
|
||||
for (final event in next) {
|
||||
// TODO: Handle new reactions
|
||||
if (event.type == "m.reaction") {
|
||||
final message = controller.messages.firstWhereOrNull(
|
||||
(message) =>
|
||||
message.id == event.content["m.relates_to"]?["event_id"],
|
||||
);
|
||||
final key = event.content["m.relates_to"]?["key"];
|
||||
if (message == null || key == null || !ref.mounted) return;
|
||||
|
||||
return await controller.updateMessage(
|
||||
message,
|
||||
message.copyWith(
|
||||
reactions: IMap(message.reactions)
|
||||
.update(
|
||||
key,
|
||||
(reactors) => [...reactors, event.authorId],
|
||||
ifAbsent: () => [event.authorId],
|
||||
)
|
||||
.unlock,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
if (event.type == "m.room.redaction") {
|
||||
final controller = await future;
|
||||
final message = controller.messages.firstWhereOrNull(
|
||||
(message) => message.id == event.content["redacts"],
|
||||
final redactsId = event.content["redacts"];
|
||||
final originalMessage = controller.messages.firstWhereOrNull(
|
||||
(message) => message.id == redactsId,
|
||||
);
|
||||
if (message == null || !ref.mounted) return;
|
||||
if (!ref.mounted) return;
|
||||
|
||||
await controller.removeMessage(message);
|
||||
if (originalMessage != null) {
|
||||
return await controller.removeMessage(originalMessage);
|
||||
}
|
||||
|
||||
final redacts = ref
|
||||
.read(SelectedRoomController.provider)
|
||||
?.events
|
||||
.firstWhere((event) => event.eventId == redactsId);
|
||||
|
||||
if (redacts?.type == "m.reaction") {
|
||||
final message = controller.messages.firstWhereOrNull(
|
||||
(message) =>
|
||||
message.id == redacts!.content["m.relates_to"]?["event_id"],
|
||||
);
|
||||
final key = redacts!.content["m.relates_to"]?["key"];
|
||||
if (message == null || key == null || !ref.mounted) return;
|
||||
|
||||
return await controller.updateMessage(
|
||||
message,
|
||||
message.copyWith(
|
||||
reactions: IMap(message.reactions)
|
||||
.update(
|
||||
key,
|
||||
(reactors) =>
|
||||
IList(reactors).remove(redacts.authorId).unlock,
|
||||
)
|
||||
.where((_, value) => value.isNotEmpty)
|
||||
.unlock,
|
||||
),
|
||||
);
|
||||
}
|
||||
} else {
|
||||
final message = await ref.watch(
|
||||
MessageController.provider(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue