diff --git a/lib/controllers/room_chat_controller.dart b/lib/controllers/room_chat_controller.dart index 4412b2d..1f0fe2c 100644 --- a/lib/controllers/room_chat_controller.dart +++ b/lib/controllers/room_chat_controller.dart @@ -88,7 +88,7 @@ class RoomChatController extends AsyncNotifier> { ), ); - await ref + ref .watch(RoomsController.provider.notifier) .update( IMap({ diff --git a/lib/controllers/rooms_controller.dart b/lib/controllers/rooms_controller.dart index 55a0d2b..382fac4 100644 --- a/lib/controllers/rooms_controller.dart +++ b/lib/controllers/rooms_controller.dart @@ -1,3 +1,5 @@ +import "dart:isolate"; + import "package:fast_immutable_collections/fast_immutable_collections.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:nexus/models/event.dart"; @@ -12,7 +14,7 @@ class RoomsController extends Notifier> { String roomId, IList state, { bool isMembers = false, - }) => update( + }) async => update( { roomId: Room( events: IMap.fromEntries( @@ -20,24 +22,25 @@ class RoomsController extends Notifier> { ), hasFetchedState: true, hasFetchedMembers: isMembers, - state: state.fold( - const IMap.empty(), - (previousValue, stateEvent) => previousValue.add( - stateEvent.type, - (previousValue[stateEvent.type] ?? const IMap.empty()).addAll( - IMap({ - if (stateEvent.stateKey != null) - stateEvent.stateKey!: stateEvent.rowId, - }), + state: await Isolate.run(() { + final newState = state.fold( + const IMap>.empty(), + (previousValue, stateEvent) => previousValue.add( + stateEvent.type, + (previousValue[stateEvent.type] ?? const IMap.empty()).add( + stateEvent.stateKey!, + stateEvent.rowId, + ), ), - ), - ), + ); + return newState; + }), ), }.toIMap(), const ISet.empty(), ); - Future update(IMap rooms, ISet leftRooms) async { + void update(IMap rooms, ISet leftRooms) { final merged = rooms.entries.fold(state, (acc, entry) { final roomId = entry.key; final incoming = entry.value;