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)
|
.read(RoomsController.provider.notifier)
|
||||||
.addState(roomId, fetchedState, isMembers: true);
|
.addState(roomId, fetchedState, isMembers: true);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue