You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							103 lines
						
					
					
						
							3.6 KiB
						
					
					
				
			
		
		
	
	
							103 lines
						
					
					
						
							3.6 KiB
						
					
					
				| part of '../neon.dart'; | |
|  | |
| const kAvatarSize = 40.0; | |
|  | |
| class AccountAvatar extends StatelessWidget { | |
|   const AccountAvatar({ | |
|     required this.account, | |
|     super.key, | |
|   }); | |
|  | |
|   final Account account; | |
|  | |
|   @override | |
|   Widget build(final BuildContext context) { | |
|     final isDark = Theme.of(context).brightness == Brightness.dark; | |
|     final size = (kAvatarSize * MediaQuery.of(context).devicePixelRatio).toInt(); | |
|     return Stack( | |
|       alignment: Alignment.center, | |
|       children: [ | |
|         CircleAvatar( | |
|           radius: kAvatarSize / 2, | |
|           child: ClipOval( | |
|             child: CachedAPIImage( | |
|               account: account, | |
|               cacheKey: 'avatar-${account.id}-${isDark ? 'dark' : 'light'}$size', | |
|               download: () async { | |
|                 if (isDark) { | |
|                   return account.client.core.getDarkAvatar( | |
|                     userId: account.username, | |
|                     size: size, | |
|                   ); | |
|                 } else { | |
|                   return account.client.core.getAvatar( | |
|                     userId: account.username, | |
|                     size: size, | |
|                   ); | |
|                 } | |
|               }, | |
|             ), | |
|           ), | |
|         ), | |
|         ResultBuilder<UserStatusBloc, NextcloudUserStatusStatus?>( | |
|           stream: Provider.of<AccountsBloc>(context, listen: false).getUserStatusBloc(account).userStatus, | |
|           builder: (final context, final userStatus) { | |
|             final hasEmoji = userStatus.data?.icon != null; | |
|             final factor = hasEmoji ? 2 : 3; | |
|             return SizedBox( | |
|               height: kAvatarSize, | |
|               width: kAvatarSize, | |
|               child: Align( | |
|                 alignment: Alignment.bottomRight, | |
|                 child: Container( | |
|                   height: kAvatarSize / factor, | |
|                   width: kAvatarSize / factor, | |
|                   decoration: userStatus.loading || userStatus.error != null || userStatus.data == null || hasEmoji | |
|                       ? null | |
|                       : BoxDecoration( | |
|                           shape: BoxShape.circle, | |
|                           color: _userStatusToColor(userStatus.data!), | |
|                         ), | |
|                   child: userStatus.loading | |
|                       ? CircularProgressIndicator( | |
|                           strokeWidth: 1.5, | |
|                           color: Theme.of(context).colorScheme.onPrimary, | |
|                         ) | |
|                       : userStatus.error != null && | |
|                               (userStatus.error is! NextcloudApiException || | |
|                                   (userStatus.error! as NextcloudApiException).statusCode != 404) | |
|                           ? Icon( | |
|                               Icons.error_outline, | |
|                               size: kAvatarSize / factor, | |
|                               color: Colors.red, | |
|                             ) | |
|                           : hasEmoji | |
|                               ? Text( | |
|                                   userStatus.data!.icon!, | |
|                                   style: const TextStyle( | |
|                                     fontSize: 16, | |
|                                   ), | |
|                                 ) | |
|                               : null, | |
|                 ), | |
|               ), | |
|             ); | |
|           }, | |
|         ), | |
|       ], | |
|     ); | |
|   } | |
|  | |
|   Color _userStatusToColor(final NextcloudUserStatusStatus userStatus) { | |
|     switch (userStatus.status) { | |
|       case NextcloudUserStatusType.online: | |
|         return const Color(0xFF49B382); | |
|       case NextcloudUserStatusType.away: | |
|         return const Color(0xFFF4A331); | |
|       case NextcloudUserStatusType.dnd: | |
|         return const Color(0xFFED484C); | |
|       default: | |
|         return Colors.transparent; | |
|     } | |
|   } | |
| }
 | |
| 
 |