Fixes for Settings Page

This commit is contained in:
Arseni
2025-12-22 21:09:58 +03:00
parent 41abf723e6
commit 47ada0691c
25 changed files with 1126 additions and 270 deletions

View File

@@ -10,24 +10,49 @@ import 'package:pweb/generated/i18n/app_localizations.dart';
class AccountAvatar extends StatelessWidget {
const AccountAvatar({super.key});
final double? size;
final bool showHeader;
final String? fallbackUrl;
final AccountProvider? provider;
const AccountAvatar({
super.key,
this.size,
this.showHeader = true,
this.fallbackUrl,
this.provider,
});
@override
Widget build(BuildContext context) {
final loc = AppLocalizations.of(context)!;
if (provider != null) {
return _buildAvatar(context, provider!);
}
return Consumer<AccountProvider>(
builder: (context, provider, _) => UserAccountsDrawerHeader(
accountName: Text(provider.account?.name ?? loc.userNamePlaceholder),
accountEmail: Text(provider.account?.login ?? loc.usernameHint),
currentAccountPicture: CircleAvatar(
backgroundImage: (provider.account?.avatarUrl?.isNotEmpty ?? false)
? CachedNetworkImageProvider(provider.account!.avatarUrl!)
: null,
child: (provider.account?.avatarUrl?.isNotEmpty ?? false)
? null
: const Icon(Icons.account_circle, size: 50),
),
),
builder: (context, provider, _) => _buildAvatar(context, provider),
);
}
Widget _buildAvatar(BuildContext context, AccountProvider provider) {
final avatarUrl = (provider.account?.avatarUrl ?? fallbackUrl)?.trim();
final hasAvatar = avatarUrl?.isNotEmpty == true;
final radius = size != null ? size! / 2 : null;
final double placeholderIconSize = size != null ? size! * 0.55 : 50;
final avatar = CircleAvatar(
radius: radius,
backgroundImage: hasAvatar ? CachedNetworkImageProvider(avatarUrl!) : null,
child: hasAvatar ? null : Icon(Icons.account_circle, size: placeholderIconSize),
);
if (!showHeader) return avatar;
final loc = AppLocalizations.of(context)!;
return UserAccountsDrawerHeader(
accountName: Text(provider.account?.describable.name ?? loc.userNamePlaceholder),
accountEmail: Text(provider.account?.login ?? loc.usernameHint),
currentAccountPicture: avatar,
);
}
}

View File

@@ -1,5 +1,9 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:pshared/provider/account.dart';
import 'package:pweb/widgets/sidebar/destinations.dart';
import 'package:pweb/widgets/sidebar/side_menu.dart';
import 'package:pweb/widgets/sidebar/user.dart';
@@ -18,7 +22,7 @@ class PayoutSidebar extends StatelessWidget {
final PayoutDestination selected;
final ValueChanged<PayoutDestination> onSelected;
final VoidCallback? onLogout;
final Future<void> Function()? onLogout;
final String? userName;
final String? avatarUrl;
@@ -27,6 +31,15 @@ class PayoutSidebar extends StatelessWidget {
@override
Widget build(BuildContext context) {
final accountName = context.select<AccountProvider, String?>(
(provider) => provider.account?.describable.name,
);
final accountAvatar = context.select<AccountProvider, String?>(
(provider) => provider.account?.avatarUrl,
);
final resolvedUserName = userName ?? accountName;
final resolvedAvatarUrl = avatarUrl ?? accountAvatar;
final menuItems = items ??
<PayoutDestination>[
PayoutDestination.dashboard,
@@ -42,16 +55,16 @@ class PayoutSidebar extends StatelessWidget {
children: [
UserProfileCard(
theme: theme,
avatarUrl: avatarUrl,
userName: userName,
avatarUrl: resolvedAvatarUrl,
userName: resolvedUserName,
selected: selected,
onSelected: onSelected
),
const SizedBox(height: 8),
SideMenuColumn(
theme: theme,
avatarUrl: avatarUrl,
userName: userName,
avatarUrl: resolvedAvatarUrl,
userName: resolvedUserName,
items: menuItems,
selected: selected,
onSelected: onSelected,