Rework settings pickers (#398)

Updated pickers and settings screen
This commit is contained in:
Omar Hatem 2022-06-29 14:38:44 +02:00 committed by GitHub
parent 9b9e211c08
commit dc623f3293
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
78 changed files with 604 additions and 361 deletions

BIN
assets/images/flags/aus.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
assets/images/flags/bgr.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 735 B

BIN
assets/images/flags/bra.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
assets/images/flags/cad.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,005 B

BIN
assets/images/flags/che.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 855 B

BIN
assets/images/flags/chn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 860 B

BIN
assets/images/flags/czk.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 915 B

BIN
assets/images/flags/deu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 703 B

BIN
assets/images/flags/dnk.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 801 B

BIN
assets/images/flags/esp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
assets/images/flags/eur.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,005 B

BIN
assets/images/flags/fra.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 700 B

BIN
assets/images/flags/gbr.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
assets/images/flags/hkg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,023 B

BIN
assets/images/flags/hrv.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
assets/images/flags/hun.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 728 B

BIN
assets/images/flags/idn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 684 B

BIN
assets/images/flags/ind.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 845 B

BIN
assets/images/flags/isl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 867 B

BIN
assets/images/flags/isr.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 937 B

BIN
assets/images/flags/ita.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 705 B

BIN
assets/images/flags/jpn.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 896 B

BIN
assets/images/flags/kor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 997 B

BIN
assets/images/flags/mex.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,013 B

BIN
assets/images/flags/mys.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
assets/images/flags/nld.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 762 B

BIN
assets/images/flags/nor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 898 B

BIN
assets/images/flags/nzl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
assets/images/flags/phl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
assets/images/flags/pol.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 707 B

BIN
assets/images/flags/prt.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
assets/images/flags/rou.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 705 B

BIN
assets/images/flags/rus.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 702 B

BIN
assets/images/flags/saf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
assets/images/flags/sgp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 902 B

BIN
assets/images/flags/swe.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 752 B

BIN
assets/images/flags/tha.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 774 B

BIN
assets/images/flags/ukr.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 695 B

BIN
assets/images/flags/usa.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
assets/images/flags/ven.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,009 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 469 B

View file

@ -38,7 +38,6 @@ import 'package:cake_wallet/src/screens/restore/wallet_restore_page.dart';
import 'package:cake_wallet/src/screens/seed/pre_seed_page.dart'; import 'package:cake_wallet/src/screens/seed/pre_seed_page.dart';
import 'package:cake_wallet/src/screens/seed/wallet_seed_page.dart'; import 'package:cake_wallet/src/screens/seed/wallet_seed_page.dart';
import 'package:cake_wallet/src/screens/send/send_template_page.dart'; import 'package:cake_wallet/src/screens/send/send_template_page.dart';
import 'package:cake_wallet/src/screens/settings/change_language.dart';
import 'package:cake_wallet/src/screens/settings/settings.dart'; import 'package:cake_wallet/src/screens/settings/settings.dart';
import 'package:cake_wallet/src/screens/setup_pin_code/setup_pin_code.dart'; import 'package:cake_wallet/src/screens/setup_pin_code/setup_pin_code.dart';
import 'package:cake_wallet/src/screens/support/support_page.dart'; import 'package:cake_wallet/src/screens/support/support_page.dart';
@ -507,8 +506,6 @@ Future setup(
getIt.registerFactory(() => FaqPage(getIt.get<SettingsStore>())); getIt.registerFactory(() => FaqPage(getIt.get<SettingsStore>()));
getIt.registerFactory(() => LanguageListPage(getIt.get<SettingsStore>()));
getIt.registerFactoryParam<WalletRestoreViewModel, WalletType, void>( getIt.registerFactoryParam<WalletRestoreViewModel, WalletType, void>(
(type, _) => WalletRestoreViewModel(getIt.get<AppStore>(), (type, _) => WalletRestoreViewModel(getIt.get<AppStore>(),
getIt.get<WalletCreationService>(param1: type), _walletInfoSource, getIt.get<WalletCreationService>(param1: type), _walletInfoSource,

View file

@ -1,43 +1,46 @@
import 'package:cw_core/enumerable_item.dart'; import 'package:cw_core/enumerable_item.dart';
class FiatCurrency extends EnumerableItem<String> with Serializable<String> { class FiatCurrency extends EnumerableItem<String> with Serializable<String> {
const FiatCurrency({String symbol}) : super(title: symbol, raw: symbol); const FiatCurrency({String symbol, this.countryCode, this.fullName}) : super(title: symbol, raw: symbol);
final String countryCode;
final String fullName;
static List<FiatCurrency> get all => _all.values.toList(); static List<FiatCurrency> get all => _all.values.toList();
static const aud = FiatCurrency(symbol: 'AUD'); static const aud = FiatCurrency(symbol: 'AUD', countryCode: "aus", fullName: "Australian Dollar");
static const bgn = FiatCurrency(symbol: 'BGN'); static const bgn = FiatCurrency(symbol: 'BGN', countryCode: "bgr", fullName: "Bulgarian Lev");
static const brl = FiatCurrency(symbol: 'BRL'); static const brl = FiatCurrency(symbol: 'BRL', countryCode: "bra", fullName: "Brazilian Real");
static const cad = FiatCurrency(symbol: 'CAD'); static const cad = FiatCurrency(symbol: 'CAD', countryCode: "cad", fullName: "Canadian Dollar");
static const chf = FiatCurrency(symbol: 'CHF'); static const chf = FiatCurrency(symbol: 'CHF', countryCode: "che", fullName: "Swiss Franc");
static const cny = FiatCurrency(symbol: 'CNY'); static const cny = FiatCurrency(symbol: 'CNY', countryCode: "chn", fullName: "Chinese Yuan");
static const czk = FiatCurrency(symbol: 'CZK'); static const czk = FiatCurrency(symbol: 'CZK', countryCode: "czk", fullName: "Czech Koruna");
static const eur = FiatCurrency(symbol: 'EUR'); static const eur = FiatCurrency(symbol: 'EUR', countryCode: "eur", fullName: "Euro");
static const dkk = FiatCurrency(symbol: 'DKK'); static const dkk = FiatCurrency(symbol: 'DKK', countryCode: "dnk", fullName: "Danish Krone");
static const gbp = FiatCurrency(symbol: 'GBP'); static const gbp = FiatCurrency(symbol: 'GBP', countryCode: "gbr", fullName: "Pound sterling");
static const hkd = FiatCurrency(symbol: 'HKD'); static const hkd = FiatCurrency(symbol: 'HKD', countryCode: "hkg", fullName: "Hong Kong Dollar");
static const hrk = FiatCurrency(symbol: 'HRK'); static const hrk = FiatCurrency(symbol: 'HRK', countryCode: "hrv", fullName: "Croatian Kuna");
static const huf = FiatCurrency(symbol: 'HUF'); static const huf = FiatCurrency(symbol: 'HUF', countryCode: "hun", fullName: "Hungarian Forint");
static const idr = FiatCurrency(symbol: 'IDR'); static const idr = FiatCurrency(symbol: 'IDR', countryCode: "idn", fullName: "Indonesian Rupiah");
static const ils = FiatCurrency(symbol: 'ILS'); static const ils = FiatCurrency(symbol: 'ILS', countryCode: "isr", fullName: "Israeli New Shekel");
static const inr = FiatCurrency(symbol: 'INR'); static const inr = FiatCurrency(symbol: 'INR', countryCode: "ind", fullName: "Indian Rupee");
static const isk = FiatCurrency(symbol: 'ISK'); static const isk = FiatCurrency(symbol: 'ISK', countryCode: "isl", fullName: "Icelandic Króna");
static const jpy = FiatCurrency(symbol: 'JPY'); static const jpy = FiatCurrency(symbol: 'JPY', countryCode: "jpn", fullName: "Japanese Yen equals");
static const krw = FiatCurrency(symbol: 'KRW'); static const krw = FiatCurrency(symbol: 'KRW', countryCode: "kor", fullName: "South Korean won");
static const mxn = FiatCurrency(symbol: 'MXN'); static const mxn = FiatCurrency(symbol: 'MXN', countryCode: "mex", fullName: "Mexican Peso");
static const myr = FiatCurrency(symbol: 'MYR'); static const myr = FiatCurrency(symbol: 'MYR', countryCode: "mys", fullName: "Malaysian Ringgit");
static const nok = FiatCurrency(symbol: 'NOK'); static const nok = FiatCurrency(symbol: 'NOK', countryCode: "nor", fullName: "Norwegian Krone");
static const nzd = FiatCurrency(symbol: 'NZD'); static const nzd = FiatCurrency(symbol: 'NZD', countryCode: "nzl", fullName: "New Zealand Dollar");
static const php = FiatCurrency(symbol: 'PHP'); static const php = FiatCurrency(symbol: 'PHP', countryCode: "phl", fullName: "Philippine peso");
static const pln = FiatCurrency(symbol: 'PLN'); static const pln = FiatCurrency(symbol: 'PLN', countryCode: "pol", fullName: "Poland złoty");
static const ron = FiatCurrency(symbol: 'RON'); static const ron = FiatCurrency(symbol: 'RON', countryCode: "rou", fullName: "Romanian Leu");
static const rub = FiatCurrency(symbol: 'RUB'); static const rub = FiatCurrency(symbol: 'RUB', countryCode: "rus", fullName: "Russian Ruble");
static const sek = FiatCurrency(symbol: 'SEK'); static const sek = FiatCurrency(symbol: 'SEK', countryCode: "swe", fullName: "Swedish Krona");
static const sgd = FiatCurrency(symbol: 'SGD'); static const sgd = FiatCurrency(symbol: 'SGD', countryCode: "sgp", fullName: "Singapore Dollar");
static const thb = FiatCurrency(symbol: 'THB'); static const thb = FiatCurrency(symbol: 'THB', countryCode: "tha", fullName: "Thai Baht");
static const usd = FiatCurrency(symbol: 'USD'); static const usd = FiatCurrency(symbol: 'USD', countryCode: "usa", fullName: "United States Dollar");
static const zar = FiatCurrency(symbol: 'ZAR'); static const zar = FiatCurrency(symbol: 'ZAR', countryCode: "saf", fullName: "South African Rand");
static const vef = FiatCurrency(symbol: 'VEF'); static const vef = FiatCurrency(symbol: 'VEF', countryCode: "ven", fullName: "Venezuelan Bolívar");
static final _all = { static final _all = {
FiatCurrency.aud.raw: FiatCurrency.aud, FiatCurrency.aud.raw: FiatCurrency.aud,

View file

@ -20,6 +20,25 @@ class LanguageService {
'hr': 'Hrvatski (Croatian)', 'hr': 'Hrvatski (Croatian)',
'it': 'Italiano (Italian)' 'it': 'Italiano (Italian)'
}; };
static const Map<String, String> localeCountryCode = {
'en': 'usa',
'de': 'deu',
'es': 'esp',
'fr': 'fra',
'hi': 'ind',
'ja': 'jpn',
'ko': 'kor',
'nl': 'nld',
'pl': 'pol',
'pt': 'prt',
'ru': 'rus',
'uk': 'ukr',
'zh': 'chn',
'hr': 'hrv',
'it': 'ita'
};
static final list = <String, String> {}; static final list = <String, String> {};
static void loadLocaleList() { static void loadLocaleList() {

View file

@ -47,7 +47,6 @@ import 'package:cake_wallet/src/screens/monero_accounts/monero_account_edit_or_c
import 'package:cake_wallet/src/screens/contact/contact_list_page.dart'; import 'package:cake_wallet/src/screens/contact/contact_list_page.dart';
import 'package:cake_wallet/src/screens/contact/contact_page.dart'; import 'package:cake_wallet/src/screens/contact/contact_page.dart';
import 'package:cake_wallet/src/screens/wallet_keys/wallet_keys_page.dart'; import 'package:cake_wallet/src/screens/wallet_keys/wallet_keys_page.dart';
import 'package:cake_wallet/src/screens/settings/change_language.dart';
import 'package:cake_wallet/src/screens/restore/restore_wallet_from_seed_details.dart'; import 'package:cake_wallet/src/screens/restore/restore_wallet_from_seed_details.dart';
import 'package:cake_wallet/src/screens/exchange/exchange_page.dart'; import 'package:cake_wallet/src/screens/exchange/exchange_page.dart';
import 'package:cake_wallet/src/screens/settings/settings.dart'; import 'package:cake_wallet/src/screens/settings/settings.dart';
@ -359,10 +358,6 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.faq: case Routes.faq:
return MaterialPageRoute<void>(builder: (_) => getIt.get<FaqPage>()); return MaterialPageRoute<void>(builder: (_) => getIt.get<FaqPage>());
case Routes.changeLanguage:
return MaterialPageRoute<void>(
builder: (_) => getIt.get<LanguageListPage>());
case Routes.preSeed: case Routes.preSeed:
return MaterialPageRoute<void>( return MaterialPageRoute<void>(
builder: (_) => builder: (_) =>

View file

@ -41,7 +41,6 @@ class Routes {
static const unlock = '/auth_not_closable'; static const unlock = '/auth_not_closable';
static const rescan = '/rescan'; static const rescan = '/rescan';
static const faq = '/faq'; static const faq = '/faq';
static const changeLanguage = '/change_language';
static const newWalletType = '/new_wallet_type'; static const newWalletType = '/new_wallet_type';
static const sendTemplate = '/send_template'; static const sendTemplate = '/send_template';
static const exchangeTemplate = '/exchange_template'; static const exchangeTemplate = '/exchange_template';

View file

@ -1,63 +0,0 @@
import 'package:cake_wallet/src/screens/settings/widgets/language_row.dart';
import 'package:cake_wallet/src/widgets/standard_list.dart';
import 'package:cake_wallet/store/settings_store.dart';
import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/entities/language_service.dart';
import 'package:cake_wallet/src/screens/base_page.dart';
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
class LanguageListPage extends BasePage {
LanguageListPage(this.settingsStore);
final SettingsStore settingsStore;
@override
String get title => S.current.settings_change_language;
@override
Widget body(BuildContext context) {
return Container(
padding: EdgeInsets.only(top: 10.0),
child: SectionStandardList(
sectionCount: 1,
context: context,
itemCounter: (int sectionIndex) => LanguageService.list.values.length,
itemBuilder: (_, sectionIndex, index) {
return Observer(builder: (BuildContext context) {
final item = LanguageService.list.values.elementAt(index);
final code = LanguageService.list.keys.elementAt(index);
final isCurrent = code == settingsStore.languageCode ?? false;
return LanguageRow(
title: item,
isSelected: isCurrent,
handler: (context) async {
if (!isCurrent) {
await showPopUp<void>(
context: context,
builder: (BuildContext context) {
return AlertWithTwoActions(
alertTitle: S.of(context).change_language,
alertContent:
S.of(context).change_language_to(item),
rightButtonText: S.of(context).change,
leftButtonText: S.of(context).cancel,
actionRightButton: () {
settingsStore.languageCode = code;
Navigator.of(context).pop();
},
actionLeftButton: () =>
Navigator.of(context).pop());
});
}
},
);
});
},
));
}
}

View file

@ -1,4 +1,6 @@
import 'package:cake_wallet/src/screens/settings/widgets/settings_choices_cell.dart';
import 'package:cake_wallet/src/screens/settings/widgets/settings_version_cell.dart'; import 'package:cake_wallet/src/screens/settings/widgets/settings_version_cell.dart';
import 'package:cake_wallet/view_model/settings/choices_list_item.dart';
import 'package:cake_wallet/view_model/settings/version_list_item.dart'; import 'package:cake_wallet/view_model/settings/version_list_item.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
@ -46,6 +48,10 @@ class SettingsPage extends BasePage {
selectedItem: item.selectedItem(), selectedItem: item.selectedItem(),
items: item.items, items: item.items,
onItemSelected: (dynamic value) => item.onItemSelected(value), onItemSelected: (dynamic value) => item.onItemSelected(value),
images: item.images,
searchHintText: item.searchHintText,
isGridView: item.isGridView,
matchingCriteria: (dynamic value, String searchText) => item.matchingCriteria(value, searchText),
); );
}); });
} }
@ -80,6 +86,10 @@ class SettingsPage extends BasePage {
}); });
} }
if (item is ChoicesListItem) {
return SettingsChoicesCell(item);
}
return Container(); return Container();
}); });
} }

View file

@ -1,30 +0,0 @@
import 'package:cake_wallet/palette.dart';
import 'package:flutter/material.dart';
import 'package:cake_wallet/src/widgets/standard_list.dart';
class LanguageRow extends StandardListRow {
LanguageRow({@required String title, @required this.isSelected, @required Function(BuildContext context) handler}) :
super(title: title, isSelected: isSelected, onTap: handler);
@override
final bool isSelected;
@override
Widget buildCenter(BuildContext context, {@required bool hasLeftOffset}) {
return Expanded(
child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [
if (hasLeftOffset) SizedBox(width: 10),
Text(title,
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.w500,
color: titleColor(context)))
]));
}
@override
Widget buildTrailing(BuildContext context) =>
isSelected
? Icon(Icons.done, color: Palette.blueCraiola)
: Offstage();
}

View file

@ -0,0 +1,71 @@
import 'package:cake_wallet/view_model/settings/choices_list_item.dart';
import 'package:flutter/material.dart';
class SettingsChoicesCell extends StatelessWidget {
const SettingsChoicesCell(this.choicesListItem, {Key key}) : super(key: key);
final ChoicesListItem choicesListItem;
@override
Widget build(BuildContext context) {
return Container(
color: Theme.of(context).backgroundColor,
padding: EdgeInsets.all(24),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Text(
choicesListItem.title,
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.normal,
color: Theme.of(context).primaryTextTheme.title.color,
),
),
],
),
const SizedBox(height: 24),
Center(
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(30),
color: Theme.of(context).accentTextTheme.display2.color,
),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: choicesListItem.items.map((dynamic e) {
final isSelected = choicesListItem.selectedItem == e;
return GestureDetector(
onTap: () {
choicesListItem.onItemSelected?.call(e);
},
child: Container(
padding: EdgeInsets.symmetric(horizontal: 32, vertical: 8),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(30),
color: isSelected ? Theme.of(context).accentTextTheme.body2.color : null,
),
child: Text(
choicesListItem.displayItem?.call(e) ?? e.toString(),
style: TextStyle(
color: isSelected ? Colors.white : Theme.of(context).primaryTextTheme.caption.color,
fontWeight: isSelected ? FontWeight.w700 : FontWeight.normal,
),
),
),
);
}).toList(),
),
),
),
),
],
),
);
}
}

View file

@ -2,7 +2,6 @@ import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:cake_wallet/src/widgets/picker.dart'; import 'package:cake_wallet/src/widgets/picker.dart';
import 'package:cake_wallet/src/widgets/standard_list.dart'; import 'package:cake_wallet/src/widgets/standard_list.dart';
import 'package:cake_wallet/generated/i18n.dart';
class SettingsPickerCell<ItemType> extends StandardListRow { class SettingsPickerCell<ItemType> extends StandardListRow {
SettingsPickerCell( SettingsPickerCell(
@ -10,29 +9,43 @@ class SettingsPickerCell<ItemType> extends StandardListRow {
@required this.displayItem, @required this.displayItem,
this.selectedItem, this.selectedItem,
this.items, this.items,
this.images,
this.searchHintText,
this.isGridView = false,
this.matchingCriteria,
this.onItemSelected}) this.onItemSelected})
: super( : super(
title: title, title: title,
isSelected: false, isSelected: false,
onTap: (BuildContext context) async { onTap: (BuildContext context) async {
final selectedAtIndex = items.indexOf(selectedItem); final selectedAtIndex = items.indexOf(selectedItem);
await showPopUp<void>( await showPopUp<void>(
context: context, context: context,
builder: (_) => Picker( builder: (_) => Picker(
items: items, items: items,
displayItem: displayItem, displayItem: displayItem,
selectedAtIndex: selectedAtIndex, selectedAtIndex: selectedAtIndex,
title: S.current.please_select, mainAxisAlignment: MainAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center, onItemSelected: (ItemType item) => onItemSelected?.call(item),
onItemSelected: (ItemType item) => images: images,
onItemSelected?.call(item))); isSeparated: false,
}); hintText: searchHintText,
isGridView: isGridView,
matchingCriteria: matchingCriteria,
),
);
},
);
final ItemType selectedItem; final ItemType selectedItem;
final List<ItemType> items; final List<ItemType> items;
final void Function(ItemType item) onItemSelected; final void Function(ItemType item) onItemSelected;
final String Function(ItemType item) displayItem; final String Function(ItemType item) displayItem;
final List<Image> images;
final String searchHintText;
final bool isGridView;
final bool Function(ItemType, String) matchingCriteria;
@override @override
Widget buildTrailing(BuildContext context) { Widget buildTrailing(BuildContext context) {
@ -40,9 +53,7 @@ class SettingsPickerCell<ItemType> extends StandardListRow {
displayItem?.call(selectedItem) ?? selectedItem.toString(), displayItem?.call(selectedItem) ?? selectedItem.toString(),
textAlign: TextAlign.right, textAlign: TextAlign.right,
style: TextStyle( style: TextStyle(
fontSize: 14.0, fontSize: 14.0, fontWeight: FontWeight.w500, color: Theme.of(context).primaryTextTheme.overline.color),
fontWeight: FontWeight.w500,
color: Theme.of(context).primaryTextTheme.overline.color),
); );
} }
} }

View file

@ -10,15 +10,19 @@ class AlertBackground extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Scaffold(
height: double.infinity, resizeToAvoidBottomInset: false,
width: double.infinity, backgroundColor: Colors.transparent,
color: Colors.transparent, body: Container(
child: BackdropFilter( height: double.infinity,
filter: ImageFilter.blur(sigmaX: 3.0, sigmaY: 3.0), width: double.infinity,
child: Container( color: Colors.transparent,
decoration: BoxDecoration(color: PaletteDark.darkNightBlue.withOpacity(0.75)), child: BackdropFilter(
child: child, filter: ImageFilter.blur(sigmaX: 3.0, sigmaY: 3.0),
child: Container(
decoration: BoxDecoration(color: PaletteDark.darkNightBlue.withOpacity(0.75)),
child: child,
),
), ),
), ),
); );

View file

@ -2,7 +2,6 @@ import 'dart:ui';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:cake_wallet/src/widgets/alert_background.dart'; import 'package:cake_wallet/src/widgets/alert_background.dart';
import 'package:cake_wallet/src/widgets/cake_scrollbar.dart';
import 'package:cake_wallet/src/widgets/alert_close_button.dart'; import 'package:cake_wallet/src/widgets/alert_close_button.dart';
import 'package:cake_wallet/palette.dart'; import 'package:cake_wallet/palette.dart';
@ -10,13 +9,19 @@ class Picker<Item extends Object> extends StatefulWidget {
Picker({ Picker({
@required this.selectedAtIndex, @required this.selectedAtIndex,
@required this.items, @required this.items,
@required this.title,
@required this.onItemSelected, @required this.onItemSelected,
this.title,
this.displayItem, this.displayItem,
this.images, this.images,
this.description, this.description,
this.mainAxisAlignment = MainAxisAlignment.start, this.mainAxisAlignment = MainAxisAlignment.start,
}); this.isGridView = false,
this.isSeparated = true,
this.hintText,
this.matchingCriteria,
}) : assert(hintText == null ||
matchingCriteria !=
null); // make sure that if the search field is enabled then there is a searching criteria provided
final int selectedAtIndex; final int selectedAtIndex;
final List<Item> items; final List<Item> items;
@ -26,6 +31,10 @@ class Picker<Item extends Object> extends StatefulWidget {
final Function(Item) onItemSelected; final Function(Item) onItemSelected;
final MainAxisAlignment mainAxisAlignment; final MainAxisAlignment mainAxisAlignment;
final String Function(Item) displayItem; final String Function(Item) displayItem;
final bool isGridView;
final bool isSeparated;
final String hintText;
final bool Function(Item, String) matchingCriteria;
@override @override
PickerState createState() => PickerState<Item>(items, images, onItemSelected); PickerState createState() => PickerState<Item>(items, images, onItemSelected);
@ -35,8 +44,10 @@ class PickerState<Item> extends State<Picker> {
PickerState(this.items, this.images, this.onItemSelected); PickerState(this.items, this.images, this.onItemSelected);
final Function(Item) onItemSelected; final Function(Item) onItemSelected;
final List<Item> items; List<Item> items;
final List<Image> images; List<Image> images;
final TextEditingController searchController = TextEditingController();
final closeButton = Image.asset( final closeButton = Image.asset(
'assets/images/close.png', 'assets/images/close.png',
@ -44,161 +55,248 @@ class PickerState<Item> extends State<Picker> {
); );
ScrollController controller = ScrollController(); ScrollController controller = ScrollController();
final double backgroundHeight = 193; @override
final double thumbHeight = 72; void initState() {
double fromTop = 0; super.initState();
searchController.addListener(() {
items = [];
images = [];
for (int i=0;i<widget.items.length;i++) {
if (widget.matchingCriteria?.call(widget.items[i], searchController.text) ?? true) {
items.add(widget.items[i] as Item);
images.add(widget.images[i]);
}
}
setState(() {});
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
controller.addListener(() {
fromTop = controller.hasClients
? (controller.offset /
controller.position.maxScrollExtent *
(backgroundHeight - thumbHeight))
: 0;
setState(() {});
});
final isShowScrollThumb = items != null ? items.length > 3 : false;
return AlertBackground( return AlertBackground(
child: Stack( child: Stack(
alignment: Alignment.center, alignment: Alignment.center,
children: <Widget>[ children: <Widget>[
Column( Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
Container( if (widget.title?.isNotEmpty ?? false)
padding: EdgeInsets.only(left: 24, right: 24), Container(
child: Text( padding: EdgeInsets.symmetric(horizontal: 24),
widget.title, child: Text(
textAlign: TextAlign.center, widget.title,
style: TextStyle( textAlign: TextAlign.center,
fontSize: 18, style: TextStyle(
fontFamily: 'Lato', fontSize: 18,
fontWeight: FontWeight.bold, fontFamily: 'Lato',
decoration: TextDecoration.none, fontWeight: FontWeight.bold,
color: Colors.white), decoration: TextDecoration.none,
), color: Colors.white,
), ),
Padding( ),
padding: EdgeInsets.only(left: 24, right: 24, top: 24), ),
child: GestureDetector( Padding(
onTap: () => null, padding: EdgeInsets.only(left: 24, right: 24, top: 24),
child: ClipRRect( child: GestureDetector(
borderRadius: BorderRadius.all(Radius.circular(14)), onTap: () => null,
child: Container( child: ClipRRect(
height: 233, borderRadius: BorderRadius.all(Radius.circular(30)),
child: Container(
color: Theme.of(context).accentTextTheme.title.color, color: Theme.of(context).accentTextTheme.title.color,
child: Stack( child: ConstrainedBox(
alignment: Alignment.center, constraints: BoxConstraints(
children: <Widget>[ maxHeight: MediaQuery.of(context).size.height * 0.65,
ListView.separated( ),
padding: EdgeInsets.all(0), child: Column(
controller: controller, mainAxisSize: MainAxisSize.min,
separatorBuilder: (context, index) => Divider( children: [
color: Theme.of(context) if (widget.hintText != null)
.accentTextTheme Padding(
.title padding: const EdgeInsets.all(16),
.backgroundColor, child: TextFormField(
height: 1, controller: searchController,
), style: TextStyle(color: Theme.of(context).primaryTextTheme.title.color),
itemCount: items == null ? 0 : items.length, decoration: InputDecoration(
itemBuilder: (context, index) { hintText: widget.hintText,
final item = items[index]; prefixIcon: Image.asset("assets/images/search_icon.png"),
final image = filled: true,
images != null ? images[index] : null; fillColor: Theme.of(context).accentTextTheme.display2.color,
final isItemSelected = alignLabelWithHint: false,
index == widget.selectedAtIndex; contentPadding: const EdgeInsets.symmetric(vertical: 4, horizontal: 16),
enabledBorder: OutlineInputBorder(
final color = isItemSelected borderRadius: BorderRadius.circular(14),
? Theme.of(context).textTheme.body2.color borderSide: const BorderSide(
: Theme.of(context) color: Colors.transparent,
.accentTextTheme )),
.title focusedBorder: OutlineInputBorder(
.color; borderRadius: BorderRadius.circular(14),
final textColor = isItemSelected borderSide: const BorderSide(
? Palette.blueCraiola color: Colors.transparent,
: Theme.of(context) )),
.primaryTextTheme
.title
.color;
return GestureDetector(
onTap: () {
if (onItemSelected == null) {
return;
}
Navigator.of(context).pop();
onItemSelected(item);
},
child: Container(
height: 77,
padding: EdgeInsets.only(left: 24, right: 24),
color: color,
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: widget.mainAxisAlignment,
crossAxisAlignment:
CrossAxisAlignment.center,
children: <Widget>[
image ?? Offstage(),
Padding(
padding: EdgeInsets.only(
left: image != null ? 12 : 0),
child: Text(
widget.displayItem?.call(item) ??
item.toString(),
style: TextStyle(
fontSize: 18,
fontFamily: 'Lato',
fontWeight: FontWeight.w600,
color: textColor,
decoration: TextDecoration.none,
),
),
)
],
), ),
), ),
); ),
}, Divider(
), color: Theme.of(context).accentTextTheme.title.backgroundColor,
((widget.description != null) && height: 1,
(widget.description.isNotEmpty)) ),
? Positioned( if (widget.selectedAtIndex != -1) buildSelectedItem(),
bottom: 24, Flexible(
left: 24, child: Stack(
right: 24, alignment: Alignment.center,
child: Text( children: <Widget>[
widget.description, (items?.length ?? 0) > 3 ? Scrollbar(
textAlign: TextAlign.center, controller: controller,
style: TextStyle( child: itemsList(),
fontSize: 12, ) : itemsList(),
fontWeight: FontWeight.w500, (widget.description?.isNotEmpty ?? false)
fontFamily: 'Lato', ? Positioned(
decoration: TextDecoration.none, bottom: 24,
color: Theme.of(context) left: 24,
.primaryTextTheme right: 24,
.title child: Text(
.color), widget.description,
)) textAlign: TextAlign.center,
: Offstage(), style: TextStyle(
isShowScrollThumb fontSize: 12,
? CakeScrollbar( fontWeight: FontWeight.w500,
backgroundHeight: backgroundHeight, fontFamily: 'Lato',
thumbHeight: thumbHeight, decoration: TextDecoration.none,
fromTop: fromTop) color: Theme.of(context).primaryTextTheme.title.color,
: Offstage(), ),
], ),
)), )
: Offstage(),
],
),
),
],
),
),
),
),
),
)
],
),
AlertCloseButton(image: closeButton)
],
),
);
}
Widget itemsList() {
return Container(
color: Theme.of(context).accentTextTheme.headline6.backgroundColor,
child: widget.isGridView
? GridView.builder(
padding: EdgeInsets.zero,
controller: controller,
itemCount: items == null || items.isEmpty ? 0 : items.length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 2,
childAspectRatio: 3,
),
itemBuilder: (context, index) => buildItem(index),
)
: ListView.separated(
padding: EdgeInsets.zero,
controller: controller,
shrinkWrap: true,
separatorBuilder: (context, index) => widget.isSeparated
? Divider(
color: Theme.of(context).accentTextTheme.title.backgroundColor,
height: 1,
)
: const SizedBox(),
itemCount: items == null || items.isEmpty ? 0 : items.length,
itemBuilder: (context, index) => buildItem(index),
),
);
}
Widget buildItem(int index) {
/// don't show selected item in the list view
if (widget.items[widget.selectedAtIndex] == items[index] && !widget.isGridView) {
return const SizedBox();
}
final item = items[index];
final image = images != null ? images[index] : null;
return GestureDetector(
onTap: () {
if (onItemSelected == null) {
return;
}
Navigator.of(context).pop();
onItemSelected(item);
},
child: Container(
height: 55,
color: Theme.of(context).accentTextTheme.headline6.color,
padding: EdgeInsets.only(left: 24, right: 24),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: widget.mainAxisAlignment,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
image ?? Offstage(),
Expanded(
child: Padding(
padding: EdgeInsets.only(left: image != null ? 12 : 0),
child: Text(
widget.displayItem?.call(item) ?? item.toString(),
style: TextStyle(
fontSize: 14,
fontFamily: 'Lato',
fontWeight: FontWeight.w600,
color: Theme.of(context).primaryTextTheme.title.color,
decoration: TextDecoration.none,
),
), ),
), ),
) ),
], ],
), ),
AlertCloseButton(image: closeButton) ),
], );
)); }
Widget buildSelectedItem() {
final item = widget.items[widget.selectedAtIndex];
final image = images != null ? widget.images[widget.selectedAtIndex] : null;
return Container(
height: 55,
color: Theme.of(context).accentTextTheme.headline6.color,
padding: EdgeInsets.only(left: 24, right: 24),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: widget.mainAxisAlignment,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
image ?? Offstage(),
Expanded(
child: Padding(
padding: EdgeInsets.only(left: image != null ? 12 : 0),
child: Text(
widget.displayItem?.call(item) ?? item.toString(),
style: TextStyle(
fontSize: 16,
fontFamily: 'Lato',
fontWeight: FontWeight.w700,
color: Theme.of(context).primaryTextTheme.title.color,
decoration: TextDecoration.none,
),
),
),
),
Icon(Icons.check_circle, color: Theme.of(context).accentTextTheme.body2.color),
],
),
);
} }
} }

View file

@ -37,11 +37,15 @@ class StandardListRow extends StatelessWidget {
return Expanded( return Expanded(
child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [ child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [
if (hasLeftOffset) SizedBox(width: 10), if (hasLeftOffset) SizedBox(width: 10),
Text(title, Expanded(
style: TextStyle( child: Text(title,
fontSize: 14, style: TextStyle(
fontWeight: FontWeight.normal, fontSize: 14,
color: titleColor(context))) fontWeight: FontWeight.normal,
color: titleColor(context),
),
),
)
])); ]));
} }

View file

@ -24,7 +24,7 @@ class StandartSwitchState extends State<StandartSwitch> {
height: 28, height: 28,
decoration: BoxDecoration( decoration: BoxDecoration(
color: widget.value color: widget.value
? Colors.green ? Theme.of(context).accentTextTheme.body2.color
: Theme.of(context).accentTextTheme.display4.color, : Theme.of(context).accentTextTheme.display4.color,
borderRadius: BorderRadius.all(Radius.circular(14.0))), borderRadius: BorderRadius.all(Radius.circular(14.0))),
child: Container( child: Container(

View file

@ -78,6 +78,14 @@ class BrightTheme extends ThemeBase {
decorationColor: Colors.white, // menu background decorationColor: Colors.white, // menu background
) )
), ),
scrollbarTheme: ScrollbarThemeData(
thumbColor: MaterialStateProperty.all(Palette.moderatePurpleBlue),
trackColor: MaterialStateProperty.all(Palette.periwinkleCraiola),
radius: Radius.circular(3),
thickness: MaterialStateProperty.all(6),
isAlwaysShown: true,
crossAxisMargin: 6,
),
primaryTextTheme: TextTheme( primaryTextTheme: TextTheme(
title: TextStyle( title: TextStyle(
color: Palette.darkBlueCraiola, // title color color: Palette.darkBlueCraiola, // title color

View file

@ -77,6 +77,14 @@ class DarkTheme extends ThemeBase {
decorationColor: PaletteDark.deepPurpleBlue, // menu background decorationColor: PaletteDark.deepPurpleBlue, // menu background
) )
), ),
scrollbarTheme: ScrollbarThemeData(
thumbColor: MaterialStateProperty.all(PaletteDark.wildBlueGrey),
trackColor: MaterialStateProperty.all(PaletteDark.violetBlue),
radius: Radius.circular(3),
thickness: MaterialStateProperty.all(6),
isAlwaysShown: true,
crossAxisMargin: 6,
),
primaryTextTheme: TextTheme( primaryTextTheme: TextTheme(
title: TextStyle( title: TextStyle(
color: Colors.white, // title color color: Colors.white, // title color

View file

@ -78,6 +78,14 @@ class LightTheme extends ThemeBase {
decorationColor: Colors.white, // menu background decorationColor: Colors.white, // menu background
) )
), ),
scrollbarTheme: ScrollbarThemeData(
thumbColor: MaterialStateProperty.all(Palette.moderatePurpleBlue),
trackColor: MaterialStateProperty.all(Palette.periwinkleCraiola),
radius: Radius.circular(3),
thickness: MaterialStateProperty.all(6),
isAlwaysShown: true,
crossAxisMargin: 6,
),
primaryTextTheme: TextTheme( primaryTextTheme: TextTheme(
title: TextStyle( title: TextStyle(
color: Palette.darkBlueCraiola, // title color color: Palette.darkBlueCraiola, // title color

View file

@ -4,7 +4,7 @@ import 'package:cake_wallet/themes/light_theme.dart';
import 'package:cake_wallet/themes/theme_base.dart'; import 'package:cake_wallet/themes/theme_base.dart';
class ThemeList { class ThemeList {
static final all = [lightTheme, brightTheme, darkTheme]; static final all = [brightTheme, lightTheme, darkTheme];
static final lightTheme = LightTheme(raw: 0); static final lightTheme = LightTheme(raw: 0);
static final brightTheme = BrightTheme(raw: 1); static final brightTheme = BrightTheme(raw: 1);

View file

@ -0,0 +1,25 @@
import 'package:flutter/foundation.dart';
import 'package:cake_wallet/view_model/settings/settings_list_item.dart';
import 'package:flutter/material.dart';
class ChoicesListItem<ItemType> extends SettingsListItem {
ChoicesListItem(
{@required String title,
@required this.selectedItem,
@required this.items,
this.displayItem,
void Function(ItemType item) onItemSelected})
: _onItemSelected = onItemSelected,
super(title);
final ItemType selectedItem;
final List<ItemType> items;
final String Function(ItemType item) displayItem;
final void Function(ItemType item) _onItemSelected;
void onItemSelected(dynamic item) {
if (item is ItemType) {
_onItemSelected?.call(item);
}
}
}

View file

@ -1,5 +1,6 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:cake_wallet/view_model/settings/settings_list_item.dart'; import 'package:cake_wallet/view_model/settings/settings_list_item.dart';
import 'package:flutter/material.dart';
class PickerListItem<ItemType> extends SettingsListItem { class PickerListItem<ItemType> extends SettingsListItem {
PickerListItem( PickerListItem(
@ -7,18 +8,34 @@ class PickerListItem<ItemType> extends SettingsListItem {
@required this.selectedItem, @required this.selectedItem,
@required this.items, @required this.items,
this.displayItem, this.displayItem,
void Function(ItemType item) onItemSelected}) this.images,
this.searchHintText,
this.isGridView = false,
void Function(ItemType item) onItemSelected,
bool Function(ItemType item, String searchText) matchingCriteria})
: _onItemSelected = onItemSelected, : _onItemSelected = onItemSelected,
_matchingCriteria = matchingCriteria,
super(title); super(title);
final ItemType Function() selectedItem; final ItemType Function() selectedItem;
final List<ItemType> items; final List<ItemType> items;
final String Function(ItemType item) displayItem; final String Function(ItemType item) displayItem;
final void Function(ItemType item) _onItemSelected; final void Function(ItemType item) _onItemSelected;
final List<Image> images;
final String searchHintText;
final bool isGridView;
final bool Function(ItemType, String) _matchingCriteria;
void onItemSelected(dynamic item) { void onItemSelected(dynamic item) {
if (item is ItemType) { if (item is ItemType) {
_onItemSelected?.call(item); _onItemSelected?.call(item);
} }
} }
bool matchingCriteria(dynamic item, String searchText) {
if (item is ItemType) {
return _matchingCriteria?.call(item, searchText);
}
return true;
}
} }

View file

@ -1,6 +1,7 @@
import 'package:cake_wallet/di.dart';
import 'package:cake_wallet/entities/language_service.dart';
import 'package:cake_wallet/store/yat/yat_store.dart'; import 'package:cake_wallet/store/yat/yat_store.dart';
import 'package:cake_wallet/utils/show_pop_up.dart'; import 'package:cake_wallet/view_model/settings/choices_list_item.dart';
import 'package:cake_wallet/view_model/settings/link_list_item.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:mobx/mobx.dart'; import 'package:mobx/mobx.dart';
import 'package:package_info/package_info.dart'; import 'package:package_info/package_info.dart';
@ -75,7 +76,7 @@ abstract class SettingsViewModelBase with Store {
//var connectYatUrl = YatLink.baseUrl + YatLink.signInSuffix; //var connectYatUrl = YatLink.baseUrl + YatLink.signInSuffix;
//final connectYatUrlParameters = //final connectYatUrlParameters =
// _yatStore.defineQueryParameters(); // _yatStore.defineQueryParameters();
//if (connectYatUrlParameters.isNotEmpty) { //if (connectYatUrlParameters.isNotEmpty) {
// connectYatUrl += YatLink.queryParameter + connectYatUrlParameters; // connectYatUrl += YatLink.queryParameter + connectYatUrlParameters;
//} //}
@ -83,7 +84,7 @@ abstract class SettingsViewModelBase with Store {
//var manageYatUrl = YatLink.baseUrl + YatLink.managePath; //var manageYatUrl = YatLink.baseUrl + YatLink.managePath;
//final manageYatUrlParameters = //final manageYatUrlParameters =
// _yatStore.defineQueryParameters(); // _yatStore.defineQueryParameters();
//if (manageYatUrlParameters.isNotEmpty) { //if (manageYatUrlParameters.isNotEmpty) {
// manageYatUrl += YatLink.queryParameter + manageYatUrlParameters; // manageYatUrl += YatLink.queryParameter + manageYatUrlParameters;
//} //}
@ -91,27 +92,41 @@ abstract class SettingsViewModelBase with Store {
//var createNewYatUrl = YatLink.startFlowUrl; //var createNewYatUrl = YatLink.startFlowUrl;
//final createNewYatUrlParameters = //final createNewYatUrlParameters =
// _yatStore.defineQueryParameters(); // _yatStore.defineQueryParameters();
//if (createNewYatUrlParameters.isNotEmpty) { //if (createNewYatUrlParameters.isNotEmpty) {
// createNewYatUrl += '?sub1=' + createNewYatUrlParameters; // createNewYatUrl += '?sub1=' + createNewYatUrlParameters;
//} //}
sections = [ sections = [
[ [
PickerListItem( SwitcherListItem(
title: S.current.settings_display_balance_as, title: S.current.settings_display_balance,
items: BalanceDisplayMode.all, value: () => balanceDisplayMode == BalanceDisplayMode.displayableBalance,
selectedItem: () => balanceDisplayMode, onValueChange: (_, bool value) {
onItemSelected: (BalanceDisplayMode mode) => if (value) {
_settingsStore.balanceDisplayMode = mode), _settingsStore.balanceDisplayMode = BalanceDisplayMode.displayableBalance;
} else {
_settingsStore.balanceDisplayMode = BalanceDisplayMode.hiddenBalance;
}
},
),
if (!isHaven) if (!isHaven)
PickerListItem( PickerListItem(
title: S.current.settings_currency, title: S.current.settings_currency,
searchHintText: S.current.search_currency,
items: FiatCurrency.all, items: FiatCurrency.all,
selectedItem: () => fiatCurrency, selectedItem: () => fiatCurrency,
onItemSelected: (FiatCurrency currency) => onItemSelected: (FiatCurrency currency) =>
setFiatCurrency(currency)), setFiatCurrency(currency),
images: FiatCurrency.all.map(
(e) => Image.asset("assets/images/flags/${e.countryCode}.png"))
.toList(),
isGridView: true,
matchingCriteria: (FiatCurrency currency, String searchText) {
return currency.title.toLowerCase().contains(searchText) || currency.fullName.toLowerCase().contains(searchText);
},
),
PickerListItem( PickerListItem(
title: S.current.settings_fee_priority, title: S.current.settings_fee_priority,
items: priorityForWalletType(wallet.type), items: priorityForWalletType(wallet.type),
@ -150,10 +165,23 @@ abstract class SettingsViewModelBase with Store {
} }
}); });
}), }),
RegularListItem( PickerListItem(
title: S.current.settings_change_language, title: S.current.settings_change_language,
handler: (BuildContext context) => searchHintText: S.current.search_language,
Navigator.of(context).pushNamed(Routes.changeLanguage), items: LanguageService.list.keys.toList(),
displayItem: (dynamic code) {
return LanguageService.list[code];
},
selectedItem: () => getIt.get<SettingsStore>().languageCode,
onItemSelected: (String code) {
getIt.get<SettingsStore>().languageCode = code;
},
images: LanguageService.list.keys.map(
(e) => Image.asset("assets/images/flags/${LanguageService.localeCountryCode[e]}.png"))
.toList(),
matchingCriteria: (String code, String searchText) {
return LanguageService.list[code].toLowerCase().contains(searchText);
},
), ),
SwitcherListItem( SwitcherListItem(
title: S.current.settings_allow_biometrical_authentication, title: S.current.settings_allow_biometrical_authentication,
@ -180,12 +208,12 @@ abstract class SettingsViewModelBase with Store {
setAllowBiometricalAuthentication(value); setAllowBiometricalAuthentication(value);
} }
}), }),
PickerListItem( ChoicesListItem(
title: S.current.color_theme, title: S.current.color_theme,
items: ThemeList.all, items: ThemeList.all,
selectedItem: () => theme, selectedItem: theme,
onItemSelected: (ThemeBase theme) => onItemSelected: (ThemeBase theme) => _settingsStore.currentTheme = theme,
_settingsStore.currentTheme = theme) ),
], ],
//[ //[
//if (_yatStore.emoji.isNotEmpty) ...[ //if (_yatStore.emoji.isNotEmpty) ...[

View file

@ -76,6 +76,7 @@ flutter:
assets: assets:
- assets/images/ - assets/images/
- assets/images/flags/
- assets/node_list.yml - assets/node_list.yml
- assets/haven_node_list.yml - assets/haven_node_list.yml
- assets/bitcoin_electrum_server_list.yml - assets/bitcoin_electrum_server_list.yml

View file

@ -228,7 +228,7 @@
"settings_nodes" : "Knoten", "settings_nodes" : "Knoten",
"settings_current_node" : "Aktueller Knoten", "settings_current_node" : "Aktueller Knoten",
"settings_wallets" : "Wallets", "settings_wallets" : "Wallets",
"settings_display_balance_as" : "Kontostand anzeigen in", "settings_display_balance" : "Kontostand anzeigen",
"settings_currency" : "Währung", "settings_currency" : "Währung",
"settings_fee_priority" : "Gebührenpriorität", "settings_fee_priority" : "Gebührenpriorität",
"settings_save_recipient_address" : "Empfängeradresse speichern", "settings_save_recipient_address" : "Empfängeradresse speichern",
@ -530,6 +530,8 @@
"third_intro_content" : "Yats leben auch außerhalb von Cake Wallet. Jede Wallet-Adresse auf der Welt kann durch ein Yat ersetzt werden!", "third_intro_content" : "Yats leben auch außerhalb von Cake Wallet. Jede Wallet-Adresse auf der Welt kann durch ein Yat ersetzt werden!",
"learn_more" : "Erfahren Sie mehr", "learn_more" : "Erfahren Sie mehr",
"search": "Suche", "search": "Suche",
"search_language": "Sprache suchen",
"search_currency": "Währung suchen",
"new_template" : "neue Vorlage", "new_template" : "neue Vorlage",
"electrum_address_disclaimer": "Wir generieren jedes Mal neue Adressen, wenn Sie eine verwenden, aber vorherige Adressen funktionieren weiterhin" "electrum_address_disclaimer": "Wir generieren jedes Mal neue Adressen, wenn Sie eine verwenden, aber vorherige Adressen funktionieren weiterhin"
} }

View file

@ -228,7 +228,7 @@
"settings_nodes" : "Nodes", "settings_nodes" : "Nodes",
"settings_current_node" : "Current node", "settings_current_node" : "Current node",
"settings_wallets" : "Wallets", "settings_wallets" : "Wallets",
"settings_display_balance_as" : "Display balance as", "settings_display_balance" : "Display balance",
"settings_currency" : "Currency", "settings_currency" : "Currency",
"settings_fee_priority" : "Fee priority", "settings_fee_priority" : "Fee priority",
"settings_save_recipient_address" : "Save recipient address", "settings_save_recipient_address" : "Save recipient address",
@ -530,6 +530,8 @@
"third_intro_content" : "Yats live outside of Cake Wallet, too. Any wallet address on earth can be replaced with a Yat!", "third_intro_content" : "Yats live outside of Cake Wallet, too. Any wallet address on earth can be replaced with a Yat!",
"learn_more" : "Learn More", "learn_more" : "Learn More",
"search": "Search", "search": "Search",
"search_language": "Search language",
"search_currency": "Search currency",
"new_template" : "New Template", "new_template" : "New Template",
"electrum_address_disclaimer": "We generate new addresses each time you use one, but previous addresses continue to work" "electrum_address_disclaimer": "We generate new addresses each time you use one, but previous addresses continue to work"
} }

View file

@ -228,7 +228,7 @@
"settings_nodes" : "Nodos", "settings_nodes" : "Nodos",
"settings_current_node" : "Nodo actual", "settings_current_node" : "Nodo actual",
"settings_wallets" : "Carteras", "settings_wallets" : "Carteras",
"settings_display_balance_as" : "Mostrar saldo como", "settings_display_balance" : "Mostrar saldo",
"settings_currency" : "Moneda", "settings_currency" : "Moneda",
"settings_fee_priority" : "Prioridad de tasa", "settings_fee_priority" : "Prioridad de tasa",
"settings_save_recipient_address" : "Guardar dirección del destinatario", "settings_save_recipient_address" : "Guardar dirección del destinatario",
@ -530,6 +530,8 @@
"third_intro_content" : "Los Yats también viven fuera de Cake Wallet. Cualquier dirección de billetera en la tierra se puede reemplazar con un Yat!", "third_intro_content" : "Los Yats también viven fuera de Cake Wallet. Cualquier dirección de billetera en la tierra se puede reemplazar con un Yat!",
"learn_more" : "Aprende más", "learn_more" : "Aprende más",
"search": "Búsqueda", "search": "Búsqueda",
"search_language": "Idioma de búsqueda",
"search_currency": "Moneda de búsqueda",
"new_template" : "Nueva plantilla", "new_template" : "Nueva plantilla",
"electrum_address_disclaimer": "Generamos nuevas direcciones cada vez que usa una, pero las direcciones anteriores siguen funcionando" "electrum_address_disclaimer": "Generamos nuevas direcciones cada vez que usa una, pero las direcciones anteriores siguen funcionando"
} }

View file

@ -226,7 +226,7 @@
"settings_nodes" : "Nœuds", "settings_nodes" : "Nœuds",
"settings_current_node" : "Nœud actuel", "settings_current_node" : "Nœud actuel",
"settings_wallets" : "Portefeuilles", "settings_wallets" : "Portefeuilles",
"settings_display_balance_as" : "Afficher le solde en", "settings_display_balance" : "Afficher le solde",
"settings_currency" : "Devise", "settings_currency" : "Devise",
"settings_fee_priority" : "Priorité des frais", "settings_fee_priority" : "Priorité des frais",
"settings_save_recipient_address" : "Sauvegarder l'adresse du bénéficiaire", "settings_save_recipient_address" : "Sauvegarder l'adresse du bénéficiaire",
@ -527,7 +527,9 @@
"third_intro_title" : "Yat joue bien avec les autres", "third_intro_title" : "Yat joue bien avec les autres",
"third_intro_content" : "Les Yats existent aussi en dehors de Cake Wallet. Toute adresse sur terre peut être remplacée par un Yat !", "third_intro_content" : "Les Yats existent aussi en dehors de Cake Wallet. Toute adresse sur terre peut être remplacée par un Yat !",
"learn_more" : "En savoir plus", "learn_more" : "En savoir plus",
"search": "Chercher",
"search_language": "Langue de recherche",
"search_currency": "Devise de recherche",
"new_template" : "Nouveau Modèle", "new_template" : "Nouveau Modèle",
"electrum_address_disclaimer": "Nous générons de nouvelles adresses à chaque fois que vous en utilisez une, mais les adresses précédentes continuent à fonctionner" "electrum_address_disclaimer": "Nous générons de nouvelles adresses à chaque fois que vous en utilisez une, mais les adresses précédentes continuent à fonctionner"
} }

View file

@ -228,7 +228,7 @@
"settings_nodes" : "नोड्स", "settings_nodes" : "नोड्स",
"settings_current_node" : "वर्तमान नोड", "settings_current_node" : "वर्तमान नोड",
"settings_wallets" : "पर्स", "settings_wallets" : "पर्स",
"settings_display_balance_as" : "के रूप में संतुलन प्रदर्शित करें", "settings_display_balance" : "प्रदर्शन संतुलन",
"settings_currency" : "मुद्रा", "settings_currency" : "मुद्रा",
"settings_fee_priority" : "शुल्क प्राथमिकता", "settings_fee_priority" : "शुल्क प्राथमिकता",
"settings_save_recipient_address" : "प्राप्तकर्ता का पता सहेजें", "settings_save_recipient_address" : "प्राप्तकर्ता का पता सहेजें",
@ -530,6 +530,8 @@
"third_intro_content" : "Yats Cake Wallet के बाहर भी रहता है। धरती पर किसी भी वॉलेट पते को Yat से बदला जा सकता है!", "third_intro_content" : "Yats Cake Wallet के बाहर भी रहता है। धरती पर किसी भी वॉलेट पते को Yat से बदला जा सकता है!",
"learn_more" : "और अधिक जानें", "learn_more" : "और अधिक जानें",
"search": "खोज", "search": "खोज",
"search_language": "भाषा खोजें",
"search_currency": "मुद्रा खोजें",
"new_template" : "नया टेम्पलेट", "new_template" : "नया टेम्पलेट",
"electrum_address_disclaimer": "हर बार जब आप एक का उपयोग करते हैं तो हम नए पते उत्पन्न करते हैं, लेकिन पिछले पते काम करना जारी रखते हैं" "electrum_address_disclaimer": "हर बार जब आप एक का उपयोग करते हैं तो हम नए पते उत्पन्न करते हैं, लेकिन पिछले पते काम करना जारी रखते हैं"
} }

View file

@ -228,7 +228,7 @@
"settings_nodes" : "Nodovi", "settings_nodes" : "Nodovi",
"settings_current_node" : "Trenutni node", "settings_current_node" : "Trenutni node",
"settings_wallets" : "Novčanik", "settings_wallets" : "Novčanik",
"settings_display_balance_as" : "Prikaži stanje računa kao", "settings_display_balance" : "Prikaži stanje računa",
"settings_currency" : "Valuta", "settings_currency" : "Valuta",
"settings_fee_priority" : "Prioritet naknade", "settings_fee_priority" : "Prioritet naknade",
"settings_save_recipient_address" : "Spremi primateljevu adresu", "settings_save_recipient_address" : "Spremi primateljevu adresu",
@ -530,6 +530,8 @@
"third_intro_content" : "Yats žive i izvan Cake Wallet -a. Bilo koja adresa novčanika na svijetu može se zamijeniti Yat!", "third_intro_content" : "Yats žive i izvan Cake Wallet -a. Bilo koja adresa novčanika na svijetu može se zamijeniti Yat!",
"learn_more" : "Saznajte više", "learn_more" : "Saznajte više",
"search": "Traži", "search": "Traži",
"search_language": "Jezik pretraživanja",
"search_currency": "Traži valutu",
"new_template" : "novi predložak", "new_template" : "novi predložak",
"electrum_address_disclaimer": "Minden egyes alkalommal új címeket generálunk, de a korábbi címek továbbra is működnek" "electrum_address_disclaimer": "Minden egyes alkalommal új címeket generálunk, de a korábbi címek továbbra is működnek"
} }

View file

@ -228,7 +228,7 @@
"settings_nodes" : "Nodi", "settings_nodes" : "Nodi",
"settings_current_node" : "Nodo attuale", "settings_current_node" : "Nodo attuale",
"settings_wallets" : "Portafogli", "settings_wallets" : "Portafogli",
"settings_display_balance_as" : "Mostra saldo come", "settings_display_balance" : "Mostra saldo",
"settings_currency" : "Moneta", "settings_currency" : "Moneta",
"settings_fee_priority" : "Priorità commissione", "settings_fee_priority" : "Priorità commissione",
"settings_save_recipient_address" : "Salva indirizzo di destinazione", "settings_save_recipient_address" : "Salva indirizzo di destinazione",
@ -530,6 +530,8 @@
"third_intro_content" : "Anche Yats vive fuori da Cake Wallet. Qualsiasi indirizzo di portafoglio sulla terra può essere sostituito con un Yat!", "third_intro_content" : "Anche Yats vive fuori da Cake Wallet. Qualsiasi indirizzo di portafoglio sulla terra può essere sostituito con un Yat!",
"learn_more" : "Impara di più", "learn_more" : "Impara di più",
"search": "Ricerca", "search": "Ricerca",
"search_language": "Cerca lingua",
"search_currency": "Cerca valuta",
"new_template" : "Nuovo modello", "new_template" : "Nuovo modello",
"electrum_address_disclaimer": "Generiamo nuovi indirizzi ogni volta che ne utilizzi uno, ma gli indirizzi precedenti continuano a funzionare" "electrum_address_disclaimer": "Generiamo nuovi indirizzi ogni volta che ne utilizzi uno, ma gli indirizzi precedenti continuano a funzionare"
} }

View file

@ -228,7 +228,7 @@
"settings_nodes" : "ノード", "settings_nodes" : "ノード",
"settings_current_node" : "現在のノード", "settings_current_node" : "現在のノード",
"settings_wallets" : "財布", "settings_wallets" : "財布",
"settings_display_balance_as" : "残高を表示", "settings_display_balance" : "ディスプレイバランス",
"settings_currency" : "通貨", "settings_currency" : "通貨",
"settings_fee_priority" : "料金優先", "settings_fee_priority" : "料金優先",
"settings_save_recipient_address" : "受信者のアドレスを保存", "settings_save_recipient_address" : "受信者のアドレスを保存",
@ -530,6 +530,8 @@
"third_intro_content" : "YatsはCakeWalletの外にも住んでいます。 地球上のどのウォレットアドレスもYatに置き換えることができます", "third_intro_content" : "YatsはCakeWalletの外にも住んでいます。 地球上のどのウォレットアドレスもYatに置き換えることができます",
"learn_more" : "もっと詳しく知る", "learn_more" : "もっと詳しく知る",
"search": "検索", "search": "検索",
"search_language": "検索言語",
"search_currency": "検索通貨",
"new_template" : "新しいテンプレート", "new_template" : "新しいテンプレート",
"electrum_address_disclaimer": "使用するたびに新しいアドレスが生成されますが、以前のアドレスは引き続き機能します" "electrum_address_disclaimer": "使用するたびに新しいアドレスが生成されますが、以前のアドレスは引き続き機能します"
} }

View file

@ -228,7 +228,7 @@
"settings_nodes" : "노드", "settings_nodes" : "노드",
"settings_current_node" : "현재 노드", "settings_current_node" : "현재 노드",
"settings_wallets" : "지갑", "settings_wallets" : "지갑",
"settings_display_balance_as" : "잔액 표시", "settings_display_balance" : "디스플레이 잔액",
"settings_currency" : "통화", "settings_currency" : "통화",
"settings_fee_priority" : "수수료 우선", "settings_fee_priority" : "수수료 우선",
"settings_save_recipient_address" : "수신자 주소 저장", "settings_save_recipient_address" : "수신자 주소 저장",
@ -530,6 +530,8 @@
"third_intro_content" : "Yats는 Cake Wallet 밖에서도 살고 있습니다. 지구상의 모든 지갑 주소는 Yat!", "third_intro_content" : "Yats는 Cake Wallet 밖에서도 살고 있습니다. 지구상의 모든 지갑 주소는 Yat!",
"learn_more" : "더 알아보기", "learn_more" : "더 알아보기",
"search": "찾다", "search": "찾다",
"search_language": "검색 언어",
"search_currency": "통화 검색",
"new_template" : "새 템플릿", "new_template" : "새 템플릿",
"electrum_address_disclaimer": "사용할 때마다 새 주소가 생성되지만 이전 주소는 계속 작동합니다." "electrum_address_disclaimer": "사용할 때마다 새 주소가 생성되지만 이전 주소는 계속 작동합니다."
} }

View file

@ -228,7 +228,7 @@
"settings_nodes" : "knooppunten", "settings_nodes" : "knooppunten",
"settings_current_node" : "Huidige knooppunt", "settings_current_node" : "Huidige knooppunt",
"settings_wallets" : "Portemonnee", "settings_wallets" : "Portemonnee",
"settings_display_balance_as" : "Toon saldo als", "settings_display_balance" : "Saldo weergeven",
"settings_currency" : "Valuta", "settings_currency" : "Valuta",
"settings_fee_priority" : "Tariefprioriteit", "settings_fee_priority" : "Tariefprioriteit",
"settings_save_recipient_address" : "Adres ontvanger opslaan", "settings_save_recipient_address" : "Adres ontvanger opslaan",
@ -530,6 +530,8 @@
"third_intro_content" : "Yats wonen ook buiten Cake Wallet. Elk portemonnee-adres op aarde kan worden vervangen door een Yat!", "third_intro_content" : "Yats wonen ook buiten Cake Wallet. Elk portemonnee-adres op aarde kan worden vervangen door een Yat!",
"learn_more" : "Kom meer te weten", "learn_more" : "Kom meer te weten",
"search": "Zoekopdracht", "search": "Zoekopdracht",
"search_language": "Zoektaal",
"search_currency": "Zoek valuta",
"new_template" : "Nieuwe sjabloon", "new_template" : "Nieuwe sjabloon",
"electrum_address_disclaimer": "We generate new addresses each time you use one, but previous addresses continue to work" "electrum_address_disclaimer": "We generate new addresses each time you use one, but previous addresses continue to work"
} }

View file

@ -228,7 +228,7 @@
"settings_nodes" : "Węzły", "settings_nodes" : "Węzły",
"settings_current_node" : "Bieżący węzeł", "settings_current_node" : "Bieżący węzeł",
"settings_wallets" : "Portfele", "settings_wallets" : "Portfele",
"settings_display_balance_as" : "Wyświetl saldo jako", "settings_display_balance" : "Wyświetl saldo",
"settings_currency" : "Waluta", "settings_currency" : "Waluta",
"settings_fee_priority" : "Priorytet opłaty", "settings_fee_priority" : "Priorytet opłaty",
"settings_save_recipient_address" : "Zapisz adres odbiorcy", "settings_save_recipient_address" : "Zapisz adres odbiorcy",
@ -530,6 +530,8 @@
"third_intro_content" : "Yats mieszkają również poza Cake Wallet. Każdy adres portfela na ziemi można zastąpić Yat!", "third_intro_content" : "Yats mieszkają również poza Cake Wallet. Każdy adres portfela na ziemi można zastąpić Yat!",
"learn_more" : "Ucz się więcej", "learn_more" : "Ucz się więcej",
"search": "Szukaj", "search": "Szukaj",
"search_language": "Wyszukaj język",
"search_currency": "Wyszukaj walutę",
"new_template" : "Nowy szablon", "new_template" : "Nowy szablon",
"electrum_address_disclaimer": "Za każdym razem, gdy korzystasz z jednego z nich, generujemy nowe adresy, ale poprzednie adresy nadal działają" "electrum_address_disclaimer": "Za każdym razem, gdy korzystasz z jednego z nich, generujemy nowe adresy, ale poprzednie adresy nadal działają"
} }

View file

@ -228,7 +228,7 @@
"settings_nodes" : "Nós", "settings_nodes" : "Nós",
"settings_current_node" : "Nó atual", "settings_current_node" : "Nó atual",
"settings_wallets" : "Carteiras", "settings_wallets" : "Carteiras",
"settings_display_balance_as" : "Saldo a exibir", "settings_display_balance" : "Exibir saldo",
"settings_currency" : "Moeda", "settings_currency" : "Moeda",
"settings_fee_priority" : "Prioridade da taxa", "settings_fee_priority" : "Prioridade da taxa",
"settings_save_recipient_address" : "Salvar endereço do destinatário", "settings_save_recipient_address" : "Salvar endereço do destinatário",
@ -530,6 +530,8 @@
"third_intro_content" : "Yats também mora fora da Cake Wallet. Qualquer endereço de carteira na Terra pode ser substituído por um Yat!", "third_intro_content" : "Yats também mora fora da Cake Wallet. Qualquer endereço de carteira na Terra pode ser substituído por um Yat!",
"learn_more" : "Saber mais", "learn_more" : "Saber mais",
"search": "Procurar", "search": "Procurar",
"search_language": "Idioma de pesquisa",
"search_currency": "Pesquisar moeda",
"new_template" : "Novo modelo", "new_template" : "Novo modelo",
"electrum_address_disclaimer": "Geramos novos endereços cada vez que você usa um, mas os endereços anteriores continuam funcionando" "electrum_address_disclaimer": "Geramos novos endereços cada vez que você usa um, mas os endereços anteriores continuam funcionando"
} }

View file

@ -228,7 +228,7 @@
"settings_nodes" : "Ноды", "settings_nodes" : "Ноды",
"settings_current_node" : "Текущая нода", "settings_current_node" : "Текущая нода",
"settings_wallets" : "Кошельки", "settings_wallets" : "Кошельки",
"settings_display_balance_as" : "Отображать баланс как", "settings_display_balance" : "Отображать баланс",
"settings_currency" : "Валюта", "settings_currency" : "Валюта",
"settings_fee_priority" : "Приоритет транзакции", "settings_fee_priority" : "Приоритет транзакции",
"settings_save_recipient_address" : "Сохранять адрес получателя", "settings_save_recipient_address" : "Сохранять адрес получателя",
@ -530,6 +530,8 @@
"third_intro_content" : "Yat находятся за пределами Cake Wallet. Любой адрес кошелька на земле можно заменить на Yat!", "third_intro_content" : "Yat находятся за пределами Cake Wallet. Любой адрес кошелька на земле можно заменить на Yat!",
"learn_more" : "Узнать больше", "learn_more" : "Узнать больше",
"search": "Поиск", "search": "Поиск",
"search_language": "Язык поиска",
"search_currency": "Валюта поиска",
"new_template" : "Новый шаблон", "new_template" : "Новый шаблон",
"electrum_address_disclaimer": "Мы генерируем новые адреса каждый раз, когда вы их используете, но предыдущие адреса продолжают работать." "electrum_address_disclaimer": "Мы генерируем новые адреса каждый раз, когда вы их используете, но предыдущие адреса продолжают работать."
} }

View file

@ -227,7 +227,7 @@
"settings_nodes" : "Вузли", "settings_nodes" : "Вузли",
"settings_current_node" : "Поточний вузол", "settings_current_node" : "Поточний вузол",
"settings_wallets" : "Гаманці", "settings_wallets" : "Гаманці",
"settings_display_balance_as" : "Відображати баланс як", "settings_display_balance" : "Відображати баланс",
"settings_currency" : "Валюта", "settings_currency" : "Валюта",
"settings_fee_priority" : "Пріоритет транзакції", "settings_fee_priority" : "Пріоритет транзакції",
"settings_save_recipient_address" : "Зберігати адресу отримувача", "settings_save_recipient_address" : "Зберігати адресу отримувача",
@ -529,6 +529,8 @@
"third_intro_content" : "Yat знаходиться за межами Cake Wallet. Будь-яку адресу гаманця на землі можна замінити на Yat!", "third_intro_content" : "Yat знаходиться за межами Cake Wallet. Будь-яку адресу гаманця на землі можна замінити на Yat!",
"learn_more" : "Дізнатися більше", "learn_more" : "Дізнатися більше",
"search": "Пошук", "search": "Пошук",
"search_language": "Мова пошуку",
"search_currency": "Шукати валюту",
"new_template" : "Новий шаблон", "new_template" : "Новий шаблон",
"electrum_address_disclaimer": "Ми створюємо нові адреси щоразу, коли ви використовуєте їх, але попередні адреси продовжують працювати" "electrum_address_disclaimer": "Ми створюємо нові адреси щоразу, коли ви використовуєте їх, але попередні адреси продовжують працювати"
} }

View file

@ -228,7 +228,7 @@
"settings_nodes" : "节点数", "settings_nodes" : "节点数",
"settings_current_node" : "当前节点", "settings_current_node" : "当前节点",
"settings_wallets" : "钱包", "settings_wallets" : "钱包",
"settings_display_balance_as" : "将余额显示为", "settings_display_balance" : "显示余额为",
"settings_currency" : "货币", "settings_currency" : "货币",
"settings_fee_priority" : "交易优先级", "settings_fee_priority" : "交易优先级",
"settings_save_recipient_address" : "保存收件人地址", "settings_save_recipient_address" : "保存收件人地址",
@ -528,6 +528,8 @@
"third_intro_content" : "Yats 也住在 Cake Wallet 之外。 地球上任何一個錢包地址都可以用一個Yat來代替", "third_intro_content" : "Yats 也住在 Cake Wallet 之外。 地球上任何一個錢包地址都可以用一個Yat來代替",
"learn_more" : "了解更多", "learn_more" : "了解更多",
"search": "搜索", "search": "搜索",
"search_language": "搜索语言",
"search_currency": "搜索货币",
"new_template" : "新模板", "new_template" : "新模板",
"electrum_address_disclaimer": "每次您使用一个地址时,我们都会生成新地址,但之前的地址仍然有效" "electrum_address_disclaimer": "每次您使用一个地址时,我们都会生成新地址,但之前的地址仍然有效"
} }