Use timelines, encryption now works, except not fetching keys from old devices

This commit is contained in:
Henry Hiles 2026-01-06 16:31:51 -05:00
commit 3fd0d5f461
No known key found for this signature in database
4 changed files with 24 additions and 42 deletions

View file

@ -1,30 +1,18 @@
import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:matrix/matrix.dart"; import "package:matrix/matrix.dart";
import "package:nexus/controllers/from_controller.dart";
class EventsController extends AsyncNotifier<GetRoomEventsResponse> { class EventsController extends AsyncNotifier<Timeline> {
EventsController(this.room); EventsController(this.room);
final Room room; final Room room;
@override @override
Future<GetRoomEventsResponse> build({String? from}) async { Future<Timeline> build({String? from}) => room.getTimeline();
final response = await room.client.getRoomEvents(
room.id, Future<void> prev() async {
Direction.b, final timeline = await future;
from: from, await timeline.requestHistory();
limit: 32,
);
if (ref.mounted) {
ref.watch(FromController.provider(room).notifier).set(response.end);
}
return response;
} }
Future<GetRoomEventsResponse> prev() async =>
build(from: ref.read(FromController.provider(room)));
static final provider = AsyncNotifierProvider.autoDispose static final provider = AsyncNotifierProvider.autoDispose
.family<EventsController, GetRoomEventsResponse, Room>( .family<EventsController, Timeline, Room>(EventsController.new);
EventsController.new,
);
} }

View file

@ -1,15 +0,0 @@
import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:matrix/matrix.dart";
class FromController extends Notifier<String?> {
FromController(_);
@override
String? build() => null;
void set(String? value) => state = value;
static final provider =
NotifierProvider.family<FromController, String?, Room>(
FromController.new,
);
}

View file

@ -60,7 +60,7 @@ class RoomChatController extends AsyncNotifier<ChatController> {
); );
return InMemoryChatController( return InMemoryChatController(
messages: await response.chunk.toMessages(room), messages: await response.events.toMessages(room),
); );
} }
@ -85,14 +85,22 @@ class RoomChatController extends AsyncNotifier<ChatController> {
} }
Future<void> loadOlder() async { Future<void> loadOlder() async {
final currentEvents = await future;
await ref.watch(EventsController.provider(room).notifier).prev();
final newEvents = await ref.watch(EventsController.provider(room).future);
final controller = await future; final controller = await future;
final response = await ref await controller.insertAllMessages(
.watch(EventsController.provider(room).notifier) await newEvents.events
.prev(); .where(
(event) => !currentEvents.messages.any(
final messages = await response.chunk.toMessages(room); (existingEvent) => existingEvent.id == event.eventId,
),
await controller.insertAllMessages(messages, index: 0); )
.toList()
.toMessages(room),
index: 0,
);
ref.notifyListeners(); ref.notifyListeners();
} }

View file

@ -34,6 +34,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("UTF-16")) return; if (error.toString().contains("UTF-16")) 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;
debugPrintStack(stackTrace: stackTrace, label: error.toString()); debugPrintStack(stackTrace: stackTrace, label: error.toString());