received certs widget is working

This commit is contained in:
poka 2022-12-02 03:22:53 +01:00
parent 9a9bc6788c
commit 7a93ff4d78
11 changed files with 192 additions and 29 deletions

View File

@ -56,5 +56,14 @@ query ($address: String!, $number: Int!, $cursor: String) {
}
''';
// To parse indexer date format
// log.d(DateTime.parse("2022-06-13T16:51:24.001+00:00").toString());
const String getCertsReceived = r'''
query ($address: String!) {
certification(where: {receiver: {pubkey: {_eq: $address}}}) {
issuer {
pubkey
name
}
created_at
}
}
''';

View File

@ -61,6 +61,9 @@ const keyCloseTransactionScreen = Key('keyCloseTransactionScreen');
const keyListTransactions = Key('keyListTransactions');
const keyActivityScreen = Key('keyActivityScreen');
// Certification view
const keyCertsReceived = Key('keyCertsReceived');
// Unlock wallet
const keyUnlockWallet = Key('keyUnlockWallet');
const keyPinForm = Key('keyPinForm');

View File

@ -8,8 +8,6 @@ import 'package:path_provider/path_provider.dart';
class CesiumPlusProvider with ChangeNotifier {
TextEditingController cesiumName = TextEditingController();
Image defaultAvatar(double size) =>
Image.asset(('assets/icon_user.png'), height: size);
CancelToken avatarCancelToken = CancelToken();
@ -156,3 +154,6 @@ class CesiumPlusProvider with ChangeNotifier {
return finalAvatar;
}
}
Image defaultAvatar(double size) =>
Image.asset(('assets/icon_user.png'), height: size);

View File

@ -248,8 +248,6 @@ class DuniterIndexer with ChangeNotifier {
Widget searchIdentity(BuildContext context, String name) {
// WalletOptionsProvider _walletOptions =
// Provider.of<WalletOptionsProvider>(context, listen: false);
final cesiumPlusProvider =
Provider.of<CesiumPlusProvider>(context, listen: false);
WalletsProfilesProvider walletsProfiles =
Provider.of<WalletsProfilesProvider>(context, listen: false);
if (indexerEndpoint == '') {
@ -305,7 +303,7 @@ class DuniterIndexer with ChangeNotifier {
key: keySearchResult(profile['pubkey']),
horizontalTitleGap: 40,
contentPadding: const EdgeInsets.all(5),
leading: cesiumPlusProvider.defaultAvatar(avatarSize),
leading: defaultAvatar(avatarSize),
title: Row(children: <Widget>[
Text(getShortPubkey(profile['pubkey']),
style: const TextStyle(

View File

@ -187,9 +187,6 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier {
}
Widget getTransactionTile(BuildContext context, final duniterIndexer) {
final cesiumPlusProvider =
Provider.of<CesiumPlusProvider>(context, listen: false);
int keyID = 0;
String? dateDelimiter;
String? lastDateDelimiter;
@ -299,7 +296,7 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier {
contentPadding: const EdgeInsets.only(
left: 20, right: 30, top: 15, bottom: 15),
leading: ClipOval(
child: cesiumPlusProvider.defaultAvatar(avatarSize),
child: defaultAvatar(avatarSize),
),
title: Padding(
padding: const EdgeInsets.only(bottom: 5),

View File

@ -13,8 +13,6 @@ class CertificationsScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
// final _homeProvider = Provider.of<HomeProvider>(context);
return Scaffold(
backgroundColor: backgroundColor,
appBar: AppBar(
@ -27,7 +25,10 @@ class CertificationsScreen extends StatelessWidget {
body: SafeArea(
child: Column(children: <Widget>[
HeaderProfile(address: address, username: username),
const Text('Certifications reçus'),
CertsReceived(address: address),
const SizedBox(height: 15),
const Text('Certifications émises'),
CertsSent(address: address),
const SizedBox(height: 20),
]),

View File

@ -19,8 +19,6 @@ class ContactsScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final cesiumPlusProvider =
Provider.of<CesiumPlusProvider>(context, listen: false);
WalletsProfilesProvider walletsProfilesClass =
Provider.of<WalletsProfilesProvider>(context, listen: true);
HomeProvider homeProvider =
@ -72,8 +70,7 @@ class ContactsScreen extends StatelessWidget {
key: keySearchResult('keyID++'),
horizontalTitleGap: 40,
contentPadding: const EdgeInsets.all(5),
leading: cesiumPlusProvider
.defaultAvatar(avatarSize),
leading: defaultAvatar(avatarSize),
title: Row(children: <Widget>[
Text(getShortPubkey(g1Wallet.address),
style: const TextStyle(

View File

@ -21,8 +21,6 @@ class SearchResultScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
final searchProvider = Provider.of<SearchProvider>(context, listen: false);
final cesiumPlusProvider =
Provider.of<CesiumPlusProvider>(context, listen: false);
WalletsProfilesProvider walletsProfilesClass =
Provider.of<WalletsProfilesProvider>(context, listen: false);
HomeProvider homeProvider =
@ -94,8 +92,7 @@ class SearchResultScreen extends StatelessWidget {
key: keySearchResult(g1Wallet.address),
horizontalTitleGap: 40,
contentPadding: const EdgeInsets.all(5),
leading: cesiumPlusProvider
.defaultAvatar(avatarSize),
leading: defaultAvatar(avatarSize),
title: Row(children: <Widget>[
Text(getShortPubkey(g1Wallet.address),
style: const TextStyle(

View File

@ -38,8 +38,6 @@ class WalletViewScreen extends StatelessWidget {
Widget build(BuildContext context) {
WalletsProfilesProvider walletProfile =
Provider.of<WalletsProfilesProvider>(context, listen: false);
final cesiumPlusProvider =
Provider.of<CesiumPlusProvider>(context, listen: false);
walletProfile.address = address;
final sub = Provider.of<SubstrateSdk>(context, listen: false);
HomeProvider homeProvider =
@ -132,8 +130,7 @@ class WalletViewScreen extends StatelessWidget {
MaterialPageRoute(builder: (context) {
return ActivityScreen(
address: address,
avatar:
cesiumPlusProvider.defaultAvatar(50));
avatar: defaultAvatar(50));
}),
);
}),

View File

@ -1,4 +1,12 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
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/substrate_sdk.dart';
import 'package:gecko/screens/wallet_view.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
class CertsReceived extends StatelessWidget {
const CertsReceived({Key? key, required this.address}) : super(key: key);
@ -6,6 +14,163 @@ class CertsReceived extends StatelessWidget {
@override
Widget build(BuildContext context) {
return const Text('received');
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(getCertsReceived),
variables: <String, dynamic>{
'address': address,
},
),
builder: (QueryResult result, {fetchMore, refetch}) {
if (result.isLoading && result.data == null) {
return const Center(
child: CircularProgressIndicator(),
);
}
if (result.hasException || result.data == null) {
log.e('Error Indexer: ${result.exception}');
return Column(children: <Widget>[
const SizedBox(height: 50),
Text(
"noNetworkNoHistory".tr(),
textAlign: TextAlign.center,
style: const TextStyle(fontSize: 18),
)
]);
} else if (result.data?['certification']?.isEmpty) {
return Column(children: <Widget>[
const SizedBox(height: 50),
Text(
"noDataToDisplay".tr(),
style: const TextStyle(fontSize: 18),
)
]);
}
// Build history list
return Expanded(
child: ListView(
key: keyListTransactions,
children: <Widget>[certsView(result)],
),
);
// ListView(
// key: keyCertsReceived,
// children: <Widget>[
// certsView(result),
// ],
// );
},
),
);
}
Widget certsView(QueryResult result) {
List listCerts = [];
final List certsData = result.data!['certification'];
for (final cert in certsData) {
log.d(cert);
final String issuerAddress = cert['issuer']['pubkey'];
final String issuerName = cert['issuer']['name'];
final date = cert['created_at'];
listCerts
.add({'address': issuerAddress, 'name': issuerName, 'date': date});
}
return result.data == null
? Column(children: <Widget>[
const SizedBox(height: 50),
Text(
"noTransactionToDisplay".tr(),
style: const TextStyle(fontSize: 18),
)
])
: Column(children: <Widget>[
getCertsTile(listCerts),
]);
}
Widget getCertsTile(List listCerts) {
int keyID = 0;
const double avatarSize = 200;
return Column(
children: listCerts.map((repository) {
// log.d('bbbbbbbbbbbbbbbbbbbbbb: ' + repository.toString());
return Column(children: <Widget>[
Padding(
padding: const EdgeInsets.only(right: 0),
child:
// Row(children: [Column(children: [],)],)
ListTile(
key: keyTransaction(keyID++),
contentPadding: const EdgeInsets.only(
left: 20, right: 30, top: 15, bottom: 15),
leading: ClipOval(
child: defaultAvatar(avatarSize),
),
title: Padding(
padding: const EdgeInsets.only(bottom: 5),
child: Text(getShortPubkey(repository['address']),
style: const TextStyle(
fontSize: 18, fontFamily: 'Monospace')),
),
subtitle: RichText(
text: TextSpan(
style: TextStyle(
fontSize: 16,
color: Colors.grey[700],
),
children: <TextSpan>[
TextSpan(
text: 'dateForm',
),
if (repository[2] != '')
TextSpan(
text: ' · ',
style: TextStyle(
fontSize: 20,
color: Colors.grey[550],
),
),
TextSpan(
text: repository['name'],
style: TextStyle(
fontStyle: FontStyle.italic,
color: Colors.grey[600],
),
),
],
),
),
dense: false,
isThreeLine: false,
onTap: () {
Navigator.push(
homeContext,
MaterialPageRoute(builder: (context) {
return WalletViewScreen(address: repository['address']);
}),
);
}),
),
]);
}).toList());
}
}

View File

@ -25,8 +25,6 @@ class HeaderProfile extends StatelessWidget {
final walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false);
final cesiumPlusProvider =
Provider.of<CesiumPlusProvider>(context, listen: false);
return Stack(children: <Widget>[
Consumer<SubstrateSdk>(builder: (context, sub, _) {
@ -104,7 +102,7 @@ class HeaderProfile extends StatelessWidget {
const Spacer(),
Column(children: <Widget>[
ClipOval(
child: cesiumPlusProvider.defaultAvatar(avatarSize),
child: defaultAvatar(avatarSize),
),
const SizedBox(height: 25),
]),