improve speed of state merge
This commit is contained in:
parent
a698cf8c28
commit
195d212d68
3 changed files with 14 additions and 20 deletions
|
|
@ -27,7 +27,7 @@ class MembersController(final String roomId)
|
|||
),
|
||||
);
|
||||
|
||||
await ref
|
||||
ref
|
||||
.read(RoomsController.provider.notifier)
|
||||
.addState(roomId, fetchedState, isMembers: true);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
|
|
|
|||
Loading…
Reference in a new issue