From 3fd0d5f4614f1eef8ed534d6b1a13853c67153ca Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Tue, 6 Jan 2026 16:31:51 -0500 Subject: [PATCH] Use timelines, encryption now works, except not fetching keys from old devices --- lib/controllers/events_controller.dart | 26 ++++++----------------- lib/controllers/from_controller.dart | 15 ------------- lib/controllers/room_chat_controller.dart | 24 ++++++++++++++------- lib/main.dart | 1 + 4 files changed, 24 insertions(+), 42 deletions(-) delete mode 100644 lib/controllers/from_controller.dart diff --git a/lib/controllers/events_controller.dart b/lib/controllers/events_controller.dart index 37b9ff2..e7a192d 100644 --- a/lib/controllers/events_controller.dart +++ b/lib/controllers/events_controller.dart @@ -1,30 +1,18 @@ import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:matrix/matrix.dart"; -import "package:nexus/controllers/from_controller.dart"; -class EventsController extends AsyncNotifier { +class EventsController extends AsyncNotifier { EventsController(this.room); final Room room; @override - Future build({String? from}) async { - final response = await room.client.getRoomEvents( - room.id, - Direction.b, - from: from, - limit: 32, - ); - if (ref.mounted) { - ref.watch(FromController.provider(room).notifier).set(response.end); - } - return response; + Future build({String? from}) => room.getTimeline(); + + Future prev() async { + final timeline = await future; + await timeline.requestHistory(); } - Future prev() async => - build(from: ref.read(FromController.provider(room))); - static final provider = AsyncNotifierProvider.autoDispose - .family( - EventsController.new, - ); + .family(EventsController.new); } diff --git a/lib/controllers/from_controller.dart b/lib/controllers/from_controller.dart deleted file mode 100644 index 54c850a..0000000 --- a/lib/controllers/from_controller.dart +++ /dev/null @@ -1,15 +0,0 @@ -import "package:flutter_riverpod/flutter_riverpod.dart"; -import "package:matrix/matrix.dart"; - -class FromController extends Notifier { - FromController(_); - @override - String? build() => null; - - void set(String? value) => state = value; - - static final provider = - NotifierProvider.family( - FromController.new, - ); -} diff --git a/lib/controllers/room_chat_controller.dart b/lib/controllers/room_chat_controller.dart index b9ea7b0..e9bd7ba 100644 --- a/lib/controllers/room_chat_controller.dart +++ b/lib/controllers/room_chat_controller.dart @@ -60,7 +60,7 @@ class RoomChatController extends AsyncNotifier { ); return InMemoryChatController( - messages: await response.chunk.toMessages(room), + messages: await response.events.toMessages(room), ); } @@ -85,14 +85,22 @@ class RoomChatController extends AsyncNotifier { } Future 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 response = await ref - .watch(EventsController.provider(room).notifier) - .prev(); - - final messages = await response.chunk.toMessages(room); - - await controller.insertAllMessages(messages, index: 0); + await controller.insertAllMessages( + await newEvents.events + .where( + (event) => !currentEvents.messages.any( + (existingEvent) => existingEvent.id == event.eventId, + ), + ) + .toList() + .toMessages(room), + index: 0, + ); ref.notifyListeners(); } diff --git a/lib/main.dart b/lib/main.dart index 8cf4365..bf65f75 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -34,6 +34,7 @@ New Value: ${newValue is AsyncData ? newValue.value : newValue} void showError(Object error, [StackTrace? stackTrace]) { if (error.toString().contains("DioException")) return; if (error.toString().contains("UTF-16")) return; + if (error.toString().contains("HTTP request failed")) return; if (error.toString().contains("Invalid image data")) return; debugPrintStack(stackTrace: stackTrace, label: error.toString());