1
0
Fork 0
forked from Nexus/nexus

Revert "WIP removal of new_events_controller"

This reverts commit 5a99616e9c.
This commit is contained in:
Henry Hiles 2026-05-03 12:10:37 -04:00
commit 4dc16a5529
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
8 changed files with 133 additions and 168 deletions

View file

@ -9,7 +9,7 @@ import "package:flutter/foundation.dart";
import "package:nexus/controllers/account_data_controller.dart"; import "package:nexus/controllers/account_data_controller.dart";
import "package:nexus/controllers/client_state_controller.dart"; import "package:nexus/controllers/client_state_controller.dart";
import "package:nexus/controllers/init_complete_controller.dart"; import "package:nexus/controllers/init_complete_controller.dart";
import "package:nexus/controllers/room_chat_controller.dart"; import "package:nexus/controllers/new_events_controller.dart";
import "package:nexus/controllers/rooms_controller.dart"; import "package:nexus/controllers/rooms_controller.dart";
import "package:nexus/controllers/space_edges_controller.dart"; import "package:nexus/controllers/space_edges_controller.dart";
import "package:nexus/controllers/sync_status_controller.dart"; import "package:nexus/controllers/sync_status_controller.dart";
@ -82,10 +82,11 @@ class ClientController extends AsyncNotifier<int> {
final event = Event.fromJson(decodedMuksEvent["event"]); final event = Event.fromJson(decodedMuksEvent["event"]);
if (event.type == "m.room.message") { if (event.type == "m.room.message") {
final provider = RoomChatController.provider(event.roomId); ref
if (ref.exists(provider)) { .watch(
ref.watch(provider.notifier).addEvent(event); NewEventsController.provider(event.roomId).notifier,
} )
.add(IList([event]));
} }
break; break;
case "sync_complete": case "sync_complete":
@ -126,9 +127,9 @@ class ClientController extends AsyncNotifier<int> {
} }
debugPrint("Finished handling $muksEventType..."); debugPrint("Finished handling $muksEventType...");
} catch (error, stackTrace) { } catch (error, stackTrace) {
debugPrintStack(stackTrace: stackTrace, label: error.toString());
debugger(); debugger();
showError(error, stackTrace); showError(error, stackTrace);
debugPrintStack(stackTrace: stackTrace, label: error.toString());
} }
}); });

View file

@ -0,0 +1,18 @@
import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/models/event.dart";
class NewEventsController extends Notifier<IList<Event>> {
final String roomId;
NewEventsController(this.roomId);
@override
IList<Event> build() => const IList.empty();
void add(IList<Event> newEvents) => state = newEvents;
static final provider = NotifierProvider.autoDispose
.family<NewEventsController, IList<Event>, String>(
NewEventsController.new,
);
}

View file

@ -7,11 +7,11 @@ import "package:fluttertagger/fluttertagger.dart";
import "package:nexus/controllers/client_controller.dart"; import "package:nexus/controllers/client_controller.dart";
import "package:nexus/controllers/message_controller.dart"; import "package:nexus/controllers/message_controller.dart";
import "package:nexus/controllers/messages_controller.dart"; import "package:nexus/controllers/messages_controller.dart";
import "package:nexus/controllers/new_events_controller.dart";
import "package:nexus/controllers/rooms_controller.dart"; 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/models/configs/messages_config.dart"; import "package:nexus/models/configs/messages_config.dart";
import "package:nexus/models/configs/message_config.dart"; import "package:nexus/models/configs/message_config.dart";
import "package:nexus/models/event.dart";
import "package:nexus/models/requests/get_related_events_request.dart"; import "package:nexus/models/requests/get_related_events_request.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";
@ -77,21 +77,13 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
); );
final controller = InMemoryChatController(messages: messages.toList()); final controller = InMemoryChatController(messages: messages.toList());
ref.onDispose(controller.dispose); ref.onDispose(
ref.listen(NewEventsController.provider(roomId), (_, next) async {
// While there are under 20 messages, try up to load more messages until theres no more or we have 20 messages. for (final event in next) {
for (var more = true; more == true && controller.messages.length < 20;) {
more = await loadOlder(controller);
}
return controller;
}
Future<void> addEvent(Event event) async {
final controller = await future;
if (event.type == "m.reaction") { if (event.type == "m.reaction") {
final message = controller.messages.firstWhereOrNull( final message = controller.messages.firstWhereOrNull(
(message) => message.id == event.content["m.relates_to"]?["event_id"], (message) =>
message.id == event.content["m.relates_to"]?["event_id"],
); );
final key = event.content["m.relates_to"]?["key"]; final key = event.content["m.relates_to"]?["key"];
if (message == null || key == null || !ref.mounted) return; if (message == null || key == null || !ref.mounted) return;
@ -141,7 +133,8 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
reactions: IMap(message.reactions) reactions: IMap(message.reactions)
.update( .update(
key, key,
(reactors) => IList(reactors).remove(redacts.authorId).unlock, (reactors) =>
IList(reactors).remove(redacts.authorId).unlock,
) )
.where((_, value) => value.isNotEmpty) .where((_, value) => value.isNotEmpty)
.unlock, .unlock,
@ -151,11 +144,7 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
} else { } else {
final message = await ref.watch( final message = await ref.watch(
MessageController.provider( MessageController.provider(
MessageConfig( MessageConfig(event: event, room: room!, includeEdits: true),
event: event,
room: ref.read(RoomsController.provider)[roomId]!,
includeEdits: true,
),
).future, ).future,
); );
if (event.relationType == "m.replace") { if (event.relationType == "m.replace") {
@ -185,6 +174,18 @@ class RoomChatController extends AsyncNotifier<InMemoryChatController> {
} }
} }
} }
}, weak: true).close,
);
ref.onDispose(controller.dispose);
// While there are under 20 messages, try up to load more messages until theres no more or we have 20 messages.
for (var more = true; more == true && controller.messages.length < 20;) {
more = await loadOlder(controller);
}
return controller;
}
Future<void> insertMessage(Message message) async { Future<void> insertMessage(Message message) async {
final controller = await future; final controller = await future;

View file

@ -2,7 +2,7 @@ import "package:collection/collection.dart";
import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/controllers/client_state_controller.dart"; import "package:nexus/controllers/client_state_controller.dart";
import "package:nexus/controllers/room_chat_controller.dart"; import "package:nexus/controllers/new_events_controller.dart";
import "package:nexus/helpers/extensions/mxc_to_https.dart"; import "package:nexus/helpers/extensions/mxc_to_https.dart";
import "package:nexus/models/read_receipt.dart"; import "package:nexus/models/read_receipt.dart";
import "package:nexus/models/room.dart"; import "package:nexus/models/room.dart";
@ -34,20 +34,18 @@ class RoomsController extends Notifier<IMap<String, Room>> {
); );
if (addToNewEvents) { if (addToNewEvents) {
final provider = RoomChatController.provider(roomId); ref
if (ref.exists(provider)) { .watch(NewEventsController.provider(roomId).notifier)
for (final event .add(
in incoming.timeline incoming.timeline
.map( .map(
(timelineTuple) => events?.firstWhereOrNull( (timelineTuple) => events?.firstWhereOrNull(
(event) => timelineTuple.eventRowId == event.rowId, (event) => timelineTuple.eventRowId == event.rowId,
), ),
) )
.nonNulls .nonNulls
.toIList()) { .toIList(),
ref.read(provider.notifier).addEvent(event); );
}
}
} }
return acc.add( return acc.add(

View file

@ -983,54 +983,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.0" version: "2.3.0"
permission_handler:
dependency: "direct main"
description:
name: permission_handler
sha256: bc917da36261b00137bbc8896bf1482169cd76f866282368948f032c8c1caae1
url: "https://pub.dev"
source: hosted
version: "12.0.1"
permission_handler_android:
dependency: transitive
description:
name: permission_handler_android
sha256: "1e3bc410ca1bf84662104b100eb126e066cb55791b7451307f9708d4007350e6"
url: "https://pub.dev"
source: hosted
version: "13.0.1"
permission_handler_apple:
dependency: transitive
description:
name: permission_handler_apple
sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023
url: "https://pub.dev"
source: hosted
version: "9.4.7"
permission_handler_html:
dependency: transitive
description:
name: permission_handler_html
sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24"
url: "https://pub.dev"
source: hosted
version: "0.1.3+5"
permission_handler_platform_interface:
dependency: transitive
description:
name: permission_handler_platform_interface
sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878
url: "https://pub.dev"
source: hosted
version: "4.3.0"
permission_handler_windows:
dependency: transitive
description:
name: permission_handler_windows
sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e"
url: "https://pub.dev"
source: hosted
version: "0.2.1"
petitparser: petitparser:
dependency: transitive dependency: transitive
description: description:

View file

@ -61,7 +61,6 @@ dependencies:
emoji_text_field: emoji_text_field:
git: git:
url: https://github.com/Henry-Hiles/emoji_text_field url: https://github.com/Henry-Hiles/emoji_text_field
permission_handler: ^12.0.1
dev_dependencies: dev_dependencies:
build_runner: ^2.4.11 build_runner: ^2.4.11

View file

@ -8,7 +8,6 @@
#include <dynamic_system_colors/dynamic_color_plugin_c_api.h> #include <dynamic_system_colors/dynamic_color_plugin_c_api.h>
#include <file_selector_windows/file_selector_windows.h> #include <file_selector_windows/file_selector_windows.h>
#include <permission_handler_windows/permission_handler_windows_plugin.h>
#include <screen_retriever_windows/screen_retriever_windows_plugin_c_api.h> #include <screen_retriever_windows/screen_retriever_windows_plugin_c_api.h>
#include <url_launcher_windows/url_launcher_windows.h> #include <url_launcher_windows/url_launcher_windows.h>
#include <window_manager/window_manager_plugin.h> #include <window_manager/window_manager_plugin.h>
@ -18,8 +17,6 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
registry->GetRegistrarForPlugin("DynamicColorPluginCApi")); registry->GetRegistrarForPlugin("DynamicColorPluginCApi"));
FileSelectorWindowsRegisterWithRegistrar( FileSelectorWindowsRegisterWithRegistrar(
registry->GetRegistrarForPlugin("FileSelectorWindows")); registry->GetRegistrarForPlugin("FileSelectorWindows"));
PermissionHandlerWindowsPluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin"));
ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar( ScreenRetrieverWindowsPluginCApiRegisterWithRegistrar(
registry->GetRegistrarForPlugin("ScreenRetrieverWindowsPluginCApi")); registry->GetRegistrarForPlugin("ScreenRetrieverWindowsPluginCApi"));
UrlLauncherWindowsRegisterWithRegistrar( UrlLauncherWindowsRegisterWithRegistrar(

View file

@ -5,7 +5,6 @@
list(APPEND FLUTTER_PLUGIN_LIST list(APPEND FLUTTER_PLUGIN_LIST
dynamic_system_colors dynamic_system_colors
file_selector_windows file_selector_windows
permission_handler_windows
screen_retriever_windows screen_retriever_windows
url_launcher_windows url_launcher_windows
window_manager window_manager