Skip to content

Commit

Permalink
Merge pull request #1668 from nextcloud/refactor/neon_framework/user-…
Browse files Browse the repository at this point in the history
…avatar-without-explicit-account
  • Loading branch information
provokateurin authored Feb 28, 2024
2 parents 974f564 + 32b1f4d commit bfe1bc7
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 37 deletions.
8 changes: 1 addition & 7 deletions packages/neon/neon_talk/lib/src/widgets/room_avatar.dart
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -20,15 +18,12 @@ class TalkRoomAvatar extends StatelessWidget {

@override
Widget build(BuildContext context) {
final account = NeonProvider.of<AccountsBloc>(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),
Expand All @@ -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),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,16 +42,9 @@ class AccountSwitcherButton extends StatelessWidget {
}

@override
Widget build(BuildContext context) {
final accountsBloc = NeonProvider.of<AccountsBloc>(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(),
);
}
2 changes: 1 addition & 1 deletion packages/neon_framework/lib/src/widgets/account_tile.dart
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ class NeonAccountTile extends StatelessWidget {

return AdaptiveListTile(
onTap: onTap,
leading: NeonUserAvatar(
leading: NeonUserAvatar.withAccount(
account: account,
showStatus: showStatus,
),
Expand Down
54 changes: 37 additions & 17 deletions packages/neon_framework/lib/src/widgets/user_avatar.dart
Original file line number Diff line number Diff line change
@@ -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';
Expand All @@ -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;
Expand All @@ -46,15 +60,21 @@ class NeonUserAvatar extends StatefulWidget {
}

class _UserAvatarState extends State<NeonUserAvatar> {
late final _userStatusBloc = NeonProvider.of<AccountsBloc>(context).getUserStatusBlocFor(widget.account);
late Account account;
late String username;
UserStatusBloc? userStatusBloc;
late double size;

@override
void initState() {
super.initState();

final accountsBloc = NeonProvider.of<AccountsBloc>(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);
}
}

Expand All @@ -70,17 +90,17 @@ class _UserAvatarState extends State<NeonUserAvatar> {
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,
),
},
Expand All @@ -96,8 +116,8 @@ class _UserAvatarState extends State<NeonUserAvatar> {
children: [
avatar,
ResultBuilder(
stream: _userStatusBloc.statuses.map(
(statuses) => statuses[widget.username] ?? Result<user_status.$PublicInterface>.loading(),
stream: userStatusBloc!.statuses.map(
(statuses) => statuses[username] ?? Result<user_status.$PublicInterface>.loading(),
),
builder: _userStatusIconBuilder,
),
Expand Down

0 comments on commit bfe1bc7

Please sign in to comment.