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