Skip to content

Commit

Permalink
feat: ✨ Add change environment widget with accounts selection
Browse files Browse the repository at this point in the history
  • Loading branch information
redDwarf03 committed Dec 20, 2024
1 parent dd754e5 commit 48e7e0a
Show file tree
Hide file tree
Showing 10 changed files with 448 additions and 137 deletions.
37 changes: 28 additions & 9 deletions lib/application/session/providers.dart
Original file line number Diff line number Diff line change
Expand Up @@ -126,19 +126,12 @@ class SessionNotifier extends _$SessionNotifier {
);
}

Future<LoggedInSession?> restoreFromMnemonics({
required List<String> mnemonics,
Future<LoggedInSession?> restoreFromSeed({
required String seed,
required String languageCode,
}) async {
await _appWalletDatasource.clearAppWallet();

final seed = AppMnemomics.mnemonicListToSeed(
mnemonics,
languageCode: languageCode,
);
if (seed.isEmpty) {
return null;
}
final vault = await KeychainInfoVaultDatasource.getInstance();

await vault.setSeed(seed);
Expand Down Expand Up @@ -170,7 +163,33 @@ class SessionNotifier extends _$SessionNotifier {
),
);
} catch (e) {
if (e.toString() == "Exception: Keychain doesn't exists") {
throw const ArchethicKeychainNotExistsException();
}

return null;
}
}

Future<LoggedInSession?> restoreFromMnemonics({
required List<String> mnemonics,
required String languageCode,
}) async {
await _appWalletDatasource.clearAppWallet();

final seed = AppMnemomics.mnemonicListToSeed(
mnemonics,
languageCode: languageCode,
);
if (seed.isEmpty) {
return null;
}
return restoreFromSeed(seed: seed, languageCode: languageCode);
}
}

// TODO(reddwarf03): Move to libdart
@immutable
class ArchethicKeychainNotExistsException implements ArchethicException {
const ArchethicKeychainNotExistsException();
}
2 changes: 1 addition & 1 deletion lib/domain/repositories/features_flags.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'package:aewallet/util/universal_platform.dart';

/// Simply activate/deactivate features.
class FeatureFlags {
static const forceLogout = false;
static const forceLogout = true;
static const tokenFungibleCreationFeature = false;
static const dappBoard = false;
static final privacyMask = !UniversalPlatform
Expand Down
13 changes: 12 additions & 1 deletion lib/l10n/intl_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@
"searchField": "Search...",
"search": "Search",
"pleaseWait": "Please wait",
"pleaseWaitChangeNetwork": "Network change in progress",
"appWalletInitInProgress": "Your wallet is being configured...",
"sendMessageHeader": "Message",
"sendMessageConfirmHeader": "Your message :",
Expand Down Expand Up @@ -785,5 +786,15 @@
},
"dappBoardLinkHeader": "DApps Board",
"dappBoardLinkDesc": "Access to decentralized applications deployed on Archethic Public Blockchain",
"dappBoardTitle": "DApps Board"
"dappBoardTitle": "DApps Board",
"networkChangeHeader": "Network change",
"networkChangeKeychainNotExists": "Your wallet doesn't yet exist in the {envName} environment. You can create it automatically.\nPlease select the accounts you wish to duplicate in this environment. You can add or remove accounts from your {envName} wallet at any time.\n\nImportant:\n- There is no automatic synchronization between environments.\n- Funds, tokens, NFTs, and UCO cannot be transferred or duplicated between environments. Accounts created in Testnet will be empty.",
"@networkChangeKeychainNotExists": {
"placeholders": {
"envName": {
"type": "String"
}
}
},
"networkChangeCreateKeychainBtn": "Create wallet"
}
13 changes: 12 additions & 1 deletion lib/l10n/intl_fr.arb
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,7 @@
"searchField": "Recherche...",
"search": "Rechercher",
"pleaseWait": "Veuillez patienter",
"pleaseWaitChangeNetwork": "Changement d'environnement en cours",
"appWalletInitInProgress": "Votre wallet est en cours de configuration...",
"sendMessageHeader": "Message",
"sendMessageConfirmHeader": "Votre message :",
Expand Down Expand Up @@ -765,5 +766,15 @@
},
"dappBoardLinkHeader": "DApps Board",
"dappBoardLinkDesc": "Accédez aux applications décentralisées sur la Blockchain Publique Archethic",
"dappBoardTitle": "DApps Board"
"dappBoardTitle": "DApps Board",
"networkChangeHeader": "Changement d'env.",
"networkChangeKeychainNotExists": "Votre wallet n'existe pas encore dans l'environnement {envName}. Nous vous proposons de le créer automatiquement.\nVeuillez sélectionner les comptes que vous souhaitez dupliquer dans cet environnement. Vous pourrez à tout moment ajouter ou retirer des comptes sur votre wallet {envName}.\n\nImportant :\n- Il n'existe aucune synchronisation automatique entre les environnements.\n- Les fonds, tokens, NFT et UCO ne peuvent pas être transférés ou dupliqués entre les environnements. Les comptes créés dans Testnet seront donc vides.",
"@networkChangeKeychainNotExists": {
"placeholders": {
"envName": {
"type": "String"
}
}
},
"networkChangeCreateKeychainBtn": "Créer le wallet"
}
13 changes: 1 addition & 12 deletions lib/ui/menu/settings/main_settings_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ class MainMenuView extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final localizations = AppLocalizations.of(context)!;
final environment = ref.watch(environmentProvider);
final selectedAccount = ref.watch(
AccountProviders.accounts.select(
(accounts) => accounts.valueOrNull?.selectedAccount,
Expand Down Expand Up @@ -45,17 +44,7 @@ class MainMenuView extends ConsumerWidget {
children: <Widget>[
ListView(
children: <Widget>[
Padding(
padding: const EdgeInsets.only(bottom: 10),
child: Align(
child: Text(
environment.label,
style: AppTextStyles.bodyMediumSecondaryColor(
context,
),
),
),
),
const NetworkChange(),
const _SettingsListItem.spacer(),
_SettingsListItem.title(text: localizations.information),
const _SettingsListItem.spacer(),
Expand Down
123 changes: 123 additions & 0 deletions lib/ui/menu/settings/network_change.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
/// SPDX-License-Identifier: AGPL-3.0-or-later
import 'package:aewallet/application/account/providers.dart';
import 'package:aewallet/application/session/session.dart';
import 'package:aewallet/application/settings/settings.dart';
import 'package:aewallet/modules/aeswap/application/session/provider.dart';
import 'package:aewallet/modules/aeswap/ui/views/util/app_styles.dart';
import 'package:aewallet/ui/themes/archethic_theme_base.dart';
import 'package:aewallet/ui/util/accounts_dialog.dart';
import 'package:aewallet/ui/widgets/components/dialog.dart';
import 'package:aewallet/ui/widgets/dialogs/network_dialog.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/localizations.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:material_symbols_icons/symbols.dart';

class NetworkChange extends ConsumerWidget {
const NetworkChange({
super.key,
});
@override
Widget build(BuildContext context, WidgetRef ref) {
final environment = ref.watch(environmentProvider);
final selectedAccount = ref.watch(
AccountProviders.accounts.select(
(accounts) => accounts.valueOrNull?.selectedAccount,
),
);
final settings = ref.watch(SettingsProviders.settings);
final localizations = AppLocalizations.of(context)!;

if (selectedAccount == null) return const SizedBox();

return InkWell(
onTap: settings.devMode
? () async {
final _saveNetwork = settings.network;
await context.push(NetworkDialog.routerPage);
final _settings = ref.read(SettingsProviders.settings);
if (_settings.network.network != _saveNetwork.network) {
context.loadingOverlay.show(
title: AppLocalizations.of(context)!.pleaseWaitChangeNetwork,
);
final languageSeed = ref.read(
SettingsProviders.settings.select(
(settings) => settings.languageSeed,
),
);
final seed =
ref.read(sessionNotifierProvider).loggedIn?.wallet.seed;
if (seed != null) {
try {
await ref
.read(sessionNotifierProvider.notifier)
.restoreFromSeed(
seed: seed,
languageCode: languageSeed,
);
context.loadingOverlay.hide();
} on ArchethicKeychainNotExistsException catch (_) {
context.loadingOverlay.hide();
context.pop();
final session = ref.read(sessionNotifierProvider);
await AccountsDialog.selectMultipleAccounts(
context: context,
accounts: session.loggedIn!.wallet.appKeychain.accounts,
confirmBtnLabel:
localizations.networkChangeCreateKeychainBtn,
dialogTitle: localizations.networkChangeHeader,
isModal: true,
header: Padding(
padding: const EdgeInsets.symmetric(vertical: 10),
child: Column(
children: [
Text(
localizations.networkChangeKeychainNotExists(
_saveNetwork.getDisplayName(context),
),
style: AppTextStyles.bodySmall(context),
),
],
),
),
);
}
}
}
}
: null,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.only(bottom: 10),
child: Align(
child: Text(
environment.label,
style: AppTextStyles.bodyMediumSecondaryColor(
context,
),
),
),
),
if (settings.devMode)
Padding(
padding: const EdgeInsets.only(bottom: 8),
child: Row(
children: [
const SizedBox(
width: 5,
),
Icon(
Symbols.keyboard_arrow_down,
color: ArchethicThemeBase.neutral0,
),
],
),
),
],
),
);
}
}
3 changes: 1 addition & 2 deletions lib/ui/menu/settings/settings_sheet.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ import 'package:aewallet/model/device_lock_timeout.dart';
import 'package:aewallet/model/privacy_mask_option.dart';
import 'package:aewallet/model/setting_item.dart';
import 'package:aewallet/modules/aeswap/application/pool/dex_pool.dart';
import 'package:aewallet/modules/aeswap/application/session/provider.dart';
import 'package:aewallet/modules/aeswap/ui/views/util/app_styles.dart';
import 'package:aewallet/ui/menu/settings/network_change.dart';
import 'package:aewallet/ui/themes/archethic_theme.dart';
import 'package:aewallet/ui/themes/archethic_theme_base.dart';
import 'package:aewallet/ui/themes/styles.dart';
Expand Down
Loading

0 comments on commit 48e7e0a

Please sign in to comment.