ledger top up functionality and few small fixes for project architechture and design

This commit is contained in:
Arseni
2026-03-05 21:49:23 +03:00
parent 39c04beb21
commit 97b16542c2
41 changed files with 764 additions and 455 deletions

View File

@@ -23,7 +23,7 @@ class RecipientAvatar extends StatelessWidget {
@override
Widget build(BuildContext context) {
final textColor = Theme.of(context).colorScheme.onPrimary;
final textColor = Theme.of(context).colorScheme.onSecondary;
return Column(
mainAxisAlignment: MainAxisAlignment.center,
@@ -31,7 +31,7 @@ class RecipientAvatar extends StatelessWidget {
CircleAvatar(
radius: avatarRadius,
backgroundImage: avatarUrl != null ? NetworkImage(avatarUrl!) : null,
backgroundColor: Theme.of(context).colorScheme.primary,
backgroundColor: Theme.of(context).colorScheme.primaryFixed,
child: avatarUrl == null
? Text(
getInitials(name),

View File

@@ -7,54 +7,56 @@ import 'package:pweb/pages/dashboard/payouts/single/address_book/avatar.dart';
class ShortListAddressBookPayout extends StatelessWidget {
final List<Recipient> recipients;
final ValueChanged<Recipient> onSelected;
final Widget? trailing;
final Widget? leading;
const ShortListAddressBookPayout({
super.key,
required this.recipients,
required this.onSelected,
this.trailing,
this.leading,
});
static const double _avatarRadius = 20;
static const double _avatarSize = 80;
static const EdgeInsets _padding = EdgeInsets.symmetric(horizontal: 10, vertical: 8);
static const EdgeInsets _padding = EdgeInsets.symmetric(
horizontal: 10,
vertical: 8,
);
static const TextStyle _nameStyle = TextStyle(fontSize: 12);
@override
Widget build(BuildContext context) {
final trailingWidget = trailing;
final leadingWidget = leading;
final recipientItems = recipients.map((recipient) {
return Padding(
padding: _padding,
child: InkWell(
borderRadius: BorderRadius.circular(5),
hoverColor: Theme.of(context).colorScheme.onTertiary,
onTap: () => onSelected(recipient),
child: SizedBox(
height: _avatarSize,
width: _avatarSize,
child: RecipientAvatar(
isVisible: true,
name: recipient.name,
avatarUrl: recipient.avatarUrl,
avatarRadius: _avatarRadius,
nameStyle: _nameStyle,
),
),
),
);
});
return SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
children:
recipients.map((recipient) {
return Padding(
padding: _padding,
child: InkWell(
borderRadius: BorderRadius.circular(5),
hoverColor: Theme.of(context).colorScheme.primaryContainer,
onTap: () => onSelected(recipient),
child: SizedBox(
height: _avatarSize,
width: _avatarSize,
child: RecipientAvatar(
isVisible: true,
name: recipient.name,
avatarUrl: recipient.avatarUrl,
avatarRadius: _avatarRadius,
nameStyle: _nameStyle,
),
),
),
);
}).toList()
..addAll(
trailingWidget == null
? const []
: [Padding(padding: _padding, child: trailingWidget)],
),
children: [
if (leadingWidget != null)
Padding(padding: _padding, child: leadingWidget),
...recipientItems,
],
),
);
}

View File

@@ -21,10 +21,7 @@ import 'package:pweb/generated/i18n/app_localizations.dart';
class AddressBookPayout extends StatefulWidget {
final ValueChanged<Recipient> onSelected;
const AddressBookPayout({
super.key,
required this.onSelected,
});
const AddressBookPayout({super.key, required this.onSelected});
@override
State<AddressBookPayout> createState() => _AddressBookPayoutState();
@@ -71,6 +68,7 @@ class _AddressBookPayoutState extends State<AddressBookPayout> {
provider.setCurrentObject(null);
context.pushNamed(PayoutRoutes.addRecipient);
}
final filteredRecipients = filterRecipients(
recipients: recipients,
query: _query,
@@ -81,16 +79,18 @@ class _AddressBookPayoutState extends State<AddressBookPayout> {
}
if (provider.error != null) {
return Center(child: Text(loc.notificationError(provider.error ?? loc.noErrorInformation)));
return Center(
child: Text(
loc.notificationError(provider.error ?? loc.noErrorInformation),
),
);
}
return SizedBox(
height: _isExpanded ? _expandedHeight : _collapsedHeight,
child: Card(
margin: const EdgeInsets.all(_cardMargin),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
elevation: 4,
color: Theme.of(context).colorScheme.onSecondary,
child: Padding(
@@ -105,27 +105,27 @@ class _AddressBookPayoutState extends State<AddressBookPayout> {
const SizedBox(height: _spacingBetween),
Expanded(
child: recipients.isEmpty
? Center(
child: AddRecipientTile(
label: loc.addRecipient,
onTap: onAddRecipient,
),
)
: _isExpanded && filteredRecipients.isEmpty
? Center(
child: AddRecipientTile(
label: loc.addRecipient,
onTap: onAddRecipient,
),
)
: _isExpanded && filteredRecipients.isEmpty
? AddressBookPlaceholder(text: loc.noRecipientsFound)
: _isExpanded
? LongListAddressBookPayout(
filteredRecipients: filteredRecipients,
onSelected: widget.onSelected,
)
: ShortListAddressBookPayout(
recipients: recipients,
onSelected: widget.onSelected,
trailing: AddRecipientTile(
label: loc.addRecipient,
onTap: onAddRecipient,
),
? LongListAddressBookPayout(
filteredRecipients: filteredRecipients,
onSelected: widget.onSelected,
)
: ShortListAddressBookPayout(
recipients: recipients,
onSelected: widget.onSelected,
leading: AddRecipientTile(
label: loc.addRecipient,
onTap: onAddRecipient,
),
),
),
],
),