Skip to content
Snippets Groups Projects
Commit b0cae2b5 authored by poka's avatar poka
Browse files

improve membership renewal info

parent 23482990
No related branches found
No related tags found
No related merge requests found
...@@ -242,7 +242,9 @@ ...@@ -242,7 +242,9 @@
"renewMembership": "Renew my membership", "renewMembership": "Renew my membership",
"areYouSureYouWantToRenewMembership": "Are you sure you want to renew your membership ?", "areYouSureYouWantToRenewMembership": "Are you sure you want to renew your membership ?",
"membershipExpiredOn": "Membership expired on {}", "membershipExpiredOn": "Membership expired on {}",
"membershipExpiresOn": "Membership expires on {}", "membershipExpiresOnSimple": "Membership expires on {}",
"membershipExpiresOn": "Membership expires on {}, (renewable {} days before)",
"renewingMembership": "Renewing membership", "renewingMembership": "Renewing membership",
"membershipRenewalConfirmed": "Your membership renewal request has been registered and will be effective within a few minutes" "membershipRenewalConfirmed": "Your membership renewal request has been registered and will be effective within a few minutes",
"membershipRenewalPending": "Membership renewal in progress..."
} }
...@@ -243,7 +243,9 @@ ...@@ -243,7 +243,9 @@
"renewMembership": "Renovar mi adhésion", "renewMembership": "Renovar mi adhésion",
"areYouSureYouWantToRenewMembership": "¿Estás seguro de que quieres renovar tu adhésion?", "areYouSureYouWantToRenewMembership": "¿Estás seguro de que quieres renovar tu adhésion?",
"membershipExpiredOn": "Adhésion expirée el {}", "membershipExpiredOn": "Adhésion expirée el {}",
"membershipExpiresOn": "Adhésion expira el {}", "membershipExpiresOnSimple": "Adhésion expira el {}",
"membershipExpiresOn": "Adhésion expira el {}, (renovable {} días antes)",
"renewingMembership": "Renovando adhésion", "renewingMembership": "Renovando adhésion",
"membershipRenewalConfirmed": "Su solicitud de renovación de membresía ha sido registrada y será efectiva en unos minutos" "membershipRenewalConfirmed": "Su solicitud de renovación de membresía ha sido registrada y será efectiva en unos minutos",
"membershipRenewalPending": "Renovación de membresía en curso..."
} }
...@@ -242,7 +242,9 @@ ...@@ -242,7 +242,9 @@
"renewMembership": "Renouveler mon adhésion", "renewMembership": "Renouveler mon adhésion",
"areYouSureYouWantToRenewMembership": "Êtes-vous sûr de vouloir renouveler votre adhésion ?", "areYouSureYouWantToRenewMembership": "Êtes-vous sûr de vouloir renouveler votre adhésion ?",
"membershipExpiredOn": "Adhésion expirée le {}", "membershipExpiredOn": "Adhésion expirée le {}",
"membershipExpiresOn": "Adhésion expire le {}", "membershipExpiresOnSimple": "Adhésion expire le {}",
"membershipExpiresOn": "Adhésion expire le {} (renouvelable {} jours avant)",
"renewingMembership": "Renouvellement d'adhésion", "renewingMembership": "Renouvellement d'adhésion",
"membershipRenewalConfirmed": "Votre demande de renouvellement d'adhésion a bien été prise en compte et sera effective d'ici quelques minutes" "membershipRenewalConfirmed": "Votre demande de renouvellement d'adhésion a bien été prise en compte et sera effective d'ici quelques minutes",
"membershipRenewalPending": "Renouvellement d'adhésion en cours..."
} }
class MembershipStatus {
final DateTime? expireDate;
final bool hasPendingRenewal;
const MembershipStatus({
required this.expireDate,
required this.hasPendingRenewal,
});
}
...@@ -5,6 +5,7 @@ import 'package:flutter/foundation.dart'; ...@@ -5,6 +5,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/chest_data.dart';
import 'package:gecko/models/membership_status.dart';
import 'package:gecko/models/migrate_wallet_checks.dart'; import 'package:gecko/models/migrate_wallet_checks.dart';
import 'package:gecko/models/transaction_content.dart'; import 'package:gecko/models/transaction_content.dart';
import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_data.dart';
...@@ -139,10 +140,13 @@ class SubstrateSdk with ChangeNotifier { ...@@ -139,10 +140,13 @@ class SubstrateSdk with ChangeNotifier {
} }
} }
Future<int> _getStorageConst(String call) async { Future<List<int>> _getStorageConst(List<String> calls) async {
final result = (await sdk.webView!.evalJavascript('api.consts.$call', wrapPromise: false) ?? [null])[0]; final result = await sdk.webView!.evalJavascript(
'Object.values(Object.fromEntries([${calls.map((call) => '["$call", api.consts.$call[0]]').join(',')}]))',
wrapPromise: false,
);
return checkInt(result) ?? 0; return (result as List).map((dynamic value) => checkInt(value) ?? 0).toList();
} }
int? checkInt(dynamic value) { int? checkInt(dynamic value) {
...@@ -486,14 +490,19 @@ class SubstrateSdk with ChangeNotifier { ...@@ -486,14 +490,19 @@ class SubstrateSdk with ChangeNotifier {
'certPeriod': 'certification.certPeriod.words', 'certPeriod': 'certification.certPeriod.words',
'certMaxByIssuer': 'certification.maxByIssuer.words', 'certMaxByIssuer': 'certification.maxByIssuer.words',
'certValidityPeriod': 'certification.validityPeriod.words', 'certValidityPeriod': 'certification.validityPeriod.words',
'membershipRenewalPeriod': 'membership.membershipRenewalPeriod.words',
}; };
for (final param in currencyParametersNames.keys) {
try { try {
currencyParameters[param] = await _getStorageConst(currencyParametersNames[param]!); final values = await _getStorageConst(currencyParametersNames.values.toList());
} catch (e) {
log.e('error while getting param $param :: $e'); int i = 0;
for (final param in currencyParametersNames.keys) {
currencyParameters[param] = values[i];
i++;
} }
} catch (e) {
log.e('error while getting currency parameters: $e');
} }
log.i('currencyParameters: $currencyParameters'); log.i('currencyParameters: $currencyParameters');
} }
...@@ -1249,4 +1258,26 @@ newKeySig: $newKeySigType"""); ...@@ -1249,4 +1258,26 @@ newKeySig: $newKeySigType""");
_executeCall(transactionContent, txInfo, [], password); _executeCall(transactionContent, txInfo, [], password);
return transactionId; return transactionId;
} }
Future<MembershipStatus> getMembershipStatus(String address) async {
final idtyIndex = await _getIdentityIndexOf(address);
if (idtyIndex == null) return MembershipStatus(expireDate: null, hasPendingRenewal: false);
// Vérifier si une évaluation est en cours
final hasPendingRenewal = await _getStorage('distance.pendingEvaluationRequest($idtyIndex)') != null;
final expireOnMap = await _getStorage('membership.membership($idtyIndex)') ?? {};
final expireOn = expireOnMap['expireOn'] as int;
// Calculate time difference from current block (6 seconds per block)
final blockDifference = expireOn - blocNumber;
// Returns expiration date by adding (or subtracting if expired) time from now
final expireDate = DateTime.now().add(Duration(seconds: blockDifference * 6));
return MembershipStatus(
expireDate: expireDate,
hasPendingRenewal: hasPendingRenewal,
);
}
} }
...@@ -13,6 +13,7 @@ import 'package:gecko/screens/myWallets/migrate_identity.dart'; ...@@ -13,6 +13,7 @@ import 'package:gecko/screens/myWallets/migrate_identity.dart';
import 'package:gecko/screens/transaction_in_progress.dart'; import 'package:gecko/screens/transaction_in_progress.dart';
import 'package:gecko/widgets/commons/top_appbar.dart'; import 'package:gecko/widgets/commons/top_appbar.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:gecko/models/membership_status.dart';
class ManageMembership extends StatelessWidget { class ManageMembership extends StatelessWidget {
const ManageMembership({super.key, required this.address}); const ManageMembership({super.key, required this.address});
...@@ -28,11 +29,11 @@ class ManageMembership extends StatelessWidget { ...@@ -28,11 +29,11 @@ class ManageMembership extends StatelessWidget {
body: SafeArea( body: SafeArea(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
ScaledSizedBox(height: 20), ScaledSizedBox(height: 20),
FutureBuilder<DateTime?>( FutureBuilder<MembershipStatus>(
future: sub.membershipExpireIn(address), future: sub.getMembershipStatus(address),
builder: (context, snapshot) { builder: (context, snapshot) {
if (snapshot.hasData) { if (snapshot.hasData) {
return renewMembership(context, snapshot.data); return renewMembership(context, snapshot.data!);
} }
return const SizedBox.shrink(); return const SizedBox.shrink();
}, },
...@@ -138,14 +139,17 @@ class ManageMembership extends StatelessWidget { ...@@ -138,14 +139,17 @@ class ManageMembership extends StatelessWidget {
); );
} }
Widget renewMembership(BuildContext context, DateTime? expireIn) { Widget renewMembership(BuildContext context, MembershipStatus status) {
final sub = Provider.of<SubstrateSdk>(context, listen: false); final sub = Provider.of<SubstrateSdk>(context, listen: false);
if (expireIn == null) return const SizedBox.shrink(); if (status.expireDate == null) return const SizedBox.shrink();
final now = DateTime.now(); final now = DateTime.now();
final twoMonthsFromNow = now.add(const Duration(days: 60)); final renewalPeriodInSeconds = (sub.currencyParameters['membershipRenewalPeriod']!) * 6;
final isExpired = expireIn.isBefore(now); final renewalDate = status.expireDate!.subtract(Duration(seconds: renewalPeriodInSeconds));
final canRenew = expireIn.isBefore(twoMonthsFromNow); final renewalPeriodInDays = (renewalPeriodInSeconds / 86400).truncate();
final isExpired = status.expireDate!.isBefore(now);
final canRenew = now.isAfter(renewalDate) && !status.hasPendingRenewal;
return ScaledSizedBox( return ScaledSizedBox(
height: 75, height: 75,
...@@ -196,15 +200,22 @@ class ManageMembership extends StatelessWidget { ...@@ -196,15 +200,22 @@ class ManageMembership extends StatelessWidget {
color: canRenew ? null : Colors.grey[500], color: canRenew ? null : Colors.grey[500],
), ),
), ),
Text( SizedBox(
isExpired width: scaleSize(250),
? 'membershipExpiredOn'.tr(args: [DateFormat('dd/MM/yyyy').format(expireIn)]) child: Text(
: 'membershipExpiresOn'.tr(args: [DateFormat('dd/MM/yyyy').format(expireIn)]), status.hasPendingRenewal
? 'membershipRenewalPending'.tr()
: isExpired
? 'membershipExpiredOn'.tr(args: [DateFormat('dd/MM/yyyy').format(status.expireDate!)])
: canRenew
? 'membershipExpiresOnSimple'.tr(args: [DateFormat('dd/MM/yyyy').format(status.expireDate!)])
: 'membershipExpiresOn'.tr(args: [DateFormat('dd/MM/yyyy').format(status.expireDate!), renewalPeriodInDays.toString()]),
style: scaledTextStyle( style: scaledTextStyle(
fontSize: 12, fontSize: 12,
color: Colors.grey[500], color: Colors.grey[500],
), ),
), ),
),
], ],
), ),
], ],
......
...@@ -2,7 +2,7 @@ name: gecko ...@@ -2,7 +2,7 @@ name: gecko
description: Pay with G1. description: Pay with G1.
publish_to: "none" publish_to: "none"
version: 0.1.13+85 version: 0.1.14+86
environment: environment:
sdk: ^3.5.3 sdk: ^3.5.3
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment