С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) {