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)
.addState(roomId, fetchedState, isMembers: true);
}

View file

@ -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

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:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/models/event.dart";
@ -9,29 +8,26 @@ class RoomsController extends Notifier<IMap<String, Room>> {
@override
IMap<String, Room> build() => .new();
Future<void> addState(
void addState(
String roomId,
IList<Event> 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<IMap<String, IMap<String, int>>>(
.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(),