Complete refactoring of unlocking chests; Can cache pin code 15 minutes
This commit is contained in:
parent
d91d2cddb3
commit
8c1383bdd4
|
@ -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'
|
||||
|
|
|
@ -77,6 +77,8 @@ Future<void> main() async {
|
|||
|
||||
HttpOverrides.global = MyHttpOverrides();
|
||||
|
||||
|
||||
|
||||
if (kReleaseMode && enableSentry) {
|
||||
// CatcherOptions debugOptions = CatcherOptions(DialogReportMode(), [
|
||||
// SentryHandler(SentryClient(SentryOptions(
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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();
|
||||
}),
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
]),
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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')));
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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);
|
||||
},
|
||||
|
|
|
@ -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)),
|
||||
]),
|
||||
),
|
||||
));
|
||||
}
|
||||
}
|
|
@ -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) {
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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(
|
||||
|
|
BIN
output.zip
BIN
output.zip
Binary file not shown.
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue