lots of stuff

This commit is contained in:
Henry Hiles 2025-11-14 15:50:38 -05:00
commit ba9e99a951
No known key found for this signature in database
19 changed files with 608 additions and 360 deletions

View file

@ -3,22 +3,26 @@ import "package:flutter_chat_core/flutter_chat_core.dart";
import "package:flutter_chat_core/flutter_chat_core.dart" as chat;
import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:matrix/matrix.dart";
import "package:nexus/controllers/timeline_controller.dart";
import "package:nexus/helpers/extension_helper.dart";
class RoomChatController extends AsyncNotifier<ChatController> {
RoomChatController(this.room);
final Room room;
RoomChatController(this.room);
@override
Future<ChatController> build() async {
final timeline = await room.getTimeline();
room.client.onTimelineEvent.stream.listen((event) async {
if (event.roomId != room.id) return;
final message = await event.toMessage();
if (message != null) {
await insertMessage(message);
}
});
final timeline = await ref.watch(TimelineController.provider(room).future);
ref.onDispose(
room.client.onTimelineEvent.stream.listen((event) async {
if (event.roomId != room.id) return;
final message = await event.toMessage();
if (message != null) {
await insertMessage(message);
}
}).cancel,
);
return InMemoryChatController(
messages: (await Future.wait(
@ -29,15 +33,22 @@ class RoomChatController extends AsyncNotifier<ChatController> {
Future<void> insertMessage(Message message) async {
final controller = await future;
final oldMessage = controller.messages.firstWhereOrNull(
(element) => element.metadata?["txnId"] == message.metadata?["txnId"],
);
final oldMessage = message.metadata?["txnId"] == null
? null
: controller.messages.firstWhereOrNull(
(element) =>
element.metadata?["txnId"] == message.metadata?["txnId"],
);
return oldMessage == null
? controller.insertMessage(message)
: controller.updateMessage(oldMessage, message);
}
Future<void> loadOlder() async {
await ref.watch(TimelineController.provider(room).notifier).prev();
}
Future<void> updateMessage(Message message, Message newMessage) async {
final controller = await future;
return controller.updateMessage(message, newMessage);
@ -55,6 +66,7 @@ class RoomChatController extends AsyncNotifier<ChatController> {
id: id,
name: user.displayname,
imageSource: (await user.avatarUrl?.getThumbnailUri(
// TODO: Fix use of account avatar not room avatar
room.client,
width: 24,
height: 24,