Watch
1
0
Fork
You've already forked nexus
0
forked from Nexus/nexus

don't watch entire room in room settings

performance improvement
This commit is contained in:
Henry Hiles 2026-10-22 21:36:16 -04:00
commit 4a9f151d92
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs

View file

@ -44,30 +44,39 @@ class RoomSettingsSectionsController(final String roomId)
extends AsyncNotifier<IMap<String, IList<SettingsCategory>>> { extends AsyncNotifier<IMap<String, IList<SettingsCategory>>> {
@override @override
Future<IMap<String, IList<SettingsCategory>>> build() async { Future<IMap<String, IList<SettingsCategory>>> build() async {
final room = ref.watch( final (:state, :metadataTopic, :metadataAvatar) = ref.watch(
RoomsController.provider.select((rooms) => rooms[roomId]), RoomsController.provider.select((rooms) {
final room = rooms[roomId];
return (
state: room?.state ?? const IMap.empty(),
metadataTopic: room?.metadata?.topic,
metadataAvatar: room?.metadata?.avatar,
);
}),
); );
Content? contentOf(int rowId) =>
ref.read(RoomsController.provider)[roomId]?.events[rowId]?.content;
final client = ref.read(ClientController.provider.notifier); final client = ref.read(ClientController.provider.notifier);
final roomsController = ref.read(RoomsController.provider.notifier); final roomsController = ref.read(RoomsController.provider.notifier);
// The room's own state, rather than metadata like a name made up from // The room's own state, rather than metadata like a name made up from
// its members when it has none // its members when it has none
Content? stateContent(EventType type) => Content? stateContent(EventType type) => switch (state[type.type]?[""]) {
switch (room?.state[type.type]?[""]) { final rowId? => contentOf(rowId),
final rowId? => room?.events[rowId]?.content, null => null,
null => null, };
};
final name = switch (stateContent(.name)) { final name = switch (stateContent(.name)) {
NameContent(:final name) => name, NameContent(:final name) => name,
_ => null, _ => null,
}; };
final topic = switch (stateContent(.topic)) { final topic = switch (stateContent(.topic)) {
TopicContent(:final topic) => topic, TopicContent(:final topic) => topic,
_ => room?.metadata?.topic, _ => metadataTopic,
}; };
final avatar = switch (stateContent(.avatar)) { final avatar = switch (stateContent(.avatar)) {
AvatarContent(:final url) => url, AvatarContent(:final url) => url,
_ => room?.metadata?.avatar, _ => metadataAvatar,
}; };
bool canSet(EventType type) => ref.watch( bool canSet(EventType type) => ref.watch(
@ -132,7 +141,7 @@ class RoomSettingsSectionsController(final String roomId)
.toIList(), .toIList(),
), ),
) )
.addAll(room?.state["m.space.parent"]?.keys ?? const []) .addAll(state["m.space.parent"]?.keys ?? const [])
.toISet(); .toISet();
final allowedRooms = joinRules.allow final allowedRooms = joinRules.allow
.map((condition) => condition.roomId) .map((condition) => condition.roomId)
@ -228,8 +237,8 @@ class RoomSettingsSectionsController(final String roomId)
}, },
); );
MembershipContent? memberOf(String userId) => MembershipContent? memberOf(String userId) =>
switch (room?.state[EventType.membership.type]?[userId]) { switch (state[EventType.membership.type]?[userId]) {
final rowId? => switch (room?.events[rowId]?.content) { final rowId? => switch (contentOf(rowId)) {
final MembershipContent content => content, final MembershipContent content => content,
_ => null, _ => null,
}, },