mirror of
https://github.com/Such-Software/hash-wallet.git
synced 2026-10-26 06:08:40 +01:00
feat: redesign the pre-seed and seed verification screens
This commit is contained in:
+9
-3
@@ -63,6 +63,8 @@ import 'package:cake_wallet/new-ui/pages/send_page.dart';
|
||||
import "package:cake_wallet/new-ui/services/wallet_switch_service.dart";
|
||||
import 'package:cake_wallet/new-ui/pages/lightning_username_page.dart';
|
||||
import 'package:cake_wallet/new-ui/pages/receive_page.dart';
|
||||
import "package:cake_wallet/new-ui/pages/seed/pre_seed_page.dart";
|
||||
import "package:cake_wallet/new-ui/pages/seed/show_keys_disclaimer_page.dart";
|
||||
import 'package:cake_wallet/new-ui/viewmodels/lightning_username/lightning_username_bloc.dart';
|
||||
import 'package:cake_wallet/new-ui/widgets/addresses_page/address_label_input.dart';
|
||||
import 'package:cake_wallet/new-ui/widgets/coins_page/assets_history/transaction_details_modal.dart';
|
||||
@@ -130,7 +132,6 @@ import 'package:cake_wallet/src/screens/restore/restore_from_backup_page.dart';
|
||||
import 'package:cake_wallet/src/screens/restore/restore_options_page.dart';
|
||||
import 'package:cake_wallet/src/screens/restore/wallet_restore_choose_derivation.dart';
|
||||
import 'package:cake_wallet/src/screens/restore/wallet_restore_page.dart';
|
||||
import 'package:cake_wallet/src/screens/seed/pre_seed_page.dart';
|
||||
import 'package:cake_wallet/src/screens/seed/seed_verification/seed_verification_page.dart';
|
||||
import 'package:cake_wallet/src/screens/seed/wallet_seed_page.dart';
|
||||
import 'package:cake_wallet/src/screens/send/send_page.dart';
|
||||
@@ -1089,6 +1090,9 @@ Future<void> setup({
|
||||
|
||||
getIt.registerFactory(() => WalletKeysPage(getIt.get<WalletKeysViewModel>()));
|
||||
|
||||
getIt.registerFactory(() => ShowKeysDisclaimerPage(
|
||||
authService: getIt.get<AuthService>(), settingsStore: getIt.get<SettingsStore>()));
|
||||
|
||||
getIt.registerFactory(() => AnimatedURModel(getIt.get<AppStore>()));
|
||||
|
||||
getIt.registerFactoryParam<AnimatedURPage, Map<String, String>, void>(
|
||||
@@ -1448,7 +1452,7 @@ Future<void> setup({
|
||||
);
|
||||
});
|
||||
|
||||
getIt.registerFactory<PreSeedPage>(() => PreSeedPage());
|
||||
getIt.registerFactory<PreSeedPage>(() => PreSeedPage(getIt.get<AppStore>().wallet!));
|
||||
|
||||
getIt.registerFactoryParam<TransactionSuccessPage, String, void>(
|
||||
(content, _) => TransactionSuccessPage(content: content));
|
||||
@@ -1702,7 +1706,9 @@ Future<void> setup({
|
||||
|
||||
getIt.registerFactory(() => SignViewModel(getIt.get<AppStore>().wallet!));
|
||||
|
||||
getIt.registerFactory(() => SeedVerificationPage(getIt.get<WalletSeedViewModel>()));
|
||||
getIt.registerFactoryParam<SeedVerificationPage, bool, void>((bool isNewWalletCreated, _) =>
|
||||
SeedVerificationPage(getIt.get<WalletSeedViewModel>(),
|
||||
isNewWalletCreated: isNewWalletCreated));
|
||||
|
||||
getIt.registerFactory(() => DevMoneroBackgroundSyncPage(getIt.get<DevMoneroBackgroundSync>()));
|
||||
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
import "package:cake_wallet/routes.dart";
|
||||
import "package:cw_core/wallet_type.dart";
|
||||
import "package:flutter/widgets.dart";
|
||||
|
||||
// Bitcoin wallets set up lightning username right after the seed step.
|
||||
void openWalletAfterSeedFlow(BuildContext context, WalletType walletType) {
|
||||
if (walletType == WalletType.bitcoin) {
|
||||
Navigator.of(context).pushNamed(Routes.lightningUsernamePage, arguments: true);
|
||||
return;
|
||||
}
|
||||
|
||||
Navigator.of(context).popUntil((route) => route.isFirst);
|
||||
}
|
||||
@@ -0,0 +1,125 @@
|
||||
import "package:cake_wallet/generated/i18n.dart";
|
||||
import "package:cake_wallet/new-ui/pages/seed/open_wallet_after_seed_flow.dart";
|
||||
import "package:cake_wallet/new-ui/pages/seed/skip_seed_verification_page.dart";
|
||||
import "package:cake_wallet/new-ui/widgets/seed/seed_checkbox_row.dart";
|
||||
import "package:cake_wallet/new-ui/widgets/seed/seed_hero_image.dart";
|
||||
import "package:cake_wallet/new-ui/widgets/seed/seed_page_header.dart";
|
||||
import "package:cake_wallet/new-ui/widgets/seed/seed_page_scaffold.dart";
|
||||
import "package:cake_wallet/new-ui/widgets/stacked_buttons.dart";
|
||||
import "package:cake_wallet/routes.dart";
|
||||
import "package:cake_wallet/themes/core/theme_extension.dart";
|
||||
import "package:cw_core/wallet_base.dart";
|
||||
import "package:flutter/cupertino.dart";
|
||||
import "package:flutter/material.dart";
|
||||
|
||||
class PreSeedPage extends StatefulWidget {
|
||||
const PreSeedPage(this.wallet, {super.key});
|
||||
|
||||
final WalletBase wallet;
|
||||
|
||||
@override
|
||||
State<PreSeedPage> createState() => _PreSeedPageState();
|
||||
}
|
||||
|
||||
class _PreSeedPageState extends State<PreSeedPage> {
|
||||
bool _understandsOnlyWayToRecover = false;
|
||||
bool _willWriteItDown = false;
|
||||
bool _willNeverShareIt = false;
|
||||
|
||||
bool get _hasCheckedAll => _understandsOnlyWayToRecover && _willWriteItDown && _willNeverShareIt;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final colors = Theme.of(context).colorScheme;
|
||||
final textTheme = Theme.of(context).textTheme;
|
||||
|
||||
return PopScope(
|
||||
canPop: false,
|
||||
child: SeedPageScaffold(
|
||||
content: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
spacing: 24,
|
||||
children: [
|
||||
SeedPageHeader(
|
||||
image: const SeedHeroImage(),
|
||||
title: S.of(context).recovery_phrase_intro_title,
|
||||
description: Text(
|
||||
S.of(context).recovery_phrase_intro_description,
|
||||
textAlign: TextAlign.center,
|
||||
style: textTheme.bodyMedium?.copyWith(
|
||||
color: colors.onSurfaceVariant,
|
||||
letterSpacing: -0.07,
|
||||
),
|
||||
),
|
||||
),
|
||||
Column(
|
||||
spacing: 12,
|
||||
children: [
|
||||
SeedCheckboxRow(
|
||||
key: const ValueKey("pre_seed_page_only_way_checkbox_key"),
|
||||
iconPath: "assets/new-ui/key.svg",
|
||||
text: S.of(context).recovery_phrase_check_only_way,
|
||||
isChecked: _understandsOnlyWayToRecover,
|
||||
onChanged: (value) => setState(() => _understandsOnlyWayToRecover = value),
|
||||
),
|
||||
SeedCheckboxRow(
|
||||
key: const ValueKey("pre_seed_page_write_down_checkbox_key"),
|
||||
iconPath: "assets/new-ui/set-amount.svg",
|
||||
text: S.of(context).recovery_phrase_check_write_down,
|
||||
isChecked: _willWriteItDown,
|
||||
onChanged: (value) => setState(() => _willWriteItDown = value),
|
||||
),
|
||||
SeedCheckboxRow(
|
||||
key: const ValueKey("pre_seed_page_never_share_checkbox_key"),
|
||||
iconPath: "assets/new-ui/visibility.svg",
|
||||
text: S.of(context).recovery_phrase_check_never_share,
|
||||
isChecked: _willNeverShareIt,
|
||||
onChanged: (value) => setState(() => _willNeverShareIt = value),
|
||||
),
|
||||
],
|
||||
),
|
||||
if (!_hasCheckedAll)
|
||||
Text(
|
||||
S.of(context).recovery_phrase_check_all_to_proceed,
|
||||
textAlign: TextAlign.center,
|
||||
style: textTheme.bodyMedium?.copyWith(
|
||||
color: context.customColors.warningOutlineColor,
|
||||
letterSpacing: -0.07,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
footer: _hasCheckedAll
|
||||
? StackedButtons(
|
||||
primaryKey: const ValueKey("pre_seed_page_button_key"),
|
||||
primaryText: S.of(context).show_recovery_phrase,
|
||||
onPrimary: () => Navigator.of(context).pushNamed(Routes.seed, arguments: true),
|
||||
secondaryKey: const ValueKey("pre_seed_page_skip_button_key"),
|
||||
secondaryText: S.of(context).skip_this_step,
|
||||
onSecondary: _confirmSkip,
|
||||
secondaryAsLink: true,
|
||||
)
|
||||
: null,
|
||||
alignTop: true,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _confirmSkip() {
|
||||
Navigator.of(context).push(
|
||||
CupertinoPageRoute<void>(
|
||||
builder: (_) => SkipSeedVerificationPage(onConfirm: _skipVerification),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _skipVerification() async {
|
||||
await widget.wallet.walletInfo.updateShowSeedBackupReminder(true);
|
||||
|
||||
if (!mounted) {
|
||||
return;
|
||||
}
|
||||
|
||||
openWalletAfterSeedFlow(context, widget.wallet.type);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
import "package:cake_wallet/core/auth_service.dart";
|
||||
import "package:cake_wallet/generated/i18n.dart";
|
||||
import "package:cake_wallet/new-ui/widgets/seed/seed_hero_image.dart";
|
||||
import "package:cake_wallet/new-ui/widgets/seed/seed_page_header.dart";
|
||||
import "package:cake_wallet/new-ui/widgets/seed/seed_page_scaffold.dart";
|
||||
import "package:cake_wallet/new-ui/widgets/stacked_buttons.dart";
|
||||
import "package:cake_wallet/routes.dart";
|
||||
import "package:cake_wallet/store/settings_store.dart";
|
||||
import "package:cake_wallet/themes/core/theme_extension.dart";
|
||||
import "package:flutter/material.dart";
|
||||
|
||||
class ShowKeysDisclaimerPage extends StatelessWidget {
|
||||
const ShowKeysDisclaimerPage({
|
||||
required this.authService,
|
||||
required this.settingsStore,
|
||||
super.key,
|
||||
});
|
||||
|
||||
final AuthService authService;
|
||||
final SettingsStore settingsStore;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final colors = Theme.of(context).colorScheme;
|
||||
|
||||
return SeedPageScaffold(
|
||||
content: SeedPageHeader(
|
||||
image: const SeedHeroImage(showWarningBadge: true),
|
||||
title: S.of(context).secret_information_ahead,
|
||||
description: Text.rich(
|
||||
TextSpan(
|
||||
children: [
|
||||
TextSpan(text: "${S.of(context).secret_information_ahead_description}\n\n"),
|
||||
TextSpan(
|
||||
text: S.of(context).secret_information_ahead_warning,
|
||||
style: TextStyle(color: context.customColors.warningOutlineColor),
|
||||
),
|
||||
],
|
||||
),
|
||||
textAlign: TextAlign.center,
|
||||
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
|
||||
color: colors.onSurfaceVariant,
|
||||
letterSpacing: -0.07,
|
||||
),
|
||||
),
|
||||
),
|
||||
footer: StackedButtons(
|
||||
primaryKey: const ValueKey("show_keys_disclaimer_page_button_key"),
|
||||
primaryText: S.of(context).show_recovery_phrase_and_keys,
|
||||
onPrimary: () => authService.authenticateAction(
|
||||
context,
|
||||
route: Routes.showKeys,
|
||||
conditionToDetermineIfToUse2FA:
|
||||
settingsStore.shouldRequireTOTP2FAForAllSecurityAndBackupSettings,
|
||||
),
|
||||
secondaryKey: const ValueKey("show_keys_disclaimer_page_back_button_key"),
|
||||
secondaryText: S.of(context).seed_alert_back,
|
||||
onSecondary: () => Navigator.of(context).pop(),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
import "package:cake_wallet/generated/i18n.dart";
|
||||
import "package:cake_wallet/new-ui/widgets/seed/seed_page_header.dart";
|
||||
import "package:cake_wallet/new-ui/widgets/seed/seed_page_scaffold.dart";
|
||||
import "package:cake_wallet/new-ui/widgets/stacked_buttons.dart";
|
||||
import "package:cake_wallet/src/widgets/cake_image_widget.dart";
|
||||
import "package:cake_wallet/themes/core/theme_extension.dart";
|
||||
import "package:flutter/material.dart";
|
||||
|
||||
class SkipSeedVerificationPage extends StatelessWidget {
|
||||
const SkipSeedVerificationPage({required this.onConfirm, super.key});
|
||||
|
||||
final VoidCallback onConfirm;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final colors = Theme.of(context).colorScheme;
|
||||
final textTheme = Theme.of(context).textTheme;
|
||||
|
||||
return SeedPageScaffold(
|
||||
content: ConstrainedBox(
|
||||
constraints: const BoxConstraints(maxWidth: 295),
|
||||
child: SeedPageHeader(
|
||||
image: const CakeImageWidget(
|
||||
imageUrl: "assets/new-ui/warning_triangle.svg",
|
||||
width: 125,
|
||||
height: 111.72,
|
||||
),
|
||||
imageSpacing: 48,
|
||||
titleSpacing: 24,
|
||||
title: S.of(context).skip_verification_title,
|
||||
description: Column(
|
||||
spacing: 24,
|
||||
children: [
|
||||
Text(
|
||||
S.of(context).skip_verification_warning,
|
||||
textAlign: TextAlign.center,
|
||||
style: textTheme.bodyMedium?.copyWith(
|
||||
color: context.customColors.warningOutlineColor,
|
||||
letterSpacing: -0.07,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
S.of(context).skip_verification_question,
|
||||
textAlign: TextAlign.center,
|
||||
style: textTheme.bodyMedium?.copyWith(
|
||||
color: colors.onSurfaceVariant,
|
||||
letterSpacing: -0.07,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
footer: StackedButtons(
|
||||
primaryKey: const ValueKey("skip_seed_verification_page_confirm_button_key"),
|
||||
primaryText: S.of(context).skip_verification_confirm,
|
||||
onPrimary: onConfirm,
|
||||
secondaryKey: const ValueKey("skip_seed_verification_page_back_button_key"),
|
||||
secondaryText: S.of(context).seed_alert_back,
|
||||
onSecondary: () => Navigator.of(context).pop(),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -62,11 +62,8 @@ class SettingsSectionData {
|
||||
"assets/new-ui/settings_row_icons/nodes.svg", S.current.nodes, Routes.manageNodes),
|
||||
SettingsListItem(
|
||||
"assets/new-ui/settings_row_icons/privacy.svg", S.current.privacy, Routes.privacyPage),
|
||||
SettingsListItem(
|
||||
"assets/new-ui/settings_row_icons/seed.svg", S.current.seed_and_keys, Routes.showKeys,
|
||||
routeArgs: true,
|
||||
requireAuth: true,
|
||||
use2fa: (vm) => vm.settingsStore.shouldRequireTOTP2FAForAllSecurityAndBackupSettings),
|
||||
SettingsListItem("assets/new-ui/settings_row_icons/seed.svg", S.current.recovery_and_keys,
|
||||
Routes.showKeysDisclaimer),
|
||||
SettingsListItem("assets/new-ui/settings_row_icons/lightning_username.svg",
|
||||
"Lightning ${S.current.username}", Routes.lightningUsernamePage,
|
||||
condition: _hasLightning),
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
import "package:cake_wallet/src/widgets/cake_image_widget.dart";
|
||||
import "package:flutter/material.dart";
|
||||
|
||||
class SeedCheckboxRow extends StatelessWidget {
|
||||
const SeedCheckboxRow({
|
||||
required this.iconPath,
|
||||
required this.text,
|
||||
required this.isChecked,
|
||||
required this.onChanged,
|
||||
super.key,
|
||||
});
|
||||
|
||||
final String iconPath;
|
||||
final String text;
|
||||
final bool isChecked;
|
||||
final ValueChanged<bool> onChanged;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final colors = Theme.of(context).colorScheme;
|
||||
|
||||
return MergeSemantics(
|
||||
child: Semantics(
|
||||
checked: isChecked,
|
||||
child: GestureDetector(
|
||||
behavior: HitTestBehavior.opaque,
|
||||
onTap: () => onChanged(!isChecked),
|
||||
child: Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 16),
|
||||
decoration: BoxDecoration(
|
||||
color: colors.surfaceContainer,
|
||||
borderRadius: BorderRadius.circular(18),
|
||||
),
|
||||
child: Row(
|
||||
spacing: 12,
|
||||
children: [
|
||||
ExcludeSemantics(
|
||||
child: CakeImageWidget(
|
||||
imageUrl: iconPath,
|
||||
width: 24,
|
||||
height: 24,
|
||||
colorFilter: ColorFilter.mode(colors.primary, BlendMode.srcIn),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: Text(
|
||||
text,
|
||||
style: Theme.of(context).textTheme.bodySmall?.copyWith(
|
||||
color: colors.primary,
|
||||
letterSpacing: -0.06,
|
||||
),
|
||||
),
|
||||
),
|
||||
ExcludeSemantics(
|
||||
child: Container(
|
||||
width: 24,
|
||||
height: 24,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: isChecked ? colors.primary : colors.surfaceContainerHighest,
|
||||
),
|
||||
child: isChecked ? Icon(Icons.check, size: 16, color: colors.onPrimary) : null,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
import "package:cake_wallet/src/widgets/cake_image_widget.dart";
|
||||
import "package:flutter/material.dart";
|
||||
|
||||
class SeedHeroImage extends StatelessWidget {
|
||||
const SeedHeroImage({this.showWarningBadge = false, super.key});
|
||||
|
||||
final bool showWarningBadge;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final name = showWarningBadge ? "seed_warning" : "seed_shield";
|
||||
final variant = Theme.of(context).brightness == Brightness.dark ? "dark" : "light";
|
||||
|
||||
return CakeImageWidget(
|
||||
imageUrl: "assets/new-ui/hero/${name}_$variant.svg",
|
||||
width: 200,
|
||||
height: 228.57,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
import "package:flutter/material.dart";
|
||||
|
||||
class SeedPageHeader extends StatelessWidget {
|
||||
const SeedPageHeader({
|
||||
required this.image,
|
||||
required this.title,
|
||||
required this.description,
|
||||
this.imageSpacing = 24,
|
||||
this.titleSpacing = 12,
|
||||
super.key,
|
||||
});
|
||||
|
||||
final Widget image;
|
||||
final String title;
|
||||
final Widget description;
|
||||
final double imageSpacing;
|
||||
final double titleSpacing;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
ExcludeSemantics(child: image),
|
||||
SizedBox(height: imageSpacing),
|
||||
Semantics(
|
||||
header: true,
|
||||
child: Text(
|
||||
title,
|
||||
textAlign: TextAlign.center,
|
||||
style: Theme.of(context).textTheme.headlineMedium?.copyWith(letterSpacing: -0.09),
|
||||
),
|
||||
),
|
||||
SizedBox(height: titleSpacing),
|
||||
description,
|
||||
],
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
import "package:flutter/material.dart";
|
||||
|
||||
class SeedPageScaffold extends StatelessWidget {
|
||||
const SeedPageScaffold({
|
||||
required this.content,
|
||||
this.footer,
|
||||
this.alignTop = false,
|
||||
super.key,
|
||||
});
|
||||
|
||||
final Widget content;
|
||||
final Widget? footer;
|
||||
final bool alignTop;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final colors = Theme.of(context).colorScheme;
|
||||
|
||||
return Material(
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
colors: [colors.surface, colors.surfaceDim],
|
||||
begin: Alignment.topCenter,
|
||||
end: Alignment.bottomCenter,
|
||||
),
|
||||
),
|
||||
child: SafeArea(
|
||||
child: Column(
|
||||
children: [
|
||||
Expanded(
|
||||
child: LayoutBuilder(
|
||||
builder: (context, constraints) => SingleChildScrollView(
|
||||
child: ConstrainedBox(
|
||||
constraints: BoxConstraints(minHeight: constraints.maxHeight),
|
||||
child: Align(
|
||||
alignment: alignTop ? Alignment.topCenter : Alignment.center,
|
||||
child: Padding(
|
||||
padding: EdgeInsets.fromLTRB(18, alignTop ? 0 : 16, 18, 16),
|
||||
child: content,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
if (footer != null)
|
||||
Padding(
|
||||
padding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
|
||||
child: footer,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
import "package:cake_wallet/new-ui/widgets/new_primary_button.dart";
|
||||
import "package:flutter/material.dart";
|
||||
|
||||
class StackedButtons extends StatelessWidget {
|
||||
const StackedButtons({
|
||||
required this.primaryText,
|
||||
required this.onPrimary,
|
||||
required this.secondaryText,
|
||||
required this.onSecondary,
|
||||
this.secondaryAsLink = false,
|
||||
this.primaryKey,
|
||||
this.secondaryKey,
|
||||
super.key,
|
||||
});
|
||||
|
||||
final String primaryText;
|
||||
final VoidCallback onPrimary;
|
||||
final String secondaryText;
|
||||
final VoidCallback onSecondary;
|
||||
final bool secondaryAsLink;
|
||||
final Key? primaryKey;
|
||||
final Key? secondaryKey;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final colors = Theme.of(context).colorScheme;
|
||||
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
NewPrimaryButton(
|
||||
key: primaryKey,
|
||||
onPressed: onPrimary,
|
||||
text: primaryText,
|
||||
color: colors.primary,
|
||||
textColor: colors.onPrimary,
|
||||
),
|
||||
if (secondaryAsLink) ...[
|
||||
const SizedBox(height: 9),
|
||||
TextButton(
|
||||
key: secondaryKey,
|
||||
onPressed: onSecondary,
|
||||
style: TextButton.styleFrom(minimumSize: const Size(48, 48)),
|
||||
child: Text(
|
||||
secondaryText,
|
||||
style: Theme.of(context).textTheme.labelLarge?.copyWith(
|
||||
color: colors.primary,
|
||||
letterSpacing: -0.07,
|
||||
),
|
||||
),
|
||||
),
|
||||
] else ...[
|
||||
const SizedBox(height: 12),
|
||||
NewPrimaryButton(
|
||||
key: secondaryKey,
|
||||
onPressed: onSecondary,
|
||||
text: secondaryText,
|
||||
color: colors.surfaceContainer,
|
||||
textColor: colors.primary,
|
||||
),
|
||||
],
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
+8
-2
@@ -10,6 +10,8 @@ import 'package:cake_wallet/new-ui/pages/bridge/bridge_receiving_wallet_page.dar
|
||||
import 'package:cake_wallet/new-ui/pages/coin_control_page.dart';
|
||||
import 'package:cake_wallet/new-ui/pages/addresses_page.dart';
|
||||
import 'package:cake_wallet/new-ui/pages/lightning_username_page.dart';
|
||||
import 'package:cake_wallet/new-ui/pages/seed/pre_seed_page.dart';
|
||||
import 'package:cake_wallet/new-ui/pages/seed/show_keys_disclaimer_page.dart';
|
||||
import "package:cake_wallet/new-ui/pages/receive_page.dart";
|
||||
import 'package:cake_wallet/new-ui/pages/send_page.dart';
|
||||
import 'package:cake_wallet/new-ui/widgets/hardware_wallet/sync_key_images_sheet.dart';
|
||||
@@ -92,7 +94,6 @@ import 'package:cake_wallet/src/screens/restore/restore_options_page.dart';
|
||||
import 'package:cake_wallet/src/screens/restore/sweeping_wallet_page.dart';
|
||||
import 'package:cake_wallet/src/screens/restore/wallet_restore_choose_derivation.dart';
|
||||
import 'package:cake_wallet/src/screens/restore/wallet_restore_page.dart';
|
||||
import 'package:cake_wallet/src/screens/seed/pre_seed_page.dart';
|
||||
import 'package:cake_wallet/src/screens/seed/seed_verification/seed_verification_page.dart';
|
||||
import 'package:cake_wallet/src/screens/seed/wallet_seed_page.dart';
|
||||
import 'package:cake_wallet/src/screens/send/send_template_page.dart';
|
||||
@@ -687,6 +688,11 @@ Route<dynamic> createRoute(RouteSettings settings) {
|
||||
(context) => getIt.get<WalletKeysPage>(),
|
||||
);
|
||||
|
||||
case Routes.showKeysDisclaimer:
|
||||
return handleRouteWithPlatformAwareness(
|
||||
(context) => getIt.get<ShowKeysDisclaimerPage>(),
|
||||
);
|
||||
|
||||
case Routes.exchangeTrade:
|
||||
return CupertinoPageRoute<void>(builder: (_) => getIt.get<ExchangeTradePage>());
|
||||
|
||||
@@ -996,7 +1002,7 @@ Route<dynamic> createRoute(RouteSettings settings) {
|
||||
case Routes.walletSeedVerificationPage:
|
||||
return MaterialPageRoute<void>(
|
||||
fullscreenDialog: true,
|
||||
builder: (_) => getIt.get<SeedVerificationPage>(),
|
||||
builder: (_) => getIt.get<SeedVerificationPage>(param1: settings.arguments as bool),
|
||||
);
|
||||
|
||||
case Routes.exchangeTradeExternalSendPage:
|
||||
|
||||
@@ -38,6 +38,7 @@ class Routes {
|
||||
static const pickerWalletAddress = '/picker_wallet_address';
|
||||
static const addressBookAddContact = '/address_book_add_contact';
|
||||
static const showKeys = '/show_keys';
|
||||
static const showKeysDisclaimer = "/show_keys_disclaimer";
|
||||
static const exchangeConfirm = '/exchange_confirm';
|
||||
static const tradeHistory = '/trade_history';
|
||||
static const tradeDetails = '/trade_details';
|
||||
|
||||
@@ -79,7 +79,7 @@ class WalletGroupExistingSeedDescriptionPage extends BasePage {
|
||||
key: ValueKey(
|
||||
'wallet_group_existing_seed_description_page_verify_seed_button_key'),
|
||||
onPressed: () => Navigator.pushNamed(context, Routes.preSeedPage),
|
||||
text: S.current.verify_seed,
|
||||
text: S.current.verify_phrase,
|
||||
color: Theme.of(context).colorScheme.surfaceContainer,
|
||||
textColor: Theme.of(context).colorScheme.onSecondaryContainer,
|
||||
),
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
import 'package:cake_wallet/routes.dart';
|
||||
import 'package:cake_wallet/src/screens/Info_page.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
|
||||
class PreSeedPage extends InfoPage {
|
||||
PreSeedPage()
|
||||
: super(
|
||||
imageLightPath: 'assets/images/seed_warning_light.svg',
|
||||
imageDarkPath: 'assets/images/seed_warning_dark.svg',
|
||||
);
|
||||
|
||||
@override
|
||||
bool get onWillPop => false;
|
||||
|
||||
@override
|
||||
String get pageTitle => S.current.pre_seed_title;
|
||||
|
||||
@override
|
||||
String get pageDescription => S.current.pre_seed_description;
|
||||
|
||||
@override
|
||||
String get buttonText => S.current.pre_seed_button_text;
|
||||
|
||||
@override
|
||||
Key? get buttonKey => ValueKey('pre_seed_page_button_key');
|
||||
|
||||
@override
|
||||
void Function(BuildContext) get onPressed =>
|
||||
(BuildContext context) => Navigator.of(context).pushNamed(Routes.seed, arguments: true);
|
||||
}
|
||||
@@ -9,8 +9,9 @@ import 'package:flutter_mobx/flutter_mobx.dart';
|
||||
|
||||
class SeedVerificationPage extends BasePage {
|
||||
final WalletSeedViewModel walletSeedViewModel;
|
||||
final bool isNewWalletCreated;
|
||||
|
||||
SeedVerificationPage(this.walletSeedViewModel);
|
||||
SeedVerificationPage(this.walletSeedViewModel, {required this.isNewWalletCreated});
|
||||
|
||||
@override
|
||||
bool get gradientBackground => true;
|
||||
@@ -32,7 +33,8 @@ class SeedVerificationPage extends BasePage {
|
||||
walletSeedViewModel.verificationIndices.isEmpty
|
||||
? SeedVerificationSuccessView(
|
||||
key: ValueKey('seed_verification_success_view_page'),
|
||||
walletType: walletSeedViewModel.walletType,
|
||||
walletSeedViewModel: walletSeedViewModel,
|
||||
isNewWalletCreated: isNewWalletCreated,
|
||||
currentTheme: currentTheme,
|
||||
)
|
||||
: SeedVerificationStepView(
|
||||
|
||||
@@ -1,17 +1,23 @@
|
||||
import 'package:cake_wallet/generated/i18n.dart';
|
||||
import 'package:cake_wallet/routes.dart';
|
||||
import 'package:cake_wallet/new-ui/pages/seed/open_wallet_after_seed_flow.dart';
|
||||
import 'package:cake_wallet/src/widgets/cake_image_widget.dart';
|
||||
import 'package:cake_wallet/src/widgets/primary_button.dart';
|
||||
import 'package:cake_wallet/themes/core/material_base_theme.dart';
|
||||
import 'package:cake_wallet/view_model/wallet_seed_view_model.dart';
|
||||
import 'package:cw_core/wallet_type.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class SeedVerificationSuccessView extends StatelessWidget {
|
||||
const SeedVerificationSuccessView(
|
||||
{required this.currentTheme, super.key, required this.walletType});
|
||||
const SeedVerificationSuccessView({
|
||||
required this.walletSeedViewModel,
|
||||
required this.isNewWalletCreated,
|
||||
required this.currentTheme,
|
||||
super.key,
|
||||
});
|
||||
|
||||
final WalletSeedViewModel walletSeedViewModel;
|
||||
final bool isNewWalletCreated;
|
||||
final MaterialThemeBase currentTheme;
|
||||
final WalletType walletType;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -65,14 +71,20 @@ class SeedVerificationSuccessView extends StatelessWidget {
|
||||
Spacer(),
|
||||
PrimaryButton(
|
||||
key: ValueKey('wallet_seed_page_open_wallet_button_key'),
|
||||
onPressed: () {
|
||||
if (walletType == WalletType.bitcoin) {
|
||||
Navigator.of(context).pushNamed(Routes.lightningUsernamePage, arguments: true);
|
||||
onPressed: () async {
|
||||
await walletSeedViewModel.markSeedVerified();
|
||||
|
||||
if (!context.mounted) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (isNewWalletCreated) {
|
||||
openWalletAfterSeedFlow(context, walletSeedViewModel.walletType);
|
||||
} else {
|
||||
Navigator.of(context).popUntil((route) => route.isFirst);
|
||||
}
|
||||
},
|
||||
text: (walletType == WalletType.bitcoin)
|
||||
text: isNewWalletCreated && walletSeedViewModel.walletType == WalletType.bitcoin
|
||||
? S.current.continue_text
|
||||
: S.current.open_wallet,
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
|
||||
@@ -124,9 +124,12 @@ class WalletSeedPage extends BasePage {
|
||||
padding: EdgeInsets.only(left: 8.0, top: 8.0),
|
||||
child: PrimaryButton(
|
||||
key: ValueKey('wallet_seed_page_verify_seed_button_key'),
|
||||
onPressed: () =>
|
||||
Navigator.pushNamed(context, Routes.walletSeedVerificationPage),
|
||||
text: S.current.verify_seed,
|
||||
onPressed: () => Navigator.pushNamed(
|
||||
context,
|
||||
Routes.walletSeedVerificationPage,
|
||||
arguments: isNewWalletCreated,
|
||||
),
|
||||
text: S.current.verify_phrase,
|
||||
color: Theme.of(context).colorScheme.primary,
|
||||
textColor: Theme.of(context).colorScheme.onPrimary,
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user