diff --git a/frontend/pweb/lib/pages/address_book/page/empty.dart b/frontend/pweb/lib/pages/address_book/page/empty.dart new file mode 100644 index 0000000..2efb88d --- /dev/null +++ b/frontend/pweb/lib/pages/address_book/page/empty.dart @@ -0,0 +1,37 @@ + +import 'package:flutter/material.dart'; + + +class RecipientAddressBookEmptyState extends StatelessWidget { + final String message; + final String actionLabel; + final VoidCallback onAction; + + const RecipientAddressBookEmptyState({ + required this.message, + required this.actionLabel, + required this.onAction, + }); + + @override + Widget build(BuildContext context) { + final textTheme = Theme.of(context).textTheme; + + return Center( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon(Icons.contact_mail_outlined, size: 42), + const SizedBox(height: 12), + Text(message, style: textTheme.titleMedium), + const SizedBox(height: 12), + OutlinedButton.icon( + onPressed: onAction, + icon: const Icon(Icons.add), + label: Text(actionLabel), + ), + ], + ), + ); + } +} diff --git a/frontend/pweb/lib/pages/address_book/page/page.dart b/frontend/pweb/lib/pages/address_book/page/page.dart index e8de8a6..927a51d 100644 --- a/frontend/pweb/lib/pages/address_book/page/page.dart +++ b/frontend/pweb/lib/pages/address_book/page/page.dart @@ -5,6 +5,7 @@ import 'package:provider/provider.dart'; import 'package:pshared/models/recipient/recipient.dart'; import 'package:pshared/models/recipient/filter.dart'; import 'package:pshared/provider/recipient/provider.dart'; +import 'package:pweb/pages/address_book/page/empty.dart'; import 'package:pweb/pages/address_book/page/filter_button.dart'; import 'package:pweb/pages/address_book/page/header.dart'; @@ -72,6 +73,7 @@ class _RecipientAddressBookPageState extends State { final loc = AppLocalizations.of(context)!; final provider = context.watch(); _syncSearchField(provider); + final filteredRecipients = provider.filteredRecipients; if (provider.isLoading) { return const Center(child: CircularProgressIndicator()); @@ -124,15 +126,23 @@ class _RecipientAddressBookPageState extends State { height: RecipientAddressBookPage._expandedHeight, child: Padding( padding: const EdgeInsets.all(RecipientAddressBookPage._paddingAll), - child: RecipientAddressBookList( - filteredRecipients: provider.filteredRecipients, - onEdit: (recipient) => widget.onEditRecipient?.call(recipient), - onDelete: (recipient) => widget.onDeleteRecipient?.call(recipient), - onSelected: widget.onRecipientSelected, - ), + child: provider.recipients.isEmpty + ? RecipientAddressBookEmptyState( + message: loc.noRecipientsYet, + actionLabel: loc.addRecipient, + onAction: widget.onAddRecipient, + ) + : filteredRecipients.isEmpty + ? Center(child: Text(loc.noRecipientsFound)) + : RecipientAddressBookList( + filteredRecipients: filteredRecipients, + onEdit: (recipient) => widget.onEditRecipient?.call(recipient), + onDelete: (recipient) => widget.onDeleteRecipient?.call(recipient), + onSelected: widget.onRecipientSelected, + ), ), ), ], ); } -} +} \ No newline at end of file diff --git a/frontend/pweb/lib/pages/dashboard/payouts/single/adress_book/placeholder.dart b/frontend/pweb/lib/pages/dashboard/payouts/single/adress_book/placeholder.dart new file mode 100644 index 0000000..821e7c2 --- /dev/null +++ b/frontend/pweb/lib/pages/dashboard/payouts/single/adress_book/placeholder.dart @@ -0,0 +1,18 @@ + +import 'package:flutter/material.dart'; + + +class AddressBookPlaceholder extends StatelessWidget { + final String text; + + const AddressBookPlaceholder({required this.text}); + + @override + Widget build(BuildContext context) => Center( + child: Text( + text, + style: Theme.of(context).textTheme.titleMedium, + textAlign: TextAlign.center, + ), + ); +} \ No newline at end of file diff --git a/frontend/pweb/lib/pages/dashboard/payouts/single/adress_book/widget.dart b/frontend/pweb/lib/pages/dashboard/payouts/single/adress_book/widget.dart index 92e6911..905d94c 100644 --- a/frontend/pweb/lib/pages/dashboard/payouts/single/adress_book/widget.dart +++ b/frontend/pweb/lib/pages/dashboard/payouts/single/adress_book/widget.dart @@ -7,6 +7,7 @@ import 'package:pshared/provider/recipient/provider.dart'; import 'package:pweb/pages/address_book/page/search.dart'; import 'package:pweb/pages/dashboard/payouts/single/adress_book/long_list/widget.dart'; +import 'package:pweb/pages/dashboard/payouts/single/adress_book/placeholder.dart'; import 'package:pweb/pages/dashboard/payouts/single/adress_book/short_list.dart'; import 'package:pweb/generated/i18n/app_localizations.dart'; @@ -58,6 +59,8 @@ class _AdressBookPayoutState extends State { Widget build(BuildContext context) { final loc = AppLocalizations.of(context)!; final provider = context.watch(); + final recipients = provider.recipients; + final filteredRecipients = provider.filteredRecipients; if (provider.isLoading) { return const Center(child: CircularProgressIndicator()); @@ -87,15 +90,19 @@ class _AdressBookPayoutState extends State { ), const SizedBox(height: _spacingBetween), Expanded( - child: _isExpanded - ? LongListAdressBookPayout( - filteredRecipients: provider.filteredRecipients, - onSelected: widget.onSelected, - ) - : ShortListAdressBookPayout( - recipients: provider.recipients, - onSelected: widget.onSelected, - ), + child: recipients.isEmpty + ? AddressBookPlaceholder(text: loc.noRecipientsYet) + : _isExpanded && filteredRecipients.isEmpty + ? AddressBookPlaceholder(text: loc.noRecipientsFound) + : _isExpanded + ? LongListAdressBookPayout( + filteredRecipients: filteredRecipients, + onSelected: widget.onSelected, + ) + : ShortListAdressBookPayout( + recipients: recipients, + onSelected: widget.onSelected, + ), ), ], ), @@ -103,4 +110,4 @@ class _AdressBookPayoutState extends State { ), ); } -} +} \ No newline at end of file