Сake pay filter white screen bug (#491)

* increase touch area for filter button * rework card list view model * fix button color * fix formating

Serhii committed Sep 2, 2022 at 18:04 UTC 424cf25052f4f3a826140f3a82da6ff15c40d0f2
5 files changed +87 -119
lib/di.dart
-4
@@ -2,7 +2,6 @@ import 'package:cake_wallet/core/yat_service.dart';
2 import 'package:cake_wallet/entities/parse_address_from_domain.dart';
3 import 'package:cake_wallet/entities/wake_lock.dart';
4 import 'package:cake_wallet/ionia/ionia_anypay.dart';
5 -import 'package:cake_wallet/ionia/ionia_category.dart';
5 import 'package:cake_wallet/ionia/ionia_gift_card.dart';
6 import 'package:cake_wallet/ionia/ionia_tip.dart';
7 import 'package:cake_wallet/src/screens/ionia/cards/ionia_custom_redeem_page.dart';
@@ -12,7 +11,6 @@ import 'package:cake_wallet/view_model/ionia/ionia_auth_view_model.dart';
11 import 'package:cake_wallet/view_model/ionia/ionia_buy_card_view_model.dart';
12 import 'package:cake_wallet/view_model/ionia/ionia_custom_tip_view_model.dart';
13 import 'package:cake_wallet/view_model/ionia/ionia_custom_redeem_view_model.dart';
15 -import 'package:cake_wallet/view_model/ionia/ionia_filter_view_model.dart';
14 import 'package:cake_wallet/ionia/ionia_service.dart';
15 import 'package:cake_wallet/ionia/ionia_api.dart';
16 import 'package:cake_wallet/ionia/ionia_merchant.dart';
@@ -686,8 +684,6 @@ Future setup(
684 getIt.get<IoniaService>(),
685 getIt.get<AnyPayApi>(),
686 getIt.get<AppStore>().wallet));
689 -
690 - getIt.registerFactory<IoniaFilterViewModel>(() => IoniaFilterViewModel());
687
688 getIt.registerFactory(() => IoniaGiftCardsListViewModel(ioniaService: getIt.get<IoniaService>()));
689
lib/src/screens/ionia/cards/ionia_manage_cards_page.dart
+26 -29
@@ -1,5 +1,3 @@
1 -import 'package:cake_wallet/di.dart';
2 -import 'package:cake_wallet/ionia/ionia_category.dart';
1 import 'package:cake_wallet/ionia/ionia_create_state.dart';
2 import 'package:cake_wallet/ionia/ionia_merchant.dart';
3 import 'package:cake_wallet/routes.dart';
@@ -13,7 +11,6 @@ import 'package:cake_wallet/utils/debounce.dart';
11 import 'package:cake_wallet/typography.dart';
12 import 'package:cake_wallet/utils/show_pop_up.dart';
13 import 'package:cake_wallet/view_model/ionia/ionia_gift_cards_list_view_model.dart';
16 -import 'package:cake_wallet/view_model/ionia/ionia_filter_view_model.dart';
14 import 'package:flutter/cupertino.dart';
15 import 'package:flutter/material.dart';
16 import 'package:cake_wallet/generated/i18n.dart';
@@ -28,6 +25,9 @@ class IoniaManageCardsPage extends BasePage {
25 });
26 }
27 });
28 +
29 + _cardsListViewModel.getMerchants();
30 +
31 }
32 final IoniaGiftCardsListViewModel _cardsListViewModel;
33
@@ -108,15 +108,27 @@ class IoniaManageCardsPage extends BasePage {
108
109 @override
110 Widget body(BuildContext context) {
111 - final filterIcon = InkWell(
111 + final filterButton = InkWell(
112 onTap: () async {
113 - final selectedFilters = await showCategoryFilter(context, _cardsListViewModel);
114 - _cardsListViewModel.setSelectedFilter(selectedFilters);
113 + await showCategoryFilter(context);
114 + _cardsListViewModel.getMerchants();
115 },
116 - child: Image.asset(
117 - 'assets/images/filter.png',
118 - color: Theme.of(context).textTheme.caption.decorationColor,
119 - ));
116 + child: Container(
117 + width: 32,
118 + padding: EdgeInsets.all(8),
119 + decoration: BoxDecoration(
120 + color: Colors.white.withOpacity(0.15),
121 + border: Border.all(
122 + color: Colors.white.withOpacity(0.2),
123 + ),
124 + borderRadius: BorderRadius.circular(10),
125 + ),
126 + child: Image.asset(
127 + 'assets/images/filter.png',
128 + color: Theme.of(context).textTheme.caption.decorationColor,
129 + ),
130 + )
131 + );
132
133 return Padding(
134 padding: const EdgeInsets.all(14.0),
@@ -132,18 +144,7 @@ class IoniaManageCardsPage extends BasePage {
144 controller: _searchController,
145 )),
146 SizedBox(width: 10),
135 - Container(
136 - width: 32,
137 - padding: EdgeInsets.all(8),
138 - decoration: BoxDecoration(
139 - color: Theme.of(context).textTheme.title.backgroundColor,
140 - border: Border.all(
141 - color: Colors.white.withOpacity(0.2),
142 - ),
143 - borderRadius: BorderRadius.circular(10),
144 - ),
145 - child: filterIcon,
146 - )
147 + filterButton
148 ],
149 ),
150 ),
@@ -158,16 +159,12 @@ class IoniaManageCardsPage extends BasePage {
159 );
160 }
161
161 - Future<List<IoniaCategory>> showCategoryFilter(
162 - BuildContext context,
163 - IoniaGiftCardsListViewModel viewModel,
164 - ) async {
165 - return await showPopUp<List<IoniaCategory>>(
162 + Future <void> showCategoryFilter(BuildContext context) async {
163 + return showPopUp<void>(
164 context: context,
165 builder: (BuildContext context) {
166 return IoniaFilterModal(
169 - filterViewModel: getIt.get<IoniaFilterViewModel>(),
170 - selectedCategories: viewModel.selectedFilters,
167 + ioniaGiftCardsListViewModel: _cardsListViewModel,
168 );
169 },
170 );
lib/src/screens/ionia/widgets/ionia_filter_modal.dart
+13 -17
@@ -1,22 +1,18 @@
1 -import 'package:cake_wallet/ionia/ionia_category.dart';
1 import 'package:cake_wallet/src/screens/ionia/widgets/rounded_checkbox.dart';
3 -import 'package:cake_wallet/view_model/ionia/ionia_filter_view_model.dart';
2 import 'package:cake_wallet/src/widgets/alert_background.dart';
3 import 'package:cake_wallet/typography.dart';
4 import 'package:cake_wallet/generated/i18n.dart';
5 +import 'package:cake_wallet/view_model/ionia/ionia_gift_cards_list_view_model.dart';
6 import 'package:flutter/material.dart';
7 import 'package:flutter_mobx/flutter_mobx.dart';
8 +import 'package:cake_wallet/palette.dart';
9
10 class IoniaFilterModal extends StatelessWidget {
11 - IoniaFilterModal({
12 - @required this.filterViewModel,
13 - @required this.selectedCategories,
14 - }) {
15 - filterViewModel.setSelectedCategories(this.selectedCategories);
11 + IoniaFilterModal({@required this.ioniaGiftCardsListViewModel}){
12 + ioniaGiftCardsListViewModel.resetIoniaCategories();
13 }
14
18 - final IoniaFilterViewModel filterViewModel;
19 - final List<IoniaCategory> selectedCategories;
15 + final IoniaGiftCardsListViewModel ioniaGiftCardsListViewModel;
16
17 @override
18 Widget build(BuildContext context) {
@@ -48,7 +44,7 @@ class IoniaFilterModal extends StatelessWidget {
44 child: Padding(
45 padding: const EdgeInsets.only(left: 24, right: 24),
46 child: TextField(
51 - onChanged: filterViewModel.onSearchFilter,
47 + onChanged: ioniaGiftCardsListViewModel.onSearchFilter,
48 style: textMedium(
49 color: Theme.of(context).primaryTextTheme.title.color,
50 ),
@@ -73,13 +69,13 @@ class IoniaFilterModal extends StatelessWidget {
69 return ListView.builder(
70 padding: EdgeInsets.zero,
71 shrinkWrap: true,
76 - itemCount: filterViewModel.ioniaCategories.length,
72 + itemCount: ioniaGiftCardsListViewModel.ioniaCategories.length,
73 itemBuilder: (_, index) {
78 - final category = filterViewModel.ioniaCategories[index];
74 + final category = ioniaGiftCardsListViewModel.ioniaCategories[index];
75 return Padding(
76 padding: const EdgeInsets.only(left: 24, right: 24, bottom: 24),
77 child: InkWell(
82 - onTap: () => filterViewModel.selectFilter(category),
78 + onTap: () => ioniaGiftCardsListViewModel.setSelectedFilter(category),
79 child: Row(
80 mainAxisAlignment: MainAxisAlignment.spaceBetween,
81 children: [
@@ -98,9 +94,9 @@ class IoniaFilterModal extends StatelessWidget {
94 ],
95 ),
96 Observer(builder: (_) {
101 - final value = filterViewModel.selectedIndices;
97 + final value = ioniaGiftCardsListViewModel.selectedIndices;
98 return RoundedCheckbox(
103 - value: value.contains(category.index),
99 + value: value.contains(category),
100 );
101 }),
102 ],
@@ -114,13 +110,13 @@ class IoniaFilterModal extends StatelessWidget {
110 ),
111 ),
112 InkWell(
117 - onTap: () => Navigator.pop(context, filterViewModel.selectedCategories),
113 + onTap: () => Navigator.pop(context),
114 child: Container(
115 margin: EdgeInsets.only(bottom: 40),
116 child: CircleAvatar(
117 child: Icon(
118 Icons.close,
123 - color: Colors.black,
119 + color: Palette.darkBlueCraiola,
120 ),
121 backgroundColor: Colors.white,
122 ),
lib/view_model/ionia/ionia_filter_view_model.dart deleted
-58
@@ -1,58 +0,0 @@
1 -import 'package:cake_wallet/ionia/ionia_category.dart';
2 -import 'package:mobx/mobx.dart';
3 -
4 -part 'ionia_filter_view_model.g.dart';
5 -
6 -class IoniaFilterViewModel = IoniaFilterViewModelBase with _$IoniaFilterViewModel;
7 -
8 -abstract class IoniaFilterViewModelBase with Store {
9 - IoniaFilterViewModelBase() {
10 - selectedIndices = ObservableList<int>();
11 - ioniaCategories = IoniaCategory.allCategories;
12 - }
13 -
14 - List<IoniaCategory> get selectedCategories => ioniaCategories.where(_isSelected).toList();
15 -
16 - @observable
17 - ObservableList<int> selectedIndices;
18 -
19 - @observable
20 - List<IoniaCategory> ioniaCategories;
21 -
22 - @action
23 - void selectFilter(IoniaCategory ioniaCategory) {
24 - if (ioniaCategory == IoniaCategory.all && !selectedIndices.contains(0)) {
25 - selectedIndices.clear();
26 - selectedIndices.add(0);
27 - return;
28 - }
29 - if (selectedIndices.contains(ioniaCategory.index) && ioniaCategory.index != 0) {
30 - selectedIndices.remove(ioniaCategory.index);
31 - return;
32 - }
33 - selectedIndices.add(ioniaCategory.index);
34 - selectedIndices.remove(0);
35 - }
36 -
37 - @action
38 - void onSearchFilter(String text) {
39 - if (text.isEmpty) {
40 - ioniaCategories = IoniaCategory.allCategories;
41 - } else {
42 - ioniaCategories = IoniaCategory.allCategories
43 - .where(
44 - (e) => e.title.toLowerCase().contains(text.toLowerCase()),
45 - )
46 - .toList();
47 - }
48 - }
49 -
50 - @action
51 - void setSelectedCategories(List<IoniaCategory> selectedCategories) {
52 - selectedIndices = ObservableList.of(selectedCategories.map((e) => e.index));
53 - }
54 -
55 - bool _isSelected(IoniaCategory ioniaCategory) {
56 - return selectedIndices.contains(ioniaCategory.index);
57 - }
58 -}
lib/view_model/ionia/ionia_gift_cards_list_view_model.dart
+48 -11
@@ -12,14 +12,13 @@ class IoniaGiftCardsListViewModel = IoniaGiftCardsListViewModelBase with _$Ionia
12 abstract class IoniaGiftCardsListViewModelBase with Store {
13 IoniaGiftCardsListViewModelBase({
14 @required this.ioniaService,
15 - }) :
15 + }) :
16 cardState = IoniaNoCardState(),
17 ioniaMerchants = [],
18 + ioniaCategories = IoniaCategory.allCategories,
19 + selectedIndices = ObservableList<IoniaCategory>.of([IoniaCategory.all]),
20 scrollOffsetFromTop = 0.0 {
19 - selectedFilters = [];
21 _getAuthStatus().then((value) => isLoggedIn = value);
21 -
22 - _getMerchants();
22 }
23
24 final IoniaService ioniaService;
@@ -28,8 +27,6 @@ abstract class IoniaGiftCardsListViewModelBase with Store {
27
28 String searchString;
29
31 - List<IoniaCategory> selectedFilters;
32 -
30 @observable
31 double scrollOffsetFromTop;
32
@@ -48,6 +45,12 @@ abstract class IoniaGiftCardsListViewModelBase with Store {
45 @observable
46 bool isLoggedIn;
47
48 + @observable
49 + List<IoniaCategory> ioniaCategories;
50 +
51 + @observable
52 + ObservableList<IoniaCategory> selectedIndices;
53 +
54 Future<bool> _getAuthStatus() async {
55 return await ioniaService.isLogined();
56 }
@@ -88,9 +91,10 @@ abstract class IoniaGiftCardsListViewModelBase with Store {
91 }
92 }
93
91 - void _getMerchants() {
94 +
95 + void getMerchants() {
96 merchantState = IoniaLoadingMerchantState();
93 - ioniaService.getMerchantsByFilter(categories: selectedFilters).then((value) {
97 + ioniaService.getMerchantsByFilter(categories: selectedIndices).then((value) {
98 value.sort((a, b) => a.legalName.toLowerCase().compareTo(b.legalName.toLowerCase()));
99 ioniaMerchants = ioniaMerchantList = value;
100 merchantState = IoniaLoadedMerchantState();
@@ -99,9 +103,42 @@ abstract class IoniaGiftCardsListViewModelBase with Store {
103 }
104
105 @action
102 - void setSelectedFilter(List<IoniaCategory> filters) {
103 - selectedFilters = filters;
104 - _getMerchants();
106 + void setSelectedFilter(IoniaCategory category) {
107 + if (category == IoniaCategory.all) {
108 + selectedIndices.clear();
109 + selectedIndices.add(category);
110 + return;
111 + }
112 +
113 + if (category != IoniaCategory.all) {
114 + selectedIndices.remove(IoniaCategory.all);
115 + }
116 +
117 + if (selectedIndices.contains(category)) {
118 + selectedIndices.remove(category);
119 +
120 + if (selectedIndices.isEmpty) {
121 + selectedIndices.add(IoniaCategory.all);
122 + }
123 + return;
124 + }
125 + selectedIndices.add(category);
126 + }
127 +
128 + @action
129 + void onSearchFilter(String text) {
130 + if (text.isEmpty) {
131 + ioniaCategories = IoniaCategory.allCategories;
132 + } else {
133 + ioniaCategories = IoniaCategory.allCategories
134 + .where((e) => e.title.toLowerCase().contains(text.toLowerCase()),)
135 + .toList();
136 + }
137 + }
138 +
139 + @action
140 + void resetIoniaCategories() {
141 + ioniaCategories = IoniaCategory.allCategories;
142 }
143
144 void setScrollOffsetFromTop(double scrollOffset) {