Сake pay filter white screen bug (#491)

* increase touch area for filter button

* rework card list view model

* fix button color

* fix formating
This commit is contained in:
Serhii 2022-09-02 18:04:19 +03:00 committed by GitHub
parent 278695005c
commit 424cf25052
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 87 additions and 119 deletions

View file

@ -2,7 +2,6 @@ import 'package:cake_wallet/core/yat_service.dart';
import 'package:cake_wallet/entities/parse_address_from_domain.dart'; import 'package:cake_wallet/entities/parse_address_from_domain.dart';
import 'package:cake_wallet/entities/wake_lock.dart'; import 'package:cake_wallet/entities/wake_lock.dart';
import 'package:cake_wallet/ionia/ionia_anypay.dart'; import 'package:cake_wallet/ionia/ionia_anypay.dart';
import 'package:cake_wallet/ionia/ionia_category.dart';
import 'package:cake_wallet/ionia/ionia_gift_card.dart'; import 'package:cake_wallet/ionia/ionia_gift_card.dart';
import 'package:cake_wallet/ionia/ionia_tip.dart'; import 'package:cake_wallet/ionia/ionia_tip.dart';
import 'package:cake_wallet/src/screens/ionia/cards/ionia_custom_redeem_page.dart'; 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';
import 'package:cake_wallet/view_model/ionia/ionia_buy_card_view_model.dart'; import 'package:cake_wallet/view_model/ionia/ionia_buy_card_view_model.dart';
import 'package:cake_wallet/view_model/ionia/ionia_custom_tip_view_model.dart'; import 'package:cake_wallet/view_model/ionia/ionia_custom_tip_view_model.dart';
import 'package:cake_wallet/view_model/ionia/ionia_custom_redeem_view_model.dart'; import 'package:cake_wallet/view_model/ionia/ionia_custom_redeem_view_model.dart';
import 'package:cake_wallet/view_model/ionia/ionia_filter_view_model.dart';
import 'package:cake_wallet/ionia/ionia_service.dart'; import 'package:cake_wallet/ionia/ionia_service.dart';
import 'package:cake_wallet/ionia/ionia_api.dart'; import 'package:cake_wallet/ionia/ionia_api.dart';
import 'package:cake_wallet/ionia/ionia_merchant.dart'; import 'package:cake_wallet/ionia/ionia_merchant.dart';
@ -687,8 +685,6 @@ Future setup(
getIt.get<AnyPayApi>(), getIt.get<AnyPayApi>(),
getIt.get<AppStore>().wallet)); getIt.get<AppStore>().wallet));
getIt.registerFactory<IoniaFilterViewModel>(() => IoniaFilterViewModel());
getIt.registerFactory(() => IoniaGiftCardsListViewModel(ioniaService: getIt.get<IoniaService>())); getIt.registerFactory(() => IoniaGiftCardsListViewModel(ioniaService: getIt.get<IoniaService>()));
getIt.registerFactory(() => IoniaAuthViewModel(ioniaService: getIt.get<IoniaService>())); getIt.registerFactory(() => IoniaAuthViewModel(ioniaService: getIt.get<IoniaService>()));

View file

@ -1,5 +1,3 @@
import 'package:cake_wallet/di.dart';
import 'package:cake_wallet/ionia/ionia_category.dart';
import 'package:cake_wallet/ionia/ionia_create_state.dart'; import 'package:cake_wallet/ionia/ionia_create_state.dart';
import 'package:cake_wallet/ionia/ionia_merchant.dart'; import 'package:cake_wallet/ionia/ionia_merchant.dart';
import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/routes.dart';
@ -13,7 +11,6 @@ import 'package:cake_wallet/utils/debounce.dart';
import 'package:cake_wallet/typography.dart'; import 'package:cake_wallet/typography.dart';
import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/view_model/ionia/ionia_gift_cards_list_view_model.dart'; import 'package:cake_wallet/view_model/ionia/ionia_gift_cards_list_view_model.dart';
import 'package:cake_wallet/view_model/ionia/ionia_filter_view_model.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/generated/i18n.dart';
@ -28,6 +25,9 @@ class IoniaManageCardsPage extends BasePage {
}); });
} }
}); });
_cardsListViewModel.getMerchants();
} }
final IoniaGiftCardsListViewModel _cardsListViewModel; final IoniaGiftCardsListViewModel _cardsListViewModel;
@ -108,15 +108,27 @@ class IoniaManageCardsPage extends BasePage {
@override @override
Widget body(BuildContext context) { Widget body(BuildContext context) {
final filterIcon = InkWell( final filterButton = InkWell(
onTap: () async { onTap: () async {
final selectedFilters = await showCategoryFilter(context, _cardsListViewModel); await showCategoryFilter(context);
_cardsListViewModel.setSelectedFilter(selectedFilters); _cardsListViewModel.getMerchants();
}, },
child: Image.asset( child: Container(
'assets/images/filter.png', width: 32,
color: Theme.of(context).textTheme.caption.decorationColor, padding: EdgeInsets.all(8),
)); decoration: BoxDecoration(
color: Colors.white.withOpacity(0.15),
border: Border.all(
color: Colors.white.withOpacity(0.2),
),
borderRadius: BorderRadius.circular(10),
),
child: Image.asset(
'assets/images/filter.png',
color: Theme.of(context).textTheme.caption.decorationColor,
),
)
);
return Padding( return Padding(
padding: const EdgeInsets.all(14.0), padding: const EdgeInsets.all(14.0),
@ -132,18 +144,7 @@ class IoniaManageCardsPage extends BasePage {
controller: _searchController, controller: _searchController,
)), )),
SizedBox(width: 10), SizedBox(width: 10),
Container( filterButton
width: 32,
padding: EdgeInsets.all(8),
decoration: BoxDecoration(
color: Theme.of(context).textTheme.title.backgroundColor,
border: Border.all(
color: Colors.white.withOpacity(0.2),
),
borderRadius: BorderRadius.circular(10),
),
child: filterIcon,
)
], ],
), ),
), ),
@ -158,16 +159,12 @@ class IoniaManageCardsPage extends BasePage {
); );
} }
Future<List<IoniaCategory>> showCategoryFilter( Future <void> showCategoryFilter(BuildContext context) async {
BuildContext context, return showPopUp<void>(
IoniaGiftCardsListViewModel viewModel,
) async {
return await showPopUp<List<IoniaCategory>>(
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
return IoniaFilterModal( return IoniaFilterModal(
filterViewModel: getIt.get<IoniaFilterViewModel>(), ioniaGiftCardsListViewModel: _cardsListViewModel,
selectedCategories: viewModel.selectedFilters,
); );
}, },
); );

View file

@ -1,22 +1,18 @@
import 'package:cake_wallet/ionia/ionia_category.dart';
import 'package:cake_wallet/src/screens/ionia/widgets/rounded_checkbox.dart'; import 'package:cake_wallet/src/screens/ionia/widgets/rounded_checkbox.dart';
import 'package:cake_wallet/view_model/ionia/ionia_filter_view_model.dart';
import 'package:cake_wallet/src/widgets/alert_background.dart'; import 'package:cake_wallet/src/widgets/alert_background.dart';
import 'package:cake_wallet/typography.dart'; import 'package:cake_wallet/typography.dart';
import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/view_model/ionia/ionia_gift_cards_list_view_model.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart'; import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:cake_wallet/palette.dart';
class IoniaFilterModal extends StatelessWidget { class IoniaFilterModal extends StatelessWidget {
IoniaFilterModal({ IoniaFilterModal({@required this.ioniaGiftCardsListViewModel}){
@required this.filterViewModel, ioniaGiftCardsListViewModel.resetIoniaCategories();
@required this.selectedCategories,
}) {
filterViewModel.setSelectedCategories(this.selectedCategories);
} }
final IoniaFilterViewModel filterViewModel; final IoniaGiftCardsListViewModel ioniaGiftCardsListViewModel;
final List<IoniaCategory> selectedCategories;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -48,7 +44,7 @@ class IoniaFilterModal extends StatelessWidget {
child: Padding( child: Padding(
padding: const EdgeInsets.only(left: 24, right: 24), padding: const EdgeInsets.only(left: 24, right: 24),
child: TextField( child: TextField(
onChanged: filterViewModel.onSearchFilter, onChanged: ioniaGiftCardsListViewModel.onSearchFilter,
style: textMedium( style: textMedium(
color: Theme.of(context).primaryTextTheme.title.color, color: Theme.of(context).primaryTextTheme.title.color,
), ),
@ -73,13 +69,13 @@ class IoniaFilterModal extends StatelessWidget {
return ListView.builder( return ListView.builder(
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
shrinkWrap: true, shrinkWrap: true,
itemCount: filterViewModel.ioniaCategories.length, itemCount: ioniaGiftCardsListViewModel.ioniaCategories.length,
itemBuilder: (_, index) { itemBuilder: (_, index) {
final category = filterViewModel.ioniaCategories[index]; final category = ioniaGiftCardsListViewModel.ioniaCategories[index];
return Padding( return Padding(
padding: const EdgeInsets.only(left: 24, right: 24, bottom: 24), padding: const EdgeInsets.only(left: 24, right: 24, bottom: 24),
child: InkWell( child: InkWell(
onTap: () => filterViewModel.selectFilter(category), onTap: () => ioniaGiftCardsListViewModel.setSelectedFilter(category),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
@ -98,9 +94,9 @@ class IoniaFilterModal extends StatelessWidget {
], ],
), ),
Observer(builder: (_) { Observer(builder: (_) {
final value = filterViewModel.selectedIndices; final value = ioniaGiftCardsListViewModel.selectedIndices;
return RoundedCheckbox( return RoundedCheckbox(
value: value.contains(category.index), value: value.contains(category),
); );
}), }),
], ],
@ -114,13 +110,13 @@ class IoniaFilterModal extends StatelessWidget {
), ),
), ),
InkWell( InkWell(
onTap: () => Navigator.pop(context, filterViewModel.selectedCategories), onTap: () => Navigator.pop(context),
child: Container( child: Container(
margin: EdgeInsets.only(bottom: 40), margin: EdgeInsets.only(bottom: 40),
child: CircleAvatar( child: CircleAvatar(
child: Icon( child: Icon(
Icons.close, Icons.close,
color: Colors.black, color: Palette.darkBlueCraiola,
), ),
backgroundColor: Colors.white, backgroundColor: Colors.white,
), ),

View file

@ -1,58 +0,0 @@
import 'package:cake_wallet/ionia/ionia_category.dart';
import 'package:mobx/mobx.dart';
part 'ionia_filter_view_model.g.dart';
class IoniaFilterViewModel = IoniaFilterViewModelBase with _$IoniaFilterViewModel;
abstract class IoniaFilterViewModelBase with Store {
IoniaFilterViewModelBase() {
selectedIndices = ObservableList<int>();
ioniaCategories = IoniaCategory.allCategories;
}
List<IoniaCategory> get selectedCategories => ioniaCategories.where(_isSelected).toList();
@observable
ObservableList<int> selectedIndices;
@observable
List<IoniaCategory> ioniaCategories;
@action
void selectFilter(IoniaCategory ioniaCategory) {
if (ioniaCategory == IoniaCategory.all && !selectedIndices.contains(0)) {
selectedIndices.clear();
selectedIndices.add(0);
return;
}
if (selectedIndices.contains(ioniaCategory.index) && ioniaCategory.index != 0) {
selectedIndices.remove(ioniaCategory.index);
return;
}
selectedIndices.add(ioniaCategory.index);
selectedIndices.remove(0);
}
@action
void onSearchFilter(String text) {
if (text.isEmpty) {
ioniaCategories = IoniaCategory.allCategories;
} else {
ioniaCategories = IoniaCategory.allCategories
.where(
(e) => e.title.toLowerCase().contains(text.toLowerCase()),
)
.toList();
}
}
@action
void setSelectedCategories(List<IoniaCategory> selectedCategories) {
selectedIndices = ObservableList.of(selectedCategories.map((e) => e.index));
}
bool _isSelected(IoniaCategory ioniaCategory) {
return selectedIndices.contains(ioniaCategory.index);
}
}

View file

@ -15,11 +15,10 @@ abstract class IoniaGiftCardsListViewModelBase with Store {
}) : }) :
cardState = IoniaNoCardState(), cardState = IoniaNoCardState(),
ioniaMerchants = [], ioniaMerchants = [],
ioniaCategories = IoniaCategory.allCategories,
selectedIndices = ObservableList<IoniaCategory>.of([IoniaCategory.all]),
scrollOffsetFromTop = 0.0 { scrollOffsetFromTop = 0.0 {
selectedFilters = [];
_getAuthStatus().then((value) => isLoggedIn = value); _getAuthStatus().then((value) => isLoggedIn = value);
_getMerchants();
} }
final IoniaService ioniaService; final IoniaService ioniaService;
@ -28,8 +27,6 @@ abstract class IoniaGiftCardsListViewModelBase with Store {
String searchString; String searchString;
List<IoniaCategory> selectedFilters;
@observable @observable
double scrollOffsetFromTop; double scrollOffsetFromTop;
@ -48,6 +45,12 @@ abstract class IoniaGiftCardsListViewModelBase with Store {
@observable @observable
bool isLoggedIn; bool isLoggedIn;
@observable
List<IoniaCategory> ioniaCategories;
@observable
ObservableList<IoniaCategory> selectedIndices;
Future<bool> _getAuthStatus() async { Future<bool> _getAuthStatus() async {
return await ioniaService.isLogined(); return await ioniaService.isLogined();
} }
@ -88,9 +91,10 @@ abstract class IoniaGiftCardsListViewModelBase with Store {
} }
} }
void _getMerchants() {
void getMerchants() {
merchantState = IoniaLoadingMerchantState(); merchantState = IoniaLoadingMerchantState();
ioniaService.getMerchantsByFilter(categories: selectedFilters).then((value) { ioniaService.getMerchantsByFilter(categories: selectedIndices).then((value) {
value.sort((a, b) => a.legalName.toLowerCase().compareTo(b.legalName.toLowerCase())); value.sort((a, b) => a.legalName.toLowerCase().compareTo(b.legalName.toLowerCase()));
ioniaMerchants = ioniaMerchantList = value; ioniaMerchants = ioniaMerchantList = value;
merchantState = IoniaLoadedMerchantState(); merchantState = IoniaLoadedMerchantState();
@ -99,9 +103,42 @@ abstract class IoniaGiftCardsListViewModelBase with Store {
} }
@action @action
void setSelectedFilter(List<IoniaCategory> filters) { void setSelectedFilter(IoniaCategory category) {
selectedFilters = filters; if (category == IoniaCategory.all) {
_getMerchants(); selectedIndices.clear();
selectedIndices.add(category);
return;
}
if (category != IoniaCategory.all) {
selectedIndices.remove(IoniaCategory.all);
}
if (selectedIndices.contains(category)) {
selectedIndices.remove(category);
if (selectedIndices.isEmpty) {
selectedIndices.add(IoniaCategory.all);
}
return;
}
selectedIndices.add(category);
}
@action
void onSearchFilter(String text) {
if (text.isEmpty) {
ioniaCategories = IoniaCategory.allCategories;
} else {
ioniaCategories = IoniaCategory.allCategories
.where((e) => e.title.toLowerCase().contains(text.toLowerCase()),)
.toList();
}
}
@action
void resetIoniaCategories() {
ioniaCategories = IoniaCategory.allCategories;
} }
void setScrollOffsetFromTop(double scrollOffset) { void setScrollOffsetFromTop(double scrollOffset) {