forked from Nexus/nexus
don't watch entire room in room settings
performance improvement
This commit is contained in:
parent
d4ae5ebccf
commit
4a9f151d92
1 changed files with 21 additions and 12 deletions
|
|
@ -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,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue