From 7db23599fad458b2f220f0c22a425e3d32b76f17 Mon Sep 17 00:00:00 2001 From: tuxsudo Date: Wed, 12 Feb 2025 06:35:59 -0500 Subject: [PATCH 1/8] UI enhancements (#1895) * UI enhancements [skip ci] * Fix spacing for swap screen * Cleanup and update backup page [skip ci] * Fix address book page * Update address book page * Update standard lists * Update hamburger menu * Make toggle rows tappable * Make more components TextButtons * Make button dock float * Fix shadows * Update [skip ci] * Update all cards with shadow and proper alignment * Fix component positioning and scaling * Cleanup, update strings, rename strings * Fix spacing on Swap and Send pages [skip ci] * Remove Wallets action button [skip ci] * Move Sign/Verify into settings [skip ci] * Cleanup & fix merge conflicts (pls) [skip ci] * Fix formatting [skip ci] * Move bottom bar to navigation_dock.dart [skip ci] * Fix card spacing * Conflict resolution [skip ci] * Conflict resolution [skip ci] * Update shadow theming * Update menu * Temporarily remove shadow * Temporarily remove shadows again * Update setting_action_button.dart --------- Co-authored-by: Omar Hatem --- lib/buy/moonpay/moonpay_provider.dart | 2 + lib/entities/main_actions.dart | 14 +- lib/src/screens/backup/backup_page.dart | 45 +- .../screens/contact/contact_list_page.dart | 37 +- lib/src/screens/dashboard/dashboard_page.dart | 154 ++--- .../desktop_dashboard_actions.dart | 10 +- .../pages/balance/balance_row_widget.dart | 42 +- .../pages/balance/crypto_balance_widget.dart | 13 +- .../dashboard/pages/cake_features_page.dart | 41 +- .../dashboard/pages/navigation_dock.dart | 229 ++++++++ .../dashboard/widgets/action_button.dart | 9 +- .../dashboard/widgets/menu_widget.dart | 3 +- .../exchange/widgets/exchange_card.dart | 7 +- .../mobile_exchange_cards_section.dart | 6 +- .../screens/nodes/widgets/node_list_row.dart | 61 ++ lib/src/screens/send/widgets/send_card.dart | 2 +- .../settings/display_settings_page.dart | 13 +- .../screens/settings/manage_nodes_page.dart | 1 - .../screens/settings/other_settings_page.dart | 7 - .../settings/security_backup_page.dart | 76 +-- .../widgets/settings_choices_cell.dart | 4 +- .../widgets/settings_switcher_cell.dart | 32 ++ lib/src/screens/support/support_page.dart | 6 +- .../screens/wallet_list/wallet_list_page.dart | 543 ++++++++++-------- lib/src/widgets/dashboard_card_widget.dart | 142 +++-- lib/src/widgets/option_tile.dart | 27 +- lib/src/widgets/setting_action_button.dart | 98 ++-- lib/src/widgets/setting_actions.dart | 14 - lib/src/widgets/standard_list.dart | 25 +- lib/themes/monero_dark_theme.dart | 3 + lib/themes/theme_base.dart | 2 +- .../dashboard/dashboard_view_model.dart | 38 +- .../settings/display_settings_view_model.dart | 7 + .../settings/other_settings_view_model.dart | 7 - res/values/strings_ar.arb | 5 +- res/values/strings_bg.arb | 5 +- res/values/strings_cs.arb | 5 +- res/values/strings_de.arb | 3 +- res/values/strings_en.arb | 5 +- res/values/strings_es.arb | 5 +- res/values/strings_fr.arb | 5 +- res/values/strings_ha.arb | 5 +- res/values/strings_hi.arb | 7 +- res/values/strings_hr.arb | 5 +- res/values/strings_hy.arb | 5 +- res/values/strings_id.arb | 5 +- res/values/strings_it.arb | 3 +- res/values/strings_ja.arb | 5 +- res/values/strings_ko.arb | 3 +- res/values/strings_my.arb | 3 +- res/values/strings_nl.arb | 5 +- res/values/strings_pl.arb | 5 +- res/values/strings_pt.arb | 5 +- res/values/strings_ru.arb | 5 +- res/values/strings_th.arb | 3 +- res/values/strings_tl.arb | 3 +- res/values/strings_tr.arb | 5 +- res/values/strings_uk.arb | 5 +- res/values/strings_ur.arb | 3 +- res/values/strings_vi.arb | 5 +- res/values/strings_yo.arb | 5 +- res/values/strings_zh.arb | 3 +- 62 files changed, 1176 insertions(+), 670 deletions(-) create mode 100644 lib/src/screens/dashboard/pages/navigation_dock.dart diff --git a/lib/buy/moonpay/moonpay_provider.dart b/lib/buy/moonpay/moonpay_provider.dart index 5794e0794d..959d38a575 100644 --- a/lib/buy/moonpay/moonpay_provider.dart +++ b/lib/buy/moonpay/moonpay_provider.dart @@ -82,6 +82,8 @@ class MoonPayProvider extends BuyProvider { return 'light'; case ThemeType.dark: return 'dark'; + case ThemeType.oled: + return 'dark'; } } diff --git a/lib/entities/main_actions.dart b/lib/entities/main_actions.dart index 29c161c5f6..68f599718c 100644 --- a/lib/entities/main_actions.dart +++ b/lib/entities/main_actions.dart @@ -23,7 +23,7 @@ class MainActions { static List all = [ showWalletsAction, receiveAction, - exchangeAction, + swapAction, sendAction, tradeAction, ]; @@ -44,13 +44,13 @@ class MainActions { }, ); - static MainActions exchangeAction = MainActions._( - name: (context) => S.of(context).exchange, + static MainActions swapAction = MainActions._( + name: (context) => S.of(context).swap, image: 'assets/images/transfer.png', - isEnabled: (viewModel) => viewModel.isEnabledExchangeAction, - canShow: (viewModel) => viewModel.hasExchangeAction, + isEnabled: (viewModel) => viewModel.isEnabledSwapAction, + canShow: (viewModel) => viewModel.hasSwapAction, onTap: (BuildContext context, DashboardViewModel viewModel) async { - if (viewModel.isEnabledExchangeAction) { + if (viewModel.isEnabledSwapAction) { await Navigator.of(context).pushNamed(Routes.exchange); } }, @@ -66,7 +66,7 @@ class MainActions { static MainActions tradeAction = MainActions._( - name: (context) => '${S.of(context).buy}/${S.of(context).sell}', + name: (context) => S.of(context).exchange, image: 'assets/images/buy_sell.png', isEnabled: (viewModel) => viewModel.isEnabledTradeAction, canShow: (viewModel) => viewModel.hasTradeAction, diff --git a/lib/src/screens/backup/backup_page.dart b/lib/src/screens/backup/backup_page.dart index b8065cf367..91813ee897 100644 --- a/lib/src/screens/backup/backup_page.dart +++ b/lib/src/screens/backup/backup_page.dart @@ -26,12 +26,6 @@ class BackupPage extends BasePage { @override String get title => S.current.backup; - @override - Widget trailing(BuildContext context) => TrailButton( - caption: S.of(context).change_password, - onPressed: () => Navigator.of(context).pushNamed(Routes.editBackupPassword), - textColor: Palette.blueCraiola); - @override Widget body(BuildContext context) { return Stack( @@ -53,7 +47,9 @@ class BackupPage extends BasePage { builder: (_) => GestureDetector( onTap: () { ClipboardUtil.setSensitiveDataToClipboard( - ClipboardData(text: backupViewModelBase.backupPassword)); + ClipboardData( + text: backupViewModelBase + .backupPassword)); showBar( context, S.of(context).transaction_details_copied( @@ -74,15 +70,25 @@ class BackupPage extends BasePage { )) ]))), Positioned( - child: Observer( - builder: (_) => LoadingPrimaryButton( - isLoading: backupViewModelBase.state is IsExecutingState, - onPressed: () => onExportBackup(context), - text: S.of(context).export_backup, - color: Theme.of(context).primaryColor, + child: Column(children: [ + PrimaryButton( + onPressed: () => + Navigator.of(context).pushNamed(Routes.editBackupPassword), + text: S.of(context).change_password, + color: Theme.of(context).cardColor, textColor: Colors.white, ), - ), + SizedBox(height: 10), + Observer( + builder: (_) => LoadingPrimaryButton( + isLoading: backupViewModelBase.state is IsExecutingState, + onPressed: () => onExportBackup(context), + text: S.of(context).export_backup, + color: Theme.of(context).primaryColor, + textColor: Colors.white, + ), + ), + ]), bottom: 24, left: 24, right: 24, @@ -130,7 +136,8 @@ class BackupPage extends BasePage { rightButtonText: S.of(context).save_to_downloads, leftButtonText: S.of(context).share, actionRightButton: () async { - await backupViewModelBase.saveToDownload(backup.name, backup.content); + await backupViewModelBase.saveToDownload( + backup.name, backup.content); Navigator.of(dialogContext).pop(); }, actionLeftButton: () async { @@ -142,13 +149,15 @@ class BackupPage extends BasePage { Future share(BackupExportFile backup, BuildContext context) async { final path = await backupViewModelBase.saveBackupFileLocally(backup); - await ShareUtil.shareFile(filePath: path, fileName: backup.name, context: context); + await ShareUtil.shareFile( + filePath: path, fileName: backup.name, context: context); await backupViewModelBase.removeBackupFileLocally(backup); } Future _saveFile(BackupExportFile backup) async { - String? outputFile = await FilePicker.platform - .saveFile(dialogTitle: 'Save Your File to desired location', fileName: backup.name); + String? outputFile = await FilePicker.platform.saveFile( + dialogTitle: 'Save Your File to desired location', + fileName: backup.name); try { File returnedFile = File(outputFile!); diff --git a/lib/src/screens/contact/contact_list_page.dart b/lib/src/screens/contact/contact_list_page.dart index 50b4ae7c05..ee1dcd1129 100644 --- a/lib/src/screens/contact/contact_list_page.dart +++ b/lib/src/screens/contact/contact_list_page.dart @@ -110,10 +110,12 @@ class _ContactPageBodyState extends State with SingleTickerProv @override Widget build(BuildContext context) { return Padding( - padding: const EdgeInsets.only(left: 24), + padding: const EdgeInsets.only(), child: Column( children: [ - Align( + Padding( + padding: const EdgeInsets.only(left: 24, right: 24, bottom: 8), + child: Align( alignment: Alignment.centerLeft, child: TabBar( controller: _tabController, @@ -135,7 +137,7 @@ class _ContactPageBodyState extends State with SingleTickerProv indicatorColor: Theme.of(context).appBarTheme.titleTextStyle!.color, indicatorPadding: EdgeInsets.zero, labelPadding: EdgeInsets.only(right: 24), - tabAlignment: TabAlignment.center, + tabAlignment: TabAlignment.start, dividerColor: Colors.transparent, padding: EdgeInsets.zero, tabs: [ @@ -144,6 +146,7 @@ class _ContactPageBodyState extends State with SingleTickerProv ], ), ), + ), Expanded( child: TabBarView( controller: _tabController, @@ -173,7 +176,7 @@ class _ContactPageBodyState extends State with SingleTickerProv itemCount: groupedContacts.length * 2, itemBuilder: (context, index) { if (index.isOdd) { - return StandardListSeparator(); + return StandardListSeparator(height: 0); } else { final groupIndex = index ~/ 2; final groupName = groupedContacts.keys.elementAt(groupIndex); @@ -188,7 +191,9 @@ class _ContactPageBodyState extends State with SingleTickerProv orElse: () => groupContacts[0], ); - return ExpansionTile( + return Padding( + padding: const EdgeInsets.only(left: 16, right: 16, top: 4, bottom: 4), + child: ExpansionTile( title: Text( groupName, style: TextStyle( @@ -198,11 +203,16 @@ class _ContactPageBodyState extends State with SingleTickerProv ), ), leading: _buildCurrencyIcon(activeContact), - tilePadding: EdgeInsets.zero, + tilePadding: const EdgeInsets.only(left: 16, right: 16), childrenPadding: const EdgeInsets.only(left: 16), expandedCrossAxisAlignment: CrossAxisAlignment.start, expandedAlignment: Alignment.topLeft, + backgroundColor: Theme.of(context).cardColor, + collapsedBackgroundColor: Theme.of(context).cardColor, + collapsedShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), children: groupContacts.map((contact) => generateRaw(context, contact)).toList(), + ), ); } } @@ -234,7 +244,12 @@ class _ContactPageBodyState extends State with SingleTickerProv }, behavior: HitTestBehavior.opaque, child: Container( - padding: const EdgeInsets.only(top: 16, bottom: 16, right: 24), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(10)), + color: Theme.of(context).cardColor, + ), + margin: const EdgeInsets.only(top: 4, bottom: 4, left: 16, right: 16), + padding: const EdgeInsets.only(top: 16, bottom: 16, right: 16, left: 16), child: Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, @@ -375,7 +390,12 @@ class _ContactListBodyState extends State { children: [ Container( key: Key('${contact.name}'), - padding: const EdgeInsets.only(top: 16, bottom: 16, right: 24), + decoration: BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(8)), + color: Theme.of(context).cardColor, + ), + margin: const EdgeInsets.only(top: 4, bottom: 4, left: 16, right: 16), + padding: const EdgeInsets.only(top: 16, bottom: 16, right: 16, left: 16), child: Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, @@ -396,7 +416,6 @@ class _ContactListBodyState extends State { ], ), ), - StandardListSeparator() ], ); } diff --git a/lib/src/screens/dashboard/dashboard_page.dart b/lib/src/screens/dashboard/dashboard_page.dart index b1934f4a32..f219409dad 100644 --- a/lib/src/screens/dashboard/dashboard_page.dart +++ b/lib/src/screens/dashboard/dashboard_page.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'package:cake_wallet/core/wallet_connect/wc_bottom_sheet_service.dart'; import 'package:cake_wallet/entities/preferences_key.dart'; import 'package:cake_wallet/di.dart'; -import 'package:cake_wallet/entities/main_actions.dart'; import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar_wrapper.dart'; import 'package:cake_wallet/src/screens/dashboard/pages/cake_features_page.dart'; import 'package:cake_wallet/src/screens/wallet_connect/widgets/modals/bottom_sheet_listener.dart'; @@ -10,7 +9,6 @@ import 'package:cake_wallet/src/widgets/gradient_background.dart'; import 'package:cake_wallet/src/widgets/haven_wallet_removal_popup.dart'; import 'package:cake_wallet/src/widgets/services_updates_widget.dart'; import 'package:cake_wallet/src/widgets/vulnerable_seeds_popup.dart'; -import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart'; import 'package:cake_wallet/utils/device_info.dart'; import 'package:cake_wallet/utils/version_comparator.dart'; import 'package:cake_wallet/view_model/dashboard/cake_features_view_model.dart'; @@ -23,8 +21,8 @@ import 'package:flutter/material.dart'; import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; import 'package:cake_wallet/src/screens/base_page.dart'; import 'package:cake_wallet/src/screens/dashboard/widgets/menu_widget.dart'; -import 'package:cake_wallet/src/screens/dashboard/widgets/action_button.dart'; import 'package:cake_wallet/src/screens/dashboard/pages/balance/balance_page.dart'; +import 'package:cake_wallet/src/screens/dashboard/pages/navigation_dock.dart'; import 'package:cake_wallet/src/screens/dashboard/pages/transactions_page.dart'; import 'package:cake_wallet/src/screens/dashboard/widgets/sync_indicator.dart'; import 'package:cake_wallet/view_model/wallet_address_list/wallet_address_list_view_model.dart'; @@ -35,7 +33,6 @@ import 'package:smooth_page_indicator/smooth_page_indicator.dart'; import 'package:cake_wallet/main.dart'; import 'package:cake_wallet/src/screens/release_notes/release_notes_screen.dart'; import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart'; -import 'package:cake_wallet/themes/extensions/balance_page_theme.dart'; class DashboardPage extends StatefulWidget { DashboardPage({ @@ -140,7 +137,8 @@ class _DashboardPageView extends BasePage { bool get resizeToAvoidBottomInset => false; @override - Widget get endDrawer => MenuWidget(dashboardViewModel, ValueKey('dashboard_page_drawer_menu_widget_key')); + Widget get endDrawer => + MenuWidget(dashboardViewModel, ValueKey('dashboard_page_drawer_menu_widget_key')); @override Widget leading(BuildContext context) { @@ -176,10 +174,6 @@ class _DashboardPageView extends BasePage { width: 40, child: TextButton( key: ValueKey('dashboard_page_wallet_menu_button_key'), - // FIX-ME: Style - //highlightColor: Colors.transparent, - //splashColor: Colors.transparent, - //padding: EdgeInsets.all(0), onPressed: () => onOpenEndDrawer(), child: Semantics(label: S.of(context).wallet_menu, child: menuButton), ), @@ -219,14 +213,15 @@ class _DashboardPageView extends BasePage { _setEffects(context); return SafeArea( - minimum: EdgeInsets.only(bottom: 24), + minimum: EdgeInsets.only(bottom: 0), child: BottomSheetListener( bottomSheetService: bottomSheetService, - child: Column( - mainAxisSize: MainAxisSize.max, - children: [ - Expanded( - child: Observer( + child: Container( + child: Stack( + alignment: Alignment.bottomCenter, + children: [ + //new Expanded( + Observer( builder: (context) { return PageView.builder( key: ValueKey('dashboard_page_view_key'), @@ -236,101 +231,44 @@ class _DashboardPageView extends BasePage { ); }, ), - ), - Padding( - padding: EdgeInsets.only(bottom: 24, top: 10), - child: Observer( - builder: (context) { - return Semantics( - button: false, - label: 'Page Indicator', - hint: 'Swipe to change page', - excludeSemantics: true, - child: SmoothPageIndicator( - controller: controller, - count: pages.length, - effect: ColorTransitionEffect( - spacing: 6.0, - radius: 6.0, - dotWidth: 6.0, - dotHeight: 6.0, - dotColor: Theme.of(context) - .extension()! - .indicatorDotTheme - .indicatorColor, - activeDotColor: Theme.of(context) - .extension()! - .indicatorDotTheme - .activeIndicatorColor, - ), - ), - ); - }, - ), - ), - Observer( - builder: (_) { - return ClipRect( - child: Container( - margin: const EdgeInsets.only(left: 16, right: 16), - child: Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(50.0), - border: Border.all( - color: Theme.of(context).extension()!.cardBorderColor, - width: 1, - ), - color: Theme.of(context) - .extension()! - .syncedBackgroundColor, - ), - child: Container( - padding: EdgeInsets.symmetric(horizontal: 10), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: MainActions.all - .where((element) => element.canShow?.call(dashboardViewModel) ?? true) - .map( - (action) => Expanded( - child: Semantics( - button: true, - enabled: (action.isEnabled?.call(dashboardViewModel) ?? true), - child: ActionButton( - key: ValueKey( - 'dashboard_page_${action.name(context)}_action_button_key'), - image: Image.asset( - action.image, - height: 24, - width: 24, - color: action.isEnabled?.call(dashboardViewModel) ?? true - ? Theme.of(context) - .extension()! - .mainActionsIconColor - : Theme.of(context) - .extension()! - .labelTextColor, - ), - title: action.name(context), - onClick: () async => - await action.onTap(context, dashboardViewModel), - textColor: action.isEnabled?.call(dashboardViewModel) ?? true - ? null - : Theme.of(context) - .extension()! - .labelTextColor, - ), - ), - ), - ) - .toList(), + //), + Positioned( + child: Container( + alignment: Alignment.bottomCenter, + margin: EdgeInsets.only(bottom: 110), + child: Observer( + builder: (context) { + return Semantics( + button: false, + label: 'Page Indicator', + hint: 'Swipe to change page', + excludeSemantics: true, + child: SmoothPageIndicator( + controller: controller, + count: pages.length, + effect: ColorTransitionEffect( + spacing: 6.0, + radius: 6.0, + dotWidth: 6.0, + dotHeight: 6.0, + dotColor: Theme.of(context) + .extension()! + .indicatorDotTheme + .indicatorColor, + activeDotColor: Theme.of(context) + .extension()! + .indicatorDotTheme + .activeIndicatorColor, + ), ), - ), - ), + ); + }, ), - ); - }, - ), - ], + ), + ), + NavigationDock(dashboardViewModel: dashboardViewModel) + ], + ), ), ), ); diff --git a/lib/src/screens/dashboard/desktop_widgets/desktop_dashboard_actions.dart b/lib/src/screens/dashboard/desktop_widgets/desktop_dashboard_actions.dart index 7bb5f77f89..a1e89c0f65 100644 --- a/lib/src/screens/dashboard/desktop_widgets/desktop_dashboard_actions.dart +++ b/lib/src/screens/dashboard/desktop_widgets/desktop_dashboard_actions.dart @@ -30,11 +30,11 @@ class DesktopDashboardActions extends StatelessWidget { await MainActions.showWalletsAction.onTap(context, dashboardViewModel), ), DesktopActionButton( - title: MainActions.exchangeAction.name(context), - image: MainActions.exchangeAction.image, - canShow: MainActions.exchangeAction.canShow?.call(dashboardViewModel), - isEnabled: MainActions.exchangeAction.isEnabled?.call(dashboardViewModel), - onTap: () async => await MainActions.exchangeAction.onTap(context, dashboardViewModel), + title: MainActions.swapAction.name(context), + image: MainActions.swapAction.image, + canShow: MainActions.swapAction.canShow?.call(dashboardViewModel), + isEnabled: MainActions.swapAction.isEnabled?.call(dashboardViewModel), + onTap: () async => await MainActions.swapAction.onTap(context, dashboardViewModel), ), Row( children: [ diff --git a/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart b/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart index f86c72b80a..e7cd97a59f 100644 --- a/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart +++ b/lib/src/screens/dashboard/pages/balance/balance_row_widget.dart @@ -16,6 +16,7 @@ import 'package:cw_core/unspent_coin_type.dart'; import 'package:flutter/material.dart'; import 'package:fluttertoast/fluttertoast.dart'; import 'package:url_launcher/url_launcher.dart'; +import 'package:cake_wallet/themes/theme_base.dart'; class BalanceRowWidget extends StatelessWidget { BalanceRowWidget({ @@ -65,6 +66,8 @@ class BalanceRowWidget extends StatelessWidget { @override Widget build(BuildContext context) { + bool brightThemeType = false; + if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.bright) brightThemeType = true; return Column( children: [ Container( @@ -76,6 +79,15 @@ class BalanceRowWidget extends StatelessWidget { width: 1, ), color: Theme.of(context).extension()!.syncedBackgroundColor, + // boxShadow: [ + // BoxShadow( + // color: Theme.of(context) + // .extension()! + // .cardBorderColor + // .withAlpha(50), + // spreadRadius: dashboardViewModel.getShadowSpread(), + // blurRadius: dashboardViewModel.getShadowBlur()) + // ], ), child: TextButton( onPressed: () => Fluttertoast.showToast( @@ -310,7 +322,7 @@ class BalanceRowWidget extends StatelessWidget { ), ), if (hasSecondAdditionalBalance || hasSecondAvailableBalance) ...[ - SizedBox(height: 10), + SizedBox(height: 16), Container( margin: const EdgeInsets.only(left: 16, right: 16), decoration: BoxDecoration( @@ -320,6 +332,15 @@ class BalanceRowWidget extends StatelessWidget { width: 1, ), color: Theme.of(context).extension()!.syncedBackgroundColor, + boxShadow: [ + BoxShadow( + color: Theme.of(context) + .extension()! + .cardBorderColor + .withAlpha(50), + spreadRadius: dashboardViewModel.getShadowSpread(), + blurRadius: dashboardViewModel.getShadowBlur()) + ], ), child: TextButton( onPressed: () => Fluttertoast.showToast( @@ -643,6 +664,25 @@ class BalanceRowWidget extends StatelessWidget { ); } + // double getShadowSpread(){ + // double spread = 3; + // if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.bright) spread = 3; + // else if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.light) spread = 3; + // else if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.dark) spread = 1; + // else if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.oled) spread = 3; + // return spread; + // } + // + // + // double getShadowBlur(){ + // double blur = 7; + // if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.bright) blur = 7; + // else if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.light) blur = 7; + // else if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.dark) blur = 3; + // else if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.oled) blur = 7; + // return blur; + // } + void _showBalanceDescription(BuildContext context, String content) { showPopUp(context: context, builder: (_) => InformationPage(information: content)); } diff --git a/lib/src/screens/dashboard/pages/balance/crypto_balance_widget.dart b/lib/src/screens/dashboard/pages/balance/crypto_balance_widget.dart index 6b3256dada..2c3796912a 100644 --- a/lib/src/screens/dashboard/pages/balance/crypto_balance_widget.dart +++ b/lib/src/screens/dashboard/pages/balance/crypto_balance_widget.dart @@ -153,7 +153,7 @@ class CryptoBalanceWidget extends StatelessWidget { return ListView.separated( physics: NeverScrollableScrollPhysics(), shrinkWrap: true, - separatorBuilder: (_, __) => Container(padding: EdgeInsets.only(bottom: 8)), + separatorBuilder: (_, __) => Container(padding: EdgeInsets.only(bottom: 16)), itemCount: dashboardViewModel.balanceViewModel.formattedBalances.length, itemBuilder: (__, index) { final balance = @@ -210,10 +210,14 @@ class CryptoBalanceWidget extends StatelessWidget { )) ], if (dashboardViewModel.showSilentPaymentsCard) ...[ - SizedBox(height: 10), + SizedBox(height: 16), Padding( padding: const EdgeInsets.fromLTRB(16, 0, 16, 8), child: DashBoardRoundedCardWidget( + shadowBlur: dashboardViewModel.getShadowBlur(), + shadowSpread: dashboardViewModel.getShadowSpread(), + marginV: 0, + marginH: 0, customBorder: 30, title: S.of(context).silent_payments, subTitle: S.of(context).enable_silent_payments_scanning, @@ -276,10 +280,12 @@ class CryptoBalanceWidget extends StatelessWidget { ), ], if (dashboardViewModel.showMwebCard) ...[ - SizedBox(height: 10), + SizedBox(height: 16), Padding( padding: const EdgeInsets.fromLTRB(16, 0, 16, 8), child: DashBoardRoundedCardWidget( + marginV: 0, + marginH: 0, customBorder: 30, title: S.of(context).litecoin_mweb, subTitle: S.of(context).litecoin_mweb_description, @@ -352,6 +358,7 @@ class CryptoBalanceWidget extends StatelessWidget { ), ), ), + SizedBox(height: 150), ], ], ); diff --git a/lib/src/screens/dashboard/pages/cake_features_page.dart b/lib/src/screens/dashboard/pages/cake_features_page.dart index bd96fd5340..c98182d323 100644 --- a/lib/src/screens/dashboard/pages/cake_features_page.dart +++ b/lib/src/screens/dashboard/pages/cake_features_page.dart @@ -22,15 +22,13 @@ class CakeFeaturesPage extends StatelessWidget { @override Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 10.0), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10.0), + return Container( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox(height: 50), - Text( + Padding( + padding: EdgeInsets.only(left: 24, top: 16), + child: Text( 'Cake ${S.of(context).features}', style: TextStyle( fontSize: 24, @@ -38,11 +36,14 @@ class CakeFeaturesPage extends StatelessWidget { color: Theme.of(context).extension()!.pageTitleTextColor, ), ), + ), Expanded( child: ListView( children: [ - SizedBox(height: 20), + SizedBox(height: 2), DashBoardRoundedCardWidget( + shadowBlur: dashboardViewModel.getShadowBlur(), + shadowSpread: dashboardViewModel.getShadowSpread(), onTap: () { if (Platform.isMacOS) { _launchUrl("buy.cakepay.com"); @@ -59,8 +60,9 @@ class CakeFeaturesPage extends StatelessWidget { fit: BoxFit.cover, ), ), - SizedBox(height: 10), DashBoardRoundedCardWidget( + shadowBlur: dashboardViewModel.getShadowBlur(), + shadowSpread: dashboardViewModel.getShadowSpread(), onTap: () => _launchUrl("cake.nano-gpt.com"), title: "NanoGPT", subTitle: S.of(context).nanogpt_subtitle, @@ -71,32 +73,13 @@ class CakeFeaturesPage extends StatelessWidget { fit: BoxFit.cover, ), ), - SizedBox(height: 10), - Observer( - builder: (context) { - if (!dashboardViewModel.hasSignMessages) { - return const SizedBox(); - } - return DashBoardRoundedCardWidget( - onTap: () => Navigator.of(context).pushNamed(Routes.signPage), - title: S.current.sign_verify_message, - subTitle: S.current.sign_verify_message_sub, - icon: Icon( - Icons.speaker_notes_rounded, - color: - Theme.of(context).extension()!.pageTitleTextColor, - size: 75, - ), - ); - }, - ), + SizedBox(height: 125), ], ), ), ], ), - ), - ); + ); } void _launchUrl(String url) { diff --git a/lib/src/screens/dashboard/pages/navigation_dock.dart b/lib/src/screens/dashboard/pages/navigation_dock.dart new file mode 100644 index 0000000000..3aa2191cfe --- /dev/null +++ b/lib/src/screens/dashboard/pages/navigation_dock.dart @@ -0,0 +1,229 @@ +import 'dart:ui'; +import 'package:cake_wallet/entities/main_actions.dart'; +import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart'; +import 'package:flutter/material.dart'; +import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart'; +import 'package:cake_wallet/src/screens/dashboard/widgets/action_button.dart'; +import 'package:flutter_mobx/flutter_mobx.dart'; +import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart'; +import 'package:cake_wallet/themes/extensions/balance_page_theme.dart'; +import '../../../../themes/theme_base.dart'; + +class NavigationDock extends StatelessWidget { + const NavigationDock({ + required this.dashboardViewModel, + }); + + final DashboardViewModel dashboardViewModel; + + @override + Widget build(BuildContext context) { + return dashboardViewModel.settingsStore.currentTheme.type == ThemeType.bright + ? Positioned( + child: Observer( + builder: (_) { + return Container( + alignment: Alignment.bottomCenter, + height: 130, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Theme.of(context) + .extension()! + .thirdGradientBackgroundColor + .withAlpha(10), + Theme.of(context) + .extension()! + .thirdGradientBackgroundColor + .withAlpha(75), + Theme.of(context) + .extension()! + .thirdGradientBackgroundColor + .withAlpha(150), + Theme.of(context) + .extension()! + .thirdGradientBackgroundColor, + Theme.of(context) + .extension()! + .thirdGradientBackgroundColor + ], + ), + ), + child: Container( + margin: const EdgeInsets.only(left: 16, right: 16, bottom: 16), + child: ClipRRect( + borderRadius: BorderRadius.circular(50), + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 50, sigmaY: 50), + child: Container( + height: 75, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(50.0), + border: Border.all( + color: + Theme.of(context).extension()!.cardBorderColor, + width: 1, + ), + color: Theme.of(context) + .extension()! + .syncedBackgroundColor, + ), + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: MainActions.all + .where((element) => + element.canShow?.call(dashboardViewModel) ?? true) + .map( + (action) => Expanded( + child: Semantics( + button: true, + enabled: + (action.isEnabled?.call(dashboardViewModel) ?? true), + child: ActionButton( + key: ValueKey( + 'dashboard_page_${action.name(context)}_action_button_key'), + image: Image.asset( + action.image, + height: 24, + width: 24, + color: + action.isEnabled?.call(dashboardViewModel) ?? true + ? Theme.of(context) + .extension()! + .mainActionsIconColor + : Theme.of(context) + .extension()! + .labelTextColor, + ), + title: action.name(context), + onClick: () async => + await action.onTap(context, dashboardViewModel), + textColor: + action.isEnabled?.call(dashboardViewModel) ?? true + ? null + : Theme.of(context) + .extension()! + .labelTextColor, + ), + ), + ), + ) + .toList(), + ), + ), + ), + ), + ), + ), + ); + }, + ), + ) + : Positioned( + child: Observer( + builder: (_) { + return Container( + alignment: Alignment.bottomCenter, + height: 130, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Theme.of(context) + .extension()! + .thirdGradientBackgroundColor + .withAlpha(10), + Theme.of(context) + .extension()! + .thirdGradientBackgroundColor + .withAlpha(75), + Theme.of(context) + .extension()! + .thirdGradientBackgroundColor + .withAlpha(150), + Theme.of(context) + .extension()! + .thirdGradientBackgroundColor, + Theme.of(context) + .extension()! + .thirdGradientBackgroundColor + ], + ), + ), + child: Container( + margin: const EdgeInsets.only(left: 16, right: 16, bottom: 16), + child: Container( + height: 75, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(50.0), + border: Border.all( + color: Theme.of(context).extension()!.cardBorderColor, + width: 1, + ), + color: Theme.of(context) + .extension()! + .syncedBackgroundColor, + boxShadow: [ + BoxShadow( + color: Theme.of(context) + .extension()! + .cardBorderColor + .withAlpha(50), + spreadRadius: dashboardViewModel.getShadowSpread(), + blurRadius: dashboardViewModel.getShadowBlur()) + ], + ), + child: Container( + padding: EdgeInsets.symmetric(horizontal: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: MainActions.all + .where((element) => element.canShow?.call(dashboardViewModel) ?? true) + .map( + (action) => Expanded( + child: Semantics( + button: true, + enabled: (action.isEnabled?.call(dashboardViewModel) ?? true), + child: ActionButton( + key: ValueKey( + 'dashboard_page_${action.name(context)}_action_button_key'), + image: Image.asset( + action.image, + height: 24, + width: 24, + color: action.isEnabled?.call(dashboardViewModel) ?? true + ? Theme.of(context) + .extension()! + .mainActionsIconColor + : Theme.of(context) + .extension()! + .labelTextColor, + ), + title: action.name(context), + onClick: () async => + await action.onTap(context, dashboardViewModel), + textColor: action.isEnabled?.call(dashboardViewModel) ?? true + ? null + : Theme.of(context) + .extension()! + .labelTextColor, + ), + ), + ), + ) + .toList(), + ), + ), + ), + ), + ); + }, + ), + ); + } +} diff --git a/lib/src/screens/dashboard/widgets/action_button.dart b/lib/src/screens/dashboard/widgets/action_button.dart index 21f056c0c6..b762b65c7d 100644 --- a/lib/src/screens/dashboard/widgets/action_button.dart +++ b/lib/src/screens/dashboard/widgets/action_button.dart @@ -21,8 +21,8 @@ class ActionButton extends StatelessWidget { @override Widget build(BuildContext context) { - return GestureDetector( - onTap: () { + return TextButton( + onPressed: () { if (route?.isNotEmpty ?? false) { Navigator.of(context, rootNavigator: true).pushNamed(route!); } else { @@ -31,11 +31,12 @@ class ActionButton extends StatelessWidget { }, child: Container( color: Colors.transparent, - padding: EdgeInsets.only(top: 14, bottom: 16, left: 10, right: 10), + padding: EdgeInsets.only(top: 5, bottom: 5, left: 0, right: 0), alignment: alignment, child: Column( mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.center, + //mainAxisAlignment: MainAxisAlignment.center, children: [ Container( alignment: Alignment.center, @@ -47,7 +48,7 @@ class ActionButton extends StatelessWidget { Text( title, style: TextStyle( - fontSize: 10, + fontSize: 9, color: textColor ?? Theme.of(context).extension()!.cardTextColor), textAlign: TextAlign.center, diff --git a/lib/src/screens/dashboard/widgets/menu_widget.dart b/lib/src/screens/dashboard/widgets/menu_widget.dart index 7474e96761..16e0f88aa8 100644 --- a/lib/src/screens/dashboard/widgets/menu_widget.dart +++ b/lib/src/screens/dashboard/widgets/menu_widget.dart @@ -143,6 +143,7 @@ class MenuWidgetState extends State { return Container( height: headerHeight, decoration: BoxDecoration( + borderRadius: BorderRadius.only(bottomLeft: Radius.circular(24)), gradient: LinearGradient(colors: [ Theme.of(context).extension()!.headerFirstGradientColor, Theme.of(context).extension()!.headerSecondGradientColor, @@ -209,7 +210,7 @@ class MenuWidgetState extends State { ); }, separatorBuilder: (_, index) => Container( - height: 1, + height: 0, color: Theme.of(context).extension()!.dividerColor, ), itemCount: itemCount + 1, diff --git a/lib/src/screens/exchange/widgets/exchange_card.dart b/lib/src/screens/exchange/widgets/exchange_card.dart index 7c4cc948db..a73c7fb66e 100644 --- a/lib/src/screens/exchange/widgets/exchange_card.dart +++ b/lib/src/screens/exchange/widgets/exchange_card.dart @@ -193,9 +193,11 @@ class ExchangeCardState extends State> { width: double.infinity, color: Colors.transparent, child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + SizedBox(height: 10), Row( mainAxisAlignment: MainAxisAlignment.start, children: [ + SizedBox(height: 40), Text( key: ValueKey('${_cardInstanceName}_title_key'), _title, @@ -207,6 +209,7 @@ class ExchangeCardState extends State> { ], ), CurrencyAmountTextField( + padding: EdgeInsets.zero, currencyPickerButtonKey: ValueKey('${_cardInstanceName}_currency_picker_button_key'), selectedCurrencyTextKey: ValueKey('${_cardInstanceName}_selected_currency_text_key'), selectedCurrencyTagTextKey: @@ -273,7 +276,7 @@ class ExchangeCardState extends State> { ? FocusTraversalOrder( order: NumericFocusOrder(2), child: Padding( - padding: widget.addressRowPadding ?? EdgeInsets.only(top: 20), + padding: widget.addressRowPadding ?? EdgeInsets.only(top: 12), child: AddressTextField( addressKey: ValueKey('${_cardInstanceName}_editable_address_textfield_key'), focusNode: widget.addressFocusNode, @@ -313,7 +316,7 @@ class ExchangeCardState extends State> { ) : Offstage() : Padding( - padding: EdgeInsets.only(top: 10), + padding: EdgeInsets.only(top: 0), child: Builder( builder: (context) => Stack(children: [ FocusTraversalOrder( diff --git a/lib/src/screens/exchange/widgets/mobile_exchange_cards_section.dart b/lib/src/screens/exchange/widgets/mobile_exchange_cards_section.dart index d53f163394..80f8bd72dd 100644 --- a/lib/src/screens/exchange/widgets/mobile_exchange_cards_section.dart +++ b/lib/src/screens/exchange/widgets/mobile_exchange_cards_section.dart @@ -23,7 +23,7 @@ class MobileExchangeCardsSection extends StatelessWidget { @override Widget build(BuildContext context) { return Container( - padding: EdgeInsets.only(bottom: isBuySellOption ? 8 : 32), + padding: EdgeInsets.only(bottom: isBuySellOption ? 16 : 16), decoration: BoxDecoration( borderRadius: BorderRadius.only( bottomLeft: Radius.circular(24), @@ -54,7 +54,7 @@ class MobileExchangeCardsSection extends StatelessWidget { end: Alignment.bottomRight, ), ), - padding: EdgeInsets.fromLTRB(24, 90, 24, isBuySellOption ? 8 : 32), + padding: EdgeInsets.fromLTRB(24, 90, 24, isBuySellOption ? 24 : 16), child: Column( children: [ if (isBuySellOption) Column( @@ -68,7 +68,7 @@ class MobileExchangeCardsSection extends StatelessWidget { ), ), Padding( - padding: EdgeInsets.only(top: 29, left: 24, right: 24), + padding: EdgeInsets.only(top: 20, left: 24, right: 24), child: secondExchangeCard, ) ], diff --git a/lib/src/screens/nodes/widgets/node_list_row.dart b/lib/src/screens/nodes/widgets/node_list_row.dart index 180942f840..935a6f713d 100644 --- a/lib/src/screens/nodes/widgets/node_list_row.dart +++ b/lib/src/screens/nodes/widgets/node_list_row.dart @@ -18,6 +18,37 @@ class NodeListRow extends StandardListRow { final Node node; final bool isPow; + @override + Widget build(BuildContext context) { + final leading = buildLeading(context); + final trailing = buildTrailing(context); + return Container( + height: 56, + padding: EdgeInsets.only(left: 12, right: 12, top: 2, bottom: 2), + margin: EdgeInsets.only(top: 2, bottom: 2), + child: TextButton( + onPressed: () => onTap?.call(context), + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(Theme.of(context).cardColor), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10) + ), + ), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (leading != null) leading, + buildCenter(context, hasLeftOffset: leading != null), + if (trailing != null) trailing, + ], + ), + ), + ); + } + @override Widget buildLeading(BuildContext context) { return FutureBuilder( @@ -56,6 +87,36 @@ class NodeHeaderListRow extends StandardListRow { NodeHeaderListRow({required String title, required void Function(BuildContext context) onTap}) : super(title: title, onTap: onTap, isSelected: false); + @override + Widget build(BuildContext context) { + final leading = buildLeading(context); + final trailing = buildTrailing(context); + return Container( + height: 56, + padding: EdgeInsets.only(left: 12, right: 12, top: 2, bottom: 2), + child: TextButton( + onPressed: () => onTap?.call(context), + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(Theme.of(context).cardColor), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10) + ), + ), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (leading != null) leading, + buildCenter(context, hasLeftOffset: leading != null), + if (trailing != null) trailing, + ], + ), + ), + ); + } + @override Widget buildTrailing(BuildContext context) { return SizedBox( diff --git a/lib/src/screens/send/widgets/send_card.dart b/lib/src/screens/send/widgets/send_card.dart index 0713fb8c45..eed0ce2334 100644 --- a/lib/src/screens/send/widgets/send_card.dart +++ b/lib/src/screens/send/widgets/send_card.dart @@ -142,7 +142,7 @@ class SendCardState extends State with AutomaticKeepAliveClientMixin( diff --git a/lib/src/screens/settings/manage_nodes_page.dart b/lib/src/screens/settings/manage_nodes_page.dart index 3cc251019f..a5db773ccf 100644 --- a/lib/src/screens/settings/manage_nodes_page.dart +++ b/lib/src/screens/settings/manage_nodes_page.dart @@ -34,7 +34,6 @@ class ManageNodesPage extends BasePage { onTap: (_) async => await Navigator.of(context).pushNamed(Routes.newNode), ), ), - const StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)), SizedBox(height: 20), Observer( builder: (BuildContext context) { diff --git a/lib/src/screens/settings/other_settings_page.dart b/lib/src/screens/settings/other_settings_page.dart index 24f3217985..8e0a259589 100644 --- a/lib/src/screens/settings/other_settings_page.dart +++ b/lib/src/screens/settings/other_settings_page.dart @@ -63,13 +63,6 @@ class OtherSettingsPage extends BasePage { handler: (BuildContext context) => Navigator.of(context).pushNamed(Routes.readDisclaimer), ), - SettingsSwitcherCell( - title: S.of(context).show_address_book_popup, - value: _otherSettingsViewModel.showAddressBookPopup, - onValueChange: (_, bool value) { - _otherSettingsViewModel.setShowAddressBookPopup(value); - }, - ), Spacer(), SettingsVersionCell( title: S.of(context).version(_otherSettingsViewModel.currentVersion)), diff --git a/lib/src/screens/settings/security_backup_page.dart b/lib/src/screens/settings/security_backup_page.dart index bb1c00ff50..172ae78d9a 100644 --- a/lib/src/screens/settings/security_backup_page.dart +++ b/lib/src/screens/settings/security_backup_page.dart @@ -35,41 +35,6 @@ class SecurityBackupPage extends BasePage { child: Column( mainAxisSize: MainAxisSize.min, children: [ - if (!_isHardwareWallet) - SettingsCellWithArrow( - key: ValueKey('security_backup_page_show_keys_button_key'), - title: S.current.show_keys, - handler: (_) => _authService.authenticateAction( - context, - route: Routes.showKeys, - conditionToDetermineIfToUse2FA: - _securitySettingsViewModel.shouldRequireTOTP2FAForAllSecurityAndBackupSettings, - ), - ), - if (!SettingsStoreBase.walletPasswordDirectInput) - SettingsCellWithArrow( - key: ValueKey('security_backup_page_create_backup_button_key'), - title: S.current.create_backup, - handler: (_) => _authService.authenticateAction( - context, - route: Routes.backup, - conditionToDetermineIfToUse2FA: - _securitySettingsViewModel.shouldRequireTOTP2FAForAllSecurityAndBackupSettings, - ), - ), - SettingsCellWithArrow( - key: ValueKey('security_backup_page_change_pin_button_key'), - title: S.current.settings_change_pin, - handler: (_) => _authService.authenticateAction( - context, - route: Routes.setupPin, - arguments: (PinCodeState setupPinContext, String _) { - setupPinContext.close(); - }, - conditionToDetermineIfToUse2FA: - _securitySettingsViewModel.shouldRequireTOTP2FAForAllSecurityAndBackupSettings, - ), - ), if (DeviceInfo.instance.isMobile || Platform.isMacOS || Platform.isLinux) Observer(builder: (_) { return SettingsSwitcherCell( @@ -110,6 +75,47 @@ class SecurityBackupPage extends BasePage { }, ); }), + if (!_isHardwareWallet) + SettingsCellWithArrow( + key: ValueKey('security_backup_page_show_keys_button_key'), + title: S.current.show_keys, + handler: (_) => _authService.authenticateAction( + context, + route: Routes.showKeys, + conditionToDetermineIfToUse2FA: + _securitySettingsViewModel.shouldRequireTOTP2FAForAllSecurityAndBackupSettings, + ), + ), + if (!SettingsStoreBase.walletPasswordDirectInput) + SettingsCellWithArrow( + key: ValueKey('security_backup_page_create_backup_button_key'), + title: S.current.create_backup, + handler: (_) => _authService.authenticateAction( + context, + route: Routes.backup, + conditionToDetermineIfToUse2FA: + _securitySettingsViewModel.shouldRequireTOTP2FAForAllSecurityAndBackupSettings, + ), + ), + SettingsCellWithArrow( + key: ValueKey('security_backup_page_change_pin_button_key'), + title: S.current.settings_change_pin, + handler: (_) => _authService.authenticateAction( + context, + route: Routes.setupPin, + arguments: (PinCodeState setupPinContext, String _) { + setupPinContext.close(); + }, + conditionToDetermineIfToUse2FA: + _securitySettingsViewModel.shouldRequireTOTP2FAForAllSecurityAndBackupSettings, + ), + ), + SettingsCellWithArrow( + key: ValueKey('security_backup_page_sign_and_verify'), + title: S.current.sign_verify_title, + handler: (_) => Navigator.of(context).pushNamed(Routes.signPage) + //_securitySettingsViewModel.pinCodeRequiredDuration, + ), Observer( builder: (context) { return SettingsCellWithArrow( diff --git a/lib/src/screens/settings/widgets/settings_choices_cell.dart b/lib/src/screens/settings/widgets/settings_choices_cell.dart index 63ad1ef9ad..cbb8c60e9b 100644 --- a/lib/src/screens/settings/widgets/settings_choices_cell.dart +++ b/lib/src/screens/settings/widgets/settings_choices_cell.dart @@ -12,7 +12,7 @@ class SettingsChoicesCell extends StatelessWidget { Widget build(BuildContext context) { return Container( color: Theme.of(context).colorScheme.background, - padding: EdgeInsets.all(24), + padding: EdgeInsets.only(left: 24, right: 24, top: 16, bottom: 16), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, @@ -30,7 +30,7 @@ class SettingsChoicesCell extends StatelessWidget { ), ], ), - const SizedBox(height: 24), + const SizedBox(height: 12), ], Center( child: Container( diff --git a/lib/src/screens/settings/widgets/settings_switcher_cell.dart b/lib/src/screens/settings/widgets/settings_switcher_cell.dart index 6a3c8b4a0c..bc3421eada 100644 --- a/lib/src/screens/settings/widgets/settings_switcher_cell.dart +++ b/lib/src/screens/settings/widgets/settings_switcher_cell.dart @@ -1,6 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:cake_wallet/src/widgets/standard_list.dart'; import 'package:cake_wallet/src/widgets/standard_switch.dart'; +import 'package:flutter/material.dart'; class SettingsSwitcherCell extends StandardListRow { SettingsSwitcherCell({ @@ -21,6 +22,37 @@ class SettingsSwitcherCell extends StandardListRow { Widget buildTrailing(BuildContext context) => StandardSwitch(value: value, onTaped: () => onValueChange?.call(context, !value)); + @override + Widget build(BuildContext context) { + final leading = buildLeading(context); + final trailing = buildTrailing(context); + return Container( + height: 56, + padding: EdgeInsets.only(left: 12, right: 12), + child: TextButton( + onPressed: () => onValueChange?.call(context, !value), + style: ButtonStyle( + //backgroundColor: MaterialStateProperty.all(Theme.of(context).cardColor), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10) + ), + ), + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + if (leading != null) leading, + buildCenter(context, hasLeftOffset: leading != null), + if (trailing != null) trailing, + ], + ), + ), + ); + } + + @override Widget? buildLeading(BuildContext context) => leading; } diff --git a/lib/src/screens/support/support_page.dart b/lib/src/screens/support/support_page.dart index 88154e91df..2dd0988138 100644 --- a/lib/src/screens/support/support_page.dart +++ b/lib/src/screens/support/support_page.dart @@ -42,7 +42,7 @@ class SupportPage extends BasePage { child: Column( children: [ Padding( - padding: EdgeInsets.only(top: 24), + padding: EdgeInsets.only(top: 20), child: OptionTile( icon: Icon( Icons.support_agent, @@ -61,7 +61,7 @@ class SupportPage extends BasePage { ), ), Padding( - padding: EdgeInsets.only(top: 24), + padding: EdgeInsets.only(top: 20), child: OptionTile( icon: Icon( Icons.find_in_page, @@ -74,7 +74,7 @@ class SupportPage extends BasePage { ), ), Padding( - padding: EdgeInsets.only(top: 24), + padding: EdgeInsets.only(top: 20), child: OptionTile( icon: Icon( Icons.contact_support, diff --git a/lib/src/screens/wallet_list/wallet_list_page.dart b/lib/src/screens/wallet_list/wallet_list_page.dart index e9ca4e360f..7656bf62b8 100644 --- a/lib/src/screens/wallet_list/wallet_list_page.dart +++ b/lib/src/screens/wallet_list/wallet_list_page.dart @@ -31,6 +31,8 @@ import 'package:cw_core/wallet_type.dart'; import 'package:flutter/material.dart'; import 'package:flutter_mobx/flutter_mobx.dart'; +import '../../../themes/extensions/dashboard_page_theme.dart'; + class WalletListPage extends BasePage { WalletListPage({ required this.walletListViewModel, @@ -88,7 +90,8 @@ class WalletListPage extends BasePage { width: 36, decoration: BoxDecoration( shape: BoxShape.circle, - color: Theme.of(context).extension()!.buttonColor, + color: + Theme.of(context).extension()!.buttonColor, ), child: filterIcon, ), @@ -145,259 +148,336 @@ class WalletListBodyState extends State { color: Theme.of(context).extension()!.buttonTextColor); return Container( + height: double.infinity, padding: EdgeInsets.only(top: 16), - child: Column( - children: [ - Expanded( - child: SingleChildScrollView( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (widget.walletListViewModel.multiWalletGroups.isNotEmpty) ...{ - Padding( - padding: const EdgeInsets.only(left: 24), - child: Text( - S.current.shared_seed_wallet_groups, - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.w500, - color: Theme.of(context).extension()!.titleColor, - ), + + child: Stack( + alignment: Alignment.bottomCenter, + fit: StackFit.expand, + children: [ + SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (widget + .walletListViewModel.multiWalletGroups.isNotEmpty) ...{ + Padding( + padding: const EdgeInsets.only(left: 24), + child: Text( + S.current.shared_seed_wallet_groups, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w500, + color: Theme.of(context) + .extension()! + .titleColor, ), ), - SizedBox(height: 16), - Container( - child: Observer( - builder: (_) => FilteredList( - shrinkWrap: true, - list: widget.walletListViewModel.multiWalletGroups, - updateFunction: widget.walletListViewModel.reorderAccordingToWalletList, - itemBuilder: (context, index) { - final group = widget.walletListViewModel.multiWalletGroups[index]; - final groupName = group.groupName ?? - '${S.current.wallet_group} ${index + 1}'; + ), + SizedBox(height: 16), + Container( + child: Observer( + builder: (_) => FilteredList( + shrinkWrap: true, + list: widget.walletListViewModel.multiWalletGroups, + updateFunction: widget + .walletListViewModel.reorderAccordingToWalletList, + itemBuilder: (context, index) { + final group = widget + .walletListViewModel.multiWalletGroups[index]; + final groupName = group.groupName ?? + '${S.current.wallet_group} ${index + 1}'; - widget.walletListViewModel.updateTileState( - index, - widget.walletListViewModel.expansionTileStateTrack[index] ?? false, - ); + widget.walletListViewModel.updateTileState( + index, + widget.walletListViewModel + .expansionTileStateTrack[index] ?? + false, + ); - return GroupedWalletExpansionTile( - onExpansionChanged: (value) { - widget.walletListViewModel.updateTileState(index, value); - setState(() {}); + return GroupedWalletExpansionTile( + onExpansionChanged: (value) { + widget.walletListViewModel + .updateTileState(index, value); + setState(() {}); + }, + shouldShowCurrentWalletPointer: true, + borderRadius: BorderRadius.all(Radius.circular(16)), + margin: EdgeInsets.only( + left: 20, right: 20, bottom: 12), + title: groupName, + tileKey: ValueKey( + 'group_wallets_expansion_tile_widget_$index'), + leadingWidget: Icon( + Icons.account_balance_wallet_outlined, + size: 28, + ), + trailingWidget: EditWalletButtonWidget( + width: 74, + isGroup: true, + isExpanded: widget.walletListViewModel + .expansionTileStateTrack[index]!, + onTap: () { + final wallet = widget.walletListViewModel + .convertWalletInfoToWalletListItem( + group.wallets.first); + Navigator.of(context).pushNamed( + Routes.walletEdit, + arguments: WalletEditPageArguments( + walletListViewModel: + widget.walletListViewModel, + editingWallet: wallet, + isWalletGroup: true, + groupName: groupName, + parentAddress: group.parentAddress, + ), + ); }, - shouldShowCurrentWalletPointer: true, - borderRadius: BorderRadius.all(Radius.circular(16)), - margin: EdgeInsets.only(left: 20, right: 20, bottom: 12), - title: groupName, - tileKey: ValueKey('group_wallets_expansion_tile_widget_$index'), - leadingWidget: Icon( - Icons.account_balance_wallet_outlined, - size: 28, - ), - trailingWidget: EditWalletButtonWidget( - width: 74, - isGroup: true, - isExpanded: widget.walletListViewModel.expansionTileStateTrack[index]!, - onTap: () { - final wallet = widget.walletListViewModel - .convertWalletInfoToWalletListItem(group.wallets.first); - Navigator.of(context).pushNamed( - Routes.walletEdit, - arguments: WalletEditPageArguments( - walletListViewModel: widget.walletListViewModel, - editingWallet: wallet, - isWalletGroup: true, - groupName: groupName, - parentAddress: group.parentAddress, - ), - ); - }, - ), - childWallets: group.wallets.map((walletInfo) { - return widget.walletListViewModel.convertWalletInfoToWalletListItem(walletInfo); - }).toList(), - isSelected: false, - onChildItemTapped: (wallet) => - wallet.isCurrent ? null : _loadWallet(wallet), - childTrailingWidget: (item) { - return item.isCurrent - ? SizedBox.shrink() - : Padding( - padding: const EdgeInsets.only(right: 16), - child: EditWalletButtonWidget( - width: 44, - onTap: () => Navigator.of(context).pushNamed( - Routes.walletEdit, - arguments: WalletEditPageArguments( - walletListViewModel: widget.walletListViewModel, - editingWallet: item, - ), + ), + childWallets: group.wallets.map((walletInfo) { + return widget.walletListViewModel + .convertWalletInfoToWalletListItem( + walletInfo); + }).toList(), + isSelected: false, + onChildItemTapped: (wallet) => + wallet.isCurrent ? null : _loadWallet(wallet), + childTrailingWidget: (item) { + return item.isCurrent + ? SizedBox.shrink() + : Padding( + padding: const EdgeInsets.only(right: 16), + child: EditWalletButtonWidget( + width: 44, + onTap: () => + Navigator.of(context).pushNamed( + Routes.walletEdit, + arguments: WalletEditPageArguments( + walletListViewModel: + widget.walletListViewModel, + editingWallet: item, ), ), - ); - }, - ); - }, - ), + ), + ); + }, + ); + }, ), ), - SizedBox(height: 24), - }, - if (widget.walletListViewModel.singleWalletsList.isNotEmpty) ...{ - Padding( - padding: const EdgeInsets.only(left: 24), - child: Text( - S.current.single_seed_wallets_group, - style: TextStyle( - fontSize: 18, - fontWeight: FontWeight.w500, - color: Theme.of(context).extension()!.titleColor, - ), + ), + SizedBox(height: 24), + }, + if (widget + .walletListViewModel.singleWalletsList.isNotEmpty) ...{ + Padding( + padding: const EdgeInsets.only(left: 24), + child: Text( + S.current.single_seed_wallets_group, + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.w500, + color: Theme.of(context) + .extension()! + .titleColor, ), ), - SizedBox(height: 16), - Container( - child: Observer( - builder: (_) => FilteredList( - shrinkWrap: true, - list: widget.walletListViewModel.singleWalletsList, - updateFunction: widget.walletListViewModel.reorderAccordingToWalletList, - itemBuilder: (context, index) { - final wallet = widget.walletListViewModel.singleWalletsList[index]; - final currentColor = wallet.isCurrent - ? Theme.of(context) - .extension()! - .createNewWalletButtonBackgroundColor - : Theme.of(context).colorScheme.background; + ), + SizedBox(height: 16), + Container( + child: Observer( + builder: (_) => FilteredList( + shrinkWrap: true, + list: widget.walletListViewModel.singleWalletsList, + updateFunction: widget + .walletListViewModel.reorderAccordingToWalletList, + itemBuilder: (context, index) { + final wallet = widget + .walletListViewModel.singleWalletsList[index]; + final currentColor = wallet.isCurrent + ? Theme.of(context) + .extension()! + .createNewWalletButtonBackgroundColor + : Theme.of(context).colorScheme.background; - return GroupedWalletExpansionTile( - tileKey: ValueKey('single_wallets_expansion_tile_widget_$index'), - isCurrentlySelectedWallet: wallet.isCurrent, - leadingWidget: SizedBox( - width: wallet.isCurrent ? 56 : 40, - child: Row( - children: [ - wallet.isCurrent - ? Container( - height: 35, - width: 6, - margin: EdgeInsets.only(right: 16), - decoration: BoxDecoration( - borderRadius: BorderRadius.only( - topRight: Radius.circular(16), - bottomRight: Radius.circular(16), - ), - color: currentColor, + return GroupedWalletExpansionTile( + tileKey: ValueKey( + 'single_wallets_expansion_tile_widget_$index'), + isCurrentlySelectedWallet: wallet.isCurrent, + leadingWidget: SizedBox( + width: wallet.isCurrent ? 56 : 40, + child: Row( + children: [ + wallet.isCurrent + ? Container( + height: 35, + width: 6, + margin: EdgeInsets.only(right: 16), + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topRight: Radius.circular(16), + bottomRight: Radius.circular(16), ), - ) - : SizedBox(width: 6), - Image.asset( - walletTypeToCryptoCurrency(wallet.type).iconPath!, - width: 32, - height: 32, - ), - ], - ), - ), - title: wallet.name, - isSelected: false, - borderRadius: BorderRadius.all(Radius.circular(16)), - margin: EdgeInsets.only(left: 20, right: 20, bottom: 12), - onTitleTapped: () => wallet.isCurrent ? null : _loadWallet(wallet), - trailingWidget: wallet.isCurrent - ? null - : EditWalletButtonWidget( - width: 44, - onTap: () { - Navigator.of(context).pushNamed( - Routes.walletEdit, - arguments: WalletEditPageArguments( - walletListViewModel: widget.walletListViewModel, - editingWallet: wallet, + color: currentColor, ), - ); - }, - ), - ); - }, - ), + ) + : SizedBox(width: 6), + Image.asset( + walletTypeToCryptoCurrency(wallet.type) + .iconPath!, + width: 32, + height: 32, + ), + ], + ), + ), + title: wallet.name, + isSelected: false, + borderRadius: BorderRadius.all(Radius.circular(16)), + margin: EdgeInsets.only( + left: 20, right: 20, bottom: 12), + onTitleTapped: () => + wallet.isCurrent ? null : _loadWallet(wallet), + trailingWidget: wallet.isCurrent + ? null + : EditWalletButtonWidget( + width: 44, + onTap: () { + Navigator.of(context).pushNamed( + Routes.walletEdit, + arguments: WalletEditPageArguments( + walletListViewModel: + widget.walletListViewModel, + editingWallet: wallet, + ), + ); + }, + ), + ); + }, ), ), - }, - ], - ), + ), + SizedBox(height: 150), + }, + ], ), ), - Padding( - padding: const EdgeInsets.all(24), - child: Column( - children: [ - PrimaryImageButton( - key: ValueKey('wallet_list_page_restore_wallet_button_key'), - onPressed: () { - if (widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets) { - widget.authService.authenticateAction( - context, - route: Routes.restoreOptions, - arguments: false, - conditionToDetermineIfToUse2FA: widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets, - ); - } else { - Navigator.of(context).pushNamed(Routes.restoreOptions, arguments: false); - } - }, - image: restoreWalletImage, - text: S.of(context).wallet_list_restore_wallet, - color: Theme.of(context).cardColor, - textColor: Theme.of(context).extension()!.buttonTextColor, + Positioned( + bottom: 0.0, + child: Container( + //padding: EdgeInsets.only(top: 100), + alignment: Alignment.bottomCenter, + height: 185, + //width: 600, + //padding: EdgeInsets.only(top: 50), + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Theme.of(context).colorScheme.background.withAlpha(10), + Theme.of(context).colorScheme.background, + Theme.of(context).colorScheme.background, + Theme.of(context).colorScheme.background + ], ), - SizedBox(height: 10.0), - PrimaryImageButton( - key: ValueKey('wallet_list_page_create_new_wallet_button_key'), - onPressed: () { - //TODO(David): Find a way to optimize this - if (isSingleCoin) { - if (widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets) { - widget.authService.authenticateAction( - context, - route: Routes.newWallet, - arguments: NewWalletArguments( - type: widget.walletListViewModel.currentWalletType, - ), - conditionToDetermineIfToUse2FA: widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets, - ); - } else { - Navigator.of(context).pushNamed( - Routes.newWallet, - arguments: NewWalletArguments( - type: widget.walletListViewModel.currentWalletType, - ), - ); - } - } else { - if (widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets) { - widget.authService.authenticateAction( - context, - route: Routes.newWalletType, - conditionToDetermineIfToUse2FA: widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets, - ); - } else { - Navigator.of(context).pushNamed(Routes.newWalletType); - } - } - }, - image: newWalletImage, - text: S.of(context).wallet_list_create_new_wallet, - color: Theme.of(context).primaryColor, - textColor: Colors.white, + ), + child: Container( + height: 120, + width: MediaQuery.of(context).size.width, + //alignment: Alignment.bottomCenter, + margin: EdgeInsets.only(bottom: 24), + padding: EdgeInsets.only(left: 16, right: 16), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + PrimaryImageButton( + key: ValueKey( + 'wallet_list_page_restore_wallet_button_key'), + onPressed: () { + if (widget.walletListViewModel + .shouldRequireTOTP2FAForCreatingNewWallets) { + widget.authService.authenticateAction( + context, + route: Routes.restoreOptions, + arguments: false, + conditionToDetermineIfToUse2FA: widget + .walletListViewModel + .shouldRequireTOTP2FAForCreatingNewWallets, + ); + } else { + Navigator.of(context).pushNamed(Routes.restoreOptions, + arguments: false); + } + }, + image: restoreWalletImage, + text: S.of(context).wallet_list_restore_wallet, + color: Theme.of(context).cardColor, + textColor: Theme.of(context) + .extension()! + .buttonTextColor, + ), + SizedBox(height: 10.0), + PrimaryImageButton( + key: ValueKey( + 'wallet_list_page_create_new_wallet_button_key'), + onPressed: () { + //TODO(David): Find a way to optimize this + if (isSingleCoin) { + if (widget.walletListViewModel + .shouldRequireTOTP2FAForCreatingNewWallets) { + widget.authService.authenticateAction( + context, + route: Routes.newWallet, + arguments: NewWalletArguments( + type: widget + .walletListViewModel.currentWalletType, + ), + conditionToDetermineIfToUse2FA: widget + .walletListViewModel + .shouldRequireTOTP2FAForCreatingNewWallets, + ); + } else { + Navigator.of(context).pushNamed( + Routes.newWallet, + arguments: NewWalletArguments( + type: widget + .walletListViewModel.currentWalletType, + ), + ); + } + } else { + if (widget.walletListViewModel + .shouldRequireTOTP2FAForCreatingNewWallets) { + widget.authService.authenticateAction( + context, + route: Routes.newWalletType, + conditionToDetermineIfToUse2FA: widget + .walletListViewModel + .shouldRequireTOTP2FAForCreatingNewWallets, + ); + } else { + Navigator.of(context) + .pushNamed(Routes.newWalletType); + } + } + }, + image: newWalletImage, + text: S.of(context).wallet_list_create_new_wallet, + color: Theme.of(context).primaryColor, + textColor: Colors.white, + ), + ], ), - ], + ), + ), ), - ), ], ), + ); } @@ -405,7 +485,8 @@ class WalletListBodyState extends State { if (SettingsStoreBase.walletPasswordDirectInput) { Navigator.of(context).pushNamed(Routes.walletUnlockLoadable, arguments: WalletUnlockArguments( - callback: (bool isAuthenticatedSuccessfully, AuthPageState auth) async { + callback: + (bool isAuthenticatedSuccessfully, AuthPageState auth) async { if (isAuthenticatedSuccessfully) { auth.close(); setState(() {}); diff --git a/lib/src/widgets/dashboard_card_widget.dart b/lib/src/widgets/dashboard_card_widget.dart index dc223eb02a..66eeedc815 100644 --- a/lib/src/widgets/dashboard_card_widget.dart +++ b/lib/src/widgets/dashboard_card_widget.dart @@ -15,7 +15,11 @@ class DashBoardRoundedCardWidget extends StatelessWidget { this.icon, this.onClose, this.customBorder, + this.shadowSpread, + this.shadowBlur, super.key, + this.marginV, + this.marginH, }); final VoidCallback onTap; @@ -27,71 +31,97 @@ class DashBoardRoundedCardWidget extends StatelessWidget { final Widget? icon; final Image? image; final double? customBorder; + final double? marginV; + final double? marginH; + final double? shadowSpread; + final double? shadowBlur; @override Widget build(BuildContext context) { return InkWell( - onTap: onTap, - hoverColor: Colors.transparent, - splashColor: Colors.transparent, - highlightColor: Colors.transparent, + //onTap: onTap, + //hoverColor: Colors.transparent, + //splashColor: Colors.transparent, + //highlightColor: Colors.transparent, child: Stack( children: [ - Container( - padding: EdgeInsets.all(20), - width: double.infinity, - decoration: BoxDecoration( - color: Theme.of(context).extension()!.syncedBackgroundColor, - borderRadius: BorderRadius.circular(customBorder ?? 20), - border: Border.all( - color: Theme.of(context).extension()!.cardBorderColor, - ), - ), - child: Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - title, - style: TextStyle( - color: - Theme.of(context).extension()!.cardTextColor, - fontSize: 24, - fontWeight: FontWeight.w900, - ), - softWrap: true, - ), - SizedBox(height: 5), - Text( - subTitle, - style: TextStyle( + Container( + margin: EdgeInsets.symmetric(horizontal: marginH ?? 20, vertical: marginV ?? 8), + //padding: EdgeInsets.all(20), + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(customBorder ?? 20), + border: Border.all( + color: Theme.of(context).extension()!.cardBorderColor, + ), + // boxShadow: [ + // BoxShadow( + // color: Theme.of(context).extension()!.cardBorderColor + // .withAlpha(50), + // spreadRadius: shadowSpread ?? 3, + // blurRadius: shadowBlur ?? 7, + // ) + // ], + ), + child: TextButton( + onPressed: onTap, + style: TextButton.styleFrom( + backgroundColor: Theme.of(context) + .extension()! + .syncedBackgroundColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(customBorder ?? 20)), + padding: EdgeInsets.all(24) + ), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: TextStyle( color: Theme.of(context) .extension()! .cardTextColor, - fontWeight: FontWeight.w500, - fontFamily: 'Lato'), - softWrap: true, - ), - ], + fontSize: 24, + fontWeight: FontWeight.w900, + ), + softWrap: true, + ), + SizedBox(height: 5), + Text( + subTitle, + style: TextStyle( + color: Theme.of(context) + .extension()! + .cardTextColor, + fontWeight: FontWeight.w500, + fontFamily: 'Lato'), + softWrap: true, + ), + ], + ), ), - ), - if (image != null) image! - else if (svgPicture != null) svgPicture!, - if (icon != null) icon! - ], - ), - if (hint != null) ...[ - SizedBox(height: 10), - hint!, - ] - ], + if (image != null) + image! + else if (svgPicture != null) + svgPicture!, + if (icon != null) icon! + ], + ), + if (hint != null) ...[ + SizedBox(height: 10), + hint!, + ] + ], + ), + ), ), - ), if (onClose != null) Positioned( top: 10, @@ -99,7 +129,9 @@ class DashBoardRoundedCardWidget extends StatelessWidget { child: IconButton( icon: Icon(Icons.close), onPressed: onClose, - color: Theme.of(context).extension()!.cardTextColor, + color: Theme.of(context) + .extension()! + .cardTextColor, ), ), ], diff --git a/lib/src/widgets/option_tile.dart b/lib/src/widgets/option_tile.dart index c2d8b95065..c269876586 100644 --- a/lib/src/widgets/option_tile.dart +++ b/lib/src/widgets/option_tile.dart @@ -19,16 +19,17 @@ class OptionTile extends StatelessWidget { @override Widget build(BuildContext context) { - return GestureDetector( - onTap: onPressed, - child: Container( - width: double.infinity, - padding: EdgeInsets.all(24), - alignment: Alignment.center, - decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(12)), - color: Theme.of(context).cardColor, + return Container( + width: double.infinity, + padding: EdgeInsets.only(left: 6, right: 6), + alignment: Alignment.center, + child: TextButton( + style: TextButton.styleFrom( + backgroundColor: Theme.of(context).cardColor, + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)), + padding: EdgeInsets.all(24) ), + onPressed: onPressed, child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, @@ -48,7 +49,9 @@ class OptionTile extends StatelessWidget { style: TextStyle( fontSize: 20, fontWeight: FontWeight.w500, - color: Theme.of(context).extension()!.titleColor, + color: Theme.of(context) + .extension()! + .titleColor, ), ), Padding( @@ -58,7 +61,9 @@ class OptionTile extends StatelessWidget { style: TextStyle( fontSize: 14, fontWeight: FontWeight.normal, - color: Theme.of(context).extension()!.descriptionColor, + color: Theme.of(context) + .extension()! + .descriptionColor, ), ), ) diff --git a/lib/src/widgets/setting_action_button.dart b/lib/src/widgets/setting_action_button.dart index bebc4b8e1a..4fd7260f0c 100644 --- a/lib/src/widgets/setting_action_button.dart +++ b/lib/src/widgets/setting_action_button.dart @@ -1,6 +1,10 @@ import 'package:cake_wallet/palette.dart'; import 'package:cake_wallet/themes/extensions/menu_theme.dart'; import 'package:flutter/material.dart'; +import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart'; +import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart'; +import 'package:cake_wallet/themes/extensions/balance_page_theme.dart'; +import 'package:cake_wallet/themes/extensions/option_tile_theme.dart'; class SettingActionButton extends StatelessWidget { final bool isLastTile; @@ -29,56 +33,64 @@ class SettingActionButton extends StatelessWidget { @override Widget build(BuildContext context) { + final isLightMode = Theme.of(context).extension()?.useDarkImage ?? false; Color? color = isSelected ? Theme.of(context).extension()!.settingTitleColor : selectionActive - ? Palette.darkBlue - : Theme.of(context).extension()!.settingTitleColor; - return InkWell( - onTap: onTap, - hoverColor: Colors.transparent, - child: Container( - height: tileHeight, - padding: isLastTile - ? EdgeInsets.only( - left: 24, - right: 24, - top: fromBottomEdge, - ) - : EdgeInsets.only(left: 24, right: 24), - alignment: isLastTile ? Alignment.topLeft : null, - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Image.asset( - image, - height: 16, - width: 16, - color: Theme.of(context) - .extension()! - .settingActionsIconColor, + ? Palette.darkBlue + : Theme.of(context).extension()!.settingTitleColor; + return Container( + //padding: EdgeInsets.only(top: 5, left: 15, bottom: 5), + margin: EdgeInsets.only(top: 10, left: 20, bottom: 0, right: 20), + child: TextButton( + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all(isLightMode ? Theme.of(context).cardColor : Colors.black12), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), ), - SizedBox(width: 16), - Expanded( - child: Text( - title, - style: TextStyle( - color: color, - fontSize: 16, - fontWeight: FontWeight.bold, + ), + ), + onPressed: onTap, + //hoverColor: Colors.transparent, + child: Container( + width: double.infinity, + padding: EdgeInsets.only(top: 12, left: 20, bottom: 12, right: 15), + //margin: EdgeInsets.only(top: 5, left: 15, bottom: 5), + alignment: isLastTile ? Alignment.topLeft : null, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.asset( + image, + height: 16, + width: 16, + color: Theme.of(context) + .extension()! + .settingActionsIconColor, + ), + SizedBox(width: 16), + Expanded( + child: Text( + title, + style: TextStyle( + color: color, + fontSize: 16, + fontWeight: FontWeight.bold, + ), ), ), - ), - if (isArrowVisible) - Icon( - Icons.arrow_forward_ios, - color: color, - size: 16, - ) - ], + if(isArrowVisible) + Icon( + Icons.arrow_forward_ios, + color: Colors.grey, + size: 16, + ) + ], + ), ), ), ); } -} +} \ No newline at end of file diff --git a/lib/src/widgets/setting_actions.dart b/lib/src/widgets/setting_actions.dart index 8b231f7b86..4862f234dd 100644 --- a/lib/src/widgets/setting_actions.dart +++ b/lib/src/widgets/setting_actions.dart @@ -17,7 +17,6 @@ class SettingActions { static List all = [ connectionSettingAction, - walletSettingAction, addressBookSettingAction, silentPaymentsSettingAction, litecoinMwebSettingAction, @@ -31,7 +30,6 @@ class SettingActions { static List desktopSettings = [ connectionSettingAction, - walletSettingAction, addressBookSettingAction, silentPaymentsSettingAction, securityBackupSettingAction, @@ -77,18 +75,6 @@ class SettingActions { }, ); - static SettingActions walletSettingAction = SettingActions._( - key: ValueKey('dashboard_page_menu_widget_wallet_menu_button_key'), - name: (context) => S.of(context).wallets, - image: 'assets/images/wallet_menu.png', - onTap: (BuildContext context) { - Navigator.of(context).pushNamed(Routes.walletList, arguments: (_) { - Navigator.of(context).pop(); // pops wallet list - Navigator.of(context).pop(); // pops drawer - }); - }, - ); - static SettingActions addressBookSettingAction = SettingActions._( key: ValueKey('dashboard_page_menu_widget_address_book_button_key'), name: (context) => S.of(context).address_book_menu, diff --git a/lib/src/widgets/standard_list.dart b/lib/src/widgets/standard_list.dart index 0780d64cde..c845301cc1 100644 --- a/lib/src/widgets/standard_list.dart +++ b/lib/src/widgets/standard_list.dart @@ -21,16 +21,20 @@ class StandardListRow extends StatelessWidget { Widget build(BuildContext context) { final leading = buildLeading(context); final trailing = buildTrailing(context); - - return InkWell( - onTap: () => onTap?.call(context), - child: Container( + return Container( height: 56, - padding: EdgeInsets.only(left: 24, right: 24), - decoration: decoration ?? - BoxDecoration( - color: Theme.of(context).colorScheme.background, + padding: EdgeInsets.only(left: 12, right: 12), + child: TextButton( + onPressed: () => onTap?.call(context), + style: ButtonStyle( + //backgroundColor: MaterialStateProperty.all(Theme.of(context).cardColor), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(10) + ), ), + ), + ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -97,10 +101,10 @@ class StandardListSeparator extends StatelessWidget { return Container( height: height, padding: padding, - color: Theme.of(context).colorScheme.background, + color: Colors.transparent, child: Container( height: height, - color: Theme.of(context).extension()!.textfieldUnderlineColor, + color: Colors.transparent, ), ); } @@ -140,6 +144,7 @@ class SectionStandardList extends StatelessWidget { final int sectionCount; final bool hasTopSeparator; + final int Function(int sectionIndex) itemCounter; final Widget Function(int sectionIndex, int itemIndex) itemBuilder; final Widget Function(int sectionIndex)? sectionTitleBuilder; diff --git a/lib/themes/monero_dark_theme.dart b/lib/themes/monero_dark_theme.dart index 1478ba8c5c..53f11716b4 100644 --- a/lib/themes/monero_dark_theme.dart +++ b/lib/themes/monero_dark_theme.dart @@ -21,6 +21,7 @@ import 'package:cake_wallet/themes/extensions/send_page_theme.dart'; import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart'; import 'package:cake_wallet/themes/extensions/transaction_trade_theme.dart'; import 'package:cake_wallet/themes/extensions/wallet_list_theme.dart'; +import 'package:cake_wallet/themes/theme_base.dart'; import 'package:cake_wallet/generated/i18n.dart'; import 'package:cake_wallet/palette.dart'; import 'package:flutter/material.dart'; @@ -28,6 +29,8 @@ import 'package:flutter/material.dart'; class MoneroDarkTheme extends DarkTheme { MoneroDarkTheme({required int raw}) : super(raw: raw); + @override + ThemeType get type => ThemeType.oled; @override String get title => S.current.monero_dark_theme; @override diff --git a/lib/themes/theme_base.dart b/lib/themes/theme_base.dart index 3bba6f65f9..ad5807db0e 100644 --- a/lib/themes/theme_base.dart +++ b/lib/themes/theme_base.dart @@ -27,7 +27,7 @@ import 'package:cake_wallet/themes/extensions/transaction_trade_theme.dart'; import 'package:cake_wallet/themes/extensions/wallet_list_theme.dart'; import 'package:flutter/material.dart'; -enum ThemeType { light, bright, dark } +enum ThemeType { light, bright, dark, oled} abstract class ThemeBase { ThemeBase({required this.raw}) { diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index 80984294c8..99283a4090 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -52,6 +52,8 @@ import 'package:http/http.dart' as http; import 'package:mobx/mobx.dart'; import 'package:shared_preferences/shared_preferences.dart'; +import '../../themes/theme_base.dart'; + part 'dashboard_view_model.g.dart'; class DashboardViewModel = DashboardViewModelBase with _$DashboardViewModel; @@ -70,7 +72,7 @@ abstract class DashboardViewModelBase with Store { required this.sharedPreferences, required this.keyService}) : hasTradeAction = false, - hasExchangeAction = false, + hasSwapAction = false, isShowFirstYatIntroduction = false, isShowSecondYatIntroduction = false, isShowThirdYatIntroduction = false, @@ -480,6 +482,34 @@ abstract class DashboardViewModelBase with Store { @computed bool get hasEnabledMwebBefore => settingsStore.hasEnabledMwebBefore; + @action + double getShadowSpread() { + double spread = 0; + if (settingsStore.currentTheme.type == ThemeType.bright) + spread = 0; + else if (settingsStore.currentTheme.type == ThemeType.light) + spread = 0; + else if (settingsStore.currentTheme.type == ThemeType.dark) + spread = 0; + else if (settingsStore.currentTheme.type == ThemeType.oled) + spread = 0; + return spread; + } + + @action + double getShadowBlur() { + double blur = 0; + if (settingsStore.currentTheme.type == ThemeType.bright) + blur = 0; + else if (settingsStore.currentTheme.type == ThemeType.light) + blur = 0; + else if (settingsStore.currentTheme.type == ThemeType.dark) + blur = 0; + else if (settingsStore.currentTheme.type == ThemeType.oled) + blur = 0; + return blur; + } + @action void setMwebEnabled() { if (!hasMweb) { @@ -530,10 +560,10 @@ abstract class DashboardViewModelBase with Store { void furtherShowYatPopup(bool shouldShow) => settingsStore.shouldShowYatPopup = shouldShow; @computed - bool get isEnabledExchangeAction => settingsStore.exchangeStatus != ExchangeApiMode.disabled; + bool get isEnabledSwapAction => settingsStore.exchangeStatus != ExchangeApiMode.disabled; @observable - bool hasExchangeAction; + bool hasSwapAction; @computed bool get isEnabledTradeAction => !settingsStore.disableTradeOption; @@ -736,7 +766,7 @@ abstract class DashboardViewModelBase with Store { } void updateActions() { - hasExchangeAction = !isHaven; + hasSwapAction = !isHaven; hasTradeAction = !isHaven; } diff --git a/lib/view_model/settings/display_settings_view_model.dart b/lib/view_model/settings/display_settings_view_model.dart index 69d82eff49..26eb05985d 100644 --- a/lib/view_model/settings/display_settings_view_model.dart +++ b/lib/view_model/settings/display_settings_view_model.dart @@ -37,6 +37,9 @@ abstract class DisplaySettingsViewModelBase with Store { @computed bool get disabledFiatApiMode => _settingsStore.fiatApiMode == FiatApiMode.disabled; + @computed + bool get showAddressBookPopup => _settingsStore.showAddressBookPopupEnabled; + @action void setBalanceDisplayMode(BalanceDisplayMode value) => _settingsStore.balanceDisplayMode = value; @@ -66,4 +69,8 @@ abstract class DisplaySettingsViewModelBase with Store { void setShouldShowMarketPlaceInDashbaord(bool value) { _settingsStore.shouldShowMarketPlaceInDashboard = value; } + + @action + void setShowAddressBookPopup(bool value) => _settingsStore.showAddressBookPopupEnabled = value; + } diff --git a/lib/view_model/settings/other_settings_view_model.dart b/lib/view_model/settings/other_settings_view_model.dart index c7a5d0b90c..3036e8ae9d 100644 --- a/lib/view_model/settings/other_settings_view_model.dart +++ b/lib/view_model/settings/other_settings_view_model.dart @@ -60,10 +60,6 @@ abstract class OtherSettingsViewModelBase with Store { bool get changeRepresentativeEnabled => _wallet.type == WalletType.nano || _wallet.type == WalletType.banano; - @computed - bool get showAddressBookPopup => _settingsStore.showAddressBookPopupEnabled; - - @computed bool get displayTransactionPriority => !(changeRepresentativeEnabled || _wallet.type == WalletType.solana || @@ -118,9 +114,6 @@ abstract class OtherSettingsViewModelBase with Store { return customItem != null ? priorities.indexOf(customItem) : null; } - @action - void setShowAddressBookPopup(bool value) => _settingsStore.showAddressBookPopupEnabled = value; - int? get maxCustomFeeRate { if (_wallet.type == WalletType.bitcoin) { return bitcoin!.getMaxCustomFeeRate(_wallet); diff --git a/res/values/strings_ar.arb b/res/values/strings_ar.arb index 0deacecdb9..5f83b86a54 100644 --- a/res/values/strings_ar.arb +++ b/res/values/strings_ar.arb @@ -294,7 +294,7 @@ "etherscan_history": "Etherscan تاريخ", "event": "ﺙﺪﺣ", "events": "ﺙﺍﺪﺣﻷﺍ", - "exchange": "تبديل", + "exchange": "تبادل", "exchange_incorrect_current_wallet_for_xmr": "إذا كنت ترغب في تبديل XMR من رصيد محفظة الكعكة ، فيرجى التبديل إلى محفظة Monero أولاً.", "exchange_new_template": "قالب جديد", "exchange_provider_unsupported": "${providerName} لم يعد مدعومًا!", @@ -733,7 +733,7 @@ "share_address": "شارك العنوان", "shared_seed_wallet_groups": "مجموعات محفظة البذور المشتركة", "show": "يعرض", - "show_address_book_popup": "عرض \"إضافة إلى كتاب العناوين\" المنبثقة بعد الإرسال", + "show_address_book_popup": "عرض دفتر العناوين المنبثقة", "show_balance": "اضغط لفترة طويلة لإظهار التوازن", "show_balance_toast": "اضغط لفترة طويلة لإخفاء أو إظهار التوازن", "show_details": "اظهر التفاصيل", @@ -781,6 +781,7 @@ "support_title_guides": "مستندات محفظة كعكة", "support_title_live_chat": "الدعم المباشر", "support_title_other_links": "روابط دعم أخرى", + "swap": "تبديل", "sweeping_wallet": "كنس المحفظة", "sweeping_wallet_alert": "لن يستغرق هذا وقتًا طويلاً. لا تترك هذه الشاشة وإلا فقد يتم فقد أموال سويبت", "switchToETHWallet": "ﻯﺮﺧﺃ ﺓﺮﻣ ﺔﻟﻭﺎﺤﻤﻟﺍﻭ Ethereum ﺔﻈﻔﺤﻣ ﻰﻟﺇ ﻞﻳﺪﺒﺘﻟﺍ ﻰﺟﺮﻳ", diff --git a/res/values/strings_bg.arb b/res/values/strings_bg.arb index 5b4dc54509..1cf076e341 100644 --- a/res/values/strings_bg.arb +++ b/res/values/strings_bg.arb @@ -294,7 +294,7 @@ "etherscan_history": "История на Etherscan", "event": "Събитие", "events": "събития", - "exchange": "Разметка", + "exchange": "Обмен", "exchange_incorrect_current_wallet_for_xmr": "Ако искате да смените XMR от вашия баланс на портфейла на тортата Monero, моля, преминете първо към вашия портфейл Monero.", "exchange_new_template": "Нов шаблон", "exchange_provider_unsupported": "${providerName} вече не се поддържа!", @@ -733,7 +733,7 @@ "share_address": "Сподели адрес", "shared_seed_wallet_groups": "Споделени групи за портфейли за семена", "show": "Показване", - "show_address_book_popup": "Показване на изскачането на „Добавяне към адресната книга“ след изпращане", + "show_address_book_popup": "Показване на изскачащ прозорец на адресна книга", "show_balance": "Дълго натиснете, за да покажете баланса", "show_balance_toast": "Дълго натискане, за да се скрие или покаже баланс", "show_details": "Показване на подробностите", @@ -781,6 +781,7 @@ "support_title_guides": "Документи за портфейл за торта", "support_title_live_chat": "Подкрепа на живо", "support_title_other_links": "Други връзки за поддръжка", + "swap": "Разметка", "sweeping_wallet": "Метещ портфейл", "sweeping_wallet_alert": "Това не трябва да отнема много време. Не оставяйте този екран или пометените средства могат да бъдат загубени.", "switchToETHWallet": "Моля, преминете към портфейл Ethereum и опитайте отново", diff --git a/res/values/strings_cs.arb b/res/values/strings_cs.arb index 14028a9574..17e788d197 100644 --- a/res/values/strings_cs.arb +++ b/res/values/strings_cs.arb @@ -294,7 +294,7 @@ "etherscan_history": "Historie Etherscanu", "event": "událost", "events": "Události", - "exchange": "Swap", + "exchange": "Výměna", "exchange_incorrect_current_wallet_for_xmr": "Pokud chcete vyměnit XMR z vaší dortové peněženky Monero Balance, nejprve přepněte na peněženku Monero.", "exchange_new_template": "Nová šablona", "exchange_provider_unsupported": "${providerName} již není podporováno!", @@ -733,7 +733,7 @@ "share_address": "Sdílet adresu", "shared_seed_wallet_groups": "Skupiny sdílených semen", "show": "Show", - "show_address_book_popup": "Po odeslání zobrazíte vyskakovací okno „Přidat do adresáře“", + "show_address_book_popup": "Zobrazit vyskakovací okno", "show_balance": "Dlouhý stisknutí zobrazí rovnováhu", "show_balance_toast": "Dlouhý stiskněte pro skrytí nebo zobrazení rovnováhy", "show_details": "Zobrazit detaily", @@ -781,6 +781,7 @@ "support_title_guides": "Dokumenty peněženky dortu", "support_title_live_chat": "Živá podpora", "support_title_other_links": "Další odkazy na podporu", + "swap": "Swap", "sweeping_wallet": "Zametací peněženka", "sweeping_wallet_alert": "To by nemělo trvat dlouho. Nenechávejte tuto obrazovku, jinak mohou být ztraceny prostředky.", "switchToETHWallet": "Přejděte na peněženku Ethereum a zkuste to znovu", diff --git a/res/values/strings_de.arb b/res/values/strings_de.arb index 0b279b7f15..3424f117c4 100644 --- a/res/values/strings_de.arb +++ b/res/values/strings_de.arb @@ -514,8 +514,8 @@ "placeholder_transactions": "Ihre Transaktionen werden hier angezeigt", "please_fill_totp": "Bitte geben Sie den 8-stelligen Code ein, der auf Ihrem anderen Gerät vorhanden ist", "please_make_selection": "Bitte treffen Sie unten eine Auswahl zum Erstellen oder Wiederherstellen Ihrer Wallet.", - "Please_reference_document": "Weitere Informationen finden Sie in den Dokumenten unten.", "please_reference_document": "Bitte verweisen Sie auf die folgenden Dokumente, um weitere Informationen zu erhalten.", + "Please_reference_document": "Weitere Informationen finden Sie in den Dokumenten unten.", "please_select": "Bitte auswählen:", "please_select_backup_file": "Bitte wählen Sie die Sicherungsdatei und geben Sie das Sicherungskennwort ein.", "please_try_to_connect_to_another_node": "Bitte versuchen Sie, sich mit einem anderen Knoten zu verbinden", @@ -782,6 +782,7 @@ "support_title_guides": "Cake Wallet Docs", "support_title_live_chat": "Live Support", "support_title_other_links": "Andere Support-Links", + "swap": "Tauschen", "sweeping_wallet": "Wallet leeren", "sweeping_wallet_alert": "Das sollte nicht lange dauern. VERLASSEN SIE DIESEN BILDSCHIRM NICHT, ANDERNFALLS KÖNNEN DIE GELDER VERLOREN GEHEN", "switchToETHWallet": "Bitte wechseln Sie zu einem Ethereum-Wallet und versuchen Sie es erneut", diff --git a/res/values/strings_en.arb b/res/values/strings_en.arb index 4a56bd1536..bc85206a59 100644 --- a/res/values/strings_en.arb +++ b/res/values/strings_en.arb @@ -294,7 +294,7 @@ "etherscan_history": "Etherscan history", "event": "Event", "events": "Events", - "exchange": "Swap", + "exchange": "Exchange", "exchange_incorrect_current_wallet_for_xmr": "If you want to swap XMR from your Cake Wallet Monero balance, please switch to your Monero wallet first.", "exchange_new_template": "New template", "exchange_provider_unsupported": "${providerName} is no longer supported!", @@ -734,7 +734,7 @@ "share_address": "Share address", "shared_seed_wallet_groups": "Shared Seed Wallet Groups", "show": "Show", - "show_address_book_popup": "Show 'Add to Address Book' popup after sending", + "show_address_book_popup": "Show Address Book popup", "show_balance": "Long Press to Show Balance", "show_balance_toast": "Long press to hide or show balance", "show_details": "Show Details", @@ -782,6 +782,7 @@ "support_title_guides": "Cake Wallet docs", "support_title_live_chat": "Live support", "support_title_other_links": "Other support links", + "swap": "Swap", "sweeping_wallet": "Sweeping wallet", "sweeping_wallet_alert": "This shouldn’t take long. DO NOT LEAVE THIS SCREEN OR THE SWEPT FUNDS MAY BE LOST.", "switchToETHWallet": "Please switch to an Ethereum wallet and try again", diff --git a/res/values/strings_es.arb b/res/values/strings_es.arb index bd324a979f..8d35928bc5 100644 --- a/res/values/strings_es.arb +++ b/res/values/strings_es.arb @@ -294,7 +294,7 @@ "etherscan_history": "historia de etherscan", "event": "Evento", "events": "Eventos", - "exchange": "Intercambiar", + "exchange": "Intercambio", "exchange_incorrect_current_wallet_for_xmr": "Si desea intercambiar XMR desde su billetera de pastel Monero Balance, primero cambie a su billetera Monero.", "exchange_new_template": "Nueva plantilla", "exchange_provider_unsupported": "¡${providerName} ya no es compatible!", @@ -734,7 +734,7 @@ "share_address": "Compartir dirección", "shared_seed_wallet_groups": "Grupos de billetera de semillas compartidas", "show": "Espectáculo", - "show_address_book_popup": "Mostrar ventana emergente 'Agregar a la libreta de direcciones' después de enviar", + "show_address_book_popup": "Mostrar la ventana emergente de la libreta de direcciones", "show_balance": "Prensa larga para mostrar equilibrio", "show_balance_toast": "Prensa larga para esconder o mostrar equilibrio", "show_details": "Mostrar detalles", @@ -782,6 +782,7 @@ "support_title_guides": "Documentos de billetera de pastel", "support_title_live_chat": "Soporte en tiempo real", "support_title_other_links": "Otros enlaces de soporte", + "swap": "Intercambio", "sweeping_wallet": "Barrer billetera (gastar todos los fondos disponibles)", "sweeping_wallet_alert": "Esto no debería llevar mucho tiempo. NO DEJES ESTA PANTALLA O SE PUEDEN PERDER LOS FONDOS BARRIDOS", "switchToETHWallet": "Cambia a una billetera Ethereum e inténtelo nuevamente.", diff --git a/res/values/strings_fr.arb b/res/values/strings_fr.arb index edb79d5b4e..77125ec48e 100644 --- a/res/values/strings_fr.arb +++ b/res/values/strings_fr.arb @@ -294,7 +294,7 @@ "etherscan_history": "Historique Etherscan", "event": "Événement", "events": "Événements", - "exchange": "Échanger", + "exchange": "Échange", "exchange_incorrect_current_wallet_for_xmr": "Si vous souhaitez échanger des XMR depuis le solde Monero de votre Cake Wallet, veuillez d'abord passer à votre portefeuille Monero.", "exchange_new_template": "Nouveau modèle d'échange", "exchange_provider_unsupported": "${providerName} n'est plus pris en charge !", @@ -733,7 +733,7 @@ "share_address": "Partager l'adresse", "shared_seed_wallet_groups": "Groupes de portefeuilles partagés", "show": "Montrer", - "show_address_book_popup": "Afficher la popup `` Ajouter au carnet d'adresses '' après avoir envoyé", + "show_address_book_popup": "Afficher la fenêtre contextuelle du carnet d'adresses", "show_balance": "Longue presse pour montrer l'équilibre", "show_balance_toast": "Longue appuyez sur pour masquer ou afficher l'équilibre", "show_details": "Afficher les détails", @@ -781,6 +781,7 @@ "support_title_guides": "Docs de portefeuille à gâteau", "support_title_live_chat": "Support en direct", "support_title_other_links": "Autres liens d'assistance", + "swap": "Échanger", "sweeping_wallet": "Portefeuille (wallet) de consolidation", "sweeping_wallet_alert": "Cela ne devrait pas prendre longtemps. NE QUITTEZ PAS CET ÉCRAN OU LES FONDS TRANSFÉRÉS POURRAIENT ÊTRE PERDUS.", "switchToETHWallet": "Veuillez passer à un portefeuille (wallet) Ethereum et réessayer", diff --git a/res/values/strings_ha.arb b/res/values/strings_ha.arb index 5a364a597d..a7f3a03094 100644 --- a/res/values/strings_ha.arb +++ b/res/values/strings_ha.arb @@ -294,7 +294,7 @@ "etherscan_history": "Etherscan tarihin kowane zamani", "event": "Lamarin", "events": "Abubuwan da suka faru", - "exchange": "Musya", + "exchange": "Canji", "exchange_incorrect_current_wallet_for_xmr": "Idan kana son canza XMR daga walat ɗin Bed Wallet ɗinka, da fatan za a canza zuwa walat ɗinku na Monero.", "exchange_new_template": "Sabon template", "exchange_provider_unsupported": "${providerName}", @@ -735,7 +735,7 @@ "share_address": "Raba adireshin", "shared_seed_wallet_groups": "Raba ƙungiya walat", "show": "Nuna", - "show_address_book_popup": "Nuna 'ƙara don magance littafin' Popup bayan aikawa", + "show_address_book_popup": "Nuna littafin littafin adireshi", "show_balance": "Dogon latsawa don nuna ma'auni", "show_balance_toast": "Latsa latsawa don ɓoye ko nuna ma'auni", "show_details": "Nuna Cikakkun bayanai", @@ -783,6 +783,7 @@ "support_title_guides": "Docs Bakin", "support_title_live_chat": "Tallafi na Live", "support_title_other_links": "Sauran hanyoyin tallafi", + "swap": "Musya", "sweeping_wallet": "Kashi na kasa", "sweeping_wallet_alert": "Wannan ba zai samu lokacin mai tsaski. KADA KA SAMU KUNGIYARAN KUHON, ZAMAN DADIN BANKUNCI ZAI HAŘA", "switchToETHWallet": "Da fatan za a canza zuwa walat ɗin Ethereum kuma a sake gwadawa", diff --git a/res/values/strings_hi.arb b/res/values/strings_hi.arb index 5d03cedd24..0b3e18eeb4 100644 --- a/res/values/strings_hi.arb +++ b/res/values/strings_hi.arb @@ -294,7 +294,7 @@ "etherscan_history": "इथरस्कैन इतिहास", "event": "आयोजन", "events": "आयोजन", - "exchange": "बदलना", + "exchange": "अदला-बदली", "exchange_incorrect_current_wallet_for_xmr": "यदि आप अपने केक वॉलेट मोनेरो बैलेंस से XMR को स्वैप करना चाहते हैं, तो कृपया पहले अपने मोनेरो वॉलेट पर स्विच करें।", "exchange_new_template": "नया टेम्पलेट", "exchange_provider_unsupported": "${providerName} अब समर्थित नहीं है!", @@ -735,9 +735,9 @@ "share_address": "पता साझा करें", "shared_seed_wallet_groups": "साझा बीज बटुए समूह", "show": "दिखाओ", - "show_address_book_popup": "भेजने के बाद 'एड एड्रेस बुक' पॉपअप दिखाएं", + "show_address_book_popup": "पता बुक पॉपअप दिखाएं", "show_balance": "बैलेंस दिखाने के लिए लॉन्ग प्रेस", - "show_balance_toast": "बैलेंस को छिपाने या दिखाने के लिए लॉन्ग प्रेस", + "show_balance_toast": "संतुलन को छिपाने या दिखाने के लिए लॉन्ग प्रेस", "show_details": "विवरण दिखाएं", "show_keys": "बीज / कुंजियाँ दिखाएँ", "show_market_place": "बाज़ार दिखाएँ", @@ -783,6 +783,7 @@ "support_title_guides": "केक बटुए डॉक्स", "support_title_live_chat": "लाइव सहायता", "support_title_other_links": "अन्य समर्थन लिंक", + "swap": "बदलना", "sweeping_wallet": "स्वीपिंग वॉलेट", "sweeping_wallet_alert": "इसमें अधिक समय नहीं लगना चाहिए। इस स्क्रीन को न छोड़ें या स्वैप्ट फंड खो सकते हैं", "switchToETHWallet": "कृपया एथेरियम वॉलेट पर स्विच करें और पुनः प्रयास करें", diff --git a/res/values/strings_hr.arb b/res/values/strings_hr.arb index d98716592f..0f6b81d979 100644 --- a/res/values/strings_hr.arb +++ b/res/values/strings_hr.arb @@ -294,7 +294,7 @@ "etherscan_history": "Etherscan povijest", "event": "Događaj", "events": "Događaji", - "exchange": "Zamjena", + "exchange": "Razmjena", "exchange_incorrect_current_wallet_for_xmr": "Ako želite zamijeniti XMR iz vašeg novčanika za kolač Monero, prvo se prebacite na svoj novčanik Monero.", "exchange_new_template": "Novi predložak", "exchange_provider_unsupported": "${providerName} više nije podržan!", @@ -733,7 +733,7 @@ "share_address": "Podijeli adresu", "shared_seed_wallet_groups": "Zajedničke grupe za sjeme novčanika", "show": "Pokazati", - "show_address_book_popup": "Pokažite \"dodaj u adresar\" skočni prozor nakon slanja", + "show_address_book_popup": "Prikaži Popup adresara", "show_balance": "Dugački pritisak za pokazivanje ravnoteže", "show_balance_toast": "Dugo pritisnite da biste sakrili ili pokazali ravnotežu", "show_details": "Prikaži pojedinosti", @@ -781,6 +781,7 @@ "support_title_guides": "Dokumenti s kolačem kolača", "support_title_live_chat": "Podrška uživo", "support_title_other_links": "Ostale veze za podršku", + "swap": "Mijenjati", "sweeping_wallet": "Čisti novčanik", "sweeping_wallet_alert": "Ovo ne bi trebalo dugo trajati. NE NAPUŠTAJTE OVAJ ZASLON INAČE SE POBREŠENA SREDSTVA MOGU IZGUBITI", "switchToETHWallet": "Prijeđite na Ethereum novčanik i pokušajte ponovno", diff --git a/res/values/strings_hy.arb b/res/values/strings_hy.arb index 5a445f4807..d04d5ebb4d 100644 --- a/res/values/strings_hy.arb +++ b/res/values/strings_hy.arb @@ -294,7 +294,7 @@ "etherscan_history": "Etherscan պատմություն", "event": "Իրադարձություն", "events": "Իրադարձություններ", - "exchange": "Փոխանակել", + "exchange": "Փոխանակում", "exchange_incorrect_current_wallet_for_xmr": "Եթե ​​ցանկանում եք փոխանակել XMR ձեր տորթի դրամապանակից Monero Relandal- ից, խնդրում ենք նախ անցնել ձեր Monero դրամապանակին:", "exchange_new_template": "Նոր տեսակ", "exchange_provider_unsupported": "${providerName} այլևս չի ապահովվում", @@ -733,7 +733,7 @@ "share_address": "Կիսվել հասցեով", "shared_seed_wallet_groups": "Համօգտագործված սերմերի դրամապանակների խմբեր", "show": "Ցուցահանդես", - "show_address_book_popup": "Show ույց տալ «Ուղարկելուց հետո« Հասցեների գրքի »թռուցիկ", + "show_address_book_popup": "Show ուցադրել հասցեի գրքի թռուցիկ", "show_balance": "Երկար մամուլ, հավասարակշռությունը ցույց տալու համար", "show_balance_toast": "Երկար սեղմեք `հավասարակշռությունը թաքցնելու կամ ցույց տալու համար", "show_details": "Ցուցադրել մանրամասներ", @@ -781,6 +781,7 @@ "support_title_guides": "Տորթ դրամապանակի փաստաթղթեր", "support_title_live_chat": "Անմիջական աջակցություն", "support_title_other_links": "Այլ աջակցության հղումներ", + "swap": "Փոխանակել", "sweeping_wallet": "Դրամապանակը մաքրվում է", "sweeping_wallet_alert": "Սա չի տևի երկար։ Խնդրում ենք չլքել այս էկրանը կամ մաքրված միջոցները կկորչեն։", "switchToETHWallet": "Խնդրում ենք անցնել Ethereum դրամապանակ և փորձել կրկին", diff --git a/res/values/strings_id.arb b/res/values/strings_id.arb index 9694648f92..d32a0458a3 100644 --- a/res/values/strings_id.arb +++ b/res/values/strings_id.arb @@ -294,7 +294,7 @@ "etherscan_history": "Sejarah Etherscan", "event": "Peristiwa", "events": "Acara", - "exchange": "Menukar", + "exchange": "Menukarkan", "exchange_incorrect_current_wallet_for_xmr": "Jika Anda ingin bertukar XMR dari Saldo Monero Dompet Kue Anda, silakan beralih ke Monero Wallet Anda terlebih dahulu.", "exchange_new_template": "Template baru", "exchange_provider_unsupported": "${providerName} tidak lagi didukung!", @@ -736,7 +736,7 @@ "share_address": "Bagikan alamat", "shared_seed_wallet_groups": "Kelompok dompet benih bersama", "show": "Menunjukkan", - "show_address_book_popup": "Tampilkan popup 'Tambahkan ke Alamat' setelah mengirim", + "show_address_book_popup": "Tampilkan Alamat Buku Popup", "show_balance": "PRESS PANJANG UNTUK MENUNJUKKAN Balance", "show_balance_toast": "Tekan panjang untuk menyembunyikan atau menunjukkan keseimbangan", "show_details": "Tampilkan Rincian", @@ -784,6 +784,7 @@ "support_title_guides": "DOKS DOKO CAKE", "support_title_live_chat": "Dukungan langsung", "support_title_other_links": "Tautan dukungan lainnya", + "swap": "Menukar", "sweeping_wallet": "Dompet menyapu", "sweeping_wallet_alert": "Ini seharusnya tidak memakan waktu lama. Jangan tinggalkan layar ini atau dana swept mungkin hilang.", "switchToETHWallet": "Silakan beralih ke dompet Ethereum dan coba lagi", diff --git a/res/values/strings_it.arb b/res/values/strings_it.arb index deb4966ff3..4088c2a16f 100644 --- a/res/values/strings_it.arb +++ b/res/values/strings_it.arb @@ -735,7 +735,7 @@ "share_address": "Condividi indirizzo", "shared_seed_wallet_groups": "Gruppi di portafoglio di semi condivisi", "show": "Spettacolo", - "show_address_book_popup": "Mostra il popup \"Aggiungi alla rubrica\" ​​dopo l'invio", + "show_address_book_popup": "Mostra popup della rubrica", "show_balance": "Lunga stampa per mostrare l'equilibrio", "show_balance_toast": "A lungo pressa per nascondere o mostrare l'equilibrio", "show_details": "Mostra dettagli", @@ -783,6 +783,7 @@ "support_title_guides": "Documenti del portafoglio per torta", "support_title_live_chat": "Supporto dal vivo", "support_title_other_links": "Altri collegamenti di supporto", + "swap": "Scambio", "sweeping_wallet": "Portafoglio ampio", "sweeping_wallet_alert": "Questo non dovrebbe richiedere molto tempo. NON LASCIARE QUESTA SCHERMATA O I FONDI SPAZZATI POTREBBERO ANDARE PERSI", "switchToETHWallet": "Passa a un portafoglio Ethereum e riprova", diff --git a/res/values/strings_ja.arb b/res/values/strings_ja.arb index ce09474fb9..5c8e0b63e0 100644 --- a/res/values/strings_ja.arb +++ b/res/values/strings_ja.arb @@ -294,7 +294,7 @@ "etherscan_history": "イーサスキャンの歴史", "event": "イベント", "events": "イベント", - "exchange": "スワップ", + "exchange": "交換", "exchange_incorrect_current_wallet_for_xmr": "XMRをケーキウォレットモネロバランスから交換したい場合は、最初にMoneroウォレットに切り替えてください。", "exchange_new_template": "新しいテンプレート", "exchange_provider_unsupported": "${providerName}はサポートされなくなりました!", @@ -734,7 +734,7 @@ "share_address": "住所を共有する", "shared_seed_wallet_groups": "共有シードウォレットグループ", "show": "見せる", - "show_address_book_popup": "送信後に「アドレスブックに追加」ポップアップを表示します", + "show_address_book_popup": "アドレス帳のポップアップを表示します", "show_balance": "バランスを示すためにロングプレス", "show_balance_toast": "バランスを隠したり表示したりするためにロングプレス", "show_details": "詳細を表示", @@ -782,6 +782,7 @@ "support_title_guides": "ケーキウォレットドキュメント", "support_title_live_chat": "ライブサポート", "support_title_other_links": "その他のサポートリンク", + "swap": "スワップ", "sweeping_wallet": "スイープウォレット", "sweeping_wallet_alert": "これには時間がかかりません。この画面から離れないでください。そうしないと、スイープ ファンドが失われる可能性があります", "switchToETHWallet": "イーサリアムウォレットに切り替えてもう一度お試しください", diff --git a/res/values/strings_ko.arb b/res/values/strings_ko.arb index d91cfd5db9..5e4df464dc 100644 --- a/res/values/strings_ko.arb +++ b/res/values/strings_ko.arb @@ -733,7 +733,7 @@ "share_address": "주소 공유", "shared_seed_wallet_groups": "공유 종자 지갑 그룹", "show": "보여주다", - "show_address_book_popup": "전송 후 '주소 책에 추가'팝업을 표시하십시오", + "show_address_book_popup": "주소록 팝업을 보여주십시오", "show_balance": "균형을 보여주기 위해 긴 언론", "show_balance_toast": "균형을 숨기거나 보여주기 위해 긴 누르십시오", "show_details": "세부정보 표시", @@ -781,6 +781,7 @@ "support_title_guides": "케이크 지갑 문서", "support_title_live_chat": "실시간 지원", "support_title_other_links": "다른 지원 링크", + "swap": "교환", "sweeping_wallet": "스위핑 지갑", "sweeping_wallet_alert": "오래 걸리지 않습니다. 이 화면을 떠나지 마십시오. 그렇지 않으면 스웹트 자금이 손실될 수 있습니다.", "switchToETHWallet": "이더리움 지갑으로 전환한 후 다시 시도해 주세요.", diff --git a/res/values/strings_my.arb b/res/values/strings_my.arb index 66adf87cfe..81357245c2 100644 --- a/res/values/strings_my.arb +++ b/res/values/strings_my.arb @@ -733,7 +733,7 @@ "share_address": "လိပ်စာမျှဝေပါ။", "shared_seed_wallet_groups": "shared မျိုးစေ့ပိုက်ဆံအိတ်အုပ်စုများ", "show": "ပြသ", - "show_address_book_popup": "ပေးပို့ပြီးနောက် 'address book' popup ကိုပြပါ", + "show_address_book_popup": "လိပ်စာစာအုပ် popup ပြပါ", "show_balance": "ချိန်ခွင်လျှာကိုပြသရန်ရှည်လျားသောစာနယ်ဇင်း", "show_balance_toast": "ချိန်ခွင်လျှာကိုဖျောက်ရန်သို့မဟုတ်ပြသရန်ရှည်လျားသောစာနယ်ဇင်း", "show_details": "အသေးစိတ်ပြ", @@ -781,6 +781,7 @@ "support_title_guides": "ကိတ်မုန့်ပိုက်ဆံအိတ်များ", "support_title_live_chat": "တိုက်ရိုက်ပံ့ပိုးမှု", "support_title_other_links": "အခြားအထောက်အပံ့လင့်များ", + "swap": "လဲလှယ်", "sweeping_wallet": "ိုက်ဆံအိတ် တံမြက်လှည်း", "sweeping_wallet_alert": "ဒါက ကြာကြာမခံသင့်ပါဘူး။ ဤစခရင်ကို ချန်မထားပါနှင့် သို့မဟုတ် ထုတ်ယူထားသော ရန်ပုံငွေများ ဆုံးရှုံးနိုင်သည်", "switchToETHWallet": "ကျေးဇူးပြု၍ Ethereum ပိုက်ဆံအိတ်သို့ ပြောင်းပြီး ထပ်စမ်းကြည့်ပါ။", diff --git a/res/values/strings_nl.arb b/res/values/strings_nl.arb index 4efae69e0c..1ef3757a43 100644 --- a/res/values/strings_nl.arb +++ b/res/values/strings_nl.arb @@ -294,7 +294,7 @@ "etherscan_history": "Etherscan-geschiedenis", "event": "Evenement", "events": "Evenementen", - "exchange": "Ruil", + "exchange": "Aandelenbeurs", "exchange_incorrect_current_wallet_for_xmr": "Als je XMR uit je cake -portemonnee Monero -balans wilt ruilen, schakel dan eerst over naar je Monero -portemonnee.", "exchange_new_template": "Nieuwe sjabloon", "exchange_provider_unsupported": "${providerName} wordt niet langer ondersteund!", @@ -733,7 +733,7 @@ "share_address": "Deel adres", "shared_seed_wallet_groups": "Gedeelde zaadportelgroepen", "show": "Show", - "show_address_book_popup": "Toon 'Toevoegen aan adresboek' pop -up na verzenden", + "show_address_book_popup": "Toon adresboek pop -up", "show_balance": "Lange pers om evenwicht te tonen", "show_balance_toast": "Lange pers om evenwicht te verbergen of te tonen", "show_details": "Toon details", @@ -781,6 +781,7 @@ "support_title_guides": "Cake -portemonnee documenten", "support_title_live_chat": "Live ondersteuning", "support_title_other_links": "Andere ondersteuningslinks", + "swap": "Ruil", "sweeping_wallet": "Vegende portemonnee", "sweeping_wallet_alert": "Dit duurt niet lang. VERLAAT DIT SCHERM NIET, ANDERS KAN HET SWEPT-GELD VERLOREN WORDEN", "switchToETHWallet": "Schakel over naar een Ethereum-portemonnee en probeer het opnieuw", diff --git a/res/values/strings_pl.arb b/res/values/strings_pl.arb index dee3de98f9..19b4d0f06e 100644 --- a/res/values/strings_pl.arb +++ b/res/values/strings_pl.arb @@ -294,7 +294,7 @@ "etherscan_history": "Historia Etherscanu", "event": "Wydarzenie", "events": "Wydarzenia", - "exchange": "Zamieniać", + "exchange": "Giełda", "exchange_incorrect_current_wallet_for_xmr": "Jeśli chcesz zamienić XMR z salda Monero Portfer, najpierw przejdź na portfel Monero.", "exchange_new_template": "Nowy szablon wymiany", "exchange_provider_unsupported": "${providerName} nie jest już obsługiwany!", @@ -733,7 +733,7 @@ "share_address": "Udostępnij adres", "shared_seed_wallet_groups": "Wspólne grupy portfeli nasion", "show": "Pokazywać", - "show_address_book_popup": "Pokaż wysypkę „Dodaj do książki” po wysłaniu", + "show_address_book_popup": "Pokaż okienko książki adresowej", "show_balance": "Długa prasa, aby pokazać równowagę", "show_balance_toast": "Długa naciśnij, aby ukryć lub pokazać równowagę", "show_details": "Pokaż szczegóły", @@ -781,6 +781,7 @@ "support_title_guides": "Dokumenty portfela ciasta", "support_title_live_chat": "Wsparcie na żywo", "support_title_other_links": "Inne linki wsparcia", + "swap": "Zamieniać", "sweeping_wallet": "Zamiatanie portfela", "sweeping_wallet_alert": "To nie powinno zająć dużo czasu. NIE WYCHODŹ Z TEGO EKRANU, W PRZECIWNYM WYPADKU MOŻE ZOSTAĆ UTRACONA ŚRODKI", "switchToETHWallet": "Przejdź na portfel Ethereum i spróbuj ponownie", diff --git a/res/values/strings_pt.arb b/res/values/strings_pt.arb index c6ca230081..f20354b28d 100644 --- a/res/values/strings_pt.arb +++ b/res/values/strings_pt.arb @@ -294,7 +294,7 @@ "etherscan_history": "história Etherscan", "event": "Evento", "events": "Eventos", - "exchange": "Trocar", + "exchange": "Intercâmbio", "exchange_incorrect_current_wallet_for_xmr": "Se você deseja trocar o XMR do balanço da carteira de bolo, mude para a sua carteira Monero primeiro.", "exchange_new_template": "Novo modelo", "exchange_provider_unsupported": "${providerName} não é mais suportado!", @@ -735,7 +735,7 @@ "share_address": "Compartilhar endereço", "shared_seed_wallet_groups": "Grupos de carteira de sementes compartilhados", "show": "Mostrar", - "show_address_book_popup": "Mostre pop -up 'Adicionar ao livro de endereços' depois de enviar", + "show_address_book_popup": "Mostrar pop -up de livro de endereços", "show_balance": "Pressione há muito tempo para mostrar o equilíbrio", "show_balance_toast": "Pressione há muito tempo para se esconder ou mostrar equilíbrio", "show_details": "Mostrar detalhes", @@ -783,6 +783,7 @@ "support_title_guides": "Documentos da carteira de bolo", "support_title_live_chat": "Apoio ao vivo", "support_title_other_links": "Outros links de suporte", + "swap": "Trocar", "sweeping_wallet": "Carteira varrendo", "sweeping_wallet_alert": "To nie powinno zająć dużo czasu. NIE WYCHODŹ Z TEGO EKRANU, W PRZECIWNYM WYPADKU MOŻE ZOSTAĆ UTRACONA ŚRODKI", "switchToETHWallet": "Mude para uma carteira Ethereum e tente novamente", diff --git a/res/values/strings_ru.arb b/res/values/strings_ru.arb index 0d73e11595..6e8967c14c 100644 --- a/res/values/strings_ru.arb +++ b/res/values/strings_ru.arb @@ -294,7 +294,7 @@ "etherscan_history": "История Эфириума", "event": "Событие", "events": "События", - "exchange": "Менять", + "exchange": "Обмен", "exchange_incorrect_current_wallet_for_xmr": "Если вы хотите поменять XMR с баланса с кошельком для торта Monero, сначала переключитесь на свой кошелек Monero.", "exchange_new_template": "Новый шаблон", "exchange_provider_unsupported": "${providerName} больше не поддерживается!", @@ -734,7 +734,7 @@ "share_address": "Поделиться адресом", "shared_seed_wallet_groups": "Общие группы кошелька семян", "show": "Показывать", - "show_address_book_popup": "Покажите всплывающее окно «Добавить в адрес адреса» после отправки", + "show_address_book_popup": "Показать адресную книгу всплывающее окно", "show_balance": "Длинная пресса, чтобы показать баланс", "show_balance_toast": "Длинная нажавка, чтобы скрыть или показать баланс", "show_details": "Показать детали", @@ -782,6 +782,7 @@ "support_title_guides": "Корт кошелек документов", "support_title_live_chat": "Живая поддержка", "support_title_other_links": "Другие ссылки на поддержку", + "swap": "Менять", "sweeping_wallet": "Подметание кошелька", "sweeping_wallet_alert": "Это не должно занять много времени. НЕ ПОКИДАЙТЕ ЭТОТ ЭКРАН, ИНАЧЕ ВЫЧИСЛЕННЫЕ СРЕДСТВА МОГУТ БЫТЬ ПОТЕРЯНЫ", "switchToETHWallet": "Пожалуйста, переключитесь на кошелек Ethereum и повторите попытку.", diff --git a/res/values/strings_th.arb b/res/values/strings_th.arb index cba8349035..9587c3bb5f 100644 --- a/res/values/strings_th.arb +++ b/res/values/strings_th.arb @@ -733,7 +733,7 @@ "share_address": "แชร์ที่อยู่", "shared_seed_wallet_groups": "กลุ่มกระเป๋าเงินที่ใช้ร่วมกัน", "show": "แสดง", - "show_address_book_popup": "แสดง 'เพิ่มในสมุดรายชื่อ' ป๊อปอัพหลังจากส่ง", + "show_address_book_popup": "แสดงสมุดที่อยู่ป๊อปอัพ", "show_balance": "กดยาวเพื่อแสดงความสมดุล", "show_balance_toast": "กดนานเพื่อซ่อนหรือแสดงความสมดุล", "show_details": "แสดงรายละเอียด", @@ -781,6 +781,7 @@ "support_title_guides": "เอกสารกระเป๋าเงินเค้ก", "support_title_live_chat": "การสนับสนุนสด", "support_title_other_links": "ลิงค์สนับสนุนอื่น ๆ", + "swap": "แลกเปลี่ยน", "sweeping_wallet": "กวาดกระเป๋าสตางค์", "sweeping_wallet_alert": "การดำเนินการนี้ใช้เวลาไม่นาน อย่าออกจากหน้าจอนี้ มิฉะนั้นเงินที่กวาดไปอาจสูญหาย", "switchToETHWallet": "โปรดเปลี่ยนไปใช้กระเป๋าเงิน Ethereum แล้วลองอีกครั้ง", diff --git a/res/values/strings_tl.arb b/res/values/strings_tl.arb index a033bd26c1..62b467e8da 100644 --- a/res/values/strings_tl.arb +++ b/res/values/strings_tl.arb @@ -733,7 +733,7 @@ "share_address": "Ibahagi ang address", "shared_seed_wallet_groups": "Ibinahaging mga pangkat ng pitaka ng binhi", "show": "Ipakita", - "show_address_book_popup": "Ipakita ang popup na 'Idagdag sa Address Book' pagkatapos magpadala", + "show_address_book_popup": "Ipakita ang Address Book Popup", "show_balance": "Mahabang pindutin upang ipakita ang balanse", "show_balance_toast": "Mahabang pindutin upang itago o ipakita ang balanse", "show_details": "Ipakita ang mga detalye", @@ -781,6 +781,7 @@ "support_title_guides": "Cake wallet doc", "support_title_live_chat": "Live na suporta", "support_title_other_links": "Iba pang mga link sa suporta", + "swap": "Palitan", "sweeping_wallet": "Sweeping wallet", "sweeping_wallet_alert": "Hindi ito dapat magtagal. HUWAG iwanan ang screen na ito o maaaring mawala ang mga pondo.", "switchToETHWallet": "Mangyaring lumipat sa isang Ethereum wallet at subukang muli", diff --git a/res/values/strings_tr.arb b/res/values/strings_tr.arb index 6ba032d786..77c6f7738d 100644 --- a/res/values/strings_tr.arb +++ b/res/values/strings_tr.arb @@ -294,7 +294,7 @@ "etherscan_history": "Etherscan geçmişi", "event": "Etkinlik", "events": "Olaylar", - "exchange": "Takas", + "exchange": "Değişme", "exchange_incorrect_current_wallet_for_xmr": "XMR'yi kek cüzdanı Monero bakiyenizden değiştirmek istiyorsanız, lütfen önce Monero cüzdanınıza geçin.", "exchange_new_template": "Yeni şablon", "exchange_provider_unsupported": "${providerName} artık desteklenmiyor!", @@ -733,7 +733,7 @@ "share_address": "Adresi paylaş", "shared_seed_wallet_groups": "Paylaşılan tohum cüzdan grupları", "show": "Göstermek", - "show_address_book_popup": "Gönderdikten sonra 'adres defterine ekle' açılır", + "show_address_book_popup": "Adres Kitabı Popup'ı Göster", "show_balance": "Dengeyi Göstermek İçin Uzun Basın", "show_balance_toast": "Dengeyi gizlemek veya göstermek için uzun basın", "show_details": "Detayları Göster", @@ -781,6 +781,7 @@ "support_title_guides": "Kek Cüzdan Dokümanlar", "support_title_live_chat": "Canlı destek", "support_title_other_links": "Diğer destek bağlantıları", + "swap": "Takas", "sweeping_wallet": "Süpürme cüzdanı", "sweeping_wallet_alert": "Bu uzun sürmemeli. BU EKRANDAN BIRAKMAYIN YOKSA SÜPÜRÜLEN FONLAR KAYBOLABİLİR", "switchToETHWallet": "Lütfen bir Ethereum cüzdanına geçin ve tekrar deneyin", diff --git a/res/values/strings_uk.arb b/res/values/strings_uk.arb index 6a3d72ad35..d437e1797f 100644 --- a/res/values/strings_uk.arb +++ b/res/values/strings_uk.arb @@ -294,7 +294,7 @@ "etherscan_history": "Історія Etherscan", "event": "Подія", "events": "Події", - "exchange": "Обміняти", + "exchange": "Обмін", "exchange_incorrect_current_wallet_for_xmr": "Якщо ви хочете поміняти XMR зі свого балансу для тортів Monero Balance, спочатку перейдіть на свій гаманець Monero.", "exchange_new_template": "Новий шаблон", "exchange_provider_unsupported": "${providerName} більше не підтримується!", @@ -734,7 +734,7 @@ "share_address": "Поділитися адресою", "shared_seed_wallet_groups": "Спільні групи насіннєвих гаманців", "show": "Показувати", - "show_address_book_popup": "Показати спливаюче вікно \"Додати до адресної книги\" після надсилання", + "show_address_book_popup": "Показати спливаюче вікно адреси книги", "show_balance": "Довга преса, щоб показати рівновагу", "show_balance_toast": "Довга преса, щоб приховати або показати рівновагу", "show_details": "Показати деталі", @@ -782,6 +782,7 @@ "support_title_guides": "Торт гаманці", "support_title_live_chat": "Жива підтримка", "support_title_other_links": "Інші посилання на підтримку", + "swap": "Обміняти", "sweeping_wallet": "Підмітаня гаманця", "sweeping_wallet_alert": "Це не повинно зайняти багато часу. НЕ ЗАЛИШАЙТЕ ЦЬОГО ЕКРАНУ, АБО КОШТИ МОЖУТЬ БУТИ ВТРАЧЕНІ", "switchToETHWallet": "Перейдіть на гаманець Ethereum і повторіть спробу", diff --git a/res/values/strings_ur.arb b/res/values/strings_ur.arb index ae129b8990..81291d7ee6 100644 --- a/res/values/strings_ur.arb +++ b/res/values/strings_ur.arb @@ -735,7 +735,7 @@ "share_address": "پتہ شیئر کریں۔", "shared_seed_wallet_groups": "مشترکہ بیج پرس گروپ", "show": "دکھائیں", - "show_address_book_popup": "بھیجنے کے بعد 'ایڈریس میں شامل کریں کتاب' پاپ اپ دکھائیں", + "show_address_book_popup": "ایڈریس بک پاپ اپ دکھائیں", "show_balance": "توازن ظاہر کرنے کے لئے طویل پریس", "show_balance_toast": "توازن چھپانے یا ظاہر کرنے کے لئے طویل پریس", "show_details": "تفصیلات دکھائیں", @@ -783,6 +783,7 @@ "support_title_guides": "کیک پرس کے دستاویزات", "support_title_live_chat": "براہ راست مدد", "support_title_other_links": "دوسرے سپورٹ لنکس", + "swap": "تبادلہ", "sweeping_wallet": "جھاڑو دینے والا پرس", "sweeping_wallet_alert": "اس میں زیادہ وقت نہیں لینا چاہئے۔ اس اسکرین کو مت چھوڑیں یا بہہ جانے والے فنڈز ضائع ہوسکتے ہیں۔", "switchToETHWallet": "۔ﮟﯾﺮﮐ ﺶﺷﻮﮐ ﮦﺭﺎﺑﻭﺩ ﺭﻭﺍ ﮟﯾﺮﮐ ﭻﺋﻮﺳ ﺮﭘ ﭧﯿﻟﺍﻭ Ethereum ﻡﺮﮐ ﮦﺍﺮﺑ", diff --git a/res/values/strings_vi.arb b/res/values/strings_vi.arb index 5a9f39947d..3a3e94d30d 100644 --- a/res/values/strings_vi.arb +++ b/res/values/strings_vi.arb @@ -293,7 +293,7 @@ "etherscan_history": "Lịch sử Etherscan", "event": "Sự kiện", "events": "Các sự kiện", - "exchange": "Tráo đổi", + "exchange": "Trao đổi", "exchange_incorrect_current_wallet_for_xmr": "Nếu bạn muốn trao đổi XMR từ CAPE CAME MONERO BALANCE, vui lòng chuyển sang ví Monero của bạn trước.", "exchange_new_template": "Mẫu mới", "exchange_provider_unsupported": "${providerName} không còn được hỗ trợ nữa!", @@ -732,7 +732,7 @@ "share_address": "Chia sẻ địa chỉ", "shared_seed_wallet_groups": "Nhóm ví hạt được chia sẻ", "show": "Trình diễn", - "show_address_book_popup": "Hiển thị cửa sổ bật lên 'Thêm vào sổ địa chỉ' sau khi gửi", + "show_address_book_popup": "Hiển thị cửa sổ bật lên sổ sách địa chỉ", "show_balance": "Báo chí dài để hiển thị sự cân bằng", "show_balance_toast": "Nhấn dài để ẩn hoặc hiển thị sự cân bằng", "show_details": "Hiển thị chi tiết", @@ -780,6 +780,7 @@ "support_title_guides": "Cake Wallet Docs", "support_title_live_chat": "Hỗ trợ trực tiếp", "support_title_other_links": "Liên kết hỗ trợ khác", + "swap": "Tráo đổi", "sweeping_wallet": "Quét ví", "sweeping_wallet_alert": "Việc này không nên mất nhiều thời gian. KHÔNG RỜI KHỎI MÀN HÌNH NÀY HOẶC CÁC KHOẢN TIỀN ĐƯỢC QUÉT CÓ THỂ BỊ MẤT.", "switchToETHWallet": "Vui lòng chuyển sang ví Ethereum và thử lại", diff --git a/res/values/strings_yo.arb b/res/values/strings_yo.arb index a962a66d77..0bfb047276 100644 --- a/res/values/strings_yo.arb +++ b/res/values/strings_yo.arb @@ -295,7 +295,7 @@ "etherscan_history": "Etherscan itan", "event": "Iṣẹlẹ", "events": "Awọn iṣẹlẹ", - "exchange": "Eepo", + "exchange": "Paarọ", "exchange_incorrect_current_wallet_for_xmr": "Ti o ba fẹ lati yi XMR lati dọgba oyinbo oyinbo kekere rẹ ti a fi omi ṣan rẹ, jọwọ yipada si apamọwọ Monrou akọkọ.", "exchange_new_template": "Àwòṣe títun", "exchange_provider_unsupported": "${providerName} ko ni atilẹyin mọ!", @@ -734,7 +734,7 @@ "share_address": "Pín àdírẹ́sì", "shared_seed_wallet_groups": "Awọn ẹgbẹ ti a pin irugbin", "show": "Fihan", - "show_address_book_popup": "Fihan 'ṣafikun si Agbejade Iwe' Lẹhin fifiranṣẹ", + "show_address_book_popup": "Fihan Agbejade Iwe Adirẹsi", "show_balance": "Tẹ Tẹ lati ṣafihan iwọntunwọnsi", "show_balance_toast": "Tẹ Tẹ lati tọju tabi ṣafihan iwọntunwọnsi", "show_details": "Fi ìsọfúnni kékeré hàn", @@ -782,6 +782,7 @@ "support_title_guides": "Awọn iwe apamọwọ oyinbo akara oyinbo", "support_title_live_chat": "Atilẹyin ifiwe", "support_title_other_links": "Awọn ọna asopọ atilẹyin miiran", + "swap": "Eepo", "sweeping_wallet": "Fi owo iwe iwe wofo", "sweeping_wallet_alert": "Yio kọja pada si ikan yii. Kì yoo daadaa leede yii tabi owo ti o ti fi se iwe iwe naa yoo gbe.", "switchToETHWallet": "Jọwọ yipada si apamọwọ Ethereum ki o tun gbiyanju lẹẹkansi", diff --git a/res/values/strings_zh.arb b/res/values/strings_zh.arb index f0a5e390ff..2832b6d98c 100644 --- a/res/values/strings_zh.arb +++ b/res/values/strings_zh.arb @@ -733,7 +733,7 @@ "share_address": "分享地址", "shared_seed_wallet_groups": "共享种子钱包组", "show": "展示", - "show_address_book_popup": "发送后显示“添加到通讯簿”弹出窗口", + "show_address_book_popup": "显示地址簿弹出", "show_balance": "长印刷以显示平衡", "show_balance_toast": "长按以隐藏或显示平衡", "show_details": "显示详细信息", @@ -781,6 +781,7 @@ "support_title_guides": "蛋糕钱包文档", "support_title_live_chat": "实时支持", "support_title_other_links": "其他支持链接", + "swap": "交换", "sweeping_wallet": "扫一扫钱包", "sweeping_wallet_alert": "\n这应该不会花很长时间。请勿离开此屏幕,否则可能会丢失所掠取的资金", "switchToETHWallet": "请切换到以太坊钱包并重试", From 92fc6a4a60caa8e3703985f6daa2a1293e16b00d Mon Sep 17 00:00:00 2001 From: OmarHatem Date: Wed, 12 Feb 2025 14:38:51 +0300 Subject: [PATCH 2/8] minor cleanup [skip ci] --- .../pages/balance/crypto_balance_widget.dart | 4 - lib/src/widgets/dashboard_card_widget.dart | 173 ++++++++---------- 2 files changed, 80 insertions(+), 97 deletions(-) diff --git a/lib/src/screens/dashboard/pages/balance/crypto_balance_widget.dart b/lib/src/screens/dashboard/pages/balance/crypto_balance_widget.dart index 2c3796912a..ee3dfb8747 100644 --- a/lib/src/screens/dashboard/pages/balance/crypto_balance_widget.dart +++ b/lib/src/screens/dashboard/pages/balance/crypto_balance_widget.dart @@ -39,7 +39,6 @@ class CryptoBalanceWidget extends StatelessWidget { child: DashBoardRoundedCardWidget( title: "Invalid monero bindings", subTitle: dashboardViewModel.getMoneroError.toString(), - onTap: () {}, ), ); } @@ -54,7 +53,6 @@ class CryptoBalanceWidget extends StatelessWidget { child: DashBoardRoundedCardWidget( title: "Invalid wownero bindings", subTitle: dashboardViewModel.getWowneroError.toString(), - onTap: () {}, )); } return Container(); @@ -206,7 +204,6 @@ class CryptoBalanceWidget extends StatelessWidget { subTitle: "Here are the things that you should note:\n - " + dashboardViewModel.isMoneroWalletBrokenReasons.join("\n - ") + "\n\nPlease restart your wallet and if it doesn't help contact our support.", - onTap: () {}, )) ], if (dashboardViewModel.showSilentPaymentsCard) ...[ @@ -344,7 +341,6 @@ class CryptoBalanceWidget extends StatelessWidget { ), ], ), - onTap: () => {}, icon: Container( decoration: BoxDecoration( color: Colors.white, diff --git a/lib/src/widgets/dashboard_card_widget.dart b/lib/src/widgets/dashboard_card_widget.dart index 66eeedc815..bb145e4c00 100644 --- a/lib/src/widgets/dashboard_card_widget.dart +++ b/lib/src/widgets/dashboard_card_widget.dart @@ -6,7 +6,7 @@ import 'package:flutter_svg/flutter_svg.dart'; class DashBoardRoundedCardWidget extends StatelessWidget { DashBoardRoundedCardWidget({ - required this.onTap, + this.onTap, required this.title, required this.subTitle, this.hint, @@ -22,7 +22,7 @@ class DashBoardRoundedCardWidget extends StatelessWidget { this.marginH, }); - final VoidCallback onTap; + final VoidCallback? onTap; final VoidCallback? onClose; final String title; final String subTitle; @@ -38,104 +38,91 @@ class DashBoardRoundedCardWidget extends StatelessWidget { @override Widget build(BuildContext context) { - return InkWell( - //onTap: onTap, - //hoverColor: Colors.transparent, - //splashColor: Colors.transparent, - //highlightColor: Colors.transparent, - child: Stack( - children: [ - Container( - margin: EdgeInsets.symmetric(horizontal: marginH ?? 20, vertical: marginV ?? 8), - //padding: EdgeInsets.all(20), - width: double.infinity, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(customBorder ?? 20), - border: Border.all( - color: Theme.of(context).extension()!.cardBorderColor, - ), - // boxShadow: [ - // BoxShadow( - // color: Theme.of(context).extension()!.cardBorderColor - // .withAlpha(50), - // spreadRadius: shadowSpread ?? 3, - // blurRadius: shadowBlur ?? 7, - // ) - // ], - ), - child: TextButton( - onPressed: onTap, - style: TextButton.styleFrom( - backgroundColor: Theme.of(context) - .extension()! - .syncedBackgroundColor, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(customBorder ?? 20)), - padding: EdgeInsets.all(24) + return Stack( + children: [ + Container( + margin: EdgeInsets.symmetric(horizontal: marginH ?? 20, vertical: marginV ?? 8), + //padding: EdgeInsets.all(20), + width: double.infinity, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(customBorder ?? 20), + border: Border.all( + color: Theme.of(context).extension()!.cardBorderColor, + ), + // boxShadow: [ + // BoxShadow( + // color: Theme.of(context).extension()!.cardBorderColor + // .withAlpha(50), + // spreadRadius: shadowSpread ?? 3, + // blurRadius: shadowBlur ?? 7, + // ) + // ], ), - child: Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - title, - style: TextStyle( + child: TextButton( + onPressed: onTap, + style: TextButton.styleFrom( + backgroundColor: + Theme.of(context).extension()!.syncedBackgroundColor, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(customBorder ?? 20)), + padding: EdgeInsets.all(24)), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: TextStyle( + color: Theme.of(context) + .extension()! + .cardTextColor, + fontSize: 24, + fontWeight: FontWeight.w900, + ), + softWrap: true, + ), + SizedBox(height: 5), + Text( + subTitle, + style: TextStyle( color: Theme.of(context) .extension()! .cardTextColor, - fontSize: 24, - fontWeight: FontWeight.w900, - ), - softWrap: true, - ), - SizedBox(height: 5), - Text( - subTitle, - style: TextStyle( - color: Theme.of(context) - .extension()! - .cardTextColor, - fontWeight: FontWeight.w500, - fontFamily: 'Lato'), - softWrap: true, - ), - ], - ), + fontWeight: FontWeight.w500, + fontFamily: 'Lato'), + softWrap: true, + ), + ], ), - if (image != null) - image! - else if (svgPicture != null) - svgPicture!, - if (icon != null) icon! - ], - ), - if (hint != null) ...[ - SizedBox(height: 10), - hint!, - ] - ], - ), + ), + if (image != null) image! else if (svgPicture != null) svgPicture!, + if (icon != null) icon! + ], + ), + if (hint != null) ...[ + SizedBox(height: 10), + hint!, + ] + ], ), + ), + ), + if (onClose != null) + Positioned( + top: 10, + right: 10, + child: IconButton( + icon: Icon(Icons.close), + onPressed: onClose, + color: Theme.of(context).extension()!.cardTextColor, ), - if (onClose != null) - Positioned( - top: 10, - right: 10, - child: IconButton( - icon: Icon(Icons.close), - onPressed: onClose, - color: Theme.of(context) - .extension()! - .cardTextColor, - ), - ), - ], - ), + ), + ], ); } } From 637bc1cdc992527ec7d2238ab3fe3c7ed011e483 Mon Sep 17 00:00:00 2001 From: cyan Date: Wed, 12 Feb 2025 12:41:35 +0100 Subject: [PATCH 3/8] Fix errors from seed restore not being shown to user properly (#2019) --- cw_monero/lib/api/wallet_manager.dart | 8 ++++---- cw_monero/lib/monero_wallet_service.dart | 15 +++++++++++---- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/cw_monero/lib/api/wallet_manager.dart b/cw_monero/lib/api/wallet_manager.dart index 6a7ecdb5d6..67a1a666ee 100644 --- a/cw_monero/lib/api/wallet_manager.dart +++ b/cw_monero/lib/api/wallet_manager.dart @@ -100,7 +100,7 @@ void restoreWalletFromSeedSync( required String passphrase, required String seed, int nettype = 0, - int restoreHeight = 0}) async { + int restoreHeight = 0}) { txhistory = null; final newWptr = monero.WalletManager_recoveryWallet( wmPtr, @@ -404,7 +404,7 @@ void _restoreFromSeed(Map args) { final seed = args['seed'] as String; final restoreHeight = args['restoreHeight'] as int; - restoreWalletFromSeedSync( + return restoreWalletFromSeedSync( path: path, password: password, passphrase: passphrase, seed: seed, restoreHeight: restoreHeight); } @@ -472,13 +472,13 @@ Future createWallet( 'nettype': nettype }); -Future restoreFromSeed( +void restoreFromSeed( {required String path, required String password, required String passphrase, required String seed, int nettype = 0, - int restoreHeight = 0}) async => + int restoreHeight = 0}) => _restoreFromSeed({ 'path': path, 'password': password, diff --git a/cw_monero/lib/monero_wallet_service.dart b/cw_monero/lib/monero_wallet_service.dart index 648c797022..fbb1c5331a 100644 --- a/cw_monero/lib/monero_wallet_service.dart +++ b/cw_monero/lib/monero_wallet_service.dart @@ -292,14 +292,21 @@ class MoneroWalletService extends WalletService< Future restoreFromSeed( MoneroRestoreWalletFromSeedCredentials credentials, {bool? isTestnet}) async { - // Restore from Polyseed - if (Polyseed.isValidSeed(credentials.mnemonic)) { - return restoreFromPolyseed(credentials); + if (credentials.mnemonic.split(" ").length == 16) { + // Restore from Polyseed + try { + if (Polyseed.isValidSeed(credentials.mnemonic)) { + return restoreFromPolyseed(credentials); + } + } catch (e) { + printV("Polyseed restore failed: $e"); + rethrow; + } } try { final path = await pathForWallet(name: credentials.name, type: getType()); - await monero_wallet_manager.restoreFromSeed( + monero_wallet_manager.restoreFromSeed( path: path, password: credentials.password!, passphrase: credentials.passphrase, From 64395a21a261adee8d4df3056d13b685b58fa186 Mon Sep 17 00:00:00 2001 From: cyan Date: Wed, 12 Feb 2025 12:53:13 +0100 Subject: [PATCH 4/8] fix cn_slow_hash on devices with limited stack (#2012) --- cw_monero/pubspec.lock | 4 ++-- cw_monero/pubspec.yaml | 2 +- cw_wownero/pubspec.lock | 4 ++-- cw_wownero/pubspec.yaml | 2 +- cw_zano/pubspec.lock | 4 ++-- cw_zano/pubspec.yaml | 2 +- scripts/prepare_moneroc.sh | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cw_monero/pubspec.lock b/cw_monero/pubspec.lock index 435308774d..8d3c07a9a4 100644 --- a/cw_monero/pubspec.lock +++ b/cw_monero/pubspec.lock @@ -511,8 +511,8 @@ packages: dependency: "direct main" description: path: "impls/monero.dart" - ref: "127c54599c612d7d3d226e4c016d5812e7a0966d" - resolved-ref: "127c54599c612d7d3d226e4c016d5812e7a0966d" + ref: "09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b" + resolved-ref: "09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b" url: "https://github.com/mrcyjanek/monero_c" source: git version: "0.0.0" diff --git a/cw_monero/pubspec.yaml b/cw_monero/pubspec.yaml index f1f08cb853..aaf2d768a0 100644 --- a/cw_monero/pubspec.yaml +++ b/cw_monero/pubspec.yaml @@ -25,7 +25,7 @@ dependencies: monero: git: url: https://github.com/mrcyjanek/monero_c - ref: 127c54599c612d7d3d226e4c016d5812e7a0966d + ref: 09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b path: impls/monero.dart mutex: ^3.1.0 ledger_flutter_plus: ^1.4.1 diff --git a/cw_wownero/pubspec.lock b/cw_wownero/pubspec.lock index 34aad74e17..3cfa0687fd 100644 --- a/cw_wownero/pubspec.lock +++ b/cw_wownero/pubspec.lock @@ -471,8 +471,8 @@ packages: dependency: "direct main" description: path: "impls/monero.dart" - ref: "127c54599c612d7d3d226e4c016d5812e7a0966d" - resolved-ref: "127c54599c612d7d3d226e4c016d5812e7a0966d" + ref: "09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b" + resolved-ref: "09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b" url: "https://github.com/mrcyjanek/monero_c" source: git version: "0.0.0" diff --git a/cw_wownero/pubspec.yaml b/cw_wownero/pubspec.yaml index 8f03c79d77..a57bcd4d59 100644 --- a/cw_wownero/pubspec.yaml +++ b/cw_wownero/pubspec.yaml @@ -25,7 +25,7 @@ dependencies: monero: git: url: https://github.com/mrcyjanek/monero_c - ref: 127c54599c612d7d3d226e4c016d5812e7a0966d # monero_c hash + ref: 09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b # monero_c hash path: impls/monero.dart mutex: ^3.1.0 diff --git a/cw_zano/pubspec.lock b/cw_zano/pubspec.lock index bc7e1a5f9e..3cc89211e1 100644 --- a/cw_zano/pubspec.lock +++ b/cw_zano/pubspec.lock @@ -476,8 +476,8 @@ packages: dependency: "direct main" description: path: "impls/monero.dart" - ref: "127c54599c612d7d3d226e4c016d5812e7a0966d" - resolved-ref: "127c54599c612d7d3d226e4c016d5812e7a0966d" + ref: "09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b" + resolved-ref: "09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b" url: "https://github.com/mrcyjanek/monero_c" source: git version: "0.0.0" diff --git a/cw_zano/pubspec.yaml b/cw_zano/pubspec.yaml index 537b46f8cc..7f932b35b9 100644 --- a/cw_zano/pubspec.yaml +++ b/cw_zano/pubspec.yaml @@ -26,7 +26,7 @@ dependencies: monero: git: url: https://github.com/mrcyjanek/monero_c - ref: 127c54599c612d7d3d226e4c016d5812e7a0966d # monero_c hash + ref: 09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b # monero_c hash path: impls/monero.dart dev_dependencies: flutter_test: diff --git a/scripts/prepare_moneroc.sh b/scripts/prepare_moneroc.sh index 2301209f6a..0d265d7947 100755 --- a/scripts/prepare_moneroc.sh +++ b/scripts/prepare_moneroc.sh @@ -8,7 +8,7 @@ if [[ ! -d "monero_c/.git" ]]; then git clone https://github.com/mrcyjanek/monero_c --branch master monero_c cd monero_c - git checkout 127c54599c612d7d3d226e4c016d5812e7a0966d + git checkout 09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b git reset --hard git submodule update --init --force --recursive ./apply_patches.sh monero From 241e3bcc6efd1125a72e30f0987b4f55b72effc9 Mon Sep 17 00:00:00 2001 From: cyan Date: Wed, 12 Feb 2025 12:57:12 +0100 Subject: [PATCH 5/8] Fix ledger issues (#2022) Co-authored-by: OmarHatem --- cw_monero/pubspec.lock | 4 ++-- cw_monero/pubspec.yaml | 2 +- cw_wownero/pubspec.lock | 4 ++-- cw_wownero/pubspec.yaml | 2 +- cw_zano/pubspec.lock | 4 ++-- cw_zano/pubspec.yaml | 2 +- scripts/prepare_moneroc.sh | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cw_monero/pubspec.lock b/cw_monero/pubspec.lock index 8d3c07a9a4..efc557fcee 100644 --- a/cw_monero/pubspec.lock +++ b/cw_monero/pubspec.lock @@ -511,8 +511,8 @@ packages: dependency: "direct main" description: path: "impls/monero.dart" - ref: "09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b" - resolved-ref: "09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b" + ref: "9d9b1f2f2373fc9a99c6556a93eea63fe343cf58" + resolved-ref: "9d9b1f2f2373fc9a99c6556a93eea63fe343cf58" url: "https://github.com/mrcyjanek/monero_c" source: git version: "0.0.0" diff --git a/cw_monero/pubspec.yaml b/cw_monero/pubspec.yaml index aaf2d768a0..99c41c85b7 100644 --- a/cw_monero/pubspec.yaml +++ b/cw_monero/pubspec.yaml @@ -25,7 +25,7 @@ dependencies: monero: git: url: https://github.com/mrcyjanek/monero_c - ref: 09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b + ref: 9d9b1f2f2373fc9a99c6556a93eea63fe343cf58 path: impls/monero.dart mutex: ^3.1.0 ledger_flutter_plus: ^1.4.1 diff --git a/cw_wownero/pubspec.lock b/cw_wownero/pubspec.lock index 3cfa0687fd..05526446d6 100644 --- a/cw_wownero/pubspec.lock +++ b/cw_wownero/pubspec.lock @@ -471,8 +471,8 @@ packages: dependency: "direct main" description: path: "impls/monero.dart" - ref: "09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b" - resolved-ref: "09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b" + ref: "9d9b1f2f2373fc9a99c6556a93eea63fe343cf58" + resolved-ref: "9d9b1f2f2373fc9a99c6556a93eea63fe343cf58" url: "https://github.com/mrcyjanek/monero_c" source: git version: "0.0.0" diff --git a/cw_wownero/pubspec.yaml b/cw_wownero/pubspec.yaml index a57bcd4d59..84bc2ac889 100644 --- a/cw_wownero/pubspec.yaml +++ b/cw_wownero/pubspec.yaml @@ -25,7 +25,7 @@ dependencies: monero: git: url: https://github.com/mrcyjanek/monero_c - ref: 09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b # monero_c hash + ref: 9d9b1f2f2373fc9a99c6556a93eea63fe343cf58 # monero_c hash path: impls/monero.dart mutex: ^3.1.0 diff --git a/cw_zano/pubspec.lock b/cw_zano/pubspec.lock index 3cc89211e1..fe052c6ca7 100644 --- a/cw_zano/pubspec.lock +++ b/cw_zano/pubspec.lock @@ -476,8 +476,8 @@ packages: dependency: "direct main" description: path: "impls/monero.dart" - ref: "09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b" - resolved-ref: "09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b" + ref: "9d9b1f2f2373fc9a99c6556a93eea63fe343cf58" + resolved-ref: "9d9b1f2f2373fc9a99c6556a93eea63fe343cf58" url: "https://github.com/mrcyjanek/monero_c" source: git version: "0.0.0" diff --git a/cw_zano/pubspec.yaml b/cw_zano/pubspec.yaml index 7f932b35b9..b79f15b1d2 100644 --- a/cw_zano/pubspec.yaml +++ b/cw_zano/pubspec.yaml @@ -26,7 +26,7 @@ dependencies: monero: git: url: https://github.com/mrcyjanek/monero_c - ref: 09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b # monero_c hash + ref: 9d9b1f2f2373fc9a99c6556a93eea63fe343cf58 # monero_c hash path: impls/monero.dart dev_dependencies: flutter_test: diff --git a/scripts/prepare_moneroc.sh b/scripts/prepare_moneroc.sh index 0d265d7947..4e152c7ba0 100755 --- a/scripts/prepare_moneroc.sh +++ b/scripts/prepare_moneroc.sh @@ -8,7 +8,7 @@ if [[ ! -d "monero_c/.git" ]]; then git clone https://github.com/mrcyjanek/monero_c --branch master monero_c cd monero_c - git checkout 09c6d2e5f8ae8e9f4c5efe5b7bfe72911462a32b + git checkout 9d9b1f2f2373fc9a99c6556a93eea63fe343cf58 git reset --hard git submodule update --init --force --recursive ./apply_patches.sh monero From b16beb37b7a2b8c78c5272055ed5f86f84200f81 Mon Sep 17 00:00:00 2001 From: David Adegoke <64401859+Blazebrain@users.noreply.github.com> Date: Wed, 12 Feb 2025 14:56:09 +0100 Subject: [PATCH 6/8] CW-814-Add-Armenian-AMD-Currency (#2027) * feat: Add Armenian AMD Currency * feat: Add Armenian AMD Currency * Update lib/entities/fiat_currency.dart [skip ci] --------- Co-authored-by: Omar Hatem --- lib/entities/fiat_currency.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/entities/fiat_currency.dart b/lib/entities/fiat_currency.dart index 1a031ee826..cf11120961 100644 --- a/lib/entities/fiat_currency.dart +++ b/lib/entities/fiat_currency.dart @@ -10,8 +10,9 @@ class FiatCurrency extends EnumerableItem with Serializable impl static List get all => _all.values.toList(); static List get currenciesAvailableToBuyWith => - [aud, bgn, brl, cad, chf, clp, cop, czk, dkk, egp, eur, gbp, gtq, hkd, hrk, huf, idr, ils, inr, isk, jpy, krw, mad, mxn, myr, ngn, nok, nzd, php, pkr, pln, ron, sek, sgd, thb, twd, usd, vnd, zar, tur]; + [amd, aud, bgn, brl, cad, chf, clp, cop, czk, dkk, egp, eur, gbp, gtq, hkd, hrk, huf, idr, ils, inr, isk, jpy, krw, mad, mxn, myr, ngn, nok, nzd, php, pkr, pln, ron, sek, sgd, thb, twd, usd, vnd, zar, tur,]; + static const amd = FiatCurrency(symbol: 'AMD', countryCode: "arm", fullName: "Armenian Dram"); static const ars = FiatCurrency(symbol: 'ARS', countryCode: "arg", fullName: "Argentine Peso"); static const aud = FiatCurrency(symbol: 'AUD', countryCode: "aus", fullName: "Australian Dollar"); static const bdt = FiatCurrency(symbol: 'BDT', countryCode: "bgd", fullName: "Bangladeshi Taka"); @@ -63,6 +64,7 @@ class FiatCurrency extends EnumerableItem with Serializable impl static const tur = FiatCurrency(symbol: 'TRY', countryCode: "tur", fullName: "Turkish Lira"); static final _all = { + FiatCurrency.amd.raw: FiatCurrency.amd, FiatCurrency.ars.raw: FiatCurrency.ars, FiatCurrency.aud.raw: FiatCurrency.aud, FiatCurrency.bdt.raw: FiatCurrency.bdt, From 8291132ca1149444fb74d6c725b8656b412114e2 Mon Sep 17 00:00:00 2001 From: Matthew Fosse Date: Wed, 12 Feb 2025 13:48:09 -0800 Subject: [PATCH 7/8] ToS flow & improvements (#2024) * remove changenow part of tos, update default route, improve flow * fix back button on tos (willpopscope -> isReadOnly) --- lib/main.dart | 2 +- .../screens/disclaimer/disclaimer_page.dart | 46 +--------------- .../welcome/create_pin_welcome_page.dart | 54 ++++++++++++++----- 3 files changed, 42 insertions(+), 60 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 9c3980aa17..0e02ef97b1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -284,7 +284,7 @@ class AppState extends State with SingleTickerProviderStateMixin { final statusBarColor = Colors.transparent; final authenticationStore = getIt.get(); final initialRoute = authenticationStore.state == AuthenticationState.uninitialized - ? Routes.disclaimer + ? Routes.welcome : Routes.login; final currentTheme = settingsStore.currentTheme; final statusBarBrightness = diff --git a/lib/src/screens/disclaimer/disclaimer_page.dart b/lib/src/screens/disclaimer/disclaimer_page.dart index c9d959b406..a7d3b5ff9f 100644 --- a/lib/src/screens/disclaimer/disclaimer_page.dart +++ b/lib/src/screens/disclaimer/disclaimer_page.dart @@ -41,7 +41,6 @@ class DisclaimerPageBody extends StatefulWidget { } class DisclaimerBodyState extends State { - static const changenowUrl = 'https://changenow.io/terms-of-use'; bool _checked = false; String _fileText = ''; @@ -63,7 +62,7 @@ class DisclaimerBodyState extends State { @override Widget build(BuildContext context) { return WillPopScope( - onWillPop: () async => false, + onWillPop: () async => widget.isReadOnly, child: Container( color: Theme.of(context).colorScheme.background, child: Column( @@ -125,49 +124,6 @@ class DisclaimerBodyState extends State { SizedBox( height: 16.0, ), - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( - child: Text( - 'Other Terms and Conditions', - textAlign: TextAlign.left, - style: TextStyle( - fontSize: 14.0, - fontWeight: FontWeight.bold, - color: Theme.of(context).extension()!.titleColor), - ), - ) - ], - ), - SizedBox( - height: 16.0, - ), - Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Expanded( - child: GestureDetector( - onTap: () async { - final uri = Uri.parse(changenowUrl); - if (await canLaunchUrl(uri)) - await launchUrl(uri, mode: LaunchMode.externalApplication); - }, - child: Text( - changenowUrl, - textAlign: TextAlign.left, - style: TextStyle( - color: Theme.of(context).primaryColor, - fontSize: 14.0, - fontWeight: FontWeight.normal, - decoration: TextDecoration.underline), - ), - )) - ], - ), - SizedBox( - height: 16.0, - ) ], ), ), diff --git a/lib/src/screens/welcome/create_pin_welcome_page.dart b/lib/src/screens/welcome/create_pin_welcome_page.dart index 5a881a20b0..ddf3b8d5ba 100644 --- a/lib/src/screens/welcome/create_pin_welcome_page.dart +++ b/lib/src/screens/welcome/create_pin_welcome_page.dart @@ -2,6 +2,7 @@ import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart'; import 'package:cake_wallet/themes/extensions/cake_text_theme.dart'; import 'package:cake_wallet/themes/theme_base.dart'; import 'package:cake_wallet/utils/responsive_layout_util.dart'; +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/routes.dart'; import 'package:cake_wallet/src/widgets/primary_button.dart'; @@ -68,7 +69,7 @@ class CreatePinWelcomePage extends BasePage { alignment: Alignment.center, child: ConstrainedBox( constraints: - BoxConstraints(maxWidth: ResponsiveLayoutUtilBase.kDesktopMaxWidthConstraint), + BoxConstraints(maxWidth: ResponsiveLayoutUtilBase.kDesktopMaxWidthConstraint), child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ @@ -122,19 +123,44 @@ class CreatePinWelcomePage extends BasePage { ), ), ), - bottomSection: Padding( - padding: EdgeInsets.only(top: 24), - child: PrimaryImageButton( - key: ValueKey('create_pin_welcome_page_create_a_pin_button_key'), - onPressed: () => Navigator.pushNamed(context, Routes.welcomeWallet), - image: newWalletImage, - text: isWalletPasswordDirectInput ? S.current.set_up_a_wallet : S.current.set_a_pin, - color: Theme.of(context) - .extension()! - .createNewWalletButtonBackgroundColor, - textColor: - Theme.of(context).extension()!.restoreWalletButtonTextColor, - ), + bottomSection: Column( + children: [ + RichText( + textAlign: TextAlign.center, + text: TextSpan( + style: TextStyle( + fontSize: 14, + color: Theme.of(context).extension()!.hintTextColor, + ), + children: [ + TextSpan(text: 'By continuing, you agree to our '), + TextSpan( + text: 'Terms of Service', + style: TextStyle( + color: Theme.of(context).primaryColor, + decoration: TextDecoration.underline, + ), + recognizer: TapGestureRecognizer() + ..onTap = () => Navigator.pushNamed(context, Routes.readDisclaimer), + ), + ], + ), + ), + Padding( + padding: EdgeInsets.only(top: 24), + child: PrimaryImageButton( + key: ValueKey('create_pin_welcome_page_create_a_pin_button_key'), + onPressed: () => Navigator.pushNamed(context, Routes.welcomeWallet), + image: newWalletImage, + text: isWalletPasswordDirectInput ? S.current.set_up_a_wallet : S.current.set_a_pin, + color: Theme.of(context) + .extension()! + .createNewWalletButtonBackgroundColor, + textColor: + Theme.of(context).extension()!.restoreWalletButtonTextColor, + ), + ), + ], ), ), ); From f98dd7dd7a7b527af6f24717d21ea67f940ccaca Mon Sep 17 00:00:00 2001 From: cyan Date: Thu, 13 Feb 2025 07:39:38 +0100 Subject: [PATCH 8/8] Use different error message for invalid seed restore (#2029) --- cw_monero/lib/api/wallet_manager.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cw_monero/lib/api/wallet_manager.dart b/cw_monero/lib/api/wallet_manager.dart index 67a1a666ee..621f795771 100644 --- a/cw_monero/lib/api/wallet_manager.dart +++ b/cw_monero/lib/api/wallet_manager.dart @@ -116,6 +116,11 @@ void restoreWalletFromSeedSync( if (status != 0) { final error = monero.Wallet_errorString(newWptr); + if (error.contains('word list failed verification')) { + throw WalletRestoreFromSeedException( + message: "Seed verification failed, please make sure you entered the correct seed with the correct words order", + ); + } throw WalletRestoreFromSeedException(message: error); } wptr = newWptr;