Remove flutter chat #26

Manually merged
Henry-Hiles merged 108 commits from remove-flutter-chat into main 2026-05-22 15:26:28 -04:00
4 changed files with 45 additions and 28 deletions
Showing only changes of commit 1305320a1a - Show all commits

Implement theoretical code for rendering replies

Waiting on Tulir's reply on why I don't get relatesTo and relationType back on DBEvents from sync
Henry Hiles 2026-05-19 20:17:41 -04:00
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs

View file

@ -218,11 +218,6 @@ class ClientController extends AsyncNotifier<int> {
}
Future<Event?> 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);
}

View file

@ -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<Event?> {
@override
Future<Event?> 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

View file

@ -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<String, dynamic> 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<String, Object?> json) =>
_$GetEventRequestFromJson(json);
}

View file

@ -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",