fix dupes

This commit is contained in:
Henry Hiles 2025-11-12 01:48:32 -05:00
commit a453114c17
No known key found for this signature in database

View file

@ -1,3 +1,4 @@
import "package:collection/collection.dart";
import "package:flutter_chat_core/flutter_chat_core.dart"; import "package:flutter_chat_core/flutter_chat_core.dart";
import "package:flutter_chat_core/flutter_chat_core.dart" as chat; import "package:flutter_chat_core/flutter_chat_core.dart" as chat;
import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:flutter_riverpod/flutter_riverpod.dart";
@ -10,18 +11,30 @@ class RoomChatController extends AsyncNotifier<ChatController> {
@override @override
Future<ChatController> build() async { Future<ChatController> build() async {
final timeline = await room.getTimeline(); final timeline = await room.getTimeline();
room.client.onTimelineEvent.stream.listen((event) async {
if (event.roomId != room.id) return;
final message = await toMessage(event);
if (message != null) {
await insertMessage(message);
}
});
final controller = InMemoryChatController( return InMemoryChatController(
messages: (await Future.wait( messages: (await Future.wait(
timeline.events.map(toMessage), timeline.events.map(toMessage),
)).toList().reversed.nonNulls.toList(), )).toList().reversed.nonNulls.toList(),
); );
return controller;
} }
Future<void> insertMessage(Message message) async { Future<void> insertMessage(Message message) async {
final controller = await future; final controller = await future;
return controller.insertMessage(message); final oldMessage = controller.messages.firstWhereOrNull(
(element) => element.metadata?["txnId"] == message.metadata?["txnId"],
);
return oldMessage == null
? controller.insertMessage(message)
: controller.updateMessage(oldMessage, message);
} }
Future<void> updateMessage(Message message, Message newMessage) async { Future<void> updateMessage(Message message, Message newMessage) async {
@ -36,6 +49,7 @@ class RoomChatController extends AsyncNotifier<ChatController> {
final metadata = { final metadata = {
"eventType": event.type, "eventType": event.type,
"displayName": event.senderFromMemoryOrFallback.displayName, "displayName": event.senderFromMemoryOrFallback.displayName,
"txnId": event.transactionId,
}; };
return event.redacted return event.redacted
? Message.text( ? Message.text(
@ -101,14 +115,6 @@ class RoomChatController extends AsyncNotifier<ChatController> {
} }
Future<void> send(String message) async { Future<void> send(String message) async {
insertMessage(
Message.text(
id: DateTime.now().millisecondsSinceEpoch.toString(),
authorId: room.client.userID!,
text: message,
),
);
await room.sendTextEvent(message); await room.sendTextEvent(message);
} }