Fix ionia loading states (#493)
Godwin Asuquo committed
Sep 1, 2022 at 19:14 UTC
a745319ffa6e2559614cc0c4003b04c7f4282ab0
5 files changed
+47
-5
lib/ionia/ionia_create_state.dart
+8
@@ -56,3 +56,11 @@ class IoniaCardSuccess extends IoniaFetchCardState {
56
57
final IoniaVirtualCard card;
58
}
59
+
60
+abstract class IoniaMerchantState {}
61
+
62
+class IoniaLoadingMerchantState extends IoniaMerchantState {}
63
+
64
+class IoniaLoadedMerchantState extends IoniaMerchantState {}
65
+
66
+
lib/src/screens/ionia/cards/ionia_account_cards_page.dart
+13
-2
@@ -1,7 +1,6 @@
1
-import 'dart:ffi';
1
2
+import 'package:cake_wallet/ionia/ionia_create_state.dart';
3
import 'package:cake_wallet/ionia/ionia_gift_card.dart';
4
-import 'package:cake_wallet/ionia/ionia_merchant.dart';
4
import 'package:cake_wallet/routes.dart';
5
import 'package:cake_wallet/src/screens/base_page.dart';
6
import 'package:cake_wallet/src/screens/ionia/widgets/card_item.dart';
@@ -106,6 +105,7 @@ class _IoniaCardTabsState extends State<_IoniaCardTabs> with SingleTickerProvide
105
_IoniaCardListView(
106
emptyText: S.of(context).gift_card_balance_note,
107
merchList: viewModel.activeMechs,
108
+ isLoading: viewModel.merchantState is IoniaLoadingMerchantState,
109
onTap: (giftCard) {
110
Navigator.pushNamed(
111
context,
@@ -116,6 +116,7 @@ class _IoniaCardTabsState extends State<_IoniaCardTabs> with SingleTickerProvide
116
_IoniaCardListView(
117
emptyText: S.of(context).gift_card_redeemed_note,
118
merchList: viewModel.redeemedMerchs,
119
+ isLoading: viewModel.merchantState is IoniaLoadingMerchantState,
120
onTap: (giftCard) {
121
Navigator.pushNamed(
122
context,
@@ -139,14 +140,24 @@ class _IoniaCardListView extends StatelessWidget {
140
@required this.emptyText,
141
@required this.merchList,
142
@required this.onTap,
143
+ this.isLoading = false,
144
}) : super(key: key);
145
146
final String emptyText;
147
final List<IoniaGiftCard> merchList;
148
final void Function(IoniaGiftCard giftCard) onTap;
149
+ final bool isLoading;
150
151
@override
152
Widget build(BuildContext context) {
153
+ if(isLoading){
154
+ return Center(
155
+ child: CircularProgressIndicator(
156
+ backgroundColor: Theme.of(context).accentTextTheme.display3.backgroundColor,
157
+ valueColor: AlwaysStoppedAnimation<Color>(Theme.of(context).primaryTextTheme.body1.color),
158
+ ),
159
+ );
160
+ }
161
return merchList.isEmpty
162
? Center(
163
child: Text(
lib/src/screens/ionia/cards/ionia_manage_cards_page.dart
+14
-2
@@ -1,5 +1,6 @@
1
import 'package:cake_wallet/di.dart';
2
import 'package:cake_wallet/ionia/ionia_category.dart';
3
+import 'package:cake_wallet/ionia/ionia_create_state.dart';
4
import 'package:cake_wallet/ionia/ionia_merchant.dart';
5
import 'package:cake_wallet/routes.dart';
6
import 'package:cake_wallet/src/screens/base_page.dart';
@@ -208,7 +209,10 @@ class _IoniaManageCardsPageBodyState extends State<IoniaManageCardsPageBody> {
209
@override
210
Widget build(BuildContext context) {
211
return Observer(
211
- builder: (_) => Stack(children: [
212
+ builder: (_) {
213
+ final merchantState = widget.cardsListViewModel.merchantState;
214
+ if (merchantState is IoniaLoadedMerchantState) {
215
+ return Stack(children: [
216
ListView.separated(
217
padding: EdgeInsets.only(left: 2, right: 22),
218
controller: _scrollController,
@@ -241,7 +245,15 @@ class _IoniaManageCardsPageBodyState extends State<IoniaManageCardsPageBody> {
245
fromTop: widget.cardsListViewModel.scrollOffsetFromTop,
246
)
247
: Offstage()
244
- ]),
248
+ ]);
249
+ }
250
+ return Center(
251
+ child: CircularProgressIndicator(
252
+ backgroundColor: Theme.of(context).accentTextTheme.display3.backgroundColor,
253
+ valueColor: AlwaysStoppedAnimation<Color>(Theme.of(context).primaryTextTheme.body1.color),
254
+ ),
255
+ );
256
+ }
257
);
258
}
259
}
lib/view_model/ionia/ionia_account_view_model.dart
+6
-1
@@ -1,4 +1,4 @@
1
-import 'package:cake_wallet/ionia/ionia_merchant.dart';
1
+import 'package:cake_wallet/ionia/ionia_create_state.dart';
2
import 'package:cake_wallet/ionia/ionia_service.dart';
3
import 'package:mobx/mobx.dart';
4
import 'package:cake_wallet/ionia/ionia_gift_card.dart';
@@ -23,6 +23,9 @@ abstract class IoniaAccountViewModelBase with Store {
23
@observable
24
List<IoniaGiftCard> giftCards;
25
26
+ @observable
27
+ IoniaMerchantState merchantState;
28
+
29
@computed
30
int get countOfMerch => giftCards.where((giftCard) => !giftCard.isEmpty).length;
31
@@ -39,6 +42,8 @@ abstract class IoniaAccountViewModelBase with Store {
42
43
@action
44
Future<void> updateUserGiftCards() async {
45
+ merchantState = IoniaLoadingMerchantState();
46
giftCards = await ioniaService.getCurrentUserGiftCardSummaries();
47
+ merchantState = IoniaLoadedMerchantState();
48
}
49
}
lib/view_model/ionia/ionia_gift_cards_list_view_model.dart
+6
@@ -39,6 +39,9 @@ abstract class IoniaGiftCardsListViewModelBase with Store {
39
@observable
40
IoniaFetchCardState cardState;
41
42
+ @observable
43
+ IoniaMerchantState merchantState;
44
+
45
@observable
46
List<IoniaMerchant> ioniaMerchants;
47
@@ -86,10 +89,13 @@ abstract class IoniaGiftCardsListViewModelBase with Store {
89
}
90
91
void _getMerchants() {
92
+ merchantState = IoniaLoadingMerchantState();
93
ioniaService.getMerchantsByFilter(categories: selectedFilters).then((value) {
94
value.sort((a, b) => a.legalName.toLowerCase().compareTo(b.legalName.toLowerCase()));
95
ioniaMerchants = ioniaMerchantList = value;
96
+ merchantState = IoniaLoadedMerchantState();
97
});
98
+
99
}
100
101
@action