feat: welcome back Cs+ avatars (disabled)
feat: add methode to store cs+ avatar (disabled due to sr25519 cryptotype)
This commit is contained in:
parent
a6ed10c6b7
commit
225d2b342b
|
@ -23,8 +23,8 @@ late Box<G1WalletsList> contactsBox;
|
||||||
// late Box keystoreBox;
|
// late Box keystoreBox;
|
||||||
late Directory imageDirectory;
|
late Directory imageDirectory;
|
||||||
|
|
||||||
// String cesiumPod = "https://g1.data.le-sou.org";
|
String cesiumPod = "https://g1.data.le-sou.org";
|
||||||
String cesiumPod = "https://g1.data.presles.fr";
|
// String cesiumPod = "https://g1.data.presles.fr";
|
||||||
// String cesiumPod = "https://g1.data.e-is.pro";
|
// String cesiumPod = "https://g1.data.e-is.pro";
|
||||||
|
|
||||||
// Responsive ratios
|
// Responsive ratios
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:hive_flutter/hive_flutter.dart';
|
import 'package:hive_flutter/hive_flutter.dart';
|
||||||
|
|
||||||
part 'g1_wallets_list.g.dart';
|
part 'g1_wallets_list.g.dart';
|
||||||
|
@ -15,22 +14,18 @@ class G1WalletsList {
|
||||||
Id? id;
|
Id? id;
|
||||||
|
|
||||||
@HiveField(3)
|
@HiveField(3)
|
||||||
Image? avatar;
|
|
||||||
|
|
||||||
@HiveField(4)
|
|
||||||
String? username;
|
String? username;
|
||||||
|
|
||||||
@HiveField(5)
|
@HiveField(4)
|
||||||
String? csName;
|
String? csName;
|
||||||
|
|
||||||
@HiveField(6)
|
@HiveField(5)
|
||||||
bool? isMembre;
|
bool? isMembre;
|
||||||
|
|
||||||
G1WalletsList({
|
G1WalletsList({
|
||||||
required this.address,
|
required this.address,
|
||||||
this.balance,
|
this.balance,
|
||||||
this.id,
|
this.id,
|
||||||
this.avatar,
|
|
||||||
this.username,
|
this.username,
|
||||||
this.csName,
|
this.csName,
|
||||||
this.isMembre,
|
this.isMembre,
|
||||||
|
|
|
@ -20,17 +20,16 @@ class G1WalletsListAdapter extends TypeAdapter<G1WalletsList> {
|
||||||
address: fields[0] as String,
|
address: fields[0] as String,
|
||||||
balance: fields[1] as double?,
|
balance: fields[1] as double?,
|
||||||
id: fields[2] as Id?,
|
id: fields[2] as Id?,
|
||||||
avatar: fields[3] as Image?,
|
username: fields[3] as String?,
|
||||||
username: fields[4] as String?,
|
csName: fields[4] as String?,
|
||||||
csName: fields[5] as String?,
|
isMembre: fields[5] as bool?,
|
||||||
isMembre: fields[6] as bool?,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void write(BinaryWriter writer, G1WalletsList obj) {
|
void write(BinaryWriter writer, G1WalletsList obj) {
|
||||||
writer
|
writer
|
||||||
..writeByte(7)
|
..writeByte(6)
|
||||||
..writeByte(0)
|
..writeByte(0)
|
||||||
..write(obj.address)
|
..write(obj.address)
|
||||||
..writeByte(1)
|
..writeByte(1)
|
||||||
|
@ -38,12 +37,10 @@ class G1WalletsListAdapter extends TypeAdapter<G1WalletsList> {
|
||||||
..writeByte(2)
|
..writeByte(2)
|
||||||
..write(obj.id)
|
..write(obj.id)
|
||||||
..writeByte(3)
|
..writeByte(3)
|
||||||
..write(obj.avatar)
|
|
||||||
..writeByte(4)
|
|
||||||
..write(obj.username)
|
..write(obj.username)
|
||||||
..writeByte(5)
|
..writeByte(4)
|
||||||
..write(obj.csName)
|
..write(obj.csName)
|
||||||
..writeByte(6)
|
..writeByte(5)
|
||||||
..write(obj.isMembre);
|
..write(obj.isMembre);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,13 @@ import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'package:dio/dio.dart';
|
import 'package:dio/dio.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
import 'package:gecko/globals.dart';
|
import 'package:gecko/globals.dart';
|
||||||
|
import 'package:gecko/providers/substrate_sdk.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
import 'package:path_provider/path_provider.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:crypto/crypto.dart';
|
||||||
|
|
||||||
// import 'package:http/http.dart' as http;
|
// import 'package:http/http.dart' as http;
|
||||||
|
|
||||||
class CesiumPlusProvider with ChangeNotifier {
|
class CesiumPlusProvider with ChangeNotifier {
|
||||||
|
@ -11,105 +16,186 @@ class CesiumPlusProvider with ChangeNotifier {
|
||||||
|
|
||||||
CancelToken avatarCancelToken = CancelToken();
|
CancelToken avatarCancelToken = CancelToken();
|
||||||
|
|
||||||
Future<List> _buildQuery(pubkey) async {
|
final Map<String, String> _headers = {
|
||||||
var queryGetAvatar = json.encode({
|
'Content-type': 'application/json',
|
||||||
"query": {
|
'Accept': 'application/json',
|
||||||
"bool": {
|
};
|
||||||
"should": [
|
|
||||||
{
|
// List _buildQueryGetAvatar(String pubkeyV1) {
|
||||||
"match": {
|
// final queryGetAvatar = json.encode({
|
||||||
'_id': {"query": pubkey, "boost": 2}
|
// "query": {
|
||||||
}
|
// "bool": {
|
||||||
},
|
// "should": [
|
||||||
{
|
// {
|
||||||
"prefix": {'_id': pubkey}
|
// "match": {
|
||||||
}
|
// '_id': {"query": pubkeyV1, "boost": 1}
|
||||||
]
|
// }
|
||||||
}
|
// },
|
||||||
},
|
// {
|
||||||
"highlight": {
|
// "prefix": {'_id': pubkeyV1}
|
||||||
"fields": {"title": {}, "tags": {}}
|
// }
|
||||||
},
|
// ]
|
||||||
"from": 0,
|
// }
|
||||||
"size": 100,
|
// },
|
||||||
"_source": [
|
// "_source": [
|
||||||
"title",
|
// "avatar",
|
||||||
"avatar",
|
// "avatar._content_type",
|
||||||
"avatar._content_type",
|
// ],
|
||||||
"description",
|
// "indices_boost": {"user": 1, "page": 1, "group": 0.01}
|
||||||
"city",
|
// });
|
||||||
"address",
|
|
||||||
"socials.url",
|
// const requestUrl = "/user,page,group/profile,record/_search";
|
||||||
"creationTime",
|
// final podRequest = cesiumPod + requestUrl;
|
||||||
"membersCount",
|
|
||||||
"type"
|
// return [podRequest, queryGetAvatar];
|
||||||
],
|
// }
|
||||||
"indices_boost": {"user": 100, "page": 1, "group": 0.01}
|
|
||||||
|
Future<List> _buildQuerySetAvatar(
|
||||||
|
String pubkeyV1, String address, String avatar) async {
|
||||||
|
int timeSent = DateTime.now().millisecondsSinceEpoch ~/ 1000;
|
||||||
|
final queryGetAvatar = json.encode({
|
||||||
|
"avatar": {"_content": avatar, "_content_type": "image/png"},
|
||||||
|
"time": timeSent,
|
||||||
|
"issuer": pubkeyV1,
|
||||||
|
"version": 2,
|
||||||
|
"tags": []
|
||||||
});
|
});
|
||||||
|
|
||||||
String requestUrl = "/user,page,group/profile,record/_search";
|
final requestUrl =
|
||||||
String podRequest = cesiumPod + requestUrl;
|
"/user/profile?pubkey=$pubkeyV1/_update?pubkey=$pubkeyV1";
|
||||||
|
final podRequest = cesiumPod + requestUrl;
|
||||||
|
|
||||||
Map<String, String> headers = {
|
final signedDocument = await signDoc(queryGetAvatar, address);
|
||||||
'Content-type': 'application/json',
|
|
||||||
'Accept': 'application/json',
|
return [podRequest, signedDocument];
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<String> signDoc(String document, String address) async {
|
||||||
|
final sub = Provider.of<SubstrateSdk>(homeContext, listen: false);
|
||||||
|
final hashDocBytes = utf8.encode(document);
|
||||||
|
final hashDoc = sha256.convert(hashDocBytes);
|
||||||
|
final hashDocHex = hashDoc.toString().toUpperCase();
|
||||||
|
|
||||||
|
// Generate signature of document
|
||||||
|
final signature = await sub.signCsPlusDocument(hashDocHex, address);
|
||||||
|
|
||||||
|
// Build final document
|
||||||
|
final Map<String, dynamic> data = {
|
||||||
|
'hash': hashDocHex,
|
||||||
|
'signature': signature
|
||||||
|
};
|
||||||
|
final signJSON = jsonEncode(data);
|
||||||
|
final Map<String, dynamic> finalJSON = {
|
||||||
|
...jsonDecode(signJSON),
|
||||||
|
...jsonDecode(document)
|
||||||
};
|
};
|
||||||
|
|
||||||
return [podRequest, queryGetAvatar, headers];
|
return jsonEncode(finalJSON);
|
||||||
|
}
|
||||||
|
// Future<String> getName(String address) async {
|
||||||
|
// String? name;
|
||||||
|
|
||||||
|
// if (g1WalletsBox.get(address)?.csName != null) {
|
||||||
|
// return g1WalletsBox.get(address)!.csName!;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// List queryOptions = await _buildQueryName(address);
|
||||||
|
|
||||||
|
// var dio = Dio();
|
||||||
|
// late Response response;
|
||||||
|
// try {
|
||||||
|
// response = await dio.post(
|
||||||
|
// queryOptions[0],
|
||||||
|
// data: queryOptions[1],
|
||||||
|
// options: Options(
|
||||||
|
// headers: queryOptions[2],
|
||||||
|
// sendTimeout: const Duration(seconds: 3),
|
||||||
|
// receiveTimeout: const Duration(seconds: 5),
|
||||||
|
// ),
|
||||||
|
// );
|
||||||
|
// // response = await http.post((Uri.parse(queryOptions[0])),
|
||||||
|
// // body: queryOptions[1], headers: queryOptions[2]);
|
||||||
|
// } catch (e) {
|
||||||
|
// log.e(e);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (response.data['hits']['hits'].toString() == '[]') {
|
||||||
|
// return '';
|
||||||
|
// }
|
||||||
|
// final bool nameExist =
|
||||||
|
// response.data['hits']['hits'][0]['_source'].containsKey("title");
|
||||||
|
// if (!nameExist) {
|
||||||
|
// return '';
|
||||||
|
// }
|
||||||
|
// name = response.data['hits']['hits'][0]['_source']['title'];
|
||||||
|
|
||||||
|
// name ??= '';
|
||||||
|
// g1WalletsBox.get(address)!.csName = name;
|
||||||
|
|
||||||
|
// return name;
|
||||||
|
// }
|
||||||
|
|
||||||
|
Future<Image> getAvatar(String address, double size) async {
|
||||||
|
return defaultAvatar(size);
|
||||||
|
// final sub = Provider.of<SubstrateSdk>(homeContext, listen: false);
|
||||||
|
// if (await isAvatarExist(address)) {
|
||||||
|
// return await getAvatarLocal(address, size);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// final pubkeyV1 = await sub.addressToPubkeyB58(address);
|
||||||
|
// var dio = Dio();
|
||||||
|
|
||||||
|
// List queryOptions = _buildQueryGetAvatar(pubkeyV1);
|
||||||
|
|
||||||
|
// late Response response;
|
||||||
|
// try {
|
||||||
|
// response = await dio
|
||||||
|
// .post(queryOptions[0],
|
||||||
|
// data: queryOptions[1],
|
||||||
|
// options: Options(
|
||||||
|
// headers: _headers,
|
||||||
|
// sendTimeout: const Duration(seconds: 4),
|
||||||
|
// receiveTimeout: const Duration(seconds: 15),
|
||||||
|
// ),
|
||||||
|
// cancelToken: avatarCancelToken)
|
||||||
|
// .timeout(
|
||||||
|
// const Duration(seconds: 15),
|
||||||
|
// );
|
||||||
|
// } catch (e) {
|
||||||
|
// log.e(e);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (response.data['hits']['hits'].toString() == '[]' ||
|
||||||
|
// !response.data['hits']['hits'][0]['_source'].containsKey("avatar")) {
|
||||||
|
// return defaultAvatar(size);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// final avatar =
|
||||||
|
// response.data['hits']['hits'][0]['_source']['avatar']['_content'];
|
||||||
|
|
||||||
|
// final avatarFile = await saveAvatar(address, avatar);
|
||||||
|
|
||||||
|
// final finalAvatar = Image.file(
|
||||||
|
// avatarFile,
|
||||||
|
// height: size,
|
||||||
|
// fit: BoxFit.fitWidth,
|
||||||
|
// );
|
||||||
|
|
||||||
|
// return finalAvatar;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<String> getName(String? pubkey) async {
|
Future<bool> setAvatar(String address, String avatarPath) async {
|
||||||
String? name;
|
final sub = Provider.of<SubstrateSdk>(homeContext, listen: false);
|
||||||
|
|
||||||
if (g1WalletsBox.get(pubkey)?.csName != null) {
|
|
||||||
return g1WalletsBox.get(pubkey)!.csName!;
|
|
||||||
}
|
|
||||||
|
|
||||||
List queryOptions = await _buildQuery(pubkey);
|
|
||||||
|
|
||||||
|
final pubkeyV1 = await sub.addressToPubkeyB58(address);
|
||||||
var dio = Dio();
|
var dio = Dio();
|
||||||
late Response response;
|
final Uint8List avatarBytes = await File(avatarPath).readAsBytes();
|
||||||
try {
|
final avatarString = base64Encode(avatarBytes);
|
||||||
response = await dio.post(
|
|
||||||
queryOptions[0],
|
|
||||||
data: queryOptions[1],
|
|
||||||
options: Options(
|
|
||||||
headers: queryOptions[2],
|
|
||||||
sendTimeout: const Duration(seconds: 3),
|
|
||||||
receiveTimeout: const Duration(seconds: 5),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
// response = await http.post((Uri.parse(queryOptions[0])),
|
|
||||||
// body: queryOptions[1], headers: queryOptions[2]);
|
|
||||||
} catch (e) {
|
|
||||||
log.e(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (response.data['hits']['hits'].toString() == '[]') {
|
List queryOptions =
|
||||||
return '';
|
await _buildQuerySetAvatar(pubkeyV1, address, avatarString);
|
||||||
}
|
log.d(queryOptions[0]);
|
||||||
final bool nameExist =
|
log.d(jsonDecode(queryOptions[1]));
|
||||||
response.data['hits']['hits'][0]['_source'].containsKey("title");
|
|
||||||
if (!nameExist) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
name = response.data['hits']['hits'][0]['_source']['title'];
|
|
||||||
|
|
||||||
name ??= '';
|
|
||||||
g1WalletsBox.get(pubkey)!.csName = name;
|
|
||||||
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<Image?> getAvatar(String? pubkey, double size) async {
|
|
||||||
if (g1WalletsBox.get(pubkey)?.avatar != null) {
|
|
||||||
return g1WalletsBox.get(pubkey)!.avatar;
|
|
||||||
}
|
|
||||||
var dio = Dio();
|
|
||||||
|
|
||||||
// log.d(_pubkey);
|
|
||||||
|
|
||||||
List queryOptions = await _buildQuery(pubkey);
|
|
||||||
|
|
||||||
late Response response;
|
late Response response;
|
||||||
try {
|
try {
|
||||||
|
@ -117,7 +203,7 @@ class CesiumPlusProvider with ChangeNotifier {
|
||||||
.post(queryOptions[0],
|
.post(queryOptions[0],
|
||||||
data: queryOptions[1],
|
data: queryOptions[1],
|
||||||
options: Options(
|
options: Options(
|
||||||
headers: queryOptions[2],
|
headers: _headers,
|
||||||
sendTimeout: const Duration(seconds: 4),
|
sendTimeout: const Duration(seconds: 4),
|
||||||
receiveTimeout: const Duration(seconds: 15),
|
receiveTimeout: const Duration(seconds: 15),
|
||||||
),
|
),
|
||||||
|
@ -125,33 +211,51 @@ class CesiumPlusProvider with ChangeNotifier {
|
||||||
.timeout(
|
.timeout(
|
||||||
const Duration(seconds: 15),
|
const Duration(seconds: 15),
|
||||||
);
|
);
|
||||||
// response = await http.post((Uri.parse(queryOptions[0])),
|
log.d(response.data);
|
||||||
// body: queryOptions[1], headers: queryOptions[2]);
|
return response.statusCode == 200;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
log.e(e);
|
log.e(e);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (response.data['hits']['hits'].toString() == '[]' ||
|
Future<String> getLocalPath() async {
|
||||||
!response.data['hits']['hits'][0]['_source'].containsKey("avatar")) {
|
final directory = await getApplicationDocumentsDirectory();
|
||||||
return defaultAvatar(size);
|
return directory.path;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<File> saveAvatar(String address, String data) async {
|
||||||
|
final path = await getLocalPath();
|
||||||
|
final avatarFolder = Directory('$path/avatars/');
|
||||||
|
if (!await avatarFolder.exists()) {
|
||||||
|
await avatarFolder.create();
|
||||||
}
|
}
|
||||||
|
final file = File('$path/avatars/$address');
|
||||||
|
return await file.writeAsBytes(base64.decode(data));
|
||||||
|
}
|
||||||
|
|
||||||
final avatar =
|
Future<Image> getAvatarLocal(String address, double size) async {
|
||||||
response.data['hits']['hits'][0]['_source']['avatar']['_content'];
|
final path = await getLocalPath();
|
||||||
|
final avatarFile = File('$path/avatars/$address');
|
||||||
var avatarFile =
|
return Image.file(
|
||||||
File('${(await getTemporaryDirectory()).path}/avatar_$pubkey.png');
|
|
||||||
await avatarFile.writeAsBytes(base64.decode(avatar));
|
|
||||||
|
|
||||||
final finalAvatar = Image.file(
|
|
||||||
avatarFile,
|
avatarFile,
|
||||||
height: size,
|
height: size,
|
||||||
fit: BoxFit.fitWidth,
|
fit: BoxFit.fitWidth,
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
g1WalletsBox.get(pubkey)!.avatar = finalAvatar;
|
Future<bool> isAvatarExist(String address) async {
|
||||||
|
final path = await getLocalPath();
|
||||||
|
final avatarFile = File('$path/avatars/$address');
|
||||||
|
return avatarFile.exists();
|
||||||
|
}
|
||||||
|
|
||||||
return finalAvatar;
|
Future deleteAvatarFolder() async {
|
||||||
|
final path = await getLocalPath();
|
||||||
|
final avatarFolder = Directory('$path/avatars/');
|
||||||
|
if (await avatarFolder.exists()) {
|
||||||
|
await avatarFolder.delete(recursive: true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -136,6 +136,42 @@ class SubstrateSdk with ChangeNotifier {
|
||||||
return res?.signature ?? '';
|
return res?.signature ?? '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<String> signCsPlusDocument(String document, String address) async {
|
||||||
|
final myWallets =
|
||||||
|
Provider.of<MyWalletsProvider>(homeContext, listen: false);
|
||||||
|
final messageToSign = Uint8List.fromList(document.codeUnits);
|
||||||
|
// final pubkeyV1 = json.decode(document)['issuer'];
|
||||||
|
// final address = await pubkeyV1ToAddress(pubkeyV1);
|
||||||
|
// final walletData = myWallets.getWalletDataByAddress(address);
|
||||||
|
// final derivationPath =
|
||||||
|
// walletData!.derivation == null ? '' : "//${walletData.derivation}";
|
||||||
|
|
||||||
|
// final seed = await getSeed(address, myWallets.pinCode);
|
||||||
|
// final addressEd25519 = await importAccount(
|
||||||
|
// mnemonic: seed,
|
||||||
|
// password: 'AAAAA',
|
||||||
|
// cryptoType: CryptoType.ed25519,
|
||||||
|
// derivePath: derivationPath);
|
||||||
|
|
||||||
|
// final pubkeyEd25519 = await addressToPubkeyB58(addressEd25519);
|
||||||
|
|
||||||
|
final signatureString =
|
||||||
|
await _signMessage(messageToSign, address, myWallets.pinCode);
|
||||||
|
final signatureInt = HEX.decode(signatureString.substring(2));
|
||||||
|
final signature64 = base64Encode(signatureInt);
|
||||||
|
|
||||||
|
// await deleteAccounts([addressEd25519]);
|
||||||
|
|
||||||
|
// log.d("""
|
||||||
|
// $addressEd25519
|
||||||
|
// $pubkeyEd25519
|
||||||
|
// $derivationPath
|
||||||
|
// $signature64
|
||||||
|
// """);
|
||||||
|
|
||||||
|
return signature64;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////
|
////////////////////////////////////////////
|
||||||
////////// 2: GET ONCHAIN STORAGE //////////
|
////////// 2: GET ONCHAIN STORAGE //////////
|
||||||
////////////////////////////////////////////
|
////////////////////////////////////////////
|
||||||
|
@ -449,9 +485,16 @@ class SubstrateSdk with ChangeNotifier {
|
||||||
return pubkeyByte;
|
return pubkeyByte;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Future pubkeyToAddress(String pubkey) async {
|
Future<String> addressToPubkeyB58(String address) async {
|
||||||
// await sdk.api.account.encodeAddress([pubkey]);
|
return Base58Encode(await addressToPubkey(address));
|
||||||
// }
|
}
|
||||||
|
|
||||||
|
Future<String> pubkeyV1ToAddress(String pubkey) async {
|
||||||
|
final pubkeyByte = Base58Decode(pubkey);
|
||||||
|
final String pubkeyHex = '0x${HEX.encode(pubkeyByte)}';
|
||||||
|
final address = await sdk.api.account.encodeAddress([pubkeyHex]);
|
||||||
|
return address!.keys.first;
|
||||||
|
}
|
||||||
|
|
||||||
Future initCurrencyParameters() async {
|
Future initCurrencyParameters() async {
|
||||||
try {
|
try {
|
||||||
|
@ -677,7 +720,8 @@ class SubstrateSdk with ChangeNotifier {
|
||||||
Future<String> importAccount(
|
Future<String> importAccount(
|
||||||
{String mnemonic = '',
|
{String mnemonic = '',
|
||||||
String derivePath = '',
|
String derivePath = '',
|
||||||
required String password}) async {
|
required String password,
|
||||||
|
CryptoType cryptoType = CryptoType.sr25519}) async {
|
||||||
const keytype = KeyType.mnemonic;
|
const keytype = KeyType.mnemonic;
|
||||||
if (mnemonic != '') generatedMnemonic = mnemonic;
|
if (mnemonic != '') generatedMnemonic = mnemonic;
|
||||||
|
|
||||||
|
@ -691,7 +735,7 @@ class SubstrateSdk with ChangeNotifier {
|
||||||
name: derivePath,
|
name: derivePath,
|
||||||
password: password,
|
password: password,
|
||||||
derivePath: derivePath,
|
derivePath: derivePath,
|
||||||
cryptoType: CryptoType.sr25519)
|
cryptoType: cryptoType)
|
||||||
.catchError((e) {
|
.catchError((e) {
|
||||||
importIsLoading = false;
|
importIsLoading = false;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
|
@ -748,12 +792,6 @@ class SubstrateSdk with ChangeNotifier {
|
||||||
return seedText;
|
return seedText;
|
||||||
}
|
}
|
||||||
|
|
||||||
int getDerivationNumber(String address) {
|
|
||||||
final account = getKeypair(address);
|
|
||||||
final deriveNbr = account.name!.split('//')[1];
|
|
||||||
return int.parse(deriveNbr);
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<KeyPairData?> changePassword(BuildContext context, String address,
|
Future<KeyPairData?> changePassword(BuildContext context, String address,
|
||||||
String passOld, String passNew) async {
|
String passOld, String passNew) async {
|
||||||
final account = getKeypair(address);
|
final account = getKeypair(address);
|
||||||
|
|
|
@ -13,11 +13,10 @@ import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class ActivityScreen extends StatefulWidget {
|
class ActivityScreen extends StatefulWidget {
|
||||||
const ActivityScreen(
|
const ActivityScreen(
|
||||||
{required this.address, required this.avatar, this.username})
|
{required this.address, this.username})
|
||||||
: super(key: keyActivityScreen);
|
: super(key: keyActivityScreen);
|
||||||
final String address;
|
final String address;
|
||||||
final String? username;
|
final String? username;
|
||||||
final Image avatar;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<ActivityScreen> createState() => _ActivityScreenState();
|
State<ActivityScreen> createState() => _ActivityScreenState();
|
||||||
|
|
|
@ -6,6 +6,7 @@ import 'package:gecko/globals.dart';
|
||||||
import 'package:gecko/models/chest_data.dart';
|
import 'package:gecko/models/chest_data.dart';
|
||||||
import 'package:gecko/models/g1_wallets_list.dart';
|
import 'package:gecko/models/g1_wallets_list.dart';
|
||||||
import 'package:gecko/models/widgets_keys.dart';
|
import 'package:gecko/models/widgets_keys.dart';
|
||||||
|
import 'package:gecko/providers/cesium_plus.dart';
|
||||||
import 'package:gecko/providers/chest_provider.dart';
|
import 'package:gecko/providers/chest_provider.dart';
|
||||||
import 'package:gecko/providers/duniter_indexer.dart';
|
import 'package:gecko/providers/duniter_indexer.dart';
|
||||||
import 'package:gecko/providers/home.dart';
|
import 'package:gecko/providers/home.dart';
|
||||||
|
@ -41,6 +42,8 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||||
Provider.of<DuniterIndexer>(context, listen: false);
|
Provider.of<DuniterIndexer>(context, listen: false);
|
||||||
final myWalletProvider =
|
final myWalletProvider =
|
||||||
Provider.of<MyWalletsProvider>(context, listen: false);
|
Provider.of<MyWalletsProvider>(context, listen: false);
|
||||||
|
final csProvider =
|
||||||
|
Provider.of<CesiumPlusProvider>(context, listen: false);
|
||||||
|
|
||||||
final bool isWalletsExists = myWalletProvider.checkIfWalletExist();
|
final bool isWalletsExists = myWalletProvider.checkIfWalletExist();
|
||||||
|
|
||||||
|
@ -66,6 +69,7 @@ class _HomeScreenState extends State<HomeScreen> {
|
||||||
if (sub.sdkReady && !sub.nodeConnected) {
|
if (sub.sdkReady && !sub.nodeConnected) {
|
||||||
walletBox = await Hive.openBox<WalletData>("walletBox");
|
walletBox = await Hive.openBox<WalletData>("walletBox");
|
||||||
await Hive.deleteBoxFromDisk('g1WalletsBox');
|
await Hive.deleteBoxFromDisk('g1WalletsBox');
|
||||||
|
await csProvider.deleteAvatarFolder();
|
||||||
g1WalletsBox = await Hive.openBox<G1WalletsList>("g1WalletsBox");
|
g1WalletsBox = await Hive.openBox<G1WalletsList>("g1WalletsBox");
|
||||||
contactsBox = await Hive.openBox<G1WalletsList>("contactsBox");
|
contactsBox = await Hive.openBox<G1WalletsList>("contactsBox");
|
||||||
|
|
||||||
|
|
|
@ -286,6 +286,8 @@ class WalletOptions extends StatelessWidget {
|
||||||
if (newPath != '') {
|
if (newPath != '') {
|
||||||
wallet.imageCustomPath = newPath;
|
wallet.imageCustomPath = newPath;
|
||||||
walletBox.put(wallet.key, wallet);
|
walletBox.put(wallet.key, wallet);
|
||||||
|
// Uncomment to enable Cs+ avatar storage
|
||||||
|
// CesiumPlusProvider().setAvatar(wallet.address, newPath);
|
||||||
}
|
}
|
||||||
walletProvider.reload();
|
walletProvider.reload();
|
||||||
},
|
},
|
||||||
|
@ -448,17 +450,7 @@ class WalletOptions extends StatelessWidget {
|
||||||
Navigator.push(
|
Navigator.push(
|
||||||
context,
|
context,
|
||||||
PageNoTransit(builder: (context) {
|
PageNoTransit(builder: (context) {
|
||||||
return ActivityScreen(
|
return ActivityScreen(address: walletProvider.address.text);
|
||||||
address: walletProvider.address.text,
|
|
||||||
avatar: wallet.imageCustomPath == null
|
|
||||||
? Image.asset(
|
|
||||||
'assets/avatars/${wallet.imageDefaultPath}',
|
|
||||||
width: 110,
|
|
||||||
)
|
|
||||||
: Image.asset(
|
|
||||||
wallet.imageCustomPath!,
|
|
||||||
width: 110,
|
|
||||||
));
|
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
|
@ -14,7 +14,6 @@ class ContactsScreen extends StatelessWidget {
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
Provider.of<WalletsProfilesProvider>(context, listen: true);
|
Provider.of<WalletsProfilesProvider>(context, listen: true);
|
||||||
double avatarSize = 55;
|
|
||||||
final myContacts = contactsBox.toMap().values.toList();
|
final myContacts = contactsBox.toMap().values.toList();
|
||||||
|
|
||||||
// Order contacts by username
|
// Order contacts by username
|
||||||
|
@ -37,7 +36,7 @@ class ContactsScreen extends StatelessWidget {
|
||||||
bottomNavigationBar: const GeckoBottomAppBar(),
|
bottomNavigationBar: const GeckoBottomAppBar(),
|
||||||
body: SafeArea(
|
body: SafeArea(
|
||||||
child: Stack(children: [
|
child: Stack(children: [
|
||||||
ContactsList(myContacts: myContacts, avatarSize: avatarSize),
|
ContactsList(myContacts: myContacts),
|
||||||
const OfflineInfo(),
|
const OfflineInfo(),
|
||||||
]),
|
]),
|
||||||
),
|
),
|
||||||
|
|
|
@ -6,7 +6,6 @@ import 'package:gecko/globals.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:gecko/models/g1_wallets_list.dart';
|
import 'package:gecko/models/g1_wallets_list.dart';
|
||||||
import 'package:gecko/models/widgets_keys.dart';
|
import 'package:gecko/models/widgets_keys.dart';
|
||||||
import 'package:gecko/providers/cesium_plus.dart';
|
|
||||||
import 'package:gecko/providers/duniter_indexer.dart';
|
import 'package:gecko/providers/duniter_indexer.dart';
|
||||||
import 'package:gecko/providers/substrate_sdk.dart';
|
import 'package:gecko/providers/substrate_sdk.dart';
|
||||||
import 'package:gecko/providers/my_wallets.dart';
|
import 'package:gecko/providers/my_wallets.dart';
|
||||||
|
@ -29,11 +28,10 @@ const double buttonFontSize = 18;
|
||||||
|
|
||||||
class WalletViewScreen extends StatelessWidget {
|
class WalletViewScreen extends StatelessWidget {
|
||||||
const WalletViewScreen(
|
const WalletViewScreen(
|
||||||
{required this.address, required this.username, this.avatar, Key? key})
|
{required this.address, required this.username, Key? key})
|
||||||
: super(key: key);
|
: super(key: key);
|
||||||
final String address;
|
final String address;
|
||||||
final String? username;
|
final String? username;
|
||||||
final Image? avatar;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -136,9 +134,7 @@ class WalletViewScreen extends StatelessWidget {
|
||||||
Navigator.push(
|
Navigator.push(
|
||||||
context,
|
context,
|
||||||
PageNoTransit(builder: (context) {
|
PageNoTransit(builder: (context) {
|
||||||
return ActivityScreen(
|
return ActivityScreen(address: address);
|
||||||
address: address,
|
|
||||||
avatar: defaultAvatar(50));
|
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gecko/globals.dart';
|
||||||
|
import 'package:gecko/providers/cesium_plus.dart';
|
||||||
|
import 'package:gecko/widgets/commons/loading.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
class CesiumAvatar extends StatelessWidget {
|
||||||
|
const CesiumAvatar({Key? key, required this.address, this.size = 15})
|
||||||
|
: super(key: key);
|
||||||
|
final String address;
|
||||||
|
final double size;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
final csProvider = Provider.of<CesiumPlusProvider>(context, listen: false);
|
||||||
|
log.d('tatata');
|
||||||
|
|
||||||
|
return ClipOval(
|
||||||
|
child: FutureBuilder(
|
||||||
|
future: csProvider.getAvatar(address, size),
|
||||||
|
builder: ((context, AsyncSnapshot<Image> avatar) {
|
||||||
|
if (avatar.hasError) {
|
||||||
|
log.e(avatar.error);
|
||||||
|
return (Icon(Icons.close_outlined,
|
||||||
|
color: Colors.red, size: size));
|
||||||
|
} else if (avatar.connectionState != ConnectionState.done) {
|
||||||
|
return SizedBox(
|
||||||
|
width: size,
|
||||||
|
height: size,
|
||||||
|
child: const FractionallySizedBox(
|
||||||
|
widthFactor: 0.6, heightFactor: 0.6, child: Loading()));
|
||||||
|
}
|
||||||
|
return avatar.data!;
|
||||||
|
})),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:gecko/globals.dart';
|
||||||
|
|
||||||
|
class Loading extends StatelessWidget {
|
||||||
|
const Loading({
|
||||||
|
Key? key,
|
||||||
|
this.size = 15,
|
||||||
|
this.stroke = 2,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
final double size;
|
||||||
|
final double stroke;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return SizedBox(
|
||||||
|
height: size,
|
||||||
|
width: size,
|
||||||
|
child: CircularProgressIndicator(
|
||||||
|
color: orangeC,
|
||||||
|
strokeWidth: stroke,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,15 +1,14 @@
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:gecko/globals.dart';
|
|
||||||
import 'package:gecko/models/g1_wallets_list.dart';
|
import 'package:gecko/models/g1_wallets_list.dart';
|
||||||
import 'package:gecko/models/wallet_data.dart';
|
import 'package:gecko/models/wallet_data.dart';
|
||||||
import 'package:gecko/models/widgets_keys.dart';
|
import 'package:gecko/models/widgets_keys.dart';
|
||||||
import 'package:gecko/providers/cesium_plus.dart';
|
|
||||||
import 'package:gecko/providers/duniter_indexer.dart';
|
import 'package:gecko/providers/duniter_indexer.dart';
|
||||||
import 'package:gecko/providers/substrate_sdk.dart';
|
import 'package:gecko/providers/substrate_sdk.dart';
|
||||||
import 'package:gecko/providers/wallets_profiles.dart';
|
import 'package:gecko/providers/wallets_profiles.dart';
|
||||||
import 'package:gecko/screens/wallet_view.dart';
|
import 'package:gecko/screens/wallet_view.dart';
|
||||||
import 'package:gecko/widgets/balance.dart';
|
import 'package:gecko/widgets/balance.dart';
|
||||||
|
import 'package:gecko/widgets/cesium_avatar.dart';
|
||||||
import 'package:gecko/widgets/name_by_address.dart';
|
import 'package:gecko/widgets/name_by_address.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
@ -17,11 +16,9 @@ class ContactsList extends StatelessWidget {
|
||||||
const ContactsList({
|
const ContactsList({
|
||||||
Key? key,
|
Key? key,
|
||||||
required this.myContacts,
|
required this.myContacts,
|
||||||
required this.avatarSize,
|
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
final List<G1WalletsList> myContacts;
|
final List<G1WalletsList> myContacts;
|
||||||
final double avatarSize;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -47,7 +44,8 @@ class ContactsList extends StatelessWidget {
|
||||||
key: keySearchResult('keyID++'),
|
key: keySearchResult('keyID++'),
|
||||||
horizontalTitleGap: 40,
|
horizontalTitleGap: 40,
|
||||||
contentPadding: const EdgeInsets.all(5),
|
contentPadding: const EdgeInsets.all(5),
|
||||||
leading: defaultAvatar(avatarSize),
|
leading:
|
||||||
|
CesiumAvatar(address: g1Wallet.address, size: 55),
|
||||||
title: Row(children: <Widget>[
|
title: Row(children: <Widget>[
|
||||||
Text(getShortPubkey(g1Wallet.address),
|
Text(getShortPubkey(g1Wallet.address),
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
|
@ -87,13 +85,9 @@ class ContactsList extends StatelessWidget {
|
||||||
MaterialPageRoute(builder: (context) {
|
MaterialPageRoute(builder: (context) {
|
||||||
walletsProfilesClass.address = g1Wallet.address;
|
walletsProfilesClass.address = g1Wallet.address;
|
||||||
return WalletViewScreen(
|
return WalletViewScreen(
|
||||||
address: g1Wallet.address,
|
address: g1Wallet.address,
|
||||||
username: duniterIndexer
|
username: duniterIndexer
|
||||||
.walletNameIndexer[g1Wallet.address],
|
.walletNameIndexer[g1Wallet.address]);
|
||||||
avatar: g1WalletsBox
|
|
||||||
.get(g1Wallet.address)
|
|
||||||
?.avatar,
|
|
||||||
);
|
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
|
|
|
@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:gecko/globals.dart';
|
import 'package:gecko/globals.dart';
|
||||||
import 'package:gecko/models/widgets_keys.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/duniter_indexer.dart';
|
||||||
import 'package:gecko/providers/substrate_sdk.dart';
|
import 'package:gecko/providers/substrate_sdk.dart';
|
||||||
import 'package:gecko/providers/wallet_options.dart';
|
import 'package:gecko/providers/wallet_options.dart';
|
||||||
|
@ -10,6 +9,7 @@ import 'package:gecko/providers/wallets_profiles.dart';
|
||||||
import 'package:gecko/screens/certifications.dart';
|
import 'package:gecko/screens/certifications.dart';
|
||||||
import 'package:gecko/widgets/balance.dart';
|
import 'package:gecko/widgets/balance.dart';
|
||||||
import 'package:gecko/widgets/certifications.dart';
|
import 'package:gecko/widgets/certifications.dart';
|
||||||
|
import 'package:gecko/widgets/cesium_avatar.dart';
|
||||||
import 'package:gecko/widgets/commons/offline_info.dart';
|
import 'package:gecko/widgets/commons/offline_info.dart';
|
||||||
import 'package:gecko/widgets/idty_status.dart';
|
import 'package:gecko/widgets/idty_status.dart';
|
||||||
import 'package:gecko/widgets/page_route_no_transition.dart';
|
import 'package:gecko/widgets/page_route_no_transition.dart';
|
||||||
|
@ -50,7 +50,7 @@ class HeaderProfile extends StatelessWidget {
|
||||||
));
|
));
|
||||||
}),
|
}),
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.only(left: 30, right: 40),
|
padding: const EdgeInsets.only(left: 30, right: 30),
|
||||||
child: Row(children: <Widget>[
|
child: Row(children: <Widget>[
|
||||||
Column(
|
Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
@ -107,9 +107,7 @@ class HeaderProfile extends StatelessWidget {
|
||||||
]),
|
]),
|
||||||
const Spacer(),
|
const Spacer(),
|
||||||
Column(children: <Widget>[
|
Column(children: <Widget>[
|
||||||
ClipOval(
|
CesiumAvatar(address: address, size: avatarSize),
|
||||||
child: defaultAvatar(avatarSize),
|
|
||||||
),
|
|
||||||
]),
|
]),
|
||||||
]),
|
]),
|
||||||
),
|
),
|
||||||
|
|
|
@ -4,13 +4,13 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:gecko/globals.dart';
|
import 'package:gecko/globals.dart';
|
||||||
import 'package:gecko/models/queries_indexer.dart';
|
import 'package:gecko/models/queries_indexer.dart';
|
||||||
import 'package:gecko/models/widgets_keys.dart';
|
import 'package:gecko/models/widgets_keys.dart';
|
||||||
import 'package:gecko/providers/cesium_plus.dart';
|
|
||||||
import 'package:gecko/providers/duniter_indexer.dart';
|
import 'package:gecko/providers/duniter_indexer.dart';
|
||||||
import 'package:gecko/providers/search.dart';
|
import 'package:gecko/providers/search.dart';
|
||||||
import 'package:gecko/providers/substrate_sdk.dart';
|
import 'package:gecko/providers/substrate_sdk.dart';
|
||||||
import 'package:gecko/providers/wallets_profiles.dart';
|
import 'package:gecko/providers/wallets_profiles.dart';
|
||||||
import 'package:gecko/screens/wallet_view.dart';
|
import 'package:gecko/screens/wallet_view.dart';
|
||||||
import 'package:gecko/widgets/balance.dart';
|
import 'package:gecko/widgets/balance.dart';
|
||||||
|
import 'package:gecko/widgets/cesium_avatar.dart';
|
||||||
import 'package:graphql_flutter/graphql_flutter.dart';
|
import 'package:graphql_flutter/graphql_flutter.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
@ -86,7 +86,8 @@ class SearchIdentityQuery extends StatelessWidget {
|
||||||
key: keySearchResult(profile['pubkey']),
|
key: keySearchResult(profile['pubkey']),
|
||||||
horizontalTitleGap: 40,
|
horizontalTitleGap: 40,
|
||||||
contentPadding: const EdgeInsets.all(5),
|
contentPadding: const EdgeInsets.all(5),
|
||||||
leading: defaultAvatar(avatarSize),
|
leading: CesiumAvatar(
|
||||||
|
address: profile['pubkey'], size: avatarSize),
|
||||||
title: Row(children: <Widget>[
|
title: Row(children: <Widget>[
|
||||||
Text(getShortPubkey(profile['pubkey']),
|
Text(getShortPubkey(profile['pubkey']),
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
|
@ -125,8 +126,6 @@ class SearchIdentityQuery extends StatelessWidget {
|
||||||
return WalletViewScreen(
|
return WalletViewScreen(
|
||||||
address: profile['pubkey'],
|
address: profile['pubkey'],
|
||||||
username: profile['name'],
|
username: profile['name'],
|
||||||
avatar:
|
|
||||||
g1WalletsBox.get(profile['pubkey'])?.avatar,
|
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
|
@ -3,13 +3,13 @@ import 'package:gecko/globals.dart';
|
||||||
import 'package:gecko/models/g1_wallets_list.dart';
|
import 'package:gecko/models/g1_wallets_list.dart';
|
||||||
import 'package:gecko/models/wallet_data.dart';
|
import 'package:gecko/models/wallet_data.dart';
|
||||||
import 'package:gecko/models/widgets_keys.dart';
|
import 'package:gecko/models/widgets_keys.dart';
|
||||||
import 'package:gecko/providers/cesium_plus.dart';
|
|
||||||
import 'package:gecko/providers/duniter_indexer.dart';
|
import 'package:gecko/providers/duniter_indexer.dart';
|
||||||
import 'package:gecko/providers/search.dart';
|
import 'package:gecko/providers/search.dart';
|
||||||
import 'package:gecko/providers/substrate_sdk.dart';
|
import 'package:gecko/providers/substrate_sdk.dart';
|
||||||
import 'package:gecko/providers/wallets_profiles.dart';
|
import 'package:gecko/providers/wallets_profiles.dart';
|
||||||
import 'package:gecko/screens/wallet_view.dart';
|
import 'package:gecko/screens/wallet_view.dart';
|
||||||
import 'package:gecko/widgets/balance.dart';
|
import 'package:gecko/widgets/balance.dart';
|
||||||
|
import 'package:gecko/widgets/cesium_avatar.dart';
|
||||||
import 'package:gecko/widgets/name_by_address.dart';
|
import 'package:gecko/widgets/name_by_address.dart';
|
||||||
import 'package:gecko/widgets/search_identity_query.dart';
|
import 'package:gecko/widgets/search_identity_query.dart';
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ class SearchResult extends StatelessWidget {
|
||||||
key: keySearchResult(g1Wallet.address),
|
key: keySearchResult(g1Wallet.address),
|
||||||
horizontalTitleGap: 40,
|
horizontalTitleGap: 40,
|
||||||
contentPadding: const EdgeInsets.all(5),
|
contentPadding: const EdgeInsets.all(5),
|
||||||
leading: defaultAvatar(avatarSize),
|
leading: CesiumAvatar(address: g1Wallet.address, size: avatarSize),
|
||||||
title: Row(children: <Widget>[
|
title: Row(children: <Widget>[
|
||||||
Text(getShortPubkey(g1Wallet.address),
|
Text(getShortPubkey(g1Wallet.address),
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
|
@ -101,7 +101,6 @@ class SearchResult extends StatelessWidget {
|
||||||
return WalletViewScreen(
|
return WalletViewScreen(
|
||||||
address: g1Wallet.address,
|
address: g1Wallet.address,
|
||||||
username: g1Wallet.username,
|
username: g1Wallet.username,
|
||||||
avatar: g1Wallet.avatar,
|
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
26
pubspec.lock
26
pubspec.lock
|
@ -298,7 +298,7 @@ packages:
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.3.3+7"
|
version: "0.3.3+7"
|
||||||
crypto:
|
crypto:
|
||||||
dependency: transitive
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: crypto
|
name: crypto
|
||||||
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
|
sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
|
||||||
|
@ -711,6 +711,14 @@ packages:
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.1.0"
|
version: "1.1.0"
|
||||||
|
hive_generator:
|
||||||
|
dependency: "direct dev"
|
||||||
|
description:
|
||||||
|
name: hive_generator
|
||||||
|
sha256: "06cb8f58ace74de61f63500564931f9505368f45f98958bd7a6c35ba24159db4"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "2.0.1"
|
||||||
html:
|
html:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -1411,6 +1419,22 @@ packages:
|
||||||
description: flutter
|
description: flutter
|
||||||
source: sdk
|
source: sdk
|
||||||
version: "0.0.99"
|
version: "0.0.99"
|
||||||
|
source_gen:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: source_gen
|
||||||
|
sha256: fc0da689e5302edb6177fdd964efcb7f58912f43c28c2047a808f5bfff643d16
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.4.0"
|
||||||
|
source_helper:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: source_helper
|
||||||
|
sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "1.3.4"
|
||||||
source_span:
|
source_span:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -59,12 +59,14 @@ dependencies:
|
||||||
tutorial_coach_mark: ^1.2.8
|
tutorial_coach_mark: ^1.2.8
|
||||||
confetti: ^0.7.0
|
confetti: ^0.7.0
|
||||||
url_launcher: ^6.1.11
|
url_launcher: ^6.1.11
|
||||||
|
crypto: ^3.0.3
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
# flutter_launcher_icons: ^0.9.2
|
# flutter_launcher_icons: ^0.9.2
|
||||||
# flutter_launcher_icons_maker: ^^0.10.2
|
# flutter_launcher_icons_maker: ^^0.10.2
|
||||||
icons_launcher: ^2.0.6
|
icons_launcher: ^2.0.6
|
||||||
build_runner: ^2.1.2
|
build_runner: ^2.1.2
|
||||||
|
hive_generator: ^2.0.1
|
||||||
flutter_lints: ^3.0.1
|
flutter_lints: ^3.0.1
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|
Loading…
Reference in New Issue