diff --git a/.gitignore b/.gitignore
index cf2d96802..3ffacac45 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,6 +37,8 @@ lib/generated_plugin_registrant.dart
test/services/coins/bitcoin/bitcoin_wallet_test_parameters.dart
test/services/coins/firo/firo_wallet_test_parameters.dart
test/services/coins/dogecoin/dogecoin_wallet_test_parameters.dart
+test/services/coins/namecoin/namecoin_wallet_test_parameters.dart
+test/services/coins/bitcoincash/bitcoincash_wallet_test_parameters.dart
/integration_test/private.dart
# Exceptions to above rules.
@@ -46,3 +48,4 @@ test/services/coins/dogecoin/dogecoin_wallet_test_parameters.dart
coverage
scripts/**/build
/lib/external_api_keys.dart
+/test/services/coins/bitcoincash/bitcoincash_wallet_test_parameters.dart
diff --git a/assets/images/bitcoincash.png b/assets/images/bitcoincash.png
new file mode 100644
index 000000000..18552e02e
Binary files /dev/null and b/assets/images/bitcoincash.png differ
diff --git a/assets/images/namecoin.png b/assets/images/namecoin.png
new file mode 100644
index 000000000..45cf8abb7
Binary files /dev/null and b/assets/images/namecoin.png differ
diff --git a/assets/images/wownero.png b/assets/images/wownero.png
new file mode 100644
index 000000000..857ab2b4c
Binary files /dev/null and b/assets/images/wownero.png differ
diff --git a/assets/svg/address-book2.svg b/assets/svg/address-book2.svg
new file mode 100644
index 000000000..18de31c55
--- /dev/null
+++ b/assets/svg/address-book2.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/svg/chevron-right.svg b/assets/svg/chevron-right.svg
new file mode 100644
index 000000000..c8efcde44
--- /dev/null
+++ b/assets/svg/chevron-right.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/svg/coin_icons/Bitcoincash.svg b/assets/svg/coin_icons/Bitcoincash.svg
new file mode 100644
index 000000000..4e700f9e0
--- /dev/null
+++ b/assets/svg/coin_icons/Bitcoincash.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/svg/coin_icons/Namecoin.svg b/assets/svg/coin_icons/Namecoin.svg
new file mode 100644
index 000000000..2cda6aaf0
--- /dev/null
+++ b/assets/svg/coin_icons/Namecoin.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/svg/dark/bell-new.svg b/assets/svg/dark/bell-new.svg
new file mode 100644
index 000000000..f976e0986
--- /dev/null
+++ b/assets/svg/dark/bell-new.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/svg/dark/buy-coins-icon.svg b/assets/svg/dark/buy-coins-icon.svg
new file mode 100644
index 000000000..9170c4190
--- /dev/null
+++ b/assets/svg/dark/buy-coins-icon.svg
@@ -0,0 +1,18 @@
+
diff --git a/assets/svg/dark/exchange-2.svg b/assets/svg/dark/exchange-2.svg
new file mode 100644
index 000000000..ee04dcebe
--- /dev/null
+++ b/assets/svg/dark/exchange-2.svg
@@ -0,0 +1,11 @@
+
diff --git a/assets/svg/dark/stack-icon1.svg b/assets/svg/dark/stack-icon1.svg
new file mode 100644
index 000000000..4fb16176a
--- /dev/null
+++ b/assets/svg/dark/stack-icon1.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/svg/dark/tx-exchange-icon-failed.svg b/assets/svg/dark/tx-exchange-icon-failed.svg
new file mode 100644
index 000000000..64acda4e9
--- /dev/null
+++ b/assets/svg/dark/tx-exchange-icon-failed.svg
@@ -0,0 +1,14 @@
+
diff --git a/assets/svg/dark/tx-exchange-icon-pending.svg b/assets/svg/dark/tx-exchange-icon-pending.svg
new file mode 100644
index 000000000..f9cdeb7c2
--- /dev/null
+++ b/assets/svg/dark/tx-exchange-icon-pending.svg
@@ -0,0 +1,13 @@
+
diff --git a/assets/svg/dark/tx-exchange-icon.svg b/assets/svg/dark/tx-exchange-icon.svg
new file mode 100644
index 000000000..36b2cf7cc
--- /dev/null
+++ b/assets/svg/dark/tx-exchange-icon.svg
@@ -0,0 +1,11 @@
+
diff --git a/assets/svg/dark/tx-icon-receive-failed.svg b/assets/svg/dark/tx-icon-receive-failed.svg
new file mode 100644
index 000000000..cb1d500b1
--- /dev/null
+++ b/assets/svg/dark/tx-icon-receive-failed.svg
@@ -0,0 +1,14 @@
+
diff --git a/assets/svg/dark/tx-icon-receive-pending.svg b/assets/svg/dark/tx-icon-receive-pending.svg
new file mode 100644
index 000000000..efb8350b3
--- /dev/null
+++ b/assets/svg/dark/tx-icon-receive-pending.svg
@@ -0,0 +1,12 @@
+
diff --git a/assets/svg/dark/tx-icon-receive.svg b/assets/svg/dark/tx-icon-receive.svg
new file mode 100644
index 000000000..15be19d52
--- /dev/null
+++ b/assets/svg/dark/tx-icon-receive.svg
@@ -0,0 +1,11 @@
+
diff --git a/assets/svg/dark/tx-icon-send-failed.svg b/assets/svg/dark/tx-icon-send-failed.svg
new file mode 100644
index 000000000..2be637ef3
--- /dev/null
+++ b/assets/svg/dark/tx-icon-send-failed.svg
@@ -0,0 +1,14 @@
+
diff --git a/assets/svg/dark/tx-icon-send-pending.svg b/assets/svg/dark/tx-icon-send-pending.svg
new file mode 100644
index 000000000..50cca5a9e
--- /dev/null
+++ b/assets/svg/dark/tx-icon-send-pending.svg
@@ -0,0 +1,13 @@
+
diff --git a/assets/svg/dark/tx-icon-send.svg b/assets/svg/dark/tx-icon-send.svg
new file mode 100644
index 000000000..0e64ee37e
--- /dev/null
+++ b/assets/svg/dark/tx-icon-send.svg
@@ -0,0 +1,11 @@
+
diff --git a/assets/svg/exchange-3.svg b/assets/svg/exchange-3.svg
new file mode 100644
index 000000000..4a3c92524
--- /dev/null
+++ b/assets/svg/exchange-3.svg
@@ -0,0 +1,4 @@
+
diff --git a/assets/svg/bell-new.svg b/assets/svg/light/bell-new.svg
similarity index 100%
rename from assets/svg/bell-new.svg
rename to assets/svg/light/bell-new.svg
diff --git a/assets/svg/buy-coins-icon.svg b/assets/svg/light/buy-coins-icon.svg
similarity index 100%
rename from assets/svg/buy-coins-icon.svg
rename to assets/svg/light/buy-coins-icon.svg
diff --git a/assets/svg/exchange-2.svg b/assets/svg/light/exchange-2.svg
similarity index 100%
rename from assets/svg/exchange-2.svg
rename to assets/svg/light/exchange-2.svg
diff --git a/assets/svg/light/stack-icon1.svg b/assets/svg/light/stack-icon1.svg
new file mode 100644
index 000000000..f316012d7
--- /dev/null
+++ b/assets/svg/light/stack-icon1.svg
@@ -0,0 +1,5 @@
+
diff --git a/assets/svg/tx-exchange-icon-failed.svg b/assets/svg/light/tx-exchange-icon-failed.svg
similarity index 100%
rename from assets/svg/tx-exchange-icon-failed.svg
rename to assets/svg/light/tx-exchange-icon-failed.svg
diff --git a/assets/svg/tx-exchange-icon-pending.svg b/assets/svg/light/tx-exchange-icon-pending.svg
similarity index 100%
rename from assets/svg/tx-exchange-icon-pending.svg
rename to assets/svg/light/tx-exchange-icon-pending.svg
diff --git a/assets/svg/tx-exchange-icon.svg b/assets/svg/light/tx-exchange-icon.svg
similarity index 100%
rename from assets/svg/tx-exchange-icon.svg
rename to assets/svg/light/tx-exchange-icon.svg
diff --git a/assets/svg/tx-icon-receive-failed.svg b/assets/svg/light/tx-icon-receive-failed.svg
similarity index 100%
rename from assets/svg/tx-icon-receive-failed.svg
rename to assets/svg/light/tx-icon-receive-failed.svg
diff --git a/assets/svg/tx-icon-receive-pending.svg b/assets/svg/light/tx-icon-receive-pending.svg
similarity index 100%
rename from assets/svg/tx-icon-receive-pending.svg
rename to assets/svg/light/tx-icon-receive-pending.svg
diff --git a/assets/svg/tx-icon-receive.svg b/assets/svg/light/tx-icon-receive.svg
similarity index 100%
rename from assets/svg/tx-icon-receive.svg
rename to assets/svg/light/tx-icon-receive.svg
diff --git a/assets/svg/tx-icon-send-failed.svg b/assets/svg/light/tx-icon-send-failed.svg
similarity index 100%
rename from assets/svg/tx-icon-send-failed.svg
rename to assets/svg/light/tx-icon-send-failed.svg
diff --git a/assets/svg/tx-icon-send-pending.svg b/assets/svg/light/tx-icon-send-pending.svg
similarity index 100%
rename from assets/svg/tx-icon-send-pending.svg
rename to assets/svg/light/tx-icon-send-pending.svg
diff --git a/assets/svg/tx-icon-send.svg b/assets/svg/light/tx-icon-send.svg
similarity index 100%
rename from assets/svg/tx-icon-send.svg
rename to assets/svg/light/tx-icon-send.svg
diff --git a/assets/svg/message-question-1.svg b/assets/svg/message-question-1.svg
new file mode 100644
index 000000000..17e066651
--- /dev/null
+++ b/assets/svg/message-question-1.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/svg/minimize.svg b/assets/svg/minimize.svg
new file mode 100644
index 000000000..94292fed4
--- /dev/null
+++ b/assets/svg/minimize.svg
@@ -0,0 +1,10 @@
+
diff --git a/assets/svg/stack-icon1.svg b/assets/svg/stack-icon1.svg
deleted file mode 100644
index bf5f8fae7..000000000
--- a/assets/svg/stack-icon1.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
diff --git a/assets/svg/wallet-fa.svg b/assets/svg/wallet-fa.svg
new file mode 100644
index 000000000..a91170596
--- /dev/null
+++ b/assets/svg/wallet-fa.svg
@@ -0,0 +1,4 @@
+
diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj
index ee489cbef..f4931c674 100644
--- a/ios/Runner.xcodeproj/project.pbxproj
+++ b/ios/Runner.xcodeproj/project.pbxproj
@@ -449,7 +449,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = 51;
+ CURRENT_PROJECT_VERSION = 61;
DEVELOPMENT_TEAM = 4DQKUWSG6C;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
@@ -503,7 +503,7 @@
"$(PROJECT_DIR)/../crypto_plugins/flutter_libmonero/cw_shared_external/ios/External/ios/**",
"$(PROJECT_DIR)/../crypto_plugins/flutter_libepiccash/ios/libs",
);
- MARKETING_VERSION = 1.4.39;
+ MARKETING_VERSION = 1.4.46;
ONLY_ACTIVE_ARCH = NO;
PRODUCT_BUNDLE_IDENTIFIER = com.cypherstack.stackwallet;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -633,7 +633,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = 51;
+ CURRENT_PROJECT_VERSION = 61;
DEVELOPMENT_TEAM = 4DQKUWSG6C;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
@@ -687,7 +687,7 @@
"$(PROJECT_DIR)/../crypto_plugins/flutter_libmonero/cw_shared_external/ios/External/ios/**",
"$(PROJECT_DIR)/../crypto_plugins/flutter_libepiccash/ios/libs",
);
- MARKETING_VERSION = 1.4.39;
+ MARKETING_VERSION = 1.4.46;
ONLY_ACTIVE_ARCH = NO;
PRODUCT_BUNDLE_IDENTIFIER = com.cypherstack.stackwallet;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -709,7 +709,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
- CURRENT_PROJECT_VERSION = 51;
+ CURRENT_PROJECT_VERSION = 61;
DEVELOPMENT_TEAM = 4DQKUWSG6C;
ENABLE_BITCODE = NO;
FRAMEWORK_SEARCH_PATHS = (
@@ -763,7 +763,7 @@
"$(PROJECT_DIR)/../crypto_plugins/flutter_libmonero/cw_shared_external/ios/External/ios/**",
"$(PROJECT_DIR)/../crypto_plugins/flutter_libepiccash/ios/libs",
);
- MARKETING_VERSION = 1.4.39;
+ MARKETING_VERSION = 1.4.46;
ONLY_ACTIVE_ARCH = NO;
PRODUCT_BUNDLE_IDENTIFIER = com.cypherstack.stackwallet;
PRODUCT_NAME = "$(TARGET_NAME)";
diff --git a/lib/hive/db.dart b/lib/hive/db.dart
index 3aae3096a..c8e148923 100644
--- a/lib/hive/db.dart
+++ b/lib/hive/db.dart
@@ -9,7 +9,6 @@ import 'package:stackwallet/models/notification_model.dart';
import 'package:stackwallet/models/trade_wallet_lookup.dart';
import 'package:stackwallet/services/wallets_service.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
-
import 'package:stackwallet/utilities/logger.dart';
class DB {
@@ -30,6 +29,7 @@ class DB {
static const String boxNameWalletsToDeleteOnStart = "walletsToDeleteOnStart";
static const String boxNamePriceCache = "priceAPIPrice24hCache";
static const String boxNameDBInfo = "dbInfo";
+ static const String boxNameTheme = "theme";
String boxNameTxCache({required Coin coin}) => "${coin.name}_txCache";
String boxNameSetCache({required Coin coin}) =>
diff --git a/lib/main.dart b/lib/main.dart
index 5aeb89508..914fe59c2 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -29,6 +29,7 @@ import 'package:stackwallet/pages/loading_view.dart';
import 'package:stackwallet/pages/pinpad_views/create_pin_view.dart';
import 'package:stackwallet/pages/pinpad_views/lock_screen_view.dart';
import 'package:stackwallet/pages/settings_views/global_settings_view/stack_backup_views/restore_from_encrypted_string_view.dart';
+import 'package:stackwallet/pages_desktop_specific/home/desktop_home_view.dart';
import 'package:stackwallet/providers/exchange/available_currencies_state_provider.dart';
import 'package:stackwallet/providers/exchange/available_floating_rate_pairs_state_provider.dart';
import 'package:stackwallet/providers/exchange/change_now_provider.dart';
@@ -41,6 +42,7 @@ import 'package:stackwallet/providers/global/base_currencies_provider.dart';
// import 'package:stackwallet/providers/global/has_authenticated_start_state_provider.dart';
import 'package:stackwallet/providers/global/trades_service_provider.dart';
import 'package:stackwallet/providers/providers.dart';
+import 'package:stackwallet/providers/ui/color_theme_provider.dart';
import 'package:stackwallet/route_generator.dart';
import 'package:stackwallet/services/debug_service.dart';
import 'package:stackwallet/services/locale_service.dart';
@@ -49,13 +51,17 @@ import 'package:stackwallet/services/notifications_api.dart';
import 'package:stackwallet/services/notifications_service.dart';
import 'package:stackwallet/services/trade_service.dart';
import 'package:stackwallet/services/wallets.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/db_version_migration.dart';
import 'package:stackwallet/utilities/enums/backup_frequency_type.dart';
import 'package:stackwallet/utilities/logger.dart';
import 'package:stackwallet/utilities/prefs.dart';
-import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/color_theme.dart';
+import 'package:stackwallet/utilities/theme/dark_colors.dart';
+import 'package:stackwallet/utilities/theme/light_colors.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
+import 'package:stackwallet/utilities/util.dart';
+import 'package:window_size/window_size.dart';
final openedFromSWBFileStringStateProvider =
StateProvider((ref) => null);
@@ -65,6 +71,13 @@ final openedFromSWBFileStringStateProvider =
// miscellaneous box for later use
void main() async {
WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized();
+
+ if (Util.isDesktop) {
+ setWindowTitle('Stack Wallet');
+ setWindowMinSize(const Size(1200, 900));
+ setWindowMaxSize(Size.infinite);
+ }
+
Directory appDirectory = (await getApplicationDocumentsDirectory());
if (Platform.isIOS) {
appDirectory = (await getLibraryDirectory());
@@ -130,6 +143,8 @@ void main() async {
monero.onStartup();
+ await Hive.openBox(DB.boxNameTheme);
+
// SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual,
// overlays: [SystemUiOverlay.bottom]);
await NotificationApi.init();
@@ -333,6 +348,18 @@ class _MaterialAppWithThemeState extends ConsumerState
@override
void initState() {
+ final colorScheme = DB.instance
+ .get(boxName: DB.boxNameTheme, key: "colorScheme") as String?;
+
+ ThemeType themeType;
+ switch (colorScheme) {
+ case "dark":
+ themeType = ThemeType.dark;
+ break;
+ case "light":
+ default:
+ themeType = ThemeType.light;
+ }
loadingCompleter = Completer();
WidgetsBinding.instance.addObserver(this);
// load locale and prefs
@@ -343,8 +370,12 @@ class _MaterialAppWithThemeState extends ConsumerState
_prefs = ref.read(prefsChangeNotifierProvider);
_wallets = ref.read(walletsChangeNotifierProvider);
- if (Platform.isAndroid) {
- WidgetsBinding.instance.addPostFrameCallback((_) async {
+ WidgetsBinding.instance.addPostFrameCallback((_) async {
+ ref.read(colorThemeProvider.state).state =
+ StackColors.fromStackColorTheme(
+ themeType == ThemeType.dark ? DarkColors() : LightColors());
+
+ if (Platform.isAndroid) {
// fetch open file if it exists
await getOpenFile();
@@ -358,8 +389,8 @@ class _MaterialAppWithThemeState extends ConsumerState
ref.read(openedFromSWBFileStringStateProvider.state).state = null;
}
// ref.read(shouldShowLockscreenOnResumeStateProvider.state).state = false;
- });
- }
+ }
+ });
super.initState();
}
@@ -491,36 +522,45 @@ class _MaterialAppWithThemeState extends ConsumerState
// addToDebugMessagesDB: false);
// });
+ final colorScheme = ref.watch(colorThemeProvider.state).state;
+
return MaterialApp(
key: GlobalKey(),
navigatorKey: navigatorKey,
title: 'Stack Wallet',
onGenerateRoute: RouteGenerator.generateRoute,
theme: ThemeData(
- highlightColor: CFColors.splashLight,
+ extensions: [colorScheme],
+ highlightColor: colorScheme.highlight,
brightness: Brightness.light,
fontFamily: GoogleFonts.inter().fontFamily,
- textTheme: GoogleFonts.interTextTheme().copyWith(
- button: STextStyles.button,
- ),
+ unselectedWidgetColor: colorScheme.radioButtonBorderDisabled,
+ // textTheme: GoogleFonts.interTextTheme().copyWith(
+ // button: STextStyles.button(context),
+ // subtitle1: STextStyles.field(context).copyWith(
+ // color: colorScheme.textDark,
+ // ),
+ // ),
radioTheme: const RadioThemeData(
splashRadius: 0,
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
),
// splashFactory: NoSplash.splashFactory,
splashColor: Colors.transparent,
- buttonTheme: const ButtonThemeData(
- splashColor: CFColors.splashMed,
+ buttonTheme: ButtonThemeData(
+ splashColor: colorScheme.splash,
),
textButtonTheme: TextButtonThemeData(
style: ButtonStyle(
// splashFactory: NoSplash.splashFactory,
- overlayColor: MaterialStateProperty.all(CFColors.splashMed),
+ overlayColor: MaterialStateProperty.all(colorScheme.splash),
minimumSize: MaterialStateProperty.all(const Size(46, 46)),
- textStyle: MaterialStateProperty.all(STextStyles.button),
- foregroundColor: MaterialStateProperty.all(CFColors.white),
- backgroundColor:
- MaterialStateProperty.all(CFColors.buttonGray),
+ // textStyle: MaterialStateProperty.all(
+ // STextStyles.button(context)),
+ foregroundColor:
+ MaterialStateProperty.all(colorScheme.buttonTextSecondary),
+ backgroundColor: MaterialStateProperty.all(
+ colorScheme.buttonBackSecondary),
shape: MaterialStateProperty.all(
RoundedRectangleBorder(
// 1000 to be relatively sure it keeps its pill shape
@@ -529,8 +569,8 @@ class _MaterialAppWithThemeState extends ConsumerState
),
),
),
- primaryColor: CFColors.stackAccent,
- primarySwatch: CFColors.createMaterialColor(CFColors.stackAccent),
+ primaryColor: colorScheme.accentColorDark,
+ primarySwatch: Util.createMaterialColor(colorScheme.accentColorDark),
checkboxTheme: CheckboxThemeData(
splashRadius: 0,
shape: RoundedRectangleBorder(
@@ -540,40 +580,44 @@ class _MaterialAppWithThemeState extends ConsumerState
checkColor: MaterialStateColor.resolveWith(
(state) {
if (state.contains(MaterialState.selected)) {
- return CFColors.white;
+ return colorScheme.checkboxIconChecked;
}
- return CFColors.link2;
+ return colorScheme.checkboxBGChecked;
},
),
fillColor: MaterialStateColor.resolveWith(
(states) {
if (states.contains(MaterialState.selected)) {
- return CFColors.link2;
+ return colorScheme.checkboxBGChecked;
}
- return CFColors.disabledButton;
+ return colorScheme.checkboxBorderEmpty;
},
),
),
- appBarTheme: const AppBarTheme(
+ appBarTheme: AppBarTheme(
centerTitle: false,
- color: CFColors.almostWhite,
+ color: colorScheme.background,
elevation: 0,
),
inputDecorationTheme: InputDecorationTheme(
- focusColor: CFColors.fieldGray,
- fillColor: CFColors.fieldGray,
+ focusColor: colorScheme.textFieldDefaultBG,
+ fillColor: colorScheme.textFieldDefaultBG,
filled: true,
contentPadding: const EdgeInsets.symmetric(
vertical: 6,
horizontal: 12,
),
- labelStyle: STextStyles.fieldLabel,
- hintStyle: STextStyles.fieldLabel,
- enabledBorder: _buildOutlineInputBorder(CFColors.fieldGray),
- focusedBorder: _buildOutlineInputBorder(CFColors.fieldGray),
- errorBorder: _buildOutlineInputBorder(CFColors.fieldGray),
- disabledBorder: _buildOutlineInputBorder(CFColors.fieldGray),
- focusedErrorBorder: _buildOutlineInputBorder(CFColors.fieldGray),
+ // labelStyle: STextStyles.fieldLabel(context),
+ // hintStyle: STextStyles.fieldLabel(context),
+ enabledBorder:
+ _buildOutlineInputBorder(colorScheme.textFieldDefaultBG),
+ focusedBorder:
+ _buildOutlineInputBorder(colorScheme.textFieldDefaultBG),
+ errorBorder: _buildOutlineInputBorder(colorScheme.textFieldDefaultBG),
+ disabledBorder:
+ _buildOutlineInputBorder(colorScheme.textFieldDefaultBG),
+ focusedErrorBorder:
+ _buildOutlineInputBorder(colorScheme.textFieldDefaultBG),
),
),
home: FutureBuilder(
@@ -595,6 +639,14 @@ class _MaterialAppWithThemeState extends ConsumerState
ref.read(prefsChangeNotifierProvider).startupWalletId;
}
+ // TODO proper desktop auth view
+ if (Util.isDesktop) {
+ Future.delayed(Duration.zero).then((value) =>
+ Navigator.of(context).pushNamedAndRemoveUntil(
+ DesktopHomeView.routeName, (route) => false));
+ return Container();
+ }
+
return LockscreenView(
isInitialAppLogin: true,
routeOnSuccess: HomeView.routeName,
diff --git a/lib/notifications/notification_card.dart b/lib/notifications/notification_card.dart
index 2047169db..67be236f0 100644
--- a/lib/notifications/notification_card.dart
+++ b/lib/notifications/notification_card.dart
@@ -1,9 +1,9 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:stackwallet/models/notification_model.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/format.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
import 'package:stackwallet/widgets/rounded_container.dart';
import 'package:stackwallet/widgets/rounded_white_container.dart';
@@ -42,7 +42,9 @@ class NotificationCard extends StatelessWidget {
),
child: SvgPicture.asset(
notification.iconAssetName,
- color: CFColors.stackAccent,
+ color: Theme.of(context)
+ .extension()!
+ .accentColorDark,
width: 24,
height: 24,
),
@@ -56,7 +58,7 @@ class NotificationCard extends StatelessWidget {
children: [
Text(
notification.title,
- style: STextStyles.titleBold12,
+ style: STextStyles.titleBold12(context),
),
const SizedBox(
height: 2,
@@ -66,11 +68,11 @@ class NotificationCard extends StatelessWidget {
children: [
Text(
notification.description,
- style: STextStyles.label,
+ style: STextStyles.label(context),
),
Text(
extractPrettyDateString(notification.date),
- style: STextStyles.label,
+ style: STextStyles.label(context),
),
],
),
@@ -83,7 +85,10 @@ class NotificationCard extends StatelessWidget {
if (notification.read)
Positioned.fill(
child: RoundedContainer(
- color: CFColors.almostWhite.withOpacity(0.5),
+ color: Theme.of(context)
+ .extension()!
+ .background
+ .withOpacity(0.5),
),
),
],
diff --git a/lib/notifications/show_flush_bar.dart b/lib/notifications/show_flush_bar.dart
index b250302bd..5320c8a9d 100644
--- a/lib/notifications/show_flush_bar.dart
+++ b/lib/notifications/show_flush_bar.dart
@@ -2,9 +2,9 @@ import 'package:another_flushbar/flushbar.dart';
import 'package:another_flushbar/flushbar_route.dart' as flushRoute;
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/flush_bar_type.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
Future showFloatingFlushBar({
required FlushBarType type,
@@ -19,16 +19,16 @@ Future showFloatingFlushBar({
Color fg;
switch (type) {
case FlushBarType.success:
- fg = CFColors.notificationGreenForeground;
- bg = CFColors.notificationGreenBackground;
+ fg = Theme.of(context).extension()!.snackBarTextSuccess;
+ bg = Theme.of(context).extension()!.snackBarBackSuccess;
break;
case FlushBarType.info:
- fg = CFColors.notificationBlueForeground;
- bg = CFColors.notificationBlueBackground;
+ fg = Theme.of(context).extension()!.snackBarTextInfo;
+ bg = Theme.of(context).extension()!.snackBarBackInfo;
break;
case FlushBarType.warning:
- fg = CFColors.notificationRedForeground;
- bg = CFColors.notificationRedBackground;
+ fg = Theme.of(context).extension()!.snackBarTextError;
+ bg = Theme.of(context).extension()!.snackBarBackError;
break;
}
final bar = Flushbar(
@@ -53,6 +53,7 @@ Future showFloatingFlushBar({
Constants.size.circularBorderRadius,
),
margin: const EdgeInsets.all(20),
+ maxWidth: 550,
);
final _route = flushRoute.showFlushbar(
diff --git a/lib/pages/add_wallet_views/add_wallet_view/add_wallet_view.dart b/lib/pages/add_wallet_views/add_wallet_view/add_wallet_view.dart
index 45180c842..ae72e1846 100644
--- a/lib/pages/add_wallet_views/add_wallet_view/add_wallet_view.dart
+++ b/lib/pages/add_wallet_views/add_wallet_view/add_wallet_view.dart
@@ -1,85 +1,223 @@
import 'package:flutter/material.dart';
-import 'package:flutter_riverpod/flutter_riverpod.dart';
-import 'package:stackwallet/pages/add_wallet_views/add_wallet_view/sub_widgets/coin_select_item.dart';
+import 'package:flutter_svg/svg.dart';
+import 'package:stackwallet/pages/add_wallet_views/add_wallet_view/sub_widgets/add_wallet_text.dart';
+import 'package:stackwallet/pages/add_wallet_views/add_wallet_view/sub_widgets/mobile_coin_list.dart';
import 'package:stackwallet/pages/add_wallet_views/add_wallet_view/sub_widgets/next_button.dart';
-import 'package:stackwallet/providers/global/prefs_provider.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
+import 'package:stackwallet/pages/add_wallet_views/add_wallet_view/sub_widgets/searchable_coin_list.dart';
+import 'package:stackwallet/pages_desktop_specific/home/my_stack_view/exit_to_my_stack_button.dart';
+import 'package:stackwallet/utilities/assets.dart';
+import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
+import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
+import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
+import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart';
+import 'package:stackwallet/widgets/icon_widgets/x_icon.dart';
+import 'package:stackwallet/widgets/rounded_white_container.dart';
+import 'package:stackwallet/widgets/stack_text_field.dart';
+import 'package:stackwallet/widgets/textfield_icon_button.dart';
-class AddWalletView extends StatelessWidget {
+class AddWalletView extends StatefulWidget {
const AddWalletView({Key? key}) : super(key: key);
static const routeName = "/addWallet";
@override
- Widget build(BuildContext context) {
- List coins = [...Coin.values];
- coins.remove(Coin.firoTestNet);
- return Scaffold(
- appBar: AppBar(
- leading: AppBarBackButton(
- onPressed: () {
- Navigator.of(context).pop();
- },
- ),
- ),
- body: Container(
- color: CFColors.almostWhite,
- child: Padding(
- padding: const EdgeInsets.all(16),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.stretch,
- children: [
- Text(
- "Add wallet",
- textAlign: TextAlign.center,
- style: STextStyles.pageTitleH1,
- ),
- const SizedBox(
- height: 16,
- ),
- Text(
- "Select wallet currency",
- textAlign: TextAlign.center,
- style: STextStyles.subtitle,
- ),
- const SizedBox(
- height: 16,
- ),
- Expanded(
- child: Consumer(
- builder: (_, ref, __) {
- bool showTestNet = ref.watch(
- prefsChangeNotifierProvider
- .select((value) => value.showTestNetCoins),
- );
+ State createState() => _AddWalletViewState();
+}
- return ListView.builder(
- itemCount: showTestNet
- ? coins.length
- : coins.length - (kTestNetCoinCount),
- itemBuilder: (ctx, index) {
- return Padding(
- padding: const EdgeInsets.all(4),
- child: CoinSelectItem(
- coin: coins[index],
+class _AddWalletViewState extends State {
+ late final TextEditingController _searchFieldController;
+ late final FocusNode _searchFocusNode;
+
+ String _searchTerm = "";
+
+ final List coins = [...Coin.values];
+
+ @override
+ void initState() {
+ _searchFieldController = TextEditingController();
+ _searchFocusNode = FocusNode();
+ coins.remove(Coin.firoTestNet);
+ super.initState();
+ }
+
+ @override
+ void dispose() {
+ _searchFieldController.dispose();
+ _searchFocusNode.dispose();
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ debugPrint("BUILD: $runtimeType");
+
+ if (Util.isDesktop) {
+ return DesktopScaffold(
+ appBar: const DesktopAppBar(
+ isCompactHeight: false,
+ leading: AppBarBackButton(),
+ trailing: ExitToMyStackButton(),
+ ),
+ body: Column(
+ children: [
+ const AddWalletText(
+ isDesktop: true,
+ ),
+ const SizedBox(
+ height: 16,
+ ),
+ Expanded(
+ child: SizedBox(
+ width: 480,
+ child: RoundedWhiteContainer(
+ radiusMultiplier: 2,
+ padding: const EdgeInsets.only(
+ left: 16,
+ top: 16,
+ right: 16,
+ bottom: 0,
+ ),
+ child: Column(
+ children: [
+ Padding(
+ padding: const EdgeInsets.all(4.0),
+ child: ClipRRect(
+ borderRadius: BorderRadius.circular(
+ Constants.size.circularBorderRadius,
),
- );
- },
- );
- },
+ child: TextField(
+ controller: _searchFieldController,
+ focusNode: _searchFocusNode,
+ onChanged: (value) {
+ setState(() {
+ _searchTerm = value;
+ });
+ },
+ style:
+ STextStyles.desktopTextMedium(context).copyWith(
+ height: 2,
+ ),
+ decoration: standardInputDecoration(
+ "Search",
+ _searchFocusNode,
+ context,
+ ).copyWith(
+ contentPadding: const EdgeInsets.symmetric(
+ vertical: 10,
+ ),
+ prefixIcon: Padding(
+ padding: const EdgeInsets.symmetric(
+ horizontal: 16,
+ // vertical: 20,
+ ),
+ child: SvgPicture.asset(
+ Assets.svg.search,
+ width: 24,
+ height: 24,
+ color: Theme.of(context)
+ .extension()!
+ .textFieldDefaultSearchIconLeft,
+ ),
+ ),
+ suffixIcon: _searchFieldController.text.isNotEmpty
+ ? Padding(
+ padding: const EdgeInsets.only(right: 10),
+ child: UnconstrainedBox(
+ child: Row(
+ children: [
+ TextFieldIconButton(
+ child: const XIcon(
+ width: 24,
+ height: 24,
+ ),
+ onTap: () async {
+ setState(() {
+ _searchFieldController.text =
+ "";
+ _searchTerm = "";
+ });
+ },
+ ),
+ ],
+ ),
+ ),
+ )
+ : null,
+ ),
+ ),
+ ),
+ ),
+ Expanded(
+ child: SearchableCoinList(
+ coins: coins,
+ isDesktop: true,
+ searchTerm: _searchTerm,
+ ),
+ ),
+ ],
+ ),
),
),
- const SizedBox(
- height: 16,
+ ),
+ const SizedBox(
+ height: 16,
+ ),
+ const SizedBox(
+ height: 70,
+ width: 480,
+ child: AddWalletNextButton(
+ isDesktop: true,
),
- const AddWalletNextButton(),
- ],
+ ),
+ const SizedBox(
+ height: 32,
+ ),
+ ],
+ ),
+ );
+ } else {
+ return Scaffold(
+ appBar: AppBar(
+ leading: AppBarBackButton(
+ onPressed: () {
+ Navigator.of(context).pop();
+ },
),
),
- ),
- );
+ body: Container(
+ color: Theme.of(context).extension()!.background,
+ child: Padding(
+ padding: const EdgeInsets.all(16),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.stretch,
+ children: [
+ const AddWalletText(
+ isDesktop: false,
+ ),
+ const SizedBox(
+ height: 16,
+ ),
+ Expanded(
+ child: MobileCoinList(
+ coins: coins,
+ isDesktop: false,
+ ),
+ ),
+ const SizedBox(
+ height: 16,
+ ),
+ const AddWalletNextButton(
+ isDesktop: false,
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
}
}
diff --git a/lib/pages/add_wallet_views/add_wallet_view/sub_widgets/add_wallet_text.dart b/lib/pages/add_wallet_views/add_wallet_view/sub_widgets/add_wallet_text.dart
new file mode 100644
index 000000000..40e20c3f0
--- /dev/null
+++ b/lib/pages/add_wallet_views/add_wallet_view/sub_widgets/add_wallet_text.dart
@@ -0,0 +1,34 @@
+import 'package:flutter/material.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+
+class AddWalletText extends StatelessWidget {
+ const AddWalletText({Key? key, required this.isDesktop}) : super(key: key);
+
+ final bool isDesktop;
+
+ @override
+ Widget build(BuildContext context) {
+ return Column(
+ crossAxisAlignment: CrossAxisAlignment.stretch,
+ children: [
+ Text(
+ "Add wallet",
+ textAlign: TextAlign.center,
+ style: isDesktop
+ ? STextStyles.desktopH2(context)
+ : STextStyles.pageTitleH1(context),
+ ),
+ const SizedBox(
+ height: 16,
+ ),
+ Text(
+ "Select wallet currency",
+ textAlign: TextAlign.center,
+ style: isDesktop
+ ? STextStyles.desktopSubtitleH2(context)
+ : STextStyles.subtitle(context),
+ ),
+ ],
+ );
+ }
+}
diff --git a/lib/pages/add_wallet_views/add_wallet_view/sub_widgets/coin_select_item.dart b/lib/pages/add_wallet_views/add_wallet_view/sub_widgets/coin_select_item.dart
index 8ab1a4ffe..0821b8aae 100644
--- a/lib/pages/add_wallet_views/add_wallet_view/sub_widgets/coin_select_item.dart
+++ b/lib/pages/add_wallet_views/add_wallet_view/sub_widgets/coin_select_item.dart
@@ -3,10 +3,11 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_svg/svg.dart';
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/utilities/assets.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
+import 'package:stackwallet/utilities/util.dart';
class CoinSelectItem extends ConsumerWidget {
const CoinSelectItem({
@@ -20,40 +21,71 @@ class CoinSelectItem extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
debugPrint("BUILD: CoinSelectItem for ${coin.name}");
final selectedCoin = ref.watch(addWalletSelectedCoinStateProvider);
+
+ final isDesktop = Util.isDesktop;
+
return Container(
decoration: BoxDecoration(
// color: selectedCoin == coin ? CFColors.selection : CFColors.white,
- color: selectedCoin == coin ? CFColors.selected2 : CFColors.white,
+ color: selectedCoin == coin
+ ? Theme.of(context).extension()!.textFieldActiveBG
+ : Theme.of(context).extension()!.popupBG,
borderRadius:
BorderRadius.circular(Constants.size.circularBorderRadius),
),
child: MaterialButton(
- // splashColor: CFColors.splashLight,
+ // splashColor: Theme.of(context).extension()!.highlight,
key: Key("coinSelectItemButtonKey_${coin.name}"),
- padding: const EdgeInsets.all(12),
+ padding: isDesktop
+ ? const EdgeInsets.only(left: 24)
+ : const EdgeInsets.all(12),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.circular(Constants.size.circularBorderRadius),
),
- child: Row(
- children: [
- SvgPicture.asset(
- Assets.svg.iconFor(coin: coin),
- width: 26,
- height: 26,
- ),
- const SizedBox(
- width: 10,
- ),
- Text(
- coin.prettyName,
- style: STextStyles.subtitle.copyWith(
- fontWeight: FontWeight.w600,
- fontSize: 14,
+ child: ConstrainedBox(
+ constraints: BoxConstraints(
+ minHeight: isDesktop ? 70 : 0,
+ ),
+ child: Row(
+ children: [
+ SvgPicture.asset(
+ Assets.svg.iconFor(coin: coin),
+ width: 26,
+ height: 26,
),
- ),
- ],
+ SizedBox(
+ width: isDesktop ? 12 : 10,
+ ),
+ Text(
+ coin.prettyName,
+ style: isDesktop
+ ? STextStyles.desktopTextMedium(context)
+ : STextStyles.subtitle(context).copyWith(
+ fontWeight: FontWeight.w600,
+ fontSize: 14,
+ ),
+ ),
+ if (isDesktop && selectedCoin == coin) const Spacer(),
+ if (isDesktop && selectedCoin == coin)
+ Padding(
+ padding: const EdgeInsets.only(
+ right: 18,
+ ),
+ child: SizedBox(
+ width: 24,
+ height: 24,
+ child: SvgPicture.asset(
+ Assets.svg.check,
+ color: Theme.of(context)
+ .extension()!
+ .accentColorDark,
+ ),
+ ),
+ ),
+ ],
+ ),
),
onPressed: () =>
ref.read(addWalletSelectedCoinStateProvider.state).state = coin,
diff --git a/lib/pages/add_wallet_views/add_wallet_view/sub_widgets/mobile_coin_list.dart b/lib/pages/add_wallet_views/add_wallet_view/sub_widgets/mobile_coin_list.dart
new file mode 100644
index 000000000..1f36f3b65
--- /dev/null
+++ b/lib/pages/add_wallet_views/add_wallet_view/sub_widgets/mobile_coin_list.dart
@@ -0,0 +1,40 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:stackwallet/pages/add_wallet_views/add_wallet_view/sub_widgets/coin_select_item.dart';
+import 'package:stackwallet/providers/global/prefs_provider.dart';
+import 'package:stackwallet/utilities/enums/coin_enum.dart';
+
+class MobileCoinList extends StatelessWidget {
+ const MobileCoinList({
+ Key? key,
+ required this.coins,
+ required this.isDesktop,
+ }) : super(key: key);
+
+ final List coins;
+ final bool isDesktop;
+
+ @override
+ Widget build(BuildContext context) {
+ return Consumer(
+ builder: (_, ref, __) {
+ bool showTestNet = ref.watch(
+ prefsChangeNotifierProvider.select((value) => value.showTestNetCoins),
+ );
+
+ return ListView.builder(
+ itemCount:
+ showTestNet ? coins.length : coins.length - (kTestNetCoinCount),
+ itemBuilder: (ctx, index) {
+ return Padding(
+ padding: const EdgeInsets.all(4),
+ child: CoinSelectItem(
+ coin: coins[index],
+ ),
+ );
+ },
+ );
+ },
+ );
+ }
+}
diff --git a/lib/pages/add_wallet_views/add_wallet_view/sub_widgets/next_button.dart b/lib/pages/add_wallet_views/add_wallet_view/sub_widgets/next_button.dart
index 61a0ef7b1..9314a8770 100644
--- a/lib/pages/add_wallet_views/add_wallet_view/sub_widgets/next_button.dart
+++ b/lib/pages/add_wallet_views/add_wallet_view/sub_widgets/next_button.dart
@@ -2,19 +2,27 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:stackwallet/pages/add_wallet_views/create_or_restore_wallet_view/create_or_restore_wallet_view.dart';
import 'package:stackwallet/providers/providers.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
class AddWalletNextButton extends ConsumerWidget {
- const AddWalletNextButton({Key? key}) : super(key: key);
+ const AddWalletNextButton({
+ Key? key,
+ required this.isDesktop,
+ }) : super(key: key);
+
+ final bool isDesktop;
@override
Widget build(BuildContext context, WidgetRef ref) {
debugPrint("BUILD: NextButton");
final selectedCoin =
ref.watch(addWalletSelectedCoinStateProvider.state).state;
+
+ final enabled = selectedCoin != null;
+
return TextButton(
- onPressed: selectedCoin == null
+ onPressed: !enabled
? null
: () {
final selectedCoin =
@@ -25,22 +33,20 @@ class AddWalletNextButton extends ConsumerWidget {
arguments: selectedCoin,
);
},
- style: selectedCoin == null
- ? Theme.of(context).textButtonTheme.style?.copyWith(
- backgroundColor: MaterialStateProperty.all(
- CFColors.stackAccent.withOpacity(
- 0.25,
- ),
- ),
- )
- : Theme.of(context).textButtonTheme.style?.copyWith(
- backgroundColor: MaterialStateProperty.all(
- CFColors.stackAccent,
- ),
- ),
+ style: enabled
+ ? Theme.of(context)
+ .extension()!
+ .getPrimaryEnabledButtonColor(context)
+ : Theme.of(context)
+ .extension()!
+ .getPrimaryDisabledButtonColor(context),
child: Text(
"Next",
- style: STextStyles.button,
+ style: isDesktop
+ ? enabled
+ ? STextStyles.desktopButtonEnabled(context)
+ : STextStyles.desktopButtonDisabled(context)
+ : STextStyles.button(context),
),
);
}
diff --git a/lib/pages/add_wallet_views/add_wallet_view/sub_widgets/searchable_coin_list.dart b/lib/pages/add_wallet_views/add_wallet_view/sub_widgets/searchable_coin_list.dart
new file mode 100644
index 000000000..fb443b915
--- /dev/null
+++ b/lib/pages/add_wallet_views/add_wallet_view/sub_widgets/searchable_coin_list.dart
@@ -0,0 +1,57 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:stackwallet/pages/add_wallet_views/add_wallet_view/sub_widgets/coin_select_item.dart';
+import 'package:stackwallet/providers/global/prefs_provider.dart';
+import 'package:stackwallet/utilities/enums/coin_enum.dart';
+
+class SearchableCoinList extends ConsumerWidget {
+ const SearchableCoinList({
+ Key? key,
+ required this.coins,
+ required this.isDesktop,
+ required this.searchTerm,
+ }) : super(key: key);
+
+ final List coins;
+ final bool isDesktop;
+ final String searchTerm;
+
+ List filterCoins(String text, bool showTestNetCoins) {
+ final _coins = [...coins];
+ if (text.isNotEmpty) {
+ final lowercaseTerm = text.toLowerCase();
+ _coins.retainWhere((e) =>
+ e.ticker.toLowerCase().contains(lowercaseTerm) ||
+ e.prettyName.toLowerCase().contains(lowercaseTerm) ||
+ e.name.toLowerCase().contains(lowercaseTerm));
+ }
+ if (!showTestNetCoins) {
+ _coins.removeWhere((e) => e.name.endsWith("TestNet"));
+ }
+ // remove firo testnet regardless
+ _coins.remove(Coin.firoTestNet);
+
+ return _coins;
+ }
+
+ @override
+ Widget build(BuildContext context, WidgetRef ref) {
+ bool showTestNet = ref.watch(
+ prefsChangeNotifierProvider.select((value) => value.showTestNetCoins),
+ );
+
+ final _coins = filterCoins(searchTerm, showTestNet);
+
+ return ListView.builder(
+ itemCount: _coins.length,
+ itemBuilder: (ctx, index) {
+ return Padding(
+ padding: const EdgeInsets.all(4),
+ child: CoinSelectItem(
+ coin: _coins[index],
+ ),
+ );
+ },
+ );
+ }
+}
diff --git a/lib/pages/add_wallet_views/create_or_restore_wallet_view/create_or_restore_wallet_view.dart b/lib/pages/add_wallet_views/create_or_restore_wallet_view/create_or_restore_wallet_view.dart
index 50c91a514..ffd32479d 100644
--- a/lib/pages/add_wallet_views/create_or_restore_wallet_view/create_or_restore_wallet_view.dart
+++ b/lib/pages/add_wallet_views/create_or_restore_wallet_view/create_or_restore_wallet_view.dart
@@ -1,12 +1,15 @@
import 'package:flutter/material.dart';
-import 'package:stackwallet/pages/add_wallet_views/name_your_wallet_view/name_your_wallet_view.dart';
-import 'package:stackwallet/utilities/assets.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
-import 'package:stackwallet/utilities/enums/add_wallet_type_enum.dart';
+import 'package:stackwallet/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/coin_image.dart';
+import 'package:stackwallet/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/create_or_restore_wallet_subtitle.dart';
+import 'package:stackwallet/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/create_or_restore_wallet_title.dart';
+import 'package:stackwallet/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/create_wallet_button_group.dart';
+import 'package:stackwallet/pages_desktop_specific/home/my_stack_view/exit_to_my_stack_button.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
-import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
+import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
-import 'package:tuple/tuple.dart';
+import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
+import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart';
class CreateOrRestoreWalletView extends StatelessWidget {
const CreateOrRestoreWalletView({
@@ -22,97 +25,100 @@ class CreateOrRestoreWalletView extends StatelessWidget {
Widget build(BuildContext context) {
debugPrint("BUILD: $runtimeType");
- return Scaffold(
- appBar: AppBar(
- leading: AppBarBackButton(
- onPressed: () {
- Navigator.of(context).pop();
- },
+ final isDesktop = Util.isDesktop;
+
+ if (isDesktop) {
+ return DesktopScaffold(
+ appBar: const DesktopAppBar(
+ isCompactHeight: false,
+ leading: AppBarBackButton(),
+ trailing: ExitToMyStackButton(),
),
- ),
- body: Container(
- color: CFColors.almostWhite,
- child: Padding(
- padding: const EdgeInsets.all(16),
+ body: SizedBox(
+ width: 480,
child: Column(
- crossAxisAlignment: CrossAxisAlignment.stretch,
+ mainAxisAlignment: MainAxisAlignment.center,
+ crossAxisAlignment: CrossAxisAlignment.center,
children: [
- Padding(
- padding: const EdgeInsets.all(31),
- child: Image(
- image: AssetImage(
- Assets.png.imageFor(coin: coin),
- ),
- width: MediaQuery.of(context).size.width / 3,
- ),
- ),
- const Spacer(
- flex: 2,
- ),
- Text(
- "Add ${coin.prettyName} wallet",
- textAlign: TextAlign.center,
- style: STextStyles.pageTitleH1,
+ CreateRestoreWalletTitle(
+ coin: coin,
+ isDesktop: isDesktop,
),
const SizedBox(
- height: 8,
+ height: 16,
),
- Text(
- "Create a new wallet or restore an existing wallet from seed.",
- textAlign: TextAlign.center,
- style: STextStyles.subtitle),
- const Spacer(
- flex: 5,
- ),
- TextButton(
- style: Theme.of(context).textButtonTheme.style?.copyWith(
- backgroundColor: MaterialStateProperty.all(
- CFColors.stackAccent,
- ),
- ),
- onPressed: () {
- Navigator.of(context).pushNamed(
- NameYourWalletView.routeName,
- arguments: Tuple2(
- AddWalletType.New,
- coin,
- ),
- );
- },
- child: Text(
- "Create new wallet",
- style: STextStyles.button,
+ SizedBox(
+ width: 324,
+ child: CreateRestoreWalletSubTitle(
+ isDesktop: isDesktop,
),
),
const SizedBox(
- height: 12,
+ height: 32,
),
- TextButton(
- style: Theme.of(context).textButtonTheme.style?.copyWith(
- backgroundColor: MaterialStateProperty.all(
- CFColors.stackAccent.withOpacity(0.25),
- ),
- ),
- onPressed: () {
- Navigator.of(context).pushNamed(
- NameYourWalletView.routeName,
- arguments: Tuple2(
- AddWalletType.Restore,
- coin,
- ),
- );
- },
- child: Text(
- "Restore wallet",
- style: STextStyles.button.copyWith(
- color: CFColors.stackAccent,
- ),
- ),
+ CoinImage(
+ coin: coin,
+ isDesktop: isDesktop,
+ ),
+ const SizedBox(
+ height: 32,
+ ),
+ CreateWalletButtonGroup(
+ coin: coin,
+ isDesktop: isDesktop,
),
],
),
),
- ),
- );
+ );
+ } else {
+ return Scaffold(
+ appBar: AppBar(
+ leading: AppBarBackButton(
+ onPressed: () {
+ Navigator.of(context).pop();
+ },
+ ),
+ ),
+ body: Container(
+ color: Theme.of(context).extension()!.background,
+ child: Padding(
+ padding: const EdgeInsets.all(16),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.stretch,
+ children: [
+ Padding(
+ padding: const EdgeInsets.all(31),
+ child: CoinImage(
+ coin: coin,
+ isDesktop: isDesktop,
+ ),
+ ),
+ const Spacer(
+ flex: 2,
+ ),
+ CreateRestoreWalletTitle(
+ coin: coin,
+ isDesktop: isDesktop,
+ ),
+ const SizedBox(
+ height: 8,
+ ),
+ CreateRestoreWalletSubTitle(
+ isDesktop: isDesktop,
+ ),
+ const Spacer(
+ flex: 5,
+ ),
+ CreateWalletButtonGroup(
+ coin: coin,
+ isDesktop: isDesktop,
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
}
}
diff --git a/lib/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/coin_image.dart b/lib/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/coin_image.dart
new file mode 100644
index 000000000..c96cc14ad
--- /dev/null
+++ b/lib/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/coin_image.dart
@@ -0,0 +1,24 @@
+import 'package:flutter/material.dart';
+import 'package:stackwallet/utilities/assets.dart';
+import 'package:stackwallet/utilities/enums/coin_enum.dart';
+
+class CoinImage extends StatelessWidget {
+ const CoinImage({
+ Key? key,
+ required this.coin,
+ required this.isDesktop,
+ }) : super(key: key);
+
+ final Coin coin;
+ final bool isDesktop;
+
+ @override
+ Widget build(BuildContext context) {
+ return Image(
+ image: AssetImage(
+ Assets.png.imageFor(coin: coin),
+ ),
+ width: isDesktop ? 324 : MediaQuery.of(context).size.width / 3,
+ );
+ }
+}
diff --git a/lib/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/create_or_restore_wallet_subtitle.dart b/lib/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/create_or_restore_wallet_subtitle.dart
new file mode 100644
index 000000000..2b6168509
--- /dev/null
+++ b/lib/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/create_or_restore_wallet_subtitle.dart
@@ -0,0 +1,22 @@
+import 'package:flutter/material.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+
+class CreateRestoreWalletSubTitle extends StatelessWidget {
+ const CreateRestoreWalletSubTitle({
+ Key? key,
+ required this.isDesktop,
+ }) : super(key: key);
+
+ final bool isDesktop;
+
+ @override
+ Widget build(BuildContext context) {
+ return Text(
+ "Create a new wallet or restore an existing wallet from seed.",
+ textAlign: TextAlign.center,
+ style: isDesktop
+ ? STextStyles.desktopSubtitleH2(context)
+ : STextStyles.subtitle(context),
+ );
+ }
+}
diff --git a/lib/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/create_or_restore_wallet_title.dart b/lib/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/create_or_restore_wallet_title.dart
new file mode 100644
index 000000000..8ac5af718
--- /dev/null
+++ b/lib/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/create_or_restore_wallet_title.dart
@@ -0,0 +1,25 @@
+import 'package:flutter/material.dart';
+import 'package:stackwallet/utilities/enums/coin_enum.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+
+class CreateRestoreWalletTitle extends StatelessWidget {
+ const CreateRestoreWalletTitle({
+ Key? key,
+ required this.coin,
+ required this.isDesktop,
+ }) : super(key: key);
+
+ final Coin coin;
+ final bool isDesktop;
+
+ @override
+ Widget build(BuildContext context) {
+ return Text(
+ "Add ${coin.prettyName} wallet",
+ textAlign: TextAlign.center,
+ style: isDesktop
+ ? STextStyles.desktopH2(context)
+ : STextStyles.pageTitleH1(context),
+ );
+ }
+}
diff --git a/lib/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/create_wallet_button_group.dart b/lib/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/create_wallet_button_group.dart
new file mode 100644
index 000000000..4a7661892
--- /dev/null
+++ b/lib/pages/add_wallet_views/create_or_restore_wallet_view/sub_widgets/create_wallet_button_group.dart
@@ -0,0 +1,86 @@
+import 'package:flutter/material.dart';
+import 'package:stackwallet/pages/add_wallet_views/name_your_wallet_view/name_your_wallet_view.dart';
+import 'package:stackwallet/utilities/enums/add_wallet_type_enum.dart';
+import 'package:stackwallet/utilities/enums/coin_enum.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
+import 'package:tuple/tuple.dart';
+
+class CreateWalletButtonGroup extends StatelessWidget {
+ const CreateWalletButtonGroup({
+ Key? key,
+ required this.coin,
+ required this.isDesktop,
+ }) : super(key: key);
+
+ final Coin coin;
+ final bool isDesktop;
+
+ @override
+ Widget build(BuildContext context) {
+ return Column(
+ crossAxisAlignment:
+ isDesktop ? CrossAxisAlignment.center : CrossAxisAlignment.stretch,
+ children: [
+ ConstrainedBox(
+ constraints: BoxConstraints(
+ minHeight: isDesktop ? 70 : 0,
+ minWidth: isDesktop ? 480 : 0,
+ ),
+ child: TextButton(
+ style: Theme.of(context)
+ .extension()!
+ .getPrimaryEnabledButtonColor(context),
+ onPressed: () {
+ Navigator.of(context).pushNamed(
+ NameYourWalletView.routeName,
+ arguments: Tuple2(
+ AddWalletType.New,
+ coin,
+ ),
+ );
+ },
+ child: Text(
+ "Create new wallet",
+ style: isDesktop
+ ? STextStyles.desktopButtonEnabled(context)
+ : STextStyles.button(context),
+ ),
+ ),
+ ),
+ SizedBox(
+ height: isDesktop ? 16 : 12,
+ ),
+ ConstrainedBox(
+ constraints: BoxConstraints(
+ minHeight: isDesktop ? 70 : 0,
+ minWidth: isDesktop ? 480 : 0,
+ ),
+ child: TextButton(
+ style: Theme.of(context)
+ .extension()!
+ .getSecondaryEnabledButtonColor(context),
+ onPressed: () {
+ Navigator.of(context).pushNamed(
+ NameYourWalletView.routeName,
+ arguments: Tuple2(
+ AddWalletType.Restore,
+ coin,
+ ),
+ );
+ },
+ child: Text(
+ "Restore wallet",
+ style: isDesktop
+ ? STextStyles.desktopButtonSecondaryEnabled(context)
+ : STextStyles.button(context).copyWith(
+ color: Theme.of(context)
+ .extension()!
+ .accentColorDark),
+ ),
+ ),
+ ),
+ ],
+ );
+ }
+}
diff --git a/lib/pages/add_wallet_views/name_your_wallet_view/name_your_wallet_view.dart b/lib/pages/add_wallet_views/name_your_wallet_view/name_your_wallet_view.dart
index 5338c8461..cff9fd2cf 100644
--- a/lib/pages/add_wallet_views/name_your_wallet_view/name_your_wallet_view.dart
+++ b/lib/pages/add_wallet_views/name_your_wallet_view/name_your_wallet_view.dart
@@ -1,19 +1,25 @@
+import 'dart:async';
+
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:stackwallet/notifications/show_flush_bar.dart';
import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart';
-import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/restore_options_view.dart';
+import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/restore_options_view/restore_options_view.dart';
+import 'package:stackwallet/pages_desktop_specific/home/my_stack_view/exit_to_my_stack_button.dart';
import 'package:stackwallet/providers/global/wallets_service_provider.dart';
import 'package:stackwallet/providers/ui/verify_recovery_phrase/mnemonic_word_count_state_provider.dart';
import 'package:stackwallet/utilities/assets.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/add_wallet_type_enum.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/enums/flush_bar_type.dart';
import 'package:stackwallet/utilities/name_generator.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
+import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
+import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
+import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart';
import 'package:stackwallet/widgets/icon_widgets/dice_icon.dart';
import 'package:stackwallet/widgets/icon_widgets/x_icon.dart';
import 'package:stackwallet/widgets/rounded_white_container.dart';
@@ -21,14 +27,6 @@ import 'package:stackwallet/widgets/stack_text_field.dart';
import 'package:stackwallet/widgets/textfield_icon_button.dart';
import 'package:tuple/tuple.dart';
-// TODO replace with real list and move out of this file
-const kWalletNameWordList = [
- "Bubby",
- "Baby",
- "Bobby",
- "Booby",
-];
-
class NameYourWalletView extends ConsumerStatefulWidget {
const NameYourWalletView({
Key? key,
@@ -59,6 +57,8 @@ class _NameYourWalletViewState extends ConsumerState {
Set namesToExclude = {};
late final NameGenerator generator;
+ late final bool isDesktop;
+
Future _generateRandomWalletName() async {
final name = generator.generate(namesToExclude: namesToExclude);
namesToExclude.add(name);
@@ -67,6 +67,8 @@ class _NameYourWalletViewState extends ConsumerState {
@override
void initState() {
+ isDesktop = Util.isDesktop;
+
ref.read(walletsServiceChangeNotifierProvider).walletNames.then(
(value) => namesToExclude.addAll(
value.values.map((e) => e.name),
@@ -92,231 +94,270 @@ class _NameYourWalletViewState extends ConsumerState {
Widget build(BuildContext context) {
debugPrint(
"BUILD: NameYourWalletView with ${coin.name} ${addWalletType.name}");
- return Scaffold(
- appBar: AppBar(
- leading: AppBarBackButton(
- onPressed: () {
- if (textFieldFocusNode.hasFocus) {
- textFieldFocusNode.unfocus();
- Future.delayed(const Duration(milliseconds: 100))
- .then((value) => Navigator.of(context).pop());
- } else {
- if (mounted) {
- Navigator.of(context).pop();
- }
- }
- },
+
+ if (isDesktop) {
+ return DesktopScaffold(
+ appBar: const DesktopAppBar(
+ leading: AppBarBackButton(),
+ trailing: ExitToMyStackButton(),
+ isCompactHeight: false,
),
- ),
- body: Container(
- color: CFColors.almostWhite,
- child: Padding(
- padding: const EdgeInsets.all(16),
- child: LayoutBuilder(
- builder: (ctx, constraints) {
- return SingleChildScrollView(
- child: ConstrainedBox(
- constraints: BoxConstraints(minHeight: constraints.maxHeight),
- child: IntrinsicHeight(
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.stretch,
+ body: SizedBox(
+ width: 480,
+ child: _content(),
+ ),
+ );
+ } else {
+ return Scaffold(
+ appBar: AppBar(
+ leading: AppBarBackButton(
+ onPressed: () {
+ if (textFieldFocusNode.hasFocus) {
+ textFieldFocusNode.unfocus();
+ Future.delayed(const Duration(milliseconds: 100))
+ .then((value) => Navigator.of(context).pop());
+ } else {
+ if (mounted) {
+ Navigator.of(context).pop();
+ }
+ }
+ },
+ ),
+ ),
+ body: Container(
+ color: Theme.of(context).extension()!.background,
+ child: Padding(
+ padding: const EdgeInsets.all(16),
+ child: LayoutBuilder(
+ builder: (ctx, constraints) {
+ return SingleChildScrollView(
+ child: ConstrainedBox(
+ constraints:
+ BoxConstraints(minHeight: constraints.maxHeight),
+ child: IntrinsicHeight(
+ child: _content(),
+ ),
+ ),
+ );
+ },
+ ),
+ ),
+ ),
+ );
+ }
+ }
+
+ Widget _content() => Column(
+ crossAxisAlignment:
+ isDesktop ? CrossAxisAlignment.center : CrossAxisAlignment.stretch,
+ children: [
+ if (!isDesktop)
+ const Spacer(
+ flex: 1,
+ ),
+ if (!isDesktop)
+ Image(
+ image: AssetImage(
+ Assets.png.imageFor(coin: coin),
+ ),
+ height: 100,
+ ),
+ SizedBox(
+ height: isDesktop ? 24 : 16,
+ ),
+ Text(
+ "Name your ${coin.prettyName} wallet",
+ textAlign: TextAlign.center,
+ style: isDesktop
+ ? STextStyles.desktopH2(context)
+ : STextStyles.pageTitleH1(context),
+ ),
+ SizedBox(
+ height: isDesktop ? 16 : 8,
+ ),
+ Text(
+ "Enter a label for your wallet (e.g. Savings)",
+ textAlign: TextAlign.center,
+ style: isDesktop
+ ? STextStyles.desktopSubtitleH2(context)
+ : STextStyles.subtitle(context),
+ ),
+ SizedBox(
+ height: isDesktop ? 40 : 16,
+ ),
+ ClipRRect(
+ borderRadius: BorderRadius.circular(
+ Constants.size.circularBorderRadius,
+ ),
+ child: TextField(
+ onChanged: (string) {
+ if (string.isEmpty) {
+ if (_nextEnabled) {
+ setState(() {
+ _nextEnabled = false;
+ _showDiceIcon = true;
+ });
+ }
+ } else {
+ if (!_nextEnabled) {
+ setState(() {
+ _nextEnabled = true;
+ _showDiceIcon = false;
+ });
+ }
+ }
+ },
+ focusNode: textFieldFocusNode,
+ controller: textEditingController,
+ style: isDesktop
+ ? STextStyles.desktopTextMedium(context).copyWith(
+ height: 2,
+ )
+ : STextStyles.field(context),
+ decoration: standardInputDecoration(
+ "Enter wallet name",
+ textFieldFocusNode,
+ context,
+ ).copyWith(
+ suffixIcon: Padding(
+ padding: EdgeInsets.only(right: isDesktop ? 6 : 0),
+ child: UnconstrainedBox(
+ child: Row(
children: [
- const Spacer(
- flex: 1,
- ),
- Image(
- image: AssetImage(
- Assets.png.imageFor(coin: coin),
- ),
- height: 100,
- ),
- const SizedBox(
- height: 16,
- ),
- Text(
- "Name your ${coin.prettyName} wallet",
- textAlign: TextAlign.center,
- style: STextStyles.pageTitleH1,
- ),
- const SizedBox(
- height: 8,
- ),
- Text(
- "Enter a label for your wallet (e.g. Savings)",
- textAlign: TextAlign.center,
- style: STextStyles.subtitle,
- ),
- const SizedBox(
- height: 16,
- ),
- ClipRRect(
- borderRadius: BorderRadius.circular(
- Constants.size.circularBorderRadius,
- ),
- child: TextField(
- onChanged: (string) {
- if (string.isEmpty) {
- if (_nextEnabled) {
- setState(() {
- _nextEnabled = false;
- _showDiceIcon = true;
- });
- }
- } else {
- if (!_nextEnabled) {
- setState(() {
- _nextEnabled = true;
- _showDiceIcon = false;
- });
- }
- }
- },
- focusNode: textFieldFocusNode,
- controller: textEditingController,
- style: STextStyles.field,
- decoration: standardInputDecoration(
- "Enter wallet name",
- textFieldFocusNode,
- ).copyWith(
- suffixIcon: Padding(
- padding: const EdgeInsets.only(right: 0),
- child: UnconstrainedBox(
- child: Row(
- children: [
- TextFieldIconButton(
- key: const Key(
- "genRandomWalletNameButtonKey"),
- child: _showDiceIcon
- ? const DiceIcon()
- : const XIcon(),
- onTap: () async {
- if (_showDiceIcon) {
- textEditingController.text =
- await _generateRandomWalletName();
- setState(() {
- _nextEnabled = true;
- _showDiceIcon = false;
- });
- } else {
- textEditingController.text = "";
- setState(() {
- _nextEnabled = false;
- _showDiceIcon = true;
- });
- }
- },
- )
- ],
- ),
+ TextFieldIconButton(
+ key: const Key("genRandomWalletNameButtonKey"),
+ child: _showDiceIcon
+ ? DiceIcon(
+ width: isDesktop ? 20 : 17,
+ height: isDesktop ? 20 : 17,
+ )
+ : XIcon(
+ width: isDesktop ? 21 : 18,
+ height: isDesktop ? 21 : 18,
),
- ),
- ),
- ),
- ),
- const SizedBox(
- height: 8,
- ),
- RoundedWhiteContainer(
- child: Center(
- child: Text(
- "Roll the dice to pick a random name.",
- style: STextStyles.itemSubtitle,
- ),
- ),
- ),
- const Spacer(
- flex: 4,
- ),
- TextButton(
- onPressed: _nextEnabled
- ? () async {
- final walletsService = ref.read(
- walletsServiceChangeNotifierProvider);
- final name = textEditingController.text;
-
- if (await walletsService
- .checkForDuplicate(name)) {
- showFloatingFlushBar(
- type: FlushBarType.warning,
- message: "Wallet name already in use.",
- iconAsset: Assets.svg.circleAlert,
- context: context,
- );
- } else {
- // hide keyboard if has focus
- if (FocusScope.of(context).hasFocus) {
- FocusScope.of(context).unfocus();
- await Future.delayed(
- const Duration(milliseconds: 50));
- }
-
- if (mounted) {
- switch (widget.addWalletType) {
- case AddWalletType.New:
- Navigator.of(context).pushNamed(
- NewWalletRecoveryPhraseWarningView
- .routeName,
- arguments: Tuple2(
- name,
- coin,
- ),
- );
- break;
- case AddWalletType.Restore:
- ref
- .read(
- mnemonicWordCountStateProvider
- .state)
- .state = Constants
- .possibleLengthsForCoin(coin)
- .first;
- Navigator.of(context).pushNamed(
- RestoreOptionsView.routeName,
- arguments: Tuple2(
- name,
- coin,
- ),
- );
- break;
- }
- }
- }
- }
- : null,
- style: _nextEnabled
- ? Theme.of(context)
- .textButtonTheme
- .style
- ?.copyWith(
- backgroundColor:
- MaterialStateProperty.all(
- CFColors.stackAccent,
- ))
- : Theme.of(context)
- .textButtonTheme
- .style
- ?.copyWith(
- backgroundColor:
- MaterialStateProperty.all(
- CFColors.stackAccent.withOpacity(
- 0.25,
- ),
- ),
- ),
- child: Text(
- "Next",
- style: STextStyles.button,
- ),
- ),
+ onTap: () async {
+ if (_showDiceIcon) {
+ textEditingController.text =
+ await _generateRandomWalletName();
+ setState(() {
+ _nextEnabled = true;
+ _showDiceIcon = false;
+ });
+ } else {
+ textEditingController.text = "";
+ setState(() {
+ _nextEnabled = false;
+ _showDiceIcon = true;
+ });
+ }
+ },
+ )
],
),
),
),
- );
- },
+ ),
+ ),
),
- ),
- ),
- );
- }
+ SizedBox(
+ height: isDesktop ? 16 : 8,
+ ),
+ RoundedWhiteContainer(
+ child: Center(
+ child: Text(
+ "Roll the dice to pick a random name.",
+ style: isDesktop
+ ? STextStyles.desktopTextExtraSmall(context).copyWith(
+ color: Theme.of(context)
+ .extension()!
+ .textSubtitle1,
+ )
+ : STextStyles.itemSubtitle(context),
+ ),
+ ),
+ ),
+ if (!isDesktop)
+ const Spacer(
+ flex: 4,
+ ),
+ if (isDesktop)
+ const SizedBox(
+ height: 32,
+ ),
+ ConstrainedBox(
+ constraints: BoxConstraints(
+ minWidth: isDesktop ? 480 : 0,
+ minHeight: isDesktop ? 70 : 0,
+ ),
+ child: TextButton(
+ onPressed: _nextEnabled
+ ? () async {
+ final walletsService =
+ ref.read(walletsServiceChangeNotifierProvider);
+ final name = textEditingController.text;
+
+ if (await walletsService.checkForDuplicate(name)) {
+ unawaited(showFloatingFlushBar(
+ type: FlushBarType.warning,
+ message: "Wallet name already in use.",
+ iconAsset: Assets.svg.circleAlert,
+ context: context,
+ ));
+ } else {
+ // hide keyboard if has focus
+ if (FocusScope.of(context).hasFocus) {
+ FocusScope.of(context).unfocus();
+ await Future.delayed(
+ const Duration(milliseconds: 50));
+ }
+
+ if (mounted) {
+ switch (widget.addWalletType) {
+ case AddWalletType.New:
+ unawaited(Navigator.of(context).pushNamed(
+ NewWalletRecoveryPhraseWarningView.routeName,
+ arguments: Tuple2(
+ name,
+ coin,
+ ),
+ ));
+ break;
+ case AddWalletType.Restore:
+ ref
+ .read(mnemonicWordCountStateProvider.state)
+ .state = Constants.possibleLengthsForCoin(
+ coin)
+ .first;
+ unawaited(Navigator.of(context).pushNamed(
+ RestoreOptionsView.routeName,
+ arguments: Tuple2(
+ name,
+ coin,
+ ),
+ ));
+ break;
+ }
+ }
+ }
+ }
+ : null,
+ style: _nextEnabled
+ ? Theme.of(context)
+ .extension()!
+ .getPrimaryEnabledButtonColor(context)
+ : Theme.of(context)
+ .extension()!
+ .getPrimaryDisabledButtonColor(context),
+ child: Text(
+ "Next",
+ style: isDesktop
+ ? _nextEnabled
+ ? STextStyles.desktopButtonEnabled(context)
+ : STextStyles.desktopButtonDisabled(context)
+ : STextStyles.button(context),
+ ),
+ ),
+ ),
+ ],
+ );
}
diff --git a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_view/new_wallet_recovery_phrase_view.dart b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_view/new_wallet_recovery_phrase_view.dart
index 7f12e8b6d..207451569 100644
--- a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_view/new_wallet_recovery_phrase_view.dart
+++ b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_view/new_wallet_recovery_phrase_view.dart
@@ -1,3 +1,4 @@
+import 'dart:async';
import 'dart:math';
import 'package:flutter/material.dart';
@@ -8,15 +9,20 @@ import 'package:stackwallet/notifications/show_flush_bar.dart';
import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_view/sub_widgets/mnemonic_table.dart';
import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart';
import 'package:stackwallet/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart';
+import 'package:stackwallet/pages_desktop_specific/home/desktop_home_view.dart';
+import 'package:stackwallet/pages_desktop_specific/home/my_stack_view/exit_to_my_stack_button.dart';
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/utilities/assets.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/clipboard_interface.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/flush_bar_type.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
+import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
+import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
+import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart';
import 'package:tuple/tuple.dart';
class NewWalletRecoveryPhraseView extends ConsumerStatefulWidget {
@@ -46,12 +52,14 @@ class _NewWalletRecoveryPhraseViewState
late Manager _manager;
late List _mnemonic;
late ClipboardInterface _clipboardInterface;
+ late final bool isDesktop;
@override
void initState() {
_manager = widget.manager;
_mnemonic = widget.mnemonic;
_clipboardInterface = widget.clipboardInterface;
+ isDesktop = Util.isDesktop;
super.initState();
}
@@ -67,144 +75,239 @@ class _NewWalletRecoveryPhraseViewState
await _manager.exitCurrentWallet();
}
+ Future _copy() async {
+ final words = await _manager.mnemonic;
+ await _clipboardInterface.setData(ClipboardData(text: words.join(" ")));
+ unawaited(showFloatingFlushBar(
+ type: FlushBarType.info,
+ message: "Copied to clipboard",
+ iconAsset: Assets.svg.copy,
+ context: context,
+ ));
+ }
+
@override
Widget build(BuildContext context) {
debugPrint("BUILD: $runtimeType");
return WillPopScope(
- onWillPop: onWillPop,
- child: Scaffold(
- appBar: AppBar(
- leading: AppBarBackButton(
- onPressed: () async {
- await delete();
+ onWillPop: onWillPop,
+ child: MasterScaffold(
+ isDesktop: isDesktop,
+ appBar: isDesktop
+ ? DesktopAppBar(
+ isCompactHeight: false,
+ leading: AppBarBackButton(
+ onPressed: () async {
+ await delete();
- if (mounted) {
- Navigator.of(context).popUntil(
- ModalRoute.withName(
- NewWalletRecoveryPhraseWarningView.routeName,
+ if (mounted) {
+ Navigator.of(context).popUntil(
+ ModalRoute.withName(
+ NewWalletRecoveryPhraseWarningView.routeName,
+ ),
+ );
+ }
+ // Navigator.of(context).pop();
+ },
),
- );
- }
- // Navigator.of(context).pop();
- },
- ),
- actions: [
- Padding(
- padding: const EdgeInsets.all(10),
- child: AspectRatio(
- aspectRatio: 1,
- child: AppBarIconButton(
- color: CFColors.almostWhite,
- shadows: const [],
- icon: SvgPicture.asset(
- Assets.svg.copy,
- width: 24,
- height: 24,
+ trailing: ExitToMyStackButton(
+ onPressed: () async {
+ await delete();
+ if (mounted) {
+ Navigator.of(context).popUntil(
+ ModalRoute.withName(DesktopHomeView.routeName),
+ );
+ }
+ },
),
- onPressed: () async {
- final words = await _manager.mnemonic;
- await _clipboardInterface
- .setData(ClipboardData(text: words.join(" ")));
- showFloatingFlushBar(
- type: FlushBarType.info,
- message: "Copied to clipboard",
- iconAsset: Assets.svg.copy,
- context: context,
- );
- },
- ),
- ),
- ),
- ],
- ),
- body: Container(
- color: CFColors.almostWhite,
- child: Padding(
- padding: const EdgeInsets.all(16),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.stretch,
- children: [
- const SizedBox(
- height: 4,
- ),
- Text(
- _manager.walletName,
- textAlign: TextAlign.center,
- style: STextStyles.label.copyWith(
- fontSize: 12,
- ),
- ),
- const SizedBox(
- height: 4,
- ),
- Text(
- "Recovery Phrase",
- textAlign: TextAlign.center,
- style: STextStyles.pageTitleH1,
- ),
- const SizedBox(
- height: 16,
- ),
- Container(
- decoration: BoxDecoration(
- color: CFColors.white,
- borderRadius: BorderRadius.circular(
- Constants.size.circularBorderRadius),
- ),
- child: Padding(
- padding: const EdgeInsets.all(12),
- child: Text(
- "Please write down your recovery phrase in the correct order and save it to keep your funds secure. You will also be asked to verify the words on the next screen.",
- style: STextStyles.label.copyWith(
- color: CFColors.stackAccent,
- ),
- ),
- ),
- ),
- const SizedBox(
- height: 8,
- ),
- Expanded(
- child: SingleChildScrollView(
- child: MnemonicTable(
- words: _mnemonic,
- ),
- ),
- ),
- const SizedBox(
- height: 16,
- ),
- TextButton(
- onPressed: () async {
- final int next = Random().nextInt(_mnemonic.length);
- ref
- .read(verifyMnemonicWordIndexStateProvider.state)
- .update((state) => next);
+ )
+ : AppBar(
+ leading: AppBarBackButton(
+ onPressed: () async {
+ await delete();
- ref
- .read(verifyMnemonicCorrectWordStateProvider.state)
- .update((state) => _mnemonic[next]);
-
- Navigator.of(context).pushNamed(
- VerifyRecoveryPhraseView.routeName,
- arguments: Tuple2(_manager, _mnemonic),
- );
- },
- style: Theme.of(context).textButtonTheme.style?.copyWith(
- backgroundColor: MaterialStateProperty.all(
- CFColors.stackAccent,
+ if (mounted) {
+ Navigator.of(context).popUntil(
+ ModalRoute.withName(
+ NewWalletRecoveryPhraseWarningView.routeName,
+ ),
+ );
+ }
+ },
+ ),
+ actions: [
+ Padding(
+ padding: const EdgeInsets.all(10),
+ child: AspectRatio(
+ aspectRatio: 1,
+ child: AppBarIconButton(
+ color: Theme.of(context)
+ .extension()!
+ .background,
+ shadows: const [],
+ icon: SvgPicture.asset(
+ Assets.svg.copy,
+ width: 24,
+ height: 24,
+ color: Theme.of(context)
+ .extension()!
+ .topNavIconPrimary,
+ ),
+ onPressed: () async {
+ await _copy();
+ },
),
),
- child: Text(
- "I saved my recovery phrase",
- style: STextStyles.button,
- ),
+ ),
+ ],
),
- ],
+ body: Container(
+ color: Theme.of(context).extension()!.background,
+ width: isDesktop ? 600 : null,
+ child: Padding(
+ padding: isDesktop
+ ? const EdgeInsets.all(0)
+ : const EdgeInsets.all(16),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.stretch,
+ children: [
+ if (!isDesktop)
+ const SizedBox(
+ height: 4,
+ ),
+ if (!isDesktop)
+ Text(
+ _manager.walletName,
+ textAlign: TextAlign.center,
+ style: STextStyles.label(context).copyWith(
+ fontSize: 12,
+ ),
+ ),
+ SizedBox(
+ height: isDesktop ? 24 : 4,
+ ),
+ Text(
+ "Recovery Phrase",
+ textAlign: TextAlign.center,
+ style: isDesktop
+ ? STextStyles.desktopH2(context)
+ : STextStyles.pageTitleH1(context),
+ ),
+ const SizedBox(
+ height: 16,
+ ),
+ Container(
+ decoration: BoxDecoration(
+ color: isDesktop
+ ? Theme.of(context)
+ .extension()!
+ .background
+ : Theme.of(context).extension()!.popupBG,
+ borderRadius: BorderRadius.circular(
+ Constants.size.circularBorderRadius),
+ ),
+ child: Padding(
+ padding: isDesktop
+ ? const EdgeInsets.all(0)
+ : const EdgeInsets.all(12),
+ child: Text(
+ "Please write down your recovery phrase in the correct order and save it to keep your funds secure. You will also be asked to verify the words on the next screen.",
+ textAlign: TextAlign.center,
+ style: isDesktop
+ ? STextStyles.desktopSubtitleH2(context)
+ : STextStyles.label(context).copyWith(
+ color: Theme.of(context)
+ .extension()!
+ .accentColorDark),
+ ),
+ ),
+ ),
+ SizedBox(
+ height: isDesktop ? 21 : 8,
+ ),
+ if (!isDesktop)
+ Expanded(
+ child: SingleChildScrollView(
+ child: MnemonicTable(
+ words: _mnemonic,
+ isDesktop: isDesktop,
+ ),
+ ),
+ ),
+ if (isDesktop)
+ MnemonicTable(
+ words: _mnemonic,
+ isDesktop: isDesktop,
+ ),
+ SizedBox(
+ height: isDesktop ? 24 : 16,
+ ),
+ if (isDesktop)
+ SizedBox(
+ height: 70,
+ child: TextButton(
+ onPressed: () async {
+ await _copy();
+ },
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.center,
+ children: [
+ SvgPicture.asset(
+ Assets.svg.copy,
+ width: 20,
+ height: 20,
+ ),
+ const SizedBox(
+ width: 10,
+ ),
+ Text(
+ "Copy to clipboard",
+ style: STextStyles.desktopButtonSecondaryEnabled(
+ context),
+ )
+ ],
+ ),
+ ),
+ ),
+ if (isDesktop)
+ const SizedBox(
+ height: 16,
+ ),
+ ConstrainedBox(
+ constraints: BoxConstraints(
+ minHeight: isDesktop ? 70 : 0,
+ ),
+ child: TextButton(
+ onPressed: () async {
+ final int next = Random().nextInt(_mnemonic.length);
+ ref
+ .read(verifyMnemonicWordIndexStateProvider.state)
+ .update((state) => next);
+
+ ref
+ .read(verifyMnemonicCorrectWordStateProvider.state)
+ .update((state) => _mnemonic[next]);
+
+ unawaited(Navigator.of(context).pushNamed(
+ VerifyRecoveryPhraseView.routeName,
+ arguments: Tuple2(_manager, _mnemonic),
+ ));
+ },
+ style: Theme.of(context)
+ .extension()!
+ .getPrimaryEnabledButtonColor(context),
+ child: Text(
+ "I saved my recovery phrase",
+ style: isDesktop
+ ? STextStyles.desktopButtonEnabled(context)
+ : STextStyles.button(context),
+ ),
+ ),
+ ),
+ ],
+ ),
),
),
- ),
- ),
- );
+ ));
}
}
diff --git a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_view/sub_widgets/mnemonic_table.dart b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_view/sub_widgets/mnemonic_table.dart
index 9b33f5248..946f54d4a 100644
--- a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_view/sub_widgets/mnemonic_table.dart
+++ b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_view/sub_widgets/mnemonic_table.dart
@@ -1,19 +1,20 @@
-import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_view/sub_widgets/mnemonic_table_item.dart';
class MnemonicTable extends StatelessWidget {
const MnemonicTable({
Key? key,
required this.words,
+ required this.isDesktop,
}) : super(key: key);
final List words;
-
- static const wordsPerRow = 3;
+ final bool isDesktop;
@override
Widget build(BuildContext context) {
debugPrint("BUILD: $runtimeType");
+ final wordsPerRow = isDesktop ? 4 : 3;
final int rows = words.length ~/ wordsPerRow;
@@ -26,51 +27,54 @@ class MnemonicTable extends StatelessWidget {
children: [
for (int i = 1; i <= rows; i++)
Padding(
- padding: const EdgeInsets.symmetric(vertical: 5),
+ padding: EdgeInsets.symmetric(vertical: isDesktop ? 8 : 5),
child: Row(
children: [
for (int j = 1; j <= wordsPerRow; j++) ...[
if (j > 1)
- const SizedBox(
- width: 6,
+ SizedBox(
+ width: isDesktop ? 10 : 6,
),
Expanded(
child: MnemonicTableItem(
number: ++index,
word: words[index - 1],
+ isDesktop: isDesktop,
),
),
],
],
),
),
- Padding(
- padding: const EdgeInsets.symmetric(vertical: 5),
- child: Row(
- children: [
- for (int i = index; i < words.length; i++) ...[
- if (i > index)
+ if (index != words.length)
+ Padding(
+ padding: EdgeInsets.symmetric(vertical: isDesktop ? 8 : 5),
+ child: Row(
+ children: [
+ for (int i = index; i < words.length; i++) ...[
+ if (i > index)
+ SizedBox(
+ width: isDesktop ? 10 : 6,
+ ),
+ Expanded(
+ child: MnemonicTableItem(
+ number: i + 1,
+ word: words[i],
+ isDesktop: isDesktop,
+ ),
+ ),
+ ],
+ for (int i = remainder; i < wordsPerRow; i++) ...[
const SizedBox(
width: 6,
),
- Expanded(
- child: MnemonicTableItem(
- number: i + 1,
- word: words[i],
+ Expanded(
+ child: Container(),
),
- ),
+ ],
],
- for (int i = remainder; i < wordsPerRow; i++) ...[
- const SizedBox(
- width: 6,
- ),
- Expanded(
- child: Container(),
- ),
- ],
- ],
+ ),
),
- ),
],
);
}
diff --git a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_view/sub_widgets/mnemonic_table_item.dart b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_view/sub_widgets/mnemonic_table_item.dart
index dfc8897f8..8928ff3a6 100644
--- a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_view/sub_widgets/mnemonic_table_item.dart
+++ b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_view/sub_widgets/mnemonic_table_item.dart
@@ -1,49 +1,57 @@
import 'package:flutter/material.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
-import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
+import 'package:stackwallet/widgets/rounded_white_container.dart';
class MnemonicTableItem extends StatelessWidget {
const MnemonicTableItem({
Key? key,
required this.number,
required this.word,
+ required this.isDesktop,
}) : super(key: key);
final int number;
final String word;
+ final bool isDesktop;
@override
Widget build(BuildContext context) {
debugPrint("BUILD: $runtimeType");
- return Container(
- decoration: BoxDecoration(
- color: CFColors.white,
- borderRadius: BorderRadius.circular(
- Constants.size.circularBorderRadius,
- ),
- ),
- child: Padding(
- padding: const EdgeInsets.all(8),
- child: Row(
- mainAxisAlignment: MainAxisAlignment.start,
- children: [
- Text(
- number.toString(),
- style: STextStyles.baseXS.copyWith(
- color: CFColors.gray3,
- fontSize: 10,
- ),
- ),
- const SizedBox(
- width: 8,
- ),
- Text(
- word,
- style: STextStyles.baseXS,
- ),
- ],
- ),
+ return RoundedWhiteContainer(
+ padding: isDesktop
+ ? const EdgeInsets.symmetric(horizontal: 12, vertical: 9)
+ : const EdgeInsets.all(8),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.start,
+ children: [
+ Text(
+ number.toString(),
+ style: isDesktop
+ ? STextStyles.desktopTextExtraSmall(context).copyWith(
+ color: Theme.of(context)
+ .extension()!
+ .textSubtitle2,
+ )
+ : STextStyles.baseXS(context).copyWith(
+ color: Theme.of(context)
+ .extension()!
+ .textSubtitle2,
+ fontSize: 10,
+ ),
+ ),
+ const SizedBox(
+ width: 8,
+ ),
+ Text(
+ word,
+ style: isDesktop
+ ? STextStyles.desktopTextExtraSmall(context).copyWith(
+ color: Theme.of(context).extension()!.textDark,
+ )
+ : STextStyles.baseXS(context),
+ ),
+ ],
),
);
}
diff --git a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart
index 4711ff2fd..603e5cca1 100644
--- a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart
+++ b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart
@@ -1,18 +1,25 @@
+import 'dart:async';
+
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_view/new_wallet_recovery_phrase_view.dart';
+import 'package:stackwallet/pages_desktop_specific/home/my_stack_view/exit_to_my_stack_button.dart';
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/services/coins/coin_service.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/services/transaction_notification_tracker.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/default_nodes.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/logger.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
+import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
+import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
+import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart';
import 'package:stackwallet/widgets/loading_indicator.dart';
+import 'package:stackwallet/widgets/rounded_white_container.dart';
import 'package:tuple/tuple.dart';
class NewWalletRecoveryPhraseWarningView extends StatefulWidget {
@@ -36,11 +43,13 @@ class _NewWalletRecoveryPhraseWarningViewState
extends State {
late final Coin coin;
late final String walletName;
+ late final bool isDesktop;
@override
void initState() {
coin = widget.coin;
walletName = widget.walletName;
+ isDesktop = Util.isDesktop;
super.initState();
}
@@ -52,60 +61,72 @@ class _NewWalletRecoveryPhraseWarningViewState
? Constants.seedPhraseWordCountMonero
: Constants.seedPhraseWordCountBip39;
- return Scaffold(
- appBar: AppBar(
- leading: AppBarBackButton(
- onPressed: () {
- Navigator.of(context).pop();
- },
- ),
- ),
- body: Container(
- color: CFColors.almostWhite,
- child: Padding(
- padding: const EdgeInsets.all(16),
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.stretch,
- children: [
- const SizedBox(
- height: 4,
- ),
+ return MasterScaffold(
+ isDesktop: isDesktop,
+ appBar: isDesktop
+ ? const DesktopAppBar(
+ isCompactHeight: false,
+ leading: AppBarBackButton(),
+ trailing: ExitToMyStackButton(),
+ )
+ : AppBar(
+ leading: const AppBarBackButton(),
+ ),
+ body: Padding(
+ padding: EdgeInsets.all(isDesktop ? 0 : 16),
+ child: Column(
+ crossAxisAlignment: isDesktop
+ ? CrossAxisAlignment.center
+ : CrossAxisAlignment.stretch,
+ children: [
+ const SizedBox(
+ height: 4,
+ ),
+ if (!isDesktop)
Text(
walletName,
textAlign: TextAlign.center,
- style: STextStyles.label.copyWith(
+ style: STextStyles.label(context).copyWith(
fontSize: 12,
),
),
+ const SizedBox(
+ height: 4,
+ ),
+ Text(
+ "Recovery Phrase",
+ textAlign: TextAlign.center,
+ style: isDesktop
+ ? STextStyles.desktopH2(context)
+ : STextStyles.pageTitleH1(context),
+ ),
+ SizedBox(
+ height: isDesktop ? 32 : 16,
+ ),
+ RoundedWhiteContainer(
+ padding: isDesktop
+ ? const EdgeInsets.all(32)
+ : const EdgeInsets.all(12),
+ width: isDesktop ? 480 : null,
+ child: Text(
+ "On the next screen you will see $_numberOfPhraseWords words that make up your recovery phrase.\n\nPlease write it down. Keep it safe and never share it with anyone. Your recovery phrase is the only way you can access your funds if you forget your PIN, lose your phone, etc.\n\nStack Wallet does not keep nor is able to restore your recover phrase. Only you have access to your wallet.",
+ style: isDesktop
+ ? STextStyles.desktopTextMediumRegular(context)
+ : STextStyles.subtitle(context).copyWith(
+ fontSize: 12,
+ ),
+ ),
+ ),
+ if (!isDesktop) const Spacer(),
+ if (isDesktop)
const SizedBox(
- height: 4,
+ height: 32,
),
- Text(
- "Recovery Phrase",
- textAlign: TextAlign.center,
- style: STextStyles.pageTitleH1,
+ ConstrainedBox(
+ constraints: BoxConstraints(
+ maxWidth: isDesktop ? 480 : 0,
),
- const SizedBox(
- height: 16,
- ),
- Container(
- decoration: BoxDecoration(
- color: CFColors.white,
- borderRadius: BorderRadius.circular(
- Constants.size.circularBorderRadius),
- ),
- child: Padding(
- padding: const EdgeInsets.all(12),
- child: Text(
- "On the next screen you will see $_numberOfPhraseWords words that make up your recovery phrase.\n\nPlease write it down. Keep it safe and never share it with anyone. Your recovery phrase is the only way you can access your funds if you forget your PIN, lose your phone, etc.\n\nStack Wallet does not keep nor is able to restore your recover phrase. Only you have access to your wallet.",
- style: STextStyles.subtitle.copyWith(
- fontSize: 12,
- ),
- ),
- ),
- ),
- const Spacer(),
- Consumer(
+ child: Consumer(
builder: (_, ref, __) {
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
@@ -119,6 +140,9 @@ class _NewWalletRecoveryPhraseWarningViewState
child: Container(
color: Colors.transparent,
child: Row(
+ crossAxisAlignment: isDesktop
+ ? CrossAxisAlignment.start
+ : CrossAxisAlignment.center,
children: [
Checkbox(
materialTapTargetSize:
@@ -131,138 +155,143 @@ class _NewWalletRecoveryPhraseWarningViewState
newValue!;
},
),
- const SizedBox(
- width: 4,
+ SizedBox(
+ width: isDesktop ? 14 : 4,
),
Flexible(
child: Text(
"I understand that if I lose my recovery phrase, I will not be able to access my funds.",
- style: STextStyles.baseXS,
+ style: isDesktop
+ ? STextStyles.desktopTextMedium(context)
+ : STextStyles.baseXS(context),
),
),
],
),
),
),
- const SizedBox(
- height: 16,
+ SizedBox(
+ height: isDesktop ? 32 : 16,
),
- TextButton(
- onPressed: ref.read(checkBoxStateProvider.state).state
- ? () async {
- try {
- showDialog(
- context: context,
- barrierDismissible: false,
- useSafeArea: true,
- builder: (ctx) {
- return const Center(
- child: LoadingIndicator(
- width: 50,
- height: 50,
- ),
- );
- },
- );
-
- final walletsService = ref.read(
- walletsServiceChangeNotifierProvider);
-
- final walletId =
- await walletsService.addNewWallet(
- name: walletName,
- coin: coin,
- shouldNotifyListeners: false,
- );
-
- var node = ref
- .read(nodeServiceChangeNotifierProvider)
- .getPrimaryNodeFor(coin: coin);
-
- if (node == null) {
- node = DefaultNodes.getNodeFor(coin);
- ref
- .read(nodeServiceChangeNotifierProvider)
- .setPrimaryNodeFor(
- coin: coin,
- node: node,
+ ConstrainedBox(
+ constraints: BoxConstraints(
+ minHeight: isDesktop ? 70 : 0,
+ ),
+ child: TextButton(
+ onPressed: ref.read(checkBoxStateProvider.state).state
+ ? () async {
+ try {
+ unawaited(showDialog(
+ context: context,
+ barrierDismissible: false,
+ useSafeArea: true,
+ builder: (ctx) {
+ return const Center(
+ child: LoadingIndicator(
+ width: 50,
+ height: 50,
+ ),
);
- }
+ },
+ ));
- final txTracker =
- TransactionNotificationTracker(
- walletId: walletId!);
+ final walletsService = ref.read(
+ walletsServiceChangeNotifierProvider);
- final failovers = ref
- .read(nodeServiceChangeNotifierProvider)
- .failoverNodesFor(coin: widget.coin);
-
- final wallet = CoinServiceAPI.from(
- coin,
- walletId,
- walletName,
- node,
- txTracker,
- ref.read(prefsChangeNotifierProvider),
- failovers,
- );
-
- final manager = Manager(wallet);
-
- await manager.initializeNew();
-
- // pop progress dialog
- if (mounted) {
- Navigator.pop(context);
- }
- // set checkbox back to unchecked to annoy users to agree again :P
- ref.read(checkBoxStateProvider.state).state =
- false;
-
- if (mounted) {
- Navigator.of(context).pushNamed(
- NewWalletRecoveryPhraseView.routeName,
- arguments: Tuple2(
- manager,
- await manager.mnemonic,
- ),
+ final walletId =
+ await walletsService.addNewWallet(
+ name: walletName,
+ coin: coin,
+ shouldNotifyListeners: false,
);
+
+ var node = ref
+ .read(nodeServiceChangeNotifierProvider)
+ .getPrimaryNodeFor(coin: coin);
+
+ if (node == null) {
+ node = DefaultNodes.getNodeFor(coin);
+ await ref
+ .read(
+ nodeServiceChangeNotifierProvider)
+ .setPrimaryNodeFor(
+ coin: coin,
+ node: node,
+ );
+ }
+
+ final txTracker =
+ TransactionNotificationTracker(
+ walletId: walletId!);
+
+ final failovers = ref
+ .read(nodeServiceChangeNotifierProvider)
+ .failoverNodesFor(coin: widget.coin);
+
+ final wallet = CoinServiceAPI.from(
+ coin,
+ walletId,
+ walletName,
+ node,
+ txTracker,
+ ref.read(prefsChangeNotifierProvider),
+ failovers,
+ );
+
+ final manager = Manager(wallet);
+
+ await manager.initializeNew();
+
+ // pop progress dialog
+ if (mounted) {
+ Navigator.pop(context);
+ }
+ // set checkbox back to unchecked to annoy users to agree again :P
+ ref
+ .read(checkBoxStateProvider.state)
+ .state = false;
+
+ if (mounted) {
+ unawaited(Navigator.of(context).pushNamed(
+ NewWalletRecoveryPhraseView.routeName,
+ arguments: Tuple2(
+ manager,
+ await manager.mnemonic,
+ ),
+ ));
+ }
+ } catch (e, s) {
+ Logging.instance
+ .log("$e\n$s", level: LogLevel.Fatal);
+ // TODO: handle gracefully
+ // any network/socket exception here will break new wallet creation
+ rethrow;
}
- } catch (e, s) {
- Logging.instance
- .log("$e\n$s", level: LogLevel.Fatal);
- // TODO: handle gracefully
- // any network/socket exception here will break new wallet creation
- rethrow;
}
- }
- : null,
- style: ref.read(checkBoxStateProvider.state).state
- ? Theme.of(context).textButtonTheme.style?.copyWith(
- backgroundColor:
- MaterialStateProperty.all(
- CFColors.stackAccent,
- ),
- )
- : Theme.of(context).textButtonTheme.style?.copyWith(
- backgroundColor:
- MaterialStateProperty.all(
- CFColors.stackAccent.withOpacity(
- 0.25,
- ),
- ),
- ),
- child: Text(
- "View recovery phrase",
- style: STextStyles.button,
+ : null,
+ style: ref.read(checkBoxStateProvider.state).state
+ ? Theme.of(context)
+ .extension()!
+ .getPrimaryEnabledButtonColor(context)
+ : Theme.of(context)
+ .extension()!
+ .getPrimaryDisabledButtonColor(context),
+ child: Text(
+ "View recovery phrase",
+ style: isDesktop
+ ? ref.read(checkBoxStateProvider.state).state
+ ? STextStyles.desktopButtonEnabled(context)
+ : STextStyles.desktopButtonDisabled(context)
+ : STextStyles.button(context),
+ ),
),
),
],
);
},
),
- ],
- ),
+ ),
+ ],
),
),
);
diff --git a/lib/pages/add_wallet_views/restore_wallet_view/confirm_recovery_dialog.dart b/lib/pages/add_wallet_views/restore_wallet_view/confirm_recovery_dialog.dart
index 6cf709ac1..6ccc44d03 100644
--- a/lib/pages/add_wallet_views/restore_wallet_view/confirm_recovery_dialog.dart
+++ b/lib/pages/add_wallet_views/restore_wallet_view/confirm_recovery_dialog.dart
@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
import 'package:stackwallet/widgets/stack_dialog.dart';
class ConfirmRecoveryDialog extends StatelessWidget {
@@ -20,28 +20,24 @@ class ConfirmRecoveryDialog extends StatelessWidget {
message:
"Restoring your wallet may take a while. Please do not exit this screen once the process is started.",
leftButton: TextButton(
- style: Theme.of(context).textButtonTheme.style?.copyWith(
- backgroundColor: MaterialStateProperty.all(
- CFColors.buttonGray,
- ),
- ),
+ style: Theme.of(context)
+ .extension()!
+ .getSecondaryEnabledButtonColor(context),
child: Text(
"Cancel",
- style: STextStyles.itemSubtitle12,
+ style: STextStyles.itemSubtitle12(context),
),
onPressed: () {
Navigator.of(context).pop();
},
),
rightButton: TextButton(
- style: Theme.of(context).textButtonTheme.style?.copyWith(
- backgroundColor: MaterialStateProperty.all(
- CFColors.stackAccent,
- ),
- ),
+ style: Theme.of(context)
+ .extension()!
+ .getPrimaryEnabledButtonColor(context),
child: Text(
"Restore",
- style: STextStyles.button,
+ style: STextStyles.button(context),
),
onPressed: () {
Navigator.of(context).pop();
diff --git a/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view.dart b/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view.dart
deleted file mode 100644
index d7f78041d..000000000
--- a/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view.dart
+++ /dev/null
@@ -1,409 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:flutter_riverpod/flutter_riverpod.dart';
-import 'package:flutter_rounded_date_picker/flutter_rounded_date_picker.dart';
-import 'package:flutter_svg/svg.dart';
-import 'package:google_fonts/google_fonts.dart';
-import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart';
-import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/sub_widgets/mnemonic_word_count_select_sheet.dart';
-import 'package:stackwallet/providers/ui/verify_recovery_phrase/mnemonic_word_count_state_provider.dart';
-import 'package:stackwallet/utilities/assets.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
-import 'package:stackwallet/utilities/constants.dart';
-import 'package:stackwallet/utilities/enums/coin_enum.dart';
-import 'package:stackwallet/utilities/format.dart';
-import 'package:stackwallet/utilities/text_styles.dart';
-import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
-import 'package:stackwallet/widgets/rounded_white_container.dart';
-import 'package:tuple/tuple.dart';
-
-class RestoreOptionsView extends ConsumerStatefulWidget {
- const RestoreOptionsView({
- Key? key,
- required this.walletName,
- required this.coin,
- }) : super(key: key);
-
- static const routeName = "/restoreOptions";
-
- final String walletName;
- final Coin coin;
-
- @override
- ConsumerState createState() => _RestoreOptionsViewState();
-}
-
-class _RestoreOptionsViewState extends ConsumerState {
- late final String walletName;
- late final Coin coin;
-
- late TextEditingController _dateController;
- late TextEditingController _lengthController;
- late FocusNode textFieldFocusNode;
-
- final bool _nextEnabled = true;
- DateTime _restoreFromDate = DateTime.fromMillisecondsSinceEpoch(0);
-
- @override
- void initState() {
- walletName = widget.walletName;
- coin = widget.coin;
-
- _dateController = TextEditingController();
- _lengthController = TextEditingController();
- textFieldFocusNode = FocusNode();
-
- super.initState();
- }
-
- @override
- void dispose() {
- _dateController.dispose();
- _lengthController.dispose();
- textFieldFocusNode.dispose();
- super.dispose();
- }
-
- final _datePickerTextStyleBase = GoogleFonts.inter(
- color: CFColors.gray3,
- fontSize: 12,
- fontWeight: FontWeight.w400,
- letterSpacing: 0.5,
- );
- MaterialRoundedDatePickerStyle _buildDatePickerStyle() {
- return MaterialRoundedDatePickerStyle(
- paddingMonthHeader: const EdgeInsets.only(top: 11),
- colorArrowNext: CFColors.neutral60,
- colorArrowPrevious: CFColors.neutral60,
- textStyleButtonNegative: _datePickerTextStyleBase.copyWith(
- fontSize: 16, fontWeight: FontWeight.w600),
- textStyleButtonPositive: _datePickerTextStyleBase.copyWith(
- fontSize: 16, fontWeight: FontWeight.w600),
- textStyleCurrentDayOnCalendar: _datePickerTextStyleBase.copyWith(
- color: CFColors.stackAccent,
- ),
- textStyleDayHeader: _datePickerTextStyleBase.copyWith(
- color: CFColors.stackAccent,
- fontSize: 16,
- fontWeight: FontWeight.w600,
- ),
- textStyleDayOnCalendar: _datePickerTextStyleBase,
- textStyleDayOnCalendarDisabled: _datePickerTextStyleBase.copyWith(
- color: CFColors.neutral80,
- ),
- textStyleDayOnCalendarSelected: _datePickerTextStyleBase.copyWith(
- color: CFColors.white,
- ),
- textStyleMonthYearHeader: _datePickerTextStyleBase.copyWith(
- color: CFColors.neutral60,
- fontSize: 16,
- fontWeight: FontWeight.w600,
- ),
- textStyleYearButton: _datePickerTextStyleBase.copyWith(
- color: CFColors.white,
- fontSize: 16,
- fontWeight: FontWeight.w600,
- ),
- textStyleButtonAction: GoogleFonts.inter(),
- );
- }
-
- MaterialRoundedYearPickerStyle _buildYearPickerStyle() {
- return MaterialRoundedYearPickerStyle(
- textStyleYear: _datePickerTextStyleBase.copyWith(
- color: CFColors.gray3,
- fontWeight: FontWeight.w600,
- fontSize: 16,
- ),
- textStyleYearSelected: _datePickerTextStyleBase.copyWith(
- color: CFColors.stackAccent,
- fontWeight: FontWeight.w600,
- fontSize: 18,
- ),
- );
- }
-
- @override
- Widget build(BuildContext context) {
- debugPrint("BUILD: $runtimeType with ${coin.name} $walletName");
-
- return Scaffold(
- appBar: AppBar(
- leading: AppBarBackButton(
- onPressed: () {
- if (textFieldFocusNode.hasFocus) {
- textFieldFocusNode.unfocus();
- Future.delayed(const Duration(milliseconds: 100))
- .then((value) => Navigator.of(context).pop());
- } else {
- Navigator.of(context).pop();
- }
- },
- ),
- ),
- body: Container(
- color: CFColors.almostWhite,
- child: Padding(
- padding: const EdgeInsets.all(16),
- child: LayoutBuilder(
- builder: (ctx, constraints) {
- return SingleChildScrollView(
- child: ConstrainedBox(
- constraints: BoxConstraints(minHeight: constraints.maxHeight),
- child: IntrinsicHeight(
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.stretch,
- children: [
- const Spacer(
- flex: 1,
- ),
- Image(
- image: AssetImage(
- Assets.png.imageFor(coin: coin),
- ),
- height: 100,
- ),
- const SizedBox(
- height: 16,
- ),
- Text(
- "Restore options",
- textAlign: TextAlign.center,
- style: STextStyles.pageTitleH1,
- ),
- const SizedBox(
- height: 24,
- ),
- if (coin == Coin.monero || coin == Coin.epicCash)
- Text(
- "Choose start date",
- style: STextStyles.smallMed12,
- textAlign: TextAlign.left,
- ),
- if (coin == Coin.monero || coin == Coin.epicCash)
- const SizedBox(
- height: 8,
- ),
- if (coin == Coin.monero || coin == Coin.epicCash)
- Container(
- color: Colors.transparent,
- child: TextField(
- onTap: () async {
- final height =
- MediaQuery.of(context).size.height;
- // check and hide keyboard
- if (FocusScope.of(context).hasFocus) {
- FocusScope.of(context).unfocus();
- await Future.delayed(
- const Duration(milliseconds: 125));
- }
-
- final date = await showRoundedDatePicker(
- context: context,
- initialDate: DateTime.now(),
- height: height * 0.5,
- theme: ThemeData(
- primarySwatch: CFColors.createMaterialColor(
- CFColors.stackAccent),
- ),
- //TODO pick a better initial date
- // 2007 chosen as that is just before bitcoin launched
- firstDate: DateTime(2007),
- lastDate: DateTime.now(),
- borderRadius:
- Constants.size.circularBorderRadius * 2,
-
- textPositiveButton: "SELECT",
-
- styleDatePicker: _buildDatePickerStyle(),
- styleYearPicker: _buildYearPickerStyle(),
- );
- if (date != null) {
- _restoreFromDate = date;
- _dateController.text =
- Format.formatDate(date);
- }
- },
- controller: _dateController,
- style: STextStyles.field,
- decoration: InputDecoration(
- hintText: "Restore from...",
- suffixIcon: UnconstrainedBox(
- child: Row(
- children: [
- const SizedBox(
- width: 16,
- ),
- SvgPicture.asset(
- Assets.svg.calendar,
- color: CFColors.neutral50,
- width: 16,
- height: 16,
- ),
- const SizedBox(
- width: 12,
- ),
- ],
- ),
- ),
- ),
- key: const Key("restoreOptionsViewDatePickerKey"),
- readOnly: true,
- toolbarOptions: const ToolbarOptions(
- copy: true,
- cut: false,
- paste: false,
- selectAll: false,
- ),
- onChanged: (newValue) {},
- ),
- ),
- if (coin == Coin.monero || coin == Coin.epicCash)
- const SizedBox(
- height: 8,
- ),
- if (coin == Coin.monero || coin == Coin.epicCash)
- RoundedWhiteContainer(
- child: Center(
- child: Text(
- "Choose the date you made the wallet (approximate is fine)",
- style: STextStyles.smallMed12.copyWith(
- fontSize: 10,
- ),
- ),
- ),
- ),
- if (coin == Coin.monero || coin == Coin.epicCash)
- const SizedBox(
- height: 16,
- ),
- Text(
- "Choose recovery phrase length",
- style: STextStyles.smallMed12,
- textAlign: TextAlign.left,
- ),
- const SizedBox(
- height: 8,
- ),
- Stack(
- children: [
- TextField(
- controller: _lengthController,
- readOnly: true,
- textInputAction: TextInputAction.none,
- ),
- Padding(
- padding: const EdgeInsets.symmetric(
- horizontal: 12,
- ),
- child: RawMaterialButton(
- splashColor: CFColors.splashLight,
- shape: RoundedRectangleBorder(
- borderRadius: BorderRadius.circular(
- Constants.size.circularBorderRadius,
- ),
- ),
- onPressed: () {
- showModalBottomSheet(
- backgroundColor: Colors.transparent,
- context: context,
- shape: const RoundedRectangleBorder(
- borderRadius: BorderRadius.vertical(
- top: Radius.circular(20),
- ),
- ),
- builder: (_) {
- return MnemonicWordCountSelectSheet(
- lengthOptions:
- Constants.possibleLengthsForCoin(
- coin),
- );
- },
- );
- },
- child: Row(
- mainAxisAlignment:
- MainAxisAlignment.spaceBetween,
- children: [
- Text(
- "${ref.watch(mnemonicWordCountStateProvider.state).state} words",
- style: STextStyles.itemSubtitle12,
- ),
- SvgPicture.asset(
- Assets.svg.chevronDown,
- width: 8,
- height: 4,
- color: CFColors.gray3,
- ),
- ],
- ),
- ),
- )
- ],
- ),
- const Spacer(
- flex: 3,
- ),
- TextButton(
- onPressed: _nextEnabled
- ? () async {
- // hide keyboard if has focus
- if (FocusScope.of(context).hasFocus) {
- FocusScope.of(context).unfocus();
- await Future.delayed(
- const Duration(milliseconds: 75));
- }
-
- if (mounted) {
- Navigator.of(context).pushNamed(
- RestoreWalletView.routeName,
- arguments: Tuple4(
- walletName,
- coin,
- ref
- .read(mnemonicWordCountStateProvider
- .state)
- .state,
- _restoreFromDate,
- ),
- );
- }
- }
- : null,
- style: _nextEnabled
- ? Theme.of(context)
- .textButtonTheme
- .style
- ?.copyWith(
- backgroundColor:
- MaterialStateProperty.all(
- CFColors.stackAccent,
- ),
- )
- : Theme.of(context)
- .textButtonTheme
- .style
- ?.copyWith(
- backgroundColor:
- MaterialStateProperty.all(
- CFColors.stackAccent.withOpacity(
- 0.25,
- ),
- ),
- ),
- child: Text(
- "Next",
- style: STextStyles.button,
- ),
- ),
- ],
- ),
- ),
- ),
- );
- },
- ),
- ),
- ),
- );
- }
-}
diff --git a/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/restore_options_view.dart b/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/restore_options_view.dart
new file mode 100644
index 000000000..5df7fd81d
--- /dev/null
+++ b/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/restore_options_view.dart
@@ -0,0 +1,405 @@
+import 'package:dropdown_button2/dropdown_button2.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:flutter_rounded_date_picker/flutter_rounded_date_picker.dart';
+import 'package:flutter_svg/svg.dart';
+import 'package:google_fonts/google_fonts.dart';
+import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/restore_options_view/sub_widgets/mobile_mnemonic_length_selector.dart';
+import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/restore_options_view/sub_widgets/restore_from_date_picker.dart';
+import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/restore_options_view/sub_widgets/restore_options_next_button.dart';
+import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/restore_options_view/sub_widgets/restore_options_platform_layout.dart';
+import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart';
+import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/sub_widgets/mnemonic_word_count_select_sheet.dart';
+import 'package:stackwallet/providers/ui/color_theme_provider.dart';
+import 'package:stackwallet/providers/ui/verify_recovery_phrase/mnemonic_word_count_state_provider.dart';
+import 'package:stackwallet/utilities/assets.dart';
+import 'package:stackwallet/utilities/constants.dart';
+import 'package:stackwallet/utilities/enums/coin_enum.dart';
+import 'package:stackwallet/utilities/format.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
+import 'package:stackwallet/utilities/util.dart';
+import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
+import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
+import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart';
+import 'package:stackwallet/widgets/rounded_white_container.dart';
+import 'package:tuple/tuple.dart';
+
+class RestoreOptionsView extends ConsumerStatefulWidget {
+ const RestoreOptionsView({
+ Key? key,
+ required this.walletName,
+ required this.coin,
+ }) : super(key: key);
+
+ static const routeName = "/restoreOptions";
+
+ final String walletName;
+ final Coin coin;
+
+ @override
+ ConsumerState createState() => _RestoreOptionsViewState();
+}
+
+class _RestoreOptionsViewState extends ConsumerState {
+ late final String walletName;
+ late final Coin coin;
+ late final bool isDesktop;
+
+ late TextEditingController _dateController;
+ late FocusNode textFieldFocusNode;
+
+ final bool _nextEnabled = true;
+ DateTime _restoreFromDate = DateTime.fromMillisecondsSinceEpoch(0);
+ late final Color baseColor;
+
+ @override
+ void initState() {
+ baseColor = ref.read(colorThemeProvider.state).state.textSubtitle2;
+ walletName = widget.walletName;
+ coin = widget.coin;
+ isDesktop = Util.isDesktop;
+
+ _dateController = TextEditingController();
+ textFieldFocusNode = FocusNode();
+
+ super.initState();
+ }
+
+ @override
+ void dispose() {
+ _dateController.dispose();
+ textFieldFocusNode.dispose();
+ super.dispose();
+ }
+
+ TextStyle get _datePickerTextStyleBase => GoogleFonts.inter(
+ color: baseColor,
+ fontSize: 12,
+ fontWeight: FontWeight.w400,
+ letterSpacing: 0.5,
+ );
+ MaterialRoundedDatePickerStyle _buildDatePickerStyle() {
+ return MaterialRoundedDatePickerStyle(
+ paddingMonthHeader: const EdgeInsets.only(top: 11),
+ colorArrowNext: Theme.of(context).extension()!.textSubtitle1,
+ colorArrowPrevious:
+ Theme.of(context).extension()!.textSubtitle1,
+ textStyleButtonNegative: _datePickerTextStyleBase.copyWith(
+ fontSize: 16, fontWeight: FontWeight.w600),
+ textStyleButtonPositive: _datePickerTextStyleBase.copyWith(
+ fontSize: 16, fontWeight: FontWeight.w600),
+ textStyleCurrentDayOnCalendar: _datePickerTextStyleBase.copyWith(
+ color: Theme.of(context).extension()!.accentColorDark,
+ ),
+ textStyleDayHeader: _datePickerTextStyleBase.copyWith(
+ color: Theme.of(context).extension()!.accentColorDark,
+ fontSize: 16,
+ fontWeight: FontWeight.w600,
+ ),
+ textStyleDayOnCalendar: _datePickerTextStyleBase,
+ textStyleDayOnCalendarDisabled: _datePickerTextStyleBase.copyWith(
+ color: Theme.of(context).extension()!.textSubtitle3,
+ ),
+ textStyleDayOnCalendarSelected: _datePickerTextStyleBase.copyWith(
+ color: Theme.of(context).extension()!.popupBG,
+ ),
+ textStyleMonthYearHeader: _datePickerTextStyleBase.copyWith(
+ color: Theme.of(context).extension()!.textSubtitle1,
+ fontSize: 16,
+ fontWeight: FontWeight.w600,
+ ),
+ textStyleYearButton: _datePickerTextStyleBase.copyWith(
+ color: Theme.of(context).extension()!.textWhite,
+ fontSize: 16,
+ fontWeight: FontWeight.w600,
+ ),
+ textStyleButtonAction: GoogleFonts.inter(),
+ );
+ }
+
+ MaterialRoundedYearPickerStyle _buildYearPickerStyle() {
+ return MaterialRoundedYearPickerStyle(
+ textStyleYear: _datePickerTextStyleBase.copyWith(
+ color: Theme.of(context).extension()!.textSubtitle2,
+ fontWeight: FontWeight.w600,
+ fontSize: 16,
+ ),
+ textStyleYearSelected: _datePickerTextStyleBase.copyWith(
+ color: Theme.of(context).extension()!.accentColorDark,
+ fontWeight: FontWeight.w600,
+ fontSize: 18,
+ ),
+ );
+ }
+
+ Future nextPressed() async {
+ if (!isDesktop) {
+ // hide keyboard if has focus
+ if (FocusScope.of(context).hasFocus) {
+ FocusScope.of(context).unfocus();
+ await Future.delayed(const Duration(milliseconds: 75));
+ }
+ }
+
+ if (mounted) {
+ await Navigator.of(context).pushNamed(
+ RestoreWalletView.routeName,
+ arguments: Tuple4(
+ walletName,
+ coin,
+ ref.read(mnemonicWordCountStateProvider.state).state,
+ _restoreFromDate,
+ ),
+ );
+ }
+ }
+
+ Future chooseDate() async {
+ final height = MediaQuery.of(context).size.height;
+ // check and hide keyboard
+ if (FocusScope.of(context).hasFocus) {
+ FocusScope.of(context).unfocus();
+ await Future.delayed(const Duration(milliseconds: 125));
+ }
+
+ final date = await showRoundedDatePicker(
+ context: context,
+ initialDate: DateTime.now(),
+ height: height * 0.5,
+ theme: ThemeData(
+ primarySwatch: Util.createMaterialColor(
+ Theme.of(context).extension()!.accentColorDark),
+ ),
+ //TODO pick a better initial date
+ // 2007 chosen as that is just before bitcoin launched
+ firstDate: DateTime(2007),
+ lastDate: DateTime.now(),
+ borderRadius: Constants.size.circularBorderRadius * 2,
+
+ textPositiveButton: "SELECT",
+
+ styleDatePicker: _buildDatePickerStyle(),
+ styleYearPicker: _buildYearPickerStyle(),
+ );
+ if (date != null) {
+ _restoreFromDate = date;
+ _dateController.text = Format.formatDate(date);
+ }
+ }
+
+ Future chooseMnemonicLength() async {
+ await showModalBottomSheet(
+ backgroundColor: Colors.transparent,
+ context: context,
+ shape: const RoundedRectangleBorder(
+ borderRadius: BorderRadius.vertical(
+ top: Radius.circular(20),
+ ),
+ ),
+ builder: (_) {
+ return MnemonicWordCountSelectSheet(
+ lengthOptions: Constants.possibleLengthsForCoin(coin),
+ );
+ },
+ );
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ debugPrint("BUILD: $runtimeType with ${coin.name} $walletName");
+
+ final lengths = Constants.possibleLengthsForCoin(coin).toList();
+
+ return DesktopScaffold(
+ appBar: isDesktop
+ ? const DesktopAppBar(
+ isCompactHeight: false,
+ leading: AppBarBackButton(),
+ )
+ : AppBar(
+ leading: AppBarBackButton(
+ onPressed: () {
+ if (textFieldFocusNode.hasFocus) {
+ textFieldFocusNode.unfocus();
+ Future.delayed(const Duration(milliseconds: 100))
+ .then((value) => Navigator.of(context).pop());
+ } else {
+ Navigator.of(context).pop();
+ }
+ },
+ ),
+ ),
+ body: RestoreOptionsPlatformLayout(
+ isDesktop: isDesktop,
+ child: ConstrainedBox(
+ constraints: BoxConstraints(
+ maxWidth: isDesktop ? 480 : double.infinity,
+ ),
+ child: Column(
+ crossAxisAlignment: CrossAxisAlignment.stretch,
+ children: [
+ if (!isDesktop)
+ const Spacer(
+ flex: 1,
+ ),
+ if (!isDesktop)
+ Image(
+ image: AssetImage(
+ Assets.png.imageFor(coin: coin),
+ ),
+ height: 100,
+ ),
+ SizedBox(
+ height: isDesktop ? 24 : 16,
+ ),
+ Text(
+ "Restore options",
+ textAlign: TextAlign.center,
+ style: isDesktop
+ ? STextStyles.desktopH2(context)
+ : STextStyles.pageTitleH1(context),
+ ),
+ SizedBox(
+ height: isDesktop ? 40 : 24,
+ ),
+ if (coin == Coin.monero || coin == Coin.epicCash)
+ Text(
+ "Choose start date",
+ style: isDesktop
+ ? STextStyles.desktopTextExtraSmall(context).copyWith(
+ color: Theme.of(context)
+ .extension()!
+ .textDark3,
+ )
+ : STextStyles.smallMed12(context),
+ textAlign: TextAlign.left,
+ ),
+ if (coin == Coin.monero || coin == Coin.epicCash)
+ SizedBox(
+ height: isDesktop ? 16 : 8,
+ ),
+ if (coin == Coin.monero || coin == Coin.epicCash)
+
+ // if (!isDesktop)
+ RestoreFromDatePicker(
+ onTap: chooseDate,
+ ),
+
+ // if (isDesktop)
+ // // TODO desktop date picker
+ if (coin == Coin.monero || coin == Coin.epicCash)
+ const SizedBox(
+ height: 8,
+ ),
+ if (coin == Coin.monero || coin == Coin.epicCash)
+ RoundedWhiteContainer(
+ child: Center(
+ child: Text(
+ "Choose the date you made the wallet (approximate is fine)",
+ style: isDesktop
+ ? STextStyles.desktopTextExtraSmall(context).copyWith(
+ color: Theme.of(context)
+ .extension()!
+ .textSubtitle1,
+ )
+ : STextStyles.smallMed12(context).copyWith(
+ fontSize: 10,
+ ),
+ ),
+ ),
+ ),
+ if (coin == Coin.monero || coin == Coin.epicCash)
+ SizedBox(
+ height: isDesktop ? 24 : 16,
+ ),
+ Text(
+ "Choose recovery phrase length",
+ style: isDesktop
+ ? STextStyles.desktopTextExtraSmall(context).copyWith(
+ color: Theme.of(context)
+ .extension()!
+ .textDark3,
+ )
+ : STextStyles.smallMed12(context),
+ textAlign: TextAlign.left,
+ ),
+ SizedBox(
+ height: isDesktop ? 16 : 8,
+ ),
+ if (isDesktop)
+ DropdownButtonHideUnderline(
+ child: DropdownButton2(
+ value:
+ ref.watch(mnemonicWordCountStateProvider.state).state,
+ items: [
+ ...lengths.map(
+ (e) => DropdownMenuItem(
+ value: e,
+ child: Text(
+ "$e words",
+ style: STextStyles.desktopTextMedium(context),
+ ),
+ ),
+ ),
+ ],
+ onChanged: (value) {
+ if (value is int) {
+ ref.read(mnemonicWordCountStateProvider.state).state =
+ value;
+ }
+ },
+ isExpanded: true,
+ icon: SvgPicture.asset(
+ Assets.svg.chevronDown,
+ width: 12,
+ height: 6,
+ color: Theme.of(context)
+ .extension()!
+ .textFieldActiveSearchIconRight,
+ ),
+ buttonPadding: const EdgeInsets.symmetric(
+ horizontal: 16,
+ vertical: 8,
+ ),
+ buttonDecoration: BoxDecoration(
+ color: Theme.of(context)
+ .extension()!
+ .textFieldDefaultBG,
+ borderRadius: BorderRadius.circular(
+ Constants.size.circularBorderRadius,
+ ),
+ ),
+ dropdownDecoration: BoxDecoration(
+ color: Theme.of(context)
+ .extension()!
+ .textFieldDefaultBG,
+ borderRadius: BorderRadius.circular(
+ Constants.size.circularBorderRadius,
+ ),
+ ),
+ ),
+ ),
+ if (!isDesktop)
+ MobileMnemonicLengthSelector(
+ chooseMnemonicLength: chooseMnemonicLength,
+ ),
+ if (!isDesktop)
+ const Spacer(
+ flex: 3,
+ ),
+ if (isDesktop)
+ const SizedBox(
+ height: 32,
+ ),
+ RestoreOptionsNextButton(
+ isDesktop: isDesktop,
+ onPressed: _nextEnabled ? nextPressed : null,
+ ),
+ ],
+ ),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/sub_widgets/mobile_mnemonic_length_selector.dart b/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/sub_widgets/mobile_mnemonic_length_selector.dart
new file mode 100644
index 000000000..49896e107
--- /dev/null
+++ b/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/sub_widgets/mobile_mnemonic_length_selector.dart
@@ -0,0 +1,60 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_riverpod/flutter_riverpod.dart';
+import 'package:flutter_svg/svg.dart';
+import 'package:stackwallet/providers/ui/verify_recovery_phrase/mnemonic_word_count_state_provider.dart';
+import 'package:stackwallet/utilities/assets.dart';
+import 'package:stackwallet/utilities/constants.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
+
+class MobileMnemonicLengthSelector extends ConsumerWidget {
+ const MobileMnemonicLengthSelector({
+ Key? key,
+ required this.chooseMnemonicLength,
+ }) : super(key: key);
+
+ final VoidCallback chooseMnemonicLength;
+
+ @override
+ Widget build(BuildContext context, WidgetRef ref) {
+ return Stack(
+ children: [
+ const TextField(
+ // controller: _lengthController,
+ readOnly: true,
+ textInputAction: TextInputAction.none,
+ ),
+ Padding(
+ padding: const EdgeInsets.symmetric(
+ horizontal: 12,
+ ),
+ child: RawMaterialButton(
+ splashColor: Theme.of(context).extension()!.highlight,
+ shape: RoundedRectangleBorder(
+ borderRadius: BorderRadius.circular(
+ Constants.size.circularBorderRadius,
+ ),
+ ),
+ onPressed: chooseMnemonicLength,
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: [
+ Text(
+ "${ref.watch(mnemonicWordCountStateProvider.state).state} words",
+ style: STextStyles.itemSubtitle12(context),
+ ),
+ SvgPicture.asset(
+ Assets.svg.chevronDown,
+ width: 8,
+ height: 4,
+ color:
+ Theme.of(context).extension()!.textSubtitle2,
+ ),
+ ],
+ ),
+ ),
+ )
+ ],
+ );
+ }
+}
diff --git a/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/sub_widgets/restore_from_date_picker.dart b/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/sub_widgets/restore_from_date_picker.dart
new file mode 100644
index 000000000..0207a4c61
--- /dev/null
+++ b/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/sub_widgets/restore_from_date_picker.dart
@@ -0,0 +1,76 @@
+import 'package:flutter/material.dart';
+import 'package:flutter_svg/svg.dart';
+import 'package:stackwallet/utilities/assets.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
+
+class RestoreFromDatePicker extends StatefulWidget {
+ const RestoreFromDatePicker({Key? key, required this.onTap})
+ : super(key: key);
+
+ final VoidCallback onTap;
+
+ @override
+ State createState() => _RestoreFromDatePickerState();
+}
+
+class _RestoreFromDatePickerState extends State {
+ late final TextEditingController _dateController;
+ late final VoidCallback onTap;
+
+ @override
+ void initState() {
+ onTap = widget.onTap;
+ _dateController = TextEditingController();
+
+ super.initState();
+ }
+
+ @override
+ void dispose() {
+ _dateController.dispose();
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Container(
+ color: Colors.transparent,
+ child: TextField(
+ onTap: onTap,
+ controller: _dateController,
+ style: STextStyles.field(context),
+ decoration: InputDecoration(
+ hintText: "Restore from...",
+ suffixIcon: UnconstrainedBox(
+ child: Row(
+ children: [
+ const SizedBox(
+ width: 16,
+ ),
+ SvgPicture.asset(
+ Assets.svg.calendar,
+ color: Theme.of(context).extension()!.textDark3,
+ width: 16,
+ height: 16,
+ ),
+ const SizedBox(
+ width: 12,
+ ),
+ ],
+ ),
+ ),
+ ),
+ key: const Key("restoreOptionsViewDatePickerKey"),
+ readOnly: true,
+ toolbarOptions: const ToolbarOptions(
+ copy: true,
+ cut: false,
+ paste: false,
+ selectAll: false,
+ ),
+ onChanged: (newValue) {},
+ ),
+ );
+ }
+}
diff --git a/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/sub_widgets/restore_options_next_button.dart b/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/sub_widgets/restore_options_next_button.dart
new file mode 100644
index 000000000..502502f94
--- /dev/null
+++ b/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/sub_widgets/restore_options_next_button.dart
@@ -0,0 +1,37 @@
+import 'package:flutter/material.dart';
+import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
+
+class RestoreOptionsNextButton extends StatelessWidget {
+ const RestoreOptionsNextButton({
+ Key? key,
+ required this.isDesktop,
+ this.onPressed,
+ }) : super(key: key);
+
+ final bool isDesktop;
+ final VoidCallback? onPressed;
+
+ @override
+ Widget build(BuildContext context) {
+ return ConstrainedBox(
+ constraints: BoxConstraints(
+ minHeight: isDesktop ? 70 : 0,
+ ),
+ child: TextButton(
+ onPressed: onPressed,
+ style: onPressed != null
+ ? Theme.of(context)
+ .extension()!
+ .getPrimaryEnabledButtonColor(context)
+ : Theme.of(context)
+ .extension()!
+ .getPrimaryDisabledButtonColor(context),
+ child: Text(
+ "Next",
+ style: STextStyles.button(context),
+ ),
+ ),
+ );
+ }
+}
diff --git a/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/sub_widgets/restore_options_platform_layout.dart b/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/sub_widgets/restore_options_platform_layout.dart
new file mode 100644
index 000000000..12121cd7d
--- /dev/null
+++ b/lib/pages/add_wallet_views/restore_wallet_view/restore_options_view/sub_widgets/restore_options_platform_layout.dart
@@ -0,0 +1,39 @@
+import 'package:flutter/material.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
+
+class RestoreOptionsPlatformLayout extends StatelessWidget {
+ const RestoreOptionsPlatformLayout({
+ Key? key,
+ required this.isDesktop,
+ required this.child,
+ }) : super(key: key);
+
+ final bool isDesktop;
+ final Widget child;
+
+ @override
+ Widget build(BuildContext context) {
+ if (isDesktop) {
+ return child;
+ } else {
+ return Container(
+ color: Theme.of(context).extension()!.background,
+ child: Padding(
+ padding: const EdgeInsets.all(16),
+ child: LayoutBuilder(
+ builder: (ctx, constraints) {
+ return SingleChildScrollView(
+ child: ConstrainedBox(
+ constraints: BoxConstraints(minHeight: constraints.maxHeight),
+ child: IntrinsicHeight(
+ child: child,
+ ),
+ ),
+ );
+ },
+ ),
+ ),
+ );
+ }
+ }
+}
diff --git a/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart b/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart
index 4e4871bda..a0ac25383 100644
--- a/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart
+++ b/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart
@@ -16,6 +16,7 @@ import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/sub_widge
import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/sub_widgets/restore_succeeded_dialog.dart';
import 'package:stackwallet/pages/add_wallet_views/restore_wallet_view/sub_widgets/restoring_dialog.dart';
import 'package:stackwallet/pages/home_view/home_view.dart';
+import 'package:stackwallet/pages_desktop_specific/home/desktop_home_view.dart';
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/services/coins/coin_service.dart';
import 'package:stackwallet/services/coins/manager.dart';
@@ -23,7 +24,6 @@ import 'package:stackwallet/services/transaction_notification_tracker.dart';
import 'package:stackwallet/utilities/address_utils.dart';
import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/barcode_scanner_interface.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/clipboard_interface.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/custom_text_selection_controls.dart';
@@ -33,6 +33,8 @@ import 'package:stackwallet/utilities/enums/flush_bar_type.dart';
import 'package:stackwallet/utilities/enums/form_input_status_enum.dart';
import 'package:stackwallet/utilities/logger.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
+import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/icon_widgets/clipboard_icon.dart';
import 'package:stackwallet/widgets/icon_widgets/qrcode_icon.dart';
@@ -66,6 +68,7 @@ class RestoreWalletView extends ConsumerStatefulWidget {
class _RestoreWalletViewState extends ConsumerState {
final _formKey = GlobalKey();
late final int _seedWordCount;
+ late final bool isDesktop;
final HashSet _wordListHashSet = HashSet.from(bip39wordlist.WORDLIST);
final ScrollController controller = ScrollController();
@@ -85,13 +88,13 @@ class _RestoreWalletViewState extends ConsumerState {
final text = data!.text!.trim();
if (text.isEmpty || _controllers.isEmpty) {
- delegate.pasteText(SelectionChangedCause.toolbar);
+ unawaited(delegate.pasteText(SelectionChangedCause.toolbar));
return;
}
final words = text.split(" ");
if (words.isEmpty) {
- delegate.pasteText(SelectionChangedCause.toolbar);
+ unawaited(delegate.pasteText(SelectionChangedCause.toolbar));
return;
}
@@ -115,6 +118,7 @@ class _RestoreWalletViewState extends ConsumerState {
@override
void initState() {
_seedWordCount = widget.seedWordsLength;
+ isDesktop = Util.isDesktop;
textSelectionControls = Platform.isIOS
? CustomCupertinoTextSelectionControls(onPaste: onControlsPaste)
@@ -190,13 +194,13 @@ class _RestoreWalletViewState extends ConsumerState {
// TODO: do actual check to make sure it is a valid mnemonic for monero
if (bip39.validateMnemonic(mnemonic) == false &&
!(widget.coin == Coin.monero)) {
- showFloatingFlushBar(
+ unawaited(showFloatingFlushBar(
type: FlushBarType.warning,
message: "Invalid seed phrase!",
context: context,
- );
+ ));
} else {
- if (!Platform.isLinux) Wakelock.enable();
+ if (!Platform.isLinux) await Wakelock.enable();
final walletsService = ref.read(walletsServiceChangeNotifierProvider);
final walletId = await walletsService.addNewWallet(
@@ -206,7 +210,7 @@ class _RestoreWalletViewState extends ConsumerState {
);
bool isRestoring = true;
// show restoring in progress
- showDialog(
+ unawaited(showDialog(
context: context,
useSafeArea: false,
barrierDismissible: false,
@@ -225,7 +229,7 @@ class _RestoreWalletViewState extends ConsumerState {
},
);
},
- );
+ ));
var node = ref
.read(nodeServiceChangeNotifierProvider)
@@ -233,7 +237,7 @@ class _RestoreWalletViewState extends ConsumerState {
if (node == null) {
node = DefaultNodes.getNodeFor(widget.coin);
- ref.read(nodeServiceChangeNotifierProvider).setPrimaryNodeFor(
+ await ref.read(nodeServiceChangeNotifierProvider).setPrimaryNodeFor(
coin: widget.coin,
node: node,
);
@@ -282,26 +286,31 @@ class _RestoreWalletViewState extends ConsumerState {
.addWallet(walletId: manager.walletId, manager: manager);
if (mounted) {
- Navigator.of(context).pushNamedAndRemoveUntil(
- HomeView.routeName, (route) => false);
+ if (isDesktop) {
+ Navigator.of(context)
+ .popUntil(ModalRoute.withName(DesktopHomeView.routeName));
+ } else {
+ unawaited(Navigator.of(context).pushNamedAndRemoveUntil(
+ HomeView.routeName, (route) => false));
+ }
}
- showDialog(
+ await showDialog(
context: context,
useSafeArea: false,
barrierDismissible: true,
builder: (context) {
return const RestoreSucceededDialog();
},
- ).then(
- (_) {
- if (!Platform.isLinux) Wakelock.disable();
- // timer.cancel();
- },
);
+ if (!Platform.isLinux && !isDesktop) {
+ await Wakelock.disable();
+ }
}
} catch (e) {
- if (!Platform.isLinux) Wakelock.disable();
+ if (!Platform.isLinux && !isDesktop) {
+ await Wakelock.disable();
+ }
// if (e is HiveError &&
// e.message == "Box has already been closed.") {
@@ -316,7 +325,7 @@ class _RestoreWalletViewState extends ConsumerState {
Navigator.pop(context);
// show restoring wallet failed dialog
- showDialog(
+ await showDialog(
context: context,
useSafeArea: false,
barrierDismissible: true,
@@ -331,7 +340,9 @@ class _RestoreWalletViewState extends ConsumerState {
}
}
- if (!Platform.isLinux) Wakelock.disable();
+ if (!Platform.isLinux && !isDesktop) {
+ await Wakelock.disable();
+ }
}
}
}
@@ -343,27 +354,35 @@ class _RestoreWalletViewState extends ConsumerState {
Widget? suffixIcon;
switch (status) {
case FormInputStatus.empty:
- color = CFColors.fieldGray;
- prefixColor = CFColors.gray3;
+ color = Theme.of(context).extension()!.textFieldDefaultBG;
+ prefixColor = Theme.of(context).extension()!.textSubtitle2;
break;
case FormInputStatus.invalid:
- color = CFColors.notificationRedBackground;
- prefixColor = CFColors.notificationRedForeground;
+ color = Theme.of(context).extension()!.textFieldErrorBG;
+ prefixColor = Theme.of(context)
+ .extension()!
+ .textFieldErrorSearchIconLeft;
suffixIcon = SvgPicture.asset(
Assets.svg.alertCircle,
width: 16,
height: 16,
- color: CFColors.notificationRedForeground,
+ color: Theme.of(context)
+ .extension()!
+ .textFieldErrorSearchIconRight,
);
break;
case FormInputStatus.valid:
- color = CFColors.notificationGreenBackground;
- prefixColor = CFColors.notificationGreenForeground;
+ color = Theme.of(context).extension()!.textFieldSuccessBG;
+ prefixColor = Theme.of(context)
+ .extension()!
+ .textFieldSuccessSearchIconLeft;
suffixIcon = SvgPicture.asset(
Assets.svg.checkCircle,
width: 16,
height: 16,
- color: CFColors.notificationGreenForeground,
+ color: Theme.of(context)
+ .extension()!
+ .textFieldSuccessSearchIconRight,
);
break;
}
@@ -383,7 +402,7 @@ class _RestoreWalletViewState extends ConsumerState {
),
child: Text(
prefix,
- style: STextStyles.fieldLabel.copyWith(
+ style: STextStyles.fieldLabel(context).copyWith(
color: prefixColor,
),
),
@@ -441,8 +460,71 @@ class _RestoreWalletViewState extends ConsumerState {
});
}
- controller.animateTo(controller.position.maxScrollExtent,
- duration: const Duration(milliseconds: 300), curve: Curves.decelerate);
+ if (!isDesktop) {
+ controller.animateTo(
+ controller.position.maxScrollExtent,
+ duration: const Duration(milliseconds: 300),
+ curve: Curves.decelerate,
+ );
+ }
+ }
+
+ Future scanMnemonicQr() async {
+ try {
+ final qrResult = await scanner.scan();
+
+ final results = AddressUtils.decodeQRSeedData(qrResult.rawContent);
+
+ Logging.instance.log("scan parsed: $results", level: LogLevel.Info);
+
+ if (results["mnemonic"] != null) {
+ final list = (results["mnemonic"] as List)
+ .map((value) => value as String)
+ .toList(growable: false);
+ if (list.isNotEmpty) {
+ _clearAndPopulateMnemonic(list);
+ Logging.instance.log("mnemonic populated", level: LogLevel.Info);
+ } else {
+ Logging.instance
+ .log("mnemonic failed to populate", level: LogLevel.Info);
+ }
+ }
+ } on PlatformException catch (e) {
+ // likely failed to get camera permissions
+ Logging.instance
+ .log("Restore wallet qr scan failed: $e", level: LogLevel.Warning);
+ }
+ }
+
+ Future pasteMnemonic() async {
+ debugPrint("restoreWalletPasteButton tapped");
+ final ClipboardData? data =
+ await widget.clipboard.getData(Clipboard.kTextPlain);
+
+ if (data?.text != null && data!.text!.isNotEmpty) {
+ final content = data.text!.trim();
+ final list = content.split(" ");
+ _clearAndPopulateMnemonic(list);
+ }
+ }
+
+ Future requestRestore() async {
+ // wait for keyboard to disappear
+ FocusScope.of(context).unfocus();
+ await Future.delayed(
+ const Duration(milliseconds: 100),
+ );
+
+ await showDialog(
+ context: context,
+ useSafeArea: false,
+ barrierDismissible: true,
+ builder: (context) {
+ return ConfirmRecoveryDialog(
+ onConfirm: attemptRestore,
+ );
+ },
+ );
}
@override
@@ -473,41 +555,15 @@ class _RestoreWalletViewState extends ConsumerState {
key: const Key("restoreWalletViewQrCodeButton"),
size: 36,
shadows: const [],
- color: CFColors.almostWhite,
- icon: const QrCodeIcon(
+ color: Theme.of(context).extension()!.background,
+ icon: QrCodeIcon(
width: 20,
height: 20,
- color: CFColors.stackAccent,
+ color: Theme.of(context)
+ .extension()!
+ .accentColorDark,
),
- onPressed: () async {
- try {
- final qrResult = await scanner.scan();
-
- final results =
- AddressUtils.decodeQRSeedData(qrResult.rawContent);
-
- Logging.instance
- .log("scan parsed: $results", level: LogLevel.Info);
-
- if (results["mnemonic"] != null) {
- final list = (results["mnemonic"] as List)
- .map((value) => value as String)
- .toList(growable: false);
- if (list.isNotEmpty) {
- _clearAndPopulateMnemonic(list);
- Logging.instance
- .log("mnemonic populated", level: LogLevel.Info);
- } else {
- Logging.instance.log("mnemonic failed to populate",
- level: LogLevel.Info);
- }
- }
- } on PlatformException catch (e) {
- // likely failed to get camera permissions
- Logging.instance.log("Restore wallet qr scan failed: $e",
- level: LogLevel.Warning);
- }
- },
+ onPressed: scanMnemonicQr,
),
),
),
@@ -523,51 +579,43 @@ class _RestoreWalletViewState extends ConsumerState {
key: const Key("restoreWalletPasteButton"),
size: 36,
shadows: const [],
- color: CFColors.almostWhite,
- icon: const ClipboardIcon(
+ color: Theme.of(context).extension()!.background,
+ icon: ClipboardIcon(
width: 20,
height: 20,
- color: CFColors.stackAccent,
+ color: Theme.of(context)
+ .extension()!
+ .accentColorDark,
),
- onPressed: () async {
- debugPrint("restoreWalletPasteButton tapped");
- final ClipboardData? data =
- await widget.clipboard.getData(Clipboard.kTextPlain);
-
- if (data?.text != null && data!.text!.isNotEmpty) {
- final content = data.text!.trim();
- final list = content.split(" ");
- _clearAndPopulateMnemonic(list);
- }
- },
+ onPressed: pasteMnemonic,
),
),
),
],
),
body: Container(
- color: CFColors.almostWhite,
+ color: Theme.of(context).extension()!.background,
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
children: [
Text(
widget.walletName,
- style: STextStyles.itemSubtitle,
+ style: STextStyles.itemSubtitle(context),
),
const SizedBox(
height: 4,
),
Text(
"Recovery phrase",
- style: STextStyles.pageTitleH1,
+ style: STextStyles.pageTitleH1(context),
),
const SizedBox(
height: 8,
),
Text(
"Enter your $_seedWordCount-word recovery phrase.",
- style: STextStyles.subtitle,
+ style: STextStyles.subtitle(context),
),
const SizedBox(
height: 10,
@@ -617,7 +665,11 @@ class _RestoreWalletViewState extends ConsumerState {
}
},
controller: _controllers[i - 1],
- style: STextStyles.field,
+ style: STextStyles.field(context).copyWith(
+ color: Theme.of(context)
+ .extension()!
+ .overlay,
+ ),
),
),
if (_inputStatuses[i - 1] ==
@@ -632,78 +684,29 @@ class _RestoreWalletViewState extends ConsumerState {
child: Text(
"Please check spelling",
textAlign: TextAlign.left,
- style: STextStyles.label.copyWith(
- color: CFColors
- .notificationRedForeground,
+ style:
+ STextStyles.label(context).copyWith(
+ color: Theme.of(context)
+ .extension()!
+ .textError,
),
),
),
)
],
),
- // if (widget.coin == Coin.monero ||
- // widget.coin == Coin.epicCash)
- // Padding(
- // padding: const EdgeInsets.only(
- // top: 8.0,
- // ),
- // child: ClipRRect(
- // borderRadius: BorderRadius.circular(
- // Constants.size.circularBorderRadius,
- // ),
- // child: TextField(
- // key: Key("restoreMnemonicFormField_height"),
- // inputFormatters: [
- // FilteringTextInputFormatter.allow(
- // RegExp("[0-9]*")),
- // ],
- // keyboardType:
- // TextInputType.numberWithOptions(),
- // controller: _heightController,
- // focusNode: _heightFocusNode,
- // style: STextStyles.field,
- // decoration: standardInputDecoration(
- // "Height",
- // _heightFocusNode,
- // ),
- // ),
- // ),
- // ),
Padding(
padding: const EdgeInsets.only(
top: 8.0,
),
child: TextButton(
style: Theme.of(context)
- .textButtonTheme
- .style
- ?.copyWith(
- backgroundColor:
- MaterialStateProperty.all(
- CFColors.stackAccent,
- ),
- ),
- onPressed: () async {
- // wait for keyboard to disappear
- FocusScope.of(context).unfocus();
- await Future.delayed(
- const Duration(milliseconds: 100),
- );
-
- showDialog(
- context: context,
- useSafeArea: false,
- barrierDismissible: true,
- builder: (context) {
- return ConfirmRecoveryDialog(
- onConfirm: attemptRestore,
- );
- },
- );
- },
+ .extension()!
+ .getPrimaryEnabledButtonColor(context),
+ onPressed: requestRestore,
child: Text(
"Restore",
- style: STextStyles.button,
+ style: STextStyles.button(context),
),
),
),
diff --git a/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/mnemonic_word_count_select_sheet.dart b/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/mnemonic_word_count_select_sheet.dart
index 50ab388ff..44bdf5f99 100644
--- a/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/mnemonic_word_count_select_sheet.dart
+++ b/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/mnemonic_word_count_select_sheet.dart
@@ -1,9 +1,9 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:stackwallet/providers/ui/verify_recovery_phrase/mnemonic_word_count_state_provider.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
class MnemonicWordCountSelectSheet extends ConsumerWidget {
const MnemonicWordCountSelectSheet({
@@ -22,9 +22,9 @@ class MnemonicWordCountSelectSheet extends ConsumerWidget {
return false;
},
child: Container(
- decoration: const BoxDecoration(
- color: CFColors.white,
- borderRadius: BorderRadius.vertical(
+ decoration: BoxDecoration(
+ color: Theme.of(context).extension()!.popupBG,
+ borderRadius: const BorderRadius.vertical(
top: Radius.circular(20),
),
),
@@ -42,7 +42,9 @@ class MnemonicWordCountSelectSheet extends ConsumerWidget {
Center(
child: Container(
decoration: BoxDecoration(
- color: CFColors.fieldGray,
+ color: Theme.of(context)
+ .extension()!
+ .textFieldDefaultBG,
borderRadius: BorderRadius.circular(
Constants.size.circularBorderRadius,
),
@@ -62,7 +64,7 @@ class MnemonicWordCountSelectSheet extends ConsumerWidget {
children: [
Text(
"Phrase length",
- style: STextStyles.pageTitleH2,
+ style: STextStyles.pageTitleH2(context),
textAlign: TextAlign.left,
),
const SizedBox(
@@ -96,7 +98,9 @@ class MnemonicWordCountSelectSheet extends ConsumerWidget {
width: 20,
height: 20,
child: Radio(
- activeColor: CFColors.link2,
+ activeColor: Theme.of(context)
+ .extension()!
+ .radioButtonIconEnabled,
value: lengthOptions[i],
groupValue: ref
.watch(mnemonicWordCountStateProvider
@@ -118,9 +122,7 @@ class MnemonicWordCountSelectSheet extends ConsumerWidget {
),
Text(
"${lengthOptions[i]} words",
- style: STextStyles.titleBold12.copyWith(
- color: const Color(0xFF44464E),
- ),
+ style: STextStyles.titleBold12(context),
textAlign: TextAlign.left,
),
],
diff --git a/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restore_failed_dialog.dart b/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restore_failed_dialog.dart
index 866223cfe..daf5cf1fc 100644
--- a/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restore_failed_dialog.dart
+++ b/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restore_failed_dialog.dart
@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:stackwallet/providers/providers.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
import 'package:stackwallet/widgets/stack_dialog.dart';
class RestoreFailedDialog extends ConsumerStatefulWidget {
@@ -45,14 +45,12 @@ class _RestoreFailedDialogState extends ConsumerState {
title: "Restore failed",
message: errorMessage,
rightButton: TextButton(
- style: Theme.of(context).textButtonTheme.style?.copyWith(
- backgroundColor: MaterialStateProperty.all(
- CFColors.buttonGray,
- ),
- ),
+ style: Theme.of(context)
+ .extension()!
+ .getSecondaryEnabledButtonColor(context),
child: Text(
"Ok",
- style: STextStyles.itemSubtitle12,
+ style: STextStyles.itemSubtitle12(context),
),
onPressed: () async {
ref
diff --git a/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restore_succeeded_dialog.dart b/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restore_succeeded_dialog.dart
index 2cfdaba2a..2cd539c0c 100644
--- a/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restore_succeeded_dialog.dart
+++ b/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restore_succeeded_dialog.dart
@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:stackwallet/utilities/assets.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
import 'package:stackwallet/widgets/stack_dialog.dart';
class RestoreSucceededDialog extends StatelessWidget {
@@ -17,17 +17,15 @@ class RestoreSucceededDialog extends StatelessWidget {
Assets.svg.checkCircle,
width: 24,
height: 24,
- color: CFColors.stackGreen,
+ color: Theme.of(context).extension()!.accentColorGreen,
),
rightButton: TextButton(
- style: Theme.of(context).textButtonTheme.style?.copyWith(
- backgroundColor: MaterialStateProperty.all(
- CFColors.buttonGray,
- ),
- ),
+ style: Theme.of(context)
+ .extension()!
+ .getSecondaryEnabledButtonColor(context),
child: Text(
"Ok",
- style: STextStyles.itemSubtitle12,
+ style: STextStyles.itemSubtitle12(context),
),
onPressed: () {
Navigator.of(context).pop();
diff --git a/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restoring_dialog.dart b/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restoring_dialog.dart
index 59ad53c20..80a688d03 100644
--- a/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restoring_dialog.dart
+++ b/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restoring_dialog.dart
@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:stackwallet/utilities/assets.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
import 'package:stackwallet/widgets/stack_dialog.dart';
class RestoringDialog extends StatefulWidget {
@@ -59,22 +59,19 @@ class _RestoringDialogState extends State
message: "This may take a while. Please do not exit this screen.",
icon: RotationTransition(
turns: _spinAnimation,
- child: SvgPicture.asset(
- Assets.svg.arrowRotate3,
- width: 24,
- height: 24,
- color: CFColors.stackAccent,
- ),
+ child: SvgPicture.asset(Assets.svg.arrowRotate3,
+ width: 24,
+ height: 24,
+ color:
+ Theme.of(context).extension()!.accentColorDark),
),
rightButton: TextButton(
- style: Theme.of(context).textButtonTheme.style?.copyWith(
- backgroundColor: MaterialStateProperty.all(
- CFColors.buttonGray,
- ),
- ),
+ style: Theme.of(context)
+ .extension()!
+ .getSecondaryEnabledButtonColor(context),
child: Text(
"Cancel",
- style: STextStyles.itemSubtitle12,
+ style: STextStyles.itemSubtitle12(context),
),
onPressed: () async {
await onCancel.call();
diff --git a/lib/pages/add_wallet_views/verify_recovery_phrase_view/sub_widgets/word_table.dart b/lib/pages/add_wallet_views/verify_recovery_phrase_view/sub_widgets/word_table.dart
index 0046607c4..768ed05af 100644
--- a/lib/pages/add_wallet_views/verify_recovery_phrase_view/sub_widgets/word_table.dart
+++ b/lib/pages/add_wallet_views/verify_recovery_phrase_view/sub_widgets/word_table.dart
@@ -6,9 +6,11 @@ class WordTable extends ConsumerWidget {
const WordTable({
Key? key,
required this.words,
+ required this.isDesktop,
}) : super(key: key);
final List words;
+ final bool isDesktop;
static const wordsPerRow = 3;
static const wordsToShow = 9;
@@ -24,18 +26,19 @@ class WordTable extends ConsumerWidget {
children: [
for (int i = 1; i <= rows; i++)
Padding(
- padding: const EdgeInsets.symmetric(vertical: 5),
+ padding: EdgeInsets.symmetric(vertical: isDesktop ? 8 : 5),
child: Row(
children: [
for (int j = 1; j <= wordsPerRow; j++) ...[
if (j > 1)
- const SizedBox(
- width: 6,
+ SizedBox(
+ width: isDesktop ? 10 : 6,
),
Expanded(
child: WordTableItem(
number: ++index,
word: words[index - 1],
+ isDesktop: isDesktop,
),
),
],
diff --git a/lib/pages/add_wallet_views/verify_recovery_phrase_view/sub_widgets/word_table_item.dart b/lib/pages/add_wallet_views/verify_recovery_phrase_view/sub_widgets/word_table_item.dart
index 3d7d87d22..1cdc1a4f8 100644
--- a/lib/pages/add_wallet_views/verify_recovery_phrase_view/sub_widgets/word_table_item.dart
+++ b/lib/pages/add_wallet_views/verify_recovery_phrase_view/sub_widgets/word_table_item.dart
@@ -1,19 +1,21 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:stackwallet/providers/providers.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
class WordTableItem extends ConsumerWidget {
const WordTableItem({
Key? key,
required this.number,
required this.word,
+ required this.isDesktop,
}) : super(key: key);
final int number;
final String word;
+ final bool isDesktop;
@override
Widget build(BuildContext context, WidgetRef ref) {
@@ -22,15 +24,22 @@ class WordTableItem extends ConsumerWidget {
ref.watch(verifyMnemonicSelectedWordStateProvider.state).state;
return Container(
decoration: BoxDecoration(
- color: selectedWord == word ? CFColors.selection : CFColors.white,
+ color: selectedWord == word
+ ? Theme.of(context).extension()!.snackBarBackInfo
+ : Theme.of(context).extension()!.popupBG,
borderRadius: BorderRadius.circular(
Constants.size.circularBorderRadius,
),
),
child: MaterialButton(
- splashColor: CFColors.splashLight,
+ splashColor: Theme.of(context).extension()!.highlight,
key: Key("coinSelectItemButtonKey_$word"),
- padding: const EdgeInsets.all(12),
+ padding: isDesktop
+ ? const EdgeInsets.symmetric(
+ vertical: 18,
+ horizontal: 12,
+ )
+ : const EdgeInsets.all(12),
materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
shape: RoundedRectangleBorder(
borderRadius:
@@ -45,7 +54,12 @@ class WordTableItem extends ConsumerWidget {
Text(
word,
textAlign: TextAlign.center,
- style: STextStyles.baseXS,
+ style: isDesktop
+ ? STextStyles.desktopTextExtraSmall(context).copyWith(
+ color:
+ Theme.of(context).extension()!.textDark,
+ )
+ : STextStyles.baseXS(context),
),
],
),
diff --git a/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart b/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart
index 6e0c1dd2b..cdfff73ca 100644
--- a/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart
+++ b/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart
@@ -1,3 +1,4 @@
+import 'dart:async';
import 'dart:math';
import 'package:flutter/material.dart';
@@ -6,14 +7,19 @@ import 'package:stackwallet/notifications/show_flush_bar.dart';
import 'package:stackwallet/pages/add_wallet_views/new_wallet_recovery_phrase_view/new_wallet_recovery_phrase_view.dart';
import 'package:stackwallet/pages/add_wallet_views/verify_recovery_phrase_view/sub_widgets/word_table.dart';
import 'package:stackwallet/pages/home_view/home_view.dart';
+import 'package:stackwallet/pages_desktop_specific/home/desktop_home_view.dart';
+import 'package:stackwallet/pages_desktop_specific/home/my_stack_view/exit_to_my_stack_button.dart';
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/services/coins/manager.dart';
import 'package:stackwallet/utilities/assets.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/flush_bar_type.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
+import 'package:stackwallet/utilities/util.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
+import 'package:stackwallet/widgets/desktop/desktop_app_bar.dart';
+import 'package:stackwallet/widgets/desktop/desktop_scaffold.dart';
import 'package:tuple/tuple.dart';
class VerifyRecoveryPhraseView extends ConsumerStatefulWidget {
@@ -39,11 +45,13 @@ class _VerifyRecoveryPhraseViewState
{
late Manager _manager;
late List _mnemonic;
+ late final bool isDesktop;
@override
void initState() {
_manager = widget.manager;
_mnemonic = widget.mnemonic;
+ isDesktop = Util.isDesktop;
// WidgetsBinding.instance?.addObserver(this);
super.initState();
}
@@ -75,6 +83,62 @@ class _VerifyRecoveryPhraseViewState
// }
// }
+ Future _continue(bool isMatch) async {
+ if (isMatch) {
+ await ref.read(walletsServiceChangeNotifierProvider).setMnemonicVerified(
+ walletId: _manager.walletId,
+ );
+
+ ref
+ .read(walletsChangeNotifierProvider.notifier)
+ .addWallet(walletId: _manager.walletId, manager: _manager);
+
+ if (mounted) {
+ if (isDesktop) {
+ Navigator.of(context).popUntil(
+ ModalRoute.withName(
+ DesktopHomeView.routeName,
+ ),
+ );
+ } else {
+ unawaited(
+ Navigator.of(context).pushNamedAndRemoveUntil(
+ HomeView.routeName,
+ (route) => false,
+ ),
+ );
+ }
+ }
+
+ unawaited(showFloatingFlushBar(
+ type: FlushBarType.success,
+ message: "Correct! Your wallet is set up.",
+ iconAsset: Assets.svg.check,
+ context: context,
+ ));
+ } else {
+ unawaited(showFloatingFlushBar(
+ type: FlushBarType.warning,
+ message: "Incorrect. Please try again.",
+ iconAsset: Assets.svg.circleX,
+ context: context,
+ ));
+
+ final int next = Random().nextInt(_mnemonic.length);
+ ref
+ .read(verifyMnemonicWordIndexStateProvider.state)
+ .update((state) => next);
+
+ ref
+ .read(verifyMnemonicCorrectWordStateProvider.state)
+ .update((state) => _mnemonic[next]);
+
+ ref
+ .read(verifyMnemonicSelectedWordStateProvider.state)
+ .update((state) => "");
+ }
+ }
+
Tuple2, String> randomize(
List mnemonic, int chosenIndex, int wordsToShow) {
final List remaining = [];
@@ -113,12 +177,12 @@ class _VerifyRecoveryPhraseViewState
return false;
}
- // Future delete() async {
- // await ref
- // .read(walletsServiceChangeNotifierProvider)
- // .deleteWallet(_manager.walletName, false);
- // await _manager.exitCurrentWallet();
- // }
+ Future delete() async {
+ await ref
+ .read(walletsServiceChangeNotifierProvider)
+ .deleteWallet(_manager.walletName, false);
+ await _manager.exitCurrentWallet();
+ }
@override
Widget build(BuildContext context) {
@@ -128,51 +192,80 @@ class _VerifyRecoveryPhraseViewState
return WillPopScope(
onWillPop: onWillPop,
- child: Scaffold(
- appBar: AppBar(
- leading: AppBarBackButton(
- onPressed: () async {
- // await delete();
- Navigator.of(context).popUntil(
- ModalRoute.withName(
- // NewWalletRecoveryPhraseWarningView.routeName,
- NewWalletRecoveryPhraseView.routeName,
+ child: MasterScaffold(
+ isDesktop: isDesktop,
+ appBar: isDesktop
+ ? DesktopAppBar(
+ isCompactHeight: false,
+ leading: AppBarBackButton(
+ onPressed: () async {
+ Navigator.of(context).popUntil(
+ ModalRoute.withName(
+ NewWalletRecoveryPhraseView.routeName,
+ ),
+ );
+ },
),
- );
- },
- ),
- ),
- body: Container(
- color: CFColors.almostWhite,
+ trailing: ExitToMyStackButton(
+ onPressed: () async {
+ await delete();
+ if (mounted) {
+ Navigator.of(context).popUntil(
+ ModalRoute.withName(DesktopHomeView.routeName),
+ );
+ }
+ },
+ ),
+ )
+ : AppBar(
+ leading: AppBarBackButton(
+ onPressed: () async {
+ Navigator.of(context).popUntil(
+ ModalRoute.withName(
+ NewWalletRecoveryPhraseView.routeName,
+ ),
+ );
+ },
+ ),
+ ),
+ body: SizedBox(
+ width: isDesktop ? 410 : null,
child: Padding(
- padding: const EdgeInsets.all(16),
+ padding:
+ isDesktop ? const EdgeInsets.all(0) : const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
- const SizedBox(
- height: 4,
+ SizedBox(
+ height: isDesktop ? 24 : 4,
),
Text(
"Verify recovery phrase",
textAlign: TextAlign.center,
- style: STextStyles.label.copyWith(
- fontSize: 12,
- ),
+ style: isDesktop
+ ? STextStyles.desktopH2(context)
+ : STextStyles.label(context).copyWith(
+ fontSize: 12,
+ ),
),
- const SizedBox(
- height: 4,
+ SizedBox(
+ height: isDesktop ? 16 : 4,
),
Text(
- "Tap word number ",
+ isDesktop ? "Select word number" : "Tap word number ",
textAlign: TextAlign.center,
- style: STextStyles.pageTitleH1,
+ style: isDesktop
+ ? STextStyles.desktopSubtitleH1(context)
+ : STextStyles.pageTitleH1(context),
),
- const SizedBox(
- height: 12,
+ SizedBox(
+ height: isDesktop ? 16 : 12,
),
Container(
decoration: BoxDecoration(
- color: CFColors.fieldGray,
+ color: Theme.of(context)
+ .extension()!
+ .textFieldDefaultBG,
borderRadius: BorderRadius.circular(
Constants.size.circularBorderRadius),
),
@@ -184,7 +277,7 @@ class _VerifyRecoveryPhraseViewState
child: Text(
"${correctIndex + 1}",
textAlign: TextAlign.center,
- style: STextStyles.subtitle.copyWith(
+ style: STextStyles.subtitle(context).copyWith(
fontWeight: FontWeight.w600,
fontSize: 32,
letterSpacing: 0.25,
@@ -192,10 +285,19 @@ class _VerifyRecoveryPhraseViewState
),
),
),
+ if (isDesktop)
+ const SizedBox(
+ height: 40,
+ ),
WordTable(
words: randomize(_mnemonic, correctIndex, 9).item1,
+ isDesktop: isDesktop,
),
- const Spacer(),
+ if (!isDesktop) const Spacer(),
+ if (isDesktop)
+ const SizedBox(
+ height: 40,
+ ),
Row(
children: [
Expanded(
@@ -210,92 +312,37 @@ class _VerifyRecoveryPhraseViewState
verifyMnemonicCorrectWordStateProvider.state)
.state;
- return TextButton(
- onPressed: selectedWord.isNotEmpty
- ? () async {
- if (correctWord == selectedWord) {
- await ref
- .read(
- walletsServiceChangeNotifierProvider)
- .setMnemonicVerified(
- walletId: _manager.walletId,
- );
-
- ref
- .read(walletsChangeNotifierProvider
- .notifier)
- .addWallet(
- walletId: _manager.walletId,
- manager: _manager);
-
- if (mounted) {
- Navigator.of(context)
- .pushNamedAndRemoveUntil(
- HomeView.routeName,
- (route) => false);
- }
-
- showFloatingFlushBar(
- type: FlushBarType.success,
- message:
- "Correct! Your wallet is set up.",
- iconAsset: Assets.svg.check,
- context: context,
- );
- } else {
- showFloatingFlushBar(
- type: FlushBarType.warning,
- message: "Incorrect. Please try again.",
- iconAsset: Assets.svg.circleX,
- context: context,
- );
-
- final int next =
- Random().nextInt(_mnemonic.length);
- ref
- .read(
- verifyMnemonicWordIndexStateProvider
- .state)
- .update((state) => next);
-
- ref
- .read(
- verifyMnemonicCorrectWordStateProvider
- .state)
- .update((state) => _mnemonic[next]);
-
- ref
- .read(
- verifyMnemonicSelectedWordStateProvider
- .state)
- .update((state) => "");
+ return ConstrainedBox(
+ constraints: BoxConstraints(
+ minHeight: isDesktop ? 70 : 0,
+ ),
+ child: TextButton(
+ onPressed: selectedWord.isNotEmpty
+ ? () async {
+ await _continue(
+ correctWord == selectedWord);
}
- }
- : null,
- style: selectedWord.isNotEmpty
- ? Theme.of(context)
- .textButtonTheme
- .style
- ?.copyWith(
- backgroundColor:
- MaterialStateProperty.all(
- CFColors.stackAccent,
- ),
+ : null,
+ style: selectedWord.isNotEmpty
+ ? Theme.of(context)
+ .extension()!
+ .getPrimaryEnabledButtonColor(context)
+ : Theme.of(context)
+ .extension()!
+ .getPrimaryDisabledButtonColor(context),
+ child: isDesktop
+ ? Text(
+ "Verify",
+ style: selectedWord.isNotEmpty
+ ? STextStyles.desktopButtonEnabled(
+ context)
+ : STextStyles.desktopButtonDisabled(
+ context),
)
- : Theme.of(context)
- .textButtonTheme
- .style
- ?.copyWith(
- backgroundColor:
- MaterialStateProperty.all(
- CFColors.stackAccent.withOpacity(
- 0.25,
- ),
- ),
+ : Text(
+ "Continue",
+ style: STextStyles.button(context),
),
- child: Text(
- "Continue",
- style: STextStyles.button,
),
);
},
diff --git a/lib/pages/address_book_views/address_book_view.dart b/lib/pages/address_book_views/address_book_view.dart
index 3266d5986..b70ef19ed 100644
--- a/lib/pages/address_book_views/address_book_view.dart
+++ b/lib/pages/address_book_views/address_book_view.dart
@@ -9,10 +9,10 @@ import 'package:stackwallet/providers/global/address_book_service_provider.dart'
import 'package:stackwallet/providers/providers.dart';
import 'package:stackwallet/providers/ui/address_book_providers/address_book_filter_provider.dart';
import 'package:stackwallet/utilities/assets.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
import 'package:stackwallet/widgets/address_book_card.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/icon_widgets/x_icon.dart';
@@ -102,7 +102,7 @@ class _AddressBookViewState extends ConsumerState {
addressBookServiceProvider.select((value) => value.addressBookEntries));
return Scaffold(
- backgroundColor: CFColors.almostWhite,
+ backgroundColor: Theme.of(context).extension()!.background,
appBar: AppBar(
leading: AppBarBackButton(
onPressed: () {
@@ -111,7 +111,7 @@ class _AddressBookViewState extends ConsumerState {
),
title: Text(
"Address book",
- style: STextStyles.navBarTitle,
+ style: STextStyles.navBarTitle(context),
),
actions: [
Padding(
@@ -126,10 +126,12 @@ class _AddressBookViewState extends ConsumerState {
key: const Key("addressBookFilterViewButton"),
size: 36,
shadows: const [],
- color: CFColors.almostWhite,
+ color: Theme.of(context).extension()!.background,
icon: SvgPicture.asset(
Assets.svg.filter,
- color: CFColors.stackAccent,
+ color: Theme.of(context)
+ .extension()!
+ .accentColorDark,
width: 20,
height: 20,
),
@@ -153,10 +155,12 @@ class _AddressBookViewState extends ConsumerState {
key: const Key("addressBookAddNewContactViewButton"),
size: 36,
shadows: const [],
- color: CFColors.almostWhite,
+ color: Theme.of(context).extension()!.background,
icon: SvgPicture.asset(
Assets.svg.plus,
- color: CFColors.stackAccent,
+ color: Theme.of(context)
+ .extension()!
+ .accentColorDark,
width: 20,
height: 20,
),
@@ -201,10 +205,11 @@ class _AddressBookViewState extends ConsumerState {
_searchTerm = value;
});
},
- style: STextStyles.field,
+ style: STextStyles.field(context),
decoration: standardInputDecoration(
"Search",
_searchFocusNode,
+ context,
).copyWith(
prefixIcon: Padding(
padding: const EdgeInsets.symmetric(
@@ -244,7 +249,7 @@ class _AddressBookViewState extends ConsumerState {
),
Text(
"Favorites",
- style: STextStyles.smallMed12,
+ style: STextStyles.smallMed12(context),
),
const SizedBox(
height: 12,
@@ -297,7 +302,7 @@ class _AddressBookViewState extends ConsumerState {
child: Center(
child: Text(
"Your favorite contacts will appear here",
- style: STextStyles.itemSubtitle,
+ style: STextStyles.itemSubtitle(context),
),
),
);
@@ -310,7 +315,7 @@ class _AddressBookViewState extends ConsumerState {
),
Text(
"All contacts",
- style: STextStyles.smallMed12,
+ style: STextStyles.smallMed12(context),
),
const SizedBox(
height: 12,
@@ -360,7 +365,7 @@ class _AddressBookViewState extends ConsumerState {
child: Center(
child: Text(
"Your contacts will appear here",
- style: STextStyles.itemSubtitle,
+ style: STextStyles.itemSubtitle(context),
),
),
);
diff --git a/lib/pages/address_book_views/subviews/add_address_book_entry_view.dart b/lib/pages/address_book_views/subviews/add_address_book_entry_view.dart
index 9d0eede18..a28997e0f 100644
--- a/lib/pages/address_book_views/subviews/add_address_book_entry_view.dart
+++ b/lib/pages/address_book_views/subviews/add_address_book_entry_view.dart
@@ -11,10 +11,10 @@ import 'package:stackwallet/providers/ui/address_book_providers/contact_name_is_
import 'package:stackwallet/providers/ui/address_book_providers/valid_contact_state_provider.dart';
import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/barcode_scanner_interface.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/clipboard_interface.dart';
import 'package:stackwallet/utilities/constants.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/emoji_select_sheet.dart';
import 'package:stackwallet/widgets/icon_widgets/x_icon.dart';
@@ -93,7 +93,7 @@ class _AddAddressBookEntryViewState
debugPrint("BUILD: $runtimeType");
return Scaffold(
- backgroundColor: CFColors.almostWhite,
+ backgroundColor: Theme.of(context).extension()!.background,
appBar: AppBar(
leading: AppBarBackButton(
onPressed: () async {
@@ -108,7 +108,7 @@ class _AddAddressBookEntryViewState
),
title: Text(
"New contact",
- style: STextStyles.navBarTitle,
+ style: STextStyles.navBarTitle(context),
),
actions: [
Padding(
@@ -123,10 +123,16 @@ class _AddAddressBookEntryViewState
key: const Key("addAddressBookEntryFavoriteButtonKey"),
size: 36,
shadows: const [],
- color: CFColors.almostWhite,
+ color: Theme.of(context).extension()!.background,
icon: SvgPicture.asset(
Assets.svg.star,
- color: _isFavorite ? CFColors.link2 : CFColors.buttonGray,
+ color: _isFavorite
+ ? Theme.of(context)
+ .extension()!
+ .favoriteStarActive
+ : Theme.of(context)
+ .extension()!
+ .favoriteStarInactive,
width: 20,
height: 20,
),
@@ -198,7 +204,9 @@ class _AddAddressBookEntryViewState
width: 48,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(24),
- color: CFColors.textFieldActive,
+ color: Theme.of(context)
+ .extension()!
+ .textFieldActiveBG,
),
child: Center(
child: _selectedEmoji == null
@@ -209,7 +217,8 @@ class _AddAddressBookEntryViewState
)
: Text(
_selectedEmoji!.char,
- style: STextStyles.pageTitleH1,
+ style:
+ STextStyles.pageTitleH1(context),
),
),
),
@@ -219,20 +228,25 @@ class _AddAddressBookEntryViewState
height: 14,
width: 14,
decoration: BoxDecoration(
- borderRadius: BorderRadius.circular(14),
- color: CFColors.stackAccent,
- ),
+ borderRadius: BorderRadius.circular(14),
+ color: Theme.of(context)
+ .extension()!
+ .accentColorDark),
child: Center(
child: _selectedEmoji == null
? SvgPicture.asset(
Assets.svg.plus,
- color: CFColors.white,
+ color: Theme.of(context)
+ .extension()!
+ .textWhite,
width: 12,
height: 12,
)
: SvgPicture.asset(
Assets.svg.thickX,
- color: CFColors.white,
+ color: Theme.of(context)
+ .extension()!
+ .textWhite,
width: 8,
height: 8,
),
@@ -253,10 +267,11 @@ class _AddAddressBookEntryViewState
child: TextField(
controller: nameController,
focusNode: nameFocusNode,
- style: STextStyles.field,
+ style: STextStyles.field(context),
decoration: standardInputDecoration(
"Enter contact name",
nameFocusNode,
+ context,
).copyWith(
suffixIcon: ref
.read(contactNameIsNotEmptyStateProvider
@@ -303,7 +318,7 @@ class _AddAddressBookEntryViewState
),
Text(
"Address ${i + 1}",
- style: STextStyles.smallMed12,
+ style: STextStyles.smallMed12(context),
),
const SizedBox(
height: 8,
@@ -325,7 +340,7 @@ class _AddAddressBookEntryViewState
},
child: Text(
"+ Add another address",
- style: STextStyles.largeMedium14,
+ style: STextStyles.largeMedium14(context),
),
),
const SizedBox(
@@ -336,17 +351,15 @@ class _AddAddressBookEntryViewState
children: [
Expanded(
child: TextButton(
- style: ButtonStyle(
- backgroundColor:
- MaterialStateProperty.all(
- CFColors.buttonGray,
- ),
- ),
+ style: Theme.of(context)
+ .extension()!
+ .getSecondaryEnabledButtonColor(context),
child: Text(
"Cancel",
- style: STextStyles.button.copyWith(
- color: CFColors.stackAccent,
- ),
+ style: STextStyles.button(context).copyWith(
+ color: Theme.of(context)
+ .extension()!
+ .accentColorDark),
),
onPressed: () async {
if (FocusScope.of(context).hasFocus) {
@@ -380,13 +393,14 @@ class _AddAddressBookEntryViewState
validForms && nameExists;
return TextButton(
- style: ButtonStyle(
- backgroundColor:
- MaterialStateProperty.all(
- shouldEnableSave
- ? CFColors.stackAccent
- : CFColors.disabledButton,
- )),
+ style: shouldEnableSave
+ ? Theme.of(context)
+ .extension()!
+ .getPrimaryEnabledButtonColor(context)
+ : Theme.of(context)
+ .extension()!
+ .getPrimaryDisabledButtonColor(
+ context),
onPressed: shouldEnableSave
? () async {
if (FocusScope.of(context).hasFocus) {
@@ -424,7 +438,7 @@ class _AddAddressBookEntryViewState
: null,
child: Text(
"Save",
- style: STextStyles.button,
+ style: STextStyles.button(context),
),
);
},
diff --git a/lib/pages/address_book_views/subviews/add_new_contact_address_view.dart b/lib/pages/address_book_views/subviews/add_new_contact_address_view.dart
index 50d03aef7..e5dbaa7b9 100644
--- a/lib/pages/address_book_views/subviews/add_new_contact_address_view.dart
+++ b/lib/pages/address_book_views/subviews/add_new_contact_address_view.dart
@@ -9,9 +9,9 @@ import 'package:stackwallet/providers/ui/address_book_providers/address_entry_da
import 'package:stackwallet/providers/ui/address_book_providers/valid_contact_state_provider.dart';
import 'package:stackwallet/utilities/assets.dart';
import 'package:stackwallet/utilities/barcode_scanner_interface.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/clipboard_interface.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
class AddNewContactAddressView extends ConsumerStatefulWidget {
@@ -56,7 +56,7 @@ class _AddNewContactAddressViewState
.select((value) => value.getContactById(contactId)));
return Scaffold(
- backgroundColor: CFColors.almostWhite,
+ backgroundColor: Theme.of(context).extension()!.background,
appBar: AppBar(
leading: AppBarBackButton(
onPressed: () async {
@@ -71,7 +71,7 @@ class _AddNewContactAddressViewState
),
title: Text(
"Add new address",
- style: STextStyles.navBarTitle,
+ style: STextStyles.navBarTitle(context),
),
),
body: LayoutBuilder(
@@ -99,7 +99,9 @@ class _AddNewContactAddressViewState
width: 48,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(24),
- color: CFColors.textFieldActive,
+ color: Theme.of(context)
+ .extension()!
+ .textFieldActiveBG,
),
child: Center(
child: contact.emojiChar == null
@@ -110,7 +112,7 @@ class _AddNewContactAddressViewState
)
: Text(
contact.emojiChar!,
- style: STextStyles.pageTitleH1,
+ style: STextStyles.pageTitleH1(context),
),
),
),
@@ -122,7 +124,7 @@ class _AddNewContactAddressViewState
fit: BoxFit.scaleDown,
child: Text(
contact.name,
- style: STextStyles.pageTitleH2,
+ style: STextStyles.pageTitleH2(context),
),
),
),
@@ -144,17 +146,15 @@ class _AddNewContactAddressViewState
children: [
Expanded(
child: TextButton(
- style: ButtonStyle(
- backgroundColor:
- MaterialStateProperty.all(
- CFColors.buttonGray,
- ),
- ),
+ style: Theme.of(context)
+ .extension()!
+ .getSecondaryEnabledButtonColor(context),
child: Text(
"Cancel",
- style: STextStyles.button.copyWith(
- color: CFColors.stackAccent,
- ),
+ style: STextStyles.button(context).copyWith(
+ color: Theme.of(context)
+ .extension()!
+ .accentColorDark),
),
onPressed: () async {
if (FocusScope.of(context).hasFocus) {
@@ -178,14 +178,15 @@ class _AddNewContactAddressViewState
ref.watch(validContactStateProvider([0]));
return TextButton(
- style: ButtonStyle(
- backgroundColor:
- MaterialStateProperty.all(
- shouldEnableSave
- ? CFColors.stackAccent
- : CFColors.disabledButton,
- ),
- ),
+ style: shouldEnableSave
+ ? Theme.of(context)
+ .extension()!
+ .getPrimaryEnabledButtonColor(
+ context)
+ : Theme.of(context)
+ .extension()!
+ .getPrimaryDisabledButtonColor(
+ context),
onPressed: shouldEnableSave
? () async {
if (FocusScope.of(context)
@@ -222,7 +223,7 @@ class _AddNewContactAddressViewState
: null,
child: Text(
"Save",
- style: STextStyles.button,
+ style: STextStyles.button(context),
),
);
},
diff --git a/lib/pages/address_book_views/subviews/address_book_filter_view.dart b/lib/pages/address_book_views/subviews/address_book_filter_view.dart
index e990919de..35968621a 100644
--- a/lib/pages/address_book_views/subviews/address_book_filter_view.dart
+++ b/lib/pages/address_book_views/subviews/address_book_filter_view.dart
@@ -2,9 +2,9 @@ import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:stackwallet/providers/global/prefs_provider.dart';
import 'package:stackwallet/providers/ui/address_book_providers/address_book_filter_provider.dart';
-import 'package:stackwallet/utilities/cfcolors.dart';
import 'package:stackwallet/utilities/enums/coin_enum.dart';
import 'package:stackwallet/utilities/text_styles.dart';
+import 'package:stackwallet/utilities/theme/stack_colors.dart';
import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart';
import 'package:stackwallet/widgets/rounded_white_container.dart';
@@ -42,9 +42,9 @@ class _AddressBookFilterViewState extends ConsumerState {
@override
Widget build(BuildContext context) {
return Scaffold(
- backgroundColor: CFColors.almostWhite,
+ backgroundColor: Theme.of(context).extension()!.background,
appBar: AppBar(
- backgroundColor: CFColors.almostWhite,
+ backgroundColor: Theme.of(context).extension