Compare commits
17 Commits
88b34b1008
...
875341a804
Author | SHA1 | Date |
---|---|---|
|
875341a804 | |
|
70f4f151c0 | |
|
c1ebfc62bc | |
|
7f8d46b9e8 | |
|
7cdc13273e | |
|
6155552424 | |
|
622ceda579 | |
|
a28df90c18 | |
|
d7731504c7 | |
|
cf4387a280 | |
|
82c1d5bf4c | |
|
c81662de83 | |
|
150f6892f8 | |
|
4ef5f77888 | |
|
c50aa53f38 | |
|
30b8b68bef | |
|
535e121505 |
|
@ -202,5 +202,6 @@
|
|||
"received": "Received",
|
||||
"sent": "Sent",
|
||||
"createIdentity": "Create a new \nidentity",
|
||||
"memberAccountOf": "Account of {}"
|
||||
"memberAccountOf": "Account of {}",
|
||||
"pasteAddress": "Paste address from\nclipboard"
|
||||
}
|
|
@ -203,5 +203,6 @@
|
|||
"received": "Received",
|
||||
"sent": "Sent",
|
||||
"createIdentity": "Create a new \nidentity",
|
||||
"memberAccountOf": "Account of {}"
|
||||
"memberAccountOf": "Account of {}",
|
||||
"pasteAddress": "Paste address from\nclipboard"
|
||||
}
|
||||
|
|
|
@ -66,7 +66,7 @@
|
|||
"chooseAnotherPassword": "Choisir un autre 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é.",
|
||||
"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 !",
|
||||
"areYouSureToDeleteWallet": "Êtes-vous sûr de vouloir supprimer le coffre \"{}\" ?",
|
||||
"areYouSureForgetAllChests": "Êtes-vous sûr de vouloir oublier tous vos coffres ?",
|
||||
|
@ -203,5 +203,6 @@
|
|||
"received": "Reçus",
|
||||
"sent": "Envoyés",
|
||||
"createIdentity": "Créer sa nouvelle\nidentité",
|
||||
"memberAccountOf": "Compte de {}"
|
||||
"memberAccountOf": "Compte de {}",
|
||||
"pasteAddress": "Coller l'adresse depuis\nle presse-papier"
|
||||
}
|
||||
|
|
|
@ -259,14 +259,14 @@ Future<WalletData> _addImportAccount(
|
|||
final address = await sub.importAccount(
|
||||
mnemonic: mnemonic, derivePath: '//$derivation', password: 'AAAAA');
|
||||
final myWallet = WalletData(
|
||||
version: dataVersion,
|
||||
chest: chest,
|
||||
address: address,
|
||||
number: number,
|
||||
name: name,
|
||||
derivation: derivation,
|
||||
imageDefaultPath: '${number % 4}.png');
|
||||
await walletBox.add(myWallet);
|
||||
imageDefaultPath: '${number % 4}.png',
|
||||
isOwned: true);
|
||||
await walletBox.put(myWallet.address, myWallet);
|
||||
|
||||
return myWallet;
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ import 'package:hive_flutter/hive_flutter.dart';
|
|||
import 'package:logger/logger.dart';
|
||||
|
||||
// Version of box data
|
||||
const int dataVersion = 4;
|
||||
const int dataVersion = 6;
|
||||
|
||||
late String appVersion;
|
||||
const int pinLength = 5;
|
||||
|
@ -53,3 +53,5 @@ late int udValue;
|
|||
|
||||
// Indexer
|
||||
late DateTime startBlockchainTime;
|
||||
|
||||
late int currentUdIndex;
|
||||
|
|
|
@ -19,10 +19,11 @@ import 'dart:io';
|
|||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_dotenv/flutter_dotenv.dart';
|
||||
import 'package:gecko/globals.dart';
|
||||
import 'package:gecko/providers/cesium_plus.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/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/generate_wallets.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/my_wallets.dart';
|
||||
import 'package:gecko/providers/search.dart';
|
||||
import 'package:gecko/models/wallet_data.dart';
|
||||
import 'package:gecko/providers/wallet_options.dart';
|
||||
import 'package:gecko/screens/home.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
@ -62,29 +62,17 @@ Future<void> main() async {
|
|||
await homeProvider.initHive();
|
||||
appVersion = await homeProvider.getAppVersion();
|
||||
|
||||
// Reset GraphQL cache
|
||||
// final cache = HiveStore();
|
||||
// cache.reset();
|
||||
|
||||
// Configure Hive and open boxes
|
||||
Hive.registerAdapter(WalletDataAdapter());
|
||||
Hive.registerAdapter(ChestDataAdapter());
|
||||
Hive.registerAdapter(G1WalletsListAdapter());
|
||||
Hive.registerAdapter(IdAdapter());
|
||||
|
||||
walletBox = await Hive.openBox<WalletData>("walletBox");
|
||||
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();
|
||||
// await configBox.delete('isCacheChecked');
|
||||
if (configBox.get('isCacheChecked') == null) {
|
||||
configBox.put('isCacheChecked', false);
|
||||
}
|
||||
// log.d(await configBox.get('endpoint'));
|
||||
// Reset GraphQL cache
|
||||
// final cache = HiveStore();
|
||||
// cache.reset();
|
||||
|
||||
HttpOverrides.global = MyHttpOverrides();
|
||||
|
||||
|
|
|
@ -4,38 +4,42 @@ part 'wallet_data.g.dart';
|
|||
@HiveType(typeId: 0)
|
||||
class WalletData extends HiveObject {
|
||||
@HiveField(0)
|
||||
int? version;
|
||||
String address;
|
||||
|
||||
@HiveField(1)
|
||||
int? chest;
|
||||
|
||||
@HiveField(2)
|
||||
String? address;
|
||||
|
||||
@HiveField(3)
|
||||
int? number;
|
||||
|
||||
@HiveField(4)
|
||||
@HiveField(3)
|
||||
String? name;
|
||||
|
||||
@HiveField(5)
|
||||
@HiveField(4)
|
||||
int? derivation;
|
||||
|
||||
@HiveField(6)
|
||||
@HiveField(5)
|
||||
String? imageDefaultPath;
|
||||
|
||||
@HiveField(7)
|
||||
@HiveField(6)
|
||||
String? imageCustomPath;
|
||||
|
||||
@HiveField(7)
|
||||
bool isOwned;
|
||||
|
||||
@HiveField(8)
|
||||
bool isMember;
|
||||
|
||||
WalletData(
|
||||
{this.version,
|
||||
{required this.address,
|
||||
this.chest,
|
||||
this.address,
|
||||
this.number,
|
||||
this.name,
|
||||
this.derivation,
|
||||
this.imageDefaultPath,
|
||||
this.imageCustomPath});
|
||||
this.imageCustomPath,
|
||||
this.isOwned = false,
|
||||
this.isMember = false});
|
||||
|
||||
// representation of WalletData when debugging
|
||||
@override
|
||||
|
|
|
@ -17,37 +17,40 @@ class WalletDataAdapter extends TypeAdapter<WalletData> {
|
|||
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
|
||||
};
|
||||
return WalletData(
|
||||
version: fields[0] as int?,
|
||||
address: fields[0] as String,
|
||||
chest: fields[1] as int?,
|
||||
address: fields[2] as String?,
|
||||
number: fields[3] as int?,
|
||||
name: fields[4] as String?,
|
||||
derivation: fields[5] as int?,
|
||||
imageDefaultPath: fields[6] as String?,
|
||||
imageCustomPath: fields[7] as String?,
|
||||
number: fields[2] as int?,
|
||||
name: fields[3] as String?,
|
||||
derivation: fields[4] as int?,
|
||||
imageDefaultPath: fields[5] as String?,
|
||||
imageCustomPath: fields[6] as String?,
|
||||
isOwned: fields[7] as bool,
|
||||
isMember: fields[8] as bool,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void write(BinaryWriter writer, WalletData obj) {
|
||||
writer
|
||||
..writeByte(8)
|
||||
..writeByte(9)
|
||||
..writeByte(0)
|
||||
..write(obj.version)
|
||||
..write(obj.address)
|
||||
..writeByte(1)
|
||||
..write(obj.chest)
|
||||
..writeByte(2)
|
||||
..write(obj.address)
|
||||
..writeByte(3)
|
||||
..write(obj.number)
|
||||
..writeByte(4)
|
||||
..writeByte(3)
|
||||
..write(obj.name)
|
||||
..writeByte(5)
|
||||
..writeByte(4)
|
||||
..write(obj.derivation)
|
||||
..writeByte(6)
|
||||
..writeByte(5)
|
||||
..write(obj.imageDefaultPath)
|
||||
..writeByte(6)
|
||||
..write(obj.imageCustomPath)
|
||||
..writeByte(7)
|
||||
..write(obj.imageCustomPath);
|
||||
..write(obj.isOwned)
|
||||
..writeByte(8)
|
||||
..write(obj.isMember);
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
|
@ -45,7 +45,7 @@ class ChestProvider with ChangeNotifier {
|
|||
log.d(chest.key);
|
||||
walletBox.toMap().forEach((key, WalletData value) {
|
||||
if (value.chest == chest.key) {
|
||||
toDelete.add(value.address!);
|
||||
toDelete.add(value.address);
|
||||
}
|
||||
});
|
||||
return toDelete;
|
||||
|
|
|
@ -5,18 +5,15 @@ import 'package:easy_localization/easy_localization.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:gecko/globals.dart';
|
||||
import 'package:gecko/models/g1_wallets_list.dart';
|
||||
import 'package:gecko/models/queries_indexer.dart';
|
||||
import 'package:gecko/models/wallet_data.dart';
|
||||
import 'package:gecko/models/widgets_keys.dart';
|
||||
import 'package:gecko/providers/cesium_plus.dart';
|
||||
import 'package:gecko/providers/substrate_sdk.dart';
|
||||
import 'package:gecko/providers/wallet_options.dart';
|
||||
import 'package:gecko/providers/wallets_profiles.dart';
|
||||
import 'package:gecko/screens/wallet_view.dart';
|
||||
import 'package:gecko/widgets/balance.dart';
|
||||
import 'package:graphql_flutter/graphql_flutter.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:truncate/truncate.dart';
|
||||
|
||||
class DuniterIndexer with ChangeNotifier {
|
||||
Map<String, String?> walletNameIndexer = {};
|
||||
|
@ -27,6 +24,7 @@ class DuniterIndexer with ChangeNotifier {
|
|||
List? transBC;
|
||||
List listIndexerEndpoints = [];
|
||||
bool isLoadingIndexer = false;
|
||||
Map<String, String> idtyStatusCache = {};
|
||||
|
||||
void reload() {
|
||||
notifyListeners();
|
||||
|
@ -155,95 +153,6 @@ class DuniterIndexer with ChangeNotifier {
|
|||
return indexerEndpoint;
|
||||
}
|
||||
|
||||
Widget getNameByAddress(BuildContext context, String address,
|
||||
[WalletData? wallet,
|
||||
double size = 20,
|
||||
bool canEdit = false,
|
||||
Color color = Colors.black,
|
||||
FontWeight fontWeight = FontWeight.w400,
|
||||
FontStyle fontStyle = FontStyle.italic]) {
|
||||
final walletOptions =
|
||||
Provider.of<WalletOptionsProvider>(context, listen: false);
|
||||
if (indexerEndpoint == '') {
|
||||
if (wallet == null) {
|
||||
return const SizedBox();
|
||||
} else {
|
||||
if (canEdit) {
|
||||
return walletOptions.walletName(context, wallet, size, color);
|
||||
} else {
|
||||
return walletOptions.walletNameController(context, wallet, size);
|
||||
}
|
||||
}
|
||||
}
|
||||
final httpLink = HttpLink(
|
||||
'$indexerEndpoint/v1/graphql',
|
||||
);
|
||||
|
||||
final client = ValueNotifier(
|
||||
GraphQLClient(
|
||||
cache: GraphQLCache(store: HiveStore()),
|
||||
link: httpLink,
|
||||
),
|
||||
);
|
||||
return GraphQLProvider(
|
||||
client: client,
|
||||
child: Query(
|
||||
options: QueryOptions(
|
||||
document: gql(
|
||||
getNameByAddressQ), // this is the query string you just created
|
||||
variables: {
|
||||
'address': address,
|
||||
},
|
||||
// pollInterval: const Duration(seconds: 10),
|
||||
),
|
||||
builder: (QueryResult result,
|
||||
{VoidCallback? refetch, FetchMore? fetchMore}) {
|
||||
if (result.hasException) {
|
||||
return Text(result.exception.toString());
|
||||
}
|
||||
|
||||
if (result.isLoading) {
|
||||
return const Text('Loading');
|
||||
}
|
||||
|
||||
walletNameIndexer[address] =
|
||||
result.data?['account_by_pk']?['identity']?['name'];
|
||||
|
||||
g1WalletsBox.put(
|
||||
address,
|
||||
G1WalletsList(
|
||||
address: address, username: walletNameIndexer[address]));
|
||||
|
||||
// log.d(g1WalletsBox.toMap().values.first.username);
|
||||
|
||||
if (walletNameIndexer[address] == null) {
|
||||
if (wallet == null) {
|
||||
return const SizedBox();
|
||||
} else {
|
||||
if (canEdit) {
|
||||
return walletOptions.walletName(context, wallet, size, color);
|
||||
} else {
|
||||
return walletOptions.walletNameController(
|
||||
context, wallet, size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Text(
|
||||
color == Colors.grey[700]!
|
||||
? '(${walletNameIndexer[address]!})'
|
||||
: truncate(walletNameIndexer[address]!, 20),
|
||||
style: TextStyle(
|
||||
fontSize: size,
|
||||
color: color,
|
||||
fontWeight: fontWeight,
|
||||
fontStyle: fontStyle,
|
||||
),
|
||||
);
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
Widget searchIdentity(BuildContext context, String name) {
|
||||
// WalletOptionsProvider _walletOptions =
|
||||
// Provider.of<WalletOptionsProvider>(context, listen: false);
|
||||
|
@ -325,7 +234,8 @@ class DuniterIndexer with ChangeNotifier {
|
|||
Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
balance(context, profile['pubkey'], 16),
|
||||
Balance(
|
||||
address: profile['pubkey'], size: 16),
|
||||
]),
|
||||
]),
|
||||
),
|
||||
|
@ -396,16 +306,18 @@ class DuniterIndexer with ChangeNotifier {
|
|||
|
||||
pageInfo = result.data['transaction_connection']['pageInfo'];
|
||||
fetchMoreCursor = pageInfo!['endCursor'];
|
||||
final hasNextPage = pageInfo!['hasNextPage'];
|
||||
final hasPreviousPage = pageInfo!['hasPreviousPage'];
|
||||
if (fetchMoreCursor == null) nPage = 1;
|
||||
|
||||
log.d(fetchMoreCursor);
|
||||
log.d('endCursor: $fetchMoreCursor $hasNextPage $hasPreviousPage');
|
||||
|
||||
if (nPage == 1) {
|
||||
nRepositories = 40;
|
||||
} else if (nPage == 2) {
|
||||
nRepositories = 100;
|
||||
}
|
||||
// nRepositories = 10;
|
||||
// if (nPage == 1) {
|
||||
// nRepositories = 20;
|
||||
// } else if (nPage == 4) {
|
||||
// nRepositories = 40;
|
||||
// }
|
||||
// // nRepositories = 10;
|
||||
nPage++;
|
||||
|
||||
if (fetchMoreCursor != null) {
|
||||
|
@ -444,9 +356,6 @@ class DuniterIndexer with ChangeNotifier {
|
|||
String result = n.toStringAsFixed(n.truncateToDouble() == n ? 0 : 2);
|
||||
return double.parse(result);
|
||||
}
|
||||
|
||||
// checkHistoryResult(
|
||||
// QueryResult<Object?> result, FetchMoreOptions options, String address) {}
|
||||
}
|
||||
|
||||
//// Manuals queries
|
||||
|
|
|
@ -414,14 +414,14 @@ class GenerateWalletsProvider with ChangeNotifier {
|
|||
password: pin.text);
|
||||
|
||||
WalletData myWallet = WalletData(
|
||||
version: dataVersion,
|
||||
chest: currentChestNumber,
|
||||
address: addressData.address!,
|
||||
number: scanedValidWalletNumber,
|
||||
name: walletName,
|
||||
derivation: derivationNbr,
|
||||
imageDefaultPath: '${scanedValidWalletNumber % 4}.png');
|
||||
await walletBox.add(myWallet);
|
||||
imageDefaultPath: '${scanedValidWalletNumber % 4}.png',
|
||||
isOwned: true);
|
||||
await walletBox.put(myWallet.address, myWallet);
|
||||
scanedValidWalletNumber = scanedValidWalletNumber + 1;
|
||||
}
|
||||
scanedWalletNumber = scanedWalletNumber + 1;
|
||||
|
@ -454,14 +454,14 @@ class GenerateWalletsProvider with ChangeNotifier {
|
|||
await sub.importAccount(mnemonic: generatedMnemonic!, password: pin.text);
|
||||
|
||||
WalletData myWallet = WalletData(
|
||||
version: dataVersion,
|
||||
chest: currentChestNumber,
|
||||
address: addressData.address!,
|
||||
number: 0,
|
||||
name: walletName,
|
||||
derivation: -1,
|
||||
imageDefaultPath: '0.png');
|
||||
await walletBox.add(myWallet);
|
||||
imageDefaultPath: '0.png',
|
||||
isOwned: true);
|
||||
await walletBox.put(myWallet.address, myWallet);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
|
|
|
@ -11,15 +11,8 @@ import 'package:flutter/services.dart';
|
|||
|
||||
import 'dart:async';
|
||||
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/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:flutter/foundation.dart' show kDebugMode, kIsWeb;
|
||||
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]));
|
||||
String homeMessage = "loading".tr();
|
||||
String defaultMessage = "noLizard".tr();
|
||||
bool isWalletBoxInit = false;
|
||||
|
||||
Future<void> initHive() async {
|
||||
late Directory hivePath;
|
||||
|
@ -68,9 +62,11 @@ class HomeProvider with ChangeNotifier {
|
|||
|
||||
Future changeCurrencyUnit(BuildContext context) async {
|
||||
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
||||
final walletOptions =
|
||||
Provider.of<WalletOptionsProvider>(context, listen: false);
|
||||
final bool isUdUnit = configBox.get('isUdUnit') ?? false;
|
||||
await configBox.put('isUdUnit', !isUdUnit);
|
||||
balanceCache = {};
|
||||
walletOptions.balanceCache = {};
|
||||
sub.getBalanceRatio();
|
||||
notifyListeners();
|
||||
}
|
||||
|
@ -133,104 +129,6 @@ class HomeProvider with ChangeNotifier {
|
|||
// 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() {
|
||||
notifyListeners();
|
||||
}
|
||||
|
|
|
@ -48,7 +48,7 @@ class MyWalletsProvider with ChangeNotifier {
|
|||
}
|
||||
|
||||
WalletData? getWalletDataById(List<int?> id) {
|
||||
if (id.isEmpty) return WalletData();
|
||||
if (id.isEmpty) return WalletData(address: '', isOwned: true);
|
||||
int? chest = id[0];
|
||||
int? nbr = id[1];
|
||||
WalletData? targetedWallet;
|
||||
|
@ -78,12 +78,12 @@ class MyWalletsProvider with ChangeNotifier {
|
|||
|
||||
WalletData getDefaultWallet([int? chest]) {
|
||||
if (chestBox.isEmpty) {
|
||||
return WalletData(chest: 0, number: 0);
|
||||
return WalletData(address: '', chest: 0, number: 0, isOwned: true);
|
||||
} else {
|
||||
chest ??= getCurrentChest();
|
||||
int? defaultWalletNumber = chestBox.get(chest)!.defaultWallet;
|
||||
return getWalletDataById([chest, defaultWalletNumber]) ??
|
||||
WalletData(chest: chest, number: 0);
|
||||
WalletData(address: '', chest: chest, number: 0, isOwned: true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -131,18 +131,18 @@ class MyWalletsProvider with ChangeNotifier {
|
|||
WalletData defaultWallet = getDefaultWallet();
|
||||
|
||||
final address = await sub.derive(
|
||||
context, defaultWallet.address!, newDerivationNbr, pinCode);
|
||||
context, defaultWallet.address, newDerivationNbr, pinCode);
|
||||
|
||||
WalletData newWallet = WalletData(
|
||||
version: dataVersion,
|
||||
chest: chest,
|
||||
address: address,
|
||||
number: newWalletNbr,
|
||||
name: name,
|
||||
derivation: newDerivationNbr,
|
||||
imageDefaultPath: '${newWalletNbr % 4}.png');
|
||||
imageDefaultPath: '${newWalletNbr % 4}.png',
|
||||
isOwned: true);
|
||||
|
||||
await walletBox.add(newWallet);
|
||||
await walletBox.put(newWallet.address, newWallet);
|
||||
|
||||
isNewDerivationLoading = false;
|
||||
notifyListeners();
|
||||
|
@ -158,6 +158,9 @@ class MyWalletsProvider with ChangeNotifier {
|
|||
int? chest = getCurrentChest();
|
||||
|
||||
List<WalletData> walletConfig = readAllWallets(chest);
|
||||
walletConfig.sort((p1, p2) {
|
||||
return Comparable.compare(p1.number!, p2.number!);
|
||||
});
|
||||
|
||||
if (walletConfig.isEmpty) {
|
||||
newWalletNbr = 0;
|
||||
|
@ -169,18 +172,18 @@ class MyWalletsProvider with ChangeNotifier {
|
|||
WalletData defaultWallet = myWalletProvider.getDefaultWallet();
|
||||
|
||||
final address =
|
||||
await sub.generateRootKeypair(defaultWallet.address!, pinCode);
|
||||
await sub.generateRootKeypair(defaultWallet.address, pinCode);
|
||||
|
||||
WalletData newWallet = WalletData(
|
||||
version: dataVersion,
|
||||
chest: chest,
|
||||
address: address,
|
||||
number: newWalletNbr,
|
||||
name: name,
|
||||
derivation: -1,
|
||||
imageDefaultPath: '${newWalletNbr % 4}.png');
|
||||
imageDefaultPath: '${newWalletNbr % 4}.png',
|
||||
isOwned: true);
|
||||
|
||||
await walletBox.add(newWallet);
|
||||
await walletBox.put(newWallet.address, newWallet);
|
||||
|
||||
isNewDerivationLoading = false;
|
||||
notifyListeners();
|
||||
|
@ -194,6 +197,9 @@ class MyWalletsProvider with ChangeNotifier {
|
|||
chestNumber ??= getCurrentChest();
|
||||
|
||||
List<WalletData> walletConfig = readAllWallets(chestNumber);
|
||||
walletConfig.sort((p1, p2) {
|
||||
return Comparable.compare(p1.number!, p2.number!);
|
||||
});
|
||||
|
||||
if (walletConfig.isEmpty) {
|
||||
newDerivationNbr = 2;
|
||||
|
|
|
@ -7,7 +7,6 @@ import 'package:flutter/material.dart';
|
|||
import 'package:gecko/globals.dart';
|
||||
import 'package:gecko/models/chest_data.dart';
|
||||
import 'package:gecko/models/wallet_data.dart';
|
||||
import 'package:gecko/providers/duniter_indexer.dart';
|
||||
import 'package:gecko/providers/home.dart';
|
||||
import 'package:gecko/providers/my_wallets.dart';
|
||||
import 'package:gecko/providers/wallet_options.dart';
|
||||
|
@ -181,7 +180,7 @@ class SubstrateSdk with ChangeNotifier {
|
|||
}
|
||||
|
||||
Future<Map<String, double>> getBalance(String address) async {
|
||||
// log.d('currencyParameters: $currencyParameters');
|
||||
log.d('BALANCE: $address');
|
||||
|
||||
if (!nodeConnected) {
|
||||
return {
|
||||
|
@ -199,13 +198,11 @@ class SubstrateSdk with ChangeNotifier {
|
|||
final Map? idtyData = idtyIndex == null
|
||||
? null
|
||||
: await _getStorage('identity.identities($idtyIndex)');
|
||||
final int currentUdIndex =
|
||||
int.parse(await _getStorage('universalDividend.currentUdIndex()'));
|
||||
final List pastReevals =
|
||||
await _getStorage('universalDividend.pastReevals()');
|
||||
|
||||
// Compute amount of claimable UDs
|
||||
final int unclaimedUds = _computeUnclaimUds(currentUdIndex,
|
||||
final int unclaimedUds = _computeUnclaimUds(
|
||||
idtyData?['data']?['firstEligibleUd'] ?? 0, pastReevals);
|
||||
|
||||
// Calculate transferable and potential balance
|
||||
|
@ -227,8 +224,7 @@ class SubstrateSdk with ChangeNotifier {
|
|||
return finalBalances;
|
||||
}
|
||||
|
||||
int _computeUnclaimUds(
|
||||
int currentUdIndex, int firstEligibleUd, List pastReevals) {
|
||||
int _computeUnclaimUds(int firstEligibleUd, List pastReevals) {
|
||||
int totalAmount = 0;
|
||||
|
||||
if (firstEligibleUd == 0) return 0;
|
||||
|
@ -252,8 +248,13 @@ class SubstrateSdk with ChangeNotifier {
|
|||
return totalAmount;
|
||||
}
|
||||
|
||||
Future<bool> isMemberGet(String address) async {
|
||||
return await idtyStatus(address) == 'Validated';
|
||||
Future<bool> isMember(String address) async {
|
||||
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 {
|
||||
|
@ -273,7 +274,7 @@ class SubstrateSdk with ChangeNotifier {
|
|||
Map<String, int> result = {};
|
||||
final toStatus = await idtyStatus(to);
|
||||
|
||||
if (from != to && await isMemberGet(from)) {
|
||||
if (from != to && await isMember(from)) {
|
||||
final removableOn = await getCertValidityPeriod(from, to);
|
||||
final certMeta = await getCertMeta(from);
|
||||
final int nextIssuableOn = certMeta['nextIssuableOn'] ?? 0;
|
||||
|
@ -537,13 +538,10 @@ class SubstrateSdk with ChangeNotifier {
|
|||
}
|
||||
notifyListeners();
|
||||
});
|
||||
|
||||
await initCurrencyParameters();
|
||||
currentUdIndex =
|
||||
int.parse(await _getStorage('universalDividend.currentUdIndex()'));
|
||||
await getBalanceRatio();
|
||||
|
||||
// Indexer
|
||||
getBlockStart();
|
||||
|
||||
notifyListeners();
|
||||
homeProvider.changeMessage(
|
||||
"wellConnectedToNode"
|
||||
|
@ -702,7 +700,7 @@ class SubstrateSdk with ChangeNotifier {
|
|||
await chestBox.put(currentChestNumber, newChestData);
|
||||
|
||||
try {
|
||||
final acc = getKeypair(wallet.address!);
|
||||
final acc = getKeypair(wallet.address);
|
||||
keyring.setCurrent(acc);
|
||||
return acc.address!;
|
||||
} catch (e) {
|
||||
|
|
|
@ -4,7 +4,6 @@ import 'dart:io';
|
|||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
import 'dart:async';
|
||||
import 'package:gecko/globals.dart';
|
||||
import 'package:gecko/models/widgets_keys.dart';
|
||||
|
@ -12,14 +11,12 @@ import 'package:gecko/providers/duniter_indexer.dart';
|
|||
import 'package:gecko/providers/my_wallets.dart';
|
||||
import 'package:gecko/models/wallet_data.dart';
|
||||
import 'package:gecko/providers/substrate_sdk.dart';
|
||||
import 'package:gecko/screens/animated_text.dart';
|
||||
import 'package:gecko/screens/common_elements.dart';
|
||||
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
|
||||
import 'package:gecko/screens/transaction_in_progress.dart';
|
||||
import 'package:image_picker/image_picker.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:image_cropper/image_cropper.dart';
|
||||
import 'package:truncate/truncate.dart';
|
||||
|
||||
class WalletOptionsProvider with ChangeNotifier {
|
||||
TextEditingController address = TextEditingController();
|
||||
|
@ -29,12 +26,11 @@ class WalletOptionsProvider with ChangeNotifier {
|
|||
TextEditingController newPin = TextEditingController();
|
||||
bool isEditing = false;
|
||||
bool isBalanceBlur = false;
|
||||
FocusNode walletNameFocus = FocusNode();
|
||||
TextEditingController nameController = TextEditingController();
|
||||
late bool isDefaultWallet;
|
||||
bool canValidateNameBool = false;
|
||||
Map<String, String> idtyStatusCache = {};
|
||||
Future<NewWallet>? get badWallet => null;
|
||||
Map<String, double> balanceCache = {};
|
||||
|
||||
int getPinLenght(walletNbr) {
|
||||
return pinLength;
|
||||
|
@ -58,21 +54,21 @@ class WalletOptionsProvider with ChangeNotifier {
|
|||
|
||||
if (answer ?? false) {
|
||||
//Check if balance is null
|
||||
final balance = await sub.getBalance(wallet.address!);
|
||||
final balance = await sub.getBalance(wallet.address);
|
||||
if (balance != {}) {
|
||||
final myWalletProvider =
|
||||
Provider.of<MyWalletsProvider>(context, listen: false);
|
||||
final defaultWallet = myWalletProvider.getDefaultWallet();
|
||||
log.d(defaultWallet.address);
|
||||
sub.pay(
|
||||
fromAddress: wallet.address!,
|
||||
destAddress: defaultWallet.address!,
|
||||
fromAddress: wallet.address,
|
||||
destAddress: defaultWallet.address,
|
||||
amount: -1,
|
||||
password: myWalletProvider.pinCode);
|
||||
}
|
||||
|
||||
await walletBox.delete(wallet.key);
|
||||
await sub.deleteAccounts([wallet.address!]);
|
||||
await sub.deleteAccounts([wallet.address]);
|
||||
|
||||
Navigator.pop(context);
|
||||
}
|
||||
|
@ -133,89 +129,6 @@ class WalletOptionsProvider with ChangeNotifier {
|
|||
}
|
||||
}
|
||||
|
||||
Widget idtyStatus(BuildContext context, String address,
|
||||
{bool isOwner = false, Color color = Colors.black}) {
|
||||
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 FutureBuilder(
|
||||
future: sub.idtyStatus(address),
|
||||
initialData: '',
|
||||
builder: (context, snapshot) {
|
||||
idtyStatusCache[address] = snapshot.data.toString();
|
||||
switch (snapshot.data.toString()) {
|
||||
case 'noid':
|
||||
{
|
||||
return showText('noIdentity'.tr());
|
||||
}
|
||||
case 'Created':
|
||||
{
|
||||
return showText('identityCreated'.tr());
|
||||
}
|
||||
case 'ConfirmedByOwner':
|
||||
{
|
||||
return isOwner
|
||||
? showText('identityConfirmed'.tr())
|
||||
: duniterIndexer.getNameByAddress(
|
||||
context,
|
||||
address,
|
||||
null,
|
||||
20,
|
||||
true,
|
||||
Colors.grey[700]!,
|
||||
FontWeight.w500,
|
||||
FontStyle.italic);
|
||||
}
|
||||
|
||||
case 'Validated':
|
||||
{
|
||||
return isOwner
|
||||
? showText('memberValidated'.tr(), 18, true)
|
||||
: duniterIndexer.getNameByAddress(
|
||||
context,
|
||||
address,
|
||||
null,
|
||||
20,
|
||||
true,
|
||||
Colors.black,
|
||||
FontWeight.w600,
|
||||
FontStyle.normal);
|
||||
}
|
||||
|
||||
case 'expired':
|
||||
{
|
||||
return showText('identityExpired'.tr());
|
||||
}
|
||||
}
|
||||
return SizedBox(
|
||||
child: showText('', 18, false, false),
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
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 {
|
||||
TextEditingController idtyName = TextEditingController();
|
||||
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
||||
|
@ -315,9 +228,8 @@ class WalletOptionsProvider with ChangeNotifier {
|
|||
return TransactionInProgress(
|
||||
transType: 'comfirmIdty',
|
||||
fromAddress:
|
||||
getShortPubkey(wallet.address!),
|
||||
toAddress:
|
||||
getShortPubkey(wallet.address!),
|
||||
getShortPubkey(wallet.address),
|
||||
toAddress: getShortPubkey(wallet.address),
|
||||
);
|
||||
}),
|
||||
);
|
||||
|
@ -393,7 +305,7 @@ class WalletOptionsProvider with ChangeNotifier {
|
|||
if (canValidateNameBool) {
|
||||
nameController.text = walletName.text;
|
||||
_renameWallet(wID, walletName.text, isCesium: false);
|
||||
// notifyListeners();
|
||||
notifyListeners();
|
||||
Navigator.pop(context);
|
||||
}
|
||||
},
|
||||
|
@ -463,7 +375,7 @@ class WalletOptionsProvider with ChangeNotifier {
|
|||
String? addressGet;
|
||||
walletBox.toMap().forEach((key, value) {
|
||||
if (value.chest == chest && value.derivation == derivation) {
|
||||
addressGet = value.address!;
|
||||
addressGet = value.address;
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
@ -472,190 +384,4 @@ class WalletOptionsProvider with ChangeNotifier {
|
|||
|
||||
return addressGet;
|
||||
}
|
||||
|
||||
Widget walletNameController(BuildContext context, WalletData wallet,
|
||||
[double size = 20]) {
|
||||
nameController.text = wallet.name!;
|
||||
|
||||
return SizedBox(
|
||||
width: 260,
|
||||
child: Stack(children: <Widget>[
|
||||
TextField(
|
||||
key: keyWalletName,
|
||||
autofocus: false,
|
||||
focusNode: walletNameFocus,
|
||||
enabled: isEditing,
|
||||
controller: 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 {
|
||||
// _isNewNameValid =
|
||||
// walletProvider.editWalletName(wallet.id(), isCesium: false);
|
||||
await editWalletName(context, wallet.id());
|
||||
await Future.delayed(const Duration(milliseconds: 30));
|
||||
walletNameFocus.requestFocus();
|
||||
},
|
||||
child: ClipRRect(
|
||||
child: Image.asset(
|
||||
isEditing
|
||||
? 'assets/walletOptions/android-checkmark.png'
|
||||
: 'assets/walletOptions/edit.png',
|
||||
width: 25,
|
||||
height: 25),
|
||||
),
|
||||
),
|
||||
),
|
||||
]),
|
||||
);
|
||||
}
|
||||
|
||||
Widget walletName(BuildContext context, WalletData wallet,
|
||||
[double size = 20, Color color = Colors.black]) {
|
||||
double newSize = wallet.name!.length <= 15 ? size : size - 2;
|
||||
|
||||
return Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
|
||||
Text(
|
||||
truncate(wallet.name!, 20),
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: isTall ? newSize : newSize * 0.9,
|
||||
color: color,
|
||||
fontWeight: FontWeight.w400,
|
||||
fontStyle: FontStyle.italic,
|
||||
),
|
||||
softWrap: false,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, double> balanceCache = {};
|
||||
|
||||
Widget balance(BuildContext context, String address, double size,
|
||||
[Color color = Colors.black,
|
||||
Color loadingColor = const Color(0xffd07316)]) {
|
||||
return Column(children: <Widget>[
|
||||
Consumer<SubstrateSdk>(builder: (context, sdk, _) {
|
||||
return FutureBuilder(
|
||||
future: sdk.getBalance(address),
|
||||
builder: (BuildContext context,
|
||||
AsyncSnapshot<Map<String, double>> globalBalance) {
|
||||
if (globalBalance.connectionState != ConnectionState.done ||
|
||||
globalBalance.hasError) {
|
||||
if (balanceCache[address] != null &&
|
||||
balanceCache[address] != -1) {
|
||||
return Row(children: [
|
||||
Text(balanceCache[address]!.toString(),
|
||||
style: TextStyle(
|
||||
fontSize: isTall ? size : size * 0.9, color: color)),
|
||||
const SizedBox(width: 5),
|
||||
udUnitDisplay(size, color),
|
||||
]);
|
||||
} else {
|
||||
return SizedBox(
|
||||
height: 15,
|
||||
width: 15,
|
||||
child: CircularProgressIndicator(
|
||||
color: loadingColor,
|
||||
strokeWidth: 2,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
balanceCache[address] = globalBalance.data!['transferableBalance']!;
|
||||
if (balanceCache[address] != -1) {
|
||||
return Row(children: [
|
||||
Text(
|
||||
balanceCache[address]!.toString(),
|
||||
style: TextStyle(
|
||||
fontSize: isTall ? size : size * 0.9,
|
||||
color: color,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 5),
|
||||
udUnitDisplay(size, color),
|
||||
]);
|
||||
} else {
|
||||
return const Text('');
|
||||
}
|
||||
});
|
||||
}),
|
||||
]);
|
||||
}
|
||||
|
||||
Widget getCerts(BuildContext context, String address, double size,
|
||||
[Color color = Colors.black]) {
|
||||
return Column(children: <Widget>[
|
||||
Consumer<SubstrateSdk>(builder: (context, sdk, _) {
|
||||
return FutureBuilder(
|
||||
future: sdk.getCertsCounter(address),
|
||||
builder: (BuildContext context, AsyncSnapshot<List<int>> certs) {
|
||||
// log.d(_certs.data);
|
||||
|
||||
return certs.data?[0] != 0 && certs.data != null
|
||||
? Row(
|
||||
children: [
|
||||
Image.asset('assets/medal.png', height: 20),
|
||||
const SizedBox(width: 1),
|
||||
Text(certs.data?[0].toString() ?? '0',
|
||||
style: const TextStyle(fontSize: 20)),
|
||||
const SizedBox(width: 5),
|
||||
Text(
|
||||
"(${certs.data?[1].toString() ?? '0'})",
|
||||
style: const TextStyle(fontSize: 14),
|
||||
)
|
||||
],
|
||||
)
|
||||
: const Text('');
|
||||
});
|
||||
}),
|
||||
]);
|
||||
}
|
||||
|
||||
Widget udUnitDisplay(double size, [Color color = Colors.black]) {
|
||||
final bool isUdUnit = configBox.get('isUdUnit') ?? false;
|
||||
return isUdUnit
|
||||
? Row(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
Text(
|
||||
'ud'.tr(args: ['']),
|
||||
style:
|
||||
TextStyle(fontSize: isTall ? size : size * 0.9, color: color),
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
Text(
|
||||
currencyName,
|
||||
style: TextStyle(
|
||||
fontSize: (isTall ? size : size * 0.9) * 0.7,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: color),
|
||||
),
|
||||
const SizedBox(height: 15)
|
||||
],
|
||||
)
|
||||
],
|
||||
)
|
||||
: Text(currencyName,
|
||||
style: TextStyle(fontSize: isTall ? size : size * 0.9, color: color));
|
||||
}
|
||||
|
|
|
@ -7,35 +7,44 @@ import 'package:gecko/models/queries_indexer.dart';
|
|||
import 'package:gecko/models/widgets_keys.dart';
|
||||
import 'package:gecko/providers/cesium_plus.dart';
|
||||
import 'package:gecko/providers/duniter_indexer.dart';
|
||||
import 'package:gecko/providers/home.dart';
|
||||
import 'package:gecko/providers/substrate_sdk.dart';
|
||||
import 'package:flutter/material.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/page_route_no_transition.dart';
|
||||
import 'package:graphql_flutter/graphql_flutter.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class ActivityScreen extends StatelessWidget with ChangeNotifier {
|
||||
class ActivityScreen extends StatefulWidget with ChangeNotifier {
|
||||
ActivityScreen({required this.address, required this.avatar, this.username})
|
||||
: super(key: keyActivityScreen);
|
||||
final ScrollController scrollController = ScrollController();
|
||||
final double avatarsSize = 80;
|
||||
final String address;
|
||||
final String? username;
|
||||
final Image avatar;
|
||||
|
||||
@override
|
||||
State<ActivityScreen> createState() => _ActivityScreenState();
|
||||
}
|
||||
|
||||
class _ActivityScreenState extends State<ActivityScreen> {
|
||||
@override
|
||||
void initState() {
|
||||
final duniterIndexerInit =
|
||||
Provider.of<DuniterIndexer>(context, listen: false);
|
||||
duniterIndexerInit.nPage = 1;
|
||||
|
||||
super.initState();
|
||||
}
|
||||
|
||||
final ScrollController scrollController = ScrollController();
|
||||
final double avatarsSize = 80;
|
||||
FetchMore? fetchMore;
|
||||
FetchMoreOptions? opts;
|
||||
|
||||
final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
HomeProvider homeProvider =
|
||||
Provider.of<HomeProvider>(context, listen: false);
|
||||
|
||||
// log.d('aaaaaaaaaaaaaaaaaaaaa $startBlockchainTime');
|
||||
|
||||
return Scaffold(
|
||||
key: _scaffoldKey,
|
||||
appBar: AppBar(
|
||||
|
@ -46,9 +55,9 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier {
|
|||
child: Text('accountActivity'.tr()),
|
||||
),
|
||||
),
|
||||
bottomNavigationBar: homeProvider.bottomAppBar(context),
|
||||
bottomNavigationBar: const GeckoBottomAppBar(),
|
||||
body: Column(children: <Widget>[
|
||||
HeaderProfile(address: address, username: username),
|
||||
HeaderProfile(address: widget.address, username: widget.username),
|
||||
historyQuery(context),
|
||||
]));
|
||||
}
|
||||
|
@ -89,7 +98,7 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier {
|
|||
options: QueryOptions(
|
||||
document: gql(getHistoryByAddressQ),
|
||||
variables: <String, dynamic>{
|
||||
'address': address,
|
||||
'address': widget.address,
|
||||
'number': 20,
|
||||
'cursor': null
|
||||
},
|
||||
|
@ -97,7 +106,9 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier {
|
|||
builder: (QueryResult result, {fetchMore, refetch}) {
|
||||
if (result.isLoading && result.data == null) {
|
||||
return const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
child: CircularProgressIndicator(
|
||||
color: orangeC,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -124,7 +135,8 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier {
|
|||
|
||||
if (result.isNotLoading) {
|
||||
// log.d(result.data);
|
||||
opts = duniterIndexer.checkQueryResult(result, opts, address);
|
||||
opts = duniterIndexer.checkQueryResult(
|
||||
result, opts, widget.address);
|
||||
}
|
||||
|
||||
// Build history list
|
||||
|
@ -366,10 +378,10 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier {
|
|||
// _cesiumPlusProvider.avatarCancelToken.cancel('cancelled');
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) {
|
||||
PageNoTransit(builder: (context) {
|
||||
return WalletViewScreen(
|
||||
address: repository[1],
|
||||
username: username ?? '',
|
||||
username: widget.username ?? '',
|
||||
);
|
||||
}),
|
||||
);
|
||||
|
|
|
@ -402,6 +402,24 @@ Future<void> infoPopup(BuildContext context, String title) async {
|
|||
);
|
||||
}
|
||||
|
||||
bool isAddress(address) {
|
||||
final RegExp regExp = RegExp(
|
||||
r'^[a-zA-Z0-9]+$',
|
||||
caseSensitive: false,
|
||||
multiLine: false,
|
||||
);
|
||||
|
||||
if (regExp.hasMatch(address) == true &&
|
||||
address.length > 45 &&
|
||||
address.length < 52) {
|
||||
log.d("C'est une adresse !");
|
||||
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Widget geckoAppBar() {
|
||||
// return AppBar(
|
||||
// toolbarHeight: 60 * ratio,
|
||||
|
|
|
@ -4,7 +4,8 @@ import 'package:bubble/bubble.dart';
|
|||
import 'package:connectivity_plus/connectivity_plus.dart';
|
||||
import 'package:easy_localization/easy_localization.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/providers/chest_provider.dart';
|
||||
import 'package:gecko/providers/duniter_indexer.dart';
|
||||
|
@ -14,7 +15,7 @@ import 'package:gecko/providers/wallets_profiles.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:gecko/providers/my_wallets.dart';
|
||||
import 'package:gecko/models/wallet_data.dart';
|
||||
import 'package:gecko/screens/animated_text.dart';
|
||||
import 'package:gecko/widgets/animated_text.dart';
|
||||
import 'package:gecko/screens/common_elements.dart';
|
||||
import 'package:gecko/screens/myWallets/restore_chest.dart';
|
||||
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
|
||||
|
@ -22,21 +23,109 @@ import 'package:gecko/screens/myWallets/wallets_home.dart';
|
|||
import 'package:gecko/screens/onBoarding/1.dart';
|
||||
import 'package:gecko/screens/search.dart';
|
||||
import 'package:gecko/screens/settings.dart';
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:gecko/screens/my_contacts.dart';
|
||||
|
||||
class HomeScreen extends StatelessWidget {
|
||||
class HomeScreen extends StatefulWidget {
|
||||
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
|
||||
Widget build(BuildContext context) {
|
||||
homeContext = context;
|
||||
|
||||
final myWalletProvider = Provider.of<MyWalletsProvider>(context);
|
||||
Provider.of<ChestProvider>(context);
|
||||
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
||||
|
||||
final bool isWalletsExists = myWalletProvider.checkIfWalletExist();
|
||||
|
||||
isTall = false;
|
||||
|
@ -46,143 +135,65 @@ class HomeScreen extends StatelessWidget {
|
|||
ratio = 1.125;
|
||||
}
|
||||
return Scaffold(
|
||||
resizeToAvoidBottomInset: false,
|
||||
drawer: Drawer(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: ListView(padding: EdgeInsets.zero, children: <Widget>[
|
||||
DrawerHeader(
|
||||
decoration: const BoxDecoration(
|
||||
color: orangeC,
|
||||
resizeToAvoidBottomInset: false,
|
||||
drawer: Drawer(
|
||||
child: Column(
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: ListView(padding: EdgeInsets.zero, children: <Widget>[
|
||||
DrawerHeader(
|
||||
decoration: const BoxDecoration(
|
||||
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>[
|
||||
SizedBox(height: 0),
|
||||
Image(
|
||||
image: AssetImage('assets/icon/gecko_final.png'),
|
||||
height: 130),
|
||||
]),
|
||||
),
|
||||
ListTile(
|
||||
key: keyParameters,
|
||||
title: Text('parameters'.tr()),
|
||||
onTap: () {
|
||||
Navigator.pop(context);
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) {
|
||||
return SettingsScreen();
|
||||
}),
|
||||
);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
key: keyContacts,
|
||||
title: Text('contactsManagement'.tr()),
|
||||
onTap: () {
|
||||
Navigator.pop(context);
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) {
|
||||
return const ContactsScreen();
|
||||
}),
|
||||
);
|
||||
},
|
||||
),
|
||||
])),
|
||||
Align(
|
||||
alignment: FractionalOffset.bottomCenter,
|
||||
child: Text('Ğecko v$appVersion')),
|
||||
const SizedBox(height: 20)
|
||||
],
|
||||
ListTile(
|
||||
key: keyParameters,
|
||||
title: Text('parameters'.tr()),
|
||||
onTap: () {
|
||||
Navigator.pop(context);
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) {
|
||||
return SettingsScreen();
|
||||
}),
|
||||
);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
key: keyContacts,
|
||||
title: Text('contactsManagement'.tr()),
|
||||
onTap: () {
|
||||
Navigator.pop(context);
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) {
|
||||
return const ContactsScreen();
|
||||
}),
|
||||
);
|
||||
},
|
||||
),
|
||||
])),
|
||||
Align(
|
||||
alignment: FractionalOffset.bottomCenter,
|
||||
child: Text('Ğecko v$appVersion')),
|
||||
const SizedBox(height: 20)
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
// bottomNavigationBar: _homeProvider.bottomBar(context, 1),
|
||||
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);
|
||||
}
|
||||
});
|
||||
// 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',
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
),
|
||||
),
|
||||
);
|
||||
backgroundColor: const Color(0xffF9F9F1),
|
||||
body: isWalletsExists ? geckHome(context) : welcomeHome(context));
|
||||
}
|
||||
}
|
||||
|
||||
Widget geckHome(context) {
|
||||
final myWalletProvider = Provider.of<MyWalletsProvider>(context);
|
||||
final homeProvider = Provider.of<HomeProvider>(context, listen: false);
|
||||
Provider.of<ChestProvider>(context);
|
||||
|
||||
WalletsProfilesProvider historyProvider =
|
||||
|
@ -329,42 +340,47 @@ Widget geckHome(context) {
|
|||
child: ClipOval(
|
||||
key: keyOpenWalletsHomme,
|
||||
child: Material(
|
||||
color: orangeC, // button color
|
||||
color: homeProvider.isWalletBoxInit
|
||||
? orangeC
|
||||
: Colors.grey[500], // button color
|
||||
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(
|
||||
padding: const EdgeInsets.all(18),
|
||||
child: Image(
|
||||
image: const AssetImage(
|
||||
'assets/home/wallet.png'),
|
||||
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')));
|
||||
}),
|
||||
height: 68 * ratio))),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
|
@ -117,7 +117,7 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
|
|||
);
|
||||
}
|
||||
if (pin != null || myWalletProvider.pinCode != '') {
|
||||
await sub.changePassword(context, defaultWallet.address!,
|
||||
await sub.changePassword(context, defaultWallet.address,
|
||||
walletProvider.pinCode, newPin.text);
|
||||
walletProvider.pinCode = newPin.text;
|
||||
newPin.text = '';
|
||||
|
|
|
@ -8,7 +8,6 @@ import 'package:gecko/models/chest_data.dart';
|
|||
import 'package:gecko/models/wallet_data.dart';
|
||||
import 'package:gecko/models/widgets_keys.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/substrate_sdk.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/show_seed.dart';
|
||||
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
|
||||
import 'package:gecko/widgets/bottom_app_bar.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class ChestOptions extends StatelessWidget {
|
||||
|
@ -26,8 +26,6 @@ class ChestOptions extends StatelessWidget {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final chestProvider = Provider.of<ChestProvider>(context, listen: false);
|
||||
HomeProvider homeProvider =
|
||||
Provider.of<HomeProvider>(context, listen: false);
|
||||
|
||||
ChestData currentChest = chestBox.get(configBox.get('currentChest'))!;
|
||||
|
||||
|
@ -50,7 +48,7 @@ class ChestOptions extends StatelessWidget {
|
|||
height: 22,
|
||||
child: Text(currentChest.name!),
|
||||
)),
|
||||
bottomNavigationBar: homeProvider.bottomAppBar(context),
|
||||
bottomNavigationBar: const GeckoBottomAppBar(),
|
||||
body: Stack(children: [
|
||||
Builder(
|
||||
builder: (ctx) => SafeArea(
|
||||
|
|
|
@ -10,8 +10,8 @@ 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/wallet_options.dart';
|
||||
import 'package:gecko/screens/myWallets/wallets_home.dart';
|
||||
import 'package:gecko/widgets/balance.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
// import 'package:gecko/models/home.dart';
|
||||
// import 'package:provider/provider.dart';
|
||||
|
@ -94,7 +94,10 @@ class ChooseWalletScreen extends StatelessWidget {
|
|||
]);
|
||||
}
|
||||
|
||||
List listWallets = myWalletProvider.listWallets;
|
||||
List<WalletData> listWallets = myWalletProvider.listWallets;
|
||||
listWallets.sort((p1, p2) {
|
||||
return Comparable.compare(p1.number!, p2.number!);
|
||||
});
|
||||
final screenWidth = MediaQuery.of(context).size.width;
|
||||
int nTule = 2;
|
||||
|
||||
|
@ -113,11 +116,11 @@ class ChooseWalletScreen extends StatelessWidget {
|
|||
crossAxisSpacing: 0,
|
||||
mainAxisSpacing: 0,
|
||||
children: <Widget>[
|
||||
for (WalletData repository in listWallets as Iterable<WalletData>)
|
||||
for (WalletData repository in listWallets)
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(16),
|
||||
child: GestureDetector(
|
||||
key: keySelectThisWallet(repository.address!),
|
||||
key: keySelectThisWallet(repository.address),
|
||||
onTap: () {
|
||||
selectedWallet = repository;
|
||||
myWalletProvider.reload();
|
||||
|
@ -166,8 +169,8 @@ class ChooseWalletScreen extends StatelessWidget {
|
|||
),
|
||||
),
|
||||
)),
|
||||
balanceBuilder(context, repository.address!,
|
||||
selectedWallet!.address == repository.address!),
|
||||
balanceBuilder(context, repository.address,
|
||||
selectedWallet!.address == repository.address),
|
||||
ListTile(
|
||||
shape: const RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.vertical(
|
||||
|
@ -222,8 +225,10 @@ class ChooseWalletScreen extends StatelessWidget {
|
|||
// style: TextStyle(color: isDefault ? Colors.white : Colors.black),
|
||||
// ),
|
||||
Row(mainAxisAlignment: MainAxisAlignment.center, children: [
|
||||
balance(
|
||||
context, address, 16, isDefault ? Colors.white : Colors.black),
|
||||
Balance(
|
||||
address: address,
|
||||
size: 16,
|
||||
color: isDefault ? Colors.white : Colors.black),
|
||||
])
|
||||
]),
|
||||
),
|
||||
|
|
|
@ -11,10 +11,11 @@ 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/wallet_options.dart';
|
||||
import 'package:gecko/providers/wallets_profiles.dart';
|
||||
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
|
||||
import 'package:gecko/screens/transaction_in_progress.dart';
|
||||
import 'package:gecko/widgets/certifications.dart';
|
||||
import 'package:gecko/widgets/idty_status.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class ImportG1v1 extends StatelessWidget {
|
||||
|
@ -22,8 +23,6 @@ class ImportG1v1 extends StatelessWidget {
|
|||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final walletOptions =
|
||||
Provider.of<WalletOptionsProvider>(context, listen: false);
|
||||
final myWalletProvider =
|
||||
Provider.of<MyWalletsProvider>(context, listen: false);
|
||||
|
||||
|
@ -57,7 +56,7 @@ class ImportG1v1 extends StatelessWidget {
|
|||
child: Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
||||
return FutureBuilder(
|
||||
future: sub.getBalanceAndIdtyStatus(
|
||||
sub.g1V1NewAddress, selectedWallet.address!),
|
||||
sub.g1V1NewAddress, selectedWallet.address),
|
||||
builder: (BuildContext context, AsyncSnapshot<List> status) {
|
||||
// log.d(_certs.data);
|
||||
|
||||
|
@ -210,10 +209,12 @@ class ImportG1v1 extends StatelessWidget {
|
|||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
walletOptions.idtyStatus(context, sub.g1V1NewAddress,
|
||||
isOwner: false, color: Colors.black),
|
||||
IdentityStatus(
|
||||
address: sub.g1V1NewAddress,
|
||||
isOwner: false,
|
||||
color: Colors.black),
|
||||
const SizedBox(width: 10),
|
||||
getCerts(context, sub.g1V1NewAddress, 14)
|
||||
Certifications(address: sub.g1V1NewAddress, size: 14)
|
||||
],
|
||||
),
|
||||
const SizedBox(height: 30),
|
||||
|
@ -227,7 +228,7 @@ class ImportG1v1 extends StatelessWidget {
|
|||
icon: const Icon(Icons.keyboard_arrow_down),
|
||||
items: myWalletProvider.listWallets.map((wallet) {
|
||||
return DropdownMenuItem(
|
||||
key: keySelectThisWallet(wallet.address!),
|
||||
key: keySelectThisWallet(wallet.address),
|
||||
value: wallet,
|
||||
child: Text(
|
||||
wallet.name!,
|
||||
|
@ -269,10 +270,8 @@ class ImportG1v1 extends StatelessWidget {
|
|||
);
|
||||
}
|
||||
|
||||
sub.migrateCsToV2(
|
||||
sub.csSalt.text,
|
||||
sub.csPassword.text,
|
||||
selectedWallet.address!,
|
||||
sub.migrateCsToV2(sub.csSalt.text,
|
||||
sub.csPassword.text, selectedWallet.address,
|
||||
destPassword:
|
||||
pin ?? myWalletProvider.pinCode,
|
||||
balance: balance,
|
||||
|
@ -285,7 +284,7 @@ class ImportG1v1 extends StatelessWidget {
|
|||
fromAddress:
|
||||
getShortPubkey(sub.g1V1NewAddress),
|
||||
toAddress: getShortPubkey(
|
||||
selectedWallet.address!));
|
||||
selectedWallet.address));
|
||||
}),
|
||||
);
|
||||
resetScreen(context);
|
||||
|
|
|
@ -75,7 +75,7 @@ class MigrateIdentityScreen extends StatelessWidget {
|
|||
child: Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
||||
return FutureBuilder(
|
||||
future: sub.getBalanceAndIdtyStatus(
|
||||
fromAddress, selectedWallet.address!),
|
||||
fromAddress, selectedWallet.address),
|
||||
builder: (BuildContext context, AsyncSnapshot<List> status) {
|
||||
if (status.data == null) {
|
||||
return Column(children: [
|
||||
|
@ -124,7 +124,7 @@ class MigrateIdentityScreen extends StatelessWidget {
|
|||
}
|
||||
|
||||
log.d(
|
||||
'tatatata: ${sub.g1V1NewAddress}, ${selectedWallet.address!}, $balance, $idtyStatus, $myIdtyStatus');
|
||||
'tatatata: ${sub.g1V1NewAddress}, ${selectedWallet.address}, $balance, $idtyStatus, $myIdtyStatus');
|
||||
|
||||
final walletsList = myWalletProvider.listWallets.toList();
|
||||
|
||||
|
@ -177,7 +177,7 @@ class MigrateIdentityScreen extends StatelessWidget {
|
|||
icon: const Icon(Icons.keyboard_arrow_down),
|
||||
items: walletsList.map((wallet) {
|
||||
return DropdownMenuItem(
|
||||
key: keySelectThisWallet(wallet.address!),
|
||||
key: keySelectThisWallet(wallet.address),
|
||||
value: wallet,
|
||||
child: Text(
|
||||
wallet.name!,
|
||||
|
@ -222,7 +222,7 @@ class MigrateIdentityScreen extends StatelessWidget {
|
|||
|
||||
sub.migrateIdentity(
|
||||
fromAddress: fromAddress,
|
||||
destAddress: selectedWallet.address!,
|
||||
destAddress: selectedWallet.address,
|
||||
fromPassword: pin ?? myWalletProvider.pinCode,
|
||||
destPassword: pin ?? myWalletProvider.pinCode,
|
||||
withBalance: true,
|
||||
|
@ -234,7 +234,7 @@ class MigrateIdentityScreen extends StatelessWidget {
|
|||
transType: 'identityMigration',
|
||||
fromAddress: getShortPubkey(fromAddress),
|
||||
toAddress: getShortPubkey(
|
||||
selectedWallet.address!));
|
||||
selectedWallet.address));
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ class ShowSeed extends StatelessWidget {
|
|||
const Spacer(flex: 1),
|
||||
FutureBuilder(
|
||||
future:
|
||||
sub.getSeed(defaultWallet.address!, walletProvider.pinCode),
|
||||
sub.getSeed(defaultWallet.address, walletProvider.pinCode),
|
||||
builder: (BuildContext context, AsyncSnapshot<String?> seed) {
|
||||
if (seed.connectionState != ConnectionState.done ||
|
||||
seed.hasError) {
|
||||
|
|
|
@ -125,29 +125,32 @@ class UnlockingWallet extends StatelessWidget {
|
|||
pinForm(context, pinLenght),
|
||||
SizedBox(height: 3 * ratio),
|
||||
if (canUnlock)
|
||||
InkWell(
|
||||
key: keyCachePassword,
|
||||
onTap: () {
|
||||
walletOptions.changePinCacheChoice();
|
||||
},
|
||||
child: Row(children: [
|
||||
const SizedBox(height: 30),
|
||||
const Spacer(),
|
||||
Icon(
|
||||
configBox.get('isCacheChecked')
|
||||
? Icons.check_box
|
||||
: Icons.check_box_outline_blank,
|
||||
color: orangeC,
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
Text(
|
||||
'rememberPassword'.tr(),
|
||||
style: TextStyle(
|
||||
fontSize: 16, color: Colors.grey[700]),
|
||||
),
|
||||
const Spacer()
|
||||
]),
|
||||
),
|
||||
Consumer<WalletOptionsProvider>(
|
||||
builder: (context, sub, _) {
|
||||
return InkWell(
|
||||
key: keyCachePassword,
|
||||
onTap: () {
|
||||
walletOptions.changePinCacheChoice();
|
||||
},
|
||||
child: Row(children: [
|
||||
const SizedBox(height: 30),
|
||||
const Spacer(),
|
||||
Icon(
|
||||
configBox.get('isCacheChecked')
|
||||
? Icons.check_box
|
||||
: Icons.check_box_outline_blank,
|
||||
color: orangeC,
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
Text(
|
||||
'rememberPassword'.tr(),
|
||||
style: TextStyle(
|
||||
fontSize: 16, color: Colors.grey[700]),
|
||||
),
|
||||
const Spacer()
|
||||
]),
|
||||
);
|
||||
}),
|
||||
const SizedBox(height: 10),
|
||||
// if (canUnlock)
|
||||
InkWell(
|
||||
|
@ -186,15 +189,15 @@ class UnlockingWallet extends StatelessWidget {
|
|||
|
||||
WalletData defaultWallet = myWalletProvider.getDefaultWallet();
|
||||
|
||||
if (defaultWallet.address == null) {
|
||||
canUnlock = false;
|
||||
return Text(
|
||||
'Impossible de retrouver votre\nportefeuille par défaut.\nID: ${defaultWallet.id()}',
|
||||
textAlign: TextAlign.center,
|
||||
style: const TextStyle(
|
||||
color: Colors.redAccent, fontWeight: FontWeight.w500),
|
||||
);
|
||||
}
|
||||
// if (defaultWallet.address == null) {
|
||||
// canUnlock = false;
|
||||
// return Text(
|
||||
// 'Impossible de retrouver votre\nportefeuille par défaut.\nID: ${defaultWallet.id()}',
|
||||
// textAlign: TextAlign.center,
|
||||
// style: const TextStyle(
|
||||
// color: Colors.redAccent, fontWeight: FontWeight.w500),
|
||||
// );
|
||||
// }
|
||||
|
||||
return Form(
|
||||
child: Padding(
|
||||
|
@ -213,7 +216,7 @@ class UnlockingWallet extends StatelessWidget {
|
|||
obscureText: true,
|
||||
obscuringCharacter: '*',
|
||||
animationType: AnimationType.slide,
|
||||
animationDuration: const Duration(milliseconds: 80),
|
||||
animationDuration: const Duration(milliseconds: 40),
|
||||
validator: (v) {
|
||||
if (v!.length < pinLenght) {
|
||||
return "yourPasswordLengthIsX".tr(args: [pinLenght.toString()]);
|
||||
|
@ -248,9 +251,9 @@ class UnlockingWallet extends StatelessWidget {
|
|||
myWalletProvider.isPinLoading = true;
|
||||
myWalletProvider.pinCode = pin.toUpperCase();
|
||||
final isValid = await sub.checkPassword(
|
||||
defaultWallet.address!, pin.toUpperCase());
|
||||
defaultWallet.address, pin.toUpperCase());
|
||||
if (!isValid) {
|
||||
await Future.delayed(const Duration(milliseconds: 50));
|
||||
await Future.delayed(const Duration(milliseconds: 20));
|
||||
pinColor = Colors.red[600];
|
||||
myWalletProvider.isPinLoading = false;
|
||||
myWalletProvider.isPinValid = false;
|
||||
|
|
|
@ -6,7 +6,6 @@ import 'package:flutter/services.dart';
|
|||
import 'package:gecko/globals.dart';
|
||||
import 'package:gecko/models/widgets_keys.dart';
|
||||
import 'package:gecko/providers/duniter_indexer.dart';
|
||||
import 'package:gecko/providers/home.dart';
|
||||
import 'package:gecko/providers/my_wallets.dart';
|
||||
import 'package:gecko/models/wallet_data.dart';
|
||||
import 'package:gecko/providers/substrate_sdk.dart';
|
||||
|
@ -17,6 +16,11 @@ import 'package:gecko/screens/common_elements.dart';
|
|||
import 'package:gecko/screens/activity.dart';
|
||||
import 'package:gecko/screens/myWallets/manage_membership.dart';
|
||||
import 'package:gecko/screens/qrcode_fullscreen.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/idty_status.dart';
|
||||
import 'package:gecko/widgets/name_by_address.dart';
|
||||
import 'package:gecko/widgets/page_route_no_transition.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
|
@ -35,9 +39,8 @@ class WalletOptions extends StatelessWidget {
|
|||
Provider.of<WalletsProfilesProvider>(context, listen: false);
|
||||
final myWalletProvider =
|
||||
Provider.of<MyWalletsProvider>(context, listen: false);
|
||||
HomeProvider homeProvider =
|
||||
Provider.of<HomeProvider>(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);
|
||||
// sub.spawnBlock();
|
||||
|
@ -46,6 +49,8 @@ class WalletOptions extends StatelessWidget {
|
|||
log.d(walletOptions.address.text);
|
||||
|
||||
final currentChest = myWalletProvider.getCurrentChest();
|
||||
bool isWalletNameIndexed =
|
||||
duniterIndexer.walletNameIndexer[walletOptions.address.text] != null;
|
||||
|
||||
// final currentWallet = _myWalletProvider.getDefaultWallet();
|
||||
// log.d(_walletOptions.getAddress(_currentChest, 3));
|
||||
|
@ -77,7 +82,10 @@ class WalletOptions extends StatelessWidget {
|
|||
height: 22,
|
||||
child: Consumer<WalletOptionsProvider>(
|
||||
builder: (context, walletProvider, _) {
|
||||
return Text(wallet.name!);
|
||||
return Text(isWalletNameIndexed
|
||||
? duniterIndexer
|
||||
.walletNameIndexer[walletOptions.address.text]!
|
||||
: wallet.name!);
|
||||
}),
|
||||
),
|
||||
actions: [
|
||||
|
@ -100,7 +108,7 @@ class WalletOptions extends StatelessWidget {
|
|||
),
|
||||
],
|
||||
),
|
||||
bottomNavigationBar: homeProvider.bottomAppBar(context),
|
||||
bottomNavigationBar: const GeckoBottomAppBar(),
|
||||
body: Stack(children: [
|
||||
Builder(
|
||||
builder: (ctx) => SafeArea(
|
||||
|
@ -121,66 +129,95 @@ class WalletOptions extends StatelessWidget {
|
|||
backgroundColor,
|
||||
],
|
||||
)),
|
||||
child: Row(
|
||||
// mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: <Widget>[
|
||||
const Spacer(flex: 1),
|
||||
avatar(walletProvider),
|
||||
const Spacer(flex: 1),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
duniterIndexer.getNameByAddress(
|
||||
context,
|
||||
walletProvider.address.text,
|
||||
wallet,
|
||||
27,
|
||||
false,
|
||||
Colors.black,
|
||||
FontWeight.w400,
|
||||
FontStyle.normal),
|
||||
// SizedBox(height: isTall ? 5 : 0),
|
||||
|
||||
SizedBox(height: isTall ? 5 : 0),
|
||||
balance(
|
||||
context, walletProvider.address.text, 21),
|
||||
const SizedBox(width: 30),
|
||||
|
||||
InkWell(
|
||||
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: [
|
||||
walletOptions.idtyStatus(
|
||||
context, walletOptions.address.text,
|
||||
isOwner: true, color: orangeC),
|
||||
getCerts(context,
|
||||
walletProvider.address.text, 15),
|
||||
]),
|
||||
child: Row(children: <Widget>[
|
||||
const Spacer(flex: 1),
|
||||
avatar(walletProvider),
|
||||
const Spacer(flex: 1),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Stack(children: [
|
||||
SizedBox(
|
||||
width: 250,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Consumer<WalletOptionsProvider>(
|
||||
builder: (context, walletProvider, _) {
|
||||
return NameByAddress(
|
||||
wallet: wallet,
|
||||
size: 27,
|
||||
color: Colors.black,
|
||||
fontWeight: wallet.isMember
|
||||
? FontWeight.w500
|
||||
: FontWeight.w400,
|
||||
fontStyle: FontStyle.normal);
|
||||
})
|
||||
],
|
||||
),
|
||||
|
||||
SizedBox(height: 10 * ratio),
|
||||
]),
|
||||
const Spacer(flex: 2),
|
||||
]),
|
||||
),
|
||||
const SizedBox(width: 10),
|
||||
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(
|
||||
|
@ -224,8 +261,8 @@ class WalletOptions extends StatelessWidget {
|
|||
SizedBox(height: 17 * ratio),
|
||||
// walletProvider.isMember(context, _walletOptions.address.text)
|
||||
FutureBuilder(
|
||||
future: walletProvider.isMember(
|
||||
context, walletOptions.address.text),
|
||||
future:
|
||||
sub.isMember(walletOptions.address.text),
|
||||
builder: (BuildContext context,
|
||||
AsyncSnapshot<bool> isMember) {
|
||||
if (isMember.connectionState !=
|
||||
|
@ -427,7 +464,7 @@ class WalletOptions extends StatelessWidget {
|
|||
// _historyProvider.nPage = 1;
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) {
|
||||
PageNoTransit(builder: (context) {
|
||||
return ActivityScreen(
|
||||
address: walletProvider.address.text,
|
||||
avatar: wallet.imageCustomPath == null
|
||||
|
@ -548,26 +585,26 @@ class WalletOptions extends StatelessWidget {
|
|||
walletOptions.reload();
|
||||
}
|
||||
|
||||
Widget deleteWallet(BuildContext context,
|
||||
WalletOptionsProvider walletProvider, int currentChest) {
|
||||
Widget deleteWallet(BuildContext context, WalletOptionsProvider walletOptions,
|
||||
int currentChest) {
|
||||
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
||||
final myWalletProvider =
|
||||
Provider.of<MyWalletsProvider>(context, listen: false);
|
||||
|
||||
final defaultWallet = myWalletProvider.getDefaultWallet();
|
||||
final bool isDefaultWallet =
|
||||
walletProvider.address.text == defaultWallet.address;
|
||||
walletOptions.address.text == defaultWallet.address;
|
||||
// return Consumer<MyWalletsProvider>(
|
||||
// builder: (context, _myWalletProvider, _) {
|
||||
return FutureBuilder(
|
||||
future: sub.hasAccountConsumers(wallet.address!),
|
||||
future: sub.hasAccountConsumers(wallet.address),
|
||||
builder: (BuildContext context, AsyncSnapshot<bool> hasConsumers) {
|
||||
if (hasConsumers.connectionState != ConnectionState.done ||
|
||||
hasConsumers.hasError) {
|
||||
return const Text('');
|
||||
}
|
||||
final double balance =
|
||||
balanceCache[walletProvider.address.text] ?? -1;
|
||||
walletOptions.balanceCache[walletOptions.address.text] ?? -1;
|
||||
final bool canDelete = !isDefaultWallet &&
|
||||
!hasConsumers.data! &&
|
||||
(balance > 2 || balance == 0);
|
||||
|
@ -575,7 +612,7 @@ class WalletOptions extends StatelessWidget {
|
|||
key: keyDeleteWallet,
|
||||
onTap: canDelete
|
||||
? () async {
|
||||
await walletProvider.deleteWallet(context, wallet);
|
||||
await walletOptions.deleteWallet(context, wallet);
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
myWalletProvider.listWallets =
|
||||
myWalletProvider.readAllWallets(currentChest);
|
||||
|
|
|
@ -1,15 +1,12 @@
|
|||
// ignore_for_file: use_build_context_synchronously
|
||||
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
|
||||
import 'package:flutter_markdown/flutter_markdown.dart';
|
||||
import 'package:gecko/globals.dart';
|
||||
import 'package:gecko/models/chest_data.dart';
|
||||
import 'package:gecko/models/widgets_keys.dart';
|
||||
import 'package:gecko/providers/duniter_indexer.dart';
|
||||
import 'package:gecko/providers/home.dart';
|
||||
import 'package:gecko/providers/my_wallets.dart';
|
||||
import 'package:gecko/models/wallet_data.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
@ -22,8 +19,11 @@ import 'package:gecko/screens/myWallets/import_g1_v1.dart';
|
|||
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
|
||||
import 'package:gecko/screens/myWallets/wallet_options.dart';
|
||||
import 'package:gecko/screens/wallet_view.dart';
|
||||
import 'package:gecko/widgets/balance.dart';
|
||||
import 'package:gecko/widgets/bottom_app_bar.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:truncate/truncate.dart';
|
||||
|
||||
class WalletsHome extends StatelessWidget {
|
||||
const WalletsHome({Key? key}) : super(key: key);
|
||||
|
@ -31,8 +31,6 @@ class WalletsHome extends StatelessWidget {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final myWalletProvider = Provider.of<MyWalletsProvider>(context);
|
||||
HomeProvider homeProvider =
|
||||
Provider.of<HomeProvider>(context, listen: false);
|
||||
|
||||
final currentChestNumber = myWalletProvider.getCurrentChest();
|
||||
final ChestData currentChest = chestBox.get(currentChestNumber)!;
|
||||
|
@ -60,12 +58,23 @@ class WalletsHome extends StatelessWidget {
|
|||
ModalRoute.withName('/'),
|
||||
);
|
||||
}),
|
||||
title: Text(currentChest.name!,
|
||||
style: TextStyle(color: Colors.grey[850])),
|
||||
title: Row(
|
||||
children: [
|
||||
Image.asset(
|
||||
'assets/chests/${currentChest.imageName}',
|
||||
height: 40,
|
||||
),
|
||||
const SizedBox(width: 17),
|
||||
Text(currentChest.name!,
|
||||
style: TextStyle(color: Colors.grey[850])),
|
||||
],
|
||||
),
|
||||
backgroundColor: const Color(0xffFFD58D),
|
||||
),
|
||||
bottomNavigationBar: myWalletProvider.lastFlyBy == ''
|
||||
? homeProvider.bottomAppBar(context)
|
||||
? const GeckoBottomAppBar(
|
||||
actualRoute: 'safeHome',
|
||||
)
|
||||
: dragInfo(context),
|
||||
body: SafeArea(
|
||||
child: Stack(children: [
|
||||
|
@ -203,6 +212,7 @@ class WalletsHome extends StatelessWidget {
|
|||
Provider.of<WalletOptionsProvider>(context, listen: false);
|
||||
final bool isWalletsExists = myWalletProvider.checkIfWalletExist();
|
||||
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
||||
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
||||
|
||||
if (!isWalletsExists) {
|
||||
return const Text('');
|
||||
|
@ -219,7 +229,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();
|
||||
final screenWidth = MediaQuery.of(context).size.width;
|
||||
int nTule = 2;
|
||||
|
@ -243,17 +258,17 @@ class WalletsHome extends StatelessWidget {
|
|||
crossAxisSpacing: 0,
|
||||
mainAxisSpacing: 0,
|
||||
children: <Widget>[
|
||||
for (WalletData repository in listWallets as Iterable<WalletData>)
|
||||
for (WalletData repository in listWallets)
|
||||
LongPressDraggable<String>(
|
||||
delay: const Duration(milliseconds: 200),
|
||||
data: repository.address!,
|
||||
data: repository.address,
|
||||
dragAnchorStrategy:
|
||||
(Draggable<Object> _, BuildContext __, Offset ___) =>
|
||||
const Offset(0, 0),
|
||||
// feedbackOffset: const Offset(-500, -500),
|
||||
// dragAnchorStrategy: childDragAnchorStrategy,
|
||||
onDragStarted: () =>
|
||||
myWalletProvider.dragAddress = repository.address!,
|
||||
myWalletProvider.dragAddress = repository.address,
|
||||
onDragEnd: (_) {
|
||||
myWalletProvider.lastFlyBy = '';
|
||||
myWalletProvider.dragAddress = '';
|
||||
|
@ -274,21 +289,21 @@ class WalletsHome extends StatelessWidget {
|
|||
child: DragTarget<String>(
|
||||
onAccept: (senderAddress) async {
|
||||
log.d(
|
||||
'INTERPAY: sender: $senderAddress --- receiver: ${repository.address!}');
|
||||
'INTERPAY: sender: $senderAddress --- receiver: ${repository.address}');
|
||||
final walletData = myWalletProvider
|
||||
.getWalletDataByAddress(senderAddress);
|
||||
await sub.setCurrentWallet(walletData!);
|
||||
sub.reload();
|
||||
paymentPopup(context, repository.address!);
|
||||
paymentPopup(context, repository.address);
|
||||
},
|
||||
onMove: (details) {
|
||||
if (repository.address! != myWalletProvider.lastFlyBy) {
|
||||
myWalletProvider.lastFlyBy = repository.address!;
|
||||
if (repository.address != myWalletProvider.lastFlyBy) {
|
||||
myWalletProvider.lastFlyBy = repository.address;
|
||||
myWalletProvider.reload();
|
||||
}
|
||||
},
|
||||
onWillAccept: (senderAddress) =>
|
||||
senderAddress != repository.address!,
|
||||
senderAddress != repository.address,
|
||||
builder: (
|
||||
BuildContext context,
|
||||
List<dynamic> accepted,
|
||||
|
@ -297,7 +312,7 @@ class WalletsHome extends StatelessWidget {
|
|||
return Padding(
|
||||
padding: const EdgeInsets.all(16),
|
||||
child: GestureDetector(
|
||||
key: keyOpenWallet(repository.address!),
|
||||
key: keyOpenWallet(repository.address),
|
||||
onTap: () {
|
||||
walletOptions.getAddress(
|
||||
currentChestNumber, repository.derivation!);
|
||||
|
@ -325,14 +340,15 @@ class WalletsHome extends StatelessWidget {
|
|||
child: Container(
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
gradient: RadialGradient(
|
||||
radius: 0.6,
|
||||
colors: [
|
||||
Colors.green[400]!,
|
||||
const Color(0xFFE7E7A6),
|
||||
],
|
||||
)),
|
||||
decoration: const BoxDecoration(
|
||||
gradient: RadialGradient(
|
||||
radius: 0.8,
|
||||
colors: [
|
||||
Color.fromARGB(255, 255, 255, 211),
|
||||
yellowC,
|
||||
],
|
||||
),
|
||||
),
|
||||
child:
|
||||
// SvgPicture.asset('assets/chopp-gecko2.png',
|
||||
// semanticsLabel: 'Gecko', height: 48),
|
||||
|
@ -360,11 +376,45 @@ class WalletsHome extends StatelessWidget {
|
|||
Stack(children: <Widget>[
|
||||
balanceBuilder(
|
||||
context,
|
||||
repository.address!,
|
||||
repository.address,
|
||||
repository.address ==
|
||||
defaultWallet.address),
|
||||
nameBuilder(context, repository,
|
||||
defaultWallet, currentChestNumber),
|
||||
Row(
|
||||
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,
|
||||
// ),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
]),
|
||||
]),
|
||||
),
|
||||
|
@ -388,60 +438,24 @@ class WalletsHome extends StatelessWidget {
|
|||
width: double.infinity,
|
||||
color: isDefault ? orangeC : yellowC,
|
||||
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(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
balance(
|
||||
context,
|
||||
address,
|
||||
15,
|
||||
isDefault ? Colors.white : Colors.black,
|
||||
isDefault ? yellowC : orangeC)
|
||||
Opacity(
|
||||
opacity: 0.7,
|
||||
child: Balance(
|
||||
address: address,
|
||||
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);
|
||||
final duniterIndexer = Provider.of<DuniterIndexer>(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: duniterIndexer.getNameByAddress(
|
||||
context,
|
||||
repository.address!,
|
||||
repository,
|
||||
20,
|
||||
true,
|
||||
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) {
|
||||
final myWalletProvider = Provider.of<MyWalletsProvider>(context);
|
||||
|
||||
|
|
|
@ -2,16 +2,18 @@ import 'package:easy_localization/easy_localization.dart';
|
|||
|
||||
import 'package:gecko/globals.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:gecko/models/wallet_data.dart';
|
||||
import 'package:gecko/models/widgets_keys.dart';
|
||||
import 'package:gecko/providers/cesium_plus.dart';
|
||||
import 'package:gecko/models/g1_wallets_list.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/wallet_options.dart';
|
||||
import 'package:gecko/providers/wallets_profiles.dart';
|
||||
import 'package:gecko/screens/common_elements.dart';
|
||||
import 'package:gecko/screens/wallet_view.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:provider/provider.dart';
|
||||
|
||||
class ContactsScreen extends StatelessWidget {
|
||||
|
@ -21,8 +23,6 @@ class ContactsScreen extends StatelessWidget {
|
|||
Widget build(BuildContext context) {
|
||||
WalletsProfilesProvider walletsProfilesClass =
|
||||
Provider.of<WalletsProfilesProvider>(context, listen: true);
|
||||
HomeProvider homeProvider =
|
||||
Provider.of<HomeProvider>(context, listen: false);
|
||||
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
||||
|
||||
double avatarSize = 55;
|
||||
|
@ -49,7 +49,7 @@ class ContactsScreen extends StatelessWidget {
|
|||
'contactsManagementWithNbr'.tr(args: ['${myContacts.length}'])),
|
||||
),
|
||||
),
|
||||
bottomNavigationBar: homeProvider.bottomAppBar(context),
|
||||
bottomNavigationBar: const GeckoBottomAppBar(),
|
||||
body: SafeArea(
|
||||
child: Stack(children: [
|
||||
Padding(
|
||||
|
@ -92,15 +92,18 @@ class ContactsScreen extends StatelessWidget {
|
|||
mainAxisAlignment:
|
||||
MainAxisAlignment.center,
|
||||
children: [
|
||||
balance(context,
|
||||
g1Wallet.address, 16),
|
||||
Balance(
|
||||
address:
|
||||
g1Wallet.address,
|
||||
size: 16),
|
||||
]),
|
||||
]),
|
||||
),
|
||||
]),
|
||||
subtitle: Row(children: <Widget>[
|
||||
duniterIndexer.getNameByAddress(
|
||||
context, g1Wallet.address)
|
||||
NameByAddress(
|
||||
wallet:
|
||||
WalletData(address: g1Wallet.address))
|
||||
]),
|
||||
dense: false,
|
||||
isThreeLine: false,
|
||||
|
|
|
@ -34,6 +34,7 @@ class OnboardingStepTen extends StatelessWidget {
|
|||
final generateWalletProvider =
|
||||
Provider.of<GenerateWalletsProvider>(context);
|
||||
final walletOptions = Provider.of<WalletOptionsProvider>(context);
|
||||
final sub = Provider.of<SubstrateSdk>(context);
|
||||
final myWalletProvider =
|
||||
Provider.of<MyWalletsProvider>(context, listen: false);
|
||||
CommonElements common = CommonElements();
|
||||
|
@ -126,7 +127,8 @@ class OnboardingStepTen extends StatelessWidget {
|
|||
),
|
||||
]);
|
||||
}),
|
||||
Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
||||
Consumer<WalletOptionsProvider>(
|
||||
builder: (context, walletOptions, _) {
|
||||
return sub.nodeConnected
|
||||
? InkWell(
|
||||
key: keyCachePassword,
|
||||
|
@ -188,7 +190,7 @@ class OnboardingStepTen extends StatelessWidget {
|
|||
obscureText: true,
|
||||
obscuringCharacter: '*',
|
||||
animationType: AnimationType.slide,
|
||||
animationDuration: const Duration(milliseconds: 80),
|
||||
animationDuration: const Duration(milliseconds: 40),
|
||||
validator: (v) {
|
||||
if (v!.length < pinLenght) {
|
||||
return "yourPasswordLengthIsX".tr(args: [pinLenght.toString()]);
|
||||
|
@ -240,14 +242,14 @@ class OnboardingStepTen extends StatelessWidget {
|
|||
derivePath: '//2',
|
||||
password: generateWalletProvider.pin.text);
|
||||
WalletData myWallet = WalletData(
|
||||
version: dataVersion,
|
||||
chest: configBox.get('currentChest'),
|
||||
address: address,
|
||||
number: 0,
|
||||
name: 'currentWallet'.tr(),
|
||||
derivation: 2,
|
||||
imageDefaultPath: '0.png');
|
||||
await walletBox.add(myWallet);
|
||||
imageDefaultPath: '0.png',
|
||||
isOwned: true);
|
||||
await walletBox.put(myWallet.address, myWallet);
|
||||
}
|
||||
myWalletProvider.readAllWallets(currentChest);
|
||||
myWalletProvider.reload();
|
||||
|
|
|
@ -1,24 +1,49 @@
|
|||
import 'package:easy_localization/easy_localization.dart';
|
||||
// ignore_for_file: use_build_context_synchronously
|
||||
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:gecko/globals.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:gecko/models/widgets_keys.dart';
|
||||
// import 'package:gecko/providers/home.dart';
|
||||
import 'package:gecko/providers/search.dart';
|
||||
import 'package:gecko/screens/common_elements.dart';
|
||||
import 'package:gecko/screens/search_result.dart';
|
||||
import 'package:gecko/screens/wallet_view.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
// import 'package:gecko/models/home.dart';
|
||||
// import 'package:provider/provider.dart';
|
||||
|
||||
class SearchScreen extends StatelessWidget {
|
||||
class SearchScreen extends StatefulWidget {
|
||||
const SearchScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<SearchScreen> createState() => _SearchScreenState();
|
||||
}
|
||||
|
||||
class _SearchScreenState extends State<SearchScreen> {
|
||||
bool canPasteAddress = false;
|
||||
String pastedAddress = '';
|
||||
|
||||
Future getClipBoard() async {
|
||||
final clipboard = await Clipboard.getData('text/plain');
|
||||
pastedAddress = clipboard?.text ?? '';
|
||||
canPasteAddress = isAddress(pastedAddress);
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
||||
await getClipBoard();
|
||||
});
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final searchProvider = Provider.of<SearchProvider>(context);
|
||||
final screenHeight = MediaQuery.of(context).size.height;
|
||||
|
||||
final canValidate = searchProvider.searchController.text.length >= 2;
|
||||
// final canPasteAddress = false;
|
||||
|
||||
return WillPopScope(
|
||||
onWillPop: () {
|
||||
searchProvider.searchController.text = '';
|
||||
|
@ -26,7 +51,6 @@ class SearchScreen extends StatelessWidget {
|
|||
},
|
||||
child: Scaffold(
|
||||
backgroundColor: backgroundColor,
|
||||
|
||||
appBar: AppBar(
|
||||
elevation: 1,
|
||||
toolbarHeight: 60 * ratio,
|
||||
|
@ -41,7 +65,6 @@ class SearchScreen extends StatelessWidget {
|
|||
Navigator.of(context).pop();
|
||||
}),
|
||||
),
|
||||
// bottomNavigationBar: _homeProvider.bottomAppBar(context),
|
||||
body: SafeArea(
|
||||
child: Stack(children: [
|
||||
Column(children: <Widget>[
|
||||
|
@ -65,7 +88,11 @@ class SearchScreen extends StatelessWidget {
|
|||
autofocus: true,
|
||||
maxLines: 1,
|
||||
textAlign: TextAlign.left,
|
||||
onChanged: (v) => searchProvider.reload(),
|
||||
onChanged: (v) async => {
|
||||
await getClipBoard(),
|
||||
setState(() {}),
|
||||
searchProvider.reload()
|
||||
},
|
||||
decoration: InputDecoration(
|
||||
filled: true,
|
||||
fillColor: Colors.white,
|
||||
|
@ -106,7 +133,7 @@ class SearchScreen extends StatelessWidget {
|
|||
foregroundColor: Colors.white, elevation: 4,
|
||||
backgroundColor: orangeC, // foreground
|
||||
),
|
||||
onPressed: searchProvider.searchController.text.length >= 2
|
||||
onPressed: canValidate
|
||||
? () {
|
||||
Navigator.push(
|
||||
context,
|
||||
|
@ -115,9 +142,23 @@ class SearchScreen extends StatelessWidget {
|
|||
}),
|
||||
);
|
||||
}
|
||||
: null,
|
||||
: canPasteAddress
|
||||
? () async {
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) {
|
||||
return WalletViewScreen(
|
||||
address: pastedAddress, username: '');
|
||||
}),
|
||||
);
|
||||
}
|
||||
: null,
|
||||
child: Text(
|
||||
'search'.tr(),
|
||||
canValidate
|
||||
? 'search'.tr()
|
||||
: canPasteAddress
|
||||
? 'pasteAddress'.tr()
|
||||
: 'search'.tr(),
|
||||
textAlign: TextAlign.center,
|
||||
style: const TextStyle(
|
||||
fontSize: 21, fontWeight: FontWeight.w600),
|
||||
|
|
|
@ -2,17 +2,19 @@ import 'package:easy_localization/easy_localization.dart';
|
|||
|
||||
import 'package:gecko/globals.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:gecko/models/wallet_data.dart';
|
||||
import 'package:gecko/models/widgets_keys.dart';
|
||||
import 'package:gecko/providers/cesium_plus.dart';
|
||||
import 'package:gecko/models/g1_wallets_list.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/wallet_options.dart';
|
||||
import 'package:gecko/providers/wallets_profiles.dart';
|
||||
import 'package:gecko/providers/search.dart';
|
||||
import 'package:gecko/screens/common_elements.dart';
|
||||
import 'package:gecko/screens/wallet_view.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:provider/provider.dart';
|
||||
|
||||
class SearchResultScreen extends StatelessWidget {
|
||||
|
@ -23,8 +25,6 @@ class SearchResultScreen extends StatelessWidget {
|
|||
final searchProvider = Provider.of<SearchProvider>(context, listen: false);
|
||||
WalletsProfilesProvider walletsProfilesClass =
|
||||
Provider.of<WalletsProfilesProvider>(context, listen: false);
|
||||
HomeProvider homeProvider =
|
||||
Provider.of<HomeProvider>(context, listen: false);
|
||||
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
||||
|
||||
double avatarSize = 55;
|
||||
|
@ -39,7 +39,7 @@ class SearchResultScreen extends StatelessWidget {
|
|||
child: Text('researchResults'.tr()),
|
||||
),
|
||||
),
|
||||
bottomNavigationBar: homeProvider.bottomAppBar(context),
|
||||
bottomNavigationBar: const GeckoBottomAppBar(),
|
||||
body: SafeArea(
|
||||
child: Stack(children: [
|
||||
Padding(
|
||||
|
@ -115,17 +115,19 @@ class SearchResultScreen extends StatelessWidget {
|
|||
MainAxisAlignment
|
||||
.center,
|
||||
children: [
|
||||
balance(
|
||||
context,
|
||||
g1Wallet.address,
|
||||
16),
|
||||
Balance(
|
||||
address: g1Wallet
|
||||
.address,
|
||||
size: 16),
|
||||
]),
|
||||
]),
|
||||
),
|
||||
]),
|
||||
subtitle: Row(children: <Widget>[
|
||||
duniterIndexer.getNameByAddress(
|
||||
context, g1Wallet.address)
|
||||
NameByAddress(
|
||||
wallet: WalletData(
|
||||
address: g1Wallet.address),
|
||||
),
|
||||
]),
|
||||
dense: false,
|
||||
isThreeLine: false,
|
||||
|
|
|
@ -9,11 +9,10 @@ import 'package:gecko/models/g1_wallets_list.dart';
|
|||
import 'package:gecko/models/widgets_keys.dart';
|
||||
import 'package:gecko/providers/cesium_plus.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/wallet_options.dart';
|
||||
import 'package:gecko/providers/my_wallets.dart';
|
||||
import 'package:gecko/models/wallet_data.dart';
|
||||
import 'package:gecko/providers/wallet_options.dart';
|
||||
import 'package:gecko/providers/wallets_profiles.dart';
|
||||
import 'package:gecko/screens/activity.dart';
|
||||
import 'package:gecko/screens/common_elements.dart';
|
||||
|
@ -21,6 +20,8 @@ import 'package:gecko/screens/myWallets/choose_wallet.dart';
|
|||
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
|
||||
import 'package:gecko/screens/qrcode_fullscreen.dart';
|
||||
import 'package:gecko/screens/transaction_in_progress.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/page_route_no_transition.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
@ -40,15 +41,13 @@ class WalletViewScreen extends StatelessWidget {
|
|||
Widget build(BuildContext context) {
|
||||
WalletsProfilesProvider walletProfile =
|
||||
Provider.of<WalletsProfilesProvider>(context, listen: false);
|
||||
walletProfile.address = address;
|
||||
final sub = Provider.of<SubstrateSdk>(context, listen: false);
|
||||
HomeProvider homeProvider =
|
||||
Provider.of<HomeProvider>(context, listen: false);
|
||||
final myWalletProvider =
|
||||
Provider.of<MyWalletsProvider>(context, listen: false);
|
||||
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
||||
WalletData? defaultWallet = myWalletProvider.getDefaultWallet();
|
||||
|
||||
walletProfile.address = address;
|
||||
sub.setCurrentWallet(defaultWallet);
|
||||
|
||||
log.d('aaaaaaaaaaaaaaaaaaa: $username');
|
||||
|
@ -114,7 +113,7 @@ class WalletViewScreen extends StatelessWidget {
|
|||
'?'
|
||||
]))),
|
||||
),
|
||||
bottomNavigationBar: homeProvider.bottomAppBar(context),
|
||||
bottomNavigationBar: const GeckoBottomAppBar(),
|
||||
body: SafeArea(
|
||||
child: Column(children: <Widget>[
|
||||
HeaderProfile(address: address, username: username),
|
||||
|
@ -158,10 +157,8 @@ class WalletViewScreen extends StatelessWidget {
|
|||
]),
|
||||
Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
||||
WalletData? defaultWallet = myWalletProvider.getDefaultWallet();
|
||||
final duniterIndexer =
|
||||
Provider.of<DuniterIndexer>(context, listen: false);
|
||||
return FutureBuilder(
|
||||
future: sub.certState(defaultWallet.address!, address),
|
||||
future: sub.certState(defaultWallet.address, address),
|
||||
builder: (context, AsyncSnapshot<Map<String, int>> snapshot) {
|
||||
if (snapshot.data == null) return const SizedBox();
|
||||
String duration = '';
|
||||
|
@ -469,16 +466,19 @@ void paymentPopup(BuildContext context, String toAddress) {
|
|||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
final sub = Provider.of<SubstrateSdk>(homeContext, listen: false);
|
||||
final walletOptions =
|
||||
Provider.of<WalletOptionsProvider>(context, listen: false);
|
||||
|
||||
double fees = 0;
|
||||
return StatefulBuilder(
|
||||
builder: (BuildContext context, StateSetter setState) {
|
||||
if (walletViewProvider.payAmount.text != '' &&
|
||||
(double.parse(walletViewProvider.payAmount.text) +
|
||||
2 / balanceRatio) <=
|
||||
(balanceCache[defaultWallet.address] ?? 0) &&
|
||||
(walletOptions.balanceCache[defaultWallet.address] ?? 0) &&
|
||||
toAddress != defaultWallet.address) {
|
||||
if ((balanceCache[toAddress] == 0 ||
|
||||
balanceCache[toAddress] == null) &&
|
||||
if ((walletOptions.balanceCache[toAddress] == 0 ||
|
||||
walletOptions.balanceCache[toAddress] == null) &&
|
||||
double.parse(walletViewProvider.payAmount.text) <
|
||||
5 / balanceRatio) {
|
||||
canValidate = false;
|
||||
|
@ -573,7 +573,7 @@ void paymentPopup(BuildContext context, String toAddress) {
|
|||
child: Row(children: [
|
||||
Text(defaultWallet.name!),
|
||||
const Spacer(),
|
||||
balance(context, defaultWallet.address!, 20)
|
||||
Balance(address: defaultWallet.address, size: 20),
|
||||
]),
|
||||
),
|
||||
);
|
||||
|
@ -640,7 +640,7 @@ void paymentPopup(BuildContext context, String toAddress) {
|
|||
keyboardType: TextInputType.number,
|
||||
onChanged: (_) async {
|
||||
fees = await sub.txFees(
|
||||
defaultWallet.address!,
|
||||
defaultWallet.address,
|
||||
toAddress,
|
||||
double.parse(
|
||||
walletViewProvider.payAmount.text == ''
|
||||
|
|
|
@ -0,0 +1,75 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:gecko/globals.dart';
|
||||
import 'package:gecko/providers/substrate_sdk.dart';
|
||||
import 'package:gecko/providers/wallet_options.dart';
|
||||
import 'package:gecko/widgets/ud_unit_display.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class Balance extends StatelessWidget {
|
||||
const Balance(
|
||||
{Key? key,
|
||||
required this.address,
|
||||
required this.size,
|
||||
this.color = Colors.black,
|
||||
this.loadingColor = const Color(0xffd07316)})
|
||||
: super(key: key);
|
||||
final String address;
|
||||
final double size;
|
||||
final Color color;
|
||||
final Color loadingColor;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final walletOptions =
|
||||
Provider.of<WalletOptionsProvider>(context, listen: false);
|
||||
return Column(children: <Widget>[
|
||||
Consumer<SubstrateSdk>(builder: (context, sdk, _) {
|
||||
return FutureBuilder(
|
||||
future: sdk.getBalance(address),
|
||||
builder: (BuildContext context,
|
||||
AsyncSnapshot<Map<String, double>> globalBalance) {
|
||||
if (globalBalance.connectionState != ConnectionState.done ||
|
||||
globalBalance.hasError) {
|
||||
if (walletOptions.balanceCache[address] != null &&
|
||||
walletOptions.balanceCache[address] != -1) {
|
||||
return Row(children: [
|
||||
Text(walletOptions.balanceCache[address]!.toString(),
|
||||
style: TextStyle(
|
||||
fontSize: isTall ? size : size * 0.9,
|
||||
color: color)),
|
||||
const SizedBox(width: 5),
|
||||
UdUnitDisplay(size: size, color: color),
|
||||
]);
|
||||
} else {
|
||||
return SizedBox(
|
||||
height: 15,
|
||||
width: 15,
|
||||
child: CircularProgressIndicator(
|
||||
color: loadingColor,
|
||||
strokeWidth: 2,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
walletOptions.balanceCache[address] =
|
||||
globalBalance.data!['transferableBalance']!;
|
||||
if (walletOptions.balanceCache[address] != -1) {
|
||||
return Row(children: [
|
||||
Text(
|
||||
walletOptions.balanceCache[address]!.toString(),
|
||||
style: TextStyle(
|
||||
fontSize: isTall ? size : size * 0.9,
|
||||
color: color,
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 5),
|
||||
UdUnitDisplay(size: size, color: color),
|
||||
]);
|
||||
} else {
|
||||
return const Text('');
|
||||
}
|
||||
});
|
||||
}),
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,140 @@
|
|||
// 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/search.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, this.actualRoute = ''}) : super(key: key);
|
||||
final String actualRoute;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final myWalletProvider =
|
||||
Provider.of<MyWalletsProvider>(context, listen: false);
|
||||
final historyProvider =
|
||||
Provider.of<WalletsProfilesProvider>(context, listen: false);
|
||||
final searchProvider = Provider.of<SearchProvider>(context, listen: false);
|
||||
|
||||
final size = MediaQuery.of(context).size;
|
||||
const bool showBottomBar = true;
|
||||
final lockAction = actualRoute == 'safeHome';
|
||||
|
||||
return Visibility(
|
||||
visible: showBottomBar,
|
||||
child: Container(
|
||||
color: yellowC,
|
||||
width: size.width,
|
||||
height: 80,
|
||||
child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [
|
||||
const Spacer(),
|
||||
const SizedBox(width: 11),
|
||||
IconButton(
|
||||
key: keyAppBarSearch,
|
||||
iconSize: 40,
|
||||
icon: const Image(image: AssetImage('assets/loupe-noire.png')),
|
||||
onPressed: () {
|
||||
searchProvider.reload();
|
||||
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),
|
||||
Stack(
|
||||
children: [
|
||||
if (lockAction)
|
||||
Center(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(left: 0),
|
||||
child: Container(
|
||||
width: 75,
|
||||
height: 75,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
border:
|
||||
Border.all(color: orangeC.withOpacity(0), width: 3),
|
||||
gradient: RadialGradient(
|
||||
radius: 0.5,
|
||||
colors: [
|
||||
yellowC,
|
||||
orangeC.withOpacity(0.1),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
IconButton(
|
||||
key: keyAppBarChest,
|
||||
iconSize: 60,
|
||||
icon: const Image(image: AssetImage('assets/wallet.png')),
|
||||
onPressed: lockAction
|
||||
? 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.popUntil(
|
||||
context,
|
||||
ModalRoute.withName('/'),
|
||||
);
|
||||
Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(builder: (context) {
|
||||
return const WalletsHome();
|
||||
}),
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
const Spacer(),
|
||||
]),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:gecko/providers/substrate_sdk.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class Certifications extends StatelessWidget {
|
||||
const Certifications(
|
||||
{Key? key,
|
||||
required this.address,
|
||||
required this.size,
|
||||
this.color = Colors.black})
|
||||
: super(key: key);
|
||||
final String address;
|
||||
final double size;
|
||||
final Color color;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column(children: <Widget>[
|
||||
Consumer<SubstrateSdk>(builder: (context, sdk, _) {
|
||||
return FutureBuilder(
|
||||
future: sdk.getCertsCounter(address),
|
||||
builder: (BuildContext context, AsyncSnapshot<List<int>> certs) {
|
||||
// log.d(_certs.data);
|
||||
|
||||
return certs.data?[0] != 0 && certs.data != null
|
||||
? Row(
|
||||
children: [
|
||||
Image.asset('assets/medal.png', height: 20),
|
||||
const SizedBox(width: 1),
|
||||
Text(certs.data?[0].toString() ?? '0',
|
||||
style: const TextStyle(fontSize: 20)),
|
||||
const SizedBox(width: 5),
|
||||
Text(
|
||||
"(${certs.data?[1].toString() ?? '0'})",
|
||||
style: const TextStyle(fontSize: 14),
|
||||
)
|
||||
],
|
||||
)
|
||||
: const Text('');
|
||||
});
|
||||
}),
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -9,6 +9,9 @@ import 'package:gecko/providers/wallet_options.dart';
|
|||
import 'package:gecko/providers/wallets_profiles.dart';
|
||||
import 'package:gecko/screens/certifications.dart';
|
||||
import 'package:gecko/screens/common_elements.dart';
|
||||
import 'package:gecko/widgets/balance.dart';
|
||||
import 'package:gecko/widgets/certifications.dart';
|
||||
import 'package:gecko/widgets/idty_status.dart';
|
||||
import 'package:gecko/widgets/page_route_no_transition.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
|
@ -25,15 +28,13 @@ class HeaderProfile extends StatelessWidget {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
const double avatarSize = 140;
|
||||
|
||||
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
||||
final walletOptions =
|
||||
Provider.of<WalletOptionsProvider>(context, listen: false);
|
||||
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
||||
|
||||
return Stack(children: <Widget>[
|
||||
Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
||||
// sub.getBlockchainStart();
|
||||
bool isAccountExist = balanceCache[address] != 0;
|
||||
bool isAccountExist = walletOptions.balanceCache[address] != 0;
|
||||
return Container(
|
||||
height: 180,
|
||||
decoration: BoxDecoration(
|
||||
|
@ -55,7 +56,7 @@ class HeaderProfile extends StatelessWidget {
|
|||
children: <Widget>[
|
||||
Container(
|
||||
height: 10,
|
||||
color: yellowC, // Colors.grey[400],
|
||||
color: yellowC,
|
||||
),
|
||||
Row(children: [
|
||||
GestureDetector(
|
||||
|
@ -74,9 +75,8 @@ class HeaderProfile extends StatelessWidget {
|
|||
),
|
||||
]),
|
||||
const SizedBox(height: 25),
|
||||
balance(context, address, 22),
|
||||
Balance(address: address, size: 22),
|
||||
const SizedBox(height: 10),
|
||||
|
||||
InkWell(
|
||||
onTap: () => duniterIndexer.walletNameIndexer[address] != null
|
||||
? {
|
||||
|
@ -94,43 +94,20 @@ class HeaderProfile extends StatelessWidget {
|
|||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
walletOptions.idtyStatus(context, address,
|
||||
isOwner: false, color: Colors.black),
|
||||
getCerts(context, address, 14)
|
||||
IdentityStatus(
|
||||
address: address,
|
||||
isOwner: false,
|
||||
color: Colors.black),
|
||||
Certifications(address: address, size: 14)
|
||||
],
|
||||
),
|
||||
),
|
||||
// if (username == null &&
|
||||
// g1WalletsBox.get(address)?.username != null)
|
||||
// SizedBox(
|
||||
// width: 230,
|
||||
// child: Text(
|
||||
// g1WalletsBox.get(address)?.username ?? '',
|
||||
// style: const TextStyle(
|
||||
// fontSize: 27,
|
||||
// color: Color(0xff814C00),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// if (username != null)
|
||||
// SizedBox(
|
||||
// width: 230,
|
||||
// child: Text(
|
||||
// username,
|
||||
// style: const TextStyle(
|
||||
// fontSize: 27,
|
||||
// color: Color(0xff814C00),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
// const SizedBox(height: 55),
|
||||
]),
|
||||
const Spacer(),
|
||||
Column(children: <Widget>[
|
||||
ClipOval(
|
||||
child: defaultAvatar(avatarSize),
|
||||
),
|
||||
// const SizedBox(height: 25),
|
||||
]),
|
||||
]),
|
||||
),
|
||||
|
|
|
@ -0,0 +1,90 @@
|
|||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:gecko/models/wallet_data.dart';
|
||||
import 'package:gecko/providers/duniter_indexer.dart';
|
||||
import 'package:gecko/providers/substrate_sdk.dart';
|
||||
import 'package:gecko/widgets/animated_text.dart';
|
||||
import 'package:gecko/widgets/name_by_address.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class IdentityStatus extends StatelessWidget {
|
||||
const IdentityStatus(
|
||||
{Key? key,
|
||||
required this.address,
|
||||
this.isOwner = false,
|
||||
this.color = Colors.black})
|
||||
: super(key: key);
|
||||
final String address;
|
||||
final bool isOwner;
|
||||
final Color color;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
||||
|
||||
return Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
||||
return FutureBuilder(
|
||||
future: sub.idtyStatus(address),
|
||||
initialData: '',
|
||||
builder: (context, snapshot) {
|
||||
duniterIndexer.idtyStatusCache[address] = snapshot.data.toString();
|
||||
switch (snapshot.data.toString()) {
|
||||
case 'noid':
|
||||
{
|
||||
return showText('noIdentity'.tr());
|
||||
}
|
||||
case 'Created':
|
||||
{
|
||||
return showText('identityCreated'.tr());
|
||||
}
|
||||
case 'ConfirmedByOwner':
|
||||
{
|
||||
return isOwner
|
||||
? showText('identityConfirmed'.tr())
|
||||
: NameByAddress(
|
||||
wallet: WalletData(address: address),
|
||||
size: 20,
|
||||
color: Colors.grey[700]!,
|
||||
fontWeight: FontWeight.w500,
|
||||
fontStyle: FontStyle.italic);
|
||||
}
|
||||
case 'Validated':
|
||||
{
|
||||
return isOwner
|
||||
? showText('memberValidated'.tr(), 18, true)
|
||||
: NameByAddress(
|
||||
wallet: WalletData(address: address),
|
||||
size: 20,
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontStyle: FontStyle.normal);
|
||||
}
|
||||
case 'expired':
|
||||
{
|
||||
return showText('identityExpired'.tr());
|
||||
}
|
||||
}
|
||||
return SizedBox(
|
||||
child: showText('', 18, false, false),
|
||||
);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
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),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,97 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:gecko/globals.dart';
|
||||
import 'package:gecko/models/g1_wallets_list.dart';
|
||||
import 'package:gecko/models/queries_indexer.dart';
|
||||
import 'package:gecko/models/wallet_data.dart';
|
||||
import 'package:gecko/providers/duniter_indexer.dart';
|
||||
import 'package:gecko/widgets/wallet_name.dart';
|
||||
import 'package:graphql_flutter/graphql_flutter.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:truncate/truncate.dart';
|
||||
|
||||
class NameByAddress extends StatelessWidget {
|
||||
const NameByAddress(
|
||||
{Key? key,
|
||||
required this.wallet,
|
||||
this.size = 20,
|
||||
this.color = Colors.black,
|
||||
this.fontWeight = FontWeight.w400,
|
||||
this.fontStyle = FontStyle.italic})
|
||||
: super(key: key);
|
||||
final WalletData wallet;
|
||||
final Color color;
|
||||
final double size;
|
||||
final FontWeight fontWeight;
|
||||
final FontStyle fontStyle;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
|
||||
|
||||
if (indexerEndpoint == '') {
|
||||
return WalletName(wallet: wallet, size: size, color: color);
|
||||
}
|
||||
|
||||
final httpLink = HttpLink(
|
||||
'$indexerEndpoint/v1/graphql',
|
||||
);
|
||||
|
||||
final client = ValueNotifier(
|
||||
GraphQLClient(
|
||||
cache: GraphQLCache(store: HiveStore()),
|
||||
link: httpLink,
|
||||
),
|
||||
);
|
||||
return GraphQLProvider(
|
||||
client: client,
|
||||
child: Query(
|
||||
options: QueryOptions(
|
||||
document: gql(
|
||||
getNameByAddressQ), // this is the query string you just created
|
||||
variables: {
|
||||
'address': wallet.address,
|
||||
},
|
||||
// pollInterval: const Duration(seconds: 10),
|
||||
),
|
||||
builder: (QueryResult result,
|
||||
{VoidCallback? refetch, FetchMore? fetchMore}) {
|
||||
if (result.hasException) {
|
||||
return Text(result.exception.toString());
|
||||
}
|
||||
|
||||
if (result.isLoading) {
|
||||
return const Text('Loading');
|
||||
}
|
||||
|
||||
duniterIndexer.walletNameIndexer[wallet.address] =
|
||||
result.data?['account_by_pk']?['identity']?['name'];
|
||||
|
||||
g1WalletsBox.put(
|
||||
wallet.address,
|
||||
G1WalletsList(
|
||||
address: wallet.address,
|
||||
username:
|
||||
duniterIndexer.walletNameIndexer[wallet.address]));
|
||||
|
||||
// log.d(g1WalletsBox.toMap().values.first.username);
|
||||
|
||||
if (duniterIndexer.walletNameIndexer[wallet.address] == null) {
|
||||
return WalletName(wallet: wallet, size: size, color: color);
|
||||
}
|
||||
|
||||
return Text(
|
||||
color == Colors.grey[700]!
|
||||
? '(${duniterIndexer.walletNameIndexer[wallet.address]!})'
|
||||
: truncate(
|
||||
duniterIndexer.walletNameIndexer[wallet.address]!, 20),
|
||||
style: TextStyle(
|
||||
fontSize: size,
|
||||
color: color,
|
||||
fontWeight: fontWeight,
|
||||
fontStyle: fontStyle,
|
||||
),
|
||||
);
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:gecko/providers/substrate_sdk.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class TemplateWidget extends StatelessWidget {
|
||||
const TemplateWidget(
|
||||
{Key? key, required this.address, this.color = Colors.black})
|
||||
: super(key: key);
|
||||
final String address;
|
||||
final Color color;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Consumer<SubstrateSdk>(builder: (context, sub, _) {
|
||||
return const Text('Hello Widget');
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:gecko/globals.dart';
|
||||
|
||||
class UdUnitDisplay extends StatelessWidget {
|
||||
const UdUnitDisplay({
|
||||
Key? key,
|
||||
required this.size,
|
||||
required this.color,
|
||||
}) : super(key: key);
|
||||
|
||||
final double size;
|
||||
final Color color;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final bool isUdUnit = configBox.get('isUdUnit') ?? false;
|
||||
return isUdUnit
|
||||
? Row(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
Text(
|
||||
'ud'.tr(args: ['']),
|
||||
style: TextStyle(
|
||||
fontSize: isTall ? size : size * 0.9, color: color),
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
Text(
|
||||
currencyName,
|
||||
style: TextStyle(
|
||||
fontSize: (isTall ? size : size * 0.9) * 0.7,
|
||||
fontWeight: FontWeight.w500,
|
||||
color: color),
|
||||
),
|
||||
const SizedBox(height: 15)
|
||||
],
|
||||
)
|
||||
],
|
||||
)
|
||||
: Text(currencyName,
|
||||
style:
|
||||
TextStyle(fontSize: isTall ? size : size * 0.9, color: color));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:gecko/globals.dart';
|
||||
import 'package:gecko/models/wallet_data.dart';
|
||||
import 'package:truncate/truncate.dart';
|
||||
|
||||
class WalletName extends StatelessWidget {
|
||||
const WalletName(
|
||||
{Key? key,
|
||||
required this.wallet,
|
||||
this.size = 20,
|
||||
this.color = Colors.black})
|
||||
: super(key: key);
|
||||
final WalletData wallet;
|
||||
final double size;
|
||||
final Color color;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
double newSize = (wallet.name?.length ?? 0) <= 15 ? size : size - 2;
|
||||
|
||||
return Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
|
||||
Text(
|
||||
truncate(wallet.name ?? '', 20),
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: isTall ? newSize : newSize * 0.9,
|
||||
color: color,
|
||||
fontWeight: FontWeight.w400,
|
||||
fontStyle: FontStyle.italic,
|
||||
),
|
||||
softWrap: false,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
]);
|
||||
}
|
||||
}
|
29
pubspec.lock
29
pubspec.lock
|
@ -287,7 +287,7 @@ packages:
|
|||
name: decimal
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.3.1"
|
||||
version: "2.3.2"
|
||||
dio:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -577,6 +577,13 @@ packages:
|
|||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.1.0"
|
||||
hive_generator:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: hive_generator
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
html:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1068,7 +1075,7 @@ packages:
|
|||
name: rational
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.2.1"
|
||||
version: "2.2.2"
|
||||
responsive_framework:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1103,14 +1110,14 @@ packages:
|
|||
name: sentry
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "6.17.0"
|
||||
version: "6.18.0"
|
||||
sentry_flutter:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: sentry_flutter
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "6.17.0"
|
||||
version: "6.18.0"
|
||||
shared_preferences:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1186,6 +1193,20 @@ packages:
|
|||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.99"
|
||||
source_gen:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_gen
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.2.6"
|
||||
source_helper:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_helper
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.3.3"
|
||||
source_span:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
@ -5,7 +5,7 @@ description: Pay with G1.
|
|||
# pub.dev using `pub publish`. This is preferred for private packages.
|
||||
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||
|
||||
version: 0.0.14+46
|
||||
version: 0.0.15+48
|
||||
|
||||
environment:
|
||||
sdk: '>=2.12.0 <3.0.0'
|
||||
|
@ -23,11 +23,11 @@ dependencies:
|
|||
image_picker: ^0.8.4
|
||||
jdenticon_dart: ^2.0.0
|
||||
logger: ^1.1.0
|
||||
path_provider: ^2.0.9
|
||||
path_provider: ^2.0.11
|
||||
pdf: ^3.7.1
|
||||
permission_handler: ^10.0.0
|
||||
pin_code_fields: ^7.4.0
|
||||
printing: ^5.9.1
|
||||
printing: ^5.9.3
|
||||
provider: ^6.0.1
|
||||
barcode_scan2: ^4.2.1
|
||||
qr_flutter: #^4.0.0
|
||||
|
@ -35,7 +35,7 @@ dependencies:
|
|||
url: https://github.com/insinfo/qr.flutter.git
|
||||
ref: master
|
||||
responsive_framework: ^0.2.0
|
||||
sentry_flutter: ^6.5.1
|
||||
sentry_flutter: ^6.18.0
|
||||
shared_preferences: ^2.0.7
|
||||
truncate: ^3.0.1
|
||||
unorm_dart: ^0.2.0
|
||||
|
@ -63,6 +63,7 @@ dependencies:
|
|||
pinenacl: ^0.3.3
|
||||
fast_base58: ^0.2.1
|
||||
graphql: ^5.1.1
|
||||
hive_generator: ^2.0.0
|
||||
|
||||
dev_dependencies:
|
||||
# flutter_launcher_icons: ^0.9.2
|
||||
|
|
Loading…
Reference in New Issue