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 <omarh.ismail1@gmail.com>

tuxsudo committed Feb 12, 2025 at 06:35 UTC 7db23599fad458b2f220f0c22a425e3d32b76f17
62 files changed +1176 -670
lib/buy/moonpay/moonpay_provider.dart
+2
@@ -82,6 +82,8 @@ class MoonPayProvider extends BuyProvider {
82 return 'light';
83 case ThemeType.dark:
84 return 'dark';
85 + case ThemeType.oled:
86 + return 'dark';
87 }
88 }
89
lib/entities/main_actions.dart
+7 -7
@@ -23,7 +23,7 @@ class MainActions {
23 static List<MainActions> all = [
24 showWalletsAction,
25 receiveAction,
26 - exchangeAction,
26 + swapAction,
27 sendAction,
28 tradeAction,
29 ];
@@ -44,13 +44,13 @@ class MainActions {
44 },
45 );
46
47 - static MainActions exchangeAction = MainActions._(
48 - name: (context) => S.of(context).exchange,
47 + static MainActions swapAction = MainActions._(
48 + name: (context) => S.of(context).swap,
49 image: 'assets/images/transfer.png',
50 - isEnabled: (viewModel) => viewModel.isEnabledExchangeAction,
51 - canShow: (viewModel) => viewModel.hasExchangeAction,
50 + isEnabled: (viewModel) => viewModel.isEnabledSwapAction,
51 + canShow: (viewModel) => viewModel.hasSwapAction,
52 onTap: (BuildContext context, DashboardViewModel viewModel) async {
53 - if (viewModel.isEnabledExchangeAction) {
53 + if (viewModel.isEnabledSwapAction) {
54 await Navigator.of(context).pushNamed(Routes.exchange);
55 }
56 },
@@ -66,7 +66,7 @@ class MainActions {
66
67
68 static MainActions tradeAction = MainActions._(
69 - name: (context) => '${S.of(context).buy}/${S.of(context).sell}',
69 + name: (context) => S.of(context).exchange,
70 image: 'assets/images/buy_sell.png',
71 isEnabled: (viewModel) => viewModel.isEnabledTradeAction,
72 canShow: (viewModel) => viewModel.hasTradeAction,
lib/src/screens/backup/backup_page.dart
+27 -18
@@ -26,12 +26,6 @@ class BackupPage extends BasePage {
26 @override
27 String get title => S.current.backup;
28
29 - @override
30 - Widget trailing(BuildContext context) => TrailButton(
31 - caption: S.of(context).change_password,
32 - onPressed: () => Navigator.of(context).pushNamed(Routes.editBackupPassword),
33 - textColor: Palette.blueCraiola);
34 -
29 @override
30 Widget body(BuildContext context) {
31 return Stack(
@@ -53,7 +47,9 @@ class BackupPage extends BasePage {
47 builder: (_) => GestureDetector(
48 onTap: () {
49 ClipboardUtil.setSensitiveDataToClipboard(
56 - ClipboardData(text: backupViewModelBase.backupPassword));
50 + ClipboardData(
51 + text: backupViewModelBase
52 + .backupPassword));
53 showBar<void>(
54 context,
55 S.of(context).transaction_details_copied(
@@ -74,15 +70,25 @@ class BackupPage extends BasePage {
70 ))
71 ]))),
72 Positioned(
77 - child: Observer(
78 - builder: (_) => LoadingPrimaryButton(
79 - isLoading: backupViewModelBase.state is IsExecutingState,
80 - onPressed: () => onExportBackup(context),
81 - text: S.of(context).export_backup,
82 - color: Theme.of(context).primaryColor,
73 + child: Column(children: [
74 + PrimaryButton(
75 + onPressed: () =>
76 + Navigator.of(context).pushNamed(Routes.editBackupPassword),
77 + text: S.of(context).change_password,
78 + color: Theme.of(context).cardColor,
79 textColor: Colors.white,
80 ),
85 - ),
81 + SizedBox(height: 10),
82 + Observer(
83 + builder: (_) => LoadingPrimaryButton(
84 + isLoading: backupViewModelBase.state is IsExecutingState,
85 + onPressed: () => onExportBackup(context),
86 + text: S.of(context).export_backup,
87 + color: Theme.of(context).primaryColor,
88 + textColor: Colors.white,
89 + ),
90 + ),
91 + ]),
92 bottom: 24,
93 left: 24,
94 right: 24,
@@ -130,7 +136,8 @@ class BackupPage extends BasePage {
136 rightButtonText: S.of(context).save_to_downloads,
137 leftButtonText: S.of(context).share,
138 actionRightButton: () async {
133 - await backupViewModelBase.saveToDownload(backup.name, backup.content);
139 + await backupViewModelBase.saveToDownload(
140 + backup.name, backup.content);
141 Navigator.of(dialogContext).pop();
142 },
143 actionLeftButton: () async {
@@ -142,13 +149,15 @@ class BackupPage extends BasePage {
149
150 Future<void> share(BackupExportFile backup, BuildContext context) async {
151 final path = await backupViewModelBase.saveBackupFileLocally(backup);
145 - await ShareUtil.shareFile(filePath: path, fileName: backup.name, context: context);
152 + await ShareUtil.shareFile(
153 + filePath: path, fileName: backup.name, context: context);
154 await backupViewModelBase.removeBackupFileLocally(backup);
155 }
156
157 Future<void> _saveFile(BackupExportFile backup) async {
150 - String? outputFile = await FilePicker.platform
151 - .saveFile(dialogTitle: 'Save Your File to desired location', fileName: backup.name);
158 + String? outputFile = await FilePicker.platform.saveFile(
159 + dialogTitle: 'Save Your File to desired location',
160 + fileName: backup.name);
161
162 try {
163 File returnedFile = File(outputFile!);
lib/src/screens/contact/contact_list_page.dart
+28 -9
@@ -110,10 +110,12 @@ class _ContactPageBodyState extends State<ContactPageBody> with SingleTickerProv
110 @override
111 Widget build(BuildContext context) {
112 return Padding(
113 - padding: const EdgeInsets.only(left: 24),
113 + padding: const EdgeInsets.only(),
114 child: Column(
115 children: [
116 - Align(
116 + Padding(
117 + padding: const EdgeInsets.only(left: 24, right: 24, bottom: 8),
118 + child: Align(
119 alignment: Alignment.centerLeft,
120 child: TabBar(
121 controller: _tabController,
@@ -135,7 +137,7 @@ class _ContactPageBodyState extends State<ContactPageBody> with SingleTickerProv
137 indicatorColor: Theme.of(context).appBarTheme.titleTextStyle!.color,
138 indicatorPadding: EdgeInsets.zero,
139 labelPadding: EdgeInsets.only(right: 24),
138 - tabAlignment: TabAlignment.center,
140 + tabAlignment: TabAlignment.start,
141 dividerColor: Colors.transparent,
142 padding: EdgeInsets.zero,
143 tabs: [
@@ -144,6 +146,7 @@ class _ContactPageBodyState extends State<ContactPageBody> with SingleTickerProv
146 ],
147 ),
148 ),
149 + ),
150 Expanded(
151 child: TabBarView(
152 controller: _tabController,
@@ -173,7 +176,7 @@ class _ContactPageBodyState extends State<ContactPageBody> with SingleTickerProv
176 itemCount: groupedContacts.length * 2,
177 itemBuilder: (context, index) {
178 if (index.isOdd) {
176 - return StandardListSeparator();
179 + return StandardListSeparator(height: 0);
180 } else {
181 final groupIndex = index ~/ 2;
182 final groupName = groupedContacts.keys.elementAt(groupIndex);
@@ -188,7 +191,9 @@ class _ContactPageBodyState extends State<ContactPageBody> with SingleTickerProv
191 orElse: () => groupContacts[0],
192 );
193
191 - return ExpansionTile(
194 + return Padding(
195 + padding: const EdgeInsets.only(left: 16, right: 16, top: 4, bottom: 4),
196 + child: ExpansionTile(
197 title: Text(
198 groupName,
199 style: TextStyle(
@@ -198,11 +203,16 @@ class _ContactPageBodyState extends State<ContactPageBody> with SingleTickerProv
203 ),
204 ),
205 leading: _buildCurrencyIcon(activeContact),
201 - tilePadding: EdgeInsets.zero,
206 + tilePadding: const EdgeInsets.only(left: 16, right: 16),
207 childrenPadding: const EdgeInsets.only(left: 16),
208 expandedCrossAxisAlignment: CrossAxisAlignment.start,
209 expandedAlignment: Alignment.topLeft,
210 + backgroundColor: Theme.of(context).cardColor,
211 + collapsedBackgroundColor: Theme.of(context).cardColor,
212 + collapsedShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
213 + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
214 children: groupContacts.map((contact) => generateRaw(context, contact)).toList(),
215 + ),
216 );
217 }
218 }
@@ -234,7 +244,12 @@ class _ContactPageBodyState extends State<ContactPageBody> with SingleTickerProv
244 },
245 behavior: HitTestBehavior.opaque,
246 child: Container(
237 - padding: const EdgeInsets.only(top: 16, bottom: 16, right: 24),
247 + decoration: BoxDecoration(
248 + borderRadius: BorderRadius.all(Radius.circular(10)),
249 + color: Theme.of(context).cardColor,
250 + ),
251 + margin: const EdgeInsets.only(top: 4, bottom: 4, left: 16, right: 16),
252 + padding: const EdgeInsets.only(top: 16, bottom: 16, right: 16, left: 16),
253 child: Row(
254 mainAxisSize: MainAxisSize.min,
255 mainAxisAlignment: MainAxisAlignment.start,
@@ -375,7 +390,12 @@ class _ContactListBodyState extends State<ContactListBody> {
390 children: [
391 Container(
392 key: Key('${contact.name}'),
378 - padding: const EdgeInsets.only(top: 16, bottom: 16, right: 24),
393 + decoration: BoxDecoration(
394 + borderRadius: BorderRadius.all(Radius.circular(8)),
395 + color: Theme.of(context).cardColor,
396 + ),
397 + margin: const EdgeInsets.only(top: 4, bottom: 4, left: 16, right: 16),
398 + padding: const EdgeInsets.only(top: 16, bottom: 16, right: 16, left: 16),
399 child: Row(
400 mainAxisSize: MainAxisSize.min,
401 mainAxisAlignment: MainAxisAlignment.start,
@@ -396,7 +416,6 @@ class _ContactListBodyState extends State<ContactListBody> {
416 ],
417 ),
418 ),
399 - StandardListSeparator()
419 ],
420 );
421 }
lib/src/screens/dashboard/dashboard_page.dart
+46 -108
@@ -2,7 +2,6 @@ import 'dart:async';
2 import 'package:cake_wallet/core/wallet_connect/wc_bottom_sheet_service.dart';
3 import 'package:cake_wallet/entities/preferences_key.dart';
4 import 'package:cake_wallet/di.dart';
5 -import 'package:cake_wallet/entities/main_actions.dart';
5 import 'package:cake_wallet/src/screens/dashboard/desktop_widgets/desktop_sidebar_wrapper.dart';
6 import 'package:cake_wallet/src/screens/dashboard/pages/cake_features_page.dart';
7 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';
9 import 'package:cake_wallet/src/widgets/haven_wallet_removal_popup.dart';
10 import 'package:cake_wallet/src/widgets/services_updates_widget.dart';
11 import 'package:cake_wallet/src/widgets/vulnerable_seeds_popup.dart';
13 -import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart';
12 import 'package:cake_wallet/utils/device_info.dart';
13 import 'package:cake_wallet/utils/version_comparator.dart';
14 import 'package:cake_wallet/view_model/dashboard/cake_features_view_model.dart';
@@ -23,8 +21,8 @@ import 'package:flutter/material.dart';
21 import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
22 import 'package:cake_wallet/src/screens/base_page.dart';
23 import 'package:cake_wallet/src/screens/dashboard/widgets/menu_widget.dart';
26 -import 'package:cake_wallet/src/screens/dashboard/widgets/action_button.dart';
24 import 'package:cake_wallet/src/screens/dashboard/pages/balance/balance_page.dart';
25 +import 'package:cake_wallet/src/screens/dashboard/pages/navigation_dock.dart';
26 import 'package:cake_wallet/src/screens/dashboard/pages/transactions_page.dart';
27 import 'package:cake_wallet/src/screens/dashboard/widgets/sync_indicator.dart';
28 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';
33 import 'package:cake_wallet/main.dart';
34 import 'package:cake_wallet/src/screens/release_notes/release_notes_screen.dart';
35 import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart';
38 -import 'package:cake_wallet/themes/extensions/balance_page_theme.dart';
36
37 class DashboardPage extends StatefulWidget {
38 DashboardPage({
@@ -140,7 +137,8 @@ class _DashboardPageView extends BasePage {
137 bool get resizeToAvoidBottomInset => false;
138
139 @override
143 - Widget get endDrawer => MenuWidget(dashboardViewModel, ValueKey('dashboard_page_drawer_menu_widget_key'));
140 + Widget get endDrawer =>
141 + MenuWidget(dashboardViewModel, ValueKey('dashboard_page_drawer_menu_widget_key'));
142
143 @override
144 Widget leading(BuildContext context) {
@@ -176,10 +174,6 @@ class _DashboardPageView extends BasePage {
174 width: 40,
175 child: TextButton(
176 key: ValueKey('dashboard_page_wallet_menu_button_key'),
179 - // FIX-ME: Style
180 - //highlightColor: Colors.transparent,
181 - //splashColor: Colors.transparent,
182 - //padding: EdgeInsets.all(0),
177 onPressed: () => onOpenEndDrawer(),
178 child: Semantics(label: S.of(context).wallet_menu, child: menuButton),
179 ),
@@ -219,14 +213,15 @@ class _DashboardPageView extends BasePage {
213 _setEffects(context);
214
215 return SafeArea(
222 - minimum: EdgeInsets.only(bottom: 24),
216 + minimum: EdgeInsets.only(bottom: 0),
217 child: BottomSheetListener(
218 bottomSheetService: bottomSheetService,
225 - child: Column(
226 - mainAxisSize: MainAxisSize.max,
227 - children: <Widget>[
228 - Expanded(
229 - child: Observer(
219 + child: Container(
220 + child: Stack(
221 + alignment: Alignment.bottomCenter,
222 + children: <Widget>[
223 + //new Expanded(
224 + Observer(
225 builder: (context) {
226 return PageView.builder(
227 key: ValueKey('dashboard_page_view_key'),
@@ -236,101 +231,44 @@ class _DashboardPageView extends BasePage {
231 );
232 },
233 ),
239 - ),
240 - Padding(
241 - padding: EdgeInsets.only(bottom: 24, top: 10),
242 - child: Observer(
243 - builder: (context) {
244 - return Semantics(
245 - button: false,
246 - label: 'Page Indicator',
247 - hint: 'Swipe to change page',
248 - excludeSemantics: true,
249 - child: SmoothPageIndicator(
250 - controller: controller,
251 - count: pages.length,
252 - effect: ColorTransitionEffect(
253 - spacing: 6.0,
254 - radius: 6.0,
255 - dotWidth: 6.0,
256 - dotHeight: 6.0,
257 - dotColor: Theme.of(context)
258 - .extension<DashboardPageTheme>()!
259 - .indicatorDotTheme
260 - .indicatorColor,
261 - activeDotColor: Theme.of(context)
262 - .extension<DashboardPageTheme>()!
263 - .indicatorDotTheme
264 - .activeIndicatorColor,
265 - ),
266 - ),
267 - );
268 - },
269 - ),
270 - ),
271 - Observer(
272 - builder: (_) {
273 - return ClipRect(
274 - child: Container(
275 - margin: const EdgeInsets.only(left: 16, right: 16),
276 - child: Container(
277 - decoration: BoxDecoration(
278 - borderRadius: BorderRadius.circular(50.0),
279 - border: Border.all(
280 - color: Theme.of(context).extension<BalancePageTheme>()!.cardBorderColor,
281 - width: 1,
282 - ),
283 - color: Theme.of(context)
284 - .extension<SyncIndicatorTheme>()!
285 - .syncedBackgroundColor,
286 - ),
287 - child: Container(
288 - padding: EdgeInsets.symmetric(horizontal: 10),
289 - child: Row(
290 - mainAxisAlignment: MainAxisAlignment.spaceBetween,
291 - children: MainActions.all
292 - .where((element) => element.canShow?.call(dashboardViewModel) ?? true)
293 - .map(
294 - (action) => Expanded(
295 - child: Semantics(
296 - button: true,
297 - enabled: (action.isEnabled?.call(dashboardViewModel) ?? true),
298 - child: ActionButton(
299 - key: ValueKey(
300 - 'dashboard_page_${action.name(context)}_action_button_key'),
301 - image: Image.asset(
302 - action.image,
303 - height: 24,
304 - width: 24,
305 - color: action.isEnabled?.call(dashboardViewModel) ?? true
306 - ? Theme.of(context)
307 - .extension<DashboardPageTheme>()!
308 - .mainActionsIconColor
309 - : Theme.of(context)
310 - .extension<BalancePageTheme>()!
311 - .labelTextColor,
312 - ),
313 - title: action.name(context),
314 - onClick: () async =>
315 - await action.onTap(context, dashboardViewModel),
316 - textColor: action.isEnabled?.call(dashboardViewModel) ?? true
317 - ? null
318 - : Theme.of(context)
319 - .extension<BalancePageTheme>()!
320 - .labelTextColor,
321 - ),
322 - ),
323 - ),
324 - )
325 - .toList(),
234 + //),
235 + Positioned(
236 + child: Container(
237 + alignment: Alignment.bottomCenter,
238 + margin: EdgeInsets.only(bottom: 110),
239 + child: Observer(
240 + builder: (context) {
241 + return Semantics(
242 + button: false,
243 + label: 'Page Indicator',
244 + hint: 'Swipe to change page',
245 + excludeSemantics: true,
246 + child: SmoothPageIndicator(
247 + controller: controller,
248 + count: pages.length,
249 + effect: ColorTransitionEffect(
250 + spacing: 6.0,
251 + radius: 6.0,
252 + dotWidth: 6.0,
253 + dotHeight: 6.0,
254 + dotColor: Theme.of(context)
255 + .extension<DashboardPageTheme>()!
256 + .indicatorDotTheme
257 + .indicatorColor,
258 + activeDotColor: Theme.of(context)
259 + .extension<DashboardPageTheme>()!
260 + .indicatorDotTheme
261 + .activeIndicatorColor,
262 + ),
263 ),
327 - ),
328 - ),
264 + );
265 + },
266 ),
330 - );
331 - },
332 - ),
333 - ],
267 + ),
268 + ),
269 + NavigationDock(dashboardViewModel: dashboardViewModel)
270 + ],
271 + ),
272 ),
273 ),
274 );
lib/src/screens/dashboard/desktop_widgets/desktop_dashboard_actions.dart
+5 -5
@@ -30,11 +30,11 @@ class DesktopDashboardActions extends StatelessWidget {
30 await MainActions.showWalletsAction.onTap(context, dashboardViewModel),
31 ),
32 DesktopActionButton(
33 - title: MainActions.exchangeAction.name(context),
34 - image: MainActions.exchangeAction.image,
35 - canShow: MainActions.exchangeAction.canShow?.call(dashboardViewModel),
36 - isEnabled: MainActions.exchangeAction.isEnabled?.call(dashboardViewModel),
37 - onTap: () async => await MainActions.exchangeAction.onTap(context, dashboardViewModel),
33 + title: MainActions.swapAction.name(context),
34 + image: MainActions.swapAction.image,
35 + canShow: MainActions.swapAction.canShow?.call(dashboardViewModel),
36 + isEnabled: MainActions.swapAction.isEnabled?.call(dashboardViewModel),
37 + onTap: () async => await MainActions.swapAction.onTap(context, dashboardViewModel),
38 ),
39 Row(
40 children: [
lib/src/screens/dashboard/pages/balance/balance_row_widget.dart
+41 -1
@@ -16,6 +16,7 @@ import 'package:cw_core/unspent_coin_type.dart';
16 import 'package:flutter/material.dart';
17 import 'package:fluttertoast/fluttertoast.dart';
18 import 'package:url_launcher/url_launcher.dart';
19 +import 'package:cake_wallet/themes/theme_base.dart';
20
21 class BalanceRowWidget extends StatelessWidget {
22 BalanceRowWidget({
@@ -65,6 +66,8 @@ class BalanceRowWidget extends StatelessWidget {
66
67 @override
68 Widget build(BuildContext context) {
69 + bool brightThemeType = false;
70 + if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.bright) brightThemeType = true;
71 return Column(
72 children: [
73 Container(
@@ -76,6 +79,15 @@ class BalanceRowWidget extends StatelessWidget {
79 width: 1,
80 ),
81 color: Theme.of(context).extension<SyncIndicatorTheme>()!.syncedBackgroundColor,
82 + // boxShadow: [
83 + // BoxShadow(
84 + // color: Theme.of(context)
85 + // .extension<BalancePageTheme>()!
86 + // .cardBorderColor
87 + // .withAlpha(50),
88 + // spreadRadius: dashboardViewModel.getShadowSpread(),
89 + // blurRadius: dashboardViewModel.getShadowBlur())
90 + // ],
91 ),
92 child: TextButton(
93 onPressed: () => Fluttertoast.showToast(
@@ -310,7 +322,7 @@ class BalanceRowWidget extends StatelessWidget {
322 ),
323 ),
324 if (hasSecondAdditionalBalance || hasSecondAvailableBalance) ...[
313 - SizedBox(height: 10),
325 + SizedBox(height: 16),
326 Container(
327 margin: const EdgeInsets.only(left: 16, right: 16),
328 decoration: BoxDecoration(
@@ -320,6 +332,15 @@ class BalanceRowWidget extends StatelessWidget {
332 width: 1,
333 ),
334 color: Theme.of(context).extension<SyncIndicatorTheme>()!.syncedBackgroundColor,
335 + boxShadow: [
336 + BoxShadow(
337 + color: Theme.of(context)
338 + .extension<BalancePageTheme>()!
339 + .cardBorderColor
340 + .withAlpha(50),
341 + spreadRadius: dashboardViewModel.getShadowSpread(),
342 + blurRadius: dashboardViewModel.getShadowBlur())
343 + ],
344 ),
345 child: TextButton(
346 onPressed: () => Fluttertoast.showToast(
@@ -643,6 +664,25 @@ class BalanceRowWidget extends StatelessWidget {
664 );
665 }
666
667 + // double getShadowSpread(){
668 + // double spread = 3;
669 + // if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.bright) spread = 3;
670 + // else if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.light) spread = 3;
671 + // else if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.dark) spread = 1;
672 + // else if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.oled) spread = 3;
673 + // return spread;
674 + // }
675 + //
676 + //
677 + // double getShadowBlur(){
678 + // double blur = 7;
679 + // if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.bright) blur = 7;
680 + // else if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.light) blur = 7;
681 + // else if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.dark) blur = 3;
682 + // else if (dashboardViewModel.settingsStore.currentTheme.type == ThemeType.oled) blur = 7;
683 + // return blur;
684 + // }
685 +
686 void _showBalanceDescription(BuildContext context, String content) {
687 showPopUp<void>(context: context, builder: (_) => InformationPage(information: content));
688 }
lib/src/screens/dashboard/pages/balance/crypto_balance_widget.dart
+10 -3
@@ -153,7 +153,7 @@ class CryptoBalanceWidget extends StatelessWidget {
153 return ListView.separated(
154 physics: NeverScrollableScrollPhysics(),
155 shrinkWrap: true,
156 - separatorBuilder: (_, __) => Container(padding: EdgeInsets.only(bottom: 8)),
156 + separatorBuilder: (_, __) => Container(padding: EdgeInsets.only(bottom: 16)),
157 itemCount: dashboardViewModel.balanceViewModel.formattedBalances.length,
158 itemBuilder: (__, index) {
159 final balance =
@@ -210,10 +210,14 @@ class CryptoBalanceWidget extends StatelessWidget {
210 ))
211 ],
212 if (dashboardViewModel.showSilentPaymentsCard) ...[
213 - SizedBox(height: 10),
213 + SizedBox(height: 16),
214 Padding(
215 padding: const EdgeInsets.fromLTRB(16, 0, 16, 8),
216 child: DashBoardRoundedCardWidget(
217 + shadowBlur: dashboardViewModel.getShadowBlur(),
218 + shadowSpread: dashboardViewModel.getShadowSpread(),
219 + marginV: 0,
220 + marginH: 0,
221 customBorder: 30,
222 title: S.of(context).silent_payments,
223 subTitle: S.of(context).enable_silent_payments_scanning,
@@ -276,10 +280,12 @@ class CryptoBalanceWidget extends StatelessWidget {
280 ),
281 ],
282 if (dashboardViewModel.showMwebCard) ...[
279 - SizedBox(height: 10),
283 + SizedBox(height: 16),
284 Padding(
285 padding: const EdgeInsets.fromLTRB(16, 0, 16, 8),
286 child: DashBoardRoundedCardWidget(
287 + marginV: 0,
288 + marginH: 0,
289 customBorder: 30,
290 title: S.of(context).litecoin_mweb,
291 subTitle: S.of(context).litecoin_mweb_description,
@@ -352,6 +358,7 @@ class CryptoBalanceWidget extends StatelessWidget {
358 ),
359 ),
360 ),
361 + SizedBox(height: 150),
362 ],
363 ],
364 );
lib/src/screens/dashboard/pages/cake_features_page.dart
+12 -29
@@ -22,15 +22,13 @@ class CakeFeaturesPage extends StatelessWidget {
22
23 @override
24 Widget build(BuildContext context) {
25 - return Padding(
26 - padding: const EdgeInsets.symmetric(horizontal: 10.0),
27 - child: Padding(
28 - padding: const EdgeInsets.symmetric(horizontal: 10.0),
25 + return Container(
26 child: Column(
27 crossAxisAlignment: CrossAxisAlignment.start,
28 children: [
32 - SizedBox(height: 50),
33 - Text(
29 + Padding(
30 + padding: EdgeInsets.only(left: 24, top: 16),
31 + child: Text(
32 'Cake ${S.of(context).features}',
33 style: TextStyle(
34 fontSize: 24,
@@ -38,11 +36,14 @@ class CakeFeaturesPage extends StatelessWidget {
36 color: Theme.of(context).extension<DashboardPageTheme>()!.pageTitleTextColor,
37 ),
38 ),
39 + ),
40 Expanded(
41 child: ListView(
42 children: <Widget>[
44 - SizedBox(height: 20),
43 + SizedBox(height: 2),
44 DashBoardRoundedCardWidget(
45 + shadowBlur: dashboardViewModel.getShadowBlur(),
46 + shadowSpread: dashboardViewModel.getShadowSpread(),
47 onTap: () {
48 if (Platform.isMacOS) {
49 _launchUrl("buy.cakepay.com");
@@ -59,8 +60,9 @@ class CakeFeaturesPage extends StatelessWidget {
60 fit: BoxFit.cover,
61 ),
62 ),
62 - SizedBox(height: 10),
63 DashBoardRoundedCardWidget(
64 + shadowBlur: dashboardViewModel.getShadowBlur(),
65 + shadowSpread: dashboardViewModel.getShadowSpread(),
66 onTap: () => _launchUrl("cake.nano-gpt.com"),
67 title: "NanoGPT",
68 subTitle: S.of(context).nanogpt_subtitle,
@@ -71,32 +73,13 @@ class CakeFeaturesPage extends StatelessWidget {
73 fit: BoxFit.cover,
74 ),
75 ),
74 - SizedBox(height: 10),
75 - Observer(
76 - builder: (context) {
77 - if (!dashboardViewModel.hasSignMessages) {
78 - return const SizedBox();
79 - }
80 - return DashBoardRoundedCardWidget(
81 - onTap: () => Navigator.of(context).pushNamed(Routes.signPage),
82 - title: S.current.sign_verify_message,
83 - subTitle: S.current.sign_verify_message_sub,
84 - icon: Icon(
85 - Icons.speaker_notes_rounded,
86 - color:
87 - Theme.of(context).extension<DashboardPageTheme>()!.pageTitleTextColor,
88 - size: 75,
89 - ),
90 - );
91 - },
92 - ),
76 + SizedBox(height: 125),
77 ],
78 ),
79 ),
80 ],
81 ),
98 - ),
99 - );
82 + );
83 }
84
85 void _launchUrl(String url) {
lib/src/screens/dashboard/pages/navigation_dock.dart new
+229
@@ -0,0 +1,229 @@
1 +import 'dart:ui';
2 +import 'package:cake_wallet/entities/main_actions.dart';
3 +import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart';
4 +import 'package:flutter/material.dart';
5 +import 'package:cake_wallet/view_model/dashboard/dashboard_view_model.dart';
6 +import 'package:cake_wallet/src/screens/dashboard/widgets/action_button.dart';
7 +import 'package:flutter_mobx/flutter_mobx.dart';
8 +import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart';
9 +import 'package:cake_wallet/themes/extensions/balance_page_theme.dart';
10 +import '../../../../themes/theme_base.dart';
11 +
12 +class NavigationDock extends StatelessWidget {
13 + const NavigationDock({
14 + required this.dashboardViewModel,
15 + });
16 +
17 + final DashboardViewModel dashboardViewModel;
18 +
19 + @override
20 + Widget build(BuildContext context) {
21 + return dashboardViewModel.settingsStore.currentTheme.type == ThemeType.bright
22 + ? Positioned(
23 + child: Observer(
24 + builder: (_) {
25 + return Container(
26 + alignment: Alignment.bottomCenter,
27 + height: 130,
28 + decoration: BoxDecoration(
29 + gradient: LinearGradient(
30 + begin: Alignment.topCenter,
31 + end: Alignment.bottomCenter,
32 + colors: <Color>[
33 + Theme.of(context)
34 + .extension<DashboardPageTheme>()!
35 + .thirdGradientBackgroundColor
36 + .withAlpha(10),
37 + Theme.of(context)
38 + .extension<DashboardPageTheme>()!
39 + .thirdGradientBackgroundColor
40 + .withAlpha(75),
41 + Theme.of(context)
42 + .extension<DashboardPageTheme>()!
43 + .thirdGradientBackgroundColor
44 + .withAlpha(150),
45 + Theme.of(context)
46 + .extension<DashboardPageTheme>()!
47 + .thirdGradientBackgroundColor,
48 + Theme.of(context)
49 + .extension<DashboardPageTheme>()!
50 + .thirdGradientBackgroundColor
51 + ],
52 + ),
53 + ),
54 + child: Container(
55 + margin: const EdgeInsets.only(left: 16, right: 16, bottom: 16),
56 + child: ClipRRect(
57 + borderRadius: BorderRadius.circular(50),
58 + child: BackdropFilter(
59 + filter: ImageFilter.blur(sigmaX: 50, sigmaY: 50),
60 + child: Container(
61 + height: 75,
62 + decoration: BoxDecoration(
63 + borderRadius: BorderRadius.circular(50.0),
64 + border: Border.all(
65 + color:
66 + Theme.of(context).extension<BalancePageTheme>()!.cardBorderColor,
67 + width: 1,
68 + ),
69 + color: Theme.of(context)
70 + .extension<SyncIndicatorTheme>()!
71 + .syncedBackgroundColor,
72 + ),
73 + child: Container(
74 + padding: EdgeInsets.symmetric(horizontal: 10),
75 + child: Row(
76 + mainAxisAlignment: MainAxisAlignment.spaceBetween,
77 + children: MainActions.all
78 + .where((element) =>
79 + element.canShow?.call(dashboardViewModel) ?? true)
80 + .map(
81 + (action) => Expanded(
82 + child: Semantics(
83 + button: true,
84 + enabled:
85 + (action.isEnabled?.call(dashboardViewModel) ?? true),
86 + child: ActionButton(
87 + key: ValueKey(
88 + 'dashboard_page_${action.name(context)}_action_button_key'),
89 + image: Image.asset(
90 + action.image,
91 + height: 24,
92 + width: 24,
93 + color:
94 + action.isEnabled?.call(dashboardViewModel) ?? true
95 + ? Theme.of(context)
96 + .extension<DashboardPageTheme>()!
97 + .mainActionsIconColor
98 + : Theme.of(context)
99 + .extension<BalancePageTheme>()!
100 + .labelTextColor,
101 + ),
102 + title: action.name(context),
103 + onClick: () async =>
104 + await action.onTap(context, dashboardViewModel),
105 + textColor:
106 + action.isEnabled?.call(dashboardViewModel) ?? true
107 + ? null
108 + : Theme.of(context)
109 + .extension<BalancePageTheme>()!
110 + .labelTextColor,
111 + ),
112 + ),
113 + ),
114 + )
115 + .toList(),
116 + ),
117 + ),
118 + ),
119 + ),
120 + ),
121 + ),
122 + );
123 + },
124 + ),
125 + )
126 + : Positioned(
127 + child: Observer(
128 + builder: (_) {
129 + return Container(
130 + alignment: Alignment.bottomCenter,
131 + height: 130,
132 + decoration: BoxDecoration(
133 + gradient: LinearGradient(
134 + begin: Alignment.topCenter,
135 + end: Alignment.bottomCenter,
136 + colors: <Color>[
137 + Theme.of(context)
138 + .extension<DashboardPageTheme>()!
139 + .thirdGradientBackgroundColor
140 + .withAlpha(10),
141 + Theme.of(context)
142 + .extension<DashboardPageTheme>()!
143 + .thirdGradientBackgroundColor
144 + .withAlpha(75),
145 + Theme.of(context)
146 + .extension<DashboardPageTheme>()!
147 + .thirdGradientBackgroundColor
148 + .withAlpha(150),
149 + Theme.of(context)
150 + .extension<DashboardPageTheme>()!
151 + .thirdGradientBackgroundColor,
152 + Theme.of(context)
153 + .extension<DashboardPageTheme>()!
154 + .thirdGradientBackgroundColor
155 + ],
156 + ),
157 + ),
158 + child: Container(
159 + margin: const EdgeInsets.only(left: 16, right: 16, bottom: 16),
160 + child: Container(
161 + height: 75,
162 + decoration: BoxDecoration(
163 + borderRadius: BorderRadius.circular(50.0),
164 + border: Border.all(
165 + color: Theme.of(context).extension<BalancePageTheme>()!.cardBorderColor,
166 + width: 1,
167 + ),
168 + color: Theme.of(context)
169 + .extension<SyncIndicatorTheme>()!
170 + .syncedBackgroundColor,
171 + boxShadow: [
172 + BoxShadow(
173 + color: Theme.of(context)
174 + .extension<BalancePageTheme>()!
175 + .cardBorderColor
176 + .withAlpha(50),
177 + spreadRadius: dashboardViewModel.getShadowSpread(),
178 + blurRadius: dashboardViewModel.getShadowBlur())
179 + ],
180 + ),
181 + child: Container(
182 + padding: EdgeInsets.symmetric(horizontal: 10),
183 + child: Row(
184 + mainAxisAlignment: MainAxisAlignment.spaceBetween,
185 + children: MainActions.all
186 + .where((element) => element.canShow?.call(dashboardViewModel) ?? true)
187 + .map(
188 + (action) => Expanded(
189 + child: Semantics(
190 + button: true,
191 + enabled: (action.isEnabled?.call(dashboardViewModel) ?? true),
192 + child: ActionButton(
193 + key: ValueKey(
194 + 'dashboard_page_${action.name(context)}_action_button_key'),
195 + image: Image.asset(
196 + action.image,
197 + height: 24,
198 + width: 24,
199 + color: action.isEnabled?.call(dashboardViewModel) ?? true
200 + ? Theme.of(context)
201 + .extension<DashboardPageTheme>()!
202 + .mainActionsIconColor
203 + : Theme.of(context)
204 + .extension<BalancePageTheme>()!
205 + .labelTextColor,
206 + ),
207 + title: action.name(context),
208 + onClick: () async =>
209 + await action.onTap(context, dashboardViewModel),
210 + textColor: action.isEnabled?.call(dashboardViewModel) ?? true
211 + ? null
212 + : Theme.of(context)
213 + .extension<BalancePageTheme>()!
214 + .labelTextColor,
215 + ),
216 + ),
217 + ),
218 + )
219 + .toList(),
220 + ),
221 + ),
222 + ),
223 + ),
224 + );
225 + },
226 + ),
227 + );
228 + }
229 +}
lib/src/screens/dashboard/widgets/action_button.dart
+5 -4
@@ -21,8 +21,8 @@ class ActionButton extends StatelessWidget {
21
22 @override
23 Widget build(BuildContext context) {
24 - return GestureDetector(
25 - onTap: () {
24 + return TextButton(
25 + onPressed: () {
26 if (route?.isNotEmpty ?? false) {
27 Navigator.of(context, rootNavigator: true).pushNamed(route!);
28 } else {
@@ -31,11 +31,12 @@ class ActionButton extends StatelessWidget {
31 },
32 child: Container(
33 color: Colors.transparent,
34 - padding: EdgeInsets.only(top: 14, bottom: 16, left: 10, right: 10),
34 + padding: EdgeInsets.only(top: 5, bottom: 5, left: 0, right: 0),
35 alignment: alignment,
36 child: Column(
37 mainAxisSize: MainAxisSize.max,
38 crossAxisAlignment: CrossAxisAlignment.center,
39 + //mainAxisAlignment: MainAxisAlignment.center,
40 children: <Widget>[
41 Container(
42 alignment: Alignment.center,
@@ -47,7 +48,7 @@ class ActionButton extends StatelessWidget {
48 Text(
49 title,
50 style: TextStyle(
50 - fontSize: 10,
51 + fontSize: 9,
52 color: textColor ??
53 Theme.of(context).extension<DashboardPageTheme>()!.cardTextColor),
54 textAlign: TextAlign.center,
lib/src/screens/dashboard/widgets/menu_widget.dart
+2 -1
@@ -143,6 +143,7 @@ class MenuWidgetState extends State<MenuWidget> {
143 return Container(
144 height: headerHeight,
145 decoration: BoxDecoration(
146 + borderRadius: BorderRadius.only(bottomLeft: Radius.circular(24)),
147 gradient: LinearGradient(colors: [
148 Theme.of(context).extension<CakeMenuTheme>()!.headerFirstGradientColor,
149 Theme.of(context).extension<CakeMenuTheme>()!.headerSecondGradientColor,
@@ -209,7 +210,7 @@ class MenuWidgetState extends State<MenuWidget> {
210 );
211 },
212 separatorBuilder: (_, index) => Container(
212 - height: 1,
213 + height: 0,
214 color: Theme.of(context).extension<CakeMenuTheme>()!.dividerColor,
215 ),
216 itemCount: itemCount + 1,
lib/src/screens/exchange/widgets/exchange_card.dart
+5 -2
@@ -193,9 +193,11 @@ class ExchangeCardState<T extends Currency> extends State<ExchangeCard<T>> {
193 width: double.infinity,
194 color: Colors.transparent,
195 child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[
196 + SizedBox(height: 10),
197 Row(
198 mainAxisAlignment: MainAxisAlignment.start,
199 children: <Widget>[
200 + SizedBox(height: 40),
201 Text(
202 key: ValueKey('${_cardInstanceName}_title_key'),
203 _title,
@@ -207,6 +209,7 @@ class ExchangeCardState<T extends Currency> extends State<ExchangeCard<T>> {
209 ],
210 ),
211 CurrencyAmountTextField(
212 + padding: EdgeInsets.zero,
213 currencyPickerButtonKey: ValueKey('${_cardInstanceName}_currency_picker_button_key'),
214 selectedCurrencyTextKey: ValueKey('${_cardInstanceName}_selected_currency_text_key'),
215 selectedCurrencyTagTextKey:
@@ -273,7 +276,7 @@ class ExchangeCardState<T extends Currency> extends State<ExchangeCard<T>> {
276 ? FocusTraversalOrder(
277 order: NumericFocusOrder(2),
278 child: Padding(
276 - padding: widget.addressRowPadding ?? EdgeInsets.only(top: 20),
279 + padding: widget.addressRowPadding ?? EdgeInsets.only(top: 12),
280 child: AddressTextField(
281 addressKey: ValueKey('${_cardInstanceName}_editable_address_textfield_key'),
282 focusNode: widget.addressFocusNode,
@@ -313,7 +316,7 @@ class ExchangeCardState<T extends Currency> extends State<ExchangeCard<T>> {
316 )
317 : Offstage()
318 : Padding(
316 - padding: EdgeInsets.only(top: 10),
319 + padding: EdgeInsets.only(top: 0),
320 child: Builder(
321 builder: (context) => Stack(children: <Widget>[
322 FocusTraversalOrder(
lib/src/screens/exchange/widgets/mobile_exchange_cards_section.dart
+3 -3
@@ -23,7 +23,7 @@ class MobileExchangeCardsSection extends StatelessWidget {
23 @override
24 Widget build(BuildContext context) {
25 return Container(
26 - padding: EdgeInsets.only(bottom: isBuySellOption ? 8 : 32),
26 + padding: EdgeInsets.only(bottom: isBuySellOption ? 16 : 16),
27 decoration: BoxDecoration(
28 borderRadius: BorderRadius.only(
29 bottomLeft: Radius.circular(24),
@@ -54,7 +54,7 @@ class MobileExchangeCardsSection extends StatelessWidget {
54 end: Alignment.bottomRight,
55 ),
56 ),
57 - padding: EdgeInsets.fromLTRB(24, 90, 24, isBuySellOption ? 8 : 32),
57 + padding: EdgeInsets.fromLTRB(24, 90, 24, isBuySellOption ? 24 : 16),
58 child: Column(
59 children: [
60 if (isBuySellOption) Column(
@@ -68,7 +68,7 @@ class MobileExchangeCardsSection extends StatelessWidget {
68 ),
69 ),
70 Padding(
71 - padding: EdgeInsets.only(top: 29, left: 24, right: 24),
71 + padding: EdgeInsets.only(top: 20, left: 24, right: 24),
72 child: secondExchangeCard,
73 )
74 ],
lib/src/screens/nodes/widgets/node_list_row.dart
+61
@@ -18,6 +18,37 @@ class NodeListRow extends StandardListRow {
18 final Node node;
19 final bool isPow;
20
21 + @override
22 + Widget build(BuildContext context) {
23 + final leading = buildLeading(context);
24 + final trailing = buildTrailing(context);
25 + return Container(
26 + height: 56,
27 + padding: EdgeInsets.only(left: 12, right: 12, top: 2, bottom: 2),
28 + margin: EdgeInsets.only(top: 2, bottom: 2),
29 + child: TextButton(
30 + onPressed: () => onTap?.call(context),
31 + style: ButtonStyle(
32 + backgroundColor: MaterialStateProperty.all(Theme.of(context).cardColor),
33 + shape: MaterialStateProperty.all(
34 + RoundedRectangleBorder(
35 + borderRadius: BorderRadius.all(Radius.circular(10)
36 + ),
37 + ),
38 + ),
39 + ),
40 + child: Row(
41 + mainAxisAlignment: MainAxisAlignment.spaceBetween,
42 + children: <Widget>[
43 + if (leading != null) leading,
44 + buildCenter(context, hasLeftOffset: leading != null),
45 + if (trailing != null) trailing,
46 + ],
47 + ),
48 + ),
49 + );
50 + }
51 +
52 @override
53 Widget buildLeading(BuildContext context) {
54 return FutureBuilder(
@@ -56,6 +87,36 @@ class NodeHeaderListRow extends StandardListRow {
87 NodeHeaderListRow({required String title, required void Function(BuildContext context) onTap})
88 : super(title: title, onTap: onTap, isSelected: false);
89
90 + @override
91 + Widget build(BuildContext context) {
92 + final leading = buildLeading(context);
93 + final trailing = buildTrailing(context);
94 + return Container(
95 + height: 56,
96 + padding: EdgeInsets.only(left: 12, right: 12, top: 2, bottom: 2),
97 + child: TextButton(
98 + onPressed: () => onTap?.call(context),
99 + style: ButtonStyle(
100 + backgroundColor: MaterialStateProperty.all(Theme.of(context).cardColor),
101 + shape: MaterialStateProperty.all(
102 + RoundedRectangleBorder(
103 + borderRadius: BorderRadius.all(Radius.circular(10)
104 + ),
105 + ),
106 + ),
107 + ),
108 + child: Row(
109 + mainAxisAlignment: MainAxisAlignment.spaceBetween,
110 + children: <Widget>[
111 + if (leading != null) leading,
112 + buildCenter(context, hasLeftOffset: leading != null),
113 + if (trailing != null) trailing,
114 + ],
115 + ),
116 + ),
117 + );
118 + }
119 +
120 @override
121 Widget buildTrailing(BuildContext context) {
122 return SizedBox(
lib/src/screens/send/widgets/send_card.dart
+1 -1
@@ -142,7 +142,7 @@ class SendCardState extends State<SendCard> with AutomaticKeepAliveClientMixin<S
142 child: Padding(
143 padding: EdgeInsets.fromLTRB(
144 24,
145 - responsiveLayoutUtil.shouldRenderMobileUI ? 100 : 55,
145 + responsiveLayoutUtil.shouldRenderMobileUI ? 110 : 55,
146 24,
147 responsiveLayoutUtil.shouldRenderMobileUI ? 32 : 0,
148 ),
lib/src/screens/settings/display_settings_page.dart
+7 -6
@@ -27,12 +27,6 @@ class DisplaySettingsPage extends BasePage {
27 padding: EdgeInsets.only(top: 10),
28 child: Column(
29 children: [
30 - SettingsSwitcherCell(
31 - title: S.current.settings_display_balance,
32 - value: _displaySettingsViewModel.shouldDisplayBalance,
33 - onValueChange: (_, bool value) {
34 - _displaySettingsViewModel.setShouldDisplayBalance(value);
35 - }),
30 SettingsSwitcherCell(
31 title: S.current.show_market_place,
32 value: _displaySettingsViewModel.shouldShowMarketPlaceInDashboard,
@@ -40,6 +34,13 @@ class DisplaySettingsPage extends BasePage {
34 _displaySettingsViewModel.setShouldShowMarketPlaceInDashbaord(value);
35 },
36 ),
37 + SettingsSwitcherCell(
38 + title: S.of(context).show_address_book_popup,
39 + value: _displaySettingsViewModel.showAddressBookPopup,
40 + onValueChange: (_, bool value) {
41 + _displaySettingsViewModel.setShowAddressBookPopup(value);
42 + },
43 + ),
44 //if (!isHaven) it does not work correctly
45 if (!_displaySettingsViewModel.disabledFiatApiMode)
46 SettingsPickerCell<FiatCurrency>(
lib/src/screens/settings/manage_nodes_page.dart
-1
@@ -34,7 +34,6 @@ class ManageNodesPage extends BasePage {
34 onTap: (_) async => await Navigator.of(context).pushNamed(Routes.newNode),
35 ),
36 ),
37 - const StandardListSeparator(padding: EdgeInsets.symmetric(horizontal: 24)),
37 SizedBox(height: 20),
38 Observer(
39 builder: (BuildContext context) {
lib/src/screens/settings/other_settings_page.dart
-7
@@ -63,13 +63,6 @@ class OtherSettingsPage extends BasePage {
63 handler: (BuildContext context) =>
64 Navigator.of(context).pushNamed(Routes.readDisclaimer),
65 ),
66 - SettingsSwitcherCell(
67 - title: S.of(context).show_address_book_popup,
68 - value: _otherSettingsViewModel.showAddressBookPopup,
69 - onValueChange: (_, bool value) {
70 - _otherSettingsViewModel.setShowAddressBookPopup(value);
71 - },
72 - ),
66 Spacer(),
67 SettingsVersionCell(
68 title: S.of(context).version(_otherSettingsViewModel.currentVersion)),
lib/src/screens/settings/security_backup_page.dart
+41 -35
@@ -35,41 +35,6 @@ class SecurityBackupPage extends BasePage {
35 child: Column(
36 mainAxisSize: MainAxisSize.min,
37 children: [
38 - if (!_isHardwareWallet)
39 - SettingsCellWithArrow(
40 - key: ValueKey('security_backup_page_show_keys_button_key'),
41 - title: S.current.show_keys,
42 - handler: (_) => _authService.authenticateAction(
43 - context,
44 - route: Routes.showKeys,
45 - conditionToDetermineIfToUse2FA:
46 - _securitySettingsViewModel.shouldRequireTOTP2FAForAllSecurityAndBackupSettings,
47 - ),
48 - ),
49 - if (!SettingsStoreBase.walletPasswordDirectInput)
50 - SettingsCellWithArrow(
51 - key: ValueKey('security_backup_page_create_backup_button_key'),
52 - title: S.current.create_backup,
53 - handler: (_) => _authService.authenticateAction(
54 - context,
55 - route: Routes.backup,
56 - conditionToDetermineIfToUse2FA:
57 - _securitySettingsViewModel.shouldRequireTOTP2FAForAllSecurityAndBackupSettings,
58 - ),
59 - ),
60 - SettingsCellWithArrow(
61 - key: ValueKey('security_backup_page_change_pin_button_key'),
62 - title: S.current.settings_change_pin,
63 - handler: (_) => _authService.authenticateAction(
64 - context,
65 - route: Routes.setupPin,
66 - arguments: (PinCodeState<PinCodeWidget> setupPinContext, String _) {
67 - setupPinContext.close();
68 - },
69 - conditionToDetermineIfToUse2FA:
70 - _securitySettingsViewModel.shouldRequireTOTP2FAForAllSecurityAndBackupSettings,
71 - ),
72 - ),
38 if (DeviceInfo.instance.isMobile || Platform.isMacOS || Platform.isLinux)
39 Observer(builder: (_) {
40 return SettingsSwitcherCell(
@@ -110,6 +75,47 @@ class SecurityBackupPage extends BasePage {
75 },
76 );
77 }),
78 + if (!_isHardwareWallet)
79 + SettingsCellWithArrow(
80 + key: ValueKey('security_backup_page_show_keys_button_key'),
81 + title: S.current.show_keys,
82 + handler: (_) => _authService.authenticateAction(
83 + context,
84 + route: Routes.showKeys,
85 + conditionToDetermineIfToUse2FA:
86 + _securitySettingsViewModel.shouldRequireTOTP2FAForAllSecurityAndBackupSettings,
87 + ),
88 + ),
89 + if (!SettingsStoreBase.walletPasswordDirectInput)
90 + SettingsCellWithArrow(
91 + key: ValueKey('security_backup_page_create_backup_button_key'),
92 + title: S.current.create_backup,
93 + handler: (_) => _authService.authenticateAction(
94 + context,
95 + route: Routes.backup,
96 + conditionToDetermineIfToUse2FA:
97 + _securitySettingsViewModel.shouldRequireTOTP2FAForAllSecurityAndBackupSettings,
98 + ),
99 + ),
100 + SettingsCellWithArrow(
101 + key: ValueKey('security_backup_page_change_pin_button_key'),
102 + title: S.current.settings_change_pin,
103 + handler: (_) => _authService.authenticateAction(
104 + context,
105 + route: Routes.setupPin,
106 + arguments: (PinCodeState<PinCodeWidget> setupPinContext, String _) {
107 + setupPinContext.close();
108 + },
109 + conditionToDetermineIfToUse2FA:
110 + _securitySettingsViewModel.shouldRequireTOTP2FAForAllSecurityAndBackupSettings,
111 + ),
112 + ),
113 + SettingsCellWithArrow(
114 + key: ValueKey('security_backup_page_sign_and_verify'),
115 + title: S.current.sign_verify_title,
116 + handler: (_) => Navigator.of(context).pushNamed(Routes.signPage)
117 + //_securitySettingsViewModel.pinCodeRequiredDuration,
118 + ),
119 Observer(
120 builder: (context) {
121 return SettingsCellWithArrow(
lib/src/screens/settings/widgets/settings_choices_cell.dart
+2 -2
@@ -12,7 +12,7 @@ class SettingsChoicesCell extends StatelessWidget {
12 Widget build(BuildContext context) {
13 return Container(
14 color: Theme.of(context).colorScheme.background,
15 - padding: EdgeInsets.all(24),
15 + padding: EdgeInsets.only(left: 24, right: 24, top: 16, bottom: 16),
16 child: Column(
17 mainAxisSize: MainAxisSize.min,
18 crossAxisAlignment: CrossAxisAlignment.start,
@@ -30,7 +30,7 @@ class SettingsChoicesCell extends StatelessWidget {
30 ),
31 ],
32 ),
33 - const SizedBox(height: 24),
33 + const SizedBox(height: 12),
34 ],
35 Center(
36 child: Container(
lib/src/screens/settings/widgets/settings_switcher_cell.dart
+32
@@ -1,6 +1,7 @@
1 import 'package:flutter/cupertino.dart';
2 import 'package:cake_wallet/src/widgets/standard_list.dart';
3 import 'package:cake_wallet/src/widgets/standard_switch.dart';
4 +import 'package:flutter/material.dart';
5
6 class SettingsSwitcherCell extends StandardListRow {
7 SettingsSwitcherCell({
@@ -21,6 +22,37 @@ class SettingsSwitcherCell extends StandardListRow {
22 Widget buildTrailing(BuildContext context) =>
23 StandardSwitch(value: value, onTaped: () => onValueChange?.call(context, !value));
24
25 + @override
26 + Widget build(BuildContext context) {
27 + final leading = buildLeading(context);
28 + final trailing = buildTrailing(context);
29 + return Container(
30 + height: 56,
31 + padding: EdgeInsets.only(left: 12, right: 12),
32 + child: TextButton(
33 + onPressed: () => onValueChange?.call(context, !value),
34 + style: ButtonStyle(
35 + //backgroundColor: MaterialStateProperty.all(Theme.of(context).cardColor),
36 + shape: MaterialStateProperty.all(
37 + RoundedRectangleBorder(
38 + borderRadius: BorderRadius.all(Radius.circular(10)
39 + ),
40 + ),
41 + ),
42 + ),
43 + child: Row(
44 + mainAxisAlignment: MainAxisAlignment.spaceBetween,
45 + children: <Widget>[
46 + if (leading != null) leading,
47 + buildCenter(context, hasLeftOffset: leading != null),
48 + if (trailing != null) trailing,
49 + ],
50 + ),
51 + ),
52 + );
53 + }
54 +
55 +
56 @override
57 Widget? buildLeading(BuildContext context) => leading;
58 }
lib/src/screens/support/support_page.dart
+3 -3
@@ -42,7 +42,7 @@ class SupportPage extends BasePage {
42 child: Column(
43 children: [
44 Padding(
45 - padding: EdgeInsets.only(top: 24),
45 + padding: EdgeInsets.only(top: 20),
46 child: OptionTile(
47 icon: Icon(
48 Icons.support_agent,
@@ -61,7 +61,7 @@ class SupportPage extends BasePage {
61 ),
62 ),
63 Padding(
64 - padding: EdgeInsets.only(top: 24),
64 + padding: EdgeInsets.only(top: 20),
65 child: OptionTile(
66 icon: Icon(
67 Icons.find_in_page,
@@ -74,7 +74,7 @@ class SupportPage extends BasePage {
74 ),
75 ),
76 Padding(
77 - padding: EdgeInsets.only(top: 24),
77 + padding: EdgeInsets.only(top: 20),
78 child: OptionTile(
79 icon: Icon(
80 Icons.contact_support,
lib/src/screens/wallet_list/wallet_list_page.dart
+312 -231
@@ -31,6 +31,8 @@ import 'package:cw_core/wallet_type.dart';
31 import 'package:flutter/material.dart';
32 import 'package:flutter_mobx/flutter_mobx.dart';
33
34 +import '../../../themes/extensions/dashboard_page_theme.dart';
35 +
36 class WalletListPage extends BasePage {
37 WalletListPage({
38 required this.walletListViewModel,
@@ -88,7 +90,8 @@ class WalletListPage extends BasePage {
90 width: 36,
91 decoration: BoxDecoration(
92 shape: BoxShape.circle,
91 - color: Theme.of(context).extension<FilterTheme>()!.buttonColor,
93 + color:
94 + Theme.of(context).extension<FilterTheme>()!.buttonColor,
95 ),
96 child: filterIcon,
97 ),
@@ -145,259 +148,336 @@ class WalletListBodyState extends State<WalletListBody> {
148 color: Theme.of(context).extension<CakeTextTheme>()!.buttonTextColor);
149
150 return Container(
151 + height: double.infinity,
152 padding: EdgeInsets.only(top: 16),
149 - child: Column(
150 - children: [
151 - Expanded(
152 - child: SingleChildScrollView(
153 - child: Column(
154 - crossAxisAlignment: CrossAxisAlignment.start,
155 - children: [
156 - if (widget.walletListViewModel.multiWalletGroups.isNotEmpty) ...{
157 - Padding(
158 - padding: const EdgeInsets.only(left: 24),
159 - child: Text(
160 - S.current.shared_seed_wallet_groups,
161 - style: TextStyle(
162 - fontSize: 18,
163 - fontWeight: FontWeight.w500,
164 - color: Theme.of(context).extension<CakeTextTheme>()!.titleColor,
165 - ),
153 +
154 + child: Stack(
155 + alignment: Alignment.bottomCenter,
156 + fit: StackFit.expand,
157 + children: <Widget>[
158 + SingleChildScrollView(
159 + child: Column(
160 + crossAxisAlignment: CrossAxisAlignment.start,
161 + children: [
162 + if (widget
163 + .walletListViewModel.multiWalletGroups.isNotEmpty) ...{
164 + Padding(
165 + padding: const EdgeInsets.only(left: 24),
166 + child: Text(
167 + S.current.shared_seed_wallet_groups,
168 + style: TextStyle(
169 + fontSize: 18,
170 + fontWeight: FontWeight.w500,
171 + color: Theme.of(context)
172 + .extension<CakeTextTheme>()!
173 + .titleColor,
174 ),
175 ),
168 - SizedBox(height: 16),
169 - Container(
170 - child: Observer(
171 - builder: (_) => FilteredList(
172 - shrinkWrap: true,
173 - list: widget.walletListViewModel.multiWalletGroups,
174 - updateFunction: widget.walletListViewModel.reorderAccordingToWalletList,
175 - itemBuilder: (context, index) {
176 - final group = widget.walletListViewModel.multiWalletGroups[index];
177 - final groupName = group.groupName ??
178 - '${S.current.wallet_group} ${index + 1}';
176 + ),
177 + SizedBox(height: 16),
178 + Container(
179 + child: Observer(
180 + builder: (_) => FilteredList(
181 + shrinkWrap: true,
182 + list: widget.walletListViewModel.multiWalletGroups,
183 + updateFunction: widget
184 + .walletListViewModel.reorderAccordingToWalletList,
185 + itemBuilder: (context, index) {
186 + final group = widget
187 + .walletListViewModel.multiWalletGroups[index];
188 + final groupName = group.groupName ??
189 + '${S.current.wallet_group} ${index + 1}';
190
180 - widget.walletListViewModel.updateTileState(
181 - index,
182 - widget.walletListViewModel.expansionTileStateTrack[index] ?? false,
183 - );
191 + widget.walletListViewModel.updateTileState(
192 + index,
193 + widget.walletListViewModel
194 + .expansionTileStateTrack[index] ??
195 + false,
196 + );
197
185 - return GroupedWalletExpansionTile(
186 - onExpansionChanged: (value) {
187 - widget.walletListViewModel.updateTileState(index, value);
188 - setState(() {});
198 + return GroupedWalletExpansionTile(
199 + onExpansionChanged: (value) {
200 + widget.walletListViewModel
201 + .updateTileState(index, value);
202 + setState(() {});
203 + },
204 + shouldShowCurrentWalletPointer: true,
205 + borderRadius: BorderRadius.all(Radius.circular(16)),
206 + margin: EdgeInsets.only(
207 + left: 20, right: 20, bottom: 12),
208 + title: groupName,
209 + tileKey: ValueKey(
210 + 'group_wallets_expansion_tile_widget_$index'),
211 + leadingWidget: Icon(
212 + Icons.account_balance_wallet_outlined,
213 + size: 28,
214 + ),
215 + trailingWidget: EditWalletButtonWidget(
216 + width: 74,
217 + isGroup: true,
218 + isExpanded: widget.walletListViewModel
219 + .expansionTileStateTrack[index]!,
220 + onTap: () {
221 + final wallet = widget.walletListViewModel
222 + .convertWalletInfoToWalletListItem(
223 + group.wallets.first);
224 + Navigator.of(context).pushNamed(
225 + Routes.walletEdit,
226 + arguments: WalletEditPageArguments(
227 + walletListViewModel:
228 + widget.walletListViewModel,
229 + editingWallet: wallet,
230 + isWalletGroup: true,
231 + groupName: groupName,
232 + parentAddress: group.parentAddress,
233 + ),
234 + );
235 },
190 - shouldShowCurrentWalletPointer: true,
191 - borderRadius: BorderRadius.all(Radius.circular(16)),
192 - margin: EdgeInsets.only(left: 20, right: 20, bottom: 12),
193 - title: groupName,
194 - tileKey: ValueKey('group_wallets_expansion_tile_widget_$index'),
195 - leadingWidget: Icon(
196 - Icons.account_balance_wallet_outlined,
197 - size: 28,
198 - ),
199 - trailingWidget: EditWalletButtonWidget(
200 - width: 74,
201 - isGroup: true,
202 - isExpanded: widget.walletListViewModel.expansionTileStateTrack[index]!,
203 - onTap: () {
204 - final wallet = widget.walletListViewModel
205 - .convertWalletInfoToWalletListItem(group.wallets.first);
206 - Navigator.of(context).pushNamed(
207 - Routes.walletEdit,
208 - arguments: WalletEditPageArguments(
209 - walletListViewModel: widget.walletListViewModel,
210 - editingWallet: wallet,
211 - isWalletGroup: true,
212 - groupName: groupName,
213 - parentAddress: group.parentAddress,
214 - ),
215 - );
216 - },
217 - ),
218 - childWallets: group.wallets.map((walletInfo) {
219 - return widget.walletListViewModel.convertWalletInfoToWalletListItem(walletInfo);
220 - }).toList(),
221 - isSelected: false,
222 - onChildItemTapped: (wallet) =>
223 - wallet.isCurrent ? null : _loadWallet(wallet),
224 - childTrailingWidget: (item) {
225 - return item.isCurrent
226 - ? SizedBox.shrink()
227 - : Padding(
228 - padding: const EdgeInsets.only(right: 16),
229 - child: EditWalletButtonWidget(
230 - width: 44,
231 - onTap: () => Navigator.of(context).pushNamed(
232 - Routes.walletEdit,
233 - arguments: WalletEditPageArguments(
234 - walletListViewModel: widget.walletListViewModel,
235 - editingWallet: item,
236 - ),
236 + ),
237 + childWallets: group.wallets.map((walletInfo) {
238 + return widget.walletListViewModel
239 + .convertWalletInfoToWalletListItem(
240 + walletInfo);
241 + }).toList(),
242 + isSelected: false,
243 + onChildItemTapped: (wallet) =>
244 + wallet.isCurrent ? null : _loadWallet(wallet),
245 + childTrailingWidget: (item) {
246 + return item.isCurrent
247 + ? SizedBox.shrink()
248 + : Padding(
249 + padding: const EdgeInsets.only(right: 16),
250 + child: EditWalletButtonWidget(
251 + width: 44,
252 + onTap: () =>
253 + Navigator.of(context).pushNamed(
254 + Routes.walletEdit,
255 + arguments: WalletEditPageArguments(
256 + walletListViewModel:
257 + widget.walletListViewModel,
258 + editingWallet: item,
259 ),
260 ),
239 - );
240 - },
241 - );
242 - },
243 - ),
261 + ),
262 + );
263 + },
264 + );
265 + },
266 ),
267 ),
246 - SizedBox(height: 24),
247 - },
248 - if (widget.walletListViewModel.singleWalletsList.isNotEmpty) ...{
249 - Padding(
250 - padding: const EdgeInsets.only(left: 24),
251 - child: Text(
252 - S.current.single_seed_wallets_group,
253 - style: TextStyle(
254 - fontSize: 18,
255 - fontWeight: FontWeight.w500,
256 - color: Theme.of(context).extension<CakeTextTheme>()!.titleColor,
257 - ),
268 + ),
269 + SizedBox(height: 24),
270 + },
271 + if (widget
272 + .walletListViewModel.singleWalletsList.isNotEmpty) ...{
273 + Padding(
274 + padding: const EdgeInsets.only(left: 24),
275 + child: Text(
276 + S.current.single_seed_wallets_group,
277 + style: TextStyle(
278 + fontSize: 18,
279 + fontWeight: FontWeight.w500,
280 + color: Theme.of(context)
281 + .extension<CakeTextTheme>()!
282 + .titleColor,
283 ),
284 ),
260 - SizedBox(height: 16),
261 - Container(
262 - child: Observer(
263 - builder: (_) => FilteredList(
264 - shrinkWrap: true,
265 - list: widget.walletListViewModel.singleWalletsList,
266 - updateFunction: widget.walletListViewModel.reorderAccordingToWalletList,
267 - itemBuilder: (context, index) {
268 - final wallet = widget.walletListViewModel.singleWalletsList[index];
269 - final currentColor = wallet.isCurrent
270 - ? Theme.of(context)
271 - .extension<WalletListTheme>()!
272 - .createNewWalletButtonBackgroundColor
273 - : Theme.of(context).colorScheme.background;
285 + ),
286 + SizedBox(height: 16),
287 + Container(
288 + child: Observer(
289 + builder: (_) => FilteredList(
290 + shrinkWrap: true,
291 + list: widget.walletListViewModel.singleWalletsList,
292 + updateFunction: widget
293 + .walletListViewModel.reorderAccordingToWalletList,
294 + itemBuilder: (context, index) {
295 + final wallet = widget
296 + .walletListViewModel.singleWalletsList[index];
297 + final currentColor = wallet.isCurrent
298 + ? Theme.of(context)
299 + .extension<WalletListTheme>()!
300 + .createNewWalletButtonBackgroundColor
301 + : Theme.of(context).colorScheme.background;
302
275 - return GroupedWalletExpansionTile(
276 - tileKey: ValueKey('single_wallets_expansion_tile_widget_$index'),
277 - isCurrentlySelectedWallet: wallet.isCurrent,
278 - leadingWidget: SizedBox(
279 - width: wallet.isCurrent ? 56 : 40,
280 - child: Row(
281 - children: [
282 - wallet.isCurrent
283 - ? Container(
284 - height: 35,
285 - width: 6,
286 - margin: EdgeInsets.only(right: 16),
287 - decoration: BoxDecoration(
288 - borderRadius: BorderRadius.only(
289 - topRight: Radius.circular(16),
290 - bottomRight: Radius.circular(16),
291 - ),
292 - color: currentColor,
303 + return GroupedWalletExpansionTile(
304 + tileKey: ValueKey(
305 + 'single_wallets_expansion_tile_widget_$index'),
306 + isCurrentlySelectedWallet: wallet.isCurrent,
307 + leadingWidget: SizedBox(
308 + width: wallet.isCurrent ? 56 : 40,
309 + child: Row(
310 + children: [
311 + wallet.isCurrent
312 + ? Container(
313 + height: 35,
314 + width: 6,
315 + margin: EdgeInsets.only(right: 16),
316 + decoration: BoxDecoration(
317 + borderRadius: BorderRadius.only(
318 + topRight: Radius.circular(16),
319 + bottomRight: Radius.circular(16),
320 ),
294 - )
295 - : SizedBox(width: 6),
296 - Image.asset(
297 - walletTypeToCryptoCurrency(wallet.type).iconPath!,
298 - width: 32,
299 - height: 32,
300 - ),
301 - ],
302 - ),
303 - ),
304 - title: wallet.name,
305 - isSelected: false,
306 - borderRadius: BorderRadius.all(Radius.circular(16)),
307 - margin: EdgeInsets.only(left: 20, right: 20, bottom: 12),
308 - onTitleTapped: () => wallet.isCurrent ? null : _loadWallet(wallet),
309 - trailingWidget: wallet.isCurrent
310 - ? null
311 - : EditWalletButtonWidget(
312 - width: 44,
313 - onTap: () {
314 - Navigator.of(context).pushNamed(
315 - Routes.walletEdit,
316 - arguments: WalletEditPageArguments(
317 - walletListViewModel: widget.walletListViewModel,
318 - editingWallet: wallet,
321 + color: currentColor,
322 ),
320 - );
321 - },
322 - ),
323 - );
324 - },
325 - ),
323 + )
324 + : SizedBox(width: 6),
325 + Image.asset(
326 + walletTypeToCryptoCurrency(wallet.type)
327 + .iconPath!,
328 + width: 32,
329 + height: 32,
330 + ),
331 + ],
332 + ),
333 + ),
334 + title: wallet.name,
335 + isSelected: false,
336 + borderRadius: BorderRadius.all(Radius.circular(16)),
337 + margin: EdgeInsets.only(
338 + left: 20, right: 20, bottom: 12),
339 + onTitleTapped: () =>
340 + wallet.isCurrent ? null : _loadWallet(wallet),
341 + trailingWidget: wallet.isCurrent
342 + ? null
343 + : EditWalletButtonWidget(
344 + width: 44,
345 + onTap: () {
346 + Navigator.of(context).pushNamed(
347 + Routes.walletEdit,
348 + arguments: WalletEditPageArguments(
349 + walletListViewModel:
350 + widget.walletListViewModel,
351 + editingWallet: wallet,
352 + ),
353 + );
354 + },
355 + ),
356 + );
357 + },
358 ),
359 ),
328 - },
329 - ],
330 - ),
360 + ),
361 + SizedBox(height: 150),
362 + },
363 + ],
364 ),
365 ),
333 - Padding(
334 - padding: const EdgeInsets.all(24),
335 - child: Column(
336 - children: <Widget>[
337 - PrimaryImageButton(
338 - key: ValueKey('wallet_list_page_restore_wallet_button_key'),
339 - onPressed: () {
340 - if (widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets) {
341 - widget.authService.authenticateAction(
342 - context,
343 - route: Routes.restoreOptions,
344 - arguments: false,
345 - conditionToDetermineIfToUse2FA: widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets,
346 - );
347 - } else {
348 - Navigator.of(context).pushNamed(Routes.restoreOptions, arguments: false);
349 - }
350 - },
351 - image: restoreWalletImage,
352 - text: S.of(context).wallet_list_restore_wallet,
353 - color: Theme.of(context).cardColor,
354 - textColor: Theme.of(context).extension<CakeTextTheme>()!.buttonTextColor,
366 + Positioned(
367 + bottom: 0.0,
368 + child: Container(
369 + //padding: EdgeInsets.only(top: 100),
370 + alignment: Alignment.bottomCenter,
371 + height: 185,
372 + //width: 600,
373 + //padding: EdgeInsets.only(top: 50),
374 + decoration: BoxDecoration(
375 + gradient: LinearGradient(
376 + begin: Alignment.topCenter,
377 + end: Alignment.bottomCenter,
378 + colors: <Color>[
379 + Theme.of(context).colorScheme.background.withAlpha(10),
380 + Theme.of(context).colorScheme.background,
381 + Theme.of(context).colorScheme.background,
382 + Theme.of(context).colorScheme.background
383 + ],
384 ),
356 - SizedBox(height: 10.0),
357 - PrimaryImageButton(
358 - key: ValueKey('wallet_list_page_create_new_wallet_button_key'),
359 - onPressed: () {
360 - //TODO(David): Find a way to optimize this
361 - if (isSingleCoin) {
362 - if (widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets) {
363 - widget.authService.authenticateAction(
364 - context,
365 - route: Routes.newWallet,
366 - arguments: NewWalletArguments(
367 - type: widget.walletListViewModel.currentWalletType,
368 - ),
369 - conditionToDetermineIfToUse2FA: widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets,
370 - );
371 - } else {
372 - Navigator.of(context).pushNamed(
373 - Routes.newWallet,
374 - arguments: NewWalletArguments(
375 - type: widget.walletListViewModel.currentWalletType,
376 - ),
377 - );
378 - }
379 - } else {
380 - if (widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets) {
381 - widget.authService.authenticateAction(
382 - context,
383 - route: Routes.newWalletType,
384 - conditionToDetermineIfToUse2FA: widget.walletListViewModel.shouldRequireTOTP2FAForCreatingNewWallets,
385 - );
386 - } else {
387 - Navigator.of(context).pushNamed(Routes.newWalletType);
388 - }
389 - }
390 - },
391 - image: newWalletImage,
392 - text: S.of(context).wallet_list_create_new_wallet,
393 - color: Theme.of(context).primaryColor,
394 - textColor: Colors.white,
385 + ),
386 + child: Container(
387 + height: 120,
388 + width: MediaQuery.of(context).size.width,
389 + //alignment: Alignment.bottomCenter,
390 + margin: EdgeInsets.only(bottom: 24),
391 + padding: EdgeInsets.only(left: 16, right: 16),
392 + child: Column(
393 + mainAxisSize: MainAxisSize.min,
394 + mainAxisAlignment: MainAxisAlignment.center,
395 + crossAxisAlignment: CrossAxisAlignment.center,
396 + children: <Widget>[
397 + PrimaryImageButton(
398 + key: ValueKey(
399 + 'wallet_list_page_restore_wallet_button_key'),
400 + onPressed: () {
401 + if (widget.walletListViewModel
402 + .shouldRequireTOTP2FAForCreatingNewWallets) {
403 + widget.authService.authenticateAction(
404 + context,
405 + route: Routes.restoreOptions,
406 + arguments: false,
407 + conditionToDetermineIfToUse2FA: widget
408 + .walletListViewModel
409 + .shouldRequireTOTP2FAForCreatingNewWallets,
410 + );
411 + } else {
412 + Navigator.of(context).pushNamed(Routes.restoreOptions,
413 + arguments: false);
414 + }
415 + },
416 + image: restoreWalletImage,
417 + text: S.of(context).wallet_list_restore_wallet,
418 + color: Theme.of(context).cardColor,
419 + textColor: Theme.of(context)
420 + .extension<CakeTextTheme>()!
421 + .buttonTextColor,
422 + ),
423 + SizedBox(height: 10.0),
424 + PrimaryImageButton(
425 + key: ValueKey(
426 + 'wallet_list_page_create_new_wallet_button_key'),
427 + onPressed: () {
428 + //TODO(David): Find a way to optimize this
429 + if (isSingleCoin) {
430 + if (widget.walletListViewModel
431 + .shouldRequireTOTP2FAForCreatingNewWallets) {
432 + widget.authService.authenticateAction(
433 + context,
434 + route: Routes.newWallet,
435 + arguments: NewWalletArguments(
436 + type: widget
437 + .walletListViewModel.currentWalletType,
438 + ),
439 + conditionToDetermineIfToUse2FA: widget
440 + .walletListViewModel
441 + .shouldRequireTOTP2FAForCreatingNewWallets,
442 + );
443 + } else {
444 + Navigator.of(context).pushNamed(
445 + Routes.newWallet,
446 + arguments: NewWalletArguments(
447 + type: widget
448 + .walletListViewModel.currentWalletType,
449 + ),
450 + );
451 + }
452 + } else {
453 + if (widget.walletListViewModel
454 + .shouldRequireTOTP2FAForCreatingNewWallets) {
455 + widget.authService.authenticateAction(
456 + context,
457 + route: Routes.newWalletType,
458 + conditionToDetermineIfToUse2FA: widget
459 + .walletListViewModel
460 + .shouldRequireTOTP2FAForCreatingNewWallets,
461 + );
462 + } else {
463 + Navigator.of(context)
464 + .pushNamed(Routes.newWalletType);
465 + }
466 + }
467 + },
468 + image: newWalletImage,
469 + text: S.of(context).wallet_list_create_new_wallet,
470 + color: Theme.of(context).primaryColor,
471 + textColor: Colors.white,
472 + ),
473 + ],
474 ),
396 - ],
475 + ),
476 + ),
477 ),
398 - ),
478 ],
479 ),
480 +
481 );
482 }
483
@@ -405,7 +485,8 @@ class WalletListBodyState extends State<WalletListBody> {
485 if (SettingsStoreBase.walletPasswordDirectInput) {
486 Navigator.of(context).pushNamed(Routes.walletUnlockLoadable,
487 arguments: WalletUnlockArguments(
408 - callback: (bool isAuthenticatedSuccessfully, AuthPageState auth) async {
488 + callback:
489 + (bool isAuthenticatedSuccessfully, AuthPageState auth) async {
490 if (isAuthenticatedSuccessfully) {
491 auth.close();
492 setState(() {});
lib/src/widgets/dashboard_card_widget.dart
+87 -55
@@ -15,7 +15,11 @@ class DashBoardRoundedCardWidget extends StatelessWidget {
15 this.icon,
16 this.onClose,
17 this.customBorder,
18 + this.shadowSpread,
19 + this.shadowBlur,
20 super.key,
21 + this.marginV,
22 + this.marginH,
23 });
24
25 final VoidCallback onTap;
@@ -27,71 +31,97 @@ class DashBoardRoundedCardWidget extends StatelessWidget {
31 final Widget? icon;
32 final Image? image;
33 final double? customBorder;
34 + final double? marginV;
35 + final double? marginH;
36 + final double? shadowSpread;
37 + final double? shadowBlur;
38
39 @override
40 Widget build(BuildContext context) {
41 return InkWell(
34 - onTap: onTap,
35 - hoverColor: Colors.transparent,
36 - splashColor: Colors.transparent,
37 - highlightColor: Colors.transparent,
42 + //onTap: onTap,
43 + //hoverColor: Colors.transparent,
44 + //splashColor: Colors.transparent,
45 + //highlightColor: Colors.transparent,
46 child: Stack(
47 children: [
40 - Container(
41 - padding: EdgeInsets.all(20),
42 - width: double.infinity,
43 - decoration: BoxDecoration(
44 - color: Theme.of(context).extension<SyncIndicatorTheme>()!.syncedBackgroundColor,
45 - borderRadius: BorderRadius.circular(customBorder ?? 20),
46 - border: Border.all(
47 - color: Theme.of(context).extension<BalancePageTheme>()!.cardBorderColor,
48 - ),
49 - ),
50 - child: Column(
51 - children: [
52 - Row(
53 - crossAxisAlignment: CrossAxisAlignment.start,
54 - children: [
55 - Expanded(
56 - child: Column(
57 - crossAxisAlignment: CrossAxisAlignment.start,
58 - children: [
59 - Text(
60 - title,
61 - style: TextStyle(
62 - color:
63 - Theme.of(context).extension<DashboardPageTheme>()!.cardTextColor,
64 - fontSize: 24,
65 - fontWeight: FontWeight.w900,
66 - ),
67 - softWrap: true,
68 - ),
69 - SizedBox(height: 5),
70 - Text(
71 - subTitle,
72 - style: TextStyle(
48 + Container(
49 + margin: EdgeInsets.symmetric(horizontal: marginH ?? 20, vertical: marginV ?? 8),
50 + //padding: EdgeInsets.all(20),
51 + width: double.infinity,
52 + decoration: BoxDecoration(
53 + borderRadius: BorderRadius.circular(customBorder ?? 20),
54 + border: Border.all(
55 + color: Theme.of(context).extension<BalancePageTheme>()!.cardBorderColor,
56 + ),
57 + // boxShadow: [
58 + // BoxShadow(
59 + // color: Theme.of(context).extension<BalancePageTheme>()!.cardBorderColor
60 + // .withAlpha(50),
61 + // spreadRadius: shadowSpread ?? 3,
62 + // blurRadius: shadowBlur ?? 7,
63 + // )
64 + // ],
65 + ),
66 + child: TextButton(
67 + onPressed: onTap,
68 + style: TextButton.styleFrom(
69 + backgroundColor: Theme.of(context)
70 + .extension<SyncIndicatorTheme>()!
71 + .syncedBackgroundColor,
72 + shape: RoundedRectangleBorder(
73 + borderRadius: BorderRadius.circular(customBorder ?? 20)),
74 + padding: EdgeInsets.all(24)
75 + ),
76 + child: Column(
77 + children: [
78 + Row(
79 + crossAxisAlignment: CrossAxisAlignment.start,
80 + children: [
81 + Expanded(
82 + child: Column(
83 + crossAxisAlignment: CrossAxisAlignment.start,
84 + children: [
85 + Text(
86 + title,
87 + style: TextStyle(
88 color: Theme.of(context)
89 .extension<DashboardPageTheme>()!
90 .cardTextColor,
76 - fontWeight: FontWeight.w500,
77 - fontFamily: 'Lato'),
78 - softWrap: true,
79 - ),
80 - ],
91 + fontSize: 24,
92 + fontWeight: FontWeight.w900,
93 + ),
94 + softWrap: true,
95 + ),
96 + SizedBox(height: 5),
97 + Text(
98 + subTitle,
99 + style: TextStyle(
100 + color: Theme.of(context)
101 + .extension<DashboardPageTheme>()!
102 + .cardTextColor,
103 + fontWeight: FontWeight.w500,
104 + fontFamily: 'Lato'),
105 + softWrap: true,
106 + ),
107 + ],
108 + ),
109 ),
82 - ),
83 - if (image != null) image!
84 - else if (svgPicture != null) svgPicture!,
85 - if (icon != null) icon!
86 - ],
87 - ),
88 - if (hint != null) ...[
89 - SizedBox(height: 10),
90 - hint!,
91 - ]
92 - ],
110 + if (image != null)
111 + image!
112 + else if (svgPicture != null)
113 + svgPicture!,
114 + if (icon != null) icon!
115 + ],
116 + ),
117 + if (hint != null) ...[
118 + SizedBox(height: 10),
119 + hint!,
120 + ]
121 + ],
122 + ),
123 + ),
124 ),
94 - ),
125 if (onClose != null)
126 Positioned(
127 top: 10,
@@ -99,7 +129,9 @@ class DashBoardRoundedCardWidget extends StatelessWidget {
129 child: IconButton(
130 icon: Icon(Icons.close),
131 onPressed: onClose,
102 - color: Theme.of(context).extension<DashboardPageTheme>()!.cardTextColor,
132 + color: Theme.of(context)
133 + .extension<DashboardPageTheme>()!
134 + .cardTextColor,
135 ),
136 ),
137 ],
lib/src/widgets/option_tile.dart
+16 -11
@@ -19,16 +19,17 @@ class OptionTile extends StatelessWidget {
19
20 @override
21 Widget build(BuildContext context) {
22 - return GestureDetector(
23 - onTap: onPressed,
24 - child: Container(
25 - width: double.infinity,
26 - padding: EdgeInsets.all(24),
27 - alignment: Alignment.center,
28 - decoration: BoxDecoration(
29 - borderRadius: BorderRadius.all(Radius.circular(12)),
30 - color: Theme.of(context).cardColor,
22 + return Container(
23 + width: double.infinity,
24 + padding: EdgeInsets.only(left: 6, right: 6),
25 + alignment: Alignment.center,
26 + child: TextButton(
27 + style: TextButton.styleFrom(
28 + backgroundColor: Theme.of(context).cardColor,
29 + shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
30 + padding: EdgeInsets.all(24)
31 ),
32 + onPressed: onPressed,
33 child: Row(
34 mainAxisSize: MainAxisSize.max,
35 mainAxisAlignment: MainAxisAlignment.center,
@@ -48,7 +49,9 @@ class OptionTile extends StatelessWidget {
49 style: TextStyle(
50 fontSize: 20,
51 fontWeight: FontWeight.w500,
51 - color: Theme.of(context).extension<OptionTileTheme>()!.titleColor,
52 + color: Theme.of(context)
53 + .extension<OptionTileTheme>()!
54 + .titleColor,
55 ),
56 ),
57 Padding(
@@ -58,7 +61,9 @@ class OptionTile extends StatelessWidget {
61 style: TextStyle(
62 fontSize: 14,
63 fontWeight: FontWeight.normal,
61 - color: Theme.of(context).extension<OptionTileTheme>()!.descriptionColor,
64 + color: Theme.of(context)
65 + .extension<OptionTileTheme>()!
66 + .descriptionColor,
67 ),
68 ),
69 )
lib/src/widgets/setting_action_button.dart
+55 -43
@@ -1,6 +1,10 @@
1 import 'package:cake_wallet/palette.dart';
2 import 'package:cake_wallet/themes/extensions/menu_theme.dart';
3 import 'package:flutter/material.dart';
4 +import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart';
5 +import 'package:cake_wallet/themes/extensions/dashboard_page_theme.dart';
6 +import 'package:cake_wallet/themes/extensions/balance_page_theme.dart';
7 +import 'package:cake_wallet/themes/extensions/option_tile_theme.dart';
8
9 class SettingActionButton extends StatelessWidget {
10 final bool isLastTile;
@@ -29,56 +33,64 @@ class SettingActionButton extends StatelessWidget {
33
34 @override
35 Widget build(BuildContext context) {
36 + final isLightMode = Theme.of(context).extension<OptionTileTheme>()?.useDarkImage ?? false;
37 Color? color = isSelected
38 ? Theme.of(context).extension<CakeMenuTheme>()!.settingTitleColor
39 : selectionActive
35 - ? Palette.darkBlue
36 - : Theme.of(context).extension<CakeMenuTheme>()!.settingTitleColor;
37 - return InkWell(
38 - onTap: onTap,
39 - hoverColor: Colors.transparent,
40 - child: Container(
41 - height: tileHeight,
42 - padding: isLastTile
43 - ? EdgeInsets.only(
44 - left: 24,
45 - right: 24,
46 - top: fromBottomEdge,
47 - )
48 - : EdgeInsets.only(left: 24, right: 24),
49 - alignment: isLastTile ? Alignment.topLeft : null,
50 - child: Row(
51 - mainAxisAlignment: MainAxisAlignment.start,
52 - crossAxisAlignment: CrossAxisAlignment.center,
53 - children: <Widget>[
54 - Image.asset(
55 - image,
56 - height: 16,
57 - width: 16,
58 - color: Theme.of(context)
59 - .extension<CakeMenuTheme>()!
60 - .settingActionsIconColor,
40 + ? Palette.darkBlue
41 + : Theme.of(context).extension<CakeMenuTheme>()!.settingTitleColor;
42 + return Container(
43 + //padding: EdgeInsets.only(top: 5, left: 15, bottom: 5),
44 + margin: EdgeInsets.only(top: 10, left: 20, bottom: 0, right: 20),
45 + child: TextButton(
46 + style: ButtonStyle(
47 + backgroundColor: MaterialStateProperty.all(isLightMode ? Theme.of(context).cardColor : Colors.black12),
48 + shape: MaterialStateProperty.all(
49 + RoundedRectangleBorder(
50 + borderRadius: BorderRadius.circular(20),
51 ),
62 - SizedBox(width: 16),
63 - Expanded(
64 - child: Text(
65 - title,
66 - style: TextStyle(
67 - color: color,
68 - fontSize: 16,
69 - fontWeight: FontWeight.bold,
52 + ),
53 + ),
54 + onPressed: onTap,
55 + //hoverColor: Colors.transparent,
56 + child: Container(
57 + width: double.infinity,
58 + padding: EdgeInsets.only(top: 12, left: 20, bottom: 12, right: 15),
59 + //margin: EdgeInsets.only(top: 5, left: 15, bottom: 5),
60 + alignment: isLastTile ? Alignment.topLeft : null,
61 + child: Row(
62 + mainAxisAlignment: MainAxisAlignment.start,
63 + crossAxisAlignment: CrossAxisAlignment.center,
64 + children: <Widget>[
65 + Image.asset(
66 + image,
67 + height: 16,
68 + width: 16,
69 + color: Theme.of(context)
70 + .extension<CakeMenuTheme>()!
71 + .settingActionsIconColor,
72 + ),
73 + SizedBox(width: 16),
74 + Expanded(
75 + child: Text(
76 + title,
77 + style: TextStyle(
78 + color: color,
79 + fontSize: 16,
80 + fontWeight: FontWeight.bold,
81 + ),
82 ),
83 ),
72 - ),
73 - if (isArrowVisible)
74 - Icon(
75 - Icons.arrow_forward_ios,
76 - color: color,
77 - size: 16,
78 - )
79 - ],
84 + if(isArrowVisible)
85 + Icon(
86 + Icons.arrow_forward_ios,
87 + color: Colors.grey,
88 + size: 16,
89 + )
90 + ],
91 + ),
92 ),
93 ),
94 );
95 }
84 -}
96 +}
\ No newline at end of file
lib/src/widgets/setting_actions.dart
-14
@@ -17,7 +17,6 @@ class SettingActions {
17
18 static List<SettingActions> all = [
19 connectionSettingAction,
20 - walletSettingAction,
20 addressBookSettingAction,
21 silentPaymentsSettingAction,
22 litecoinMwebSettingAction,
@@ -31,7 +30,6 @@ class SettingActions {
30
31 static List<SettingActions> desktopSettings = [
32 connectionSettingAction,
34 - walletSettingAction,
33 addressBookSettingAction,
34 silentPaymentsSettingAction,
35 securityBackupSettingAction,
@@ -77,18 +75,6 @@ class SettingActions {
75 },
76 );
77
80 - static SettingActions walletSettingAction = SettingActions._(
81 - key: ValueKey('dashboard_page_menu_widget_wallet_menu_button_key'),
82 - name: (context) => S.of(context).wallets,
83 - image: 'assets/images/wallet_menu.png',
84 - onTap: (BuildContext context) {
85 - Navigator.of(context).pushNamed(Routes.walletList, arguments: (_) {
86 - Navigator.of(context).pop(); // pops wallet list
87 - Navigator.of(context).pop(); // pops drawer
88 - });
89 - },
90 - );
91 -
78 static SettingActions addressBookSettingAction = SettingActions._(
79 key: ValueKey('dashboard_page_menu_widget_address_book_button_key'),
80 name: (context) => S.of(context).address_book_menu,
lib/src/widgets/standard_list.dart
+15 -10
@@ -21,16 +21,20 @@ class StandardListRow extends StatelessWidget {
21 Widget build(BuildContext context) {
22 final leading = buildLeading(context);
23 final trailing = buildTrailing(context);
24 -
25 - return InkWell(
26 - onTap: () => onTap?.call(context),
27 - child: Container(
24 + return Container(
25 height: 56,
29 - padding: EdgeInsets.only(left: 24, right: 24),
30 - decoration: decoration ??
31 - BoxDecoration(
32 - color: Theme.of(context).colorScheme.background,
26 + padding: EdgeInsets.only(left: 12, right: 12),
27 + child: TextButton(
28 + onPressed: () => onTap?.call(context),
29 + style: ButtonStyle(
30 + //backgroundColor: MaterialStateProperty.all(Theme.of(context).cardColor),
31 + shape: MaterialStateProperty.all(
32 + RoundedRectangleBorder(
33 + borderRadius: BorderRadius.all(Radius.circular(10)
34 + ),
35 ),
36 + ),
37 + ),
38 child: Row(
39 mainAxisAlignment: MainAxisAlignment.spaceBetween,
40 children: <Widget>[
@@ -97,10 +101,10 @@ class StandardListSeparator extends StatelessWidget {
101 return Container(
102 height: height,
103 padding: padding,
100 - color: Theme.of(context).colorScheme.background,
104 + color: Colors.transparent,
105 child: Container(
106 height: height,
103 - color: Theme.of(context).extension<CakeTextTheme>()!.textfieldUnderlineColor,
107 + color: Colors.transparent,
108 ),
109 );
110 }
@@ -140,6 +144,7 @@ class SectionStandardList extends StatelessWidget {
144
145 final int sectionCount;
146 final bool hasTopSeparator;
147 +
148 final int Function(int sectionIndex) itemCounter;
149 final Widget Function(int sectionIndex, int itemIndex) itemBuilder;
150 final Widget Function(int sectionIndex)? sectionTitleBuilder;
lib/themes/monero_dark_theme.dart
+3
@@ -21,6 +21,7 @@ import 'package:cake_wallet/themes/extensions/send_page_theme.dart';
21 import 'package:cake_wallet/themes/extensions/sync_indicator_theme.dart';
22 import 'package:cake_wallet/themes/extensions/transaction_trade_theme.dart';
23 import 'package:cake_wallet/themes/extensions/wallet_list_theme.dart';
24 +import 'package:cake_wallet/themes/theme_base.dart';
25 import 'package:cake_wallet/generated/i18n.dart';
26 import 'package:cake_wallet/palette.dart';
27 import 'package:flutter/material.dart';
@@ -28,6 +29,8 @@ import 'package:flutter/material.dart';
29 class MoneroDarkTheme extends DarkTheme {
30 MoneroDarkTheme({required int raw}) : super(raw: raw);
31
32 + @override
33 + ThemeType get type => ThemeType.oled;
34 @override
35 String get title => S.current.monero_dark_theme;
36 @override
lib/themes/theme_base.dart
+1 -1
@@ -27,7 +27,7 @@ import 'package:cake_wallet/themes/extensions/transaction_trade_theme.dart';
27 import 'package:cake_wallet/themes/extensions/wallet_list_theme.dart';
28 import 'package:flutter/material.dart';
29
30 -enum ThemeType { light, bright, dark }
30 +enum ThemeType { light, bright, dark, oled}
31
32 abstract class ThemeBase {
33 ThemeBase({required this.raw}) {
lib/view_model/dashboard/dashboard_view_model.dart
+34 -4
@@ -52,6 +52,8 @@ import 'package:http/http.dart' as http;
52 import 'package:mobx/mobx.dart';
53 import 'package:shared_preferences/shared_preferences.dart';
54
55 +import '../../themes/theme_base.dart';
56 +
57 part 'dashboard_view_model.g.dart';
58
59 class DashboardViewModel = DashboardViewModelBase with _$DashboardViewModel;
@@ -70,7 +72,7 @@ abstract class DashboardViewModelBase with Store {
72 required this.sharedPreferences,
73 required this.keyService})
74 : hasTradeAction = false,
73 - hasExchangeAction = false,
75 + hasSwapAction = false,
76 isShowFirstYatIntroduction = false,
77 isShowSecondYatIntroduction = false,
78 isShowThirdYatIntroduction = false,
@@ -480,6 +482,34 @@ abstract class DashboardViewModelBase with Store {
482 @computed
483 bool get hasEnabledMwebBefore => settingsStore.hasEnabledMwebBefore;
484
485 + @action
486 + double getShadowSpread() {
487 + double spread = 0;
488 + if (settingsStore.currentTheme.type == ThemeType.bright)
489 + spread = 0;
490 + else if (settingsStore.currentTheme.type == ThemeType.light)
491 + spread = 0;
492 + else if (settingsStore.currentTheme.type == ThemeType.dark)
493 + spread = 0;
494 + else if (settingsStore.currentTheme.type == ThemeType.oled)
495 + spread = 0;
496 + return spread;
497 + }
498 +
499 + @action
500 + double getShadowBlur() {
501 + double blur = 0;
502 + if (settingsStore.currentTheme.type == ThemeType.bright)
503 + blur = 0;
504 + else if (settingsStore.currentTheme.type == ThemeType.light)
505 + blur = 0;
506 + else if (settingsStore.currentTheme.type == ThemeType.dark)
507 + blur = 0;
508 + else if (settingsStore.currentTheme.type == ThemeType.oled)
509 + blur = 0;
510 + return blur;
511 + }
512 +
513 @action
514 void setMwebEnabled() {
515 if (!hasMweb) {
@@ -530,10 +560,10 @@ abstract class DashboardViewModelBase with Store {
560 void furtherShowYatPopup(bool shouldShow) => settingsStore.shouldShowYatPopup = shouldShow;
561
562 @computed
533 - bool get isEnabledExchangeAction => settingsStore.exchangeStatus != ExchangeApiMode.disabled;
563 + bool get isEnabledSwapAction => settingsStore.exchangeStatus != ExchangeApiMode.disabled;
564
565 @observable
536 - bool hasExchangeAction;
566 + bool hasSwapAction;
567
568 @computed
569 bool get isEnabledTradeAction => !settingsStore.disableTradeOption;
@@ -736,7 +766,7 @@ abstract class DashboardViewModelBase with Store {
766 }
767
768 void updateActions() {
739 - hasExchangeAction = !isHaven;
769 + hasSwapAction = !isHaven;
770 hasTradeAction = !isHaven;
771 }
772
lib/view_model/settings/display_settings_view_model.dart
+7
@@ -37,6 +37,9 @@ abstract class DisplaySettingsViewModelBase with Store {
37 @computed
38 bool get disabledFiatApiMode => _settingsStore.fiatApiMode == FiatApiMode.disabled;
39
40 + @computed
41 + bool get showAddressBookPopup => _settingsStore.showAddressBookPopupEnabled;
42 +
43 @action
44 void setBalanceDisplayMode(BalanceDisplayMode value) => _settingsStore.balanceDisplayMode = value;
45
@@ -66,4 +69,8 @@ abstract class DisplaySettingsViewModelBase with Store {
69 void setShouldShowMarketPlaceInDashbaord(bool value) {
70 _settingsStore.shouldShowMarketPlaceInDashboard = value;
71 }
72 +
73 + @action
74 + void setShowAddressBookPopup(bool value) => _settingsStore.showAddressBookPopupEnabled = value;
75 +
76 }
lib/view_model/settings/other_settings_view_model.dart
-7
@@ -60,10 +60,6 @@ abstract class OtherSettingsViewModelBase with Store {
60 bool get changeRepresentativeEnabled =>
61 _wallet.type == WalletType.nano || _wallet.type == WalletType.banano;
62
63 - @computed
64 - bool get showAddressBookPopup => _settingsStore.showAddressBookPopupEnabled;
65 -
66 -
63 @computed
64 bool get displayTransactionPriority => !(changeRepresentativeEnabled ||
65 _wallet.type == WalletType.solana ||
@@ -118,9 +114,6 @@ abstract class OtherSettingsViewModelBase with Store {
114 return customItem != null ? priorities.indexOf(customItem) : null;
115 }
116
121 - @action
122 - void setShowAddressBookPopup(bool value) => _settingsStore.showAddressBookPopupEnabled = value;
123 -
117 int? get maxCustomFeeRate {
118 if (_wallet.type == WalletType.bitcoin) {
119 return bitcoin!.getMaxCustomFeeRate(_wallet);
res/values/strings_ar.arb
+3 -2
@@ -294,7 +294,7 @@
294 "etherscan_history": "Etherscan تاريخ",
295 "event": "ﺙﺪﺣ",
296 "events": "ﺙﺍﺪﺣﻷﺍ",
297 - "exchange": "تبديل",
297 + "exchange": "تبادل",
298 "exchange_incorrect_current_wallet_for_xmr": "إذا كنت ترغب في تبديل XMR من رصيد محفظة الكعكة ، فيرجى التبديل إلى محفظة Monero أولاً.",
299 "exchange_new_template": "قالب جديد",
300 "exchange_provider_unsupported": "${providerName} لم يعد مدعومًا!",
@@ -733,7 +733,7 @@
733 "share_address": "شارك العنوان",
734 "shared_seed_wallet_groups": "مجموعات محفظة البذور المشتركة",
735 "show": "يعرض",
736 - "show_address_book_popup": "عرض \"إضافة إلى كتاب العناوين\" المنبثقة بعد الإرسال",
736 + "show_address_book_popup": "عرض دفتر العناوين المنبثقة",
737 "show_balance": "اضغط لفترة طويلة لإظهار التوازن",
738 "show_balance_toast": "اضغط لفترة طويلة لإخفاء أو إظهار التوازن",
739 "show_details": "اظهر التفاصيل",
@@ -781,6 +781,7 @@
781 "support_title_guides": "مستندات محفظة كعكة",
782 "support_title_live_chat": "الدعم المباشر",
783 "support_title_other_links": "روابط دعم أخرى",
784 + "swap": "تبديل",
785 "sweeping_wallet": "كنس المحفظة",
786 "sweeping_wallet_alert": "لن يستغرق هذا وقتًا طويلاً. لا تترك هذه الشاشة وإلا فقد يتم فقد أموال سويبت",
787 "switchToETHWallet": "ﻯﺮﺧﺃ ﺓﺮﻣ ﺔﻟﻭﺎﺤﻤﻟﺍﻭ Ethereum ﺔﻈﻔﺤﻣ ﻰﻟﺇ ﻞﻳﺪﺒﺘﻟﺍ ﻰﺟﺮﻳ",
res/values/strings_bg.arb
+3 -2
@@ -294,7 +294,7 @@
294 "etherscan_history": "История на Etherscan",
295 "event": "Събитие",
296 "events": "събития",
297 - "exchange": "Разметка",
297 + "exchange": "Обмен",
298 "exchange_incorrect_current_wallet_for_xmr": "Ако искате да смените XMR от вашия баланс на портфейла на тортата Monero, моля, преминете първо към вашия портфейл Monero.",
299 "exchange_new_template": "Нов шаблон",
300 "exchange_provider_unsupported": "${providerName} вече не се поддържа!",
@@ -733,7 +733,7 @@
733 "share_address": "Сподели адрес",
734 "shared_seed_wallet_groups": "Споделени групи за портфейли за семена",
735 "show": "Показване",
736 - "show_address_book_popup": "Показване на изскачането на „Добавяне към адресната книга“ след изпращане",
736 + "show_address_book_popup": "Показване на изскачащ прозорец на адресна книга",
737 "show_balance": "Дълго натиснете, за да покажете баланса",
738 "show_balance_toast": "Дълго натискане, за да се скрие или покаже баланс",
739 "show_details": "Показване на подробностите",
@@ -781,6 +781,7 @@
781 "support_title_guides": "Документи за портфейл за торта",
782 "support_title_live_chat": "Подкрепа на живо",
783 "support_title_other_links": "Други връзки за поддръжка",
784 + "swap": "Разметка",
785 "sweeping_wallet": "Метещ портфейл",
786 "sweeping_wallet_alert": "Това не трябва да отнема много време. Не оставяйте този екран или пометените средства могат да бъдат загубени.",
787 "switchToETHWallet": "Моля, преминете към портфейл Ethereum и опитайте отново",
res/values/strings_cs.arb
+3 -2
@@ -294,7 +294,7 @@
294 "etherscan_history": "Historie Etherscanu",
295 "event": "událost",
296 "events": "Události",
297 - "exchange": "Swap",
297 + "exchange": "Výměna",
298 "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.",
299 "exchange_new_template": "Nová šablona",
300 "exchange_provider_unsupported": "${providerName} již není podporováno!",
@@ -733,7 +733,7 @@
733 "share_address": "Sdílet adresu",
734 "shared_seed_wallet_groups": "Skupiny sdílených semen",
735 "show": "Show",
736 - "show_address_book_popup": "Po odeslání zobrazíte vyskakovací okno „Přidat do adresáře“",
736 + "show_address_book_popup": "Zobrazit vyskakovací okno",
737 "show_balance": "Dlouhý stisknutí zobrazí rovnováhu",
738 "show_balance_toast": "Dlouhý stiskněte pro skrytí nebo zobrazení rovnováhy",
739 "show_details": "Zobrazit detaily",
@@ -781,6 +781,7 @@
781 "support_title_guides": "Dokumenty peněženky dortu",
782 "support_title_live_chat": "Živá podpora",
783 "support_title_other_links": "Další odkazy na podporu",
784 + "swap": "Swap",
785 "sweeping_wallet": "Zametací peněženka",
786 "sweeping_wallet_alert": "To by nemělo trvat dlouho. Nenechávejte tuto obrazovku, jinak mohou být ztraceny prostředky.",
787 "switchToETHWallet": "Přejděte na peněženku Ethereum a zkuste to znovu",
res/values/strings_de.arb
+2 -1
@@ -514,8 +514,8 @@
514 "placeholder_transactions": "Ihre Transaktionen werden hier angezeigt",
515 "please_fill_totp": "Bitte geben Sie den 8-stelligen Code ein, der auf Ihrem anderen Gerät vorhanden ist",
516 "please_make_selection": "Bitte treffen Sie unten eine Auswahl zum Erstellen oder Wiederherstellen Ihrer Wallet.",
517 - "Please_reference_document": "Weitere Informationen finden Sie in den Dokumenten unten.",
517 "please_reference_document": "Bitte verweisen Sie auf die folgenden Dokumente, um weitere Informationen zu erhalten.",
518 + "Please_reference_document": "Weitere Informationen finden Sie in den Dokumenten unten.",
519 "please_select": "Bitte auswählen:",
520 "please_select_backup_file": "Bitte wählen Sie die Sicherungsdatei und geben Sie das Sicherungskennwort ein.",
521 "please_try_to_connect_to_another_node": "Bitte versuchen Sie, sich mit einem anderen Knoten zu verbinden",
@@ -782,6 +782,7 @@
782 "support_title_guides": "Cake Wallet Docs",
783 "support_title_live_chat": "Live Support",
784 "support_title_other_links": "Andere Support-Links",
785 + "swap": "Tauschen",
786 "sweeping_wallet": "Wallet leeren",
787 "sweeping_wallet_alert": "Das sollte nicht lange dauern. VERLASSEN SIE DIESEN BILDSCHIRM NICHT, ANDERNFALLS KÖNNEN DIE GELDER VERLOREN GEHEN",
788 "switchToETHWallet": "Bitte wechseln Sie zu einem Ethereum-Wallet und versuchen Sie es erneut",
res/values/strings_en.arb
+3 -2
@@ -294,7 +294,7 @@
294 "etherscan_history": "Etherscan history",
295 "event": "Event",
296 "events": "Events",
297 - "exchange": "Swap",
297 + "exchange": "Exchange",
298 "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.",
299 "exchange_new_template": "New template",
300 "exchange_provider_unsupported": "${providerName} is no longer supported!",
@@ -734,7 +734,7 @@
734 "share_address": "Share address",
735 "shared_seed_wallet_groups": "Shared Seed Wallet Groups",
736 "show": "Show",
737 - "show_address_book_popup": "Show 'Add to Address Book' popup after sending",
737 + "show_address_book_popup": "Show Address Book popup",
738 "show_balance": "Long Press to Show Balance",
739 "show_balance_toast": "Long press to hide or show balance",
740 "show_details": "Show Details",
@@ -782,6 +782,7 @@
782 "support_title_guides": "Cake Wallet docs",
783 "support_title_live_chat": "Live support",
784 "support_title_other_links": "Other support links",
785 + "swap": "Swap",
786 "sweeping_wallet": "Sweeping wallet",
787 "sweeping_wallet_alert": "This shouldn’t take long. DO NOT LEAVE THIS SCREEN OR THE SWEPT FUNDS MAY BE LOST.",
788 "switchToETHWallet": "Please switch to an Ethereum wallet and try again",
res/values/strings_es.arb
+3 -2
@@ -294,7 +294,7 @@
294 "etherscan_history": "historia de etherscan",
295 "event": "Evento",
296 "events": "Eventos",
297 - "exchange": "Intercambiar",
297 + "exchange": "Intercambio",
298 "exchange_incorrect_current_wallet_for_xmr": "Si desea intercambiar XMR desde su billetera de pastel Monero Balance, primero cambie a su billetera Monero.",
299 "exchange_new_template": "Nueva plantilla",
300 "exchange_provider_unsupported": "¡${providerName} ya no es compatible!",
@@ -734,7 +734,7 @@
734 "share_address": "Compartir dirección",
735 "shared_seed_wallet_groups": "Grupos de billetera de semillas compartidas",
736 "show": "Espectáculo",
737 - "show_address_book_popup": "Mostrar ventana emergente 'Agregar a la libreta de direcciones' después de enviar",
737 + "show_address_book_popup": "Mostrar la ventana emergente de la libreta de direcciones",
738 "show_balance": "Prensa larga para mostrar equilibrio",
739 "show_balance_toast": "Prensa larga para esconder o mostrar equilibrio",
740 "show_details": "Mostrar detalles",
@@ -782,6 +782,7 @@
782 "support_title_guides": "Documentos de billetera de pastel",
783 "support_title_live_chat": "Soporte en tiempo real",
784 "support_title_other_links": "Otros enlaces de soporte",
785 + "swap": "Intercambio",
786 "sweeping_wallet": "Barrer billetera (gastar todos los fondos disponibles)",
787 "sweeping_wallet_alert": "Esto no debería llevar mucho tiempo. NO DEJES ESTA PANTALLA O SE PUEDEN PERDER LOS FONDOS BARRIDOS",
788 "switchToETHWallet": "Cambia a una billetera Ethereum e inténtelo nuevamente.",
res/values/strings_fr.arb
+3 -2
@@ -294,7 +294,7 @@
294 "etherscan_history": "Historique Etherscan",
295 "event": "Événement",
296 "events": "Événements",
297 - "exchange": "Échanger",
297 + "exchange": "Échange",
298 "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.",
299 "exchange_new_template": "Nouveau modèle d'échange",
300 "exchange_provider_unsupported": "${providerName} n'est plus pris en charge !",
@@ -733,7 +733,7 @@
733 "share_address": "Partager l'adresse",
734 "shared_seed_wallet_groups": "Groupes de portefeuilles partagés",
735 "show": "Montrer",
736 - "show_address_book_popup": "Afficher la popup `` Ajouter au carnet d'adresses '' après avoir envoyé",
736 + "show_address_book_popup": "Afficher la fenêtre contextuelle du carnet d'adresses",
737 "show_balance": "Longue presse pour montrer l'équilibre",
738 "show_balance_toast": "Longue appuyez sur pour masquer ou afficher l'équilibre",
739 "show_details": "Afficher les détails",
@@ -781,6 +781,7 @@
781 "support_title_guides": "Docs de portefeuille à gâteau",
782 "support_title_live_chat": "Support en direct",
783 "support_title_other_links": "Autres liens d'assistance",
784 + "swap": "Échanger",
785 "sweeping_wallet": "Portefeuille (wallet) de consolidation",
786 "sweeping_wallet_alert": "Cela ne devrait pas prendre longtemps. NE QUITTEZ PAS CET ÉCRAN OU LES FONDS TRANSFÉRÉS POURRAIENT ÊTRE PERDUS.",
787 "switchToETHWallet": "Veuillez passer à un portefeuille (wallet) Ethereum et réessayer",
res/values/strings_ha.arb
+3 -2
@@ -294,7 +294,7 @@
294 "etherscan_history": "Etherscan tarihin kowane zamani",
295 "event": "Lamarin",
296 "events": "Abubuwan da suka faru",
297 - "exchange": "Musya",
297 + "exchange": "Canji",
298 "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.",
299 "exchange_new_template": "Sabon template",
300 "exchange_provider_unsupported": "${providerName}",
@@ -735,7 +735,7 @@
735 "share_address": "Raba adireshin",
736 "shared_seed_wallet_groups": "Raba ƙungiya walat",
737 "show": "Nuna",
738 - "show_address_book_popup": "Nuna 'ƙara don magance littafin' Popup bayan aikawa",
738 + "show_address_book_popup": "Nuna littafin littafin adireshi",
739 "show_balance": "Dogon latsawa don nuna ma'auni",
740 "show_balance_toast": "Latsa latsawa don ɓoye ko nuna ma'auni",
741 "show_details": "Nuna Cikakkun bayanai",
@@ -783,6 +783,7 @@
783 "support_title_guides": "Docs Bakin",
784 "support_title_live_chat": "Tallafi na Live",
785 "support_title_other_links": "Sauran hanyoyin tallafi",
786 + "swap": "Musya",
787 "sweeping_wallet": "Kashi na kasa",
788 "sweeping_wallet_alert": "Wannan ba zai samu lokacin mai tsaski. KADA KA SAMU KUNGIYARAN KUHON, ZAMAN DADIN BANKUNCI ZAI HAŘA",
789 "switchToETHWallet": "Da fatan za a canza zuwa walat ɗin Ethereum kuma a sake gwadawa",
res/values/strings_hi.arb
+4 -3
@@ -294,7 +294,7 @@
294 "etherscan_history": "इथरस्कैन इतिहास",
295 "event": "आयोजन",
296 "events": "आयोजन",
297 - "exchange": "बदलना",
297 + "exchange": "अदला-बदली",
298 "exchange_incorrect_current_wallet_for_xmr": "यदि आप अपने केक वॉलेट मोनेरो बैलेंस से XMR को स्वैप करना चाहते हैं, तो कृपया पहले अपने मोनेरो वॉलेट पर स्विच करें।",
299 "exchange_new_template": "नया टेम्पलेट",
300 "exchange_provider_unsupported": "${providerName} अब समर्थित नहीं है!",
@@ -735,9 +735,9 @@
735 "share_address": "पता साझा करें",
736 "shared_seed_wallet_groups": "साझा बीज बटुए समूह",
737 "show": "दिखाओ",
738 - "show_address_book_popup": "भेजने के बाद 'एड एड्रेस बुक' पॉपअप दिखाएं",
738 + "show_address_book_popup": "पता बुक पॉपअप दिखाएं",
739 "show_balance": "बैलेंस दिखाने के लिए लॉन्ग प्रेस",
740 - "show_balance_toast": "बैलेंस को छिपाने या दिखाने के लिए लॉन्ग प्रेस",
740 + "show_balance_toast": "संतुलन को छिपाने या दिखाने के लिए लॉन्ग प्रेस",
741 "show_details": "विवरण दिखाएं",
742 "show_keys": "बीज / कुंजियाँ दिखाएँ",
743 "show_market_place": "बाज़ार दिखाएँ",
@@ -783,6 +783,7 @@
783 "support_title_guides": "केक बटुए डॉक्स",
784 "support_title_live_chat": "लाइव सहायता",
785 "support_title_other_links": "अन्य समर्थन लिंक",
786 + "swap": "बदलना",
787 "sweeping_wallet": "स्वीपिंग वॉलेट",
788 "sweeping_wallet_alert": "इसमें अधिक समय नहीं लगना चाहिए। इस स्क्रीन को न छोड़ें या स्वैप्ट फंड खो सकते हैं",
789 "switchToETHWallet": "कृपया एथेरियम वॉलेट पर स्विच करें और पुनः प्रयास करें",
res/values/strings_hr.arb
+3 -2
@@ -294,7 +294,7 @@
294 "etherscan_history": "Etherscan povijest",
295 "event": "Događaj",
296 "events": "Događaji",
297 - "exchange": "Zamjena",
297 + "exchange": "Razmjena",
298 "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.",
299 "exchange_new_template": "Novi predložak",
300 "exchange_provider_unsupported": "${providerName} više nije podržan!",
@@ -733,7 +733,7 @@
733 "share_address": "Podijeli adresu",
734 "shared_seed_wallet_groups": "Zajedničke grupe za sjeme novčanika",
735 "show": "Pokazati",
736 - "show_address_book_popup": "Pokažite \"dodaj u adresar\" skočni prozor nakon slanja",
736 + "show_address_book_popup": "Prikaži Popup adresara",
737 "show_balance": "Dugački pritisak za pokazivanje ravnoteže",
738 "show_balance_toast": "Dugo pritisnite da biste sakrili ili pokazali ravnotežu",
739 "show_details": "Prikaži pojedinosti",
@@ -781,6 +781,7 @@
781 "support_title_guides": "Dokumenti s kolačem kolača",
782 "support_title_live_chat": "Podrška uživo",
783 "support_title_other_links": "Ostale veze za podršku",
784 + "swap": "Mijenjati",
785 "sweeping_wallet": "Čisti novčanik",
786 "sweeping_wallet_alert": "Ovo ne bi trebalo dugo trajati. NE NAPUŠTAJTE OVAJ ZASLON INAČE SE POBREŠENA SREDSTVA MOGU IZGUBITI",
787 "switchToETHWallet": "Prijeđite na Ethereum novčanik i pokušajte ponovno",
res/values/strings_hy.arb
+3 -2
@@ -294,7 +294,7 @@
294 "etherscan_history": "Etherscan պատմություն",
295 "event": "Իրադարձություն",
296 "events": "Իրադարձություններ",
297 - "exchange": "Փոխանակել",
297 + "exchange": "Փոխանակում",
298 "exchange_incorrect_current_wallet_for_xmr": "Եթե ​​ցանկանում եք փոխանակել XMR ձեր տորթի դրամապանակից Monero Relandal- ից, խնդրում ենք նախ անցնել ձեր Monero դրամապանակին:",
299 "exchange_new_template": "Նոր տեսակ",
300 "exchange_provider_unsupported": "${providerName} այլևս չի ապահովվում",
@@ -733,7 +733,7 @@
733 "share_address": "Կիսվել հասցեով",
734 "shared_seed_wallet_groups": "Համօգտագործված սերմերի դրամապանակների խմբեր",
735 "show": "Ցուցահանդես",
736 - "show_address_book_popup": "Show ույց տալ «Ուղարկելուց հետո« Հասցեների գրքի »թռուցիկ",
736 + "show_address_book_popup": "Show ուցադրել հասցեի գրքի թռուցիկ",
737 "show_balance": "Երկար մամուլ, հավասարակշռությունը ցույց տալու համար",
738 "show_balance_toast": "Երկար սեղմեք `հավասարակշռությունը թաքցնելու կամ ցույց տալու համար",
739 "show_details": "Ցուցադրել մանրամասներ",
@@ -781,6 +781,7 @@
781 "support_title_guides": "Տորթ դրամապանակի փաստաթղթեր",
782 "support_title_live_chat": "Անմիջական աջակցություն",
783 "support_title_other_links": "Այլ աջակցության հղումներ",
784 + "swap": "Փոխանակել",
785 "sweeping_wallet": "Դրամապանակը մաքրվում է",
786 "sweeping_wallet_alert": "Սա չի տևի երկար։ Խնդրում ենք չլքել այս էկրանը կամ մաքրված միջոցները կկորչեն։",
787 "switchToETHWallet": "Խնդրում ենք անցնել Ethereum դրամապանակ և փորձել կրկին",
res/values/strings_id.arb
+3 -2
@@ -294,7 +294,7 @@
294 "etherscan_history": "Sejarah Etherscan",
295 "event": "Peristiwa",
296 "events": "Acara",
297 - "exchange": "Menukar",
297 + "exchange": "Menukarkan",
298 "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.",
299 "exchange_new_template": "Template baru",
300 "exchange_provider_unsupported": "${providerName} tidak lagi didukung!",
@@ -736,7 +736,7 @@
736 "share_address": "Bagikan alamat",
737 "shared_seed_wallet_groups": "Kelompok dompet benih bersama",
738 "show": "Menunjukkan",
739 - "show_address_book_popup": "Tampilkan popup 'Tambahkan ke Alamat' setelah mengirim",
739 + "show_address_book_popup": "Tampilkan Alamat Buku Popup",
740 "show_balance": "PRESS PANJANG UNTUK MENUNJUKKAN Balance",
741 "show_balance_toast": "Tekan panjang untuk menyembunyikan atau menunjukkan keseimbangan",
742 "show_details": "Tampilkan Rincian",
@@ -784,6 +784,7 @@
784 "support_title_guides": "DOKS DOKO CAKE",
785 "support_title_live_chat": "Dukungan langsung",
786 "support_title_other_links": "Tautan dukungan lainnya",
787 + "swap": "Menukar",
788 "sweeping_wallet": "Dompet menyapu",
789 "sweeping_wallet_alert": "Ini seharusnya tidak memakan waktu lama. Jangan tinggalkan layar ini atau dana swept mungkin hilang.",
790 "switchToETHWallet": "Silakan beralih ke dompet Ethereum dan coba lagi",
res/values/strings_it.arb
+2 -1
@@ -735,7 +735,7 @@
735 "share_address": "Condividi indirizzo",
736 "shared_seed_wallet_groups": "Gruppi di portafoglio di semi condivisi",
737 "show": "Spettacolo",
738 - "show_address_book_popup": "Mostra il popup \"Aggiungi alla rubrica\" ​​dopo l'invio",
738 + "show_address_book_popup": "Mostra popup della rubrica",
739 "show_balance": "Lunga stampa per mostrare l'equilibrio",
740 "show_balance_toast": "A lungo pressa per nascondere o mostrare l'equilibrio",
741 "show_details": "Mostra dettagli",
@@ -783,6 +783,7 @@
783 "support_title_guides": "Documenti del portafoglio per torta",
784 "support_title_live_chat": "Supporto dal vivo",
785 "support_title_other_links": "Altri collegamenti di supporto",
786 + "swap": "Scambio",
787 "sweeping_wallet": "Portafoglio ampio",
788 "sweeping_wallet_alert": "Questo non dovrebbe richiedere molto tempo. NON LASCIARE QUESTA SCHERMATA O I FONDI SPAZZATI POTREBBERO ANDARE PERSI",
789 "switchToETHWallet": "Passa a un portafoglio Ethereum e riprova",
res/values/strings_ja.arb
+3 -2
@@ -294,7 +294,7 @@
294 "etherscan_history": "イーサスキャンの歴史",
295 "event": "イベント",
296 "events": "イベント",
297 - "exchange": "スワップ",
297 + "exchange": "交換",
298 "exchange_incorrect_current_wallet_for_xmr": "XMRをケーキウォレットモネロバランスから交換したい場合は、最初にMoneroウォレットに切り替えてください。",
299 "exchange_new_template": "新しいテンプレート",
300 "exchange_provider_unsupported": "${providerName}はサポートされなくなりました!",
@@ -734,7 +734,7 @@
734 "share_address": "住所を共有する",
735 "shared_seed_wallet_groups": "共有シードウォレットグループ",
736 "show": "見せる",
737 - "show_address_book_popup": "送信後に「アドレスブックに追加」ポップアップを表示します",
737 + "show_address_book_popup": "アドレス帳のポップアップを表示します",
738 "show_balance": "バランスを示すためにロングプレス",
739 "show_balance_toast": "バランスを隠したり表示したりするためにロングプレス",
740 "show_details": "詳細を表示",
@@ -782,6 +782,7 @@
782 "support_title_guides": "ケーキウォレットドキュメント",
783 "support_title_live_chat": "ライブサポート",
784 "support_title_other_links": "その他のサポートリンク",
785 + "swap": "スワップ",
786 "sweeping_wallet": "スイープウォレット",
787 "sweeping_wallet_alert": "これには時間がかかりません。この画面から離れないでください。そうしないと、スイープ ファンドが失われる可能性があります",
788 "switchToETHWallet": "イーサリアムウォレットに切り替えてもう一度お試しください",
res/values/strings_ko.arb
+2 -1
@@ -733,7 +733,7 @@
733 "share_address": "주소 공유",
734 "shared_seed_wallet_groups": "공유 종자 지갑 그룹",
735 "show": "보여주다",
736 - "show_address_book_popup": "전송 후 '주소 책에 추가'팝업을 표시하십시오",
736 + "show_address_book_popup": "주소록 팝업을 보여주십시오",
737 "show_balance": "균형을 보여주기 위해 긴 언론",
738 "show_balance_toast": "균형을 숨기거나 보여주기 위해 긴 누르십시오",
739 "show_details": "세부정보 표시",
@@ -781,6 +781,7 @@
781 "support_title_guides": "케이크 지갑 문서",
782 "support_title_live_chat": "실시간 지원",
783 "support_title_other_links": "다른 지원 링크",
784 + "swap": "교환",
785 "sweeping_wallet": "스위핑 지갑",
786 "sweeping_wallet_alert": "오래 걸리지 않습니다. 이 화면을 떠나지 마십시오. 그렇지 않으면 스웹트 자금이 손실될 수 있습니다.",
787 "switchToETHWallet": "이더리움 지갑으로 전환한 후 다시 시도해 주세요.",
res/values/strings_my.arb
+2 -1
@@ -733,7 +733,7 @@
733 "share_address": "လိပ်စာမျှဝေပါ။",
734 "shared_seed_wallet_groups": "shared မျိုးစေ့ပိုက်ဆံအိတ်အုပ်စုများ",
735 "show": "ပြသ",
736 - "show_address_book_popup": "ပေးပို့ပြီးနောက် 'address book' popup ကိုပြပါ",
736 + "show_address_book_popup": "လိပ်စာစာအုပ် popup ပြပါ",
737 "show_balance": "ချိန်ခွင်လျှာကိုပြသရန်ရှည်လျားသောစာနယ်ဇင်း",
738 "show_balance_toast": "ချိန်ခွင်လျှာကိုဖျောက်ရန်သို့မဟုတ်ပြသရန်ရှည်လျားသောစာနယ်ဇင်း",
739 "show_details": "အသေးစိတ်ပြ",
@@ -781,6 +781,7 @@
781 "support_title_guides": "ကိတ်မုန့်ပိုက်ဆံအိတ်များ",
782 "support_title_live_chat": "တိုက်ရိုက်ပံ့ပိုးမှု",
783 "support_title_other_links": "အခြားအထောက်အပံ့လင့်များ",
784 + "swap": "လဲလှယ်",
785 "sweeping_wallet": "ိုက်ဆံအိတ် တံမြက်လှည်း",
786 "sweeping_wallet_alert": "ဒါက ကြာကြာမခံသင့်ပါဘူး။ ဤစခရင်ကို ချန်မထားပါနှင့် သို့မဟုတ် ထုတ်ယူထားသော ရန်ပုံငွေများ ဆုံးရှုံးနိုင်သည်",
787 "switchToETHWallet": "ကျေးဇူးပြု၍ Ethereum ပိုက်ဆံအိတ်သို့ ပြောင်းပြီး ထပ်စမ်းကြည့်ပါ။",
res/values/strings_nl.arb
+3 -2
@@ -294,7 +294,7 @@
294 "etherscan_history": "Etherscan-geschiedenis",
295 "event": "Evenement",
296 "events": "Evenementen",
297 - "exchange": "Ruil",
297 + "exchange": "Aandelenbeurs",
298 "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.",
299 "exchange_new_template": "Nieuwe sjabloon",
300 "exchange_provider_unsupported": "${providerName} wordt niet langer ondersteund!",
@@ -733,7 +733,7 @@
733 "share_address": "Deel adres",
734 "shared_seed_wallet_groups": "Gedeelde zaadportelgroepen",
735 "show": "Show",
736 - "show_address_book_popup": "Toon 'Toevoegen aan adresboek' pop -up na verzenden",
736 + "show_address_book_popup": "Toon adresboek pop -up",
737 "show_balance": "Lange pers om evenwicht te tonen",
738 "show_balance_toast": "Lange pers om evenwicht te verbergen of te tonen",
739 "show_details": "Toon details",
@@ -781,6 +781,7 @@
781 "support_title_guides": "Cake -portemonnee documenten",
782 "support_title_live_chat": "Live ondersteuning",
783 "support_title_other_links": "Andere ondersteuningslinks",
784 + "swap": "Ruil",
785 "sweeping_wallet": "Vegende portemonnee",
786 "sweeping_wallet_alert": "Dit duurt niet lang. VERLAAT DIT SCHERM NIET, ANDERS KAN HET SWEPT-GELD VERLOREN WORDEN",
787 "switchToETHWallet": "Schakel over naar een Ethereum-portemonnee en probeer het opnieuw",
res/values/strings_pl.arb
+3 -2
@@ -294,7 +294,7 @@
294 "etherscan_history": "Historia Etherscanu",
295 "event": "Wydarzenie",
296 "events": "Wydarzenia",
297 - "exchange": "Zamieniać",
297 + "exchange": "Giełda",
298 "exchange_incorrect_current_wallet_for_xmr": "Jeśli chcesz zamienić XMR z salda Monero Portfer, najpierw przejdź na portfel Monero.",
299 "exchange_new_template": "Nowy szablon wymiany",
300 "exchange_provider_unsupported": "${providerName} nie jest już obsługiwany!",
@@ -733,7 +733,7 @@
733 "share_address": "Udostępnij adres",
734 "shared_seed_wallet_groups": "Wspólne grupy portfeli nasion",
735 "show": "Pokazywać",
736 - "show_address_book_popup": "Pokaż wysypkę „Dodaj do książki” po wysłaniu",
736 + "show_address_book_popup": "Pokaż okienko książki adresowej",
737 "show_balance": "Długa prasa, aby pokazać równowagę",
738 "show_balance_toast": "Długa naciśnij, aby ukryć lub pokazać równowagę",
739 "show_details": "Pokaż szczegóły",
@@ -781,6 +781,7 @@
781 "support_title_guides": "Dokumenty portfela ciasta",
782 "support_title_live_chat": "Wsparcie na żywo",
783 "support_title_other_links": "Inne linki wsparcia",
784 + "swap": "Zamieniać",
785 "sweeping_wallet": "Zamiatanie portfela",
786 "sweeping_wallet_alert": "To nie powinno zająć dużo czasu. NIE WYCHODŹ Z TEGO EKRANU, W PRZECIWNYM WYPADKU MOŻE ZOSTAĆ UTRACONA ŚRODKI",
787 "switchToETHWallet": "Przejdź na portfel Ethereum i spróbuj ponownie",
res/values/strings_pt.arb
+3 -2
@@ -294,7 +294,7 @@
294 "etherscan_history": "história Etherscan",
295 "event": "Evento",
296 "events": "Eventos",
297 - "exchange": "Trocar",
297 + "exchange": "Intercâmbio",
298 "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.",
299 "exchange_new_template": "Novo modelo",
300 "exchange_provider_unsupported": "${providerName} não é mais suportado!",
@@ -735,7 +735,7 @@
735 "share_address": "Compartilhar endereço",
736 "shared_seed_wallet_groups": "Grupos de carteira de sementes compartilhados",
737 "show": "Mostrar",
738 - "show_address_book_popup": "Mostre pop -up 'Adicionar ao livro de endereços' depois de enviar",
738 + "show_address_book_popup": "Mostrar pop -up de livro de endereços",
739 "show_balance": "Pressione há muito tempo para mostrar o equilíbrio",
740 "show_balance_toast": "Pressione há muito tempo para se esconder ou mostrar equilíbrio",
741 "show_details": "Mostrar detalhes",
@@ -783,6 +783,7 @@
783 "support_title_guides": "Documentos da carteira de bolo",
784 "support_title_live_chat": "Apoio ao vivo",
785 "support_title_other_links": "Outros links de suporte",
786 + "swap": "Trocar",
787 "sweeping_wallet": "Carteira varrendo",
788 "sweeping_wallet_alert": "To nie powinno zająć dużo czasu. NIE WYCHODŹ Z TEGO EKRANU, W PRZECIWNYM WYPADKU MOŻE ZOSTAĆ UTRACONA ŚRODKI",
789 "switchToETHWallet": "Mude para uma carteira Ethereum e tente novamente",
res/values/strings_ru.arb
+3 -2
@@ -294,7 +294,7 @@
294 "etherscan_history": "История Эфириума",
295 "event": "Событие",
296 "events": "События",
297 - "exchange": "Менять",
297 + "exchange": "Обмен",
298 "exchange_incorrect_current_wallet_for_xmr": "Если вы хотите поменять XMR с баланса с кошельком для торта Monero, сначала переключитесь на свой кошелек Monero.",
299 "exchange_new_template": "Новый шаблон",
300 "exchange_provider_unsupported": "${providerName} больше не поддерживается!",
@@ -734,7 +734,7 @@
734 "share_address": "Поделиться адресом",
735 "shared_seed_wallet_groups": "Общие группы кошелька семян",
736 "show": "Показывать",
737 - "show_address_book_popup": "Покажите всплывающее окно «Добавить в адрес адреса» после отправки",
737 + "show_address_book_popup": "Показать адресную книгу всплывающее окно",
738 "show_balance": "Длинная пресса, чтобы показать баланс",
739 "show_balance_toast": "Длинная нажавка, чтобы скрыть или показать баланс",
740 "show_details": "Показать детали",
@@ -782,6 +782,7 @@
782 "support_title_guides": "Корт кошелек документов",
783 "support_title_live_chat": "Живая поддержка",
784 "support_title_other_links": "Другие ссылки на поддержку",
785 + "swap": "Менять",
786 "sweeping_wallet": "Подметание кошелька",
787 "sweeping_wallet_alert": "Это не должно занять много времени. НЕ ПОКИДАЙТЕ ЭТОТ ЭКРАН, ИНАЧЕ ВЫЧИСЛЕННЫЕ СРЕДСТВА МОГУТ БЫТЬ ПОТЕРЯНЫ",
788 "switchToETHWallet": "Пожалуйста, переключитесь на кошелек Ethereum и повторите попытку.",
res/values/strings_th.arb
+2 -1
@@ -733,7 +733,7 @@
733 "share_address": "แชร์ที่อยู่",
734 "shared_seed_wallet_groups": "กลุ่มกระเป๋าเงินที่ใช้ร่วมกัน",
735 "show": "แสดง",
736 - "show_address_book_popup": "แสดง 'เพิ่มในสมุดรายชื่อ' ป๊อปอัพหลังจากส่ง",
736 + "show_address_book_popup": "แสดงสมุดที่อยู่ป๊อปอัพ",
737 "show_balance": "กดยาวเพื่อแสดงความสมดุล",
738 "show_balance_toast": "กดนานเพื่อซ่อนหรือแสดงความสมดุล",
739 "show_details": "แสดงรายละเอียด",
@@ -781,6 +781,7 @@
781 "support_title_guides": "เอกสารกระเป๋าเงินเค้ก",
782 "support_title_live_chat": "การสนับสนุนสด",
783 "support_title_other_links": "ลิงค์สนับสนุนอื่น ๆ",
784 + "swap": "แลกเปลี่ยน",
785 "sweeping_wallet": "กวาดกระเป๋าสตางค์",
786 "sweeping_wallet_alert": "การดำเนินการนี้ใช้เวลาไม่นาน อย่าออกจากหน้าจอนี้ มิฉะนั้นเงินที่กวาดไปอาจสูญหาย",
787 "switchToETHWallet": "โปรดเปลี่ยนไปใช้กระเป๋าเงิน Ethereum แล้วลองอีกครั้ง",
res/values/strings_tl.arb
+2 -1
@@ -733,7 +733,7 @@
733 "share_address": "Ibahagi ang address",
734 "shared_seed_wallet_groups": "Ibinahaging mga pangkat ng pitaka ng binhi",
735 "show": "Ipakita",
736 - "show_address_book_popup": "Ipakita ang popup na 'Idagdag sa Address Book' pagkatapos magpadala",
736 + "show_address_book_popup": "Ipakita ang Address Book Popup",
737 "show_balance": "Mahabang pindutin upang ipakita ang balanse",
738 "show_balance_toast": "Mahabang pindutin upang itago o ipakita ang balanse",
739 "show_details": "Ipakita ang mga detalye",
@@ -781,6 +781,7 @@
781 "support_title_guides": "Cake wallet doc",
782 "support_title_live_chat": "Live na suporta",
783 "support_title_other_links": "Iba pang mga link sa suporta",
784 + "swap": "Palitan",
785 "sweeping_wallet": "Sweeping wallet",
786 "sweeping_wallet_alert": "Hindi ito dapat magtagal. HUWAG iwanan ang screen na ito o maaaring mawala ang mga pondo.",
787 "switchToETHWallet": "Mangyaring lumipat sa isang Ethereum wallet at subukang muli",
res/values/strings_tr.arb
+3 -2
@@ -294,7 +294,7 @@
294 "etherscan_history": "Etherscan geçmişi",
295 "event": "Etkinlik",
296 "events": "Olaylar",
297 - "exchange": "Takas",
297 + "exchange": "Değişme",
298 "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.",
299 "exchange_new_template": "Yeni şablon",
300 "exchange_provider_unsupported": "${providerName} artık desteklenmiyor!",
@@ -733,7 +733,7 @@
733 "share_address": "Adresi paylaş",
734 "shared_seed_wallet_groups": "Paylaşılan tohum cüzdan grupları",
735 "show": "Göstermek",
736 - "show_address_book_popup": "Gönderdikten sonra 'adres defterine ekle' açılır",
736 + "show_address_book_popup": "Adres Kitabı Popup'ı Göster",
737 "show_balance": "Dengeyi Göstermek İçin Uzun Basın",
738 "show_balance_toast": "Dengeyi gizlemek veya göstermek için uzun basın",
739 "show_details": "Detayları Göster",
@@ -781,6 +781,7 @@
781 "support_title_guides": "Kek Cüzdan Dokümanlar",
782 "support_title_live_chat": "Canlı destek",
783 "support_title_other_links": "Diğer destek bağlantıları",
784 + "swap": "Takas",
785 "sweeping_wallet": "Süpürme cüzdanı",
786 "sweeping_wallet_alert": "Bu uzun sürmemeli. BU EKRANDAN BIRAKMAYIN YOKSA SÜPÜRÜLEN FONLAR KAYBOLABİLİR",
787 "switchToETHWallet": "Lütfen bir Ethereum cüzdanına geçin ve tekrar deneyin",
res/values/strings_uk.arb
+3 -2
@@ -294,7 +294,7 @@
294 "etherscan_history": "Історія Etherscan",
295 "event": "Подія",
296 "events": "Події",
297 - "exchange": "Обміняти",
297 + "exchange": "Обмін",
298 "exchange_incorrect_current_wallet_for_xmr": "Якщо ви хочете поміняти XMR зі свого балансу для тортів Monero Balance, спочатку перейдіть на свій гаманець Monero.",
299 "exchange_new_template": "Новий шаблон",
300 "exchange_provider_unsupported": "${providerName} більше не підтримується!",
@@ -734,7 +734,7 @@
734 "share_address": "Поділитися адресою",
735 "shared_seed_wallet_groups": "Спільні групи насіннєвих гаманців",
736 "show": "Показувати",
737 - "show_address_book_popup": "Показати спливаюче вікно \"Додати до адресної книги\" після надсилання",
737 + "show_address_book_popup": "Показати спливаюче вікно адреси книги",
738 "show_balance": "Довга преса, щоб показати рівновагу",
739 "show_balance_toast": "Довга преса, щоб приховати або показати рівновагу",
740 "show_details": "Показати деталі",
@@ -782,6 +782,7 @@
782 "support_title_guides": "Торт гаманці",
783 "support_title_live_chat": "Жива підтримка",
784 "support_title_other_links": "Інші посилання на підтримку",
785 + "swap": "Обміняти",
786 "sweeping_wallet": "Підмітаня гаманця",
787 "sweeping_wallet_alert": "Це не повинно зайняти багато часу. НЕ ЗАЛИШАЙТЕ ЦЬОГО ЕКРАНУ, АБО КОШТИ МОЖУТЬ БУТИ ВТРАЧЕНІ",
788 "switchToETHWallet": "Перейдіть на гаманець Ethereum і повторіть спробу",
res/values/strings_ur.arb
+2 -1
@@ -735,7 +735,7 @@
735 "share_address": "پتہ شیئر کریں۔",
736 "shared_seed_wallet_groups": "مشترکہ بیج پرس گروپ",
737 "show": "دکھائیں",
738 - "show_address_book_popup": "بھیجنے کے بعد 'ایڈریس میں شامل کریں کتاب' پاپ اپ دکھائیں",
738 + "show_address_book_popup": "ایڈریس بک پاپ اپ دکھائیں",
739 "show_balance": "توازن ظاہر کرنے کے لئے طویل پریس",
740 "show_balance_toast": "توازن چھپانے یا ظاہر کرنے کے لئے طویل پریس",
741 "show_details": "تفصیلات دکھائیں",
@@ -783,6 +783,7 @@
783 "support_title_guides": "کیک پرس کے دستاویزات",
784 "support_title_live_chat": "براہ راست مدد",
785 "support_title_other_links": "دوسرے سپورٹ لنکس",
786 + "swap": "تبادلہ",
787 "sweeping_wallet": "جھاڑو دینے والا پرس",
788 "sweeping_wallet_alert": "اس میں زیادہ وقت نہیں لینا چاہئے۔ اس اسکرین کو مت چھوڑیں یا بہہ جانے والے فنڈز ضائع ہوسکتے ہیں۔",
789 "switchToETHWallet": "۔ﮟﯾﺮﮐ ﺶﺷﻮﮐ ﮦﺭﺎﺑﻭﺩ ﺭﻭﺍ ﮟﯾﺮﮐ ﭻﺋﻮﺳ ﺮﭘ ﭧﯿﻟﺍﻭ Ethereum ﻡﺮﮐ ﮦﺍﺮﺑ",
res/values/strings_vi.arb
+3 -2
@@ -293,7 +293,7 @@
293 "etherscan_history": "Lịch sử Etherscan",
294 "event": "Sự kiện",
295 "events": "Các sự kiện",
296 - "exchange": "Tráo đổi",
296 + "exchange": "Trao đổi",
297 "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.",
298 "exchange_new_template": "Mẫu mới",
299 "exchange_provider_unsupported": "${providerName} không còn được hỗ trợ nữa!",
@@ -732,7 +732,7 @@
732 "share_address": "Chia sẻ địa chỉ",
733 "shared_seed_wallet_groups": "Nhóm ví hạt được chia sẻ",
734 "show": "Trình diễn",
735 - "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",
735 + "show_address_book_popup": "Hiển thị cửa sổ bật lên sổ sách địa chỉ",
736 "show_balance": "Báo chí dài để hiển thị sự cân bằng",
737 "show_balance_toast": "Nhấn dài để ẩn hoặc hiển thị sự cân bằng",
738 "show_details": "Hiển thị chi tiết",
@@ -780,6 +780,7 @@
780 "support_title_guides": "Cake Wallet Docs",
781 "support_title_live_chat": "Hỗ trợ trực tiếp",
782 "support_title_other_links": "Liên kết hỗ trợ khác",
783 + "swap": "Tráo đổi",
784 "sweeping_wallet": "Quét ví",
785 "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.",
786 "switchToETHWallet": "Vui lòng chuyển sang ví Ethereum và thử lại",
res/values/strings_yo.arb
+3 -2
@@ -295,7 +295,7 @@
295 "etherscan_history": "Etherscan itan",
296 "event": "Iṣẹlẹ",
297 "events": "Awọn iṣẹlẹ",
298 - "exchange": "Eepo",
298 + "exchange": "Paarọ",
299 "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ọ.",
300 "exchange_new_template": "Àwòṣe títun",
301 "exchange_provider_unsupported": "${providerName} ko ni atilẹyin mọ!",
@@ -734,7 +734,7 @@
734 "share_address": "Pín àdírẹ́sì",
735 "shared_seed_wallet_groups": "Awọn ẹgbẹ ti a pin irugbin",
736 "show": "Fihan",
737 - "show_address_book_popup": "Fihan 'ṣafikun si Agbejade Iwe' Lẹhin fifiranṣẹ",
737 + "show_address_book_popup": "Fihan Agbejade Iwe Adirẹsi",
738 "show_balance": "Tẹ Tẹ lati ṣafihan iwọntunwọnsi",
739 "show_balance_toast": "Tẹ Tẹ lati tọju tabi ṣafihan iwọntunwọnsi",
740 "show_details": "Fi ìsọfúnni kékeré hàn",
@@ -782,6 +782,7 @@
782 "support_title_guides": "Awọn iwe apamọwọ oyinbo akara oyinbo",
783 "support_title_live_chat": "Atilẹyin ifiwe",
784 "support_title_other_links": "Awọn ọna asopọ atilẹyin miiran",
785 + "swap": "Eepo",
786 "sweeping_wallet": "Fi owo iwe iwe wofo",
787 "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.",
788 "switchToETHWallet": "Jọwọ yipada si apamọwọ Ethereum ki o tun gbiyanju lẹẹkansi",
res/values/strings_zh.arb
+2 -1
@@ -733,7 +733,7 @@
733 "share_address": "分享地址",
734 "shared_seed_wallet_groups": "共享种子钱包组",
735 "show": "展示",
736 - "show_address_book_popup": "发送后显示“添加到通讯簿”弹出窗口",
736 + "show_address_book_popup": "显示地址簿弹出",
737 "show_balance": "长印刷以显示平衡",
738 "show_balance_toast": "长按以隐藏或显示平衡",
739 "show_details": "显示详细信息",
@@ -781,6 +781,7 @@
781 "support_title_guides": "蛋糕钱包文档",
782 "support_title_live_chat": "实时支持",
783 "support_title_other_links": "其他支持链接",
784 + "swap": "交换",
785 "sweeping_wallet": "扫一扫钱包",
786 "sweeping_wallet_alert": "\n这应该不会花很长时间。请勿离开此屏幕,否则可能会丢失所掠取的资金",
787 "switchToETHWallet": "请切换到以太坊钱包并重试",