fix dupes
This commit is contained in:
parent
07a032bbf0
commit
a453114c17
1 changed files with 17 additions and 11 deletions
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue