enh: refactor askPinCode()

This commit is contained in:
poka 2024-01-21 21:58:18 +01:00
parent 6b5bcadded
commit e485af5194
13 changed files with 41 additions and 153 deletions

View File

@ -6,6 +6,7 @@ import 'dart:async';
import 'package:gecko/globals.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/widgets/commons/common_elements.dart';
import 'package:path_provider/path_provider.dart';
import 'package:provider/provider.dart';
@ -76,6 +77,20 @@ class MyWalletsProvider with ChangeNotifier {
return targetedWallet;
}
Future<bool> askPinCode() async {
final defaultWallet = getDefaultWallet();
if (pinCode.isEmpty) {
await Navigator.push(
homeContext,
MaterialPageRoute(
builder: (homeContext) => UnlockingWallet(wallet: defaultWallet),
),
);
}
return pinCode.isNotEmpty;
}
WalletData? getWalletDataByAddress(String address) {
WalletData? targetedWallet;

View File

@ -183,12 +183,12 @@ class SubstrateSdk with ChangeNotifier {
}
Future<String> signDatapod(String document, String address) async {
final myWallets =
final myWalletProvider =
Provider.of<MyWalletsProvider>(homeContext, listen: false);
final messageToSign = Uint8List.fromList(document.codeUnits);
final signatureString =
await _signMessage(messageToSign, address, myWallets.pinCode);
await _signMessage(messageToSign, address, myWalletProvider.pinCode);
final signatureInt = HEX.decode(signatureString.substring(2));
final signature64 = base64Encode(signatureInt);

View File

@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/queries_datapod.dart';
import 'package:gecko/models/scale_functions.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:provider/provider.dart';
@ -15,9 +16,13 @@ class V2sDatapodProvider with ChangeNotifier {
Future<Map<String, dynamic>> _setSignedVariables(
String address, Map<String, dynamic> messageToSign) async {
final myWalletProvider =
Provider.of<MyWalletsProvider>(homeContext, listen: false);
final sub = Provider.of<SubstrateSdk>(homeContext, listen: false);
final hashDocBytes = utf8.encode(jsonEncode(messageToSign));
final hashDoc = sha256.convert(hashDocBytes).toString().toUpperCase();
if (!await myWalletProvider.askPinCode()) return {};
final signature = await sub.signDatapod(hashDoc, address);
return <String, dynamic>{
@ -53,6 +58,7 @@ class V2sDatapodProvider with ChangeNotifier {
'socials': socials
};
final variables = await _setSignedVariables(address, messageToSign);
if (variables.isEmpty) return false;
final result = await _execQuery(updateProfileQ, variables);
if (result.hasException) {
@ -66,6 +72,7 @@ class V2sDatapodProvider with ChangeNotifier {
Future<bool> deleteProfile({required String address}) async {
final messageToSign = {'address': address};
final variables = await _setSignedVariables(address, messageToSign);
if (variables.isEmpty) return false;
final result = await _execQuery(deleteProfileQ, variables);
if (result.hasException) {
@ -80,6 +87,7 @@ class V2sDatapodProvider with ChangeNotifier {
{required String addressOld, required String addressNew}) async {
final messageToSign = {'addressOld': addressOld, 'addressNew': addressNew};
final variables = await _setSignedVariables(addressOld, messageToSign);
if (variables.isEmpty) return false;
final result = await _execQuery(migrateProfileQ, variables);
if (result.hasException) {
@ -101,6 +109,7 @@ class V2sDatapodProvider with ChangeNotifier {
'comment': comment,
};
final variables = await _setSignedVariables(issuer, messageToSign);
if (variables.isEmpty) return false;
final result = await _execQuery(addTransactionCommentQ, variables);
if (result.hasException) {

View File

@ -13,7 +13,6 @@ import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/v2s_datapod.dart';
import 'package:gecko/widgets/commons/common_elements.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/transaction_in_progress.dart';
import 'package:image_picker/image_picker.dart';
import 'package:provider/provider.dart';
@ -224,21 +223,7 @@ class WalletOptionsProvider with ChangeNotifier {
return;
}
WalletData? defaultWallet =
myWalletProvider.getDefaultWallet();
if (myWalletProvider.pinCode == '') {
await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(
wallet: defaultWallet);
},
),
);
}
if (myWalletProvider.pinCode == '') return;
if (!await myWalletProvider.askPinCode()) return;
final wallet = myWalletProvider
.getWalletDataByAddress(address.text);

View File

@ -4,10 +4,8 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:durt/durt.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/widgets/commons/top_appbar.dart';
import 'package:provider/provider.dart';
@ -92,20 +90,9 @@ class _ChangePinScreenState extends State<ChangePinScreen> {
backgroundColor: Colors.green[400],
),
onPressed: () async {
WalletData defaultWallet =
myWalletProvider.getDefaultWallet();
final defaultWallet = myWalletProvider.getDefaultWallet();
if (myWalletProvider.pinCode == '') {
await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(wallet: defaultWallet);
},
),
);
}
if (myWalletProvider.pinCode == '') return;
if (!await myWalletProvider.askPinCode()) return;
await sub.changePassword(context, defaultWallet.address,
widget.walletProvider.pinCode, newPin.text);

View File

@ -5,14 +5,12 @@ import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/chest_data.dart';
import 'package:gecko/models/scale_functions.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/chest_provider.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/screens/myWallets/custom_derivations.dart';
import 'package:gecko/screens/myWallets/show_seed.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/widgets/bottom_app_bar.dart';
import 'package:gecko/widgets/commons/offline_info.dart';
import 'package:gecko/widgets/commons/top_appbar.dart';
@ -44,18 +42,8 @@ class ChestOptions extends StatelessWidget {
onTap: () async {
final myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
WalletData? defaultWallet =
myWalletProvider.getDefaultWallet();
final String? pin = await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(wallet: defaultWallet);
},
),
);
if (!await myWalletProvider.askPinCode()) return;
if (pin == null) return;
Navigator.push(
context,
MaterialPageRoute(builder: (context) {

View File

@ -5,10 +5,8 @@ import 'package:gecko/globals.dart';
import 'package:gecko/models/scale_functions.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:flutter/material.dart';
import 'package:gecko/screens/myWallets/restore_chest.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:carousel_slider/carousel_slider.dart';
import 'package:gecko/screens/onBoarding/5.dart';
import 'package:provider/provider.dart';
@ -110,25 +108,13 @@ class _ChooseChestState extends State<ChooseChest> {
onPressed: () async {
await configBox.put('currentChest', currentChest);
myWalletProvider.pinCode = '';
WalletData? defaultWallet =
myWalletProvider.getDefaultWallet();
myWalletProvider.reload();
if (!await myWalletProvider.askPinCode()) return;
await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(wallet: defaultWallet);
},
),
);
Navigator.popUntil(
context,
ModalRoute.withName('/'),
);
if (myWalletProvider.pinCode != '') {
Navigator.pushNamed(context, '/mywallets');
}
Navigator.pushNamed(context, '/mywallets');
},
child: Text(
'openThisChest'.tr(),

View File

@ -6,7 +6,6 @@ import 'package:flutter/material.dart';
import 'package:gecko/models/scale_functions.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/widgets/commons/top_appbar.dart';
import 'package:provider/provider.dart';
@ -109,20 +108,7 @@ class _CustomDerivationState extends State<CustomDerivation> {
backgroundColor: orangeC,
),
onPressed: () async {
WalletData? defaultWallet =
myWalletProvider.getDefaultWallet();
if (myWalletProvider.pinCode == '') {
await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(wallet: defaultWallet);
},
),
);
}
if (myWalletProvider.pinCode == '') return;
if (!await myWalletProvider.askPinCode()) return;
String newDerivationName =
'${'wallet'.tr()} ${myWalletProvider.listWallets.last.number! + 2}';
if (dropdownValue == 'root') {

View File

@ -4,13 +4,11 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:gecko/globals.dart';
import 'package:flutter/material.dart';
import 'package:gecko/models/scale_functions.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/widgets/commons/common_elements.dart';
import 'package:gecko/screens/myWallets/migrate_identity.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/transaction_in_progress.dart';
import 'package:gecko/widgets/commons/top_appbar.dart';
import 'package:provider/provider.dart';
@ -113,20 +111,7 @@ class ManageMembership extends StatelessWidget {
Provider.of<MyWalletsProvider>(context, listen: false);
final sub = Provider.of<SubstrateSdk>(context, listen: false);
WalletData? defaultWallet = myWalletProvider.getDefaultWallet();
String? pin;
if (myWalletProvider.pinCode == '') {
pin = await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(wallet: defaultWallet);
},
),
);
}
if (pin == null || myWalletProvider.pinCode == '') return;
if (!await myWalletProvider.askPinCode()) return;
final transactionId =
await sub.revokeIdentity(address, myWalletProvider.pinCode);

View File

@ -6,7 +6,6 @@ import 'package:gecko/globals.dart';
import 'package:flutter/material.dart';
import 'package:gecko/models/migrate_wallet_checks.dart';
import 'package:gecko/models/scale_functions.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/generate_wallets.dart';
@ -14,7 +13,6 @@ import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/transaction_in_progress.dart';
import 'package:gecko/widgets/commons/top_appbar.dart';
import 'package:polkawallet_sdk/api/apiKeyring.dart';
@ -189,21 +187,7 @@ class MigrateIdentityScreen extends StatelessWidget {
),
onPressed: statusData.canValidate && mnemonicIsValid
? () async {
WalletData? defaultWallet =
myWalletProvider.getDefaultWallet();
String? pin;
if (myWalletProvider.pinCode == '') {
pin = await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(wallet: defaultWallet);
},
),
);
}
if (myWalletProvider.pinCode == '') return;
if (!await myWalletProvider.askPinCode()) return;
await sub.importAccount(
mnemonic: newMnemonicSentence.text,
@ -215,7 +199,7 @@ class MigrateIdentityScreen extends StatelessWidget {
final transactionId = await sub.migrateIdentity(
fromAddress: fromAddress,
destAddress: newWalletAddress.text,
fromPassword: pin ?? myWalletProvider.pinCode,
fromPassword: myWalletProvider.pinCode,
destPassword: 'password',
withBalance: true,
fromBalance: statusData.balance);

View File

@ -4,12 +4,10 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/scale_functions.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/search.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:provider/provider.dart';
class GeckoBottomAppBar extends StatelessWidget {
@ -93,20 +91,8 @@ class GeckoBottomAppBar extends StatelessWidget {
onPressed: lockAction
? null
: () async {
WalletData? defaultWallet =
myWalletProvider.getDefaultWallet();
if (myWalletProvider.pinCode == '') {
await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(wallet: defaultWallet);
},
),
);
}
if (!await myWalletProvider.askPinCode()) return;
if (myWalletProvider.pinCode == '') return;
Navigator.popUntil(context, ModalRoute.withName('/'));
//FIXME: Should not have to wait 300 milliseconds when /mywallets exist in navigator...
sleep(const Duration(milliseconds: 300));

View File

@ -4,10 +4,8 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/scale_functions.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:provider/provider.dart';
class AddNewDerivationButton extends StatelessWidget {
@ -31,19 +29,8 @@ class AddNewDerivationButton extends StatelessWidget {
key: keyAddDerivation,
onTap: () async {
if (!myWalletProvider.isNewDerivationLoading) {
WalletData? defaultWallet =
myWalletProvider.getDefaultWallet();
if (myWalletProvider.pinCode == '') {
await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(wallet: defaultWallet);
},
),
);
}
if (myWalletProvider.pinCode == '') return;
if (!await myWalletProvider.askPinCode()) return;
await myWalletProvider.generateNewDerivation(
context, newDerivationName);
}

View File

@ -12,7 +12,6 @@ import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/activity.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/transaction_in_progress.dart';
import 'package:gecko/widgets/balance.dart';
import 'package:gecko/widgets/name_by_address.dart';
@ -34,17 +33,8 @@ void paymentPopup(BuildContext context, String toAddress, String? username) {
walletViewProvider.payAmount.text = '';
Future executeTransfert() async {
if (myWalletProvider.pinCode == '') {
await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(wallet: defaultWallet);
},
),
);
}
if (myWalletProvider.pinCode == '') return;
if (!await myWalletProvider.askPinCode()) return;
// Payment workflow !
final sub = Provider.of<SubstrateSdk>(context, listen: false);
final acc = sub.getCurrentWallet();