mirror of
https://github.com/cake-tech/cake_wallet.git
synced 2025-02-02 03:06:35 +00:00
С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:
parent
278695005c
commit
424cf25052
5 changed files with 87 additions and 119 deletions
|
@ -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>()));
|
||||||
|
|
|
@ -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,
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
|
@ -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,
|
||||||
),
|
),
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in a new issue