lots of stuff
This commit is contained in:
parent
8bc010cfc7
commit
ba9e99a951
19 changed files with 608 additions and 360 deletions
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue