diff --git a/lib/controllers/client_controller.dart b/lib/controllers/client_controller.dart index 612efa6..3f29f25 100644 --- a/lib/controllers/client_controller.dart +++ b/lib/controllers/client_controller.dart @@ -218,11 +218,6 @@ class ClientController extends AsyncNotifier { } Future getEvent(GetEventRequest request) async { - final event = request.room.events.firstWhereOrNull( - (event) => event.eventId == request.eventId, - ); - if (event != null) return event; - final json = await _sendCommand("get_event", request.toJson()); return json == null ? null : Event.fromJson(json); } diff --git a/lib/controllers/event_controller.dart b/lib/controllers/event_controller.dart index 4f72963..8dfb356 100644 --- a/lib/controllers/event_controller.dart +++ b/lib/controllers/event_controller.dart @@ -1,5 +1,7 @@ +import "package:collection/collection.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:nexus/controllers/client_controller.dart"; +import "package:nexus/controllers/rooms_controller.dart"; import "package:nexus/models/event.dart"; import "package:nexus/models/requests/get_event_request.dart"; @@ -9,8 +11,16 @@ class EventController extends AsyncNotifier { @override Future build() async { - final client = ref.watch(ClientController.provider.notifier); - return await client.getEvent(request).onError((_, _) => null); + final room = ref.watch(RoomsController.provider)[request.roomId]; + final event = room?.events.firstWhereOrNull( + (event) => event.eventId == request.eventId, + ); + + return event ?? + await ref + .watch(ClientController.provider.notifier) + .getEvent(request) + .onError((_, _) => null); } static final provider = AsyncNotifierProvider.family diff --git a/lib/models/requests/get_event_request.dart b/lib/models/requests/get_event_request.dart index 9374f3a..4fcf7b6 100644 --- a/lib/models/requests/get_event_request.dart +++ b/lib/models/requests/get_event_request.dart @@ -1,32 +1,16 @@ import "package:freezed_annotation/freezed_annotation.dart"; -import "package:nexus/models/room.dart"; part "get_event_request.freezed.dart"; part "get_event_request.g.dart"; -@Freezed(toJson: false) +@Freezed() abstract class GetEventRequest with _$GetEventRequest { const GetEventRequest._(); const factory GetEventRequest({ - required Room room, + required String roomId, required String eventId, @Default(false) bool unredact, }) = _GetEventRequest; - Map toJson() => { - "room_id": room.metadata?.id, - "event_id": eventId, - "unredact": unredact, - }; - - @override - bool operator ==(Object other) => - other.runtimeType == runtimeType && - other is GetEventRequest && - other.eventId == eventId; - - @override - int get hashCode => Object.hash(runtimeType, eventId); - factory GetEventRequest.fromJson(Map json) => _$GetEventRequestFromJson(json); } diff --git a/lib/widgets/renderers/event.dart b/lib/widgets/renderers/event.dart index 6f00988..c4cf6e4 100644 --- a/lib/widgets/renderers/event.dart +++ b/lib/widgets/renderers/event.dart @@ -7,6 +7,7 @@ import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:linkify/linkify.dart"; import "package:nexus/controllers/client_state_controller.dart"; import "package:nexus/controllers/cross_cache_controller.dart"; +import "package:nexus/controllers/event_controller.dart"; import "package:nexus/helpers/extensions/get_headers.dart"; import "package:nexus/helpers/extensions/mxc_to_https.dart"; import "package:nexus/helpers/extensions/show_context_menu.dart"; @@ -17,8 +18,10 @@ import "package:nexus/models/content/encrypted.dart"; import "package:nexus/models/content/membership.dart"; import "package:nexus/models/content/message.dart"; import "package:nexus/models/event.dart"; +import "package:nexus/models/requests/get_event_request.dart"; import "package:nexus/widgets/expandable_image.dart"; import "package:nexus/widgets/html/html.dart"; +import "package:nexus/widgets/html/quoted.dart"; import "package:nexus/widgets/lazy_loading/message_avatar.dart"; import "package:nexus/widgets/lazy_loading/message_displayname.dart"; import "package:nexus/widgets/link_preview.dart"; @@ -124,9 +127,34 @@ class EventRenderer extends ConsumerWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - // Quoted( // TODO: Show replies - // EventText(replyEvent textOnly: true, maxLines: 1,) - // ), + if (event.relationType == "m.in_reply_to" && + event.relatesTo != null) + Quoted( + ref + .watch( + EventController.provider( + GetEventRequest( + roomId: event.roomId, + eventId: event.relatesTo!, + ), + ), + ) + .when( + data: (replyEvent) => replyEvent == null + ? SizedBox.shrink() + : EventRenderer( + replyEvent, + textOnly: true, + maxLines: 1, + ), + error: (_, _) => Text( + "An error occurred while fetching the reply", + style: errorStyle, + ), + loading: () => + Text("Fetching event..."), + ), + ), switch (event.content) { EncryptedContent() => Text( "Unable to decrypt event",