filter contacts and wallets by type

Serhii committed Nov 5, 2022 at 20:05 UTC 2cd748c151488a8378d1e28c25a98588ad163c6e
7 files changed +51 -19
lib/di.dart
+6 -3
@@ -153,6 +153,7 @@ import 'package:cake_wallet/anypay/any_pay_payment_committed_info.dart';
153 import 'package:cake_wallet/ionia/ionia_any_pay_payment_info.dart';
154 import 'package:cake_wallet/src/screens/receive/fullscreen_qr_page.dart';
155 import 'package:cake_wallet/core/wallet_loading_service.dart';
156 +import 'package:cw_core/crypto_currency.dart';
157
158 final getIt = GetIt.instance;
159
@@ -461,9 +462,11 @@ Future setup(
462 getIt.registerFactory(
463 () => ContactListViewModel(_contactSource, _walletInfoSource));
464
464 - getIt.registerFactoryParam<ContactListPage, bool, void>(
465 - (bool isEditable, _) => ContactListPage(getIt.get<ContactListViewModel>(),
466 - isEditable: isEditable));
465 + getIt.registerFactoryParam<ContactListPage, bool, CryptoCurrency?>((bool isEditable, CryptoCurrency? cur)
466 + => ContactListPage(
467 + getIt.get<ContactListViewModel>(),
468 + isEditable: isEditable,
469 + selectedCurrency: cur));
470
471 getIt.registerFactoryParam<ContactPage, ContactRecord?, void>(
472 (ContactRecord? contact, _) =>
lib/router.dart
+6 -2
@@ -74,6 +74,7 @@ import 'package:cake_wallet/src/screens/ionia/ionia.dart';
74 import 'package:cake_wallet/src/screens/ionia/cards/ionia_payment_status_page.dart';
75 import 'package:cake_wallet/anypay/any_pay_payment_committed_info.dart';
76 import 'package:cake_wallet/ionia/ionia_any_pay_payment_info.dart';
77 +import 'package:cw_core/crypto_currency.dart';
78
79 late RouteSettings currentRouteSettings;
80
@@ -298,11 +299,14 @@ Route<dynamic> createRoute(RouteSettings settings) {
299
300 case Routes.addressBook:
301 return MaterialPageRoute<void>(
301 - builder: (_) => getIt.get<ContactListPage>(param1: true));
302 + builder: (_) =>
303 + getIt.get<ContactListPage>(param1: true, param2: null));
304
305 case Routes.pickerAddressBook:
306 + final selectedCurrency = settings.arguments as CryptoCurrency;
307 return MaterialPageRoute<void>(
305 - builder: (_) => getIt.get<ContactListPage>(param1: false));
308 + builder: (_) => getIt.get<ContactListPage>(param1: false,
309 + param2: selectedCurrency));
310
311 case Routes.addressBookAddContact:
312 return CupertinoPageRoute<void>(
lib/src/screens/contact/contact_list_page.dart
+14 -11
@@ -16,10 +16,12 @@ import 'package:cake_wallet/view_model/contact_list/contact_list_view_model.dart
16 import 'package:cake_wallet/src/widgets/collapsible_standart_list.dart';
17
18 class ContactListPage extends BasePage {
19 - ContactListPage(this.contactListViewModel, {this.isEditable = true});
19 + ContactListPage(this.contactListViewModel,
20 + {this.isEditable = true, required this.selectedCurrency});
21
22 final ContactListViewModel contactListViewModel;
23 final bool isEditable;
24 + final CryptoCurrency? selectedCurrency;
25
26 @override
27 String get title => S.current.address_book;
@@ -60,11 +62,13 @@ class ContactListPage extends BasePage {
62
63 @override
64 Widget body(BuildContext context) {
65 + final contacts =
66 + contactListViewModel.getContacts(isEditable, selectedCurrency);
67 + final walletContacts =
68 + contactListViewModel.getWallets(isEditable, selectedCurrency);
69 return Container(
70 padding: EdgeInsets.only(top: 20.0, bottom: 20.0),
65 - child: Observer(
66 - builder: (_) {
67 - return CollapsibleSectionList(
71 + child: CollapsibleSectionList(
72 context: context,
73 sectionCount: 2,
74 themeColor: Theme.of(context).primaryTextTheme.headline6!.color!,
@@ -82,15 +86,15 @@ class ContactListPage extends BasePage {
86 child: Text(title, style: TextStyle(fontSize: 36)));
87 },
88 itemCounter: (int sectionIndex) => sectionIndex == 0
85 - ? contactListViewModel.walletContacts.length
86 - : contactListViewModel.contacts.length,
89 + ? walletContacts.length
90 + : contacts.length,
91 itemBuilder: (_, sectionIndex, index) {
92 if (sectionIndex == 0) {
89 - final walletInfo = contactListViewModel.walletContacts[index];
93 + final walletInfo = walletContacts[index];
94 return generateRaw(context, walletInfo);
95 }
96
93 - final contact = contactListViewModel.contacts[index];
97 + final contact = contacts[index];
98 final content = generateRaw(context, contact);
99 return !isEditable
100 ? content
@@ -100,9 +104,8 @@ class ContactListPage extends BasePage {
104 child: content,
105 );
106 },
103 - );
104 - },
105 - ));
107 + )
108 + );
109 }
110
111 Widget generateRaw(BuildContext context, ContactBase contact) {
lib/src/screens/exchange/widgets/exchange_card.dart
+2 -1
@@ -395,7 +395,8 @@ class ExchangeCardState extends State<ExchangeCard> {
395 buttonColor: widget.addressButtonsColor,
396 validator: widget.addressTextFieldValidator,
397 onPushPasteButton: widget.onPushPasteButton,
398 - onPushAddressBookButton: widget.onPushAddressBookButton
398 + onPushAddressBookButton: widget.onPushAddressBookButton,
399 + selectedCurrency: _selectedCurrency
400 ),
401
402 )
lib/src/screens/send/widgets/send_card.dart
+1
@@ -155,6 +155,7 @@ class SendCardState extends State<SendCard>
155 await output.fetchParsedAddress(context);
156 },
157 validator: validator,
158 + selectedCurrency: sendViewModel.currency,
159 );
160 }),
161 if (output.isParsedAddress) Padding(
lib/src/widgets/address_text_field.dart
+5 -2
@@ -4,6 +4,7 @@ import 'package:cake_wallet/routes.dart';
4 import 'package:cake_wallet/generated/i18n.dart';
5 import 'package:cake_wallet/entities/qr_scanner.dart';
6 import 'package:cake_wallet/entities/contact_base.dart';
7 +import 'package:cw_core/crypto_currency.dart';
8
9 enum AddressTextFieldOption { paste, qrCode, addressBook }
10
@@ -26,7 +27,8 @@ class AddressTextField extends StatelessWidget {
27 this.hintStyle,
28 this.validator,
29 this.onPushPasteButton,
29 - this.onPushAddressBookButton});
30 + this.onPushAddressBookButton,
31 + this.selectedCurrency});
32
33 static const prefixIconWidth = 34.0;
34 static const prefixIconHeight = 34.0;
@@ -47,6 +49,7 @@ class AddressTextField extends StatelessWidget {
49 final FocusNode? focusNode;
50 final Function(BuildContext context)? onPushPasteButton;
51 final Function(BuildContext context)? onPushAddressBookButton;
52 + final CryptoCurrency? selectedCurrency;
53
54 @override
55 Widget build(BuildContext context) {
@@ -207,7 +210,7 @@ class AddressTextField extends StatelessWidget {
210
211 Future<void> _presetAddressBookPicker(BuildContext context) async {
212 final contact = await Navigator.of(context, rootNavigator: true)
210 - .pushNamed(Routes.pickerAddressBook);
213 + .pushNamed(Routes.pickerAddressBook,arguments: selectedCurrency);
214
215 if (contact is ContactBase && contact.address != null) {
216 controller?.text = contact.address;
lib/view_model/contact_list/contact_list_view_model.dart
+17
@@ -7,6 +7,7 @@ import 'package:mobx/mobx.dart';
7 import 'package:cake_wallet/entities/contact_record.dart';
8 import 'package:cake_wallet/entities/contact.dart';
9 import 'package:cake_wallet/utils/mobx.dart';
10 +import 'package:cw_core/crypto_currency.dart';
11
12 part 'contact_list_view_model.g.dart';
13
@@ -44,4 +45,20 @@ abstract class ContactListViewModelBase with Store {
45 StreamSubscription<BoxEvent>? _subscription;
46
47 Future<void> delete(ContactRecord contact) async => contact.original.delete();
48 +
49 + List<ContactRecord> getContacts(bool isEditable, CryptoCurrency? cur) {
50 + if (!isEditable) {
51 + return contacts.where((element) => element.type == cur).toList();
52 + }
53 +
54 + return contacts;
55 + }
56 +
57 + List<WalletContact> getWallets(bool isEditable, CryptoCurrency? cur) {
58 + if (!isEditable) {
59 + return walletContacts.where((element) => element.type == cur).toList();
60 + }
61 +
62 + return walletContacts;
63 + }
64 }