Fix most of bugs, still some

This commit is contained in:
poka 2021-12-20 21:33:03 +01:00
parent 2c67307399
commit 323d1ebee7
17 changed files with 349 additions and 276 deletions

View File

@ -43,18 +43,24 @@ import 'package:flutter/foundation.dart';
import 'package:responsive_framework/responsive_framework.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:window_size/window_size.dart';
const bool enableSentry = true;
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
if (Platform.isWindows || Platform.isLinux || Platform.isMacOS) {
setWindowTitle('Ğecko');
setWindowMinSize(const Size(600, 800));
setWindowMaxSize(const Size(800, 1000));
}
HomeProvider _homeProvider = HomeProvider();
await _homeProvider.initHive();
appVersion = await _homeProvider.getAppVersion();
prefs = await SharedPreferences.getInstance();
// Configure Hive and open boxes
await Hive.initFlutter();
Hive.registerAdapter(WalletDataAdapter());
Hive.registerAdapter(ChestDataAdapter());
Hive.registerAdapter(G1WalletsListAdapter());

View File

@ -103,7 +103,7 @@ class CesiumPlusProvider with ChangeNotifier {
}
Future<Image> getAvatar(String _pubkey, double size) async {
if (g1WalletsBox.get(_pubkey).avatar != null) {
if (g1WalletsBox.get(_pubkey)?.avatar != null) {
return g1WalletsBox.get(_pubkey).avatar;
}
var dio = Dio();

View File

@ -1,6 +1,5 @@
import 'package:durt/durt.dart';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:gecko/globals.dart';
class ChangePinProvider with ChangeNotifier {
@ -8,23 +7,23 @@ class ChangePinProvider with ChangeNotifier {
TextEditingController newPin = TextEditingController();
String pinToGive;
Future<NewWallet> get badWallet => null;
NewWallet get badWallet => null;
Future<NewWallet> changePin(String _oldPin) async {
NewWallet changePin(String _oldPin, {String newCustomPin}) {
try {
final _dewif = chestBox.get(configBox.get('currentChest')).dewif;
NewWallet newWalletFile = Dewif().changePassword(
dewif: _dewif,
oldPassword: _oldPin.toUpperCase(),
);
dewif: _dewif,
oldPassword: _oldPin.toUpperCase(),
newPassword: newCustomPin);
newPin.text = pinToGive = newWalletFile.password;
ischangedPin = true;
notifyListeners();
// notifyListeners();
return newWalletFile;
} catch (e) {
log.e('Impossible de changer le code PIN.');
log.e('Impossible de changer le code PIN: $e');
return badWallet;
}
}

View File

@ -37,6 +37,7 @@ class GenerateWalletsProvider with ChangeNotifier {
bool isCesiumIDVisible = false;
bool isCesiumPWDVisible = false;
bool canImport = false;
CesiumWallet cesiumWallet;
// Import Chest
TextEditingController cellController0 = TextEditingController();
@ -171,7 +172,6 @@ class GenerateWalletsProvider with ChangeNotifier {
}
String changePinCode({bool reload}) {
pin.text = randomSecretCode(5);
if (reload) {
notifyListeners();
@ -219,17 +219,14 @@ class GenerateWalletsProvider with ChangeNotifier {
Future<void> generateCesiumWalletPubkey(
String _cesiumID, String _cesiumPWD) async {
var cesiumWallet = CesiumWallet(_cesiumID, _cesiumPWD);
actualWallet =
Dewif().generateCesiumDewif(cesiumWallet.seed, randomSecretCode(5));
cesiumWallet = CesiumWallet(_cesiumID, _cesiumPWD);
String _walletPubkey = cesiumWallet.pubkey;
cesiumPubkey.text = _walletPubkey;
pin.text = actualWallet.password;
log.d(_walletPubkey);
}
Future importCesiumWallet() async {
Future<int> importCesiumWallet() async {
// String _walletPubkey = await DubpRust.getLegacyPublicKey(
// salt: _cesiumID, password: _cesiumPWD);
// String shortPubkey = truncate(_walletPubkey, 9,
@ -242,7 +239,6 @@ class GenerateWalletsProvider with ChangeNotifier {
cesiumPWD.text = '';
cesiumPubkey.text = '';
canImport = false;
pin.text = '';
isCesiumIDVisible = false;
isCesiumPWDVisible = false;
@ -260,8 +256,12 @@ class GenerateWalletsProvider with ChangeNotifier {
chestName = 'Coffre à Césium ${chestNumber + 1}';
}
log.d(pin.text);
NewWallet cesiumDewif =
Dewif().generateCesiumDewif(cesiumWallet.seed, pin.text);
ChestData cesiumChest = ChestData(
dewif: actualWallet.dewif,
dewif: cesiumDewif.dewif,
name: chestName,
imageName: 'cesium.png',
defaultWallet: 0,
@ -272,7 +272,8 @@ class GenerateWalletsProvider with ChangeNotifier {
// chestBox.toMap().
await configBox.put('currentChest', chestKey);
notifyListeners();
pin.text = '';
return chestKey;
}
void cesiumIDisVisible() {

View File

@ -9,8 +9,10 @@ import 'dart:async';
import 'package:gecko/globals.dart';
import 'package:gecko/screens/old_history_pay.dart';
import 'package:gecko/screens/myWallets/wallets_home.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:package_info/package_info.dart';
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:path_provider/path_provider.dart' as pp;
class HomeProvider with ChangeNotifier {
int _currentIndex = 0;
@ -32,6 +34,25 @@ class HomeProvider with ChangeNotifier {
notifyListeners();
}
Future<void> initHive() async {
Directory hivePath;
if (Platform.isLinux || Platform.isMacOS) {
final home = Platform.environment['HOME'];
hivePath = Directory('$home/.gecko/db');
} else if (Platform.isWindows) {
final home = Platform.environment['UserProfile'];
hivePath = Directory('$home/.gecko/db');
} else if (Platform.isAndroid || Platform.isIOS || kIsWeb) {
final home = await pp.getApplicationDocumentsDirectory();
hivePath = Directory('${home.path}/db');
}
if (!await hivePath.exists()) {
await hivePath.create(recursive: true);
}
await Hive.initFlutter(hivePath.path);
}
Future<String> getAppVersion() async {
String version;
String buildNumber;

View File

@ -1,6 +1,4 @@
// import 'dart:ffi';
import 'dart:io';
import 'dart:typed_data';
import 'package:crypto/crypto.dart';
import 'package:durt/durt.dart';
import 'package:fast_base58/fast_base58.dart';
@ -12,7 +10,6 @@ import 'package:gecko/models/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:image_picker/image_picker.dart';
import 'package:truncate/truncate.dart';
import 'package:qrscan/qrscan.dart' as scanner;
class WalletOptionsProvider with ChangeNotifier {
TextEditingController pubkey = TextEditingController();
@ -30,7 +27,6 @@ class WalletOptionsProvider with ChangeNotifier {
String _getPubkeyFromDewif(
String _dewif, _pin, int _pinLenght, int derivation) {
String _pubkey;
RegExp regExp = RegExp(
r'^[A-Z0-9]+$',
caseSensitive: false,
@ -44,12 +40,11 @@ class WalletOptionsProvider with ChangeNotifier {
if (derivation != -1) {
try {
final _wallet = HdWallet.fromDewif(_dewif, _pin);
_pubkey = _wallet.getPubkey(derivation);
log.d(_pubkey);
pubkey.text = _pubkey;
pubkey.text = _wallet.getPubkey(derivation);
log.d(pubkey.text);
notifyListeners();
return _pubkey;
return pubkey.text;
} catch (e) {
log.w('Bad PIN code !\n' + e);
notifyListeners();
@ -58,10 +53,9 @@ class WalletOptionsProvider with ChangeNotifier {
}
} else {
try {
_pubkey = CesiumWallet.fromDewif(_dewif, _pin).pubkey;
pubkey.text = _pubkey;
pubkey.text = CesiumWallet.fromDewif(_dewif, _pin).pubkey;
notifyListeners();
return _pubkey;
return pubkey.text;
} catch (e) {
log.w('Bad PIN code !\n' + e);
notifyListeners();
@ -83,10 +77,14 @@ class WalletOptionsProvider with ChangeNotifier {
'false') {
pubkey.text = _localPubkey;
isWalletUnlock = true;
log.d(pubkey.text);
return _localDewif;
} else {
throw 'Bad pubkey';
}
} on ChecksumException catch (e) {
log.e(e.cause);
return 'bad';
} catch (e) {
// _homeProvider.playSound('non', 0.6);
log.e('ERROR READING FILE: $e');
@ -202,7 +200,6 @@ class WalletOptionsProvider with ChangeNotifier {
}
String getShortPubkey(String pubkey) {
log.d(pubkey);
List<int> pubkeyByte = Base58Decode(pubkey);
Digest pubkeyS256 = sha256.convert(sha256.convert(pubkeyByte).bytes);
String pubkeyCheksum = Base58Encode(pubkeyS256.bytes);
@ -223,10 +220,6 @@ class WalletOptionsProvider with ChangeNotifier {
notifyListeners();
}
Future<Uint8List> generateQRcode(String _pubkey) async {
return await scanner.generateBarCode(_pubkey);
}
Future changeAvatar() async {
File _image;
final picker = ImagePicker();

View File

@ -1,3 +1,5 @@
import 'dart:io';
import 'package:durt/durt.dart';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
@ -33,7 +35,9 @@ class WalletsProfilesProvider with ChangeNotifier {
int nPage = 1;
Future scan(context) async {
await Permission.camera.request();
if (Platform.isAndroid || Platform.isIOS) {
await Permission.camera.request();
}
String barcode;
try {
barcode = await scanner.scan();
@ -205,8 +209,6 @@ class WalletsProfilesProvider with ChangeNotifier {
} else if (nPage == 2) {
nRepositories = 100;
}
log.d(nPage);
log.d(nRepositories);
nPage++;
if (fetchMoreCursor != null) {

View File

@ -72,7 +72,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
},
),
builder: (QueryResult result, {fetchMore, refetch}) {
if (result.isLoading && result.data == null) {
if (result.isLoading && result?.data == null) {
return const Center(
child: CircularProgressIndicator(),
);
@ -87,7 +87,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
style: TextStyle(fontSize: 18),
)
]);
} else if (result.data == null) {
} else if (result?.data == null) {
return Column(children: const <Widget>[
SizedBox(height: 50),
Text(
@ -97,7 +97,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
]);
}
if (result.data['balance'] == null) {
if (result?.data['balance'] == null) {
_historyProvider.balance = 0.0;
} else {
_historyProvider.balance = _historyProvider
@ -124,7 +124,9 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
if (t is ScrollEndNotification &&
scrollController.position.pixels >=
scrollController.position.maxScrollExtent * 0.7 &&
_historyProvider.pageInfo['hasPreviousPage']) {
_historyProvider.pageInfo['hasPreviousPage'] &&
result.isNotLoading) {
log.d('FETCHMORE !!');
fetchMore(opts);
}
return true;
@ -295,8 +297,8 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
}
if (_avatar.hasData) {
g1WalletsBox.get(repository[2]).avatar =
_avatar.data;
return ClipOval(child: _avatar.data);
_avatar?.data;
return ClipOval(child: _avatar?.data);
} else {
g1WalletsBox.get(repository[2]).avatar =
_cesiumPlusProvider
@ -427,8 +429,8 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
{VoidCallback refetch, FetchMore fetchMore}) {
if (result.isLoading || result.hasException) {
return const Text('...');
} else if (result.data['idty'] == null ||
result.data['idty']['username'] == null) {
} else if (result?.data['idty'] == null ||
result?.data['idty']['username'] == null) {
return const Text('');
} else {
return SizedBox(
@ -466,7 +468,7 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
return const Text('...');
}
return Text(
"${_balance.data.toString()} Ğ1",
"${_balance?.data.toString()} Ğ1",
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 22, fontWeight: FontWeight.w500),
@ -506,13 +508,13 @@ class HistoryScreen extends StatelessWidget with ChangeNotifier {
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return AvatarFullscreen(_avatar.data);
return AvatarFullscreen(_avatar?.data);
}),
);
},
child: ClipOval(
child: Image(
image: _avatar.data.image,
image: _avatar?.data?.image,
height: _avatarSize,
fit: BoxFit.cover,
),

View File

@ -13,6 +13,7 @@ import 'package:gecko/screens/myWallets/change_pin.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:provider/provider.dart';
import 'package:flutter/services.dart';
import 'package:qr_flutter/qr_flutter.dart';
int _nbrLinesName = 1;
bool _isNewNameValid = false;
@ -262,15 +263,11 @@ class CesiumWalletOptions extends StatelessWidget {
);
}),
SizedBox(height: 4 * ratio),
FutureBuilder(
future:
_walletOptions.generateQRcode(_walletOptions.pubkey.text),
builder: (context, snapshot) {
return snapshot.data != null
? Image.memory(snapshot.data,
height: isTall ? 300 : 270)
: const Text('-', style: TextStyle(fontSize: 20));
}),
QrImage(
data: _walletOptions.pubkey.text,
version: QrVersions.auto,
size: isTall ? 300 : 270,
),
SizedBox(height: 15 * ratio),
GestureDetector(
key: const Key('copyPubkey'),

View File

@ -17,7 +17,6 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
final String walletName;
final MyWalletsProvider walletProvider;
Directory appPath;
NewWallet _newWalletFile;
@override
Widget build(BuildContext context) {
@ -49,9 +48,8 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
child: SafeArea(
child: Column(children: <Widget>[
StatefulWrapper(
onInit: () async {
_newWalletFile =
await _changePin.changePin(walletProvider.pinCode);
onInit: () {
_changePin.newPin.text = randomSecretCode(5);
},
child: Container(),
),
@ -82,8 +80,7 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
icon: const Icon(Icons.replay),
color: orangeC,
onPressed: () async {
_newWalletFile =
await _changePin.changePin(walletProvider.pinCode);
_changePin.newPin.text = randomSecretCode(5);
},
),
],
@ -98,13 +95,14 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
primary: Colors.green[400], //smoothYellow, // background
onPrimary: Colors.black, // foreground
),
onPressed: _changePin.newPin.text != ''
? () {
_changePin.newPin.text = '';
_changePin.storeNewPinChest(context, _newWalletFile);
walletProvider.pinCode = _changePin.newPin.text;
}
: null,
onPressed: () {
NewWallet _newWalletFile = _changePin.changePin(
walletProvider.pinCode,
newCustomPin: _changePin.newPin.text);
_changePin.newPin.text = '';
_changePin.storeNewPinChest(context, _newWalletFile);
walletProvider.pinCode = _changePin.newPin.text;
},
child: const Text(
'Confirmer',
style: TextStyle(fontSize: 28),

View File

@ -69,8 +69,10 @@ class ChestOptions extends StatelessWidget {
height: 25,
),
const SizedBox(width: 18),
const Text('Changer mon code secret',
style: TextStyle(fontSize: 20, color: Colors.black)),
const Text(
'Changer mon code secret',
style: TextStyle(fontSize: 20, color: Colors.black),
),
])),
),
SizedBox(height: 10 * ratio),

View File

@ -1,3 +1,4 @@
import 'package:durt/durt.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/generate_wallets.dart';
@ -26,6 +27,13 @@ class GenerateFastChestScreen extends StatelessWidget {
GenerateWalletsProvider _generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context);
if (_generateWalletProvider.mnemonicController.text == '') {
_generateWalletProvider.generateWordList();
_generateWalletProvider.mnemonicController.text =
_generateWalletProvider.generatedMnemonic;
_generateWalletProvider.pin.text = randomSecretCode(5);
}
return Scaffold(
appBar: AppBar(
toolbarHeight: 60 * ratio,
@ -39,7 +47,11 @@ class GenerateFastChestScreen extends StatelessWidget {
child: FittedBox(
child: FloatingActionButton(
heroTag: "buttonGenerateWallet",
onPressed: () => _generateWalletProvider.generateWordList(),
onPressed: () {
_generateWalletProvider.generateWordList();
_generateWalletProvider.mnemonicController.text =
_generateWalletProvider.generatedMnemonic;
},
child: SizedBox(
height: 40.0,
width: 40.0,
@ -87,8 +99,7 @@ class GenerateFastChestScreen extends StatelessWidget {
icon: const Icon(Icons.replay),
color: orangeC,
onPressed: () {
_generateWalletProvider.changePinCode(
reload: true);
_generateWalletProvider.changePinCode(reload: true);
},
),
],
@ -104,6 +115,12 @@ class GenerateFastChestScreen extends StatelessWidget {
? () async {
_generateWalletProvider.nbrWord =
_generateWalletProvider.getRandomInt();
_generateWalletProvider.actualWallet = Dewif()
.generateDewif(
_generateWalletProvider
.generatedMnemonic,
_generateWalletProvider.pin.text,
lang: 'french');
await Navigator.push(
context,
MaterialPageRoute(builder: (context) {
@ -115,19 +132,6 @@ class GenerateFastChestScreen extends StatelessWidget {
.actualWallet);
}),
);
await Future.delayed(
const Duration(milliseconds: 20));
// if (_generateWalletProvider.hasBeenStored) {
// _generateWalletProvider.hasBeenStored = false;
// await Navigator.pushAndRemoveUntil(context,
// MaterialPageRoute(builder: (context) {
// return UnlockingWallet(
// wallet: _myWalletClass.getDefaultWallet(
// configBox.get('currentChest')),
// action: "mywallets",
// );
// }), ModalRoute.withName('/'));
// }
}
: null,
child: const Text('Enregistrer ce trousseau',

View File

@ -1,10 +1,12 @@
import 'dart:async';
import 'package:durt/durt.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/generate_wallets.dart';
import 'package:flutter/material.dart';
import 'package:gecko/models/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/wallet_options.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:provider/provider.dart';
class ImportWalletScreen extends StatelessWidget {
@ -16,173 +18,190 @@ class ImportWalletScreen extends StatelessWidget {
GlobalKey _toolTipSecret = GlobalKey();
Timer _debounce;
GenerateWalletsProvider _generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context);
MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context);
Provider.of<GenerateWalletsProvider>(context, listen: false);
WalletOptionsProvider _walletOptions =
Provider.of<WalletOptionsProvider>(context);
Provider.of<WalletOptionsProvider>(context, listen: false);
_generateWalletProvider.pin.text = randomSecretCode(5);
return WillPopScope(
onWillPop: () {
_generateWalletProvider.resetCesiumImportView();
return Future<bool>.value(true);
},
child: Scaffold(
appBar: AppBar(
toolbarHeight: 60 * ratio,
leading: IconButton(
icon: const Icon(Icons.arrow_back, color: Colors.black),
onWillPop: () {
_generateWalletProvider.resetCesiumImportView();
return Future<bool>.value(true);
},
child: Scaffold(
appBar: AppBar(
toolbarHeight: 60 * ratio,
leading: IconButton(
icon: const Icon(Icons.arrow_back, color: Colors.black),
onPressed: () {
_generateWalletProvider.resetCesiumImportView();
Navigator.of(context).pop();
}),
title: const SizedBox(
height: 22,
child: Text('Importer un portefeuille'),
)),
body: Builder(
builder: (ctx) => SafeArea(
child: Column(children: <Widget>[
const SizedBox(height: 20),
Consumer<GenerateWalletsProvider>(
builder: (context, walletProvider, _) {
return TextFormField(
autofocus: true,
onChanged: (text) {
if (_debounce?.isActive ?? false) {
_debounce.cancel();
}
_debounce = Timer(const Duration(milliseconds: 200), () {
walletProvider
.generateCesiumWalletPubkey(
text, walletProvider.cesiumPWD.text)
.then((value) {
walletProvider.canImport = true;
walletProvider.reloadBuild();
});
});
},
keyboardType: TextInputType.text,
controller: walletProvider.cesiumID,
obscureText: !walletProvider
.isCesiumIDVisible, //This will obscure text dynamically
decoration: InputDecoration(
hintText: 'Entrez votre identifiant Cesium',
suffixIcon: IconButton(
icon: Icon(
walletProvider.isCesiumIDVisible
? Icons.visibility
: Icons.visibility_off,
color: Colors.black,
),
onPressed: () {
walletProvider.cesiumIDisVisible();
},
),
),
);
}),
const SizedBox(height: 15),
Consumer<GenerateWalletsProvider>(
builder: (context, walletProvider, _) {
return TextFormField(
onChanged: (text) {
if (_debounce?.isActive ?? false) {
_debounce.cancel();
}
_debounce = Timer(const Duration(milliseconds: 200), () {
walletProvider
.generateCesiumWalletPubkey(
walletProvider.cesiumID.text, text)
.then((value) {
walletProvider.canImport = true;
walletProvider.reloadBuild();
});
});
},
keyboardType: TextInputType.text,
controller: walletProvider.cesiumPWD,
obscureText: !walletProvider
.isCesiumPWDVisible, //This will obscure text dynamically
decoration: InputDecoration(
hintText: 'Entrez votre mot de passe Cesium',
suffixIcon: IconButton(
icon: Icon(
walletProvider.isCesiumPWDVisible
? Icons.visibility
: Icons.visibility_off,
color: Colors.black,
),
onPressed: () {
walletProvider.cesiumPWDisVisible();
},
),
),
);
}),
const SizedBox(height: 15),
GestureDetector(
onTap: () {
Clipboard.setData(ClipboardData(
text: _generateWalletProvider.cesiumPubkey.text));
_walletOptions.snackCopyKey(ctx);
},
child: Consumer<GenerateWalletsProvider>(
builder: (context, walletProvider, _) {
return Text(
_generateWalletProvider.cesiumPubkey.text,
style: const TextStyle(
fontSize: 14.0,
color: Colors.black,
fontWeight: FontWeight.bold,
fontFamily: 'Monospace'),
);
}),
),
const SizedBox(height: 20),
toolTips(_toolTipSecret, 'Code secret:',
"Retenez bien votre code secret, il vous sera demandé à chaque paiement, ainsi que pour configurer votre portefeuille"),
Stack(
alignment: Alignment.centerRight,
children: <Widget>[
TextField(
enabled: false,
controller: _generateWalletProvider.pin,
maxLines: 1,
textAlign: TextAlign.center,
decoration: const InputDecoration(),
style: const TextStyle(
fontSize: 30.0,
color: Colors.black,
fontWeight: FontWeight.bold)),
IconButton(
icon: const Icon(Icons.replay),
color: orangeC,
onPressed: () {
_generateWalletProvider.resetCesiumImportView();
Navigator.of(context).pop();
}),
title: const SizedBox(
height: 22,
child: Text('Importer un portefeuille'),
)),
body: Builder(
builder: (ctx) => SafeArea(
child: Column(children: <Widget>[
const SizedBox(height: 20),
TextFormField(
onChanged: (text) {
if (_debounce?.isActive ?? false) {
_debounce.cancel();
}
_debounce =
Timer(const Duration(milliseconds: 200), () {
_generateWalletProvider
.generateCesiumWalletPubkey(text,
_generateWalletProvider.cesiumPWD.text)
.then((value) {
_generateWalletProvider.canImport = true;
_generateWalletProvider.reloadBuild();
});
});
},
keyboardType: TextInputType.text,
controller: _generateWalletProvider.cesiumID,
obscureText: !_generateWalletProvider
.isCesiumIDVisible, //This will obscure text dynamically
decoration: InputDecoration(
hintText: 'Entrez votre identifiant Cesium',
suffixIcon: IconButton(
icon: Icon(
_generateWalletProvider.isCesiumIDVisible
? Icons.visibility
: Icons.visibility_off,
color: Colors.black,
),
onPressed: () {
_generateWalletProvider.cesiumIDisVisible();
},
),
),
),
const SizedBox(height: 15),
TextFormField(
onChanged: (text) {
if (_debounce?.isActive ?? false) {
_debounce.cancel();
}
_debounce =
Timer(const Duration(milliseconds: 200), () {
_generateWalletProvider
.generateCesiumWalletPubkey(
_generateWalletProvider.cesiumID.text,
text)
.then((value) {
_generateWalletProvider.canImport = true;
_generateWalletProvider.reloadBuild();
});
});
},
keyboardType: TextInputType.text,
controller: _generateWalletProvider.cesiumPWD,
obscureText: !_generateWalletProvider
.isCesiumPWDVisible, //This will obscure text dynamically
decoration: InputDecoration(
hintText: 'Entrez votre mot de passe Cesium',
suffixIcon: IconButton(
icon: Icon(
_generateWalletProvider.isCesiumPWDVisible
? Icons.visibility
: Icons.visibility_off,
color: Colors.black,
),
onPressed: () {
_generateWalletProvider.cesiumPWDisVisible();
},
),
),
),
const SizedBox(height: 15),
GestureDetector(
onTap: () {
Clipboard.setData(ClipboardData(
text: _generateWalletProvider
.cesiumPubkey.text));
_walletOptions.snackCopyKey(ctx);
},
child: Text(
_generateWalletProvider.cesiumPubkey.text,
style: const TextStyle(
fontSize: 14.0,
color: Colors.black,
fontWeight: FontWeight.bold,
fontFamily: 'Monospace'),
)),
const SizedBox(height: 20),
toolTips(_toolTipSecret, 'Code secret:',
"Retenez bien votre code secret, il vous sera demandé à chaque paiement, ainsi que pour configurer votre portefeuille"),
Stack(
alignment: Alignment.centerRight,
children: <Widget>[
TextField(
enabled: false,
controller: _generateWalletProvider.pin,
maxLines: 1,
textAlign: TextAlign.center,
decoration: const InputDecoration(),
style: const TextStyle(
fontSize: 30.0,
color: Colors.black,
fontWeight: FontWeight.bold)),
IconButton(
icon: const Icon(Icons.replay),
color: orangeC,
onPressed: () {
_generateWalletProvider.changePinCode(
reload: true);
},
),
],
),
const SizedBox(height: 30),
ElevatedButton(
style: ElevatedButton.styleFrom(
primary: yellowC, // background
onPrimary: Colors.black, // foreground
),
onPressed: _generateWalletProvider.canImport
? () {
_generateWalletProvider
.importCesiumWallet()
.then((value) {
_myWalletProvider.rebuildWidget();
_generateWalletProvider
.resetCesiumImportView();
Navigator.popUntil(
context,
ModalRoute.withName('/'),
);
});
}
: null,
child: const Text('Importer ce portefeuille Cesium',
style: TextStyle(fontSize: 20))),
]),
))));
_generateWalletProvider.changePinCode(reload: true);
},
),
],
),
const SizedBox(height: 30),
Consumer<GenerateWalletsProvider>(
builder: (context, walletProvider, _) {
return ElevatedButton(
style: ElevatedButton.styleFrom(
primary: yellowC, // background
onPrimary: Colors.black, // foreground
),
onPressed: walletProvider.canImport
? () async {
final chestKey =
await walletProvider.importCesiumWallet();
walletProvider.reloadBuild();
await Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (context) {
return UnlockingWallet(
wallet: WalletData(chest: chestKey),
action: "mywallets",
);
}),
ModalRoute.withName('/'),
);
}
: null,
child: const Text(
'Importer ce portefeuille Cesium',
style: TextStyle(fontSize: 20),
),
);
}),
]),
),
),
),
);
}
Widget toolTips(_key, _text, _message) {

View File

@ -11,6 +11,7 @@ import 'package:gecko/screens/history.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:provider/provider.dart';
import 'package:flutter/services.dart';
import 'package:qr_flutter/qr_flutter.dart';
// ignore: must_be_immutable
class WalletOptions extends StatelessWidget {
@ -27,10 +28,11 @@ class WalletOptions extends StatelessWidget {
Provider.of<WalletOptionsProvider>(context, listen: false);
WalletsProfilesProvider _historyProvider =
Provider.of<WalletsProfilesProvider>(context, listen: false);
MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context);
log.d(_walletOptions.pubkey.text);
final int _currentChest = _myWalletProvider.getCurrentChest();
final String shortPubkey =
_walletOptions.getShortPubkey(_walletOptions.pubkey.text);
@ -278,14 +280,10 @@ class WalletOptions extends StatelessWidget {
);
}),
SizedBox(height: 4 * ratio),
FutureBuilder(
future:
_walletOptions.generateQRcode(_walletOptions.pubkey.text),
builder: (context, snapshot) {
return snapshot.data != null
? Image.memory(snapshot.data, height: isTall ? 300 : 270)
: const Text('-', style: TextStyle(fontSize: 20));
},
QrImage(
data: _walletOptions.pubkey.text,
version: QrVersions.auto,
size: isTall ? 300 : 270,
),
SizedBox(height: 15 * ratio),
Consumer<WalletOptionsProvider>(

View File

@ -4,7 +4,6 @@ import 'package:gecko/models/chest_data.dart';
import 'package:gecko/models/my_wallets.dart';
import 'package:gecko/models/queries.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/wallet_options.dart';
import 'package:flutter/material.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/myWallets/chest_options.dart';
@ -128,8 +127,6 @@ class WalletsHome extends StatelessWidget {
Widget myWalletsTiles(BuildContext context) {
MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context);
WalletOptionsProvider _walletOptions =
Provider.of<WalletOptionsProvider>(context);
final bool isWalletsExists = _myWalletProvider.checkIfWalletExist();
@ -166,17 +163,14 @@ class WalletsHome extends StatelessWidget {
padding: const EdgeInsets.all(16),
child: GestureDetector(
onTap: () {
_walletOptions.readLocalWallet(
context,
_repository,
_myWalletProvider.pinCode,
_myWalletProvider.pinLenght);
Navigator.push(
context,
SmoothTransition(
page: WalletOptions(
context,
SmoothTransition(
page: WalletOptions(
wallet: _repository,
)));
),
),
);
// Navigator.push(context,
// MaterialPageRoute(builder: (context) {

View File

@ -281,6 +281,13 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "0.5.6"
desktop_window:
dependency: "direct main"
description:
name: desktop_window
url: "https://pub.dartlang.org"
source: hosted
version: "0.4.0"
dio:
dependency: "direct main"
description:
@ -814,7 +821,7 @@ packages:
name: permission_handler
url: "https://pub.dartlang.org"
source: hosted
version: "8.1.6"
version: "8.3.0"
permission_handler_platform_interface:
dependency: transitive
description:
@ -920,6 +927,20 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
qr_code_scanner:
dependency: "direct main"
description:
name: qr_code_scanner
url: "https://pub.dartlang.org"
source: hosted
version: "0.6.1"
qr_flutter:
dependency: "direct main"
description:
name: qr_flutter
url: "https://pub.dartlang.org"
source: hosted
version: "4.0.0"
qrscan:
dependency: "direct main"
description:
@ -1233,6 +1254,15 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.10"
window_size:
dependency: "direct main"
description:
path: "plugins/window_size"
ref: HEAD
resolved-ref: "03d957e8b5c99fc83cd4a781031b154ab3de8753"
url: "git://github.com/google/flutter-desktop-embedding.git"
source: git
version: "0.1.0"
xdg_directories:
dependency: transitive
description:

View File

@ -15,6 +15,10 @@ dependencies:
sdk: flutter
flutter_driver:
sdk: flutter
window_size:
git:
url: git://github.com/google/flutter-desktop-embedding.git
path: plugins/window_size
assorted_layout_widgets: ^5.2.1
bubble: ^1.2.1
carousel_slider: ^4.0.0
@ -38,11 +42,13 @@ dependencies:
package_info: ^2.0.2
path_provider: ^2.0.3
pdf: ^3.5.0
permission_handler: 8.1.6
permission_handler: ^8.3.0
pin_code_fields: ^7.3.0
printing: ^5.6.0
provider: ^6.0.1
qrscan: ^0.3.2
qr_code_scanner: ^0.6.1
qr_flutter: ^4.0.0
responsive_builder: ^0.4.1
responsive_framework: ^0.1.4
sentry: ^6.0.0
@ -56,6 +62,7 @@ dependencies:
xml: ^5.3.0
pull_to_refresh: ^2.0.0
dio: ^4.0.4
desktop_window: ^0.4.0
durt: ^0.1.4
flutter_icons: