fix avatar parsing

This commit is contained in:
Henry Hiles 2026-05-18 10:25:13 -04:00
commit 46d7ec4202
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
4 changed files with 17 additions and 25 deletions

View file

@ -1,8 +1,6 @@
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/helpers/extensions/mxc_to_https.dart";
import "package:nexus/models/read_receipt.dart";
import "package:nexus/models/room.dart";
@ -15,13 +13,6 @@ class RoomsController extends Notifier<IMap<String, Room>> {
ISet<String> leftRooms, {
bool addToNewEvents = true,
}) {
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;
@ -36,13 +27,7 @@ class RoomsController extends Notifier<IMap<String, Room>> {
roomId,
existing?.copyWith(
hasMore: incoming.hasMore,
metadata:
incoming.metadata?.copyWith(
avatar:
incoming.metadata?.avatar?.mxcToHttps(homeserver) ??
existing.metadata?.avatar,
) ??
existing.metadata,
metadata: incoming.metadata ?? existing.metadata,
events: events!,
state: incoming.state.entries.fold(
existing.state,
@ -72,11 +57,7 @@ class RoomsController extends Notifier<IMap<String, Room>> {
),
),
) ??
incoming.copyWith(
metadata: incoming.metadata?.copyWith(
avatar: incoming.metadata?.avatar?.mxcToHttps(homeserver),
),
),
incoming,
);
});
@ -84,6 +65,7 @@ class RoomsController extends Notifier<IMap<String, Room>> {
merged,
(acc, roomId) => acc.remove(roomId),
);
state = prunedList;
}

View file

@ -21,7 +21,7 @@ class UserController extends AsyncNotifier<MembershipContent> {
),
);
if (member is MembershipContent) {
if (member?.content is MembershipContent) {
return member!.content as MembershipContent;
}

View file

@ -2,8 +2,10 @@ import "package:color_hash/color_hash.dart";
import "package:cross_cache/cross_cache.dart";
import "package:flutter/material.dart";
import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:nexus/controllers/client_state_controller.dart";
import "package:nexus/controllers/cross_cache_controller.dart";
import "package:nexus/helpers/extensions/get_headers.dart";
import "package:nexus/helpers/extensions/mxc_to_https.dart";
class AvatarOrHash extends ConsumerWidget {
final Uri? avatar;
@ -28,6 +30,14 @@ class AvatarOrHash extends ConsumerWidget {
color: ColorHash(title).color,
child: Center(child: Text(title.isEmpty ? "" : title[0])),
);
final parsedAvatar = avatar?.mxcToHttps(
ref.watch(
ClientStateController.provider.select(
(value) => value?.homeserverUrl,
),
) ??
"",
);
return SizedBox(
width: height,
height: height,
@ -42,11 +52,11 @@ class AvatarOrHash extends ConsumerWidget {
child: SizedBox(
width: height,
height: height,
child: avatar == null
child: parsedAvatar == null
? fallback ?? box
: Image(
image: CachedNetworkImage(
avatar.toString(),
parsedAvatar.toString(),
ref.watch(CrossCacheController.provider),
headers: ref.headers,
),

View file

@ -304,7 +304,7 @@ class RoomChat extends HookConsumerWidget {
children: [
Positioned.fill(
child: Padding(
padding: EdgeInsets.symmetric(horizontal: 8),
padding: EdgeInsets.symmetric(horizontal: 12),
child: switch (ref.watch(controllerProvider)) {
AsyncData(:final value) ||
AsyncLoading(:final value?) => CustomScrollView(