(wip) feat: add datapod provider
This commit is contained in:
parent
760199b9f1
commit
75b30ab801
|
@ -26,6 +26,7 @@ import 'package:gecko/providers/duniter_indexer.dart';
|
|||
import 'package:gecko/providers/generate_wallets.dart';
|
||||
import 'package:gecko/providers/settings_provider.dart';
|
||||
import 'package:gecko/providers/substrate_sdk.dart';
|
||||
import 'package:gecko/providers/v2s_datapod.dart';
|
||||
import 'package:gecko/providers/wallets_profiles.dart';
|
||||
import 'package:gecko/providers/home.dart';
|
||||
import 'package:gecko/providers/my_wallets.dart';
|
||||
|
@ -133,7 +134,8 @@ class Gecko extends StatelessWidget {
|
|||
ChangeNotifierProvider(create: (_) => CesiumPlusProvider()),
|
||||
ChangeNotifierProvider(create: (_) => SubstrateSdk()),
|
||||
ChangeNotifierProvider(create: (_) => DuniterIndexer()),
|
||||
ChangeNotifierProvider(create: (_) => SettingsProvider())
|
||||
ChangeNotifierProvider(create: (_) => SettingsProvider()),
|
||||
ChangeNotifierProvider(create: (_) => V2sDatapodProvider())
|
||||
],
|
||||
child: MaterialApp(
|
||||
localizationsDelegates: context.localizationDelegates,
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
const String updateProfileQ = r'''
|
||||
mutation ($address: String!, $hash: String!, $signature: String!, $title: String, $description: String, $avatar: String, $geoloc: GeolocInput, $city: String, $socials: [SocialInput!]) {
|
||||
updateProfile(address: $address, hash: $hash, signature: $signature, title: $title, description: $description, avatarBase64: $avatar, geoloc: $geoloc, city: $city, socials: $socials) {
|
||||
message
|
||||
success
|
||||
}
|
||||
}
|
||||
''';
|
||||
|
||||
const String deleteProfileQ = r'''
|
||||
mutation ($address: String!, $hash: String!, $signature: String!) {
|
||||
deleteProfile(address: $address, hash: $hash, signature: $signature) {
|
||||
message
|
||||
success
|
||||
}
|
||||
}
|
||||
''';
|
||||
|
||||
const String migrateProfileQ = r'''
|
||||
mutation ($addressOld: String!, $addressNew: String!, $hash: String!, $signature: String!) {
|
||||
migrateProfile(addressOld: $addressOld, addressNew: $addressNew, hash: $hash, signature: $signature) {
|
||||
message
|
||||
success
|
||||
}
|
||||
}
|
||||
''';
|
|
@ -77,7 +77,7 @@ class CesiumPlusProvider with ChangeNotifier {
|
|||
final hashDocHex = hashDoc.toString().toUpperCase();
|
||||
|
||||
// Generate signature of document
|
||||
final signature = await sub.signCsPlusDocument(hashDocHex, address);
|
||||
final signature = await sub.signDatapod(hashDocHex, address);
|
||||
|
||||
// Build final document
|
||||
final Map<String, dynamic> data = {
|
||||
|
|
|
@ -136,7 +136,7 @@ class SubstrateSdk with ChangeNotifier {
|
|||
return res?.signature ?? '';
|
||||
}
|
||||
|
||||
Future<String> signCsPlusDocument(String document, String address) async {
|
||||
Future<String> signDatapod(String document, String address) async {
|
||||
final myWallets =
|
||||
Provider.of<MyWalletsProvider>(homeContext, listen: false);
|
||||
final messageToSign = Uint8List.fromList(document.codeUnits);
|
||||
|
|
|
@ -0,0 +1,125 @@
|
|||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
import 'package:crypto/crypto.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:gecko/globals.dart';
|
||||
import 'package:gecko/models/queries_datapod.dart';
|
||||
import 'package:gecko/providers/substrate_sdk.dart';
|
||||
import 'package:graphql_flutter/graphql_flutter.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class V2sDatapodProvider with ChangeNotifier {
|
||||
Future<QueryResult> _execQuery(
|
||||
String query, Map<String, dynamic> variables) async {
|
||||
final httpLink = HttpLink(
|
||||
// 'http://10.0.2.2:8080/v1/graphql',
|
||||
'https://gdev-datapod.p2p.legal/v1/graphql',
|
||||
);
|
||||
|
||||
final GraphQLClient client = GraphQLClient(
|
||||
cache: GraphQLCache(),
|
||||
link: httpLink,
|
||||
);
|
||||
|
||||
final QueryOptions options =
|
||||
QueryOptions(document: gql(query), variables: variables);
|
||||
|
||||
return await client.query(options);
|
||||
}
|
||||
|
||||
Future<bool> updateProfile(
|
||||
{required String address,
|
||||
String? title,
|
||||
String? description,
|
||||
String? avatar,
|
||||
String? city,
|
||||
List<Map<String, String>>? socials,
|
||||
Map<String, double>? geoloc}) async {
|
||||
final sub = Provider.of<SubstrateSdk>(homeContext, listen: false);
|
||||
|
||||
final messageToSign = jsonEncode({
|
||||
'address': address,
|
||||
'description': description,
|
||||
'avatarBase64': avatar,
|
||||
'geoloc': geoloc,
|
||||
'title': title,
|
||||
'city': city,
|
||||
'socials': socials
|
||||
});
|
||||
final hashDocBytes = utf8.encode(messageToSign);
|
||||
final hashDoc = sha256.convert(hashDocBytes).toString().toUpperCase();
|
||||
final signature = await sub.signDatapod(hashDoc, address);
|
||||
|
||||
final variables = <String, dynamic>{
|
||||
'address': address,
|
||||
'hash': hashDoc,
|
||||
'signature': signature,
|
||||
'title': title,
|
||||
'description': description,
|
||||
'avatar': avatar,
|
||||
'city': city,
|
||||
'socials': socials,
|
||||
'geoloc': geoloc,
|
||||
};
|
||||
final result = await _execQuery(updateProfileQ, variables);
|
||||
if (result.hasException) {
|
||||
log.e(result.exception.toString());
|
||||
return false;
|
||||
}
|
||||
log.d(result.data!['updateProfile']['message']);
|
||||
return true;
|
||||
}
|
||||
|
||||
Future<bool> deleteProfile({required String address}) async {
|
||||
final sub = Provider.of<SubstrateSdk>(homeContext, listen: false);
|
||||
|
||||
final messageToSign = jsonEncode({'address': address});
|
||||
final hashDocBytes = utf8.encode(messageToSign);
|
||||
final hashDoc = sha256.convert(hashDocBytes).toString().toUpperCase();
|
||||
final signature = await sub.signDatapod(hashDoc, address);
|
||||
|
||||
final variables = <String, dynamic>{
|
||||
'address': address,
|
||||
'hash': hashDoc,
|
||||
'signature': signature
|
||||
};
|
||||
final result = await _execQuery(deleteProfileQ, variables);
|
||||
if (result.hasException) {
|
||||
log.e(result.exception.toString());
|
||||
return false;
|
||||
}
|
||||
log.d(result.data!['deleteProfile']['message']);
|
||||
return true;
|
||||
}
|
||||
|
||||
Future<bool> migrateProfile(
|
||||
{required String addressOld, required String addressNew}) async {
|
||||
final sub = Provider.of<SubstrateSdk>(homeContext, listen: false);
|
||||
|
||||
final messageToSign =
|
||||
jsonEncode({'addressOld': addressOld, 'addressNew': addressNew});
|
||||
final hashDocBytes = utf8.encode(messageToSign);
|
||||
final hashDoc = sha256.convert(hashDocBytes).toString().toUpperCase();
|
||||
final signature = await sub.signDatapod(hashDoc, addressOld);
|
||||
|
||||
final variables = <String, dynamic>{
|
||||
'addressOld': addressOld,
|
||||
'addressNew': addressNew,
|
||||
'hash': hashDoc,
|
||||
'signature': signature
|
||||
};
|
||||
final result = await _execQuery(migrateProfileQ, variables);
|
||||
if (result.hasException) {
|
||||
log.e(result.exception.toString());
|
||||
return false;
|
||||
}
|
||||
log.d(result.data!['migrateProfile']['message']);
|
||||
return true;
|
||||
}
|
||||
|
||||
Future<bool> setAvatar(String address, String avatarPath) async {
|
||||
final avatarBytes = await File(avatarPath).readAsBytes();
|
||||
final avatarString = base64Encode(avatarBytes);
|
||||
return await updateProfile(address: address, avatar: avatarString);
|
||||
}
|
||||
}
|
|
@ -11,6 +11,7 @@ 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/providers/v2s_datapod.dart';
|
||||
import 'package:gecko/widgets/commons/common_elements.dart';
|
||||
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
|
||||
import 'package:gecko/screens/transaction_in_progress.dart';
|
||||
|
@ -110,6 +111,9 @@ class WalletOptionsProvider with ChangeNotifier {
|
|||
],
|
||||
);
|
||||
|
||||
final datapod =
|
||||
Provider.of<V2sDatapodProvider>(homeContext, listen: false);
|
||||
|
||||
final newPath = "${imageDirectory.path}/${pickedFile.name}";
|
||||
|
||||
if (croppedFile != null) {
|
||||
|
@ -119,6 +123,7 @@ class WalletOptionsProvider with ChangeNotifier {
|
|||
return '';
|
||||
}
|
||||
// await imageFile.copy(newPath);
|
||||
datapod.setAvatar(address.text, newPath);
|
||||
|
||||
log.i(newPath);
|
||||
return newPath;
|
||||
|
|
|
@ -8,6 +8,7 @@ import 'package:gecko/globals.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:gecko/models/widgets_keys.dart';
|
||||
import 'package:gecko/providers/search.dart';
|
||||
import 'package:gecko/providers/v2s_datapod.dart';
|
||||
import 'package:gecko/widgets/commons/common_elements.dart';
|
||||
import 'package:gecko/screens/search_result.dart';
|
||||
import 'package:gecko/screens/wallet_view.dart';
|
||||
|
@ -39,6 +40,25 @@ class _SearchScreenState extends State<SearchScreen> {
|
|||
void initState() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
||||
await getClipBoard();
|
||||
// final datapod = Provider.of<V2sDatapodProvider>(context, listen: false);
|
||||
|
||||
// datapod.updateProfile(
|
||||
// address: '5CQ8T4qpbYJq7uVsxGPQ5q2df7x3Wa4aRY6HUWMBYjfLZhnn',
|
||||
// // address: '5CJKhFCpdSpumgWjSZ3TQmejJuHV6iELJrtdrfs38SXuiQeB',
|
||||
// geoloc: {"latitude": 48.536883, "longitude": 2.661986},
|
||||
// title: 'Ta mère en string',
|
||||
// socials: [
|
||||
// {'type': "website", 'url': "https://tamere.com"}
|
||||
// ],
|
||||
// city: "Melun 77000",
|
||||
// description: 'new prof !');
|
||||
|
||||
// // datapod.deleteProfile(
|
||||
// // address: '5CJKhFCpdSpumgWjSZ3TQmejJuHV6iELJrtdrfs38SXuiQeB');
|
||||
|
||||
// // datapod.migrateProfile(
|
||||
// // addressOld: '5CJKhFCpdSpumgWjSZ3TQmejJuHV6iELJrtdrfs38SXuiQeB',
|
||||
// // addressNew: '5CQ8T4qpbYJq7uVsxGPQ5q2df7x3Wa4aRY6HUWMBYjfLZhnn');
|
||||
});
|
||||
super.initState();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue