Expandable room icons

This commit is contained in:
Henry Hiles 2026-03-28 00:11:24 -04:00
commit 690d2549bc
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
10 changed files with 139 additions and 87 deletions

View file

@ -2,6 +2,7 @@ import "dart:async";
import "package:collection/collection.dart";
import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/controllers/client_state_controller.dart";
import "package:nexus/controllers/members_controller.dart";
import "package:nexus/models/configs/author_config.dart";
import "package:nexus/models/membership.dart";
@ -12,7 +13,7 @@ class AuthorController extends AsyncNotifier<Membership> {
@override
Future<Membership> build() async {
var member = await ref.watch(
final member = await ref.watch(
MembersController.provider(config.room).selectAsync(
(value) => value.firstWhereOrNull(
(membership) => membership.userId == config.message.authorId,
@ -25,6 +26,12 @@ class AuthorController extends AsyncNotifier<Membership> {
: Membership.fromContent(
IMap(config.message.metadata?["pmp"]),
config.message.authorId,
ref.watch(
ClientStateController.provider.select(
(value) => value?.homeserverUrl,
),
) ??
"",
);
return Membership(

View file

@ -1,6 +1,7 @@
import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/controllers/client_controller.dart";
import "package:nexus/controllers/client_state_controller.dart";
import "package:nexus/models/membership.dart";
import "package:nexus/models/requests/get_room_state_request.dart";
import "package:nexus/models/room.dart";
@ -26,8 +27,16 @@ class MembersController extends AsyncNotifier<IList<Membership>> {
return state.nonNulls
.where((member) => member.content["membership"] == "join")
.map(
(membership) =>
Membership.fromContent(membership.content, membership.stateKey!),
(membership) => Membership.fromContent(
membership.content,
membership.stateKey!,
ref.watch(
ClientStateController.provider.select(
(value) => value?.homeserverUrl,
),
) ??
"",
),
)
.toIList();
}

View file

@ -1,7 +1,9 @@
import "package:collection/collection.dart";
import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/controllers/client_state_controller.dart";
import "package:nexus/controllers/new_events_controller.dart";
import "package:nexus/helpers/extensions/mxc_to_https.dart";
import "package:nexus/models/read_receipt.dart";
import "package:nexus/models/room.dart";
@ -10,6 +12,13 @@ class RoomsController extends Notifier<IMap<String, Room>> {
IMap<String, Room> build() => const IMap.empty();
void update(IMap<String, Room> rooms, ISet<String> leftRooms) {
final homeserver =
ref.watch(
ClientStateController.provider.select(
(value) => value?.homeserverUrl,
),
) ??
"";
final merged = rooms.entries.fold(state, (acc, entry) {
final roomId = entry.key;
final incoming = entry.value;
@ -37,7 +46,13 @@ class RoomsController extends Notifier<IMap<String, Room>> {
roomId,
existing?.copyWith(
hasMore: incoming.hasMore,
metadata: incoming.metadata ?? existing.metadata,
metadata:
incoming.metadata?.copyWith(
avatar:
incoming.metadata?.avatar?.mxcToHttps(homeserver) ??
existing.metadata?.avatar,
) ??
existing.metadata,
events: events!,
state: incoming.state.entries.fold(
existing.state,
@ -67,7 +82,11 @@ class RoomsController extends Notifier<IMap<String, Room>> {
),
),
) ??
incoming,
incoming.copyWith(
metadata: incoming.metadata?.copyWith(
avatar: incoming.metadata?.avatar?.mxcToHttps(homeserver),
),
),
);
});