improve speed of state merge

This commit is contained in:
Henry Hiles 2026-09-28 18:29:46 -04:00
commit 195d212d68
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
3 changed files with 14 additions and 20 deletions

View file

@ -27,7 +27,7 @@ class MembersController(final String roomId)
), ),
); );
await ref ref
.read(RoomsController.provider.notifier) .read(RoomsController.provider.notifier)
.addState(roomId, fetchedState, isMembers: true); .addState(roomId, fetchedState, isMembers: true);
} }

View file

@ -36,9 +36,7 @@ class RoomChatController(final ChatParams info)
if (!room.hasFetchedState) { if (!room.hasFetchedState) {
final state = await client.getRoomState(.new(roomId: info.roomId)); final state = await client.getRoomState(.new(roomId: info.roomId));
await ref ref.read(RoomsController.provider.notifier).addState(info.roomId, state);
.read(RoomsController.provider.notifier)
.addState(info.roomId, state);
} }
final timeline = room.timeline final timeline = room.timeline

View file

@ -1,5 +1,4 @@
import "dart:isolate"; 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/models/event.dart"; import "package:nexus/models/event.dart";
@ -9,29 +8,26 @@ class RoomsController extends Notifier<IMap<String, Room>> {
@override @override
IMap<String, Room> build() => .new(); IMap<String, Room> build() => .new();
Future<void> addState( void addState(
String roomId, String roomId,
IList<Event> state, { IList<Event> state, {
bool isMembers = false, bool isMembers = false,
}) async => update( }) => update(
.new({ .new({
roomId: Room( roomId: Room(
events: .fromEntries(state.map((event) => .new(event.rowId, event))), events: .fromEntries(state.map((event) => .new(event.rowId, event))),
hasFetchedState: true, hasFetchedState: true,
hasFetchedMembers: isMembers, hasFetchedMembers: isMembers,
state: await Isolate.run(() { state: .new(
final newState = state.fold<IMap<String, IMap<String, int>>>( state
.new(), .groupListsBy((event) => event.type)
(previousValue, stateEvent) => previousValue.add( .map(
stateEvent.type, (type, group) => .new(
(previousValue[stateEvent.type] ?? .new()).add( type,
stateEvent.stateKey!, .fromEntries(group.map((e) => .new(e.stateKey!, e.rowId))),
stateEvent.rowId, ),
), ),
), ),
);
return newState;
}),
), ),
}), }),
.new(), .new(),