big refacto: home screen stateful; walletnames refacto

This commit is contained in:
poka 2022-12-07 23:10:28 +01:00
parent cf4387a280
commit d7731504c7
28 changed files with 615 additions and 647 deletions

View File

@ -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 lavez 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 lavez 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": "Cest tout bon !", "allGood": "Cest 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 ?",

View File

@ -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;
} }

View File

@ -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;

View File

@ -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();

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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();
} }

View File

@ -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;

View File

@ -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;

View File

@ -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);
} }
}, },

View File

@ -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),

View File

@ -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')));
}),
), ),
), ),
), ),

View File

@ -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(

View File

@ -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;

View File

@ -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 !=

View File

@ -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);

View File

@ -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))
]), ]),

View File

@ -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();

View File

@ -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>[

View File

@ -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),
), ),

View File

@ -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),

View File

@ -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(),
]),
),
);
}
}

View File

@ -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),
),
);
}
} }

View File

@ -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,

View File

@ -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),
),
),
),
]),
);
}
}

View File

@ -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:

View File

@ -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