diff --git a/packages/neon/neon_talk/lib/src/widgets/room_avatar.dart b/packages/neon/neon_talk/lib/src/widgets/room_avatar.dart index 6360c5d579a..cf979b2b62c 100644 --- a/packages/neon/neon_talk/lib/src/widgets/room_avatar.dart +++ b/packages/neon/neon_talk/lib/src/widgets/room_avatar.dart @@ -1,6 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:neon_framework/blocs.dart'; -import 'package:neon_framework/utils.dart'; import 'package:neon_framework/widgets.dart'; import 'package:nextcloud/spreed.dart' as spreed; @@ -20,15 +18,12 @@ class TalkRoomAvatar extends StatelessWidget { @override Widget build(BuildContext context) { - final account = NeonProvider.of(context).activeAccount.value!; - if (room.isCustomAvatar ?? false) { final brightness = Theme.of(context).brightness; return CircleAvatar( child: ClipOval( - child: NeonApiImage.withAccount( - account: account, + child: NeonApiImage( getImage: (client) => switch (brightness) { Brightness.dark => client.spreed.avatar.getAvatarDarkRaw(token: room.token), Brightness.light => client.spreed.avatar.getAvatarRaw(token: room.token), @@ -43,7 +38,6 @@ class TalkRoomAvatar extends StatelessWidget { return switch (spreed.RoomType.fromValue(room.type)) { spreed.RoomType.oneToOne => NeonUserAvatar( - account: account, username: room.name, ), spreed.RoomType.group => _buildIconAvatar(Icons.group), diff --git a/packages/neon_framework/lib/src/widgets/account_switcher_button.dart b/packages/neon_framework/lib/src/widgets/account_switcher_button.dart index a6807a1d7dc..0e791e3d26e 100644 --- a/packages/neon_framework/lib/src/widgets/account_switcher_button.dart +++ b/packages/neon_framework/lib/src/widgets/account_switcher_button.dart @@ -42,16 +42,9 @@ class AccountSwitcherButton extends StatelessWidget { } @override - Widget build(BuildContext context) { - final accountsBloc = NeonProvider.of(context); - final account = accountsBloc.activeAccount.value!; - - return IconButton( - onPressed: () async => _onPressed(context), - tooltip: NeonLocalizations.of(context).settingsAccount, - icon: NeonUserAvatar( - account: account, - ), - ); - } + Widget build(BuildContext context) => IconButton( + onPressed: () async => _onPressed(context), + tooltip: NeonLocalizations.of(context).settingsAccount, + icon: const NeonUserAvatar(), + ); } diff --git a/packages/neon_framework/lib/src/widgets/account_tile.dart b/packages/neon_framework/lib/src/widgets/account_tile.dart index fcad5fee1da..b2b6122f500 100644 --- a/packages/neon_framework/lib/src/widgets/account_tile.dart +++ b/packages/neon_framework/lib/src/widgets/account_tile.dart @@ -47,7 +47,7 @@ class NeonAccountTile extends StatelessWidget { return AdaptiveListTile( onTap: onTap, - leading: NeonUserAvatar( + leading: NeonUserAvatar.withAccount( account: account, showStatus: showStatus, ), diff --git a/packages/neon_framework/lib/src/widgets/user_avatar.dart b/packages/neon_framework/lib/src/widgets/user_avatar.dart index 90beb246b7b..10773268284 100644 --- a/packages/neon_framework/lib/src/widgets/user_avatar.dart +++ b/packages/neon_framework/lib/src/widgets/user_avatar.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:neon_framework/src/bloc/result.dart'; -import 'package:neon_framework/src/blocs/accounts.dart'; +import 'package:neon_framework/blocs.dart'; +import 'package:neon_framework/models.dart'; import 'package:neon_framework/src/models/account.dart'; import 'package:neon_framework/src/theme/sizes.dart'; import 'package:neon_framework/src/utils/provider.dart'; @@ -12,21 +12,35 @@ import 'package:nextcloud/user_status.dart' as user_status; /// A circle that contains the user profile image and status. class NeonUserAvatar extends StatefulWidget { /// Creates a new Neon user avatar. - NeonUserAvatar({ - required this.account, - String? username, + const NeonUserAvatar({ + this.username, this.showStatus = true, this.size, this.backgroundColor, this.foregroundColor, super.key, - }) : username = username ?? account.username; + }) : account = null; + + /// Creates a new Neon user avatar with the given [account]. + const NeonUserAvatar.withAccount({ + required Account this.account, + this.username, + this.showStatus = true, + this.size, + this.backgroundColor, + this.foregroundColor, + super.key, + }); /// The account used to fetch the image. - final Account account; + /// + /// Defaults to the currently active account in [AccountsBloc.activeAccount]. + final Account? account; - /// The user profile to display - final String username; + /// The user profile to display. + /// + /// Defaults to the username of [account]. + final String? username; /// Whether to show the status. final bool showStatus; @@ -46,15 +60,21 @@ class NeonUserAvatar extends StatefulWidget { } class _UserAvatarState extends State { - late final _userStatusBloc = NeonProvider.of(context).getUserStatusBlocFor(widget.account); + late Account account; + late String username; + UserStatusBloc? userStatusBloc; late double size; @override void initState() { super.initState(); + final accountsBloc = NeonProvider.of(context); + account = widget.account ?? accountsBloc.activeAccount.value!; + username = widget.username ?? account.username; + if (widget.showStatus) { - _userStatusBloc.load(widget.username); + userStatusBloc = accountsBloc.getUserStatusBlocFor(account)..load(username); } } @@ -70,17 +90,17 @@ class _UserAvatarState extends State { backgroundColor: widget.backgroundColor, child: ClipOval( child: NeonApiImage.withAccount( - account: widget.account, - cacheKey: 'avatar-${widget.username}-$brightness$pixelSize', + account: account, + cacheKey: 'avatar-$username-$brightness-$pixelSize', etag: null, expires: null, getImage: (client) => switch (brightness) { Brightness.dark => client.core.avatar.getAvatarDarkRaw( - userId: widget.username, + userId: username, size: pixelSize, ), Brightness.light => client.core.avatar.getAvatarRaw( - userId: widget.username, + userId: username, size: pixelSize, ), }, @@ -96,8 +116,8 @@ class _UserAvatarState extends State { children: [ avatar, ResultBuilder( - stream: _userStatusBloc.statuses.map( - (statuses) => statuses[widget.username] ?? Result.loading(), + stream: userStatusBloc!.statuses.map( + (statuses) => statuses[username] ?? Result.loading(), ), builder: _userStatusIconBuilder, ),