Modify Themes Startup Behaviour (#2288)

* feat(themes): Reflect current system theme at the start of the app if the themeMode is system mode

* feat(themes): Extract platform awareness for router into a function, and use where needed
This commit is contained in:
David Adegoke 2025-05-26 02:43:15 +01:00 committed by GitHub
parent df88914628
commit d342173239
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 212 additions and 282 deletions

View file

@ -150,84 +150,78 @@ import 'src/screens/dashboard/pages/nft_import_page.dart';
late RouteSettings currentRouteSettings; late RouteSettings currentRouteSettings;
Route<dynamic> handleRouteWithPlatformAwareness(
Widget Function(BuildContext) builder, {
bool fullscreenDialog = false,
}) {
if (Platform.isIOS) {
return CupertinoPageRoute<void>(builder: builder, fullscreenDialog: fullscreenDialog);
} else {
return MaterialPageRoute<void>(builder: builder, fullscreenDialog: fullscreenDialog);
}
}
Route<dynamic> createRoute(RouteSettings settings) { Route<dynamic> createRoute(RouteSettings settings) {
currentRouteSettings = settings; currentRouteSettings = settings;
switch (settings.name) { switch (settings.name) {
case Routes.welcome: case Routes.welcome:
return MaterialPageRoute<void>( return MaterialPageRoute<void>(
builder: (_) => CreatePinWelcomePage(SettingsStoreBase.walletPasswordDirectInput)); builder: (_) => CreatePinWelcomePage(
SettingsStoreBase.walletPasswordDirectInput,
),
);
case Routes.welcomeWallet: case Routes.welcomeWallet:
if (SettingsStoreBase.walletPasswordDirectInput) { if (SettingsStoreBase.walletPasswordDirectInput) {
return createRoute(RouteSettings(name: Routes.welcomePage)); return createRoute(RouteSettings(name: Routes.welcomePage));
} }
if (Platform.isIOS) return CupertinoPageRoute<void>( return handleRouteWithPlatformAwareness(
builder: (_) => (_) => getIt.get<SetupPinCodePage>(
getIt.get<SetupPinCodePage>(param1: (PinCodeState<PinCodeWidget> context, dynamic _) { param1: (PinCodeState<PinCodeWidget> context, dynamic _) {
Navigator.of(context.context).pushNamed(Routes.welcomePage); Navigator.of(context.context).pushNamed(Routes.welcomePage);
}), },
fullscreenDialog: true); ),
else return MaterialPageRoute<void>( fullscreenDialog: true,
builder: (_) => );
getIt.get<SetupPinCodePage>(param1: (PinCodeState<PinCodeWidget> context, dynamic _) {
Navigator.of(context.context).pushNamed(Routes.welcomePage);
}),
fullscreenDialog: true);
case Routes.welcomePage: case Routes.welcomePage:
return CupertinoPageRoute<void>(builder: (_) => getIt.get<WelcomePage>()); return CupertinoPageRoute<void>(builder: (_) => getIt.get<WelcomePage>());
case Routes.newWalletFromWelcome: case Routes.newWalletFromWelcome:
if (isSingleCoin) { if (isSingleCoin) {
return createRoute( return createRoute(
RouteSettings( RouteSettings(
name: Routes.newWallet, name: Routes.newWallet,
arguments: NewWalletArguments(type: availableWalletTypes.first) arguments: NewWalletArguments(type: availableWalletTypes.first)),
),
);
}
return createRoute(RouteSettings(name: Routes.newWalletType));
case Routes.newWalletType:
if (Platform.isIOS) {
return CupertinoPageRoute<void>(
builder: (_) => getIt.get<NewWalletTypePage>(
param1: NewWalletTypeArguments(
onTypeSelected: (BuildContext context, WalletType type) =>
Navigator.of(context).pushNamed(
Routes.newWallet,
arguments: NewWalletArguments(type: type),
),
isCreate: true,
isHardwareWallet: false,
),
),
);
} else {
return MaterialPageRoute<void>(
builder: (_) => getIt.get<NewWalletTypePage>(
param1: NewWalletTypeArguments(
onTypeSelected: (BuildContext context, WalletType type) =>
Navigator.of(context).pushNamed(
Routes.newWallet,
arguments: NewWalletArguments(type: type),
),
isCreate: true,
isHardwareWallet: false,
),
),
); );
} }
return createRoute(RouteSettings(name: Routes.newWalletType));
case Routes.newWalletType:
return handleRouteWithPlatformAwareness(
(_) => getIt.get<NewWalletTypePage>(
param1: NewWalletTypeArguments(
onTypeSelected: (BuildContext context, WalletType type) =>
Navigator.of(context).pushNamed(
Routes.newWallet,
arguments: NewWalletArguments(type: type),
),
isCreate: true,
isHardwareWallet: false,
),
),
);
case Routes.walletGroupsDisplayPage: case Routes.walletGroupsDisplayPage:
final type = settings.arguments as WalletType; final type = settings.arguments as WalletType;
final walletGroupsDisplayVM = getIt.get<WalletGroupsDisplayViewModel>(param1: type); final walletGroupsDisplayVM = getIt.get<WalletGroupsDisplayViewModel>(param1: type);
if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (_) => WalletGroupsDisplayPage(walletGroupsDisplayVM)); return handleRouteWithPlatformAwareness(
else return MaterialPageRoute<void>(builder: (_) => WalletGroupsDisplayPage(walletGroupsDisplayVM)); (_) => WalletGroupsDisplayPage(
walletGroupsDisplayVM,
),
);
case Routes.newWallet: case Routes.newWallet:
final args = settings.arguments as NewWalletArguments; final args = settings.arguments as NewWalletArguments;
@ -235,15 +229,8 @@ Route<dynamic> createRoute(RouteSettings settings) {
final walletNewVM = getIt.get<WalletNewVM>(param1: args); final walletNewVM = getIt.get<WalletNewVM>(param1: args);
final seedSettingsViewModel = getIt.get<SeedSettingsViewModel>(); final seedSettingsViewModel = getIt.get<SeedSettingsViewModel>();
if (Platform.isIOS) return CupertinoPageRoute<void>( return handleRouteWithPlatformAwareness(
builder: (_) => NewWalletPage( (_) => NewWalletPage(
walletNewVM,
seedSettingsViewModel,
isChildWallet: args.isChildWallet,
),
);
else return MaterialPageRoute<void>(
builder: (_) => NewWalletPage(
walletNewVM, walletNewVM,
seedSettingsViewModel, seedSettingsViewModel,
isChildWallet: args.isChildWallet, isChildWallet: args.isChildWallet,
@ -267,27 +254,18 @@ Route<dynamic> createRoute(RouteSettings settings) {
callback = settings.arguments as Function(PinCodeState<PinCodeWidget>, String); callback = settings.arguments as Function(PinCodeState<PinCodeWidget>, String);
} }
if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (_) => getIt.get<SetupPinCodePage>(param1: callback)); return handleRouteWithPlatformAwareness(
else return MaterialPageRoute<void>(builder: (_) => getIt.get<SetupPinCodePage>(param1: callback)); (_) => getIt.get<SetupPinCodePage>(param1: callback),
);
case Routes.restoreWalletType: case Routes.restoreWalletType:
if (Platform.isIOS) return CupertinoPageRoute<void>( return handleRouteWithPlatformAwareness(
builder: (_) => getIt.get<NewWalletTypePage>( (_) => getIt.get<NewWalletTypePage>(
param1: NewWalletTypeArguments( param1: NewWalletTypeArguments(
onTypeSelected: (BuildContext context, WalletType type) { onTypeSelected: (BuildContext context, WalletType type) {
final arg = {'walletType': type}; final arg = {'walletType': type};
Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: arg);}, Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: arg);
isCreate: false, },
isHardwareWallet: false,
),
),
);
else return MaterialPageRoute<void>(
builder: (_) => getIt.get<NewWalletTypePage>(
param1: NewWalletTypeArguments(
onTypeSelected: (BuildContext context, WalletType type) {
final arg = {'walletType': type};
Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: arg);},
isCreate: false, isCreate: false,
isHardwareWallet: false, isHardwareWallet: false,
), ),
@ -300,45 +278,28 @@ Route<dynamic> createRoute(RouteSettings settings) {
} }
final isNewInstall = settings.arguments as bool; final isNewInstall = settings.arguments as bool;
if (Platform.isIOS) { return handleRouteWithPlatformAwareness(
return CupertinoPageRoute<void>(builder: (context) => getIt.get<RestoreOptionsPage>(param1: isNewInstall)); (context) => getIt.get<RestoreOptionsPage>(param1: isNewInstall),
} else { );
return MaterialPageRoute<void>(builder: (context) => getIt.get<RestoreOptionsPage>(param1: isNewInstall));
}
case Routes.restoreWalletFromSeedKeys: case Routes.restoreWalletFromSeedKeys:
if (isSingleCoin) { if (isSingleCoin) {
if (Platform.isIOS) { return handleRouteWithPlatformAwareness(
return CupertinoPageRoute<void>(builder: (context) => getIt.get<WalletRestorePage>(param1: availableWalletTypes.first)); (context) => getIt.get<WalletRestorePage>(param1: availableWalletTypes.first),
} else {
return MaterialPageRoute<void>(builder: (context) => getIt.get<WalletRestorePage>(param1: availableWalletTypes.first));
}
}
if (Platform.isIOS) {
return CupertinoPageRoute<void>(
builder: (_) => getIt.get<NewWalletTypePage>(
param1: NewWalletTypeArguments(
onTypeSelected: (BuildContext context, WalletType type) {
final arg = {'walletType': type};
Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: arg);},
isCreate: false,
isHardwareWallet: false,
),
),
);
} else {
return MaterialPageRoute<void>(
builder: (_) => getIt.get<NewWalletTypePage>(
param1: NewWalletTypeArguments(
onTypeSelected: (BuildContext context, WalletType type) {
final arg = {'walletType': type};
Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: arg);},
isCreate: false,
isHardwareWallet: false,
),
),
); );
} }
return handleRouteWithPlatformAwareness(
(context) => getIt.get<NewWalletTypePage>(
param1: NewWalletTypeArguments(
onTypeSelected: (BuildContext context, WalletType type) {
final arg = {'walletType': type};
Navigator.of(context).pushNamed(Routes.restoreWallet, arguments: arg);
},
isCreate: false,
isHardwareWallet: false,
),
),
);
case Routes.restoreWalletFromHardwareWallet: case Routes.restoreWalletFromHardwareWallet:
if (isSingleCoin) { if (isSingleCoin) {
@ -346,10 +307,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
builder: (_) => ConnectDevicePage( builder: (_) => ConnectDevicePage(
ConnectDevicePageParams( ConnectDevicePageParams(
walletType: availableWalletTypes.first, walletType: availableWalletTypes.first,
onConnectDevice: (BuildContext context, _) => onConnectDevice: (BuildContext context, _) => Navigator.of(context).pushNamed(
Navigator.of(context).pushNamed( Routes.chooseHardwareWalletAccount,
Routes.chooseHardwareWalletAccount, arguments: [availableWalletTypes.first]),
arguments: [availableWalletTypes.first]),
isReconnect: false, isReconnect: false,
), ),
getIt.get<LedgerViewModel>(), getIt.get<LedgerViewModel>(),
@ -362,15 +322,12 @@ Route<dynamic> createRoute(RouteSettings settings) {
onTypeSelected: (BuildContext context, WalletType type) { onTypeSelected: (BuildContext context, WalletType type) {
final arguments = ConnectDevicePageParams( final arguments = ConnectDevicePageParams(
walletType: type, walletType: type,
onConnectDevice: (BuildContext context, _) => onConnectDevice: (BuildContext context, _) => Navigator.of(context)
Navigator.of(context).pushNamed( .pushNamed(Routes.chooseHardwareWalletAccount, arguments: [type]),
Routes.chooseHardwareWalletAccount,
arguments: [type]),
isReconnect: false, isReconnect: false,
); );
Navigator.of(context) Navigator.of(context).pushNamed(Routes.connectDevices, arguments: arguments);
.pushNamed(Routes.connectDevices, arguments: arguments);
}, },
isCreate: false, isCreate: false,
isHardwareWallet: true, isHardwareWallet: true,
@ -391,11 +348,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
); );
case Routes.seed: case Routes.seed:
if (Platform.isIOS) { return handleRouteWithPlatformAwareness(
return CupertinoPageRoute<void>(builder: (context) => getIt.get<WalletSeedPage>(param1: settings.arguments as bool)); (context) => getIt.get<WalletSeedPage>(param1: settings.arguments as bool),
} else { );
return MaterialPageRoute<void>(builder: (context) => getIt.get<WalletSeedPage>(param1: settings.arguments as bool));
}
case Routes.restoreWallet: case Routes.restoreWallet:
final args = settings.arguments as Map<String, dynamic>?; final args = settings.arguments as Map<String, dynamic>?;
@ -421,29 +376,24 @@ Route<dynamic> createRoute(RouteSettings settings) {
final initialPaymentRequest = args?['paymentRequest'] as PaymentRequest?; final initialPaymentRequest = args?['paymentRequest'] as PaymentRequest?;
final coinTypeToSpendFrom = args?['coinTypeToSpendFrom'] as UnspentCoinType?; final coinTypeToSpendFrom = args?['coinTypeToSpendFrom'] as UnspentCoinType?;
if (Platform.isIOS) { return handleRouteWithPlatformAwareness(
return CupertinoPageRoute<void>(builder: (context) => getIt.get<SendPage>( (context) => getIt.get<SendPage>(
param1: initialPaymentRequest, param1: initialPaymentRequest,
param2: coinTypeToSpendFrom, param2: coinTypeToSpendFrom,
)); ),
} else { );
return MaterialPageRoute<void>(builder: (context) => getIt.get<SendPage>(
param1: initialPaymentRequest,
param2: coinTypeToSpendFrom,
));
}
case Routes.sendTemplate: case Routes.sendTemplate:
return CupertinoPageRoute<void>( return CupertinoPageRoute<void>(
fullscreenDialog: true, builder: (_) => getIt.get<SendTemplatePage>()); fullscreenDialog: true, builder: (_) => getIt.get<SendTemplatePage>());
case Routes.receive: case Routes.receive:
return CupertinoPageRoute<void>(builder: (context) => getIt.get<ReceivePage>()); return CupertinoPageRoute<void>(builder: (context) => getIt.get<ReceivePage>());
case Routes.addressPage: case Routes.addressPage:
if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (context) => getIt.get<AddressPage>()); return handleRouteWithPlatformAwareness(
else return MaterialPageRoute<void>(builder: (context) => getIt.get<AddressPage>()); (context) => getIt.get<AddressPage>(),
);
case Routes.transactionDetails: case Routes.transactionDetails:
return CupertinoPageRoute<void>( return CupertinoPageRoute<void>(
@ -529,41 +479,39 @@ Route<dynamic> createRoute(RouteSettings settings) {
onWillPop: () async => false)); onWillPop: () async => false));
case Routes.silentPaymentsSettings: case Routes.silentPaymentsSettings:
if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (context) => getIt.get<SilentPaymentsSettingsPage>()); return handleRouteWithPlatformAwareness(
else return MaterialPageRoute<void>(builder: (context) => getIt.get<SilentPaymentsSettingsPage>()); (context) => getIt.get<SilentPaymentsSettingsPage>(),
);
case Routes.mwebSettings: case Routes.mwebSettings:
if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (context) => getIt.get<MwebSettingsPage>()); return handleRouteWithPlatformAwareness(
else return MaterialPageRoute<void>(builder: (context) => getIt.get<MwebSettingsPage>()); (context) => getIt.get<MwebSettingsPage>(),
);
case Routes.mwebLogs: case Routes.mwebLogs:
if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (context) => getIt.get<MwebLogsPage>()); return handleRouteWithPlatformAwareness(
else return MaterialPageRoute<void>(builder: (context) => getIt.get<MwebLogsPage>()); (context) => getIt.get<MwebLogsPage>(),
);
case Routes.mwebNode: case Routes.mwebNode:
if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (context) => getIt.get<MwebNodePage>()); return handleRouteWithPlatformAwareness(
else return MaterialPageRoute<void>(builder: (context) => getIt.get<MwebNodePage>()); (context) => getIt.get<MwebNodePage>(),
);
case Routes.connectionSync: case Routes.connectionSync:
if (Platform.isIOS) { return handleRouteWithPlatformAwareness(
return CupertinoPageRoute<void>(builder: (context) => getIt.get<ConnectionSyncPage>()); (context) => getIt.get<ConnectionSyncPage>(),
} else { );
return MaterialPageRoute<void>(builder: (context) => getIt.get<ConnectionSyncPage>());
}
case Routes.securityBackupPage: case Routes.securityBackupPage:
if (Platform.isIOS) { return handleRouteWithPlatformAwareness(
return CupertinoPageRoute<void>(builder: (context) => getIt.get<SecurityBackupPage>()); (context) => getIt.get<SecurityBackupPage>(),
} else { );
return MaterialPageRoute<void>(builder: (context) => getIt.get<SecurityBackupPage>());
}
case Routes.privacyPage: case Routes.privacyPage:
if (Platform.isIOS) { return handleRouteWithPlatformAwareness(
return CupertinoPageRoute<void>(builder: (context) => getIt.get<PrivacyPage>()); (context) => getIt.get<PrivacyPage>(),
} else { );
return MaterialPageRoute<void>(builder: (context) => getIt.get<PrivacyPage>());
}
case Routes.trocadorProvidersPage: case Routes.trocadorProvidersPage:
return CupertinoPageRoute<void>( return CupertinoPageRoute<void>(
@ -574,18 +522,14 @@ Route<dynamic> createRoute(RouteSettings settings) {
fullscreenDialog: true, builder: (_) => getIt.get<DomainLookupsPage>()); fullscreenDialog: true, builder: (_) => getIt.get<DomainLookupsPage>());
case Routes.displaySettingsPage: case Routes.displaySettingsPage:
if (Platform.isIOS) { return handleRouteWithPlatformAwareness(
return CupertinoPageRoute<void>(builder: (context) => getIt.get<DisplaySettingsPage>()); (context) => getIt.get<DisplaySettingsPage>(),
} else { );
return MaterialPageRoute<void>(builder: (context) => getIt.get<DisplaySettingsPage>());
}
case Routes.otherSettingsPage: case Routes.otherSettingsPage:
if (Platform.isIOS) { return handleRouteWithPlatformAwareness(
return CupertinoPageRoute<void>(builder: (context) => getIt.get<OtherSettingsPage>()); (context) => getIt.get<OtherSettingsPage>(),
} else { );
return MaterialPageRoute<void>(builder: (context) => getIt.get<OtherSettingsPage>());
}
case Routes.newNode: case Routes.newNode:
final args = settings.arguments as Map<String, dynamic>?; final args = settings.arguments as Map<String, dynamic>?;
@ -622,12 +566,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
getIt.get<NanoAccountEditOrCreatePage>(param1: settings.arguments as NanoAccount?)); getIt.get<NanoAccountEditOrCreatePage>(param1: settings.arguments as NanoAccount?));
case Routes.addressBook: case Routes.addressBook:
if (Platform.isIOS) { return handleRouteWithPlatformAwareness(
return CupertinoPageRoute<void>(builder: (context) => getIt.get<ContactListPage>()); (context) => getIt.get<ContactListPage>(),
} else { );
return MaterialPageRoute<void>(builder: (context) => getIt.get<ContactListPage>());
}
case Routes.pickerAddressBook: case Routes.pickerAddressBook:
final selectedCurrency = settings.arguments as CryptoCurrency?; final selectedCurrency = settings.arguments as CryptoCurrency?;
@ -638,19 +579,14 @@ Route<dynamic> createRoute(RouteSettings settings) {
return MaterialPageRoute<void>(builder: (_) => getIt.get<AddressListPage>()); return MaterialPageRoute<void>(builder: (_) => getIt.get<AddressListPage>());
case Routes.addressBookAddContact: case Routes.addressBookAddContact:
if (Platform.isIOS) { return handleRouteWithPlatformAwareness(
return CupertinoPageRoute<void>(builder: (context) => getIt.get<ContactPage>(param1: settings.arguments as ContactRecord?)); (context) => getIt.get<ContactPage>(param1: settings.arguments as ContactRecord?),
} else { );
return MaterialPageRoute<void>(builder: (context) => getIt.get<ContactPage>(param1: settings.arguments as ContactRecord?));
}
case Routes.showKeys: case Routes.showKeys:
if (Platform.isIOS) { return handleRouteWithPlatformAwareness(
return CupertinoPageRoute<void>(builder: (context) => getIt.get<WalletKeysPage>()); (context) => getIt.get<WalletKeysPage>(),
} else { );
return MaterialPageRoute<void>(builder: (context) => getIt.get<WalletKeysPage>());
}
case Routes.exchangeTrade: case Routes.exchangeTrade:
return CupertinoPageRoute<void>(builder: (_) => getIt.get<ExchangeTradePage>()); return CupertinoPageRoute<void>(builder: (_) => getIt.get<ExchangeTradePage>());
@ -669,11 +605,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.buySellPage: case Routes.buySellPage:
final args = settings.arguments as bool; final args = settings.arguments as bool;
if (Platform.isIOS) { return handleRouteWithPlatformAwareness(
return CupertinoPageRoute<void>(builder: (context) => getIt.get<BuySellPage>(param1: args)); (context) => getIt.get<BuySellPage>(param1: args),
} else { );
return MaterialPageRoute<void>(builder: (context) => getIt.get<BuySellPage>(param1: args));
}
case Routes.buyOptionsPage: case Routes.buyOptionsPage:
final args = settings.arguments as List; final args = settings.arguments as List;
@ -681,7 +615,8 @@ Route<dynamic> createRoute(RouteSettings settings) {
case Routes.paymentMethodOptionsPage: case Routes.paymentMethodOptionsPage:
final args = settings.arguments as List; final args = settings.arguments as List;
return MaterialPageRoute<void>(builder: (_) => getIt.get<PaymentMethodOptionsPage>(param1: args)); return MaterialPageRoute<void>(
builder: (_) => getIt.get<PaymentMethodOptionsPage>(param1: args));
case Routes.buyWebView: case Routes.buyWebView:
final args = settings.arguments as List; final args = settings.arguments as List;
@ -690,12 +625,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
fullscreenDialog: true, builder: (_) => getIt.get<BuyWebViewPage>(param1: args)); fullscreenDialog: true, builder: (_) => getIt.get<BuyWebViewPage>(param1: args));
case Routes.exchange: case Routes.exchange:
if (Platform.isIOS) { return handleRouteWithPlatformAwareness(
return CupertinoPageRoute<void>(builder: (context) => getIt.get<ExchangePage>(param1: settings.arguments as PaymentRequest?)); (context) => getIt.get<ExchangePage>(param1: settings.arguments as PaymentRequest?),
} else { );
return MaterialPageRoute<void>(builder: (context) => getIt.get<ExchangePage>(param1: settings.arguments as PaymentRequest?));
}
case Routes.exchangeTemplate: case Routes.exchangeTemplate:
return CupertinoPageRoute<void>(builder: (_) => getIt.get<ExchangeTemplatePage>()); return CupertinoPageRoute<void>(builder: (_) => getIt.get<ExchangeTemplatePage>());
@ -717,11 +649,9 @@ Route<dynamic> createRoute(RouteSettings settings) {
builder: (_) => getIt.get<TransactionSuccessPage>(param1: settings.arguments as String)); builder: (_) => getIt.get<TransactionSuccessPage>(param1: settings.arguments as String));
case Routes.backup: case Routes.backup:
if (Platform.isIOS) { return handleRouteWithPlatformAwareness(
return CupertinoPageRoute<void>(builder: (context) => getIt.get<BackupPage>()); (context) => getIt.get<BackupPage>(),
} else { );
return MaterialPageRoute<void>(builder: (context) => getIt.get<BackupPage>());
}
case Routes.editBackupPassword: case Routes.editBackupPassword:
return CupertinoPageRoute<void>(builder: (_) => getIt.get<EditBackupPasswordPage>()); return CupertinoPageRoute<void>(builder: (_) => getIt.get<EditBackupPasswordPage>());
@ -731,26 +661,23 @@ Route<dynamic> createRoute(RouteSettings settings) {
fullscreenDialog: true, builder: (_) => getIt.get<RestoreFromBackupPage>()); fullscreenDialog: true, builder: (_) => getIt.get<RestoreFromBackupPage>());
case Routes.support: case Routes.support:
if (Platform.isIOS) { return handleRouteWithPlatformAwareness(
return CupertinoPageRoute<void>(builder: (context) => getIt.get<SupportPage>()); (context) => getIt.get<SupportPage>(),
} else { );
return MaterialPageRoute<void>(builder: (context) => getIt.get<SupportPage>());
}
case Routes.supportLiveChat: case Routes.supportLiveChat:
return CupertinoPageRoute<void>(builder: (_) => getIt.get<SupportChatPage>()); return CupertinoPageRoute<void>(builder: (_) => getIt.get<SupportChatPage>());
case Routes.supportOtherLinks: case Routes.supportOtherLinks:
if (Platform.isIOS) { return handleRouteWithPlatformAwareness(
return CupertinoPageRoute<void>(builder: (context) => getIt.get<SupportOtherLinksPage>()); (context) => getIt.get<SupportOtherLinksPage>(),
} else { );
return MaterialPageRoute<void>(builder: (context) => getIt.get<SupportOtherLinksPage>());
}
case Routes.unspentCoinsList: case Routes.unspentCoinsList:
final coinTypeToSpendFrom = settings.arguments as UnspentCoinType?; final coinTypeToSpendFrom = settings.arguments as UnspentCoinType?;
return MaterialPageRoute<void>( return handleRouteWithPlatformAwareness(
builder: (_) => getIt.get<UnspentCoinsListPage>(param1: coinTypeToSpendFrom)); (context) => getIt.get<UnspentCoinsListPage>(param1: coinTypeToSpendFrom),
);
case Routes.unspentCoinsDetails: case Routes.unspentCoinsDetails:
final args = settings.arguments as List; final args = settings.arguments as List;
@ -765,32 +692,37 @@ Route<dynamic> createRoute(RouteSettings settings) {
)); ));
case Routes.cakePayCardsPage: case Routes.cakePayCardsPage:
if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (context) => getIt.get<CakePayCardsPage>()); return handleRouteWithPlatformAwareness(
else return MaterialPageRoute<void>(builder: (context) => getIt.get<CakePayCardsPage>()); (context) => getIt.get<CakePayCardsPage>(),
);
case Routes.cakePayBuyCardPage: case Routes.cakePayBuyCardPage:
final args = settings.arguments as List; final args = settings.arguments as List;
if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (_) => getIt.get<CakePayBuyCardPage>(param1: args)); return handleRouteWithPlatformAwareness(
else return MaterialPageRoute<void>(builder: (_) => getIt.get<CakePayBuyCardPage>(param1: args)); (context) => getIt.get<CakePayBuyCardPage>(param1: args),
);
case Routes.cakePayBuyCardDetailPage: case Routes.cakePayBuyCardDetailPage:
final args = settings.arguments as List; final args = settings.arguments as List;
if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (_) => getIt.get<CakePayBuyCardDetailPage>(param1: args)); return handleRouteWithPlatformAwareness(
else return MaterialPageRoute<void>(builder: (_) => getIt.get<CakePayBuyCardDetailPage>(param1: args)); (context) => getIt.get<CakePayBuyCardDetailPage>(param1: args),
);
case Routes.cakePayWelcomePage: case Routes.cakePayWelcomePage:
if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (_) => getIt.get<CakePayWelcomePage>(),); return handleRouteWithPlatformAwareness(
else return MaterialPageRoute<void>(builder: (_) => getIt.get<CakePayWelcomePage>(),); (context) => getIt.get<CakePayWelcomePage>(),
);
case Routes.cakePayVerifyOtpPage: case Routes.cakePayVerifyOtpPage:
final args = settings.arguments as List; final args = settings.arguments as List;
if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (_) => getIt.get<CakePayVerifyOtpPage>(param1: args)); return handleRouteWithPlatformAwareness(
else return MaterialPageRoute<void>(builder: (_) => getIt.get<CakePayVerifyOtpPage>(param1: args)); (context) => getIt.get<CakePayVerifyOtpPage>(param1: args),
);
case Routes.cakePayAccountPage: case Routes.cakePayAccountPage:
if (Platform.isIOS) return CupertinoPageRoute<void>(builder: (_) => getIt.get<CakePayAccountPage>()); return handleRouteWithPlatformAwareness(
else return MaterialPageRoute<void>(builder: (_) => getIt.get<CakePayAccountPage>()); (context) => getIt.get<CakePayAccountPage>(),
);
case Routes.webViewPage: case Routes.webViewPage:
final args = settings.arguments as List; final args = settings.arguments as List;
@ -808,28 +740,18 @@ Route<dynamic> createRoute(RouteSettings settings) {
final toggleTestnet = args['toggleTestnet'] as Function(bool? val); final toggleTestnet = args['toggleTestnet'] as Function(bool? val);
final restoredWallet = args['restoredWallet'] as RestoredWallet?; final restoredWallet = args['restoredWallet'] as RestoredWallet?;
if (Platform.isIOS) return CupertinoPageRoute<void>( return handleRouteWithPlatformAwareness(
builder: (_) => AdvancedPrivacySettingsPage( (context) => AdvancedPrivacySettingsPage(
isFromRestore: isFromRestore, isFromRestore: isFromRestore,
isChildWallet: isChildWallet, isChildWallet: isChildWallet,
useTestnet: useTestnet, useTestnet: useTestnet,
toggleUseTestnet: toggleTestnet, toggleUseTestnet: toggleTestnet,
advancedPrivacySettingsViewModel: advancedPrivacySettingsViewModel:
getIt.get<AdvancedPrivacySettingsViewModel>(param1: type), getIt.get<AdvancedPrivacySettingsViewModel>(param1: type),
nodeViewModel: getIt.get<NodeCreateOrEditViewModel>(param1: type, param2: false), nodeViewModel: getIt.get<NodeCreateOrEditViewModel>(param1: type, param2: false),
seedSettingsViewModel: getIt.get<SeedSettingsViewModel>(), seedSettingsViewModel: getIt.get<SeedSettingsViewModel>(),
)); ),
else return MaterialPageRoute<void>( );
builder: (_) => AdvancedPrivacySettingsPage(
isFromRestore: isFromRestore,
isChildWallet: isChildWallet,
useTestnet: useTestnet,
toggleUseTestnet: toggleTestnet,
advancedPrivacySettingsViewModel:
getIt.get<AdvancedPrivacySettingsViewModel>(param1: type),
nodeViewModel: getIt.get<NodeCreateOrEditViewModel>(param1: type, param2: false),
seedSettingsViewModel: getIt.get<SeedSettingsViewModel>(),
));
case Routes.anonPayInvoicePage: case Routes.anonPayInvoicePage:
final args = settings.arguments as List; final args = settings.arguments as List;
@ -850,8 +772,8 @@ Route<dynamic> createRoute(RouteSettings settings) {
final sessionId = arguments.first as String; final sessionId = arguments.first as String;
final transactionInfo = arguments[1] as TransactionInfo?; final transactionInfo = arguments[1] as TransactionInfo?;
return CupertinoPageRoute<void>( return CupertinoPageRoute<void>(
builder: (_) => getIt.get<PayjoinDetailsPage>( builder: (_) =>
param1: sessionId, param2: transactionInfo)); getIt.get<PayjoinDetailsPage>(param1: sessionId, param2: transactionInfo));
case Routes.desktop_actions: case Routes.desktop_actions:
return PageRouteBuilder( return PageRouteBuilder(
@ -884,7 +806,8 @@ Route<dynamic> createRoute(RouteSettings settings) {
return MaterialPageRoute<void>(builder: (_) => getIt.get<Setup2FAInfoPage>()); return MaterialPageRoute<void>(builder: (_) => getIt.get<Setup2FAInfoPage>());
case Routes.urqrAnimatedPage: case Routes.urqrAnimatedPage:
return MaterialPageRoute<void>(builder: (_) => getIt.get<AnimatedURPage>(param1: settings.arguments)); return MaterialPageRoute<void>(
builder: (_) => getIt.get<AnimatedURPage>(param1: settings.arguments));
case Routes.homeSettings: case Routes.homeSettings:
return CupertinoPageRoute<void>( return CupertinoPageRoute<void>(
@ -964,14 +887,15 @@ Route<dynamic> createRoute(RouteSettings settings) {
); );
case Routes.exchangeTradeExternalSendPage: case Routes.exchangeTradeExternalSendPage:
return MaterialPageRoute<void>(builder: (_) => getIt.get<ExchangeTradeExternalSendPage>(),); return MaterialPageRoute<void>(
builder: (_) => getIt.get<ExchangeTradeExternalSendPage>(),
);
case Routes.backgroundSync: case Routes.backgroundSync:
if (Platform.isIOS) { return handleRouteWithPlatformAwareness(
return CupertinoPageRoute<void>(builder: (context) => getIt.get<BackgroundSyncPage>()); (context) => getIt.get<BackgroundSyncPage>(),
} else { );
return MaterialPageRoute<void>(builder: (context) => getIt.get<BackgroundSyncPage>());
}
case Routes.devMoneroBackgroundSync: case Routes.devMoneroBackgroundSync:
return MaterialPageRoute<void>( return MaterialPageRoute<void>(
builder: (_) => getIt.get<DevMoneroBackgroundSyncPage>(), builder: (_) => getIt.get<DevMoneroBackgroundSyncPage>(),

View file

@ -125,7 +125,6 @@ class BaseTextFormField extends StatelessWidget {
suffix: suffix, suffix: suffix,
suffixIcon: suffixIcon, suffixIcon: suffixIcon,
filled: !hasUnderlineBorder, filled: !hasUnderlineBorder,
//border: !hasUnderlineBorder ? OutlineInputBorder() : null,
fillColor: fillColor:
hasUnderlineBorder ? null : fillColor ?? Theme.of(context).colorScheme.surfaceContainer, hasUnderlineBorder ? null : fillColor ?? Theme.of(context).colorScheme.surfaceContainer,
hintStyle: placeholderTextStyle ?? hintStyle: placeholderTextStyle ??
@ -162,13 +161,6 @@ class BaseTextFormField extends StatelessWidget {
), ),
) )
: null, : null,
// OutlineInputBorder(
// borderRadius: BorderRadius.circular(10),
// borderSide: BorderSide(
// color: Theme.of(context).colorScheme.outlineVariant,
// width: 1.5,
// )
// ),
errorBorder: hasUnderlineBorder errorBorder: hasUnderlineBorder
? UnderlineInputBorder( ? UnderlineInputBorder(
borderSide: BorderSide(color: Theme.of(context).colorScheme.error), borderSide: BorderSide(color: Theme.of(context).colorScheme.error),

View file

@ -40,17 +40,22 @@ abstract class ThemeStoreBase with Store {
} }
@action @action
Future<void> setThemeMode(ThemeMode mode, {bool shouldRefreshTheme = true}) async { Future<void> setThemeMode(ThemeMode mode) async {
if (_themeMode == mode) return; if (_themeMode == mode) return;
_themeMode = mode; _themeMode = mode;
await sharedPreferences.setString(PreferencesKey.themeMode, mode.toString());
if (mode == ThemeMode.system && shouldRefreshTheme) { await _saveThemeModeToPrefs(mode);
if (mode == ThemeMode.system) {
setTheme(getThemeFromSystem()); setTheme(getThemeFromSystem());
} }
} }
Future<void> _saveThemeModeToPrefs(ThemeMode mode) async {
await sharedPreferences.setString(PreferencesKey.themeMode, mode.toString());
}
/// Loads the saved theme preferences /// Loads the saved theme preferences
Future<void> loadThemePreferences() async { Future<void> loadThemePreferences() async {
sharedPreferences = await SharedPreferences.getInstance(); sharedPreferences = await SharedPreferences.getInstance();
@ -95,7 +100,7 @@ abstract class ThemeStoreBase with Store {
/// Handles theme loading for mobile platforms /// Handles theme loading for mobile platforms
Future<void> _handleMobileTheme(bool isNewInstall) async { Future<void> _handleMobileTheme(bool isNewInstall) async {
if (isNewInstall) { if (isNewInstall) {
await _setSystemTheme(); await _setSystemTheme(isNewInstall: isNewInstall);
} else { } else {
await loadSavedTheme(); await loadSavedTheme();
} }
@ -112,27 +117,36 @@ abstract class ThemeStoreBase with Store {
final theme = ThemeList.deserialize(raw: savedTheme); final theme = ThemeList.deserialize(raw: savedTheme);
if (_currentTheme != theme) {
await setTheme(theme);
}
final newThemeMode = _getThemeModeOnStartUp(theme, isFromBackup); final newThemeMode = _getThemeModeOnStartUp(theme, isFromBackup);
if (newThemeMode == ThemeMode.system) {
await _setSystemTheme();
return;
}
if (_themeMode != newThemeMode) { if (_themeMode != newThemeMode) {
await setThemeMode(newThemeMode, shouldRefreshTheme: false); await setThemeMode(newThemeMode);
}
if (_currentTheme != theme) {
await setTheme(theme);
} }
} catch (e) { } catch (e) {
await _setSystemTheme(); await _setSystemTheme();
} }
} }
Future<void> _setSystemTheme() async { Future<void> _setSystemTheme({bool isNewInstall = false}) async {
final systemTheme = getThemeFromSystem(); final systemTheme = getThemeFromSystem();
if (_currentTheme != systemTheme) { if (_currentTheme != systemTheme) {
await setTheme(systemTheme); await setTheme(systemTheme);
} }
if (isNewInstall) {
await _saveThemeModeToPrefs(ThemeMode.system);
}
if (_themeMode != ThemeMode.system) { if (_themeMode != ThemeMode.system) {
await setThemeMode(ThemeMode.system); await setThemeMode(ThemeMode.system);
} }
@ -142,7 +156,7 @@ abstract class ThemeStoreBase with Store {
if (isFromBackup || _themeMode != ThemeMode.system) { if (isFromBackup || _themeMode != ThemeMode.system) {
return theme.isDark ? ThemeMode.dark : ThemeMode.light; return theme.isDark ? ThemeMode.dark : ThemeMode.light;
} }
return ThemeMode.system; return ThemeMode.system;
} }