From 195d212d681269c9d976c8992dc0f0d82922423b Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Mon, 28 Sep 2026 18:29:46 -0400 Subject: [PATCH] improve speed of state merge --- lib/controllers/members.dart | 2 +- lib/controllers/room_chat.dart | 4 +--- lib/controllers/rooms.dart | 28 ++++++++++++---------------- 3 files changed, 14 insertions(+), 20 deletions(-) diff --git a/lib/controllers/members.dart b/lib/controllers/members.dart index 3c287ea..d8172b1 100644 --- a/lib/controllers/members.dart +++ b/lib/controllers/members.dart @@ -27,7 +27,7 @@ class MembersController(final String roomId) ), ); - await ref + ref .read(RoomsController.provider.notifier) .addState(roomId, fetchedState, isMembers: true); } diff --git a/lib/controllers/room_chat.dart b/lib/controllers/room_chat.dart index 6eab4bd..7b9a802 100644 --- a/lib/controllers/room_chat.dart +++ b/lib/controllers/room_chat.dart @@ -36,9 +36,7 @@ class RoomChatController(final ChatParams info) if (!room.hasFetchedState) { final state = await client.getRoomState(.new(roomId: info.roomId)); - await ref - .read(RoomsController.provider.notifier) - .addState(info.roomId, state); + ref.read(RoomsController.provider.notifier).addState(info.roomId, state); } final timeline = room.timeline diff --git a/lib/controllers/rooms.dart b/lib/controllers/rooms.dart index ff4d6a2..2e8c2a9 100644 --- a/lib/controllers/rooms.dart +++ b/lib/controllers/rooms.dart @@ -1,5 +1,4 @@ -import "dart:isolate"; - +import "package:collection/collection.dart"; import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:nexus/models/event.dart"; @@ -9,29 +8,26 @@ class RoomsController extends Notifier> { @override IMap build() => .new(); - Future addState( + void addState( String roomId, IList state, { bool isMembers = false, - }) async => update( + }) => update( .new({ roomId: Room( events: .fromEntries(state.map((event) => .new(event.rowId, event))), hasFetchedState: true, hasFetchedMembers: isMembers, - state: await Isolate.run(() { - final newState = state.fold>>( - .new(), - (previousValue, stateEvent) => previousValue.add( - stateEvent.type, - (previousValue[stateEvent.type] ?? .new()).add( - stateEvent.stateKey!, - stateEvent.rowId, + state: .new( + state + .groupListsBy((event) => event.type) + .map( + (type, group) => .new( + type, + .fromEntries(group.map((e) => .new(e.stateKey!, e.rowId))), + ), ), - ), - ); - return newState; - }), + ), ), }), .new(),