Complete refactoring of unlocking chests; Can cache pin code 15 minutes

This commit is contained in:
poka 2022-05-31 18:23:56 +02:00
parent d91d2cddb3
commit 8c1383bdd4
22 changed files with 347 additions and 361 deletions

View File

@ -65,7 +65,7 @@ android {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.release
signingConfig signingConfigs.release //poka: comment this to build unsigned release, or set to signingConfigs.debug to sign with debug keys
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

View File

@ -77,6 +77,8 @@ Future<void> main() async {
HttpOverrides.global = MyHttpOverrides();
if (kReleaseMode && enableSentry) {
// CatcherOptions debugOptions = CatcherOptions(DialogReportMode(), [
// SentryHandler(SentryClient(SentryOptions(

View File

@ -3,6 +3,7 @@ import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/chest_data.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:provider/provider.dart';
@ -17,6 +18,11 @@ class ChestProvider with ChangeNotifier {
if (_answer ?? false) {
await _sub.deleteAccounts(getChestWallets(_chest));
await chestBox.delete(_chest.key);
MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
_myWalletProvider.pinCode = '';
if (chestBox.isEmpty) {
await configBox.put('currentChest', 0);
} else {

View File

@ -70,6 +70,8 @@ class GenerateWalletsProvider with ChangeNotifier {
} else {
chestName = 'Coffre à Ğecko ${chestNumber + 1}';
}
await configBox.put('currentChest', chestNumber);
ChestData thisChest = ChestData(
name: chestName,
defaultWallet: 0,

View File

@ -11,6 +11,7 @@ import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/myWallets/wallets_home.dart';
import 'package:gecko/screens/search.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:flutter/foundation.dart' show kDebugMode, kIsWeb;
@ -169,23 +170,32 @@ class HomeProvider with ChangeNotifier {
IconButton(
iconSize: 60,
icon: const Image(image: AssetImage('assets/wallet.png')),
onPressed: () {
Navigator.popUntil(
context,
ModalRoute.withName('/'),
);
onPressed: () async {
WalletData? defaultWallet = _myWalletProvider.getDefaultWallet();
Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(
wallet: defaultWallet,
action: "mywallets",
);
},
),
);
String? _pin;
if (_myWalletProvider.pinCode == '') {
_pin = await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(wallet: defaultWallet);
},
),
);
}
if (_pin != null || _myWalletProvider.pinCode != '') {
Navigator.popUntil(
context,
ModalRoute.withName('/'),
);
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return const WalletsHome();
}),
);
}
},
),
]),

View File

@ -8,7 +8,7 @@ import 'package:provider/provider.dart';
class MyWalletsProvider with ChangeNotifier {
List<WalletData> listWallets = [];
late String pinCode;
String pinCode = '';
late String mnemonic;
int? pinLenght;
bool isNewDerivationLoading = false;
@ -82,6 +82,8 @@ class MyWalletsProvider with ChangeNotifier {
Future<int> deleteAllWallet(context) async {
SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
try {
log.w('DELETE ALL WALLETS ?');
@ -92,6 +94,9 @@ class MyWalletsProvider with ChangeNotifier {
await chestBox.clear();
await configBox.delete('defaultWallet');
await _sub.deleteAllAccounts();
_myWalletProvider.pinCode = '';
await Navigator.of(context).pushNamedAndRemoveUntil(
'/',
ModalRoute.withName('/'),
@ -144,6 +149,13 @@ class MyWalletsProvider with ChangeNotifier {
notifyListeners();
}
Future resetPinCode([int minutes = 15]) async {
await Future.delayed(
Duration(seconds: configBox.get('isCacheChecked') ? minutes * 60 : 1));
log.i('reset pin code ...');
pinCode = '';
}
void rebuildWidget() {
notifyListeners();
}

View File

@ -6,6 +6,7 @@ import 'package:gecko/globals.dart';
import 'package:gecko/models/chest_data.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:polkawallet_sdk/api/apiKeyring.dart';
import 'package:polkawallet_sdk/api/types/networkParams.dart';
import 'package:polkawallet_sdk/api/types/txInfoData.dart';
@ -255,10 +256,13 @@ class SubstrateSdk with ChangeNotifier {
return int.parse(deriveNbr);
}
Future<KeyPairData?> changePassword(
String address, String passOld, String? passNew) async {
Future<KeyPairData?> changePassword(BuildContext context, String address,
String passOld, String? passNew) async {
final account = getKeypair(address);
MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
keyring.setCurrent(account);
_myWalletProvider.resetPinCode();
return await sdk.api.keyring.changePassword(keyring, passOld, passNew);
}

View File

@ -232,6 +232,12 @@ class WalletOptionsProvider with ChangeNotifier {
notifyListeners();
}
Future changePinCacheChoice() async {
bool isCacheChecked = configBox.get('isCacheChecked') ?? true;
await configBox.put('isCacheChecked', !isCacheChecked);
notifyListeners();
}
String? getAddress(int chest, int derivation) {
String? _address;
walletBox.toMap().forEach((key, value) {

View File

@ -11,6 +11,7 @@ import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/myWallets/restore_chest.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/myWallets/wallets_home.dart';
import 'package:gecko/screens/onBoarding/1.dart';
import 'package:gecko/screens/search.dart';
import 'package:gecko/screens/settings.dart';
@ -289,20 +290,31 @@ Widget geckHome(context) {
image: const AssetImage(
'assets/home/wallet.png'),
height: 68 * ratio)),
onTap: () {
onTap: () async {
WalletData? defaultWallet =
_myWalletProvider.getDefaultWallet();
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return UnlockingWallet(
wallet: defaultWallet,
action: "mywallets",
);
},
),
);
String? _pin;
if (_myWalletProvider.pinCode == '') {
_pin = await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(
wallet: defaultWallet);
},
),
);
}
if (_pin != null ||
_myWalletProvider.pinCode != '') {
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return const WalletsHome();
}),
);
}
// log.d(_myWalletProvider.pinCode);
// Navigator.pushNamed(
// context, '/mywallets')));

View File

@ -6,6 +6,7 @@ import 'package:gecko/models/stateful_wrapper.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 'dart:io';
import 'package:provider/provider.dart';
@ -106,11 +107,24 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
WalletData defaultWallet =
_myWalletProvider.getDefaultWallet()!;
await _sub.changePassword(
defaultWallet.address!, walletProvider.pinCode, newPin.text);
walletProvider.pinCode = newPin.text;
newPin.text = '';
Navigator.pop(context);
String? _pin;
if (_myWalletProvider.pinCode == '') {
_pin = await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(wallet: defaultWallet);
},
),
);
}
if (_pin != null || _myWalletProvider.pinCode != '') {
await _sub.changePassword(context, defaultWallet.address!,
walletProvider.pinCode, newPin.text);
walletProvider.pinCode = newPin.text;
newPin.text = '';
Navigator.pop(context);
}
},
child: const Text(
'Confirmer',

View File

@ -2,11 +2,13 @@ import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/chest_data.dart';
import 'package:flutter/services.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/chest_provider.dart';
import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/screens/myWallets/change_pin.dart';
import 'package:gecko/screens/myWallets/show_seed.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:provider/provider.dart';
class ChestOptions extends StatelessWidget {
@ -51,15 +53,32 @@ class ChestOptions extends StatelessWidget {
InkWell(
key: const Key('showSeed'),
onTap: () async {
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return ShowSeed(
walletName: currentChest.name,
walletProvider: walletProvider,
);
}),
);
MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(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 != '') {
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return ShowSeed(
walletName: currentChest.name,
walletProvider: walletProvider,
);
}),
);
}
},
child: SizedBox(
height: 50,

View File

@ -6,12 +6,12 @@ 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/myWallets/wallets_home.dart';
import 'package:gecko/screens/onBoarding/5.dart';
import 'package:provider/provider.dart';
class ChooseChest extends StatefulWidget {
const ChooseChest({this.action, Key? key}) : super(key: key);
final String? action;
const ChooseChest({Key? key}) : super(key: key);
@override
State<StatefulWidget> createState() {
@ -31,8 +31,6 @@ class _ChooseChestState extends State<ChooseChest> {
MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context);
log.d(widget.action);
return Scaffold(
backgroundColor: backgroundColor,
appBar: AppBar(
@ -113,21 +111,33 @@ class _ChooseChestState extends State<ChooseChest> {
primary: orangeC, // background
onPrimary: Colors.black, // foreground
),
onPressed: () {
configBox.put('currentChest', currentChest);
onPressed: () async {
await configBox.put('currentChest', currentChest);
_myWalletProvider.pinCode = '';
WalletData? defaultWallet =
_myWalletProvider.getDefaultWallet();
_myWalletProvider.rebuildWidget();
Navigator.pushAndRemoveUntil(
await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(wallet: defaultWallet);
},
),
);
Navigator.popUntil(
context,
MaterialPageRoute(builder: (context) {
return UnlockingWallet(
wallet: defaultWallet,
action: widget.action ?? "mywallets",
);
}),
ModalRoute.withName('/'),
);
if (_myWalletProvider.pinCode != '') {
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return const WalletsHome();
}),
);
}
},
child: Text(
'Ouvrir ce coffre',

View File

@ -14,9 +14,7 @@ import 'package:provider/provider.dart';
// ignore: must_be_immutable
class ChooseWalletScreen extends StatelessWidget {
ChooseWalletScreen({Key? key, required this.chest, required this.pin})
: super(key: key);
final int chest;
ChooseWalletScreen({Key? key, required this.pin}) : super(key: key);
final String pin;
WalletData? selectedWallet;
@ -24,6 +22,7 @@ class ChooseWalletScreen extends StatelessWidget {
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
final int chest = configBox.get('currentChest');
return Scaffold(
backgroundColor: backgroundColor,
@ -55,7 +54,7 @@ class ChooseWalletScreen extends StatelessWidget {
// _walletViewProvider.reload();
_sub.reload();
Navigator.pop(context);
// Navigator.pop(context);
Navigator.pop(context);
Navigator.pop(context);
},

View File

@ -1,187 +0,0 @@
import 'dart:async';
import 'package:durt/durt.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/providers/generate_wallets.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:provider/provider.dart';
// ignore: must_be_immutable
class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
ConfirmStoreWallet({
Key? validationKey,
required this.generatedMnemonic,
required this.generatedWallet,
}) : super(key: validationKey);
String? generatedMnemonic;
NewWallet? generatedWallet;
final TextEditingController _mnemonicController = TextEditingController();
final TextEditingController _inputRestoreWord = TextEditingController();
TextEditingController walletName = TextEditingController();
final FocusNode _wordFocus = FocusNode();
@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
GenerateWalletsProvider _generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context);
MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context);
final int? _currentChest = _myWalletProvider.getCurrentChest();
SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
_mnemonicController.text = generatedMnemonic!;
return WillPopScope(
onWillPop: () {
_generateWalletProvider.isAskedWordValid = false;
_generateWalletProvider.askedWordColor = Colors.black;
return Future<bool>.value(true);
},
child: Scaffold(
resizeToAvoidBottomInset: false,
appBar: AppBar(
toolbarHeight: 60 * ratio,
leading: IconButton(
icon: const Icon(Icons.arrow_back, color: Colors.black),
onPressed: () {
Navigator.of(context).pop();
_generateWalletProvider.isAskedWordValid = false;
_generateWalletProvider.askedWordColor = Colors.black;
}),
title: const SizedBox(
height: 22,
child: Text('Enregistrer ce coffre'),
)),
body: Center(
child: Column(children: <Widget>[
const SizedBox(height: 15),
SizedBox(
width: 360,
child: Text(
'Quel est le ${_generateWalletProvider.nbrWord + 1}ème mot de votre phrase de restauration ?',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 17.0,
color: Colors.grey[600],
fontWeight: FontWeight.w400),
)),
TextFormField(
key: const Key('askedWord'),
focusNode: _wordFocus,
autofocus: true,
enabled: !_generateWalletProvider.isAskedWordValid,
controller: _inputRestoreWord,
textInputAction: TextInputAction.next,
onChanged: (value) {
_generateWalletProvider.checkAskedWord(
value, _mnemonicController.text);
},
maxLines: 1,
textAlign: TextAlign.center,
decoration: const InputDecoration(),
style: TextStyle(
fontSize: 30.0,
color: _generateWalletProvider.askedWordColor,
fontWeight: FontWeight.w500)),
const SizedBox(height: 12),
SizedBox(
width: 360,
child: Text(
'Choisissez un nom pour votre premier portefeuille :',
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 17.0,
color: Colors.grey[600],
fontWeight: FontWeight.w400),
)),
TextFormField(
key: const Key('walletName'),
focusNode: _generateWalletProvider.walletNameFocus,
inputFormatters: [
FilteringTextInputFormatter.allow(
RegExp('[A-Za-z|0-9|\\-|_| ]')),
],
controller: walletName,
textInputAction: TextInputAction.next,
onChanged: (v) {
_generateWalletProvider.nameChanged();
},
maxLines: 1,
textAlign: TextAlign.center,
decoration: const InputDecoration(),
style: const TextStyle(
fontSize: 30.0,
color: Colors.black,
fontWeight: FontWeight.w500)),
Expanded(
child: Align(
alignment: Alignment.bottomCenter,
child: SizedBox(
width: 200,
height: 50,
child: ElevatedButton(
key: const Key('confirmStorage'),
style: ElevatedButton.styleFrom(
elevation: 12,
primary: Colors
.green[400], //smoothYellow, // background
onPrimary: Colors.black, // foreground
),
onPressed: (_generateWalletProvider
.isAskedWordValid &&
walletName.text != '')
? () async {
final address = await _sub.importAccount(
fromMnemonic: true,
mnemonic: _generateWalletProvider
.generatedMnemonic!,
password: _generateWalletProvider
.pin.text
.toUpperCase(),
derivePath: '//2');
await _generateWalletProvider.storeHDWChest(
address,
'Mon portefeuille courant',
context);
_generateWalletProvider.isAskedWordValid =
false;
_generateWalletProvider.askedWordColor =
Colors.black;
_myWalletProvider.listWallets =
_myWalletProvider
.readAllWallets(_currentChest);
await Future.delayed(
const Duration(milliseconds: 50));
_myWalletProvider.rebuildWidget();
_generateWalletProvider.pin.text = '';
_generateWalletProvider
.mnemonicController.text = '';
Navigator.pushAndRemoveUntil(context,
MaterialPageRoute(builder: (context) {
return UnlockingWallet(
wallet: _myWalletProvider
.getDefaultWallet(),
action: "mywallets",
);
}), ModalRoute.withName('/'));
}
: null,
child: const Text('Confirmer',
style: TextStyle(fontSize: 28))),
))),
const SizedBox(height: 70),
Text('TRICHE PENDANT ALPHA: ' + _mnemonicController.text,
style: const TextStyle(
fontSize: 10.0,
color: Colors.black,
fontWeight: FontWeight.normal)),
]),
),
));
}
}

View File

@ -8,24 +8,18 @@ import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:flutter/material.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/myWallets/choose_chest.dart';
import 'package:gecko/screens/myWallets/choose_wallet.dart';
import 'package:gecko/screens/myWallets/wallets_home.dart';
import 'package:gecko/screens/transaction_in_progress.dart';
import 'package:pin_code_fields/pin_code_fields.dart';
import 'package:provider/provider.dart';
import 'package:gecko/globals.dart';
// ignore: must_be_immutable
class UnlockingWallet extends StatelessWidget {
UnlockingWallet(
{Key? keyUnlockWallet, required this.wallet, required this.action})
UnlockingWallet({Key? keyUnlockWallet, required this.wallet})
: super(key: keyUnlockWallet);
WalletData? wallet;
late int currentChestNumber;
late ChestData currentChest;
String action;
// ignore: close_sinks
StreamController<ErrorAnimationType>? errorController;
@ -43,6 +37,10 @@ class UnlockingWallet extends StatelessWidget {
currentChestNumber = configBox.get('currentChest');
currentChest = chestBox.get(currentChestNumber)!;
if (configBox.get('isCacheChecked') == null) {
configBox.put('isCacheChecked', true);
}
int _pinLenght = _walletOptions.getPinLenght(wallet!.number);
errorController = StreamController<ErrorAnimationType>();
@ -108,18 +106,41 @@ class UnlockingWallet extends StatelessWidget {
pinForm(context, _pinLenght),
SizedBox(height: 3 * ratio),
InkWell(
onTap: () {
_walletOptions.changePinCacheChoice();
},
child: Row(children: [
const SizedBox(height: 30),
const Spacer(),
Icon(
configBox.get('isCacheChecked')
? Icons.check_box
: Icons.check_box_outline_blank,
color: orangeC,
),
const SizedBox(width: 8),
Text(
'Garder ce code en mémoire 15 minutes',
style:
TextStyle(fontSize: 16, color: Colors.grey[700]),
),
const Spacer()
]),
),
const SizedBox(height: 10),
InkWell(
key: const Key('chooseChest'),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return ChooseChest(action: action);
return const ChooseChest();
}),
);
},
child: SizedBox(
width: 400,
height: 70,
height: 50,
child: Center(
child: Text(
'Changer de coffre',
@ -215,62 +236,8 @@ class UnlockingWallet extends StatelessWidget {
pinFocus.requestFocus();
} else {
pinColor = Colors.green[400];
switch (action) {
case "mywallets":
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return const WalletsHome();
}),
);
break;
case "changeWallet":
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return ChooseWalletScreen(
chest: currentChestNumber, pin: _pin.toUpperCase());
}),
);
break;
case "pay":
// Payment workflow !
WalletsProfilesProvider _walletViewProvider =
Provider.of<WalletsProfilesProvider>(context,
listen: false);
final acc = _sub.getCurrentWallet();
log.d(
"fromAddress: ${acc.address!},destAddress: ${_walletViewProvider.address!}, amount: ${double.parse(_walletViewProvider.payAmount.text)}, password: $_pin");
_sub.pay(
fromAddress: acc.address!,
destAddress: _walletViewProvider.address!,
amount:
double.parse(_walletViewProvider.payAmount.text),
password: _pin.toUpperCase());
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return const TransactionInProgress();
}),
);
break;
case "cert":
WalletsProfilesProvider _walletViewProvider =
Provider.of<WalletsProfilesProvider>(context,
listen: false);
final acc = _sub.getCurrentWallet();
_sub.certify(acc.address!, _pin.toUpperCase(),
_walletViewProvider.address!);
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return const TransactionInProgress(transType: 'cert');
}),
);
break;
}
_myWalletProvider.resetPinCode();
Navigator.pop(context, _pin.toUpperCase());
}
},
onChanged: (value) {

View File

@ -11,6 +11,7 @@ import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/myWallets/chest_options.dart';
import 'package:gecko/screens/myWallets/choose_chest.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/myWallets/wallet_options.dart';
import 'package:provider/provider.dart';
@ -32,7 +33,7 @@ class WalletsHome extends StatelessWidget {
return WillPopScope(
onWillPop: () {
myWalletProvider.pinCode = myWalletProvider.mnemonic = '';
// myWalletProvider.pinCode = myWalletProvider.mnemonic = '';
Navigator.popUntil(
context,
ModalRoute.withName('/'),
@ -47,7 +48,7 @@ class WalletsHome extends StatelessWidget {
leading: IconButton(
icon: const Icon(Icons.arrow_back, color: Colors.black),
onPressed: () {
myWalletProvider.pinCode = myWalletProvider.mnemonic = '';
// myWalletProvider.pinCode = myWalletProvider.mnemonic = '';
Navigator.popUntil(
context,
ModalRoute.withName('/'),
@ -350,8 +351,23 @@ class WalletsHome extends StatelessWidget {
key: const Key('addDerivation'),
onTap: () async {
if (!_myWalletProvider.isNewDerivationLoading) {
await _myWalletProvider.generateNewDerivation(
context, _newDerivationName);
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 != '') {
await _myWalletProvider.generateNewDerivation(
context, _newDerivationName);
}
}
},
child: Container(

View File

@ -58,7 +58,29 @@ class OnboardingStepTen extends StatelessWidget {
style: TextStyle(fontSize: 16 * ratio))
]),
SizedBox(height: isTall ? 80 : 20),
pinForm(context, _walletOptions, _pinLenght, 1, 2)
pinForm(context, _walletOptions, _pinLenght, 1, 2),
InkWell(
onTap: () {
_walletOptions.changePinCacheChoice();
},
child: Row(children: [
const SizedBox(height: 30),
const Spacer(),
Icon(
configBox.get('isCacheChecked')
? Icons.check_box
: Icons.check_box_outline_blank,
color: orangeC,
),
const SizedBox(width: 8),
Text(
'Garder ce code en mémoire 15 minutes',
style: TextStyle(fontSize: 16, color: Colors.grey[700]),
),
const Spacer()
]),
),
const SizedBox(height: 10),
]),
));
}
@ -144,6 +166,7 @@ class OnboardingStepTen extends StatelessWidget {
_myWalletProvider.rebuildWidget();
// });
_generateWalletProvider.generatedMnemonic = '';
_myWalletProvider.resetPinCode();
Navigator.push(
context,
FaderTransition(

View File

@ -86,9 +86,6 @@ class TransactionInProgress extends StatelessWidget {
_sub.transactionStatus = '';
Navigator.pop(context);
Navigator.pop(context);
if (transType == 'pay') {
Navigator.pop(context);
}
return Future<bool>.value(true);
},
child: Scaffold(
@ -191,9 +188,6 @@ class TransactionInProgress extends StatelessWidget {
onPressed: () {
Navigator.pop(context);
Navigator.pop(context);
if (transType == 'pay') {
Navigator.pop(context);
}
},
child: Text(
'Fermer',

View File

@ -9,7 +9,9 @@ import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/avatar_fullscreen.dart';
import 'package:gecko/screens/myWallets/choose_wallet.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/transaction_in_progress.dart';
import 'package:provider/provider.dart';
class WalletViewScreen extends StatelessWidget {
@ -125,18 +127,40 @@ class WalletViewScreen extends StatelessWidget {
image: AssetImage(
'assets/gecko_certify.png')),
),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return UnlockingWallet(
wallet: _defaultWallet,
action: "cert");
},
),
);
// _sub.certify(fromAddress, password, toAddress);
onTap: () async {
String? _pin;
if (_myWalletProvider.pinCode == '') {
_pin = await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(
wallet: defaultWallet);
},
),
);
}
if (_pin != null ||
_myWalletProvider.pinCode != '') {
WalletsProfilesProvider
_walletViewProvider =
Provider.of<WalletsProfilesProvider>(
context,
listen: false);
final acc = _sub.getCurrentWallet();
_sub.certify(
acc.address!,
_pin ?? _myWalletProvider.pinCode,
_walletViewProvider.address!);
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return const TransactionInProgress(
transType: 'cert');
}),
);
}
}),
),
),
@ -331,17 +355,29 @@ class WalletViewScreen extends StatelessWidget {
const SizedBox(height: 10),
Consumer<SubstrateSdk>(builder: (context, _sub, _) {
return InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return UnlockingWallet(
wallet: defaultWallet,
action: "changeWallet");
},
),
);
onTap: () async {
String? _pin;
if (_myWalletProvider.pinCode == '') {
_pin = await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(
wallet: defaultWallet);
},
),
);
}
if (_pin != null ||
_myWalletProvider.pinCode != '') {
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return ChooseWalletScreen(
pin: _pin ?? _myWalletProvider.pinCode);
}),
);
}
},
child: Container(
width: double.infinity,
@ -464,17 +500,50 @@ class WalletViewScreen extends StatelessWidget {
onPrimary: Colors.white, // foreground
),
onPressed: canValidate
? () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return UnlockingWallet(
wallet: defaultWallet,
action: "pay");
},
),
);
? () async {
String? _pin;
if (_myWalletProvider.pinCode == '') {
_pin = await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(
wallet: defaultWallet);
},
),
);
}
log.d(_pin);
if (_pin != null ||
_myWalletProvider.pinCode != '') {
// Payment workflow !
WalletsProfilesProvider
_walletViewProvider =
Provider.of<WalletsProfilesProvider>(
context,
listen: false);
SubstrateSdk _sub =
Provider.of<SubstrateSdk>(context,
listen: false);
final acc = _sub.getCurrentWallet();
log.d(
"fromAddress: ${acc.address!},destAddress: ${_walletViewProvider.address!}, amount: ${double.parse(_walletViewProvider.payAmount.text)}, password: $_pin");
_sub.pay(
fromAddress: acc.address!,
destAddress:
_walletViewProvider.address!,
amount: double.parse(
_walletViewProvider
.payAmount.text),
password: _pin ??
_myWalletProvider.pinCode);
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return const TransactionInProgress();
}),
);
}
}
: null,
child: const Text(

Binary file not shown.

View File

@ -253,6 +253,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
cron:
dependency: "direct main"
description:
name: cron
url: "https://pub.dartlang.org"
source: hosted
version: "0.5.0"
cross_file:
dependency: transitive
description:

View File

@ -5,7 +5,7 @@ description: Pay with G1.
# pub.dev using `pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 0.0.7+7
version: 0.0.7+8
environment:
sdk: '>=2.12.0 <3.0.0'
@ -81,6 +81,7 @@ dependencies:
ref: fixAndroidActivityVersion
dots_indicator: ^2.1.0
web_socket_channel: ^2.2.0
cron: ^0.5.0
dev_dependencies:
# flutter_launcher_icons: ^0.9.2