diff --git a/assets/text/Monerocom_Release_Notes.txt b/assets/text/Monerocom_Release_Notes.txt index 28449764a..1b5e93dc1 100644 --- a/assets/text/Monerocom_Release_Notes.txt +++ b/assets/text/Monerocom_Release_Notes.txt @@ -1,6 +1,5 @@ -Opt-in to Cake 2FA for security. More info: https://guides.cakewallet.com/docs/advanced-features/authentication/#cake-2fa -Auto generate restore height for Monero restore QR codes -Hausa and Yoruba languages -Additional privacy settings -Update Monero to 0.18.2.2 -Refactoring and bug fixes +Ability to Auto generate new Monero subaddress when used +Coin Control for Monero +In-app Live Chat support +Additional themes +Bug Fixes and performance enhancements diff --git a/assets/text/Release_Notes.txt b/assets/text/Release_Notes.txt index 28449764a..0bcf0ade6 100644 --- a/assets/text/Release_Notes.txt +++ b/assets/text/Release_Notes.txt @@ -1,6 +1,6 @@ -Opt-in to Cake 2FA for security. More info: https://guides.cakewallet.com/docs/advanced-features/authentication/#cake-2fa -Auto generate restore height for Monero restore QR codes -Hausa and Yoruba languages -Additional privacy settings -Update Monero to 0.18.2.2 -Refactoring and bug fixes +Restore Ethereum from private key and QR +Ability to Auto generate new Monero subaddress when used +Coin Control for Monero +In-app Live Chat support +Additional themes +Bug Fixes and performance enhancements diff --git a/cw_bitcoin/lib/bitcoin_wallet_service.dart b/cw_bitcoin/lib/bitcoin_wallet_service.dart index b36a1d021..5aa5ab875 100644 --- a/cw_bitcoin/lib/bitcoin_wallet_service.dart +++ b/cw_bitcoin/lib/bitcoin_wallet_service.dart @@ -49,7 +49,9 @@ class BitcoinWalletService extends WalletService< final walletInfo = walletInfoSource.values .firstWhereOrNull((info) => info.id == WalletBase.idFor(name, getType()))!; final wallet = await BitcoinWalletBase.open( - password: password, name: name, walletInfo: walletInfo, + password: password, + name: name, + walletInfo: walletInfo, unspentCoinsInfo: unspentCoinsInfoSource, encryptionFileUtils: encryptionFileUtilsFor(isDirect)); await wallet.init(); diff --git a/cw_bitcoin/lib/litecoin_wallet_service.dart b/cw_bitcoin/lib/litecoin_wallet_service.dart index 093b9096f..a06a8904f 100644 --- a/cw_bitcoin/lib/litecoin_wallet_service.dart +++ b/cw_bitcoin/lib/litecoin_wallet_service.dart @@ -50,7 +50,9 @@ class LitecoinWalletService extends WalletService< final walletInfo = walletInfoSource.values .firstWhereOrNull((info) => info.id == WalletBase.idFor(name, getType()))!; final wallet = await LitecoinWalletBase.open( - password: password, name: name, walletInfo: walletInfo, + password: password, + name: name, + walletInfo: walletInfo, unspentCoinsInfo: unspentCoinsInfoSource, encryptionFileUtils: encryptionFileUtilsFor(isDirect)); await wallet.init(); diff --git a/cw_core/lib/wallet_info.dart b/cw_core/lib/wallet_info.dart index 9a41944da..a59b865a6 100644 --- a/cw_core/lib/wallet_info.dart +++ b/cw_core/lib/wallet_info.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'package:cw_core/address_info.dart'; import 'package:cw_core/hive_type_ids.dart'; -import 'package:cw_core/wallet_type.dart'; import 'package:hive/hive.dart'; import 'package:cw_core/wallet_type.dart'; import 'dart:async'; diff --git a/cw_ethereum/lib/ethereum_wallet_service.dart b/cw_ethereum/lib/ethereum_wallet_service.dart index fa7d7dbfa..289e7d25b 100644 --- a/cw_ethereum/lib/ethereum_wallet_service.dart +++ b/cw_ethereum/lib/ethereum_wallet_service.dart @@ -14,7 +14,7 @@ import 'package:bip39/bip39.dart' as bip39; import 'package:collection/collection.dart'; class EthereumWalletService extends WalletService { + EthereumRestoreWalletFromSeedCredentials, EthereumRestoreWalletFromPrivateKey> { EthereumWalletService(this.walletInfoSource, this.isDirect); final Box walletInfoSource; @@ -75,6 +75,7 @@ class EthereumWalletService extends WalletService secrets.moonPayApiKey; - static String get _secretKey => secrets.moonPaySecretKey; + + static String themeToMoonPayTheme(ThemeBase theme) { + switch (theme.type) { + case ThemeType.bright: + return 'light'; + case ThemeType.light: + return 'light'; + case ThemeType.dark: + return 'dark'; + } + } + + static String get _apiKey => secrets.moonPayApiKey; + + static String get _secretKey => secrets.moonPaySecretKey; final bool isTest; final String baseUrl; - Future requestUrl({required CryptoCurrency currency, required String refundWalletAddress}) async { + Future requestUrl( + {required CryptoCurrency currency, + required String refundWalletAddress, + required SettingsStore settingsStore}) async { + final customParams = { + 'theme': themeToMoonPayTheme(settingsStore.currentTheme), + 'language': settingsStore.languageCode, + 'colorCode': settingsStore.currentTheme.type == ThemeType.dark + ? '#${Palette.blueCraiola.value.toRadixString(16).substring(2, 8)}' + : '#${Palette.moderateSlateBlue.value.toRadixString(16).substring(2, 8)}', + }; + final originalUri = Uri.https( - baseUrl, '', { - 'apiKey': _apiKey, - 'defaultBaseCurrencyCode': currency.toString().toLowerCase(), - 'refundWalletAddress': refundWalletAddress - }); + baseUrl, + '', + { + 'apiKey': _apiKey, + 'defaultBaseCurrencyCode': currency.toString().toLowerCase(), + 'refundWalletAddress': refundWalletAddress + }..addAll(customParams)); final messageBytes = utf8.encode('?${originalUri.query}'); final key = utf8.encode(_secretKey); final hmac = Hmac(sha256, key); diff --git a/lib/core/backup_service.dart b/lib/core/backup_service.dart index 9ff7fa98e..9b035ea25 100644 --- a/lib/core/backup_service.dart +++ b/lib/core/backup_service.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; import 'package:cw_core/root_dir.dart'; +import 'package:cake_wallet/entities/cake_2fa_preset_options.dart'; import 'package:cw_core/wallet_type.dart'; import 'package:flutter/foundation.dart'; import 'package:hive/hive.dart'; diff --git a/lib/core/wallet_loading_service.dart b/lib/core/wallet_loading_service.dart index d8221ab16..9596015bc 100644 --- a/lib/core/wallet_loading_service.dart +++ b/lib/core/wallet_loading_service.dart @@ -7,14 +7,11 @@ import 'package:cw_core/wallet_type.dart'; import 'package:shared_preferences/shared_preferences.dart'; class WalletLoadingService { - WalletLoadingService( - this.sharedPreferences, - this.keyService, - this.walletServiceFactory); - - final SharedPreferences sharedPreferences; - final KeyService keyService; - final WalletService Function(WalletType type) walletServiceFactory; + WalletLoadingService(this.sharedPreferences, this.keyService, this.walletServiceFactory); + + final SharedPreferences sharedPreferences; + final KeyService keyService; + final WalletService Function(WalletType type) walletServiceFactory; Future renameWallet(WalletType type, String name, String newName, {String? password}) async { @@ -38,10 +35,10 @@ class WalletLoadingService { } } - Future load(WalletType type, String name, {String? password}) async { - final walletService = walletServiceFactory.call(type); - final walletPassword = password ?? (await keyService.getWalletPassword(walletName: name)); - final wallet = await walletService.openWallet(name, password); + Future load(WalletType type, String name, {String? password}) async { + final walletService = walletServiceFactory.call(type); + final walletPassword = password ?? (await keyService.getWalletPassword(walletName: name)); + final wallet = await walletService.openWallet(name, walletPassword); if (type == WalletType.monero) { await updateMoneroWalletPassword(wallet); diff --git a/lib/di.dart b/lib/di.dart index 0151ac7a1..95108c15b 100644 --- a/lib/di.dart +++ b/lib/di.dart @@ -20,6 +20,7 @@ import 'package:cake_wallet/ionia/ionia_tip.dart'; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/src/screens/anonpay_details/anonpay_details_page.dart'; import 'package:cake_wallet/src/screens/buy/onramper_page.dart'; +import 'package:cake_wallet/src/screens/buy/webview_page.dart'; import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart'; import 'package:cake_wallet/src/screens/dashboard/widgets/transactions_page.dart'; import 'package:cake_wallet/src/screens/dashboard/desktop_dashboard_page.dart'; @@ -874,6 +875,11 @@ Future setup({ getIt.registerFactory(() => SupportPage(getIt.get())); + getIt.registerFactory(() => + SupportChatPage(getIt.get(), secureStorage: getIt.get())); + + getIt.registerFactory(() => SupportOtherLinksPage(getIt.get())); + getIt.registerFactory(() { final wallet = getIt.get().wallet; diff --git a/lib/entities/get_encryption_key.dart b/lib/entities/get_encryption_key.dart index 29effe644..af84bd447 100644 --- a/lib/entities/get_encryption_key.dart +++ b/lib/entities/get_encryption_key.dart @@ -1,9 +1,10 @@ import 'package:cake_wallet/core/secure_storage.dart'; -import 'package:cw_core/cake_hive.dart'; +import 'package:hive/hive.dart'; Future> getEncryptionKey( {required String forKey, required SecureStorage secureStorage}) async { - final stringifiedKey = await secureStorage.read(key: 'transactionDescriptionsBoxKey'); + final stringifiedKey = + await secureStorage.read(key: 'transactionDescriptionsBoxKey'); List key; if (stringifiedKey == null) { diff --git a/lib/exchange/changenow/changenow_exchange_provider.dart b/lib/exchange/changenow/changenow_exchange_provider.dart index da4e7eccb..997ff206d 100644 --- a/lib/exchange/changenow/changenow_exchange_provider.dart +++ b/lib/exchange/changenow/changenow_exchange_provider.dart @@ -301,4 +301,4 @@ class ChangeNowExchangeProvider extends ExchangeProvider { return tag.toLowerCase(); } } -} \ No newline at end of file +} diff --git a/lib/main.dart b/lib/main.dart index 190974bf3..b5faafb70 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -8,8 +8,8 @@ import 'package:cake_wallet/store/yat/yat_store.dart'; import 'package:cake_wallet/utils/exception_handler.dart'; import 'package:cw_core/address_info.dart'; import 'package:cw_core/root_dir.dart'; -import 'package:cw_core/root_dir.dart'; import 'package:cake_wallet/utils/responsive_layout_util.dart'; +import 'package:cw_core/hive_type_ids.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; diff --git a/lib/reactions/check_connection.dart b/lib/reactions/check_connection.dart index 6b7b79941..a29b670e8 100644 --- a/lib/reactions/check_connection.dart +++ b/lib/reactions/check_connection.dart @@ -1,9 +1,9 @@ import 'dart:async'; +import 'package:connectivity/connectivity.dart'; import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/sync_status.dart'; import 'package:cake_wallet/store/settings_store.dart'; -import 'package:connectivity/connectivity.dart'; Timer? _checkConnectionTimer; diff --git a/lib/router.dart b/lib/router.dart index 354337aac..c04295383 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -471,6 +471,15 @@ Route createRoute(RouteSettings settings) { fullscreenDialog: true, builder: (_) => getIt.get()); + case Routes.supportLiveChat: + return CupertinoPageRoute( + builder: (_) => getIt.get()); + + case Routes.supportOtherLinks: + return CupertinoPageRoute( + fullscreenDialog: true, + builder: (_) => getIt.get()); + case Routes.unspentCoinsList: return MaterialPageRoute( builder: (_) => getIt.get()); diff --git a/lib/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart b/lib/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart index c5899ca68..92b2886b9 100644 --- a/lib/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart +++ b/lib/src/screens/dashboard/desktop_widgets/desktop_wallet_selection_dropdown.dart @@ -9,6 +9,7 @@ import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/dropdown_item_ import 'package:cake_wallet/src/screens/wallet_unlock/wallet_unlock_arguments.dart'; import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart'; import 'package:cake_wallet/themes/extensions/menu_theme.dart'; +import 'package:cake_wallet/themes/extensions/menu_theme.dart'; import 'package:cake_wallet/store/settings_store.dart'; import 'package:cake_wallet/utils/show_bar.dart'; import 'package:cake_wallet/utils/show_pop_up.dart'; diff --git a/lib/src/screens/dashboard/widgets/transactions_page.dart b/lib/src/screens/dashboard/widgets/transactions_page.dart index be5ad1ab0..537b2c69d 100644 --- a/lib/src/screens/dashboard/widgets/transactions_page.dart +++ b/lib/src/screens/dashboard/widgets/transactions_page.dart @@ -71,70 +71,70 @@ class TransactionsPage extends StatelessWidget { if (item is TransactionListItem) { final transaction = item.transaction; - return Observer( - builder: (_) => TransactionRow( - onTap: () => Navigator.of(context) - .pushNamed(Routes.transactionDetails, arguments: transaction), - direction: transaction.direction, - formattedDate: DateFormat('HH:mm').format(transaction.date), - formattedAmount: item.formattedCryptoAmount, - formattedFiatAmount: - dashboardViewModel.balanceViewModel.isFiatDisabled - ? '' - : item.formattedFiatAmount, - isPending: transaction.isPending, - title: item.formattedTitle + item.formattedStatus)); - } + return Observer( + builder: (_) => TransactionRow( + onTap: () => Navigator.of(context) + .pushNamed(Routes.transactionDetails, arguments: transaction), + direction: transaction.direction, + formattedDate: DateFormat('HH:mm').format(transaction.date), + formattedAmount: item.formattedCryptoAmount, + formattedFiatAmount: + dashboardViewModel.balanceViewModel.isFiatDisabled + ? '' + : item.formattedFiatAmount, + isPending: transaction.isPending, + title: item.formattedTitle + item.formattedStatus)); + } if (item is AnonpayTransactionListItem) { final transactionInfo = item.transaction; - return AnonpayTransactionRow( - onTap: () => Navigator.of(context) - .pushNamed(Routes.anonPayDetailsPage, arguments: transactionInfo), - currency: transactionInfo.fiatAmount != null - ? transactionInfo.fiatEquiv ?? '' - : CryptoCurrency.fromFullName(transactionInfo.coinTo) - .name - .toUpperCase(), - provider: transactionInfo.provider, - amount: transactionInfo.fiatAmount?.toString() ?? - (transactionInfo.amountTo?.toString() ?? ''), - createdAt: DateFormat('HH:mm').format(transactionInfo.createdAt), - ); - } + return AnonpayTransactionRow( + onTap: () => Navigator.of(context) + .pushNamed(Routes.anonPayDetailsPage, arguments: transactionInfo), + currency: transactionInfo.fiatAmount != null + ? transactionInfo.fiatEquiv ?? '' + : CryptoCurrency.fromFullName(transactionInfo.coinTo) + .name + .toUpperCase(), + provider: transactionInfo.provider, + amount: transactionInfo.fiatAmount?.toString() ?? + (transactionInfo.amountTo?.toString() ?? ''), + createdAt: DateFormat('HH:mm').format(transactionInfo.createdAt), + ); + } if (item is TradeListItem) { final trade = item.trade; - return Observer( - builder: (_) => TradeRow( - onTap: () => Navigator.of(context) - .pushNamed(Routes.tradeDetails, arguments: trade), - provider: trade.provider, - from: trade.from, - to: trade.to, - createdAtFormattedDate: trade.createdAt != null - ? DateFormat('HH:mm').format(trade.createdAt!) - : null, - formattedAmount: item.tradeFormattedAmount)); - } + return Observer( + builder: (_) => TradeRow( + onTap: () => Navigator.of(context) + .pushNamed(Routes.tradeDetails, arguments: trade), + provider: trade.provider, + from: trade.from, + to: trade.to, + createdAtFormattedDate: trade.createdAt != null + ? DateFormat('HH:mm').format(trade.createdAt!) + : null, + formattedAmount: item.tradeFormattedAmount)); + } if (item is OrderListItem) { final order = item.order; - return Observer( - builder: (_) => OrderRow( - onTap: () => Navigator.of(context) - .pushNamed(Routes.orderDetails, arguments: order), - provider: order.provider, - from: order.from!, - to: order.to!, - createdAtFormattedDate: - DateFormat('HH:mm').format(order.createdAt), - formattedAmount: item.orderFormattedAmount, - )); - } + return Observer( + builder: (_) => OrderRow( + onTap: () => Navigator.of(context) + .pushNamed(Routes.orderDetails, arguments: order), + provider: order.provider, + from: order.from!, + to: order.to!, + createdAtFormattedDate: + DateFormat('HH:mm').format(order.createdAt), + formattedAmount: item.orderFormattedAmount, + )); + } return Container(color: Colors.transparent, height: 1); }) diff --git a/lib/src/screens/new_wallet/new_wallet_page.dart b/lib/src/screens/new_wallet/new_wallet_page.dart index cc614453e..a8b8937ae 100644 --- a/lib/src/screens/new_wallet/new_wallet_page.dart +++ b/lib/src/screens/new_wallet/new_wallet_page.dart @@ -212,7 +212,7 @@ class _WalletNameFormState extends State { fontSize: 18.0, fontWeight: FontWeight.w500, color: Theme.of(context).extension()!.hintTextColor), - hintText: S.of(context).repeate_wallet_password, + hintText: S.of(context).repeat_wallet_password, focusedBorder: UnderlineInputBorder( borderSide: BorderSide( color: Theme.of(context).extension()!.underlineColor, diff --git a/lib/src/screens/restore/wallet_restore_from_keys_form.dart b/lib/src/screens/restore/wallet_restore_from_keys_form.dart index 373955767..ba09aa12c 100644 --- a/lib/src/screens/restore/wallet_restore_from_keys_form.dart +++ b/lib/src/screens/restore/wallet_restore_from_keys_form.dart @@ -23,13 +23,13 @@ class WalletRestoreFromKeysFrom extends StatefulWidget { final Function(bool) onHeightOrDateEntered; final WalletRestoreViewModel walletRestoreViewModel; + final bool displayPrivateKeyField; final bool displayWalletPassword; final void Function(String)? onPasswordChange; final void Function(String)? onRepeatedPasswordChange; @override - WalletRestoreFromKeysFromState createState() => - WalletRestoreFromKeysFromState(displayWalletPassword: displayWalletPassword); + WalletRestoreFromKeysFromState createState() => WalletRestoreFromKeysFromState(displayWalletPassword: displayWalletPassword); } class WalletRestoreFromKeysFromState extends State { @@ -152,7 +152,7 @@ class WalletRestoreFromKeysFromState extends State { padding: EdgeInsets.only(top: 20.0), child: BaseTextFormField( controller: repeatedPasswordTextEditingController, - hintText: S.of(context).repeate_wallet_password, + hintText: S.of(context).repeat_wallet_password, obscureText: true))], Container(height: 20), _restoreFromKeysFormFields(), diff --git a/lib/src/screens/restore/wallet_restore_from_seed_form.dart b/lib/src/screens/restore/wallet_restore_from_seed_form.dart index 9c193daf3..a55fceb0d 100644 --- a/lib/src/screens/restore/wallet_restore_from_seed_form.dart +++ b/lib/src/screens/restore/wallet_restore_from_seed_form.dart @@ -148,7 +148,7 @@ class WalletRestoreFromSeedFormState extends State { obscureText: true), BaseTextFormField( controller: repeatedPasswordTextEditingController, - hintText: S.of(context).repeate_wallet_password, + hintText: S.of(context).repeat_wallet_password, obscureText: true)], if (widget.displayLanguageSelector) GestureDetector( diff --git a/lib/src/screens/settings/display_settings_page.dart b/lib/src/screens/settings/display_settings_page.dart index 1fa06bbc2..4be30b57a 100644 --- a/lib/src/screens/settings/display_settings_page.dart +++ b/lib/src/screens/settings/display_settings_page.dart @@ -20,60 +20,66 @@ class DisplaySettingsPage extends BasePage { @override Widget body(BuildContext context) { - return Observer(builder: (_) { - return Container( - padding: EdgeInsets.only(top: 10), - child: Column( - children: [ - SettingsSwitcherCell( - title: S.current.settings_display_balance, - value: _displaySettingsViewModel.shouldDisplayBalance, - onValueChange: (_, bool value) { - _displaySettingsViewModel.setShouldDisplayBalance(value); - }), - SettingsSwitcherCell( - title: S.current.show_market_place, - value: _displaySettingsViewModel.shouldShowMarketPlaceInDashboard, - onValueChange: (_, bool value) { - _displaySettingsViewModel.setShouldShowMarketPlaceInDashbaord(value); - }, - ), - //if (!isHaven) it does not work correctly - if(!_displaySettingsViewModel.disabledFiatApiMode) - SettingsPickerCell( - title: S.current.settings_currency, - searchHintText: S.current.search_currency, - items: FiatCurrency.all, - selectedItem: _displaySettingsViewModel.fiatCurrency, - onItemSelected: (FiatCurrency currency) => _displaySettingsViewModel.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); + return SingleChildScrollView( + child: Observer(builder: (_) { + return Container( + padding: EdgeInsets.only(top: 10), + child: Column( + children: [ + SettingsSwitcherCell( + title: S.current.settings_display_balance, + value: _displaySettingsViewModel.shouldDisplayBalance, + onValueChange: (_, bool value) { + _displaySettingsViewModel.setShouldDisplayBalance(value); + }), + SettingsSwitcherCell( + title: S.current.show_market_place, + value: _displaySettingsViewModel.shouldShowMarketPlaceInDashboard, + onValueChange: (_, bool value) { + _displaySettingsViewModel.setShouldShowMarketPlaceInDashbaord(value); }, ), - SettingsPickerCell( - title: S.current.settings_change_language, - searchHintText: S.current.search_language, - items: LanguageService.list.keys.toList(), - displayItem: (dynamic code) { - return LanguageService.list[code] ?? ''; - }, - selectedItem: _displaySettingsViewModel.languageCode, - onItemSelected: _displaySettingsViewModel.onLanguageSelected, - 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) ?? false; - }, - ), - if (ResponsiveLayoutUtil.instance.isMobile && DeviceInfo.instance.isMobile) - SettingsThemeChoicesCell(_displaySettingsViewModel), - ], - ), - ); - }); + //if (!isHaven) it does not work correctly + if (!_displaySettingsViewModel.disabledFiatApiMode) + SettingsPickerCell( + title: S.current.settings_currency, + searchHintText: S.current.search_currency, + items: FiatCurrency.all, + selectedItem: _displaySettingsViewModel.fiatCurrency, + onItemSelected: (FiatCurrency currency) => + _displaySettingsViewModel.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); + }, + ), + SettingsPickerCell( + title: S.current.settings_change_language, + searchHintText: S.current.search_language, + items: LanguageService.list.keys.toList(), + displayItem: (dynamic code) { + return LanguageService.list[code] ?? ''; + }, + selectedItem: _displaySettingsViewModel.languageCode, + onItemSelected: _displaySettingsViewModel.onLanguageSelected, + 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) ?? false; + }, + ), + if (ResponsiveLayoutUtil.instance.isMobile && DeviceInfo.instance.isMobile) + SettingsThemeChoicesCell(_displaySettingsViewModel), + ], + ), + ); + }), + ); } } diff --git a/lib/src/screens/support/widgets/support_tiles.dart b/lib/src/screens/support/widgets/support_tiles.dart index 1db87953b..7107efac6 100644 --- a/lib/src/screens/support/widgets/support_tiles.dart +++ b/lib/src/screens/support/widgets/support_tiles.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/themes/extensions/cake_text_theme.dart'; import 'package:cake_wallet/themes/extensions/transaction_trade_theme.dart'; import 'package:flutter/material.dart'; @@ -44,7 +45,7 @@ class SupportTile extends StatelessWidget { style: TextStyle( fontSize: 20, fontWeight: FontWeight.w500, - color: Theme.of(context).dialogTheme.backgroundColor, + color: Theme.of(context).extension()!.titleColor, ), ), Padding( diff --git a/lib/src/screens/support_chat/support_chat_page.dart b/lib/src/screens/support_chat/support_chat_page.dart new file mode 100644 index 000000000..c7aa3a881 --- /dev/null +++ b/lib/src/screens/support_chat/support_chat_page.dart @@ -0,0 +1,38 @@ +import 'package:cake_wallet/generated/i18n.dart'; +import 'package:cake_wallet/src/screens/base_page.dart'; +import 'package:cake_wallet/src/screens/support_chat/widgets/chatwoot_widget.dart'; +import 'package:cake_wallet/view_model/support_view_model.dart'; +import 'package:flutter/material.dart'; +import 'package:cake_wallet/core/secure_storage.dart'; + + +class SupportChatPage extends BasePage { + SupportChatPage(this.supportViewModel, {required this.secureStorage}); + + final SupportViewModel supportViewModel; + final SecureStorage secureStorage; + + @override + String get title => S.current.settings_support; + + @override + AppBarStyle get appBarStyle => AppBarStyle.regular; + + @override + Widget body(BuildContext context) => FutureBuilder( + future: getCookie(), + builder: (BuildContext context, AsyncSnapshot snapshot) { + print(snapshot.data); + if (snapshot.hasData) + return ChatwootWidget( + secureStorage, + supportUrl: supportViewModel.fetchUrl(authToken: snapshot.data!) + ); + return Container(); + }, + ); + + Future getCookie() async { + return await secureStorage.read(key: COOKIE_KEY) ?? ""; + } +} diff --git a/lib/src/screens/support_chat/widgets/chatwoot_widget.dart b/lib/src/screens/support_chat/widgets/chatwoot_widget.dart new file mode 100644 index 000000000..72e48c3ef --- /dev/null +++ b/lib/src/screens/support_chat/widgets/chatwoot_widget.dart @@ -0,0 +1,62 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; +import 'package:cake_wallet/core/secure_storage.dart'; + +const COOKIE_KEY = 'chatwootCookie'; + +class ChatwootWidget extends StatefulWidget { + ChatwootWidget(this.secureStorage, {required this.supportUrl}); + + final SecureStorage secureStorage; + final String supportUrl; + + @override + ChatwootWidgetState createState() => ChatwootWidgetState(); +} + +class ChatwootWidgetState extends State { + final GlobalKey _webViewkey = GlobalKey(); + + @override + Widget build(BuildContext context) => InAppWebView( + key: _webViewkey, + initialOptions: InAppWebViewGroupOptions( + crossPlatform: InAppWebViewOptions(transparentBackground: true), + ), + initialUrlRequest: URLRequest(url: Uri.tryParse(widget.supportUrl)), + onWebViewCreated: (InAppWebViewController controller) { + controller.addWebMessageListener( + WebMessageListener( + jsObjectName: 'ReactNativeWebView', + onPostMessage: (String? message, Uri? sourceOrigin, bool isMainFrame, + JavaScriptReplyProxy replyProxy) { + final shortenedMessage = message?.substring(16); + if (shortenedMessage != null && isJsonString(shortenedMessage)) { + final parsedMessage = jsonDecode(shortenedMessage); + final eventType = parsedMessage["event"]; + if (eventType == 'loaded') { + final authToken = parsedMessage["config"]["authToken"]; + print(authToken); + storeCookie(authToken as String); + } + } + }, + ), + ); + }, + ); + + bool isJsonString(String str) { + try { + jsonDecode(str); + } catch (e) { + return false; + } + return true; + } + + Future storeCookie(String value) async => + await widget.secureStorage.write(key: COOKIE_KEY, value: value); +} diff --git a/lib/src/widgets/search_bar_widget.dart b/lib/src/widgets/search_bar_widget.dart index 731fbf632..dc604934f 100644 --- a/lib/src/widgets/search_bar_widget.dart +++ b/lib/src/widgets/search_bar_widget.dart @@ -17,7 +17,7 @@ class SearchBarWidget extends StatelessWidget { Widget build(BuildContext context) { return TextFormField( controller: searchController, - style: TextStyle(color: Theme.of(context).extension()!.searchTextColor), + style: TextStyle(color: Theme.of(context).extension()!.searchHintColor), decoration: InputDecoration( hintText: hintText ?? S.of(context).search_currency, hintStyle: TextStyle(color: Theme.of(context).extension()!.searchHintColor), diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart index cb2eea111..79afe4a44 100644 --- a/lib/store/settings_store.dart +++ b/lib/store/settings_store.dart @@ -346,6 +346,7 @@ abstract class SettingsStoreBase with Store { static const defaultPinLength = 4; static const defaultActionsMode = 11; static const defaultPinCodeTimeOutDuration = PinCodeRequiredDuration.tenminutes; + static final walletPasswordDirectInput = Platform.isLinux; static const defaultAutoGenerateSubaddressStatus = AutoGenerateSubaddressStatus.initialized; static final walletPasswordDirectInput = Platform.isLinux; diff --git a/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart b/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart index 9ecb381fd..657a0cb74 100644 --- a/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart +++ b/lib/view_model/unspent_coins/unspent_coins_list_view_model.dart @@ -3,11 +3,9 @@ import 'package:cake_wallet/bitcoin/bitcoin.dart'; import 'package:cake_wallet/entities/unspent_transaction_output.dart'; import 'package:cake_wallet/monero/monero.dart'; import 'package:cake_wallet/view_model/unspent_coins/unspent_coins_item.dart'; -import 'package:cw_bitcoin/bitcoin_wallet.dart'; import 'package:cw_core/unspent_coins_info.dart'; import 'package:cw_core/wallet_base.dart'; import 'package:cw_core/wallet_type.dart'; -import 'package:cw_monero/monero_wallet.dart'; import 'package:hive/hive.dart'; import 'package:mobx/mobx.dart'; diff --git a/model_generator.sh b/model_generator.sh index f45fe9637..2a06b11d0 100755 --- a/model_generator.sh +++ b/model_generator.sh @@ -1,8 +1,8 @@ #!/bin/sh -cd cw_core && flutter pub get && flutter packages pub run build_runner build --delete-conflicting-outputs && cd .. -cd cw_monero && flutter pub get && flutter packages pub run build_runner build --delete-conflicting-outputs && cd .. -cd cw_bitcoin && flutter pub get && flutter packages pub run build_runner build --delete-conflicting-outputs && cd .. -cd cw_haven && flutter pub get && flutter packages pub run build_runner build --delete-conflicting-outputs && cd .. -cd cw_ethereum && flutter pub get && flutter packages pub run build_runner build --delete-conflicting-outputs && cd .. -flutter packages pub run build_runner build --delete-conflicting-outputs \ No newline at end of file +cd cw_core; flutter pub get; flutter packages pub run build_runner build --delete-conflicting-outputs; cd .. +cd cw_monero; flutter pub get; flutter packages pub run build_runner build --delete-conflicting-outputs; cd .. +cd cw_bitcoin; flutter pub get; flutter packages pub run build_runner build --delete-conflicting-outputs; cd .. +cd cw_haven; flutter pub get; flutter packages pub run build_runner build --delete-conflicting-outputs; cd .. +cd cw_ethereum; flutter pub get; flutter packages pub run build_runner build --delete-conflicting-outputs; cd .. +dart run build_runner build --delete-conflicting-outputs diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 608f2e585..2bd3a3b1d 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -697,8 +697,11 @@ "select_destination": ".ﻲﻃﺎﻴﺘﺣﻻﺍ ﺦﺴﻨﻟﺍ ﻒﻠﻣ ﺔﻬﺟﻭ ﺪﻳﺪﺤﺗ ءﺎﺟﺮﻟﺍ", "save_to_downloads": "ﺕﻼﻳﺰﻨﺘﻟﺍ ﻲﻓ ﻆﻔﺣ", "support_description_other_links": "انضم إلى مجتمعاتنا أو تصل إلينا شركائنا من خلال أساليب أخرى", - "auto_generate_subaddresses": "تلقائي توليد subddresses" -======= - "template_name": "اسم القالب" ->>>>>>> cw-linux-squash-3 + "auto_generate_subaddresses": "تلقائي توليد subddresses", + "invalid_password": "رمز مرور خاطئ", + "unlock": "الغاء القفل", + "enter_wallet_password": "أدخل كلمة مرور المحفظة", + "repeat_wallet_password": "كرر كلمة مرور المحفظة", + "wallet_password_is_empty": "كلمة مرور المحفظة فارغة. يجب ألا تكون كلمة مرور المحفظة فارغة", + "repeated_password_is_incorrect": "كلمة المرور المتكررة غير صحيحة. يرجى تكرار كلمة مرور المحفظة مرة أخرى." } diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index b558cd300..3a4eb0770 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -692,5 +692,12 @@ "support_title_other_links": "Други връзки за поддръжка", "support_description_other_links": "Присъединете се към нашите общности или се свържете с нас нашите партньори чрез други методи", "select_destination": "Моля, изберете дестинация за архивния файл.", - "save_to_downloads": "Запазване в Изтегляния" + "save_to_downloads": "Запазване в Изтегляния", + "settings": "Настройки", + "invalid_password": "Невалидна парола", + "unlock": "Отключване", + "enter_wallet_password": "Въведете паролата за портфейла", + "repeat_wallet_password": "Повторете паролата на портфейла", + "wallet_password_is_empty": "Паролата за портфейл е празна. Паролата за портфейл не трябва да е празна", + "repeated_password_is_incorrect": "Многократната парола е неправилна. Моля, повторете отново паролата за портфейла." } diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index 0d2115ab3..b62f18d0b 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -685,5 +685,11 @@ "support_title_other_links": "Další odkazy na podporu", "support_description_other_links": "Připojte se k našim komunitám nebo se k nám oslovte další metody", "select_destination": "Vyberte cíl pro záložní soubor.", - "save_to_downloads": "Uložit do Stažených souborů" + "save_to_downloads": "Uložit do Stažených souborů", + "invalid_password": "Neplatné heslo", + "unlock": "Odemknout", + "enter_wallet_password": "Zadejte heslo peněženky", + "repeat_wallet_password": "Opakujte heslo peněženky", + "wallet_password_is_empty": "Heslo peněženky je prázdné. Heslo peněženky by nemělo být prázdné", + "repeated_password_is_incorrect": "Opakované heslo je nesprávné. Znovu opakujte heslo peněženky." } diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 5a795e35d..749514556 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -647,7 +647,7 @@ "matrix_green_dark_theme": "Matrix Green Dark Theme", "monero_light_theme": "Monero Light-Thema", "auto_generate_subaddresses": "Unteradressen automatisch generieren", - "cake_2fa_preset" : "Cake 2FA-Voreinstellung", + "cake_2fa_preset": "Cake 2FA-Voreinstellung", "narrow": "Eng", "normal": "Normal", "aggressive": "Übereifrig", @@ -693,5 +693,11 @@ "support_title_other_links": "Andere Support-Links", "support_description_other_links": "Treten Sie unseren Communities bei oder erreichen Sie uns oder unsere Partner über andere Methoden", "select_destination": "Bitte wählen Sie das Ziel für die Sicherungsdatei aus.", - "save_to_downloads": "Unter „Downloads“ speichern" + "save_to_downloads": "Unter „Downloads“ speichern", + "invalid_password": "Ungültiges Passwort", + "unlock": "Freischalten", + "enter_wallet_password": "Geben Sie das Brieftaschenkennwort ein", + "repeat_wallet_password": "Wiederholen Sie das Brieftaschenkennwort", + "wallet_password_is_empty": "Brieftaschenkennwort ist leer. Brieftaschenkennwort sollte nicht leer sein", + "repeated_password_is_incorrect": "Wiederholtes Passwort ist falsch. Bitte wiederholen Sie das Brieftaschenkennwort erneut." } diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index c56fd5e38..92556056c 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -693,5 +693,11 @@ "support_title_other_links": "Other support links", "support_description_other_links": "Join our communities or reach us our our partners through other methods", "select_destination": "Please select destination for the backup file.", - "save_to_downloads": "Save to Downloads" + "save_to_downloads": "Save to Downloads", + "invalid_password": "Invalid password", + "unlock": "Unlock", + "enter_wallet_password": "Enter the wallet password", + "repeat_wallet_password": "Repeat the wallet password", + "wallet_password_is_empty": "Wallet password is empty. Wallet password should not be empty", + "repeated_password_is_incorrect": "Repeated password is incorrect. Please repeat the wallet password again." } diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index 59702382b..5f86abc32 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -693,5 +693,11 @@ "support_title_other_links": "Otros enlaces de soporte", "support_description_other_links": "Únase a nuestras comunidades o comuníquese con nosotros nuestros socios a través de otros métodos", "select_destination": "Seleccione el destino del archivo de copia de seguridad.", - "save_to_downloads": "Guardar en Descargas" + "save_to_downloads": "Guardar en Descargas", + "invalid_password": "Contraseña invalida", + "unlock": "desbloquear", + "enter_wallet_password": "Ingrese la contraseña de la billetera", + "repeat_wallet_password": "Repita la contraseña de billetera", + "wallet_password_is_empty": "La contraseña de billetera está vacía. La contraseña de la billetera no debe estar vacía", + "repeated_password_is_incorrect": "La contraseña repetida es incorrecta. Repita la contraseña de la billetera nuevamente." } diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index ae62b612b..e56d73bfb 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -693,5 +693,11 @@ "support_title_other_links": "Autres liens d'assistance", "support_description_other_links": "Rejoignez nos communautés ou contactez-nous nos partenaires à travers d'autres méthodes", "select_destination": "Veuillez sélectionner la destination du fichier de sauvegarde.", - "save_to_downloads": "Enregistrer dans les téléchargements" + "save_to_downloads": "Enregistrer dans les téléchargements", + "invalid_password": "Mot de passe incorrect", + "unlock": "Ouvrir", + "enter_wallet_password": "Entrez le mot de passe du portefeuille", + "repeat_wallet_password": "Répétez le mot de passe du portefeuille", + "wallet_password_is_empty": "Le mot de passe du portefeuille est vide. Le mot de passe du portefeuille ne doit pas être vide", + "repeated_password_is_incorrect": "Le mot de passe répété est incorrect. Veuillez répéter le mot de passe du portefeuille." } diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 528ea7c58..4133994e6 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -671,5 +671,11 @@ "support_title_other_links": "Sauran hanyoyin tallafi", "support_description_other_links": "Kasance tare da al'ummominmu ko kuma ka kai mu abokanmu ta hanyar wasu hanyoyi", "select_destination": "Da fatan za a zaɓi wurin da za a yi wa madadin fayil ɗin.", - "save_to_downloads": "Ajiye zuwa Zazzagewa" + "save_to_downloads": "Ajiye zuwa Zazzagewa", + "invalid_password": "Kalmar sirri mara inganci", + "unlock": "Buɗe", + "enter_wallet_password": "Shigar da kalmar sirri ta walat", + "repeat_wallet_password": "Maimaita kalmar sirri", + "wallet_password_is_empty": "Alamar Wallet babu komai. Al'adun Wallet bai zama komai ba", + "repeated_password_is_incorrect": "Maimaita kalmar sirri ba daidai ba ce. Da fatan za a sake maimaita kalmar sirri." } diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index fee7465a8..bf2b9f989 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -693,5 +693,11 @@ "support_title_other_links": "अन्य समर्थन लिंक", "support_description_other_links": "हमारे समुदायों में शामिल हों या अन्य तरीकों के माध्यम से हमारे साथी तक पहुंचें", "select_destination": "कृपया बैकअप फ़ाइल के लिए गंतव्य का चयन करें।", - "save_to_downloads": "डाउनलोड में सहेजें" + "save_to_downloads": "डाउनलोड में सहेजें", + "invalid_password": "अवैध पासवर्ड", + "unlock": "अनलॉक", + "enter_wallet_password": "वॉलेट पासवर्ड दर्ज करें", + "repeat_wallet_password": "वॉलेट पासवर्ड दोहराएं", + "wallet_password_is_empty": "वॉलेट पासवर्ड खाली है। वॉलेट पासवर्ड खाली नहीं होना चाहिए", + "repeated_password_is_incorrect": "बार -बार पासवर्ड गलत है। कृपया फिर से वॉलेट पासवर्ड दोहराएं।" } diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index de9526a1c..fbc06eddc 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -693,5 +693,11 @@ "support_title_other_links": "Ostale veze za podršku", "support_description_other_links": "Pridružite se našim zajednicama ili nam dosegnu naše partnere drugim metodama", "select_destination": "Odaberite odredište za datoteku sigurnosne kopije.", - "save_to_downloads": "Spremi u Preuzimanja" + "save_to_downloads": "Spremi u Preuzimanja", + "invalid_password": "Netočna zaporka", + "unlock": "Otključati", + "enter_wallet_password": "Unesite lozinku za novčanik", + "repeat_wallet_password": "Ponovite lozinku za novčanik", + "wallet_password_is_empty": "Lozinka za novčanik je prazna. Lozinka za novčanik ne bi trebala biti prazna", + "repeated_password_is_incorrect": "Ponovljena lozinka je netočna. Molimo ponovite lozinku za novčanik." } diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index 75f038f4a..fc6cac400 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -682,5 +682,11 @@ "support_title_other_links": "Tautan dukungan lainnya", "support_description_other_links": "Bergabunglah dengan komunitas kami atau hubungi kami mitra kami melalui metode lain", "select_destination": "Silakan pilih tujuan untuk file cadangan.", - "save_to_downloads": "Simpan ke Unduhan" + "save_to_downloads": "Simpan ke Unduhan", + "invalid_password": "Kata sandi salah", + "unlock": "Membuka kunci", + "enter_wallet_password": "Masukkan Kata Sandi Dompet", + "repeat_wallet_password": "Ulangi Kata Sandi Dompet", + "wallet_password_is_empty": "Kata sandi dompet kosong. Kata sandi dompet tidak boleh kosong", + "repeated_password_is_incorrect": "Kata sandi yang diulang tidak benar. Harap ulangi kata sandi dompet lagi." } diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index ef62d901b..b2e7fc56a 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -693,5 +693,11 @@ "support_title_other_links": "Altri collegamenti di supporto", "support_description_other_links": "Unisciti alle nostre comunità o raggiungici i nostri partner attraverso altri metodi", "select_destination": "Seleziona la destinazione per il file di backup.", - "save_to_downloads": "Salva in Download" + "save_to_downloads": "Salva in Download", + "invalid_password": "Password non valida", + "unlock": "Sbloccare", + "enter_wallet_password": "Immettere la password del portafoglio", + "repeat_wallet_password": "Ripeti la password del portafoglio", + "wallet_password_is_empty": "La password del portafoglio è vuota. La password del portafoglio non dovrebbe essere vuota", + "repeated_password_is_incorrect": "La password ripetuta non è corretta. Si prega di ripetere di nuovo la password del portafoglio." } diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index cfb653dbb..3b5f3688b 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -693,5 +693,11 @@ "support_description_other_links": "私たちのコミュニティに参加するか、他の方法を通して私たちのパートナーに連絡してください", "select_destination": "バックアップファイルの保存先を選択してください。", "save_to_downloads": "ダウンロードに保存", - "auto_generate_subaddresses": "Autoはサブアドレスを生成します" + "auto_generate_subaddresses": "Autoはサブアドレスを生成します", + "invalid_password": "無効なパスワード", + "unlock": "ロックを解除します", + "enter_wallet_password": "ウォレットパスワードを入力します", + "repeat_wallet_password": "ウォレットパスワードを繰り返します", + "wallet_password_is_empty": "ウォレットパスワードは空です。ウォレットのパスワードは空にしてはいけません", + "repeated_password_is_incorrect": "繰り返しパスワードが正しくありません。ウォレットのパスワードをもう一度繰り返してください。" } diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index 80197ca70..f8c9d2a5d 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -693,5 +693,11 @@ "support_description_other_links": "다른 방법을 통해 커뮤니티에 가입하거나 파트너에게 연락하십시오.", "select_destination": "백업 파일의 대상을 선택하십시오.", "save_to_downloads": "다운로드에 저장", - "auto_generate_subaddresses": "자동 생성 서브 아드 드레스" + "auto_generate_subaddresses": "자동 생성 서브 아드 드레스", + "invalid_password": "유효하지 않은 비밀번호", + "unlock": "터놓다", + "enter_wallet_password": "지갑 암호를 입력하십시오", + "repeat_wallet_password": "지갑 암호를 반복하십시오", + "wallet_password_is_empty": "지갑 암호는 비어 있습니다. 지갑 암호는 비어 있지 않아야합니다", + "repeated_password_is_incorrect": "반복 된 비밀번호가 올바르지 않습니다. 지갑 암호를 다시 반복하십시오." } diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 519866937..85c06ebce 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -691,5 +691,11 @@ "support_description_other_links": "ကျွန်ုပ်တို့၏လူမှုအသိုင်းအဝိုင်းများသို့ 0 င်ရောက်ပါ", "select_destination": "အရန်ဖိုင်အတွက် ဦးတည်ရာကို ရွေးပါ။", "save_to_downloads": "ဒေါင်းလုဒ်များထံ သိမ်းဆည်းပါ။", - "auto_generate_subaddresses": "အော်တို Generate Subaddresses" + "auto_generate_subaddresses": "အော်တို Generate Subaddresses", + "invalid_password": "မမှန်ကန်သောစကားဝှက်", + "unlock": "သော့ဖွင့်", + "enter_wallet_password": "ပိုက်ဆံအိတ်စကားဝှက်ကိုရိုက်ထည့်ပါ", + "repeat_wallet_password": "ပိုက်ဆံအိတ်စကားဝှက်ကိုပြန်လုပ်ပါ", + "wallet_password_is_empty": "ပိုက်ဆံအိတ်စကားဝှက်သည်ဗလာဖြစ်သည်။ ပိုက်ဆံအိတ်စကားဝှက်သည်အချည်းနှီးဖြစ်သင့်သည်", + "repeated_password_is_incorrect": "ထပ်ခါတလဲလဲစကားဝှက်မမှန်ကန်ပါ ကျေးဇူးပြုပြီးပိုက်ဆံအိတ်စကားဝှက်ကိုပြန်လုပ်ပါ။" } diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 4c7f8b298..3cb81f3c3 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -693,5 +693,11 @@ "support_title_other_links": "Andere ondersteuningslinks", "support_description_other_links": "Word lid van onze gemeenschappen of bereik ons ​​onze partners via andere methoden", "select_destination": "Selecteer de bestemming voor het back-upbestand.", - "save_to_downloads": "Opslaan in downloads" + "save_to_downloads": "Opslaan in downloads", + "invalid_password": "Ongeldig wachtwoord", + "unlock": "Ontgrendelen", + "enter_wallet_password": "Voer het Wallet -wachtwoord in", + "repeat_wallet_password": "Herhaal het Wallet -wachtwoord", + "wallet_password_is_empty": "Wallet -wachtwoord is leeg. Wallet -wachtwoord mag niet leeg zijn", + "repeated_password_is_incorrect": "Herhaald wachtwoord is onjuist. Herhaal het Wallet -wachtwoord opnieuw." } diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index e04cd108a..bd53c4f41 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -693,5 +693,11 @@ "support_title_other_links": "Inne linki wsparcia", "support_description_other_links": "Dołącz do naszych społeczności lub skontaktuj się z nami naszymi partnerami za pomocą innych metod", "select_destination": "Wybierz miejsce docelowe dla pliku kopii zapasowej.", - "save_to_downloads": "Zapisz w Pobranych" + "save_to_downloads": "Zapisz w Pobranych", + "invalid_password": "Nieprawidłowe hasło", + "unlock": "Odblokować", + "enter_wallet_password": "Wprowadź hasło portfela", + "repeat_wallet_password": "Powtórz hasło portfela", + "wallet_password_is_empty": "Hasło portfela jest puste. Hasło portfela nie powinno być puste", + "repeated_password_is_incorrect": "Powtarzane hasło jest nieprawidłowe. Powtórz ponownie hasło portfela." } diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index c0cfbefe0..7377e2a05 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -692,5 +692,11 @@ "support_title_other_links": "Outros links de suporte", "support_description_other_links": "Junte -se às nossas comunidades ou chegue a nós nossos parceiros por meio de outros métodos", "select_destination": "Selecione o destino para o arquivo de backup.", - "save_to_downloads": "Salvar em Downloads" + "save_to_downloads": "Salvar em Downloads", + "invalid_password": "Senha inválida", + "unlock": "Desbloquear", + "enter_wallet_password": "Digite a senha da carteira", + "repeat_wallet_password": "Repita a senha da carteira", + "wallet_password_is_empty": "A senha da carteira está vazia. A senha da carteira não deve estar vazia", + "repeated_password_is_incorrect": "A senha repetida está incorreta. Repita a senha da carteira novamente." } diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 0c542bee5..8ccedcd38 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -694,5 +694,11 @@ "support_description_other_links": "Присоединяйтесь к нашим сообществам или охватите нас наших партнеров с помощью других методов", "select_destination": "Пожалуйста, выберите место для файла резервной копии.", "save_to_downloads": "Сохранить в загрузках", - "auto_generate_subaddresses": "Авто генерируйте Subaddresses" + "auto_generate_subaddresses": "Авто генерируйте Subaddresses", + "invalid_password": "Неверный пароль", + "unlock": "Разблокировать", + "enter_wallet_password": "Введите пароль кошелька", + "repeat_wallet_password": "Повторите пароль кошелька", + "wallet_password_is_empty": "Пароль кошелька пуст. Пароль кошелька не должен быть пустым", + "repeated_password_is_incorrect": "Повторный пароль неверен. Пожалуйста, повторите пароль кошелька снова." } diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index 4a45f305f..abe6994fe 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -691,5 +691,11 @@ "support_description_other_links": "เข้าร่วมชุมชนของเราหรือเข้าถึงเราพันธมิตรของเราผ่านวิธีการอื่น ๆ", "select_destination": "โปรดเลือกปลายทางสำหรับไฟล์สำรอง", "save_to_downloads": "บันทึกลงดาวน์โหลด", - "auto_generate_subaddresses": "Auto สร้าง subaddresses" + "auto_generate_subaddresses": "Auto สร้าง subaddresses", + "invalid_password": "รหัสผ่านไม่ถูกต้อง", + "unlock": "ปลดล็อค", + "enter_wallet_password": "ป้อนรหัสผ่านกระเป๋าเงิน", + "repeat_wallet_password": "ทำซ้ำรหัสผ่านกระเป๋าเงิน", + "wallet_password_is_empty": "รหัสผ่านกระเป๋าเงินว่างเปล่า รหัสผ่านกระเป๋าเงินไม่ควรว่างเปล่า", + "repeated_password_is_incorrect": "รหัสผ่านซ้ำไม่ถูกต้อง โปรดทำซ้ำรหัสผ่านกระเป๋าเงินอีกครั้ง" } diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index acb12c50b..8b7fbca7b 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -691,5 +691,11 @@ "support_title_other_links": "Diğer destek bağlantıları", "support_description_other_links": "Topluluklarımıza katılın veya ortaklarımıza diğer yöntemlerle bize ulaşın", "select_destination": "Lütfen yedekleme dosyası için hedef seçin.", - "save_to_downloads": "İndirilenlere Kaydet" + "save_to_downloads": "İndirilenlere Kaydet", + "invalid_password": "Geçersiz şifre", + "unlock": "Kilidini aç", + "enter_wallet_password": "Cüzdan şifresini girin", + "repeat_wallet_password": "Cüzdan şifresini tekrarlayın", + "wallet_password_is_empty": "Cüzdan şifresi boş. Cüzdan şifresi boş olmamalı", + "repeated_password_is_incorrect": "Tekrarlanan şifre yanlış. Lütfen cüzdan şifresini tekrarlayın." } diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index 42c3b50ce..980d4c5c5 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -693,5 +693,11 @@ "support_title_other_links": "Інші посилання на підтримку", "support_description_other_links": "Приєднуйтесь до наших спільнот або досягайте нас нашими партнерами іншими методами", "select_destination": "Виберіть місце призначення для файлу резервної копії.", - "save_to_downloads": "Зберегти до завантажень" + "save_to_downloads": "Зберегти до завантажень", + "invalid_password": "Недійсний пароль", + "unlock": "Розблокувати", + "enter_wallet_password": "Введіть пароль гаманця", + "repeat_wallet_password": "Повторіть пароль гаманця", + "wallet_password_is_empty": "Пароль гаманця порожній. Пароль гаманця не повинен бути порожнім", + "repeated_password_is_incorrect": "Повторний пароль невірний. Будь ласка, повторіть пароль гаманця ще раз." } diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index dd1213959..751cee7b6 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -686,5 +686,11 @@ "support_description_other_links": "ہماری برادریوں میں شامل ہوں یا دوسرے طریقوں سے ہمارے شراکت داروں تک پہنچیں", "select_destination": "۔ﮟﯾﺮﮐ ﺏﺎﺨﺘﻧﺍ ﺎﮐ ﻝﺰﻨﻣ ﮯﯿﻟ ﮯﮐ ﻞﺋﺎﻓ ﭖﺍ ﮏﯿﺑ ﻡﺮﮐ ﮦﺍﺮﺑ", "save_to_downloads": "۔ﮟﯾﺮﮐ ﻅﻮﻔﺤﻣ ﮟﯿﻣ ﺯﮈﻮﻟ ﻥﺅﺍﮈ", - "auto_generate_subaddresses": "آٹو سب ایڈریس تیار کرتا ہے" + "auto_generate_subaddresses": "آٹو سب ایڈریس تیار کرتا ہے", + "invalid_password": "غلط پاسورڈ", + "unlock": "غیر مقفل", + "enter_wallet_password": "پرس کا پاس ورڈ درج کریں", + "repeat_wallet_password": "بٹوے کا پاس ورڈ دہرائیں", + "wallet_password_is_empty": "پرس کا پاس ورڈ خالی ہے۔ پرس کا پاس ورڈ خالی نہیں ہونا چاہئے", + "repeated_password_is_incorrect": "بار بار پاس ورڈ غلط ہے۔ براہ کرم دوبارہ پرس کا پاس ورڈ دہرائیں۔" } diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index 8cd2f6ebd..59b53ced0 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -681,5 +681,11 @@ "monero_light_theme": "Monero Light Akori", "select_destination": "Jọwọ yan ibi ti o nlo fun faili afẹyinti.", "save_to_downloads": "Fipamọ si Awọn igbasilẹ", - "auto_generate_subaddresses": "Aṣiṣe Ibi-Afọwọkọ" + "auto_generate_subaddresses": "Aṣiṣe Ibi-Afọwọkọ", + "invalid_password": "Ọrọ igbaniwọle ti ko wulo", + "unlock": "Sisalẹ", + "enter_wallet_password": "Tẹ ọrọ igbaniwọle apamọwọ", + "repeat_wallet_password": "Tun ọrọ igbaniwọle apamọwọ naa", + "wallet_password_is_empty": "Ọrọ igbaniwọle apamọwọ ti ṣofo. Ọrọ igbaniwọle apamọwọ ko yẹ ki o ṣofo", + "repeated_password_is_incorrect": "Ọrọ igbaniwọle tun jẹ aṣiṣe. Jọwọ tun ọrọigbaniwọle apamọwọ lẹẹkansi." } diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index 4dd34e1de..17406d30f 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -692,5 +692,11 @@ "monero_light_theme": "门罗币浅色主题", "select_destination": "请选择备份文件的目的地。", "save_to_downloads": "保存到下载", - "auto_generate_subaddresses": "自动生成子辅助" + "auto_generate_subaddresses": "自动生成子辅助", + "invalid_password": "无效的密码", + "unlock": "开锁", + "enter_wallet_password": "输入钱包密码", + "repeat_wallet_password": "重复钱包密码", + "wallet_password_is_empty": "钱包密码为空。钱包密码不应为空", + "repeated_password_is_incorrect": "重复密码不正确。请再次重复钱包密码。" } diff --git a/scripts/android/app_env.sh b/scripts/android/app_env.sh index 741eb8780..627b8d318 100644 --- a/scripts/android/app_env.sh +++ b/scripts/android/app_env.sh @@ -14,14 +14,14 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN) APP_ANDROID_TYPE=$1 MONERO_COM_NAME="Monero.com" -MONERO_COM_VERSION="1.5.1" -MONERO_COM_BUILD_NUMBER=55 +MONERO_COM_VERSION="1.6.0" +MONERO_COM_BUILD_NUMBER=56 MONERO_COM_BUNDLE_ID="com.monero.app" MONERO_COM_PACKAGE="com.monero.app" CAKEWALLET_NAME="Cake Wallet" -CAKEWALLET_VERSION="4.8.1" -CAKEWALLET_BUILD_NUMBER=168 +CAKEWALLET_VERSION="4.9.0" +CAKEWALLET_BUILD_NUMBER=169 CAKEWALLET_BUNDLE_ID="com.cakewallet.cake_wallet" CAKEWALLET_PACKAGE="com.cakewallet.cake_wallet" diff --git a/scripts/ios/app_env.sh b/scripts/ios/app_env.sh index 401755b40..08de936e8 100644 --- a/scripts/ios/app_env.sh +++ b/scripts/ios/app_env.sh @@ -13,13 +13,13 @@ TYPES=($MONERO_COM $CAKEWALLET $HAVEN) APP_IOS_TYPE=$1 MONERO_COM_NAME="Monero.com" -MONERO_COM_VERSION="1.5.1" -MONERO_COM_BUILD_NUMBER=53 +MONERO_COM_VERSION="1.6.0" +MONERO_COM_BUILD_NUMBER=54 MONERO_COM_BUNDLE_ID="com.cakewallet.monero" CAKEWALLET_NAME="Cake Wallet" -CAKEWALLET_VERSION="4.8.1" -CAKEWALLET_BUILD_NUMBER=176 +CAKEWALLET_VERSION="4.9.0" +CAKEWALLET_BUILD_NUMBER=178 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet" HAVEN_NAME="Haven" diff --git a/scripts/linux/app_env.sh b/scripts/linux/app_env.sh index ac8c7c9df..211c4ef34 100755 --- a/scripts/linux/app_env.sh +++ b/scripts/linux/app_env.sh @@ -14,8 +14,8 @@ if [ -n "$1" ]; then fi CAKEWALLET_NAME="Cake Wallet" -CAKEWALLET_VERSION="1.0.2" -CAKEWALLET_BUILD_NUMBER=3 +CAKEWALLET_VERSION="1.1.0" +CAKEWALLET_BUILD_NUMBER=4 if ! [[ " ${TYPES[*]} " =~ " ${APP_LINUX_TYPE} " ]]; then echo "Wrong app type." diff --git a/scripts/macos/app_env.sh b/scripts/macos/app_env.sh index 1aed1f4fa..28e7d5f4f 100755 --- a/scripts/macos/app_env.sh +++ b/scripts/macos/app_env.sh @@ -15,8 +15,8 @@ if [ -n "$1" ]; then fi CAKEWALLET_NAME="Cake Wallet" -CAKEWALLET_VERSION="1.1.1" -CAKEWALLET_BUILD_NUMBER=29 +CAKEWALLET_VERSION="1.2.0" +CAKEWALLET_BUILD_NUMBER=31 CAKEWALLET_BUNDLE_ID="com.fotolockr.cakewallet" if ! [[ " ${TYPES[*]} " =~ " ${APP_MACOS_TYPE} " ]]; then