working history loading

This commit is contained in:
Henry Hiles 2026-01-30 09:15:55 +01:00
commit 132efbdfd1
No known key found for this signature in database
3 changed files with 20 additions and 23 deletions

View file

@ -10,7 +10,6 @@ import "package:nexus/controllers/rooms_controller.dart";
import "package:nexus/controllers/selected_room_controller.dart"; import "package:nexus/controllers/selected_room_controller.dart";
import "package:nexus/helpers/extensions/event_to_message.dart"; import "package:nexus/helpers/extensions/event_to_message.dart";
import "package:nexus/helpers/extensions/list_to_messages.dart"; import "package:nexus/helpers/extensions/list_to_messages.dart";
import "package:nexus/models/event.dart";
import "package:nexus/models/requests/get_room_state_request.dart"; import "package:nexus/models/requests/get_room_state_request.dart";
import "package:nexus/models/requests/paginate_request.dart"; import "package:nexus/models/requests/paginate_request.dart";
import "package:nexus/models/requests/redact_event_request.dart"; import "package:nexus/models/requests/redact_event_request.dart";
@ -153,20 +152,17 @@ class RoomChatController extends AsyncNotifier<ChatController> {
const ISet.empty(), const ISet.empty(),
); );
final existingIds = controller.messages.map((m) => m.id).toSet(); final messages = await response.events.reversed.toMessages(ref);
await controller.insertAllMessages(
final messages = await response.events messages
.where((event) => !existingIds.contains(event.eventId)) .where(
.fold(<String, Event>{}, (acc, event) { (newMessage) => !controller.messages.any(
acc[event.eventId] = (message) => message.id == newMessage.id,
event; // overwrites duplicates in response.events ),
return acc; )
}) .toList(),
.values index: 0,
.toIList() );
.reversed
.toMessages(ref);
await controller.insertAllMessages(messages, index: 0);
} }
Future<void> updateMessage(Message message, Message newMessage) async => Future<void> updateMessage(Message message, Message newMessage) async =>
@ -181,12 +177,14 @@ class RoomChatController extends AsyncNotifier<ChatController> {
var taggedMessage = message; var taggedMessage = message;
for (final tag in tags) { for (final tag in tags) {
final escaped = RegExp.escape(tag.id); // TODO: Fix final escaped = RegExp.escape(tag.id);
final pattern = RegExp(r"@+(" + escaped + r")(#[^#]*#)?"); final pattern = RegExp(r"@+(" + escaped + r")(#[^#]*#)?");
taggedMessage = taggedMessage.replaceAllMapped( taggedMessage = taggedMessage.replaceAllMapped(
pattern, pattern,
(match) => match.group(1)!, (match) => match.group(
1,
)!, // TODO: Return an HTML or Markdown link from here, not plaintext
); );
} }
@ -194,6 +192,7 @@ class RoomChatController extends AsyncNotifier<ChatController> {
client.sendMessage( client.sendMessage(
SendMessageRequest( SendMessageRequest(
roomId: roomId, roomId: roomId,
mentions: Mentions(), // TODO: Add parsed mentions
text: taggedMessage, text: taggedMessage,
relation: relation == null relation: relation == null
? null ? null

View file

@ -37,6 +37,7 @@ New Value: ${newValue is AsyncData ? newValue.value : newValue}
void showError(Object error, [StackTrace? stackTrace]) { void showError(Object error, [StackTrace? stackTrace]) {
if (error.toString().contains("DioException")) return; if (error.toString().contains("DioException")) return;
if (error.toString().contains("Invalid source")) return;
if (error.toString().contains("UTF-16")) return; if (error.toString().contains("UTF-16")) return;
if (error.toString().contains("HTTP request failed")) return; if (error.toString().contains("HTTP request failed")) return;
if (error.toString().contains("Invalid image data")) return; if (error.toString().contains("Invalid image data")) return;

View file

@ -1,4 +1,3 @@
import "package:collection/collection.dart";
import "package:flutter/material.dart"; import "package:flutter/material.dart";
import "package:flutter_hooks/flutter_hooks.dart"; import "package:flutter_hooks/flutter_hooks.dart";
import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:hooks_riverpod/hooks_riverpod.dart";
@ -66,11 +65,9 @@ class Sidebar extends HookConsumerWidget {
fallback: space.icon == null ? null : Icon(space.icon), fallback: space.icon == null ? null : Icon(space.icon),
space.title, space.title,
headers: {}, // TODO headers: {}, // TODO
hasBadge: hasBadge: space.children.any(
space.children.firstWhereOrNull( (room) => room.metadata?.unreadMessages != 0,
(room) => room.metadata?.unreadMessages != 0, ),
) !=
null,
badgeNumber: space.children.fold( badgeNumber: space.children.fold(
0, 0,
(previousValue, room) => (previousValue, room) =>