WIP: remplace file storage with Hive boxes storage

This commit is contained in:
poka 2021-11-07 04:23:05 +01:00
parent 5296ab107b
commit 0c55cdc141
18 changed files with 329 additions and 291 deletions

View File

@ -1,19 +1,20 @@
import 'dart:io'; import 'dart:io';
import 'package:gecko/models/myWallets.dart'; import 'package:gecko/models/walletData.dart';
import 'package:hive/hive.dart';
import 'package:logger/logger.dart'; import 'package:logger/logger.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
// Files paths // Files paths
Directory appPath; Directory appPath;
Directory walletsDirectory;
File defaultWalletFile;
File currentChestFile;
WalletData defaultWallet; WalletData defaultWallet;
String appVersion; String appVersion;
SharedPreferences prefs; SharedPreferences prefs;
String endPointGVA; String endPointGVA;
int ramSys; int ramSys;
Box<WalletData> walletBox;
Box chestBox;
Box configBox;
// String cesiumPod = "https://g1.data.le-sou.org"; // String cesiumPod = "https://g1.data.le-sou.org";
String cesiumPod = "https://g1.data.e-is.pro"; String cesiumPod = "https://g1.data.e-is.pro";

View File

@ -22,13 +22,15 @@ import 'package:gecko/models/generateWallets.dart';
import 'package:gecko/models/history.dart'; import 'package:gecko/models/history.dart';
import 'package:gecko/models/home.dart'; import 'package:gecko/models/home.dart';
import 'package:gecko/models/myWallets.dart'; import 'package:gecko/models/myWallets.dart';
import 'package:gecko/models/walletData.dart';
import 'package:gecko/models/walletOptions.dart'; import 'package:gecko/models/walletOptions.dart';
import 'package:gecko/screens/home.dart'; import 'package:gecko/screens/home.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/screens/myWallets/walletsHome.dart'; import 'package:gecko/screens/myWallets/walletsHome.dart';
import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:hive/hive.dart'; import 'package:hive_flutter/hive_flutter.dart';
import 'package:path_provider/path_provider.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:responsive_framework/responsive_framework.dart'; import 'package:responsive_framework/responsive_framework.dart';
@ -41,16 +43,18 @@ Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
HomeProvider _homeProvider = HomeProvider(); HomeProvider _homeProvider = HomeProvider();
MyWalletsProvider _walletsProvider = MyWalletsProvider(); appPath = await getApplicationDocumentsDirectory();
await _homeProvider.getAppPath();
await _homeProvider.createDefaultAvatar(); await _homeProvider.createDefaultAvatar();
await _walletsProvider.initWalletFolder();
// _walletsProvider.getDefaultWallet(); // _walletsProvider.getDefaultWallet();
appVersion = await _homeProvider.getAppVersion(); appVersion = await _homeProvider.getAppVersion();
prefs = await SharedPreferences.getInstance(); prefs = await SharedPreferences.getInstance();
Hive.init(appPath.path); // Configure Hive and open boxes
await Hive.openBox("walletBox"); await Hive.initFlutter(appPath.path);
Hive.registerAdapter(WalletDataAdapter());
walletBox = await Hive.openBox<WalletData>("walletBox");
chestBox = await Hive.openBox("chestBox");
configBox = await Hive.openBox("configBox");
// final HiveStore _store = // final HiveStore _store =
// await HiveStore.open(path: '${appPath.path}/gqlCache'); // await HiveStore.open(path: '${appPath.path}/gqlCache');

View File

@ -1,4 +1,3 @@
import 'dart:io';
import 'package:dubp/dubp.dart'; import 'package:dubp/dubp.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -13,9 +12,7 @@ class ChangePinProvider with ChangeNotifier {
Future<NewWallet> changePin(_name, _oldPin) async { Future<NewWallet> changePin(_name, _oldPin) async {
try { try {
final _walletFile = Directory('${walletsDirectory.path}/$_name'); final _dewif = chestBox.get(0);
final _dewif =
File(_walletFile.path + '/wallet.dewif').readAsLinesSync()[0];
NewWallet newWalletFile = await DubpRust.changeDewifPin( NewWallet newWalletFile = await DubpRust.changeDewifPin(
dewif: _dewif, dewif: _dewif,
@ -32,12 +29,9 @@ class ChangePinProvider with ChangeNotifier {
} }
} }
Future storeWallet(context, _name, _newWalletFile) async { Future storeWallet(context, _name, NewWallet _newWalletFile) async {
final Directory walletNameDirectory = chestBox.put(0, _newWalletFile.dewif);
Directory('${walletsDirectory.path}/$_name');
final walletFile = File('${walletNameDirectory.path}/wallet.dewif');
walletFile.writeAsString('${_newWalletFile.dewif}');
Navigator.pop(context); Navigator.pop(context);
return _name; return _name;
} }

View File

@ -1,4 +1,3 @@
import 'dart:io';
import 'dart:math'; import 'dart:math';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:dubp/dubp.dart'; import 'package:dubp/dubp.dart';
@ -6,6 +5,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/walletData.dart';
import 'package:pdf/pdf.dart'; import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw; import 'package:pdf/widgets.dart' as pw;
import 'package:printing/printing.dart'; import 'package:printing/printing.dart';
@ -38,40 +38,14 @@ class GenerateWalletsProvider with ChangeNotifier {
bool canImport = false; bool canImport = false;
bool isPinChanged = false; bool isPinChanged = false;
Future storeHDWChest( void storeHDWChest(
NewWallet _wallet, String _name, BuildContext context) async { NewWallet _wallet, String _name, BuildContext context) async {
// Directory walletDirectory; WalletData myWallet =
WalletData(chest: 0, number: 0, name: _name, derivation: 3);
final Directory hdDirectory = Directory('${walletsDirectory.path}/0'); walletBox.add(myWallet);
await hdDirectory.create(); chestBox.put(0, _wallet.dewif);
configBox.put('currentChest', 0);
final configFile = File('${hdDirectory.path}/list.conf'); // walletBox.get(1)
File _currentChestFile = File('${walletsDirectory.path}/currentChest.conf');
final dewifFile = File('${hdDirectory.path}/wallet.dewif');
// List<String> _lastConfig = [];
// _lastConfig = await masterConfigFile.readAsLines();
// final int _lastDerivation = int.parse(_lastConfig.last.split(':')[2]);
// final int _derivationNbr = _lastDerivation + 3;
final int _derivationNbr = 3;
List _pubkeysTmp = await DubpRust.getBip32DewifAccountsPublicKeys(
dewif: _wallet.dewif,
secretCode: _wallet.pin,
accountsIndex: [_derivationNbr]);
String _pubkey = _pubkeysTmp[0];
await configFile.writeAsString('0:0:$_name:$_derivationNbr:$_pubkey');
await dewifFile.writeAsString(_wallet.dewif);
bool isCurrentChestExist = _currentChestFile.existsSync();
if (isCurrentChestExist) {
await _currentChestFile.delete();
}
await _currentChestFile.create();
await _currentChestFile.writeAsString('0');
return _name;
} }
void checkAskedWord(String inputWord, String _mnemo) { void checkAskedWord(String inputWord, String _mnemo) {

View File

@ -1,5 +1,3 @@
import 'dart:io';
import 'package:dubp/dubp.dart'; import 'package:dubp/dubp.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -52,10 +50,7 @@ class HistoryProvider with ChangeNotifier {
Future<String> pay(BuildContext context, String pinCode) async { Future<String> pay(BuildContext context, String pinCode) async {
// MyWalletsProvider _myWalletProvider = MyWalletsProvider(); // MyWalletsProvider _myWalletProvider = MyWalletsProvider();
List dewifList = await File( String dewif = chestBox.get(0);
walletsDirectory.path + '/${defaultWallet.chest}/wallet.dewif')
.readAsLines();
String dewif = dewifList[0];
try { try {
await DubpRust.simplePaymentFromTransparentAccount( await DubpRust.simplePaymentFromTransparentAccount(
accountIndex: defaultWallet.derivation, accountIndex: defaultWallet.derivation,

View File

@ -11,7 +11,6 @@ import 'package:gecko/globals.dart';
import 'package:gecko/screens/history.dart'; import 'package:gecko/screens/history.dart';
import 'package:gecko/screens/myWallets/walletsHome.dart'; import 'package:gecko/screens/myWallets/walletsHome.dart';
import 'package:package_info/package_info.dart'; import 'package:package_info/package_info.dart';
import 'package:path_provider/path_provider.dart';
class HomeProvider with ChangeNotifier { class HomeProvider with ChangeNotifier {
int _currentIndex = 0; int _currentIndex = 0;
@ -100,17 +99,6 @@ class HomeProvider with ChangeNotifier {
return _endpoint; return _endpoint;
} }
Future getAppPath() async {
appPath = await getApplicationDocumentsDirectory();
walletsDirectory = Directory('${appPath.path}/wallets');
bool isWalletFolderExist = await walletsDirectory.exists();
if (!isWalletFolderExist) {
await Directory(walletsDirectory.path).create();
}
}
Future createDefaultAvatar() async { Future createDefaultAvatar() async {
File defaultAvatar = File(appPath.path + '/default_avatar.png'); File defaultAvatar = File(appPath.path + '/default_avatar.png');
final bool isAvatarExist = await defaultAvatar.exists(); final bool isAvatarExist = await defaultAvatar.exists();

View File

@ -1,8 +1,8 @@
import 'dart:io';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'dart:async'; import 'dart:async';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/walletData.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class MyWalletsProvider with ChangeNotifier { class MyWalletsProvider with ChangeNotifier {
@ -10,42 +10,12 @@ class MyWalletsProvider with ChangeNotifier {
String pinCode; String pinCode;
int pinLenght; int pinLenght;
Future initWalletFolder() async {
// getDefaultWallet();
final bool isWalletFolderExist = await walletsDirectory.exists();
if (!isWalletFolderExist) {
await Directory(walletsDirectory.path).create();
}
File _currentChestFile = File('${walletsDirectory.path}/currentChest.conf');
await _currentChestFile.create();
await _currentChestFile.writeAsString('0');
final bool isChestsExist =
await Directory('${walletsDirectory.path}/0').exists();
if (!isChestsExist) {
await Directory('${walletsDirectory.path}/0').create();
await Directory('${walletsDirectory.path}/1').create();
await File('${walletsDirectory.path}/0/list.conf').create();
await File('${walletsDirectory.path}/0/order.conf').create();
await File('${walletsDirectory.path}/1/list.conf').create();
await File('${walletsDirectory.path}/1/order.conf').create();
// getDefaultWallet();
}
await getDefaultWalletAsync();
}
int getCurrentChest() { int getCurrentChest() {
File _currentChestFile = File('${walletsDirectory.path}/currentChest.conf'); if (configBox.get('currentChest') == null) {
configBox.put('currentChest', 0);
bool isCurrentChestExist = _currentChestFile.existsSync();
if (!isCurrentChestExist) {
_currentChestFile.createSync();
_currentChestFile.writeAsString('0');
} }
return int.parse(_currentChestFile.readAsStringSync());
return configBox.get('currentChest');
} }
bool checkIfWalletExist() { bool checkIfWalletExist() {
@ -63,89 +33,50 @@ class MyWalletsProvider with ChangeNotifier {
} }
} }
List readAllWallets(int _chest) { List<WalletData> readAllWallets(int _chest) {
// log.d(walletsDirectory.path); walletBox.toMap().forEach((key, value) {
if (value.chest == _chest) {
listWallets = []; listWallets.add(value);
}
File _walletConfig = File('${walletsDirectory.path}/$_chest/list.conf');
_walletConfig.readAsLinesSync().forEach((element) {
listWallets.add(WalletData(element));
}); });
log.i(listWallets.toString());
return listWallets; return listWallets;
} }
WalletData getWalletData(String _id) { WalletData getWalletData(List<int> _id) {
// log.d(_id); if (_id.isEmpty) return WalletData();
if (_id == '') return WalletData(''); int _chest = _id[0];
int chest = int.parse(_id.split(':')[0]); int _nbr = _id[1];
final _walletConfig = File('${walletsDirectory.path}/$chest/list.conf');
return WalletData(_walletConfig walletBox.toMap().forEach((key, value) {
.readAsLinesSync() if (value.chest == _chest && value.number == _nbr) {
.firstWhere((element) => element.startsWith(_id))); return value;
} }
});
Future<WalletData> getWalletDataAsync(String _id) async { return WalletData();
// log.d(_id);
if (_id == '') return WalletData('');
int chest = int.parse(_id.split(':')[0]);
final _walletConfig = File('${walletsDirectory.path}/$chest/list.conf');
List configLines = await _walletConfig.readAsLines();
//log.d(configLines);
if (configLines.isEmpty) {
return WalletData('');
}
return WalletData(
configLines.firstWhere((element) => element.startsWith(_id)));
} }
void getDefaultWallet() { void getDefaultWallet() {
defaultWalletFile = File('${appPath.path}/defaultWallet'); if (configBox.get('defaultWallet') == null) {
configBox.put('defaultWallet', [0, 0]);
if (!defaultWalletFile.existsSync()) {
File(defaultWalletFile.path).createSync();
defaultWalletFile.writeAsStringSync("0:0");
}
defaultWallet = getWalletData(defaultWalletFile.readAsStringSync());
}
Future getDefaultWalletAsync() async {
defaultWalletFile = File('${appPath.path}/defaultWallet');
if (!await defaultWalletFile.exists()) {
await File(defaultWalletFile.path).create();
await defaultWalletFile.writeAsString("0:0");
} else {
defaultWallet =
await getWalletDataAsync(await defaultWalletFile.readAsString());
} }
defaultWallet = configBox.get('defaultWallet');
} }
Future<int> deleteAllWallet(context) async { Future<int> deleteAllWallet(context) async {
MyWalletsProvider _myWalletProvider = MyWalletsProvider _myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
try { try {
log.w('DELETE THAT ?: $walletsDirectory'); log.w('DELETE ALL WALLETS ?');
final bool _answer = await _confirmDeletingAllWallets(context); final bool _answer = await _confirmDeletingAllWallets(context);
if (_answer) { if (_answer) {
await walletsDirectory.delete(recursive: true); await walletBox.clear();
await defaultWalletFile.delete(); await chestBox.clear();
await walletsDirectory.create();
await initWalletFolder();
// await Future.delayed(Duration(milliseconds: 500));
// scheduleMicrotask(() {
notifyListeners(); notifyListeners();
rebuildWidget(); rebuildWidget();
_myWalletProvider.rebuildWidget(); _myWalletProvider.rebuildWidget();
// });
Navigator.pop(context); Navigator.pop(context);
} }
@ -187,27 +118,26 @@ class MyWalletsProvider with ChangeNotifier {
Future<void> generateNewDerivation(context, String _name) async { Future<void> generateNewDerivation(context, String _name) async {
int _newDerivationNbr; int _newDerivationNbr;
int _newWalletNbr; int _newWalletNbr;
final _walletConfig = File('${walletsDirectory.path}/0/list.conf'); int _chest = 0;
List<WalletData> _walletConfig = readAllWallets(_chest);
if (await _walletConfig.readAsString() == '') { if (_walletConfig.isEmpty) {
_newDerivationNbr = 3; _newDerivationNbr = 3;
_newWalletNbr = 0; _newWalletNbr = 0;
} else { } else {
String _lastWallet = _newDerivationNbr = _walletConfig.last.derivation + 3;
await _walletConfig.readAsLines().then((value) => value.last); _newWalletNbr = _walletConfig.last.number + 1;
int _lastDerivation = int.parse(_lastWallet.split(':')[3]);
_newDerivationNbr = _lastDerivation + 3;
int _lastWalletNbr = int.parse(_lastWallet.split(':')[1]);
_newWalletNbr = _lastWalletNbr + 1;
} }
await _walletConfig.writeAsString( WalletData newWallet = WalletData(
'\n0:$_newWalletNbr:$_name:$_newDerivationNbr', chest: _chest,
mode: FileMode.append); number: _newWalletNbr,
name: _name,
derivation: _newDerivationNbr);
await walletBox.add(newWallet);
notifyListeners(); notifyListeners();
Navigator.pop(context); Navigator.pop(context);
} }
@ -215,44 +145,3 @@ class MyWalletsProvider with ChangeNotifier {
notifyListeners(); notifyListeners();
} }
} }
// wallet data contains elements identifying wallet
class WalletData {
int chest;
int number;
String name;
int derivation;
// constructor from ':'-separated string
WalletData(String element) {
if (element != '') {
List parts = element.split(':');
this.chest = int.parse(parts[0]);
this.number = int.parse(parts[1]);
this.name = parts[2];
this.derivation = int.parse(parts[3]);
}
}
// default wallet
static WalletData defaultWallet() {
return WalletData("0:0:default:3");
}
// representation of WalletData when debugging
@override
String toString() {
return this.name;
}
// creates the ':'-separated string from the WalletData
String inLine() {
return "${this.chest}:${this.number}:${this.name}:${this.derivation}";
}
// returns only the id part of the ':'-separated string
String id() {
return "${this.chest}:${this.number}";
}
}

View File

@ -0,0 +1,36 @@
import 'package:hive_flutter/hive_flutter.dart';
part 'walletData.g.dart';
@HiveType(typeId: 0)
class WalletData extends HiveObject {
@HiveField(0)
int chest;
@HiveField(1)
int number;
@HiveField(2)
String name;
@HiveField(3)
int derivation;
WalletData({this.chest, this.number, this.name, this.derivation});
// representation of WalletData when debugging
@override
String toString() {
return this.name;
}
// creates the ':'-separated string from the WalletData
String inLine() {
return "${this.chest}:${this.number}:${this.name}:${this.derivation}";
}
// returns only the id part of the ':'-separated string
List id() {
return [this.chest, this.number];
}
}

View File

@ -0,0 +1,50 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'walletData.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class WalletDataAdapter extends TypeAdapter<WalletData> {
@override
final int typeId = 0;
@override
WalletData read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return WalletData(
chest: fields[0] as int,
number: fields[1] as int,
name: fields[2] as String,
derivation: fields[3] as int,
);
}
@override
void write(BinaryWriter writer, WalletData obj) {
writer
..writeByte(4)
..writeByte(0)
..write(obj.chest)
..writeByte(1)
..write(obj.number)
..writeByte(2)
..write(obj.name)
..writeByte(3)
..write(obj.derivation);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is WalletDataAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@ -9,6 +9,7 @@ import 'package:flutter/material.dart';
import 'dart:async'; import 'dart:async';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/myWallets.dart'; import 'package:gecko/models/myWallets.dart';
import 'package:gecko/models/walletData.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'package:truncate/truncate.dart'; import 'package:truncate/truncate.dart';
import 'package:qrscan/qrscan.dart' as scanner; import 'package:qrscan/qrscan.dart' as scanner;
@ -23,7 +24,7 @@ class WalletOptionsProvider with ChangeNotifier {
bool isBalanceBlur = true; bool isBalanceBlur = true;
FocusNode walletNameFocus = FocusNode(); FocusNode walletNameFocus = FocusNode();
TextEditingController nameController = TextEditingController(); TextEditingController nameController = TextEditingController();
String walletID; List<int> walletID;
bool isDefaultWallet; bool isDefaultWallet;
Future<NewWallet> get badWallet => null; Future<NewWallet> get badWallet => null;
@ -75,14 +76,8 @@ class WalletOptionsProvider with ChangeNotifier {
context, WalletData _wallet, String _pin, int _pinLenght) async { context, WalletData _wallet, String _pin, int _pinLenght) async {
isWalletUnlock = false; isWalletUnlock = false;
try { try {
File _walletFile = File('${walletsDirectory.path}/0/wallet.dewif'); String _localDewif = chestBox.get(0);
String _localDewif = await _walletFile.readAsString();
String _localPubkey; String _localPubkey;
// log.d("$_localDewif $_pin $_pinLenght ${_wallet.derivation}");
// String mnemo = await DubpRust.getBip32DewifMnemonic(
// dewif: _localDewif, secretCode: _pin);
// log.d(mnemo.toString());
if ((_localPubkey = await _getPubkeyFromDewif( if ((_localPubkey = await _getPubkeyFromDewif(
_localDewif, _pin, _pinLenght, _wallet.derivation)) != _localDewif, _pin, _pinLenght, _wallet.derivation)) !=
@ -119,8 +114,7 @@ class WalletOptionsProvider with ChangeNotifier {
int getPinLenght(_walletNbr) { int getPinLenght(_walletNbr) {
String _localDewif; String _localDewif;
if (_walletNbr is int) { if (_walletNbr is int) {
File _walletFile = File('${walletsDirectory.path}/0/wallet.dewif'); _localDewif = chestBox.get(0);
_localDewif = _walletFile.readAsStringSync();
} else { } else {
_localDewif = _walletNbr; _localDewif = _walletNbr;
} }
@ -131,24 +125,13 @@ class WalletOptionsProvider with ChangeNotifier {
return _pinLenght; return _pinLenght;
} }
Future _renameWallet(_walletID, _newName) async { Future _renameWallet(List<int> _walletID, _newName) async {
final _walletConfig = File('${walletsDirectory.path}/0/list.conf'); MyWalletsProvider myWalletClass = MyWalletsProvider();
String newConfig = WalletData _walletTarget = myWalletClass.getWalletData(_walletID);
await _walletConfig.readAsLines().then((List<String> lines) { _walletTarget.name = _newName;
for (String wLine in lines) { await walletBox.putAt(_walletTarget.key, _walletTarget);
String wID = "${wLine.split(':')[0]}:${wLine.split(':')[1]}";
String deri = wLine.split(':')[3];
if (wID == _walletID) {
lines.remove(wLine);
lines.add('$_walletID:$_newName:$deri');
}
}
return lines.join('\n');
});
await _walletConfig.delete();
await _walletConfig.writeAsString(newConfig);
_newWalletName.text = ''; _newWalletName.text = '';
} }
@ -193,7 +176,7 @@ class WalletOptionsProvider with ChangeNotifier {
); );
} }
Future<bool> editWalletName(_wID) async { Future<bool> editWalletName(List<int> _wID) async {
bool nameState; bool nameState;
if (isEditing) { if (isEditing) {
if (!nameController.text.contains(':') && if (!nameController.text.contains(':') &&
@ -213,27 +196,12 @@ class WalletOptionsProvider with ChangeNotifier {
return nameState; return nameState;
} }
Future<int> deleteWallet(context, wallet) async { Future<int> deleteWallet(context, WalletData wallet) async {
final bool _answer = await _confirmDeletingWallet(context, wallet.name); final bool _answer = await _confirmDeletingWallet(context, wallet.name);
if (_answer) { if (_answer) {
final _walletConfig = File('${walletsDirectory.path}/0/list.conf'); walletBox.delete(wallet.key);
if (wallet.derivation != -1) {
String newConfig =
await _walletConfig.readAsLines().then((List<String> lines) {
lines.removeWhere((element) => element.contains(wallet.inLine()));
return lines.join('\n');
});
await _walletConfig.delete();
await _walletConfig.writeAsString(newConfig);
} else {
final _walletFile =
Directory('${walletsDirectory.path}/${wallet.number}');
await _walletFile.delete(recursive: true);
}
Navigator.popUntil( Navigator.popUntil(
context, context,
ModalRoute.withName('/mywallets'), ModalRoute.withName('/mywallets'),
@ -278,9 +246,7 @@ class WalletOptionsProvider with ChangeNotifier {
Future<NewWallet> changePin(_name, _oldPin) async { Future<NewWallet> changePin(_name, _oldPin) async {
try { try {
final _walletFile = Directory('${walletsDirectory.path}/$_name'); final _dewif = chestBox.get(0);
final _dewif =
File(_walletFile.path + '/wallet.dewif').readAsLinesSync()[0];
NewWallet newWalletFile = await DubpRust.changeDewifPin( NewWallet newWalletFile = await DubpRust.changeDewifPin(
dewif: _dewif, dewif: _dewif,
@ -297,16 +263,6 @@ class WalletOptionsProvider with ChangeNotifier {
} }
} }
Future storeWallet(context, _name, _newWalletFile) async {
final Directory walletNameDirectory =
Directory('${walletsDirectory.path}/$_name');
final walletFile = File('${walletNameDirectory.path}/wallet.dewif');
walletFile.writeAsString('${_newWalletFile.dewif}');
Navigator.pop(context);
return _name;
}
snackCopyKey(context) { snackCopyKey(context) {
final snackBar = SnackBar( final snackBar = SnackBar(
content: content:
@ -341,13 +297,6 @@ class WalletOptionsProvider with ChangeNotifier {
return await scanner.generateBarCode(_pubkey); return await scanner.generateBarCode(_pubkey);
} }
void defAsDefaultWallet(String _id) {
defaultWalletFile.deleteSync();
defaultWalletFile.createSync();
defaultWalletFile.writeAsStringSync(_id);
notifyListeners();
}
Future changeAvatar() async { Future changeAvatar() async {
File _image; File _image;
final picker = ImagePicker(); final picker = ImagePicker();

View File

@ -22,6 +22,12 @@ class HomeScreen extends StatelessWidget {
Provider.of<MyWalletsProvider>(context); Provider.of<MyWalletsProvider>(context);
final bool isWalletsExists = _myWalletProvider.checkIfWalletExist(); final bool isWalletsExists = _myWalletProvider.checkIfWalletExist();
// walletBox.toMap().forEach((key, value) {
// if (value.chest == 0) {
// print('$key: ${value.derivation}');
// }
// });
isTall = false; isTall = false;
ratio = 1; ratio = 1;
if (MediaQuery.of(context).size.height >= 930) { if (MediaQuery.of(context).size.height >= 930) {

View File

@ -134,8 +134,8 @@ class ConfirmStoreWallet extends StatelessWidget with ChangeNotifier {
onPressed: (_generateWalletProvider onPressed: (_generateWalletProvider
.isAskedWordValid && .isAskedWordValid &&
this.walletName.text != '') this.walletName.text != '')
? () async { ? () {
await _generateWalletProvider.storeHDWChest( _generateWalletProvider.storeHDWChest(
generatedWallet, generatedWallet,
walletName.text, walletName.text,
context); context);

View File

@ -1,9 +1,9 @@
import 'dart:async'; import 'dart:async';
import 'package:dubp/dubp.dart'; import 'package:dubp/dubp.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:gecko/models/history.dart'; import 'package:gecko/models/history.dart';
import 'package:gecko/models/myWallets.dart'; import 'package:gecko/models/myWallets.dart';
import 'package:gecko/models/walletData.dart';
import 'package:gecko/models/walletOptions.dart'; import 'package:gecko/models/walletOptions.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:pin_code_fields/pin_code_fields.dart'; import 'package:pin_code_fields/pin_code_fields.dart';

View File

@ -5,6 +5,7 @@ import 'package:gecko/globals.dart';
import 'package:gecko/models/history.dart'; import 'package:gecko/models/history.dart';
import 'package:gecko/models/myWallets.dart'; import 'package:gecko/models/myWallets.dart';
import 'package:gecko/models/queries.dart'; import 'package:gecko/models/queries.dart';
import 'package:gecko/models/walletData.dart';
import 'package:gecko/models/walletOptions.dart'; import 'package:gecko/models/walletOptions.dart';
import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -44,7 +45,7 @@ class WalletOptions extends StatelessWidget {
if (_walletOptions.nameController.text.length >= 26 && isTall) if (_walletOptions.nameController.text.length >= 26 && isTall)
_nbrLinesName = 3; _nbrLinesName = 3;
_walletOptions.walletID = '0:${wallet.number}'; _walletOptions.walletID = [0, wallet.number];
_myWalletProvider.getDefaultWallet(); _myWalletProvider.getDefaultWallet();
@ -361,7 +362,7 @@ class WalletOptions extends StatelessWidget {
onTap: !_walletOptions.isDefaultWallet onTap: !_walletOptions.isDefaultWallet
? () { ? () {
defaultWallet = wallet; defaultWallet = wallet;
_walletOptions.defAsDefaultWallet(wallet.id()); configBox.put('defaultWallet', wallet.id());
_myWalletProvider.readAllWallets(_currentChest); _myWalletProvider.readAllWallets(_currentChest);
} }
: null, : null,

View File

@ -1,6 +1,7 @@
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/myWallets.dart'; import 'package:gecko/models/myWallets.dart';
import 'package:gecko/models/walletData.dart';
import 'package:gecko/models/walletOptions.dart'; import 'package:gecko/models/walletOptions.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/screens/commonElements.dart'; import 'package:gecko/screens/commonElements.dart';

View File

@ -119,10 +119,10 @@ class OnboardingStepFourteen extends StatelessWidget {
generatedWallet.dewif, _pin.toUpperCase(), _pinLenght); generatedWallet.dewif, _pin.toUpperCase(), _pinLenght);
if (resultWallet) { if (resultWallet) {
pinColor = Colors.green[500]; pinColor = Colors.green[500];
await _generateWalletProvider.storeHDWChest( _generateWalletProvider.storeHDWChest(
generatedWallet, 'Mon portefeuille courant', context); generatedWallet, 'Mon portefeuille courant', context);
_myWalletProvider.readAllWallets(_currentChest); _myWalletProvider.readAllWallets(_currentChest);
await _myWalletProvider.getDefaultWalletAsync(); _myWalletProvider.getDefaultWallet();
scheduleMicrotask(() { scheduleMicrotask(() {
_walletOptions.reloadBuild(); _walletOptions.reloadBuild();
_myWalletProvider.rebuildWidget(); _myWalletProvider.rebuildWidget();

View File

@ -57,6 +57,62 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.1" version: "1.2.1"
build:
dependency: transitive
description:
name: build
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
build_config:
dependency: transitive
description:
name: build_config
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
build_daemon:
dependency: transitive
description:
name: build_daemon
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
build_resolvers:
dependency: transitive
description:
name: build_resolvers
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.4"
build_runner:
dependency: "direct dev"
description:
name: build_runner
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.4"
build_runner_core:
dependency: transitive
description:
name: build_runner_core
url: "https://pub.dartlang.org"
source: hosted
version: "7.2.2"
built_collection:
dependency: transitive
description:
name: built_collection
url: "https://pub.dartlang.org"
source: hosted
version: "5.1.1"
built_value:
dependency: transitive
description:
name: built_value
url: "https://pub.dartlang.org"
source: hosted
version: "8.1.3"
characters: characters:
dependency: transitive dependency: transitive
description: description:
@ -71,6 +127,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.1" version: "1.3.1"
checked_yaml:
dependency: transitive
description:
name: checked_yaml
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.1"
cli_util: cli_util:
dependency: transitive dependency: transitive
description: description:
@ -85,6 +148,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
code_builder:
dependency: transitive
description:
name: code_builder
url: "https://pub.dartlang.org"
source: hosted
version: "4.1.0"
collection: collection:
dependency: transitive dependency: transitive
description: description:
@ -162,6 +232,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.1" version: "3.0.1"
dart_style:
dependency: transitive
description:
name: dart_style
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.0"
dbus: dbus:
dependency: transitive dependency: transitive
description: description:
@ -211,6 +288,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.1" version: "1.0.1"
fixnum:
dependency: transitive
description:
name: fixnum
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
flutter: flutter:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
@ -348,6 +432,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.0.0" version: "5.0.0"
graphs:
dependency: transitive
description:
name: graphs
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.0"
hive: hive:
dependency: "direct main" dependency: "direct main"
description: description:
@ -355,6 +446,20 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.4" version: "2.0.4"
hive_flutter:
dependency: "direct main"
description:
name: hive_flutter
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
hive_generator:
dependency: "direct dev"
description:
name: hive_generator
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.1"
http: http:
dependency: "direct main" dependency: "direct main"
description: description:
@ -451,6 +556,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.6.3" version: "0.6.3"
json_annotation:
dependency: transitive
description:
name: json_annotation
url: "https://pub.dartlang.org"
source: hosted
version: "4.3.0"
logger: logger:
dependency: "direct main" dependency: "direct main"
description: description:
@ -717,6 +829,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
pubspec_parse:
dependency: transitive
description:
name: pubspec_parse
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.0"
qr: qr:
dependency: transitive dependency: transitive
description: description:
@ -841,6 +960,20 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.99" version: "0.0.99"
source_gen:
dependency: transitive
description:
name: source_gen
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.1"
source_helper:
dependency: transitive
description:
name: source_helper
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.0"
source_map_stack_trace: source_map_stack_trace:
dependency: transitive dependency: transitive
description: description:
@ -876,6 +1009,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
stream_transform:
dependency: transitive
description:
name: stream_transform
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
string_scanner: string_scanner:
dependency: transitive dependency: transitive
description: description:
@ -932,6 +1072,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.0" version: "0.4.0"
timing:
dependency: transitive
description:
name: timing
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
truncate: truncate:
dependency: "direct main" dependency: "direct main"
description: description:

View File

@ -25,6 +25,7 @@ dependencies:
flutter_svg: ^0.22.0 flutter_svg: ^0.22.0
graphql_flutter: ^5.0.0 graphql_flutter: ^5.0.0
hive: ^2.0.4 hive: ^2.0.4
hive_flutter: ^1.1.0
http: ^0.13.0 http: ^0.13.0
image_gallery_saver: ^1.6.9 image_gallery_saver: ^1.6.9
image_picker: ^0.8.4 image_picker: ^0.8.4
@ -64,6 +65,8 @@ dev_dependencies:
sdk: flutter sdk: flutter
integration_test: integration_test:
sdk: flutter sdk: flutter
hive_generator: ^1.1.1
build_runner: ^2.1.2
# The following section is specific to Flutter. # The following section is specific to Flutter.
flutter: flutter: