big refacto: home screen stateful; walletnames refacto
This commit is contained in:
parent
cf4387a280
commit
d7731504c7
|
@ -66,7 +66,7 @@
|
||||||
"chooseAnotherPassword": "Choisir un autre code secret",
|
"chooseAnotherPassword": "Choisir un autre code secret",
|
||||||
"iNotedMyPassword": "J'ai noté mon code secret",
|
"iNotedMyPassword": "J'ai noté mon code secret",
|
||||||
"geckoWillCheckPassword": "Gecko va vérifier avec vous si vous avez bien mémorisé votre code secret.\n\nTapez votre code secret dans le champ ci-dessous pour vérifier que vous l’avez bien noté.",
|
"geckoWillCheckPassword": "Gecko va vérifier avec vous si vous avez bien mémorisé votre code secret.\n\nTapez votre code secret dans le champ ci-dessous pour vérifier que vous l’avez bien noté.",
|
||||||
"yourChestAndWalletWereCreatedSuccessfully": "Top !\n\nVotre coffre votre premier portefeuille ont été créés avec un immense succès.\n\nFélicitations !",
|
"yourChestAndWalletWereCreatedSuccessfully": "Top !\n\nVotre coffre et votre premier portefeuille ont été créés avec un immense succès.\n\nFélicitations !",
|
||||||
"allGood": "C’est tout bon !",
|
"allGood": "C’est tout bon !",
|
||||||
"areYouSureToDeleteWallet": "Êtes-vous sûr de vouloir supprimer le coffre \"{}\" ?",
|
"areYouSureToDeleteWallet": "Êtes-vous sûr de vouloir supprimer le coffre \"{}\" ?",
|
||||||
"areYouSureForgetAllChests": "Êtes-vous sûr de vouloir oublier tous vos coffres ?",
|
"areYouSureForgetAllChests": "Êtes-vous sûr de vouloir oublier tous vos coffres ?",
|
||||||
|
|
|
@ -259,14 +259,14 @@ Future<WalletData> _addImportAccount(
|
||||||
final address = await sub.importAccount(
|
final address = await sub.importAccount(
|
||||||
mnemonic: mnemonic, derivePath: '//$derivation', password: 'AAAAA');
|
mnemonic: mnemonic, derivePath: '//$derivation', password: 'AAAAA');
|
||||||
final myWallet = WalletData(
|
final myWallet = WalletData(
|
||||||
version: dataVersion,
|
|
||||||
chest: chest,
|
chest: chest,
|
||||||
address: address,
|
address: address,
|
||||||
number: number,
|
number: number,
|
||||||
name: name,
|
name: name,
|
||||||
derivation: derivation,
|
derivation: derivation,
|
||||||
imageDefaultPath: '${number % 4}.png');
|
imageDefaultPath: '${number % 4}.png',
|
||||||
await walletBox.add(myWallet);
|
isOwned: true);
|
||||||
|
await walletBox.put(myWallet.address, myWallet);
|
||||||
|
|
||||||
return myWallet;
|
return myWallet;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ import 'package:hive_flutter/hive_flutter.dart';
|
||||||
import 'package:logger/logger.dart';
|
import 'package:logger/logger.dart';
|
||||||
|
|
||||||
// Version of box data
|
// Version of box data
|
||||||
const int dataVersion = 4;
|
const int dataVersion = 6;
|
||||||
|
|
||||||
late String appVersion;
|
late String appVersion;
|
||||||
const int pinLength = 5;
|
const int pinLength = 5;
|
||||||
|
|
|
@ -19,10 +19,11 @@ import 'dart:io';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||||
import 'package:gecko/globals.dart';
|
import 'package:gecko/globals.dart';
|
||||||
import 'package:gecko/providers/cesium_plus.dart';
|
|
||||||
import 'package:gecko/models/chest_data.dart';
|
import 'package:gecko/models/chest_data.dart';
|
||||||
import 'package:gecko/providers/chest_provider.dart';
|
|
||||||
import 'package:gecko/models/g1_wallets_list.dart';
|
import 'package:gecko/models/g1_wallets_list.dart';
|
||||||
|
import 'package:gecko/models/wallet_data.dart';
|
||||||
|
import 'package:gecko/providers/cesium_plus.dart';
|
||||||
|
import 'package:gecko/providers/chest_provider.dart';
|
||||||
import 'package:gecko/providers/duniter_indexer.dart';
|
import 'package:gecko/providers/duniter_indexer.dart';
|
||||||
import 'package:gecko/providers/generate_wallets.dart';
|
import 'package:gecko/providers/generate_wallets.dart';
|
||||||
import 'package:gecko/providers/settings_provider.dart';
|
import 'package:gecko/providers/settings_provider.dart';
|
||||||
|
@ -31,7 +32,6 @@ import 'package:gecko/providers/wallets_profiles.dart';
|
||||||
import 'package:gecko/providers/home.dart';
|
import 'package:gecko/providers/home.dart';
|
||||||
import 'package:gecko/providers/my_wallets.dart';
|
import 'package:gecko/providers/my_wallets.dart';
|
||||||
import 'package:gecko/providers/search.dart';
|
import 'package:gecko/providers/search.dart';
|
||||||
import 'package:gecko/models/wallet_data.dart';
|
|
||||||
import 'package:gecko/providers/wallet_options.dart';
|
import 'package:gecko/providers/wallet_options.dart';
|
||||||
import 'package:gecko/screens/home.dart';
|
import 'package:gecko/screens/home.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
@ -62,29 +62,17 @@ Future<void> main() async {
|
||||||
await homeProvider.initHive();
|
await homeProvider.initHive();
|
||||||
appVersion = await homeProvider.getAppVersion();
|
appVersion = await homeProvider.getAppVersion();
|
||||||
|
|
||||||
// Reset GraphQL cache
|
|
||||||
// final cache = HiveStore();
|
|
||||||
// cache.reset();
|
|
||||||
|
|
||||||
// Configure Hive and open boxes
|
// Configure Hive and open boxes
|
||||||
Hive.registerAdapter(WalletDataAdapter());
|
Hive.registerAdapter(WalletDataAdapter());
|
||||||
Hive.registerAdapter(ChestDataAdapter());
|
Hive.registerAdapter(ChestDataAdapter());
|
||||||
Hive.registerAdapter(G1WalletsListAdapter());
|
Hive.registerAdapter(G1WalletsListAdapter());
|
||||||
Hive.registerAdapter(IdAdapter());
|
Hive.registerAdapter(IdAdapter());
|
||||||
|
|
||||||
walletBox = await Hive.openBox<WalletData>("walletBox");
|
|
||||||
chestBox = await Hive.openBox<ChestData>("chestBox");
|
chestBox = await Hive.openBox<ChestData>("chestBox");
|
||||||
configBox = await Hive.openBox("configBox");
|
|
||||||
await Hive.deleteBoxFromDisk('g1WalletsBox');
|
|
||||||
g1WalletsBox = await Hive.openBox<G1WalletsList>("g1WalletsBox");
|
|
||||||
contactsBox = await Hive.openBox<G1WalletsList>("contactsBox");
|
|
||||||
|
|
||||||
await homeProvider.getValidEndpoints();
|
// Reset GraphQL cache
|
||||||
// await configBox.delete('isCacheChecked');
|
// final cache = HiveStore();
|
||||||
if (configBox.get('isCacheChecked') == null) {
|
// cache.reset();
|
||||||
configBox.put('isCacheChecked', false);
|
|
||||||
}
|
|
||||||
// log.d(await configBox.get('endpoint'));
|
|
||||||
|
|
||||||
HttpOverrides.global = MyHttpOverrides();
|
HttpOverrides.global = MyHttpOverrides();
|
||||||
|
|
||||||
|
|
|
@ -7,35 +7,39 @@ class WalletData extends HiveObject {
|
||||||
String address;
|
String address;
|
||||||
|
|
||||||
@HiveField(1)
|
@HiveField(1)
|
||||||
int? version;
|
|
||||||
|
|
||||||
@HiveField(2)
|
|
||||||
int? chest;
|
int? chest;
|
||||||
|
|
||||||
@HiveField(3)
|
@HiveField(2)
|
||||||
int? number;
|
int? number;
|
||||||
|
|
||||||
@HiveField(4)
|
@HiveField(3)
|
||||||
String? name;
|
String? name;
|
||||||
|
|
||||||
@HiveField(5)
|
@HiveField(4)
|
||||||
int? derivation;
|
int? derivation;
|
||||||
|
|
||||||
@HiveField(6)
|
@HiveField(5)
|
||||||
String? imageDefaultPath;
|
String? imageDefaultPath;
|
||||||
|
|
||||||
@HiveField(7)
|
@HiveField(6)
|
||||||
String? imageCustomPath;
|
String? imageCustomPath;
|
||||||
|
|
||||||
|
@HiveField(7)
|
||||||
|
bool isOwned;
|
||||||
|
|
||||||
|
@HiveField(8)
|
||||||
|
bool isMember;
|
||||||
|
|
||||||
WalletData(
|
WalletData(
|
||||||
{required this.address,
|
{required this.address,
|
||||||
this.version,
|
|
||||||
this.chest,
|
this.chest,
|
||||||
this.number,
|
this.number,
|
||||||
this.name,
|
this.name,
|
||||||
this.derivation,
|
this.derivation,
|
||||||
this.imageDefaultPath,
|
this.imageDefaultPath,
|
||||||
this.imageCustomPath});
|
this.imageCustomPath,
|
||||||
|
this.isOwned = false,
|
||||||
|
this.isMember = false});
|
||||||
|
|
||||||
// representation of WalletData when debugging
|
// representation of WalletData when debugging
|
||||||
@override
|
@override
|
||||||
|
|
|
@ -18,36 +18,39 @@ class WalletDataAdapter extends TypeAdapter<WalletData> {
|
||||||
};
|
};
|
||||||
return WalletData(
|
return WalletData(
|
||||||
address: fields[0] as String,
|
address: fields[0] as String,
|
||||||
version: fields[1] as int?,
|
chest: fields[1] as int?,
|
||||||
chest: fields[2] as int?,
|
number: fields[2] as int?,
|
||||||
number: fields[3] as int?,
|
name: fields[3] as String?,
|
||||||
name: fields[4] as String?,
|
derivation: fields[4] as int?,
|
||||||
derivation: fields[5] as int?,
|
imageDefaultPath: fields[5] as String?,
|
||||||
imageDefaultPath: fields[6] as String?,
|
imageCustomPath: fields[6] as String?,
|
||||||
imageCustomPath: fields[7] as String?,
|
isOwned: fields[7] as bool,
|
||||||
|
isMember: fields[8] as bool,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void write(BinaryWriter writer, WalletData obj) {
|
void write(BinaryWriter writer, WalletData obj) {
|
||||||
writer
|
writer
|
||||||
..writeByte(8)
|
..writeByte(9)
|
||||||
..writeByte(0)
|
..writeByte(0)
|
||||||
..write(obj.address)
|
..write(obj.address)
|
||||||
..writeByte(1)
|
..writeByte(1)
|
||||||
..write(obj.version)
|
|
||||||
..writeByte(2)
|
|
||||||
..write(obj.chest)
|
..write(obj.chest)
|
||||||
..writeByte(3)
|
..writeByte(2)
|
||||||
..write(obj.number)
|
..write(obj.number)
|
||||||
..writeByte(4)
|
..writeByte(3)
|
||||||
..write(obj.name)
|
..write(obj.name)
|
||||||
..writeByte(5)
|
..writeByte(4)
|
||||||
..write(obj.derivation)
|
..write(obj.derivation)
|
||||||
..writeByte(6)
|
..writeByte(5)
|
||||||
..write(obj.imageDefaultPath)
|
..write(obj.imageDefaultPath)
|
||||||
|
..writeByte(6)
|
||||||
|
..write(obj.imageCustomPath)
|
||||||
..writeByte(7)
|
..writeByte(7)
|
||||||
..write(obj.imageCustomPath);
|
..write(obj.isOwned)
|
||||||
|
..writeByte(8)
|
||||||
|
..write(obj.isMember);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
|
@ -414,14 +414,14 @@ class GenerateWalletsProvider with ChangeNotifier {
|
||||||
password: pin.text);
|
password: pin.text);
|
||||||
|
|
||||||
WalletData myWallet = WalletData(
|
WalletData myWallet = WalletData(
|
||||||
version: dataVersion,
|
|
||||||
chest: currentChestNumber,
|
chest: currentChestNumber,
|
||||||
address: addressData.address!,
|
address: addressData.address!,
|
||||||
number: scanedValidWalletNumber,
|
number: scanedValidWalletNumber,
|
||||||
name: walletName,
|
name: walletName,
|
||||||
derivation: derivationNbr,
|
derivation: derivationNbr,
|
||||||
imageDefaultPath: '${scanedValidWalletNumber % 4}.png');
|
imageDefaultPath: '${scanedValidWalletNumber % 4}.png',
|
||||||
await walletBox.add(myWallet);
|
isOwned: true);
|
||||||
|
await walletBox.put(myWallet.address, myWallet);
|
||||||
scanedValidWalletNumber = scanedValidWalletNumber + 1;
|
scanedValidWalletNumber = scanedValidWalletNumber + 1;
|
||||||
}
|
}
|
||||||
scanedWalletNumber = scanedWalletNumber + 1;
|
scanedWalletNumber = scanedWalletNumber + 1;
|
||||||
|
@ -454,14 +454,14 @@ class GenerateWalletsProvider with ChangeNotifier {
|
||||||
await sub.importAccount(mnemonic: generatedMnemonic!, password: pin.text);
|
await sub.importAccount(mnemonic: generatedMnemonic!, password: pin.text);
|
||||||
|
|
||||||
WalletData myWallet = WalletData(
|
WalletData myWallet = WalletData(
|
||||||
version: dataVersion,
|
|
||||||
chest: currentChestNumber,
|
chest: currentChestNumber,
|
||||||
address: addressData.address!,
|
address: addressData.address!,
|
||||||
number: 0,
|
number: 0,
|
||||||
name: walletName,
|
name: walletName,
|
||||||
derivation: -1,
|
derivation: -1,
|
||||||
imageDefaultPath: '0.png');
|
imageDefaultPath: '0.png',
|
||||||
await walletBox.add(myWallet);
|
isOwned: true);
|
||||||
|
await walletBox.put(myWallet.address, myWallet);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -11,15 +11,8 @@ import 'package:flutter/services.dart';
|
||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'package:gecko/globals.dart';
|
import 'package:gecko/globals.dart';
|
||||||
import 'package:gecko/models/wallet_data.dart';
|
|
||||||
import 'package:gecko/models/widgets_keys.dart';
|
|
||||||
import 'package:gecko/providers/my_wallets.dart';
|
|
||||||
import 'package:gecko/providers/substrate_sdk.dart';
|
import 'package:gecko/providers/substrate_sdk.dart';
|
||||||
import 'package:gecko/providers/wallet_options.dart';
|
import 'package:gecko/providers/wallet_options.dart';
|
||||||
import 'package:gecko/providers/wallets_profiles.dart';
|
|
||||||
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
|
|
||||||
import 'package:gecko/screens/myWallets/wallets_home.dart';
|
|
||||||
import 'package:gecko/screens/search.dart';
|
|
||||||
import 'package:hive_flutter/hive_flutter.dart';
|
import 'package:hive_flutter/hive_flutter.dart';
|
||||||
import 'package:flutter/foundation.dart' show kDebugMode, kIsWeb;
|
import 'package:flutter/foundation.dart' show kDebugMode, kIsWeb;
|
||||||
import 'package:path_provider/path_provider.dart' as pp;
|
import 'package:path_provider/path_provider.dart' as pp;
|
||||||
|
@ -34,6 +27,7 @@ class HomeProvider with ChangeNotifier {
|
||||||
Widget appBarTitle = Text('Ğecko', style: TextStyle(color: Colors.grey[850]));
|
Widget appBarTitle = Text('Ğecko', style: TextStyle(color: Colors.grey[850]));
|
||||||
String homeMessage = "loading".tr();
|
String homeMessage = "loading".tr();
|
||||||
String defaultMessage = "noLizard".tr();
|
String defaultMessage = "noLizard".tr();
|
||||||
|
bool isWalletBoxInit = false;
|
||||||
|
|
||||||
Future<void> initHive() async {
|
Future<void> initHive() async {
|
||||||
late Directory hivePath;
|
late Directory hivePath;
|
||||||
|
@ -135,104 +129,6 @@ class HomeProvider with ChangeNotifier {
|
||||||
// volume: volume, mode: PlayerMode.LOW_LATENCY, stayAwake: false);
|
// volume: volume, mode: PlayerMode.LOW_LATENCY, stayAwake: false);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
Widget bottomAppBar(BuildContext context) {
|
|
||||||
final myWalletProvider =
|
|
||||||
Provider.of<MyWalletsProvider>(context, listen: false);
|
|
||||||
WalletsProfilesProvider historyProvider =
|
|
||||||
Provider.of<WalletsProfilesProvider>(context, listen: false);
|
|
||||||
|
|
||||||
final size = MediaQuery.of(context).size;
|
|
||||||
|
|
||||||
const bool showBottomBar = true;
|
|
||||||
|
|
||||||
return Visibility(
|
|
||||||
visible: showBottomBar,
|
|
||||||
child: Container(
|
|
||||||
color: yellowC,
|
|
||||||
width: size.width,
|
|
||||||
height: 80,
|
|
||||||
child:
|
|
||||||
// Stack(
|
|
||||||
// children: [
|
|
||||||
// // CustomPaint(
|
|
||||||
// // size: Size(size.width, 110),
|
|
||||||
// // painter: CustomRoundedButton(),
|
|
||||||
// // ),
|
|
||||||
Row(mainAxisAlignment: MainAxisAlignment.start, children: [
|
|
||||||
// SizedBox(width: 0),
|
|
||||||
const Spacer(),
|
|
||||||
const SizedBox(width: 11),
|
|
||||||
IconButton(
|
|
||||||
key: keyAppBarSearch,
|
|
||||||
iconSize: 40,
|
|
||||||
icon: const Image(image: AssetImage('assets/loupe-noire.png')),
|
|
||||||
onPressed: () {
|
|
||||||
Navigator.popUntil(
|
|
||||||
context,
|
|
||||||
ModalRoute.withName('/'),
|
|
||||||
);
|
|
||||||
Navigator.push(
|
|
||||||
context,
|
|
||||||
MaterialPageRoute(builder: (homeContext) {
|
|
||||||
return const SearchScreen();
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
const SizedBox(width: 22),
|
|
||||||
const Spacer(),
|
|
||||||
IconButton(
|
|
||||||
key: keyAppBarQrcode,
|
|
||||||
iconSize: 70,
|
|
||||||
icon: const Image(image: AssetImage('assets/qrcode-scan.png')),
|
|
||||||
onPressed: () async {
|
|
||||||
Navigator.popUntil(
|
|
||||||
context,
|
|
||||||
ModalRoute.withName('/'),
|
|
||||||
);
|
|
||||||
historyProvider.scan(homeContext);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
const Spacer(),
|
|
||||||
const SizedBox(width: 15),
|
|
||||||
IconButton(
|
|
||||||
key: keyAppBarChest,
|
|
||||||
iconSize: 60,
|
|
||||||
icon: const Image(image: AssetImage('assets/wallet.png')),
|
|
||||||
onPressed: () async {
|
|
||||||
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.popUntil(
|
|
||||||
context,
|
|
||||||
ModalRoute.withName('/'),
|
|
||||||
);
|
|
||||||
Navigator.push(
|
|
||||||
context,
|
|
||||||
MaterialPageRoute(builder: (context) {
|
|
||||||
return const WalletsHome();
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
),
|
|
||||||
const Spacer(),
|
|
||||||
]),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
void reload() {
|
void reload() {
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,7 @@ class MyWalletsProvider with ChangeNotifier {
|
||||||
}
|
}
|
||||||
|
|
||||||
WalletData? getWalletDataById(List<int?> id) {
|
WalletData? getWalletDataById(List<int?> id) {
|
||||||
if (id.isEmpty) return WalletData(address: '');
|
if (id.isEmpty) return WalletData(address: '', isOwned: true);
|
||||||
int? chest = id[0];
|
int? chest = id[0];
|
||||||
int? nbr = id[1];
|
int? nbr = id[1];
|
||||||
WalletData? targetedWallet;
|
WalletData? targetedWallet;
|
||||||
|
@ -78,12 +78,12 @@ class MyWalletsProvider with ChangeNotifier {
|
||||||
|
|
||||||
WalletData getDefaultWallet([int? chest]) {
|
WalletData getDefaultWallet([int? chest]) {
|
||||||
if (chestBox.isEmpty) {
|
if (chestBox.isEmpty) {
|
||||||
return WalletData(address: '', chest: 0, number: 0);
|
return WalletData(address: '', chest: 0, number: 0, isOwned: true);
|
||||||
} else {
|
} else {
|
||||||
chest ??= getCurrentChest();
|
chest ??= getCurrentChest();
|
||||||
int? defaultWalletNumber = chestBox.get(chest)!.defaultWallet;
|
int? defaultWalletNumber = chestBox.get(chest)!.defaultWallet;
|
||||||
return getWalletDataById([chest, defaultWalletNumber]) ??
|
return getWalletDataById([chest, defaultWalletNumber]) ??
|
||||||
WalletData(address: '', chest: chest, number: 0);
|
WalletData(address: '', chest: chest, number: 0, isOwned: true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,15 +134,15 @@ class MyWalletsProvider with ChangeNotifier {
|
||||||
context, defaultWallet.address, newDerivationNbr, pinCode);
|
context, defaultWallet.address, newDerivationNbr, pinCode);
|
||||||
|
|
||||||
WalletData newWallet = WalletData(
|
WalletData newWallet = WalletData(
|
||||||
version: dataVersion,
|
|
||||||
chest: chest,
|
chest: chest,
|
||||||
address: address,
|
address: address,
|
||||||
number: newWalletNbr,
|
number: newWalletNbr,
|
||||||
name: name,
|
name: name,
|
||||||
derivation: newDerivationNbr,
|
derivation: newDerivationNbr,
|
||||||
imageDefaultPath: '${newWalletNbr % 4}.png');
|
imageDefaultPath: '${newWalletNbr % 4}.png',
|
||||||
|
isOwned: true);
|
||||||
|
|
||||||
await walletBox.add(newWallet);
|
await walletBox.put(newWallet.address, newWallet);
|
||||||
|
|
||||||
isNewDerivationLoading = false;
|
isNewDerivationLoading = false;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
@ -158,6 +158,9 @@ class MyWalletsProvider with ChangeNotifier {
|
||||||
int? chest = getCurrentChest();
|
int? chest = getCurrentChest();
|
||||||
|
|
||||||
List<WalletData> walletConfig = readAllWallets(chest);
|
List<WalletData> walletConfig = readAllWallets(chest);
|
||||||
|
walletConfig.sort((p1, p2) {
|
||||||
|
return Comparable.compare(p1.number!, p2.number!);
|
||||||
|
});
|
||||||
|
|
||||||
if (walletConfig.isEmpty) {
|
if (walletConfig.isEmpty) {
|
||||||
newWalletNbr = 0;
|
newWalletNbr = 0;
|
||||||
|
@ -172,15 +175,15 @@ class MyWalletsProvider with ChangeNotifier {
|
||||||
await sub.generateRootKeypair(defaultWallet.address, pinCode);
|
await sub.generateRootKeypair(defaultWallet.address, pinCode);
|
||||||
|
|
||||||
WalletData newWallet = WalletData(
|
WalletData newWallet = WalletData(
|
||||||
version: dataVersion,
|
|
||||||
chest: chest,
|
chest: chest,
|
||||||
address: address,
|
address: address,
|
||||||
number: newWalletNbr,
|
number: newWalletNbr,
|
||||||
name: name,
|
name: name,
|
||||||
derivation: -1,
|
derivation: -1,
|
||||||
imageDefaultPath: '${newWalletNbr % 4}.png');
|
imageDefaultPath: '${newWalletNbr % 4}.png',
|
||||||
|
isOwned: true);
|
||||||
|
|
||||||
await walletBox.add(newWallet);
|
await walletBox.put(newWallet.address, newWallet);
|
||||||
|
|
||||||
isNewDerivationLoading = false;
|
isNewDerivationLoading = false;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
@ -194,6 +197,9 @@ class MyWalletsProvider with ChangeNotifier {
|
||||||
chestNumber ??= getCurrentChest();
|
chestNumber ??= getCurrentChest();
|
||||||
|
|
||||||
List<WalletData> walletConfig = readAllWallets(chestNumber);
|
List<WalletData> walletConfig = readAllWallets(chestNumber);
|
||||||
|
walletConfig.sort((p1, p2) {
|
||||||
|
return Comparable.compare(p1.number!, p2.number!);
|
||||||
|
});
|
||||||
|
|
||||||
if (walletConfig.isEmpty) {
|
if (walletConfig.isEmpty) {
|
||||||
newDerivationNbr = 2;
|
newDerivationNbr = 2;
|
||||||
|
|
|
@ -251,8 +251,13 @@ class SubstrateSdk with ChangeNotifier {
|
||||||
return totalAmount;
|
return totalAmount;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> isMemberGet(String address) async {
|
Future<bool> isMember(String address) async {
|
||||||
return await idtyStatus(address) == 'Validated';
|
final isMember = await idtyStatus(address) == 'Validated';
|
||||||
|
final walletData = walletBox.get(address) ?? WalletData(address: address);
|
||||||
|
walletData.isMember = isMember;
|
||||||
|
walletBox.put(address, walletData);
|
||||||
|
notifyListeners();
|
||||||
|
return isMember;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> isSmithGet(String address) async {
|
Future<bool> isSmithGet(String address) async {
|
||||||
|
@ -272,7 +277,7 @@ class SubstrateSdk with ChangeNotifier {
|
||||||
Map<String, int> result = {};
|
Map<String, int> result = {};
|
||||||
final toStatus = await idtyStatus(to);
|
final toStatus = await idtyStatus(to);
|
||||||
|
|
||||||
if (from != to && await isMemberGet(from)) {
|
if (from != to && await isMember(from)) {
|
||||||
final removableOn = await getCertValidityPeriod(from, to);
|
final removableOn = await getCertValidityPeriod(from, to);
|
||||||
final certMeta = await getCertMeta(from);
|
final certMeta = await getCertMeta(from);
|
||||||
final int nextIssuableOn = certMeta['nextIssuableOn'] ?? 0;
|
final int nextIssuableOn = certMeta['nextIssuableOn'] ?? 0;
|
||||||
|
|
|
@ -129,11 +129,6 @@ class WalletOptionsProvider with ChangeNotifier {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<bool> isMember(BuildContext context, String address) async {
|
|
||||||
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
|
||||||
return await sub.idtyStatus(address) == 'Validated';
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<String?> confirmIdentityPopup(BuildContext context) async {
|
Future<String?> confirmIdentityPopup(BuildContext context) async {
|
||||||
TextEditingController idtyName = TextEditingController();
|
TextEditingController idtyName = TextEditingController();
|
||||||
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
||||||
|
@ -234,8 +229,7 @@ class WalletOptionsProvider with ChangeNotifier {
|
||||||
transType: 'comfirmIdty',
|
transType: 'comfirmIdty',
|
||||||
fromAddress:
|
fromAddress:
|
||||||
getShortPubkey(wallet.address),
|
getShortPubkey(wallet.address),
|
||||||
toAddress:
|
toAddress: getShortPubkey(wallet.address),
|
||||||
getShortPubkey(wallet.address),
|
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
@ -311,7 +305,7 @@ class WalletOptionsProvider with ChangeNotifier {
|
||||||
if (canValidateNameBool) {
|
if (canValidateNameBool) {
|
||||||
nameController.text = walletName.text;
|
nameController.text = walletName.text;
|
||||||
_renameWallet(wID, walletName.text, isCesium: false);
|
_renameWallet(wID, walletName.text, isCesium: false);
|
||||||
// notifyListeners();
|
notifyListeners();
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -7,10 +7,10 @@ import 'package:gecko/models/queries_indexer.dart';
|
||||||
import 'package:gecko/models/widgets_keys.dart';
|
import 'package:gecko/models/widgets_keys.dart';
|
||||||
import 'package:gecko/providers/cesium_plus.dart';
|
import 'package:gecko/providers/cesium_plus.dart';
|
||||||
import 'package:gecko/providers/duniter_indexer.dart';
|
import 'package:gecko/providers/duniter_indexer.dart';
|
||||||
import 'package:gecko/providers/home.dart';
|
|
||||||
import 'package:gecko/providers/substrate_sdk.dart';
|
import 'package:gecko/providers/substrate_sdk.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:gecko/screens/wallet_view.dart';
|
import 'package:gecko/screens/wallet_view.dart';
|
||||||
|
import 'package:gecko/widgets/bottom_app_bar.dart';
|
||||||
import 'package:gecko/widgets/header_profile.dart';
|
import 'package:gecko/widgets/header_profile.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';
|
||||||
|
@ -31,11 +31,6 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
HomeProvider homeProvider =
|
|
||||||
Provider.of<HomeProvider>(context, listen: false);
|
|
||||||
|
|
||||||
// log.d('aaaaaaaaaaaaaaaaaaaaa $startBlockchainTime');
|
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
key: _scaffoldKey,
|
key: _scaffoldKey,
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
|
@ -46,7 +41,7 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier {
|
||||||
child: Text('accountActivity'.tr()),
|
child: Text('accountActivity'.tr()),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
bottomNavigationBar: homeProvider.bottomAppBar(context),
|
bottomNavigationBar: const GeckoBottomAppBar(),
|
||||||
body: Column(children: <Widget>[
|
body: Column(children: <Widget>[
|
||||||
HeaderProfile(address: address, username: username),
|
HeaderProfile(address: address, username: username),
|
||||||
historyQuery(context),
|
historyQuery(context),
|
||||||
|
|
|
@ -4,7 +4,8 @@ import 'package:bubble/bubble.dart';
|
||||||
import 'package:connectivity_plus/connectivity_plus.dart';
|
import 'package:connectivity_plus/connectivity_plus.dart';
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:gecko/globals.dart';
|
import 'package:gecko/globals.dart';
|
||||||
import 'package:gecko/models/stateful_wrapper.dart';
|
import 'package:gecko/models/chest_data.dart';
|
||||||
|
import 'package:gecko/models/g1_wallets_list.dart';
|
||||||
import 'package:gecko/models/widgets_keys.dart';
|
import 'package:gecko/models/widgets_keys.dart';
|
||||||
import 'package:gecko/providers/chest_provider.dart';
|
import 'package:gecko/providers/chest_provider.dart';
|
||||||
import 'package:gecko/providers/duniter_indexer.dart';
|
import 'package:gecko/providers/duniter_indexer.dart';
|
||||||
|
@ -22,21 +23,109 @@ import 'package:gecko/screens/myWallets/wallets_home.dart';
|
||||||
import 'package:gecko/screens/onBoarding/1.dart';
|
import 'package:gecko/screens/onBoarding/1.dart';
|
||||||
import 'package:gecko/screens/search.dart';
|
import 'package:gecko/screens/search.dart';
|
||||||
import 'package:gecko/screens/settings.dart';
|
import 'package:gecko/screens/settings.dart';
|
||||||
|
import 'package:hive_flutter/hive_flutter.dart';
|
||||||
|
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:gecko/screens/my_contacts.dart';
|
import 'package:gecko/screens/my_contacts.dart';
|
||||||
|
|
||||||
class HomeScreen extends StatelessWidget {
|
class HomeScreen extends StatefulWidget {
|
||||||
const HomeScreen({Key? key}) : super(key: key);
|
const HomeScreen({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<HomeScreen> createState() => _HomeScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _HomeScreenState extends State<HomeScreen> {
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
||||||
|
final homeProviderInit =
|
||||||
|
Provider.of<HomeProvider>(context, listen: false);
|
||||||
|
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
||||||
|
final duniterIndexer =
|
||||||
|
Provider.of<DuniterIndexer>(context, listen: false);
|
||||||
|
final myWalletProvider =
|
||||||
|
Provider.of<MyWalletsProvider>(context, listen: false);
|
||||||
|
|
||||||
|
configBox = await Hive.openBox("configBox");
|
||||||
|
final bool isWalletsExists = myWalletProvider.checkIfWalletExist();
|
||||||
|
|
||||||
|
if (!sub.sdkReady && !sub.sdkLoading) await sub.initApi();
|
||||||
|
if (sub.sdkReady && !sub.nodeConnected) {
|
||||||
|
// Check if versionData non compatible, drop everything
|
||||||
|
if (isWalletsExists &&
|
||||||
|
(configBox.get('dataVersion') ?? 0) < dataVersion) {
|
||||||
|
await infoPopup(context, "chestNotCompatibleMustReinstallGecko".tr());
|
||||||
|
await Hive.deleteBoxFromDisk('walletBox');
|
||||||
|
await Hive.deleteBoxFromDisk('chestBox');
|
||||||
|
chestBox = await Hive.openBox<ChestData>("chestBox");
|
||||||
|
await configBox.delete('defaultWallet');
|
||||||
|
await sub.deleteAllAccounts();
|
||||||
|
configBox.put('dataVersion', dataVersion);
|
||||||
|
myWalletProvider.reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
walletBox = await Hive.openBox<WalletData>("walletBox");
|
||||||
|
await Hive.deleteBoxFromDisk('g1WalletsBox');
|
||||||
|
g1WalletsBox = await Hive.openBox<G1WalletsList>("g1WalletsBox");
|
||||||
|
contactsBox = await Hive.openBox<G1WalletsList>("contactsBox");
|
||||||
|
|
||||||
|
homeProviderInit.isWalletBoxInit = true;
|
||||||
|
myWalletProvider.reload();
|
||||||
|
|
||||||
|
duniterIndexer.getValidIndexerEndpoint();
|
||||||
|
|
||||||
|
await homeProviderInit.getValidEndpoints();
|
||||||
|
// await configBox.delete('isCacheChecked');
|
||||||
|
if (configBox.get('isCacheChecked') == null) {
|
||||||
|
configBox.put('isCacheChecked', false);
|
||||||
|
}
|
||||||
|
// log.d(await configBox.get('endpoint'));
|
||||||
|
|
||||||
|
// var connectivityResult =
|
||||||
|
// await (Connectivity().checkConnectivity());
|
||||||
|
|
||||||
|
// if (connectivityResult != ConnectivityResult.mobile &&
|
||||||
|
// connectivityResult != ConnectivityResult.wifi) {
|
||||||
|
// homeProvider.changeMessage(
|
||||||
|
// "notConnectedToInternet".tr(), 0);
|
||||||
|
// sub.nodeConnected = false;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// TODO: fix random bad network status on startup
|
||||||
|
HomeProvider homeProvider =
|
||||||
|
Provider.of<HomeProvider>(context, listen: false);
|
||||||
|
Connectivity()
|
||||||
|
.onConnectivityChanged
|
||||||
|
.listen((ConnectivityResult result) async {
|
||||||
|
log.d('Network changed: $result');
|
||||||
|
if (result == ConnectivityResult.none) {
|
||||||
|
sub.nodeConnected = false;
|
||||||
|
await sub.sdk.api.setting.unsubscribeBestNumber();
|
||||||
|
homeProvider.changeMessage("notConnectedToInternet".tr(), 0);
|
||||||
|
sub.reload();
|
||||||
|
} else {
|
||||||
|
await sub.connectNode(context);
|
||||||
|
// Currency parameters
|
||||||
|
sub.initCurrencyParameters();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Indexer Blockchain start
|
||||||
|
getBlockStart();
|
||||||
|
});
|
||||||
|
// await sub.connectNode(ctx);
|
||||||
|
}
|
||||||
|
// _duniterIndexer.checkIndexerEndpointBackground();
|
||||||
|
});
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
homeContext = context;
|
homeContext = context;
|
||||||
|
|
||||||
final myWalletProvider = Provider.of<MyWalletsProvider>(context);
|
final myWalletProvider = Provider.of<MyWalletsProvider>(context);
|
||||||
Provider.of<ChestProvider>(context);
|
Provider.of<ChestProvider>(context);
|
||||||
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
|
||||||
|
|
||||||
final bool isWalletsExists = myWalletProvider.checkIfWalletExist();
|
final bool isWalletsExists = myWalletProvider.checkIfWalletExist();
|
||||||
|
|
||||||
isTall = false;
|
isTall = false;
|
||||||
|
@ -46,148 +135,65 @@ class HomeScreen extends StatelessWidget {
|
||||||
ratio = 1.125;
|
ratio = 1.125;
|
||||||
}
|
}
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
resizeToAvoidBottomInset: false,
|
resizeToAvoidBottomInset: false,
|
||||||
drawer: Drawer(
|
drawer: Drawer(
|
||||||
child: Column(
|
child: Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Expanded(
|
Expanded(
|
||||||
child: ListView(padding: EdgeInsets.zero, children: <Widget>[
|
child: ListView(padding: EdgeInsets.zero, children: <Widget>[
|
||||||
DrawerHeader(
|
DrawerHeader(
|
||||||
decoration: const BoxDecoration(
|
decoration: const BoxDecoration(
|
||||||
color: orangeC,
|
color: orangeC,
|
||||||
|
),
|
||||||
|
child: Column(children: const <Widget>[
|
||||||
|
SizedBox(height: 0),
|
||||||
|
Image(
|
||||||
|
image: AssetImage('assets/icon/gecko_final.png'),
|
||||||
|
height: 130),
|
||||||
|
]),
|
||||||
),
|
),
|
||||||
child: Column(children: const <Widget>[
|
ListTile(
|
||||||
SizedBox(height: 0),
|
key: keyParameters,
|
||||||
Image(
|
title: Text('parameters'.tr()),
|
||||||
image: AssetImage('assets/icon/gecko_final.png'),
|
onTap: () {
|
||||||
height: 130),
|
Navigator.pop(context);
|
||||||
]),
|
Navigator.push(
|
||||||
),
|
context,
|
||||||
ListTile(
|
MaterialPageRoute(builder: (context) {
|
||||||
key: keyParameters,
|
return SettingsScreen();
|
||||||
title: Text('parameters'.tr()),
|
}),
|
||||||
onTap: () {
|
);
|
||||||
Navigator.pop(context);
|
},
|
||||||
Navigator.push(
|
),
|
||||||
context,
|
ListTile(
|
||||||
MaterialPageRoute(builder: (context) {
|
key: keyContacts,
|
||||||
return SettingsScreen();
|
title: Text('contactsManagement'.tr()),
|
||||||
}),
|
onTap: () {
|
||||||
);
|
Navigator.pop(context);
|
||||||
},
|
Navigator.push(
|
||||||
),
|
context,
|
||||||
ListTile(
|
MaterialPageRoute(builder: (context) {
|
||||||
key: keyContacts,
|
return const ContactsScreen();
|
||||||
title: Text('contactsManagement'.tr()),
|
}),
|
||||||
onTap: () {
|
);
|
||||||
Navigator.pop(context);
|
},
|
||||||
Navigator.push(
|
),
|
||||||
context,
|
])),
|
||||||
MaterialPageRoute(builder: (context) {
|
Align(
|
||||||
return const ContactsScreen();
|
alignment: FractionalOffset.bottomCenter,
|
||||||
}),
|
child: Text('Ğecko v$appVersion')),
|
||||||
);
|
const SizedBox(height: 20)
|
||||||
},
|
],
|
||||||
),
|
),
|
||||||
])),
|
|
||||||
Align(
|
|
||||||
alignment: FractionalOffset.bottomCenter,
|
|
||||||
child: Text('Ğecko v$appVersion')),
|
|
||||||
const SizedBox(height: 20)
|
|
||||||
],
|
|
||||||
),
|
),
|
||||||
),
|
backgroundColor: const Color(0xffF9F9F1),
|
||||||
// bottomNavigationBar: _homeProvider.bottomBar(context, 1),
|
body: isWalletsExists ? geckHome(context) : welcomeHome(context));
|
||||||
backgroundColor: const Color(0xffF9F9F1),
|
|
||||||
body: Builder(
|
|
||||||
builder: (ctx) => StatefulWrapper(
|
|
||||||
onInit: () {
|
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
|
||||||
final duniterIndexer =
|
|
||||||
Provider.of<DuniterIndexer>(ctx, listen: false);
|
|
||||||
duniterIndexer.getValidIndexerEndpoint();
|
|
||||||
|
|
||||||
if (!sub.sdkReady && !sub.sdkLoading) await sub.initApi();
|
|
||||||
if (sub.sdkReady && !sub.nodeConnected) {
|
|
||||||
// Check if versionData non compatible, drop everything
|
|
||||||
if (walletBox.isNotEmpty &&
|
|
||||||
walletBox.getAt(0)!.version! < dataVersion) {
|
|
||||||
await infoPopup(
|
|
||||||
context, "chestNotCompatibleMustReinstallGecko".tr());
|
|
||||||
await walletBox.clear();
|
|
||||||
await chestBox.clear();
|
|
||||||
await configBox.delete('defaultWallet');
|
|
||||||
await sub.deleteAllAccounts();
|
|
||||||
myWalletProvider.reload();
|
|
||||||
}
|
|
||||||
|
|
||||||
// var connectivityResult =
|
|
||||||
// await (Connectivity().checkConnectivity());
|
|
||||||
|
|
||||||
// if (connectivityResult != ConnectivityResult.mobile &&
|
|
||||||
// connectivityResult != ConnectivityResult.wifi) {
|
|
||||||
// homeProvider.changeMessage(
|
|
||||||
// "notConnectedToInternet".tr(), 0);
|
|
||||||
// sub.nodeConnected = false;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// TODO: fix random bad network status on startup
|
|
||||||
HomeProvider homeProvider =
|
|
||||||
Provider.of<HomeProvider>(ctx, listen: false);
|
|
||||||
Connectivity()
|
|
||||||
.onConnectivityChanged
|
|
||||||
.listen((ConnectivityResult result) async {
|
|
||||||
log.d('Network changed: $result');
|
|
||||||
if (result == ConnectivityResult.none) {
|
|
||||||
sub.nodeConnected = false;
|
|
||||||
await sub.sdk.api.setting.unsubscribeBestNumber();
|
|
||||||
homeProvider.changeMessage(
|
|
||||||
"notConnectedToInternet".tr(), 0);
|
|
||||||
sub.reload();
|
|
||||||
} else {
|
|
||||||
await sub.connectNode(ctx);
|
|
||||||
// Currency parameters
|
|
||||||
sub.initCurrencyParameters();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Indexer Blockchain start
|
|
||||||
getBlockStart();
|
|
||||||
});
|
|
||||||
// await sub.connectNode(ctx);
|
|
||||||
}
|
|
||||||
// _duniterIndexer.checkIndexerEndpointBackground();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
child: isWalletsExists ? geckHome(context) : welcomeHome(context)
|
|
||||||
// bottomNavigationBar: BottomNavigationBar(
|
|
||||||
// backgroundColor: backgroundColor,
|
|
||||||
// fixedColor: Colors.grey[850],
|
|
||||||
// unselectedItemColor: const Color(0xffBD935C),
|
|
||||||
// type: BottomNavigationBarType.fixed,
|
|
||||||
// onTap: (index) {
|
|
||||||
// _homeProvider.currentIndex = index;
|
|
||||||
// },
|
|
||||||
// currentIndex: _homeProvider.currentIndex,
|
|
||||||
// items: [
|
|
||||||
// BottomNavigationBarItem(
|
|
||||||
// icon: Image.asset('assets/block-space-disabled.png', height: 26),
|
|
||||||
// activeIcon: Image.asset('assets/blockchain.png', height: 26),
|
|
||||||
// label: 'Explorateur',
|
|
||||||
// ),
|
|
||||||
// const BottomNavigationBarItem(
|
|
||||||
// icon: Icon(Icons.lock),
|
|
||||||
// label: 'Mes portefeuilles',
|
|
||||||
// ),
|
|
||||||
// ],
|
|
||||||
// ),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget geckHome(context) {
|
Widget geckHome(context) {
|
||||||
final myWalletProvider = Provider.of<MyWalletsProvider>(context);
|
final myWalletProvider = Provider.of<MyWalletsProvider>(context);
|
||||||
|
final homeProvider = Provider.of<HomeProvider>(context, listen: false);
|
||||||
Provider.of<ChestProvider>(context);
|
Provider.of<ChestProvider>(context);
|
||||||
|
|
||||||
WalletsProfilesProvider historyProvider =
|
WalletsProfilesProvider historyProvider =
|
||||||
|
@ -334,42 +340,47 @@ Widget geckHome(context) {
|
||||||
child: ClipOval(
|
child: ClipOval(
|
||||||
key: keyOpenWalletsHomme,
|
key: keyOpenWalletsHomme,
|
||||||
child: Material(
|
child: Material(
|
||||||
color: orangeC, // button color
|
color: homeProvider.isWalletBoxInit
|
||||||
|
? orangeC
|
||||||
|
: Colors.grey[500], // button color
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
|
onTap: !homeProvider.isWalletBoxInit
|
||||||
|
? null
|
||||||
|
: () async {
|
||||||
|
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 const WalletsHome();
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// log.d(_myWalletProvider.pinCode);
|
||||||
|
|
||||||
|
// Navigator.pushNamed(
|
||||||
|
// context, '/mywallets')));
|
||||||
|
},
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.all(18),
|
padding: const EdgeInsets.all(18),
|
||||||
child: Image(
|
child: Image(
|
||||||
image: const AssetImage(
|
image: const AssetImage(
|
||||||
'assets/home/wallet.png'),
|
'assets/home/wallet.png'),
|
||||||
height: 68 * ratio)),
|
height: 68 * ratio))),
|
||||||
onTap: () async {
|
|
||||||
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 const WalletsHome();
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// log.d(_myWalletProvider.pinCode);
|
|
||||||
|
|
||||||
// Navigator.pushNamed(
|
|
||||||
// context, '/mywallets')));
|
|
||||||
}),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -8,7 +8,6 @@ import 'package:gecko/models/chest_data.dart';
|
||||||
import 'package:gecko/models/wallet_data.dart';
|
import 'package:gecko/models/wallet_data.dart';
|
||||||
import 'package:gecko/models/widgets_keys.dart';
|
import 'package:gecko/models/widgets_keys.dart';
|
||||||
import 'package:gecko/providers/chest_provider.dart';
|
import 'package:gecko/providers/chest_provider.dart';
|
||||||
import 'package:gecko/providers/home.dart';
|
|
||||||
import 'package:gecko/providers/my_wallets.dart';
|
import 'package:gecko/providers/my_wallets.dart';
|
||||||
import 'package:gecko/providers/substrate_sdk.dart';
|
import 'package:gecko/providers/substrate_sdk.dart';
|
||||||
import 'package:gecko/screens/common_elements.dart';
|
import 'package:gecko/screens/common_elements.dart';
|
||||||
|
@ -16,6 +15,7 @@ import 'package:gecko/screens/myWallets/change_pin.dart';
|
||||||
import 'package:gecko/screens/myWallets/custom_derivations.dart';
|
import 'package:gecko/screens/myWallets/custom_derivations.dart';
|
||||||
import 'package:gecko/screens/myWallets/show_seed.dart';
|
import 'package:gecko/screens/myWallets/show_seed.dart';
|
||||||
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
|
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
|
||||||
|
import 'package:gecko/widgets/bottom_app_bar.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class ChestOptions extends StatelessWidget {
|
class ChestOptions extends StatelessWidget {
|
||||||
|
@ -26,8 +26,6 @@ class ChestOptions extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final chestProvider = Provider.of<ChestProvider>(context, listen: false);
|
final chestProvider = Provider.of<ChestProvider>(context, listen: false);
|
||||||
HomeProvider homeProvider =
|
|
||||||
Provider.of<HomeProvider>(context, listen: false);
|
|
||||||
|
|
||||||
ChestData currentChest = chestBox.get(configBox.get('currentChest'))!;
|
ChestData currentChest = chestBox.get(configBox.get('currentChest'))!;
|
||||||
|
|
||||||
|
@ -50,7 +48,7 @@ class ChestOptions extends StatelessWidget {
|
||||||
height: 22,
|
height: 22,
|
||||||
child: Text(currentChest.name!),
|
child: Text(currentChest.name!),
|
||||||
)),
|
)),
|
||||||
bottomNavigationBar: homeProvider.bottomAppBar(context),
|
bottomNavigationBar: const GeckoBottomAppBar(),
|
||||||
body: Stack(children: [
|
body: Stack(children: [
|
||||||
Builder(
|
Builder(
|
||||||
builder: (ctx) => SafeArea(
|
builder: (ctx) => SafeArea(
|
||||||
|
|
|
@ -125,29 +125,32 @@ class UnlockingWallet extends StatelessWidget {
|
||||||
pinForm(context, pinLenght),
|
pinForm(context, pinLenght),
|
||||||
SizedBox(height: 3 * ratio),
|
SizedBox(height: 3 * ratio),
|
||||||
if (canUnlock)
|
if (canUnlock)
|
||||||
InkWell(
|
Consumer<WalletOptionsProvider>(
|
||||||
key: keyCachePassword,
|
builder: (context, sub, _) {
|
||||||
onTap: () {
|
return InkWell(
|
||||||
walletOptions.changePinCacheChoice();
|
key: keyCachePassword,
|
||||||
},
|
onTap: () {
|
||||||
child: Row(children: [
|
walletOptions.changePinCacheChoice();
|
||||||
const SizedBox(height: 30),
|
},
|
||||||
const Spacer(),
|
child: Row(children: [
|
||||||
Icon(
|
const SizedBox(height: 30),
|
||||||
configBox.get('isCacheChecked')
|
const Spacer(),
|
||||||
? Icons.check_box
|
Icon(
|
||||||
: Icons.check_box_outline_blank,
|
configBox.get('isCacheChecked')
|
||||||
color: orangeC,
|
? Icons.check_box
|
||||||
),
|
: Icons.check_box_outline_blank,
|
||||||
const SizedBox(width: 8),
|
color: orangeC,
|
||||||
Text(
|
),
|
||||||
'rememberPassword'.tr(),
|
const SizedBox(width: 8),
|
||||||
style: TextStyle(
|
Text(
|
||||||
fontSize: 16, color: Colors.grey[700]),
|
'rememberPassword'.tr(),
|
||||||
),
|
style: TextStyle(
|
||||||
const Spacer()
|
fontSize: 16, color: Colors.grey[700]),
|
||||||
]),
|
),
|
||||||
),
|
const Spacer()
|
||||||
|
]),
|
||||||
|
);
|
||||||
|
}),
|
||||||
const SizedBox(height: 10),
|
const SizedBox(height: 10),
|
||||||
// if (canUnlock)
|
// if (canUnlock)
|
||||||
InkWell(
|
InkWell(
|
||||||
|
@ -213,7 +216,7 @@ class UnlockingWallet extends StatelessWidget {
|
||||||
obscureText: true,
|
obscureText: true,
|
||||||
obscuringCharacter: '*',
|
obscuringCharacter: '*',
|
||||||
animationType: AnimationType.slide,
|
animationType: AnimationType.slide,
|
||||||
animationDuration: const Duration(milliseconds: 80),
|
animationDuration: const Duration(milliseconds: 40),
|
||||||
validator: (v) {
|
validator: (v) {
|
||||||
if (v!.length < pinLenght) {
|
if (v!.length < pinLenght) {
|
||||||
return "yourPasswordLengthIsX".tr(args: [pinLenght.toString()]);
|
return "yourPasswordLengthIsX".tr(args: [pinLenght.toString()]);
|
||||||
|
@ -250,7 +253,7 @@ class UnlockingWallet extends StatelessWidget {
|
||||||
final isValid = await sub.checkPassword(
|
final isValid = await sub.checkPassword(
|
||||||
defaultWallet.address, pin.toUpperCase());
|
defaultWallet.address, pin.toUpperCase());
|
||||||
if (!isValid) {
|
if (!isValid) {
|
||||||
await Future.delayed(const Duration(milliseconds: 50));
|
await Future.delayed(const Duration(milliseconds: 20));
|
||||||
pinColor = Colors.red[600];
|
pinColor = Colors.red[600];
|
||||||
myWalletProvider.isPinLoading = false;
|
myWalletProvider.isPinLoading = false;
|
||||||
myWalletProvider.isPinValid = false;
|
myWalletProvider.isPinValid = false;
|
||||||
|
|
|
@ -6,7 +6,6 @@ import 'package:flutter/services.dart';
|
||||||
import 'package:gecko/globals.dart';
|
import 'package:gecko/globals.dart';
|
||||||
import 'package:gecko/models/widgets_keys.dart';
|
import 'package:gecko/models/widgets_keys.dart';
|
||||||
import 'package:gecko/providers/duniter_indexer.dart';
|
import 'package:gecko/providers/duniter_indexer.dart';
|
||||||
import 'package:gecko/providers/home.dart';
|
|
||||||
import 'package:gecko/providers/my_wallets.dart';
|
import 'package:gecko/providers/my_wallets.dart';
|
||||||
import 'package:gecko/models/wallet_data.dart';
|
import 'package:gecko/models/wallet_data.dart';
|
||||||
import 'package:gecko/providers/substrate_sdk.dart';
|
import 'package:gecko/providers/substrate_sdk.dart';
|
||||||
|
@ -18,6 +17,7 @@ import 'package:gecko/screens/activity.dart';
|
||||||
import 'package:gecko/screens/myWallets/manage_membership.dart';
|
import 'package:gecko/screens/myWallets/manage_membership.dart';
|
||||||
import 'package:gecko/screens/qrcode_fullscreen.dart';
|
import 'package:gecko/screens/qrcode_fullscreen.dart';
|
||||||
import 'package:gecko/widgets/balance.dart';
|
import 'package:gecko/widgets/balance.dart';
|
||||||
|
import 'package:gecko/widgets/bottom_app_bar.dart';
|
||||||
import 'package:gecko/widgets/certifications.dart';
|
import 'package:gecko/widgets/certifications.dart';
|
||||||
import 'package:gecko/widgets/idty_status.dart';
|
import 'package:gecko/widgets/idty_status.dart';
|
||||||
import 'package:gecko/widgets/name_by_address.dart';
|
import 'package:gecko/widgets/name_by_address.dart';
|
||||||
|
@ -39,9 +39,8 @@ class WalletOptions extends StatelessWidget {
|
||||||
Provider.of<WalletsProfilesProvider>(context, listen: false);
|
Provider.of<WalletsProfilesProvider>(context, listen: false);
|
||||||
final myWalletProvider =
|
final myWalletProvider =
|
||||||
Provider.of<MyWalletsProvider>(context, listen: false);
|
Provider.of<MyWalletsProvider>(context, listen: false);
|
||||||
HomeProvider homeProvider =
|
|
||||||
Provider.of<HomeProvider>(context, listen: false);
|
|
||||||
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
||||||
|
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
||||||
|
|
||||||
// final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
// final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
||||||
// sub.spawnBlock();
|
// sub.spawnBlock();
|
||||||
|
@ -50,6 +49,8 @@ class WalletOptions extends StatelessWidget {
|
||||||
log.d(walletOptions.address.text);
|
log.d(walletOptions.address.text);
|
||||||
|
|
||||||
final currentChest = myWalletProvider.getCurrentChest();
|
final currentChest = myWalletProvider.getCurrentChest();
|
||||||
|
bool isWalletNameIndexed =
|
||||||
|
duniterIndexer.walletNameIndexer[walletOptions.address.text] != null;
|
||||||
|
|
||||||
// final currentWallet = _myWalletProvider.getDefaultWallet();
|
// final currentWallet = _myWalletProvider.getDefaultWallet();
|
||||||
// log.d(_walletOptions.getAddress(_currentChest, 3));
|
// log.d(_walletOptions.getAddress(_currentChest, 3));
|
||||||
|
@ -81,7 +82,10 @@ class WalletOptions extends StatelessWidget {
|
||||||
height: 22,
|
height: 22,
|
||||||
child: Consumer<WalletOptionsProvider>(
|
child: Consumer<WalletOptionsProvider>(
|
||||||
builder: (context, walletProvider, _) {
|
builder: (context, walletProvider, _) {
|
||||||
return Text(wallet.name!);
|
return Text(isWalletNameIndexed
|
||||||
|
? duniterIndexer
|
||||||
|
.walletNameIndexer[walletOptions.address.text]!
|
||||||
|
: wallet.name!);
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
actions: [
|
actions: [
|
||||||
|
@ -104,7 +108,7 @@ class WalletOptions extends StatelessWidget {
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
bottomNavigationBar: homeProvider.bottomAppBar(context),
|
bottomNavigationBar: const GeckoBottomAppBar(),
|
||||||
body: Stack(children: [
|
body: Stack(children: [
|
||||||
Builder(
|
Builder(
|
||||||
builder: (ctx) => SafeArea(
|
builder: (ctx) => SafeArea(
|
||||||
|
@ -125,65 +129,95 @@ class WalletOptions extends StatelessWidget {
|
||||||
backgroundColor,
|
backgroundColor,
|
||||||
],
|
],
|
||||||
)),
|
)),
|
||||||
child: Row(
|
child: Row(children: <Widget>[
|
||||||
// mainAxisAlignment: MainAxisAlignment.end,
|
const Spacer(flex: 1),
|
||||||
children: <Widget>[
|
avatar(walletProvider),
|
||||||
const Spacer(flex: 1),
|
const Spacer(flex: 1),
|
||||||
avatar(walletProvider),
|
Column(
|
||||||
const Spacer(flex: 1),
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
Column(
|
children: <Widget>[
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
Stack(children: [
|
||||||
children: <Widget>[
|
SizedBox(
|
||||||
NameByAddress(
|
width: 250,
|
||||||
address: walletProvider.address.text,
|
child: Row(
|
||||||
wallet: wallet,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
size: 27,
|
children: [
|
||||||
canEdit: false,
|
Consumer<WalletOptionsProvider>(
|
||||||
color: Colors.black,
|
builder: (context, walletProvider, _) {
|
||||||
fontWeight: FontWeight.w400,
|
return NameByAddress(
|
||||||
fontStyle: FontStyle.normal),
|
wallet: wallet,
|
||||||
SizedBox(height: isTall ? 5 : 0),
|
size: 27,
|
||||||
Balance(
|
color: Colors.black,
|
||||||
address: walletProvider.address.text,
|
fontWeight: wallet.isMember
|
||||||
size: 21),
|
? FontWeight.w500
|
||||||
const SizedBox(width: 30),
|
: FontWeight.w400,
|
||||||
InkWell(
|
fontStyle: FontStyle.normal);
|
||||||
onTap: () => duniterIndexer.walletNameIndexer[
|
})
|
||||||
walletProvider.address.text] !=
|
],
|
||||||
null
|
|
||||||
? {
|
|
||||||
Navigator.push(
|
|
||||||
context,
|
|
||||||
PageNoTransit(builder: (context) {
|
|
||||||
return CertificationsScreen(
|
|
||||||
address: walletProvider
|
|
||||||
.address.text,
|
|
||||||
username: duniterIndexer
|
|
||||||
.walletNameIndexer[
|
|
||||||
walletProvider
|
|
||||||
.address.text]!);
|
|
||||||
}),
|
|
||||||
),
|
|
||||||
}
|
|
||||||
: null,
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment:
|
|
||||||
CrossAxisAlignment.center,
|
|
||||||
children: [
|
|
||||||
IdentityStatus(
|
|
||||||
address: walletOptions.address.text,
|
|
||||||
isOwner: true,
|
|
||||||
color: orangeC),
|
|
||||||
Certifications(
|
|
||||||
address:
|
|
||||||
walletProvider.address.text,
|
|
||||||
size: 15)
|
|
||||||
]),
|
|
||||||
),
|
),
|
||||||
SizedBox(height: 10 * ratio),
|
),
|
||||||
]),
|
const SizedBox(width: 10),
|
||||||
const Spacer(flex: 2),
|
if (duniterIndexer
|
||||||
]),
|
.walletNameIndexer[wallet.address] ==
|
||||||
|
null)
|
||||||
|
Positioned(
|
||||||
|
right: 0,
|
||||||
|
child: InkWell(
|
||||||
|
key: keyRenameWallet,
|
||||||
|
onTap: () async {
|
||||||
|
await walletOptions.editWalletName(
|
||||||
|
context, wallet.id());
|
||||||
|
await Future.delayed(
|
||||||
|
const Duration(milliseconds: 30));
|
||||||
|
},
|
||||||
|
child: ClipRRect(
|
||||||
|
child: Image.asset(
|
||||||
|
walletOptions.isEditing
|
||||||
|
? 'assets/walletOptions/android-checkmark.png'
|
||||||
|
: 'assets/walletOptions/edit.png',
|
||||||
|
width: 25,
|
||||||
|
height: 25),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
SizedBox(height: isTall ? 5 : 0),
|
||||||
|
Balance(
|
||||||
|
address: walletProvider.address.text, size: 21),
|
||||||
|
const SizedBox(width: 30),
|
||||||
|
InkWell(
|
||||||
|
onTap: () => isWalletNameIndexed
|
||||||
|
? {
|
||||||
|
Navigator.push(
|
||||||
|
context,
|
||||||
|
PageNoTransit(builder: (context) {
|
||||||
|
return CertificationsScreen(
|
||||||
|
address:
|
||||||
|
walletProvider.address.text,
|
||||||
|
username: duniterIndexer
|
||||||
|
.walletNameIndexer[
|
||||||
|
walletProvider
|
||||||
|
.address.text]!);
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
}
|
||||||
|
: null,
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
IdentityStatus(
|
||||||
|
address: walletOptions.address.text,
|
||||||
|
isOwner: true,
|
||||||
|
color: orangeC),
|
||||||
|
Certifications(
|
||||||
|
address: walletProvider.address.text,
|
||||||
|
size: 15)
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
SizedBox(height: 10 * ratio),
|
||||||
|
]),
|
||||||
|
const Spacer(flex: 2),
|
||||||
|
]),
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
Expanded(
|
Expanded(
|
||||||
|
@ -227,8 +261,8 @@ class WalletOptions extends StatelessWidget {
|
||||||
SizedBox(height: 17 * ratio),
|
SizedBox(height: 17 * ratio),
|
||||||
// walletProvider.isMember(context, _walletOptions.address.text)
|
// walletProvider.isMember(context, _walletOptions.address.text)
|
||||||
FutureBuilder(
|
FutureBuilder(
|
||||||
future: walletProvider.isMember(
|
future:
|
||||||
context, walletOptions.address.text),
|
sub.isMember(walletOptions.address.text),
|
||||||
builder: (BuildContext context,
|
builder: (BuildContext context,
|
||||||
AsyncSnapshot<bool> isMember) {
|
AsyncSnapshot<bool> isMember) {
|
||||||
if (isMember.connectionState !=
|
if (isMember.connectionState !=
|
||||||
|
|
|
@ -1,14 +1,12 @@
|
||||||
// ignore_for_file: use_build_context_synchronously
|
// ignore_for_file: use_build_context_synchronously
|
||||||
|
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
|
|
||||||
import 'package:flutter_markdown/flutter_markdown.dart';
|
import 'package:flutter_markdown/flutter_markdown.dart';
|
||||||
import 'package:gecko/globals.dart';
|
import 'package:gecko/globals.dart';
|
||||||
import 'package:gecko/models/chest_data.dart';
|
import 'package:gecko/models/chest_data.dart';
|
||||||
import 'package:gecko/models/widgets_keys.dart';
|
import 'package:gecko/models/widgets_keys.dart';
|
||||||
import 'package:gecko/providers/home.dart';
|
import 'package:gecko/providers/duniter_indexer.dart';
|
||||||
import 'package:gecko/providers/my_wallets.dart';
|
import 'package:gecko/providers/my_wallets.dart';
|
||||||
import 'package:gecko/models/wallet_data.dart';
|
import 'package:gecko/models/wallet_data.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
@ -22,9 +20,10 @@ import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
|
||||||
import 'package:gecko/screens/myWallets/wallet_options.dart';
|
import 'package:gecko/screens/myWallets/wallet_options.dart';
|
||||||
import 'package:gecko/screens/wallet_view.dart';
|
import 'package:gecko/screens/wallet_view.dart';
|
||||||
import 'package:gecko/widgets/balance.dart';
|
import 'package:gecko/widgets/balance.dart';
|
||||||
import 'package:gecko/widgets/name_by_address.dart';
|
import 'package:gecko/widgets/bottom_app_bar.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:flutter_svg/flutter_svg.dart';
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
|
import 'package:truncate/truncate.dart';
|
||||||
|
|
||||||
class WalletsHome extends StatelessWidget {
|
class WalletsHome extends StatelessWidget {
|
||||||
const WalletsHome({Key? key}) : super(key: key);
|
const WalletsHome({Key? key}) : super(key: key);
|
||||||
|
@ -32,8 +31,6 @@ class WalletsHome extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final myWalletProvider = Provider.of<MyWalletsProvider>(context);
|
final myWalletProvider = Provider.of<MyWalletsProvider>(context);
|
||||||
HomeProvider homeProvider =
|
|
||||||
Provider.of<HomeProvider>(context, listen: false);
|
|
||||||
|
|
||||||
final currentChestNumber = myWalletProvider.getCurrentChest();
|
final currentChestNumber = myWalletProvider.getCurrentChest();
|
||||||
final ChestData currentChest = chestBox.get(currentChestNumber)!;
|
final ChestData currentChest = chestBox.get(currentChestNumber)!;
|
||||||
|
@ -66,7 +63,7 @@ class WalletsHome extends StatelessWidget {
|
||||||
backgroundColor: const Color(0xffFFD58D),
|
backgroundColor: const Color(0xffFFD58D),
|
||||||
),
|
),
|
||||||
bottomNavigationBar: myWalletProvider.lastFlyBy == ''
|
bottomNavigationBar: myWalletProvider.lastFlyBy == ''
|
||||||
? homeProvider.bottomAppBar(context)
|
? const GeckoBottomAppBar()
|
||||||
: dragInfo(context),
|
: dragInfo(context),
|
||||||
body: SafeArea(
|
body: SafeArea(
|
||||||
child: Stack(children: [
|
child: Stack(children: [
|
||||||
|
@ -204,6 +201,7 @@ class WalletsHome extends StatelessWidget {
|
||||||
Provider.of<WalletOptionsProvider>(context, listen: false);
|
Provider.of<WalletOptionsProvider>(context, listen: false);
|
||||||
final bool isWalletsExists = myWalletProvider.checkIfWalletExist();
|
final bool isWalletsExists = myWalletProvider.checkIfWalletExist();
|
||||||
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
||||||
|
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
||||||
|
|
||||||
if (!isWalletsExists) {
|
if (!isWalletsExists) {
|
||||||
return const Text('');
|
return const Text('');
|
||||||
|
@ -220,7 +218,12 @@ class WalletsHome extends StatelessWidget {
|
||||||
]));
|
]));
|
||||||
}
|
}
|
||||||
|
|
||||||
List listWallets = myWalletProvider.listWallets;
|
// Get wallet list and sort by derivation number
|
||||||
|
List<WalletData> listWallets = myWalletProvider.listWallets;
|
||||||
|
listWallets.sort((p1, p2) {
|
||||||
|
return Comparable.compare(p1.number!, p2.number!);
|
||||||
|
});
|
||||||
|
|
||||||
WalletData? defaultWallet = myWalletProvider.getDefaultWallet();
|
WalletData? defaultWallet = myWalletProvider.getDefaultWallet();
|
||||||
final screenWidth = MediaQuery.of(context).size.width;
|
final screenWidth = MediaQuery.of(context).size.width;
|
||||||
int nTule = 2;
|
int nTule = 2;
|
||||||
|
@ -244,7 +247,7 @@ class WalletsHome extends StatelessWidget {
|
||||||
crossAxisSpacing: 0,
|
crossAxisSpacing: 0,
|
||||||
mainAxisSpacing: 0,
|
mainAxisSpacing: 0,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
for (WalletData repository in listWallets as Iterable<WalletData>)
|
for (WalletData repository in listWallets)
|
||||||
LongPressDraggable<String>(
|
LongPressDraggable<String>(
|
||||||
delay: const Duration(milliseconds: 200),
|
delay: const Duration(milliseconds: 200),
|
||||||
data: repository.address,
|
data: repository.address,
|
||||||
|
@ -326,12 +329,12 @@ class WalletsHome extends StatelessWidget {
|
||||||
child: Container(
|
child: Container(
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
height: double.infinity,
|
height: double.infinity,
|
||||||
decoration: BoxDecoration(
|
decoration: const BoxDecoration(
|
||||||
gradient: RadialGradient(
|
gradient: RadialGradient(
|
||||||
radius: 0.6,
|
radius: 0.8,
|
||||||
colors: [
|
colors: [
|
||||||
Colors.green[400]!,
|
Color.fromARGB(255, 255, 255, 211),
|
||||||
const Color(0xFFE7E7A6),
|
yellowC,
|
||||||
],
|
],
|
||||||
)),
|
)),
|
||||||
child:
|
child:
|
||||||
|
@ -364,8 +367,42 @@ class WalletsHome extends StatelessWidget {
|
||||||
repository.address,
|
repository.address,
|
||||||
repository.address ==
|
repository.address ==
|
||||||
defaultWallet.address),
|
defaultWallet.address),
|
||||||
nameBuilder(context, repository,
|
Row(
|
||||||
defaultWallet, currentChestNumber),
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
const SizedBox(height: 7),
|
||||||
|
Opacity(
|
||||||
|
opacity: 0.7,
|
||||||
|
child: Text(
|
||||||
|
duniterIndexer.walletNameIndexer[
|
||||||
|
repository.address] ??
|
||||||
|
truncate(
|
||||||
|
repository.name!, 20),
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 20,
|
||||||
|
color:
|
||||||
|
defaultWallet.address ==
|
||||||
|
repository.address
|
||||||
|
? Colors.white
|
||||||
|
: Colors.black,
|
||||||
|
fontWeight: FontWeight.w500),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
// NameByAddress(
|
||||||
|
// wallet: repository,
|
||||||
|
// address: repository.address,
|
||||||
|
// size: 20,
|
||||||
|
// color: defaultWallet.address ==
|
||||||
|
// repository.address
|
||||||
|
// ? Colors.white
|
||||||
|
// : Colors.black,
|
||||||
|
// ),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
]),
|
]),
|
||||||
]),
|
]),
|
||||||
),
|
),
|
||||||
|
@ -389,58 +426,24 @@ class WalletsHome extends StatelessWidget {
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
color: isDefault ? orangeC : yellowC,
|
color: isDefault ? orangeC : yellowC,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.only(left: 5, right: 5, top: 38),
|
padding:
|
||||||
|
const EdgeInsets.only(left: 5, right: 5, top: 38, bottom: 10),
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
Balance(
|
Opacity(
|
||||||
address: address,
|
opacity: 0.7,
|
||||||
size: 15,
|
child: Balance(
|
||||||
color: isDefault ? Colors.white : Colors.black,
|
address: address,
|
||||||
loadingColor: isDefault ? yellowC : orangeC),
|
size: 16,
|
||||||
|
color: isDefault ? Colors.white : Colors.black,
|
||||||
|
loadingColor: isDefault ? yellowC : orangeC),
|
||||||
|
)
|
||||||
],
|
],
|
||||||
)),
|
)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget nameBuilder(BuildContext context, WalletData repository,
|
|
||||||
WalletData defaultWallet, int currentChestNumber) {
|
|
||||||
final walletOptions =
|
|
||||||
Provider.of<WalletOptionsProvider>(context, listen: false);
|
|
||||||
|
|
||||||
return ListTile(
|
|
||||||
shape: const RoundedRectangleBorder(
|
|
||||||
borderRadius: BorderRadius.vertical(bottom: Radius.circular(12))),
|
|
||||||
tileColor: repository.address == defaultWallet.address
|
|
||||||
? orangeC
|
|
||||||
: const Color(0xffFFD58D),
|
|
||||||
title: Center(
|
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.only(left: 5, right: 5, bottom: 35, top: 5),
|
|
||||||
child: NameByAddress(
|
|
||||||
address: repository.address,
|
|
||||||
wallet: repository,
|
|
||||||
size: 20,
|
|
||||||
canEdit: false,
|
|
||||||
color: repository.id()[1] == defaultWallet.id()[1]
|
|
||||||
? const Color(0xffF9F9F1)
|
|
||||||
: Colors.black),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
onTap: () {
|
|
||||||
walletOptions.getAddress(currentChestNumber, repository.derivation!);
|
|
||||||
Navigator.push(
|
|
||||||
context,
|
|
||||||
SmoothTransition(
|
|
||||||
page: WalletOptions(
|
|
||||||
wallet: repository,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget addNewDerivation(context) {
|
Widget addNewDerivation(context) {
|
||||||
final myWalletProvider = Provider.of<MyWalletsProvider>(context);
|
final myWalletProvider = Provider.of<MyWalletsProvider>(context);
|
||||||
|
|
||||||
|
|
|
@ -7,12 +7,12 @@ import 'package:gecko/models/widgets_keys.dart';
|
||||||
import 'package:gecko/providers/cesium_plus.dart';
|
import 'package:gecko/providers/cesium_plus.dart';
|
||||||
import 'package:gecko/models/g1_wallets_list.dart';
|
import 'package:gecko/models/g1_wallets_list.dart';
|
||||||
import 'package:gecko/providers/duniter_indexer.dart';
|
import 'package:gecko/providers/duniter_indexer.dart';
|
||||||
import 'package:gecko/providers/home.dart';
|
|
||||||
import 'package:gecko/providers/substrate_sdk.dart';
|
import 'package:gecko/providers/substrate_sdk.dart';
|
||||||
import 'package:gecko/providers/wallets_profiles.dart';
|
import 'package:gecko/providers/wallets_profiles.dart';
|
||||||
import 'package:gecko/screens/common_elements.dart';
|
import 'package:gecko/screens/common_elements.dart';
|
||||||
import 'package:gecko/screens/wallet_view.dart';
|
import 'package:gecko/screens/wallet_view.dart';
|
||||||
import 'package:gecko/widgets/balance.dart';
|
import 'package:gecko/widgets/balance.dart';
|
||||||
|
import 'package:gecko/widgets/bottom_app_bar.dart';
|
||||||
import 'package:gecko/widgets/name_by_address.dart';
|
import 'package:gecko/widgets/name_by_address.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
@ -23,8 +23,6 @@ class ContactsScreen extends StatelessWidget {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
WalletsProfilesProvider walletsProfilesClass =
|
WalletsProfilesProvider walletsProfilesClass =
|
||||||
Provider.of<WalletsProfilesProvider>(context, listen: true);
|
Provider.of<WalletsProfilesProvider>(context, listen: true);
|
||||||
HomeProvider homeProvider =
|
|
||||||
Provider.of<HomeProvider>(context, listen: false);
|
|
||||||
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
||||||
|
|
||||||
double avatarSize = 55;
|
double avatarSize = 55;
|
||||||
|
@ -51,7 +49,7 @@ class ContactsScreen extends StatelessWidget {
|
||||||
'contactsManagementWithNbr'.tr(args: ['${myContacts.length}'])),
|
'contactsManagementWithNbr'.tr(args: ['${myContacts.length}'])),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
bottomNavigationBar: homeProvider.bottomAppBar(context),
|
bottomNavigationBar: const GeckoBottomAppBar(),
|
||||||
body: SafeArea(
|
body: SafeArea(
|
||||||
child: Stack(children: [
|
child: Stack(children: [
|
||||||
Padding(
|
Padding(
|
||||||
|
@ -104,7 +102,6 @@ class ContactsScreen extends StatelessWidget {
|
||||||
]),
|
]),
|
||||||
subtitle: Row(children: <Widget>[
|
subtitle: Row(children: <Widget>[
|
||||||
NameByAddress(
|
NameByAddress(
|
||||||
address: g1Wallet.address,
|
|
||||||
wallet:
|
wallet:
|
||||||
WalletData(address: g1Wallet.address))
|
WalletData(address: g1Wallet.address))
|
||||||
]),
|
]),
|
||||||
|
|
|
@ -34,6 +34,7 @@ class OnboardingStepTen extends StatelessWidget {
|
||||||
final generateWalletProvider =
|
final generateWalletProvider =
|
||||||
Provider.of<GenerateWalletsProvider>(context);
|
Provider.of<GenerateWalletsProvider>(context);
|
||||||
final walletOptions = Provider.of<WalletOptionsProvider>(context);
|
final walletOptions = Provider.of<WalletOptionsProvider>(context);
|
||||||
|
final sub = Provider.of<SubstrateSdk>(context);
|
||||||
final myWalletProvider =
|
final myWalletProvider =
|
||||||
Provider.of<MyWalletsProvider>(context, listen: false);
|
Provider.of<MyWalletsProvider>(context, listen: false);
|
||||||
CommonElements common = CommonElements();
|
CommonElements common = CommonElements();
|
||||||
|
@ -126,7 +127,8 @@ class OnboardingStepTen extends StatelessWidget {
|
||||||
),
|
),
|
||||||
]);
|
]);
|
||||||
}),
|
}),
|
||||||
Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
Consumer<WalletOptionsProvider>(
|
||||||
|
builder: (context, walletOptions, _) {
|
||||||
return sub.nodeConnected
|
return sub.nodeConnected
|
||||||
? InkWell(
|
? InkWell(
|
||||||
key: keyCachePassword,
|
key: keyCachePassword,
|
||||||
|
@ -188,7 +190,7 @@ class OnboardingStepTen extends StatelessWidget {
|
||||||
obscureText: true,
|
obscureText: true,
|
||||||
obscuringCharacter: '*',
|
obscuringCharacter: '*',
|
||||||
animationType: AnimationType.slide,
|
animationType: AnimationType.slide,
|
||||||
animationDuration: const Duration(milliseconds: 80),
|
animationDuration: const Duration(milliseconds: 40),
|
||||||
validator: (v) {
|
validator: (v) {
|
||||||
if (v!.length < pinLenght) {
|
if (v!.length < pinLenght) {
|
||||||
return "yourPasswordLengthIsX".tr(args: [pinLenght.toString()]);
|
return "yourPasswordLengthIsX".tr(args: [pinLenght.toString()]);
|
||||||
|
@ -240,14 +242,14 @@ class OnboardingStepTen extends StatelessWidget {
|
||||||
derivePath: '//2',
|
derivePath: '//2',
|
||||||
password: generateWalletProvider.pin.text);
|
password: generateWalletProvider.pin.text);
|
||||||
WalletData myWallet = WalletData(
|
WalletData myWallet = WalletData(
|
||||||
version: dataVersion,
|
|
||||||
chest: configBox.get('currentChest'),
|
chest: configBox.get('currentChest'),
|
||||||
address: address,
|
address: address,
|
||||||
number: 0,
|
number: 0,
|
||||||
name: 'currentWallet'.tr(),
|
name: 'currentWallet'.tr(),
|
||||||
derivation: 2,
|
derivation: 2,
|
||||||
imageDefaultPath: '0.png');
|
imageDefaultPath: '0.png',
|
||||||
await walletBox.add(myWallet);
|
isOwned: true);
|
||||||
|
await walletBox.put(myWallet.address, myWallet);
|
||||||
}
|
}
|
||||||
myWalletProvider.readAllWallets(currentChest);
|
myWalletProvider.readAllWallets(currentChest);
|
||||||
myWalletProvider.reload();
|
myWalletProvider.reload();
|
||||||
|
|
|
@ -41,7 +41,6 @@ class SearchScreen extends StatelessWidget {
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
// bottomNavigationBar: _homeProvider.bottomAppBar(context),
|
|
||||||
body: SafeArea(
|
body: SafeArea(
|
||||||
child: Stack(children: [
|
child: Stack(children: [
|
||||||
Column(children: <Widget>[
|
Column(children: <Widget>[
|
||||||
|
|
|
@ -7,13 +7,13 @@ import 'package:gecko/models/widgets_keys.dart';
|
||||||
import 'package:gecko/providers/cesium_plus.dart';
|
import 'package:gecko/providers/cesium_plus.dart';
|
||||||
import 'package:gecko/models/g1_wallets_list.dart';
|
import 'package:gecko/models/g1_wallets_list.dart';
|
||||||
import 'package:gecko/providers/duniter_indexer.dart';
|
import 'package:gecko/providers/duniter_indexer.dart';
|
||||||
import 'package:gecko/providers/home.dart';
|
|
||||||
import 'package:gecko/providers/substrate_sdk.dart';
|
import 'package:gecko/providers/substrate_sdk.dart';
|
||||||
import 'package:gecko/providers/wallets_profiles.dart';
|
import 'package:gecko/providers/wallets_profiles.dart';
|
||||||
import 'package:gecko/providers/search.dart';
|
import 'package:gecko/providers/search.dart';
|
||||||
import 'package:gecko/screens/common_elements.dart';
|
import 'package:gecko/screens/common_elements.dart';
|
||||||
import 'package:gecko/screens/wallet_view.dart';
|
import 'package:gecko/screens/wallet_view.dart';
|
||||||
import 'package:gecko/widgets/balance.dart';
|
import 'package:gecko/widgets/balance.dart';
|
||||||
|
import 'package:gecko/widgets/bottom_app_bar.dart';
|
||||||
import 'package:gecko/widgets/name_by_address.dart';
|
import 'package:gecko/widgets/name_by_address.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
@ -25,8 +25,6 @@ class SearchResultScreen extends StatelessWidget {
|
||||||
final searchProvider = Provider.of<SearchProvider>(context, listen: false);
|
final searchProvider = Provider.of<SearchProvider>(context, listen: false);
|
||||||
WalletsProfilesProvider walletsProfilesClass =
|
WalletsProfilesProvider walletsProfilesClass =
|
||||||
Provider.of<WalletsProfilesProvider>(context, listen: false);
|
Provider.of<WalletsProfilesProvider>(context, listen: false);
|
||||||
HomeProvider homeProvider =
|
|
||||||
Provider.of<HomeProvider>(context, listen: false);
|
|
||||||
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
||||||
|
|
||||||
double avatarSize = 55;
|
double avatarSize = 55;
|
||||||
|
@ -41,7 +39,7 @@ class SearchResultScreen extends StatelessWidget {
|
||||||
child: Text('researchResults'.tr()),
|
child: Text('researchResults'.tr()),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
bottomNavigationBar: homeProvider.bottomAppBar(context),
|
bottomNavigationBar: const GeckoBottomAppBar(),
|
||||||
body: SafeArea(
|
body: SafeArea(
|
||||||
child: Stack(children: [
|
child: Stack(children: [
|
||||||
Padding(
|
Padding(
|
||||||
|
@ -127,7 +125,6 @@ class SearchResultScreen extends StatelessWidget {
|
||||||
]),
|
]),
|
||||||
subtitle: Row(children: <Widget>[
|
subtitle: Row(children: <Widget>[
|
||||||
NameByAddress(
|
NameByAddress(
|
||||||
address: g1Wallet.address,
|
|
||||||
wallet: WalletData(
|
wallet: WalletData(
|
||||||
address: g1Wallet.address),
|
address: g1Wallet.address),
|
||||||
),
|
),
|
||||||
|
|
|
@ -9,7 +9,6 @@ import 'package:gecko/models/g1_wallets_list.dart';
|
||||||
import 'package:gecko/models/widgets_keys.dart';
|
import 'package:gecko/models/widgets_keys.dart';
|
||||||
import 'package:gecko/providers/cesium_plus.dart';
|
import 'package:gecko/providers/cesium_plus.dart';
|
||||||
import 'package:gecko/providers/duniter_indexer.dart';
|
import 'package:gecko/providers/duniter_indexer.dart';
|
||||||
import 'package:gecko/providers/home.dart';
|
|
||||||
import 'package:gecko/providers/substrate_sdk.dart';
|
import 'package:gecko/providers/substrate_sdk.dart';
|
||||||
import 'package:gecko/providers/my_wallets.dart';
|
import 'package:gecko/providers/my_wallets.dart';
|
||||||
import 'package:gecko/models/wallet_data.dart';
|
import 'package:gecko/models/wallet_data.dart';
|
||||||
|
@ -22,6 +21,7 @@ import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
|
||||||
import 'package:gecko/screens/qrcode_fullscreen.dart';
|
import 'package:gecko/screens/qrcode_fullscreen.dart';
|
||||||
import 'package:gecko/screens/transaction_in_progress.dart';
|
import 'package:gecko/screens/transaction_in_progress.dart';
|
||||||
import 'package:gecko/widgets/balance.dart';
|
import 'package:gecko/widgets/balance.dart';
|
||||||
|
import 'package:gecko/widgets/bottom_app_bar.dart';
|
||||||
import 'package:gecko/widgets/header_profile.dart';
|
import 'package:gecko/widgets/header_profile.dart';
|
||||||
import 'package:gecko/widgets/page_route_no_transition.dart';
|
import 'package:gecko/widgets/page_route_no_transition.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
@ -43,8 +43,6 @@ class WalletViewScreen extends StatelessWidget {
|
||||||
Provider.of<WalletsProfilesProvider>(context, listen: false);
|
Provider.of<WalletsProfilesProvider>(context, listen: false);
|
||||||
walletProfile.address = address;
|
walletProfile.address = address;
|
||||||
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
||||||
HomeProvider homeProvider =
|
|
||||||
Provider.of<HomeProvider>(context, listen: false);
|
|
||||||
final myWalletProvider =
|
final myWalletProvider =
|
||||||
Provider.of<MyWalletsProvider>(context, listen: false);
|
Provider.of<MyWalletsProvider>(context, listen: false);
|
||||||
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
||||||
|
@ -115,7 +113,7 @@ class WalletViewScreen extends StatelessWidget {
|
||||||
'?'
|
'?'
|
||||||
]))),
|
]))),
|
||||||
),
|
),
|
||||||
bottomNavigationBar: homeProvider.bottomAppBar(context),
|
bottomNavigationBar: const GeckoBottomAppBar(),
|
||||||
body: SafeArea(
|
body: SafeArea(
|
||||||
child: Column(children: <Widget>[
|
child: Column(children: <Widget>[
|
||||||
HeaderProfile(address: address, username: username),
|
HeaderProfile(address: address, username: username),
|
||||||
|
|
|
@ -0,0 +1,117 @@
|
||||||
|
// ignore_for_file: use_build_context_synchronously
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gecko/globals.dart';
|
||||||
|
import 'package:gecko/models/wallet_data.dart';
|
||||||
|
import 'package:gecko/models/widgets_keys.dart';
|
||||||
|
import 'package:gecko/providers/my_wallets.dart';
|
||||||
|
import 'package:gecko/providers/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:provider/provider.dart';
|
||||||
|
|
||||||
|
class GeckoBottomAppBar extends StatelessWidget {
|
||||||
|
const GeckoBottomAppBar({
|
||||||
|
Key? key,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final myWalletProvider =
|
||||||
|
Provider.of<MyWalletsProvider>(context, listen: false);
|
||||||
|
WalletsProfilesProvider historyProvider =
|
||||||
|
Provider.of<WalletsProfilesProvider>(context, listen: false);
|
||||||
|
|
||||||
|
final size = MediaQuery.of(context).size;
|
||||||
|
|
||||||
|
const bool showBottomBar = true;
|
||||||
|
|
||||||
|
return Visibility(
|
||||||
|
visible: showBottomBar,
|
||||||
|
child: Container(
|
||||||
|
color: yellowC,
|
||||||
|
width: size.width,
|
||||||
|
height: 80,
|
||||||
|
child:
|
||||||
|
// Stack(
|
||||||
|
// children: [
|
||||||
|
// // CustomPaint(
|
||||||
|
// // size: Size(size.width, 110),
|
||||||
|
// // painter: CustomRoundedButton(),
|
||||||
|
// // ),
|
||||||
|
Row(mainAxisAlignment: MainAxisAlignment.start, children: [
|
||||||
|
// SizedBox(width: 0),
|
||||||
|
const Spacer(),
|
||||||
|
const SizedBox(width: 11),
|
||||||
|
IconButton(
|
||||||
|
key: keyAppBarSearch,
|
||||||
|
iconSize: 40,
|
||||||
|
icon: const Image(image: AssetImage('assets/loupe-noire.png')),
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.popUntil(
|
||||||
|
context,
|
||||||
|
ModalRoute.withName('/'),
|
||||||
|
);
|
||||||
|
Navigator.push(
|
||||||
|
context,
|
||||||
|
MaterialPageRoute(builder: (homeContext) {
|
||||||
|
return const SearchScreen();
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const SizedBox(width: 22),
|
||||||
|
const Spacer(),
|
||||||
|
IconButton(
|
||||||
|
key: keyAppBarQrcode,
|
||||||
|
iconSize: 70,
|
||||||
|
icon: const Image(image: AssetImage('assets/qrcode-scan.png')),
|
||||||
|
onPressed: () async {
|
||||||
|
Navigator.popUntil(
|
||||||
|
context,
|
||||||
|
ModalRoute.withName('/'),
|
||||||
|
);
|
||||||
|
historyProvider.scan(homeContext);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const Spacer(),
|
||||||
|
const SizedBox(width: 15),
|
||||||
|
IconButton(
|
||||||
|
key: keyAppBarChest,
|
||||||
|
iconSize: 60,
|
||||||
|
icon: const Image(image: AssetImage('assets/wallet.png')),
|
||||||
|
onPressed: () async {
|
||||||
|
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.popUntil(
|
||||||
|
context,
|
||||||
|
ModalRoute.withName('/'),
|
||||||
|
);
|
||||||
|
Navigator.push(
|
||||||
|
context,
|
||||||
|
MaterialPageRoute(builder: (context) {
|
||||||
|
return const WalletsHome();
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const Spacer(),
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,23 +22,6 @@ class IdentityStatus extends StatelessWidget {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
||||||
|
|
||||||
showText(String text,
|
|
||||||
[double size = 18, bool bold = false, bool smooth = true]) {
|
|
||||||
// log.d('$address $text');
|
|
||||||
return AnimatedFadeOutIn<String>(
|
|
||||||
data: text,
|
|
||||||
duration: Duration(milliseconds: smooth ? 200 : 0),
|
|
||||||
builder: (value) => Text(
|
|
||||||
value,
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: size,
|
|
||||||
color: bold ? color : Colors.black,
|
|
||||||
fontWeight: bold ? FontWeight.w500 : FontWeight.w400),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
return Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
||||||
return FutureBuilder(
|
return FutureBuilder(
|
||||||
future: sub.idtyStatus(address),
|
future: sub.idtyStatus(address),
|
||||||
|
@ -59,10 +42,8 @@ class IdentityStatus extends StatelessWidget {
|
||||||
return isOwner
|
return isOwner
|
||||||
? showText('identityConfirmed'.tr())
|
? showText('identityConfirmed'.tr())
|
||||||
: NameByAddress(
|
: NameByAddress(
|
||||||
address: address,
|
|
||||||
wallet: WalletData(address: address),
|
wallet: WalletData(address: address),
|
||||||
size: 20,
|
size: 20,
|
||||||
canEdit: true,
|
|
||||||
color: Colors.grey[700]!,
|
color: Colors.grey[700]!,
|
||||||
fontWeight: FontWeight.w500,
|
fontWeight: FontWeight.w500,
|
||||||
fontStyle: FontStyle.italic);
|
fontStyle: FontStyle.italic);
|
||||||
|
@ -72,10 +53,8 @@ class IdentityStatus extends StatelessWidget {
|
||||||
return isOwner
|
return isOwner
|
||||||
? showText('memberValidated'.tr(), 18, true)
|
? showText('memberValidated'.tr(), 18, true)
|
||||||
: NameByAddress(
|
: NameByAddress(
|
||||||
address: address,
|
|
||||||
wallet: WalletData(address: address),
|
wallet: WalletData(address: address),
|
||||||
size: 20,
|
size: 20,
|
||||||
canEdit: true,
|
|
||||||
color: Colors.black,
|
color: Colors.black,
|
||||||
fontWeight: FontWeight.w600,
|
fontWeight: FontWeight.w600,
|
||||||
fontStyle: FontStyle.normal);
|
fontStyle: FontStyle.normal);
|
||||||
|
@ -91,4 +70,21 @@ class IdentityStatus extends StatelessWidget {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AnimatedFadeOutIn showText(String text,
|
||||||
|
[double size = 18, bool bold = false, bool smooth = true]) {
|
||||||
|
// log.d('$address $text');
|
||||||
|
return AnimatedFadeOutIn<String>(
|
||||||
|
data: text,
|
||||||
|
duration: Duration(milliseconds: smooth ? 200 : 0),
|
||||||
|
builder: (value) => Text(
|
||||||
|
value,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: size,
|
||||||
|
color: bold ? color : Colors.black,
|
||||||
|
fontWeight: bold ? FontWeight.w500 : FontWeight.w400),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,6 @@ import 'package:gecko/models/queries_indexer.dart';
|
||||||
import 'package:gecko/models/wallet_data.dart';
|
import 'package:gecko/models/wallet_data.dart';
|
||||||
import 'package:gecko/providers/duniter_indexer.dart';
|
import 'package:gecko/providers/duniter_indexer.dart';
|
||||||
import 'package:gecko/widgets/wallet_name.dart';
|
import 'package:gecko/widgets/wallet_name.dart';
|
||||||
import 'package:gecko/widgets/wallet_name_controller.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';
|
||||||
import 'package:truncate/truncate.dart';
|
import 'package:truncate/truncate.dart';
|
||||||
|
@ -13,19 +12,15 @@ import 'package:truncate/truncate.dart';
|
||||||
class NameByAddress extends StatelessWidget {
|
class NameByAddress extends StatelessWidget {
|
||||||
const NameByAddress(
|
const NameByAddress(
|
||||||
{Key? key,
|
{Key? key,
|
||||||
required this.address,
|
|
||||||
required this.wallet,
|
required this.wallet,
|
||||||
this.size = 20,
|
this.size = 20,
|
||||||
this.canEdit = false,
|
|
||||||
this.color = Colors.black,
|
this.color = Colors.black,
|
||||||
this.fontWeight = FontWeight.w400,
|
this.fontWeight = FontWeight.w400,
|
||||||
this.fontStyle = FontStyle.italic})
|
this.fontStyle = FontStyle.italic})
|
||||||
: super(key: key);
|
: super(key: key);
|
||||||
final String address;
|
|
||||||
final WalletData wallet;
|
final WalletData wallet;
|
||||||
final Color color;
|
final Color color;
|
||||||
final double size;
|
final double size;
|
||||||
final bool canEdit;
|
|
||||||
final FontWeight fontWeight;
|
final FontWeight fontWeight;
|
||||||
final FontStyle fontStyle;
|
final FontStyle fontStyle;
|
||||||
|
|
||||||
|
@ -34,12 +29,9 @@ class NameByAddress extends StatelessWidget {
|
||||||
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
||||||
|
|
||||||
if (indexerEndpoint == '') {
|
if (indexerEndpoint == '') {
|
||||||
if (canEdit) {
|
return WalletName(wallet: wallet, size: size, color: color);
|
||||||
return WalletNameController(wallet: wallet, size: size);
|
|
||||||
} else {
|
|
||||||
return WalletName(wallet: wallet, size: size, color: color);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final httpLink = HttpLink(
|
final httpLink = HttpLink(
|
||||||
'$indexerEndpoint/v1/graphql',
|
'$indexerEndpoint/v1/graphql',
|
||||||
);
|
);
|
||||||
|
@ -57,7 +49,7 @@ class NameByAddress extends StatelessWidget {
|
||||||
document: gql(
|
document: gql(
|
||||||
getNameByAddressQ), // this is the query string you just created
|
getNameByAddressQ), // this is the query string you just created
|
||||||
variables: {
|
variables: {
|
||||||
'address': address,
|
'address': wallet.address,
|
||||||
},
|
},
|
||||||
// pollInterval: const Duration(seconds: 10),
|
// pollInterval: const Duration(seconds: 10),
|
||||||
),
|
),
|
||||||
|
@ -71,29 +63,27 @@ class NameByAddress extends StatelessWidget {
|
||||||
return const Text('Loading');
|
return const Text('Loading');
|
||||||
}
|
}
|
||||||
|
|
||||||
duniterIndexer.walletNameIndexer[address] =
|
duniterIndexer.walletNameIndexer[wallet.address] =
|
||||||
result.data?['account_by_pk']?['identity']?['name'];
|
result.data?['account_by_pk']?['identity']?['name'];
|
||||||
|
|
||||||
g1WalletsBox.put(
|
g1WalletsBox.put(
|
||||||
address,
|
wallet.address,
|
||||||
G1WalletsList(
|
G1WalletsList(
|
||||||
address: address,
|
address: wallet.address,
|
||||||
username: duniterIndexer.walletNameIndexer[address]));
|
username:
|
||||||
|
duniterIndexer.walletNameIndexer[wallet.address]));
|
||||||
|
|
||||||
// log.d(g1WalletsBox.toMap().values.first.username);
|
// log.d(g1WalletsBox.toMap().values.first.username);
|
||||||
|
|
||||||
if (duniterIndexer.walletNameIndexer[address] == null) {
|
if (duniterIndexer.walletNameIndexer[wallet.address] == null) {
|
||||||
if (canEdit) {
|
return WalletName(wallet: wallet, size: size, color: color);
|
||||||
return WalletNameController(wallet: wallet, size: size);
|
|
||||||
} else {
|
|
||||||
return WalletName(wallet: wallet, size: size, color: color);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Text(
|
return Text(
|
||||||
color == Colors.grey[700]!
|
color == Colors.grey[700]!
|
||||||
? '(${duniterIndexer.walletNameIndexer[address]!})'
|
? '(${duniterIndexer.walletNameIndexer[wallet.address]!})'
|
||||||
: truncate(duniterIndexer.walletNameIndexer[address]!, 20),
|
: truncate(
|
||||||
|
duniterIndexer.walletNameIndexer[wallet.address]!, 20),
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: size,
|
fontSize: size,
|
||||||
color: color,
|
color: color,
|
||||||
|
|
|
@ -1,68 +0,0 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:gecko/globals.dart';
|
|
||||||
import 'package:gecko/models/wallet_data.dart';
|
|
||||||
import 'package:gecko/models/widgets_keys.dart';
|
|
||||||
import 'package:gecko/providers/wallet_options.dart';
|
|
||||||
import 'package:provider/provider.dart';
|
|
||||||
|
|
||||||
class WalletNameController extends StatelessWidget {
|
|
||||||
const WalletNameController({Key? key, required this.wallet, this.size = 20})
|
|
||||||
: super(key: key);
|
|
||||||
final WalletData wallet;
|
|
||||||
final double size;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Widget build(BuildContext context) {
|
|
||||||
final walletOptions =
|
|
||||||
Provider.of<WalletOptionsProvider>(context, listen: false);
|
|
||||||
walletOptions.nameController.text = wallet.name ?? '';
|
|
||||||
final walletNameFocus = FocusNode();
|
|
||||||
|
|
||||||
return SizedBox(
|
|
||||||
width: 260,
|
|
||||||
child: Stack(children: <Widget>[
|
|
||||||
TextField(
|
|
||||||
key: keyWalletName,
|
|
||||||
autofocus: false,
|
|
||||||
focusNode: walletNameFocus,
|
|
||||||
enabled: walletOptions.isEditing,
|
|
||||||
controller: walletOptions.nameController,
|
|
||||||
minLines: 1,
|
|
||||||
maxLines: 3,
|
|
||||||
textAlign: TextAlign.center,
|
|
||||||
decoration: const InputDecoration(
|
|
||||||
border: InputBorder.none,
|
|
||||||
focusedBorder: InputBorder.none,
|
|
||||||
enabledBorder: InputBorder.none,
|
|
||||||
disabledBorder: InputBorder.none,
|
|
||||||
contentPadding: EdgeInsets.all(15.0),
|
|
||||||
),
|
|
||||||
style: TextStyle(
|
|
||||||
fontSize: isTall ? size : size * 0.9,
|
|
||||||
color: Colors.black,
|
|
||||||
fontWeight: FontWeight.w400,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
Positioned(
|
|
||||||
right: 0,
|
|
||||||
child: InkWell(
|
|
||||||
key: keyRenameWallet,
|
|
||||||
onTap: () async {
|
|
||||||
await walletOptions.editWalletName(context, wallet.id());
|
|
||||||
await Future.delayed(const Duration(milliseconds: 30));
|
|
||||||
walletNameFocus.requestFocus();
|
|
||||||
},
|
|
||||||
child: ClipRRect(
|
|
||||||
child: Image.asset(
|
|
||||||
walletOptions.isEditing
|
|
||||||
? 'assets/walletOptions/android-checkmark.png'
|
|
||||||
: 'assets/walletOptions/edit.png',
|
|
||||||
width: 25,
|
|
||||||
height: 25),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
]),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -287,7 +287,7 @@ packages:
|
||||||
name: decimal
|
name: decimal
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.3.1"
|
version: "2.3.2"
|
||||||
dio:
|
dio:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -1075,7 +1075,7 @@ packages:
|
||||||
name: rational
|
name: rational
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.2.1"
|
version: "2.2.2"
|
||||||
responsive_framework:
|
responsive_framework:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -1110,14 +1110,14 @@ packages:
|
||||||
name: sentry
|
name: sentry
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.17.0"
|
version: "6.18.0"
|
||||||
sentry_flutter:
|
sentry_flutter:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: sentry_flutter
|
name: sentry_flutter
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.17.0"
|
version: "6.18.0"
|
||||||
shared_preferences:
|
shared_preferences:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -23,11 +23,11 @@ dependencies:
|
||||||
image_picker: ^0.8.4
|
image_picker: ^0.8.4
|
||||||
jdenticon_dart: ^2.0.0
|
jdenticon_dart: ^2.0.0
|
||||||
logger: ^1.1.0
|
logger: ^1.1.0
|
||||||
path_provider: ^2.0.9
|
path_provider: ^2.0.11
|
||||||
pdf: ^3.7.1
|
pdf: ^3.7.1
|
||||||
permission_handler: ^10.0.0
|
permission_handler: ^10.0.0
|
||||||
pin_code_fields: ^7.4.0
|
pin_code_fields: ^7.4.0
|
||||||
printing: ^5.9.1
|
printing: ^5.9.3
|
||||||
provider: ^6.0.1
|
provider: ^6.0.1
|
||||||
barcode_scan2: ^4.2.1
|
barcode_scan2: ^4.2.1
|
||||||
qr_flutter: #^4.0.0
|
qr_flutter: #^4.0.0
|
||||||
|
@ -35,7 +35,7 @@ dependencies:
|
||||||
url: https://github.com/insinfo/qr.flutter.git
|
url: https://github.com/insinfo/qr.flutter.git
|
||||||
ref: master
|
ref: master
|
||||||
responsive_framework: ^0.2.0
|
responsive_framework: ^0.2.0
|
||||||
sentry_flutter: ^6.5.1
|
sentry_flutter: ^6.18.0
|
||||||
shared_preferences: ^2.0.7
|
shared_preferences: ^2.0.7
|
||||||
truncate: ^3.0.1
|
truncate: ^3.0.1
|
||||||
unorm_dart: ^0.2.0
|
unorm_dart: ^0.2.0
|
||||||
|
|
Loading…
Reference in New Issue