Remove flutter chat #26
4 changed files with 45 additions and 28 deletions
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
commit
1305320a1a
|
|
@ -218,11 +218,6 @@ class ClientController extends AsyncNotifier<int> {
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Event?> getEvent(GetEventRequest request) async {
|
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());
|
final json = await _sendCommand("get_event", request.toJson());
|
||||||
return json == null ? null : Event.fromJson(json);
|
return json == null ? null : Event.fromJson(json);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
|
import "package:collection/collection.dart";
|
||||||
import "package:flutter_riverpod/flutter_riverpod.dart";
|
import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||||
import "package:nexus/controllers/client_controller.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/event.dart";
|
||||||
import "package:nexus/models/requests/get_event_request.dart";
|
import "package:nexus/models/requests/get_event_request.dart";
|
||||||
|
|
||||||
|
|
@ -9,8 +11,16 @@ class EventController extends AsyncNotifier<Event?> {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<Event?> build() async {
|
Future<Event?> build() async {
|
||||||
final client = ref.watch(ClientController.provider.notifier);
|
final room = ref.watch(RoomsController.provider)[request.roomId];
|
||||||
return await client.getEvent(request).onError((_, _) => null);
|
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
|
static final provider = AsyncNotifierProvider.family
|
||||||
|
|
|
||||||
|
|
@ -1,32 +1,16 @@
|
||||||
import "package:freezed_annotation/freezed_annotation.dart";
|
import "package:freezed_annotation/freezed_annotation.dart";
|
||||||
import "package:nexus/models/room.dart";
|
|
||||||
part "get_event_request.freezed.dart";
|
part "get_event_request.freezed.dart";
|
||||||
part "get_event_request.g.dart";
|
part "get_event_request.g.dart";
|
||||||
|
|
||||||
@Freezed(toJson: false)
|
@Freezed()
|
||||||
abstract class GetEventRequest with _$GetEventRequest {
|
abstract class GetEventRequest with _$GetEventRequest {
|
||||||
const GetEventRequest._();
|
const GetEventRequest._();
|
||||||
const factory GetEventRequest({
|
const factory GetEventRequest({
|
||||||
required Room room,
|
required String roomId,
|
||||||
required String eventId,
|
required String eventId,
|
||||||
@Default(false) bool unredact,
|
@Default(false) bool unredact,
|
||||||
}) = _GetEventRequest;
|
}) = _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) =>
|
factory GetEventRequest.fromJson(Map<String, Object?> json) =>
|
||||||
_$GetEventRequestFromJson(json);
|
_$GetEventRequestFromJson(json);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import "package:flutter_riverpod/flutter_riverpod.dart";
|
||||||
import "package:linkify/linkify.dart";
|
import "package:linkify/linkify.dart";
|
||||||
import "package:nexus/controllers/client_state_controller.dart";
|
import "package:nexus/controllers/client_state_controller.dart";
|
||||||
import "package:nexus/controllers/cross_cache_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/get_headers.dart";
|
||||||
import "package:nexus/helpers/extensions/mxc_to_https.dart";
|
import "package:nexus/helpers/extensions/mxc_to_https.dart";
|
||||||
import "package:nexus/helpers/extensions/show_context_menu.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/membership.dart";
|
||||||
import "package:nexus/models/content/message.dart";
|
import "package:nexus/models/content/message.dart";
|
||||||
import "package:nexus/models/event.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/expandable_image.dart";
|
||||||
import "package:nexus/widgets/html/html.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_avatar.dart";
|
||||||
import "package:nexus/widgets/lazy_loading/message_displayname.dart";
|
import "package:nexus/widgets/lazy_loading/message_displayname.dart";
|
||||||
import "package:nexus/widgets/link_preview.dart";
|
import "package:nexus/widgets/link_preview.dart";
|
||||||
|
|
@ -124,9 +127,34 @@ class EventRenderer extends ConsumerWidget {
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
// Quoted( // TODO: Show replies
|
if (event.relationType == "m.in_reply_to" &&
|
||||||
// EventText(replyEvent textOnly: true, maxLines: 1,)
|
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) {
|
switch (event.content) {
|
||||||
EncryptedContent() => Text(
|
EncryptedContent() => Text(
|
||||||
"Unable to decrypt event",
|
"Unable to decrypt event",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue