Add better error handling, send messages early and update when delivered

This commit is contained in:
Henry Hiles 2026-03-30 12:47:49 -04:00
commit 55ecbc3590
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
9 changed files with 111 additions and 74 deletions

View file

@ -9,6 +9,7 @@ import "package:flutter/foundation.dart";
import "package:nexus/controllers/account_data_controller.dart";
import "package:nexus/controllers/client_state_controller.dart";
import "package:nexus/controllers/init_complete_controller.dart";
import "package:nexus/controllers/new_events_controller.dart";
import "package:nexus/controllers/rooms_controller.dart";
import "package:nexus/controllers/space_edges_controller.dart";
import "package:nexus/controllers/sync_status_controller.dart";
@ -74,6 +75,13 @@ class ClientController extends AsyncNotifier<int> {
case "init_complete":
ref.watch(InitCompleteController.provider.notifier).complete();
break;
case "send_complete":
final event = Event.fromJson(decodedMuksEvent["event"]);
ref
.watch(NewEventsController.provider(event.roomId).notifier)
.add(IList([event]));
break;
case "sync_complete":
final syncData = SyncData.fromJson(decodedMuksEvent);
final roomProvider = RoomsController.provider;
@ -150,8 +158,8 @@ class ClientController extends AsyncNotifier<int> {
Future<void> redactEvent(RedactEventRequest report) =>
_sendCommand("redact_event", report.toJson());
Future<void> sendMessage(SendMessageRequest request) =>
_sendCommand("send_message", request.toJson());
Future<Event> sendMessage(SendMessageRequest request) async =>
Event.fromJson(await _sendCommand("send_message", request.toJson()));
Future<String?> verify(String recoveryKey) async {
try {

View file

@ -46,6 +46,7 @@ class MessageController extends AsyncNotifier<Message?> {
"big": event.localContent?.bigEmoji == true,
"eventType": type,
"pmp": event.content["com.beeper.per_message_profile"],
"error": event.sendError,
"editSource":
event.localContent?.editSource ??
newContent?["body"] ??

View file

@ -28,7 +28,6 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
final client = ref.watch(ClientController.provider.notifier);
var room = ref.read(RoomsController.provider)[roomId];
if (room == null) return InMemoryChatController();
final state = await client.getRoomState(
GetRoomStateRequest(roomId: roomId),
);
@ -78,7 +77,6 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
ref.onDispose(
ref.listen(NewEventsController.provider(roomId), (_, next) async {
final controller = await future;
for (final event in next) {
if (event.type == "m.room.redaction") {
final controller = await future;
@ -116,12 +114,8 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
),
);
}
if (message != null &&
!controller.messages.any(
(oldMessage) => oldMessage.id == message.id,
) &&
ref.mounted) {
await controller.insertMessage(message);
if (message != null && ref.mounted) {
await insertMessage(message);
}
}
}
@ -152,19 +146,11 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
: controller.updateMessage(oldMessage, message);
}
Future<void> deleteMessage(Message message, {String? reason}) async {
final controller = await future;
await controller.removeMessage(message);
await ref
.watch(ClientController.provider.notifier)
.redactEvent(
RedactEventRequest(
eventId: message.id,
roomId: roomId,
reason: reason,
),
);
}
Future<void> deleteMessage(Message message, {String? reason}) => ref
.watch(ClientController.provider.notifier)
.redactEvent(
RedactEventRequest(eventId: message.id, roomId: roomId, reason: reason),
);
Future<void> loadOlder([InMemoryChatController? chatController]) async {
final response = await ref
@ -242,7 +228,8 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
}
final client = ref.watch(ClientController.provider.notifier);
client.sendMessage(
final room = ref.read(RoomsController.provider)[roomId];
final event = await client.sendMessage(
SendMessageRequest(
roomId: roomId,
mentions: Mentions(
@ -260,6 +247,15 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
: Relation(eventId: relation.id, relationType: relationType),
),
);
final message = room == null
? null
: await ref.watch(
MessageController.provider(
MessageConfig(room: room, event: event),
).future,
);
if (message != null) insertMessage(message);
}
Future<chat.User> resolveUser(String id) async {