From 92f5bc82eb0a3422144b5d4cd1a6005e22ec89b2 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Sun, 16 Feb 2025 09:24:29 +0100 Subject: [PATCH 01/10] [democracy] get network dependent democracy constants --- .../encointer/encointer_api.dart | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/app/lib/service/substrate_api/encointer/encointer_api.dart b/app/lib/service/substrate_api/encointer/encointer_api.dart index 590ca0219..de2c93293 100644 --- a/app/lib/service/substrate_api/encointer/encointer_api.dart +++ b/app/lib/service/substrate_api/encointer/encointer_api.dart @@ -4,6 +4,7 @@ import 'dart:math'; import 'package:convert/convert.dart' show hex; import 'package:encointer_wallet/config/consts.dart'; +import 'package:encointer_wallet/config/networks/networks.dart'; import 'package:encointer_wallet/mocks/mock_bazaar_data.dart'; import 'package:encointer_wallet/models/bazaar/account_business_tuple.dart'; import 'package:encointer_wallet/models/bazaar/business_identifier.dart'; @@ -807,6 +808,27 @@ class EncointerApi { } DemocracyParams democracyParams() { + return switch (store.settings.currentNetwork){ + Network.encointerKusama => encointerKusamaParams(), + Network.encointerRococo => encointerKusamaParams(), + Network.gesell => encointerSoloParams(), + Network.gesellDev => encointerSoloParams(), + }; + } + + DemocracyParams encointerSoloParams() { + final minTurnout = BigInt.one; + final confirmationPeriod = BigInt.from(300000); + final proposalLifetime = BigInt.from(1200000); + + return DemocracyParams( + minTurnout: minTurnout, + confirmationPeriod: confirmationPeriod, + proposalLifetime: proposalLifetime, + ); + } + + DemocracyParams encointerKusamaParams() { final minTurnout = encointerKusama.constant.encointerDemocracy.minTurnout; final confirmationPeriod = encointerKusama.constant.encointerDemocracy.confirmationPeriod; final proposalLifetime = encointerKusama.constant.encointerDemocracy.proposalLifetime; From 4f909b404a33780df5a99682b3ce6354e105fe37 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Sun, 16 Feb 2025 09:26:12 +0100 Subject: [PATCH 02/10] [democracy] remove constant height widget --- .../democracy/widgets/proposal_tile.dart | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/app/lib/page-encointer/democracy/widgets/proposal_tile.dart b/app/lib/page-encointer/democracy/widgets/proposal_tile.dart index 2d96c9a6f..c78f085e8 100644 --- a/app/lib/page-encointer/democracy/widgets/proposal_tile.dart +++ b/app/lib/page-encointer/democracy/widgets/proposal_tile.dart @@ -80,17 +80,13 @@ class _ProposalTileState extends State { ListTile( contentPadding: const EdgeInsets.symmetric(), leading: Text(widget.proposalId.toString(), style: titleSmall), - subtitle: SizedBox( - // ensure constant height even for missing texts without turnout. - height: 60, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text('${l10n.proposalTurnout}: $turnout / $electorateSize'), - if (turnout != 0) Text(l10n.proposalApprovalThreshold((threshold * 100).toStringAsFixed(2))), - if (turnout != 0) passingOrFailingText(context, proposal, tally, widget.params), - ], - ), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('${l10n.proposalTurnout}: $turnout / $electorateSize'), + if (turnout != 0) Text(l10n.proposalApprovalThreshold((threshold * 100).toStringAsFixed(2))), + if (turnout != 0) passingOrFailingText(context, proposal, tally, widget.params), + ], ), trailing: voteButtonOrProposalStatus(context), ), From e86d2acc7193555c6bc26a95ea3626e4adb7f4e6 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Sun, 16 Feb 2025 13:15:35 +0100 Subject: [PATCH 03/10] [democracy] add button that will close the proposal if the proposal has lived longer than its lifetime or has been in confirming long enough --- app/lib/page-encointer/democracy/helpers.dart | 16 ++++ .../democracy/widgets/proposal_tile.dart | 60 +++++++++--- .../widgets/update_proposal_button.dart | 95 +++++++++++++++++++ .../tx/lib/src/submit_tx_wrappers.dart | 28 ++++++ 4 files changed, 188 insertions(+), 11 deletions(-) create mode 100644 app/lib/page-encointer/democracy/widgets/update_proposal_button.dart diff --git a/app/lib/page-encointer/democracy/helpers.dart b/app/lib/page-encointer/democracy/helpers.dart index 3bcd9f725..77f165761 100644 --- a/app/lib/page-encointer/democracy/helpers.dart +++ b/app/lib/page-encointer/democracy/helpers.dart @@ -234,7 +234,23 @@ extension ProposalExt on Proposal { return state.runtimeType == SupersededBy || state.runtimeType == Rejected; } + /// Returns true if the proposal started after now - `duration`. bool isMoreRecentThan(Duration duration) { return DateTime.now().subtract(duration).isBefore(DateTime.fromMillisecondsSinceEpoch(start.toInt())); } + + /// Returns true if the proposal started before now - `duration`. + bool isOlderThan(Duration duration) { + return !isMoreRecentThan(duration); + } + + /// Returns true if the proposal has been in `Confirming` for longer than `duration`. + /// + /// Returns null if the proposal is not in confirming state at all. + bool? isConfirmingLongerThan(Duration duration) { + if (state.runtimeType != Confirming) return null; + + final confirmingSince = (state as Confirming).since; + return DateTime.now().subtract(duration).isAfter(DateTime.fromMillisecondsSinceEpoch(confirmingSince.toInt())); + } } diff --git a/app/lib/page-encointer/democracy/widgets/proposal_tile.dart b/app/lib/page-encointer/democracy/widgets/proposal_tile.dart index c78f085e8..4900f5ab4 100644 --- a/app/lib/page-encointer/democracy/widgets/proposal_tile.dart +++ b/app/lib/page-encointer/democracy/widgets/proposal_tile.dart @@ -1,5 +1,6 @@ import 'package:encointer_wallet/l10n/l10.dart'; import 'package:encointer_wallet/modules/modules.dart'; +import 'package:encointer_wallet/page-encointer/democracy/widgets/update_proposal_button.dart'; import 'package:encointer_wallet/service/service.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; @@ -171,18 +172,55 @@ class _ProposalTileState extends State { case Approved: return Text(l10n.proposalApproved, style: const TextStyle(color: Colors.green)); case Ongoing: + final proposalLifetime = Duration(milliseconds: widget.params.proposalLifetime.toInt()); + if (proposal.isOlderThan(proposalLifetime)) { + // confirmation time has passed + return SizedBox( + height: 50, + width: 60, + child: UpdateProposalButton( + proposalId: widget.proposalId, + onPressed: _updateState, + ), + ); + } else { + return SizedBox( + height: 50, + width: 60, + child: VoteButton( + proposal: proposal, + proposalId: widget.proposalId, + purposeId: widget.purposeId, + democracyParams: widget.params, + onPressed: _updateState, + ), + ); + } case Confirming: - return SizedBox( - height: 50, - width: 60, - child: VoteButton( - proposal: proposal, - proposalId: widget.proposalId, - purposeId: widget.purposeId, - democracyParams: widget.params, - onPressed: _updateState, - ), - ); + final confirmDuration = Duration(milliseconds: widget.params.confirmationPeriod.toInt()); + if (proposal.isConfirmingLongerThan(confirmDuration)!) { + // confirmation time has passed + return SizedBox( + height: 50, + width: 60, + child: UpdateProposalButton( + proposalId: widget.proposalId, + onPressed: _updateState, + ), + ); + } else { + return SizedBox( + height: 50, + width: 60, + child: VoteButton( + proposal: proposal, + proposalId: widget.proposalId, + purposeId: widget.purposeId, + democracyParams: widget.params, + onPressed: _updateState, + ), + ); + } default: // should never happen. return const Text('Unknown Proposal State'); diff --git a/app/lib/page-encointer/democracy/widgets/update_proposal_button.dart b/app/lib/page-encointer/democracy/widgets/update_proposal_button.dart new file mode 100644 index 000000000..e160da2dc --- /dev/null +++ b/app/lib/page-encointer/democracy/widgets/update_proposal_button.dart @@ -0,0 +1,95 @@ +import 'package:encointer_wallet/common/components/submit_button_cupertino.dart'; +import 'package:encointer_wallet/service/service.dart'; +import 'package:encointer_wallet/utils/alerts/app_alert.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +import 'package:encointer_wallet/common/components/submit_button.dart'; +import 'package:encointer_wallet/l10n/l10.dart'; +import 'package:encointer_wallet/service/tx/lib/tx.dart'; +import 'package:encointer_wallet/store/app.dart'; + +class UpdateProposalButton extends StatefulWidget { + const UpdateProposalButton({ + super.key, + required this.proposalId, + required this.onPressed, + }); + + final BigInt proposalId; + final void Function() onPressed; + + @override + State createState() => _UpdateProposalButtonState(); +} + +class _UpdateProposalButtonState extends State { + + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + // final l10n = context.l10n; + final store = context.read(); + + return SubmitButtonSmall( + onPressed: (context) async { + await _showSubmitUpdateProposalStateDialog(store, widget.proposalId); + widget.onPressed(); + }, + child: const Text('Update Proposal'), + ); + } + + Future _showSubmitUpdateProposalStateDialog(AppStore store, BigInt proposalId) { + final l10n = context.l10n; + + return AppAlert.showDialog( + context, + title: Text('${l10n.proposal} $proposalId'), + content: const Padding( + padding: EdgeInsets.only(top: 10), + child: Text('Update Proposal State'), + ), + actions: [ + Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + SubmitButtonCupertino( + onPressed: (BuildContext context) async { + await _submitUpdateProposalState(store); + Navigator.of(context).pop(); + }, + child: const Text('submit', style: TextStyle(color: Colors.green)), + ), + CupertinoButton( + onPressed: () => Navigator.of(context).pop(), + child: Text(l10n.cancel), + ), + ], + ), + ], + ), + ], + ); + } + + Future _submitUpdateProposalState(AppStore store) async { + await submitDemocracyUpdateProposalState( + context, + store, + webApi, + store.account.getKeyringAccount(store.account.currentAccountPubKey!), + widget.proposalId, + txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid), + ); + + setState(() {}); + } +} diff --git a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart index 3e15de786..bf080060e 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -456,6 +456,34 @@ Future submitDemocracyVote( ); } +Future submitDemocracyUpdateProposalState( + BuildContext context, + AppStore store, + Api api, + KeyringAccount signer, + BigInt proposalId, { + required CommunityIdentifier? txPaymentAsset, + }) async { + final call = api.encointer.encointerKusama.tx.encointerDemocracy.updateProposalState( + proposalId: proposalId, + ); + + final xt = await TxBuilder(api.provider).createSignedExtrinsic( + signer.pair, + call, + paymentAsset: txPaymentAsset?.toPolkadart(), + ); + + return submitTx( + context, + store, + api, + OpaqueExtrinsic(xt), + TxNotification.democracyVote(context.l10n), + ); +} + + Future submitDemocracyProposal( BuildContext context, AppStore store, From 74999134b4b7bdd5f97a05743624d6622672e8b7 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Sun, 16 Feb 2025 13:15:59 +0100 Subject: [PATCH 04/10] fmt --- .../democracy/widgets/update_proposal_button.dart | 1 - .../substrate_api/encointer/encointer_api.dart | 4 ++-- .../service/tx/lib/src/submit_tx_wrappers.dart | 15 +++++++-------- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/app/lib/page-encointer/democracy/widgets/update_proposal_button.dart b/app/lib/page-encointer/democracy/widgets/update_proposal_button.dart index e160da2dc..51f371c46 100644 --- a/app/lib/page-encointer/democracy/widgets/update_proposal_button.dart +++ b/app/lib/page-encointer/democracy/widgets/update_proposal_button.dart @@ -25,7 +25,6 @@ class UpdateProposalButton extends StatefulWidget { } class _UpdateProposalButtonState extends State { - @override void initState() { super.initState(); diff --git a/app/lib/service/substrate_api/encointer/encointer_api.dart b/app/lib/service/substrate_api/encointer/encointer_api.dart index de2c93293..70c116d1d 100644 --- a/app/lib/service/substrate_api/encointer/encointer_api.dart +++ b/app/lib/service/substrate_api/encointer/encointer_api.dart @@ -808,7 +808,7 @@ class EncointerApi { } DemocracyParams democracyParams() { - return switch (store.settings.currentNetwork){ + return switch (store.settings.currentNetwork) { Network.encointerKusama => encointerKusamaParams(), Network.encointerRococo => encointerKusamaParams(), Network.gesell => encointerSoloParams(), @@ -818,7 +818,7 @@ class EncointerApi { DemocracyParams encointerSoloParams() { final minTurnout = BigInt.one; - final confirmationPeriod = BigInt.from(300000); + final confirmationPeriod = BigInt.from(300000); final proposalLifetime = BigInt.from(1200000); return DemocracyParams( diff --git a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart index bf080060e..8af0e5c7f 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -457,13 +457,13 @@ Future submitDemocracyVote( } Future submitDemocracyUpdateProposalState( - BuildContext context, - AppStore store, - Api api, - KeyringAccount signer, - BigInt proposalId, { - required CommunityIdentifier? txPaymentAsset, - }) async { + BuildContext context, + AppStore store, + Api api, + KeyringAccount signer, + BigInt proposalId, { + required CommunityIdentifier? txPaymentAsset, +}) async { final call = api.encointer.encointerKusama.tx.encointerDemocracy.updateProposalState( proposalId: proposalId, ); @@ -483,7 +483,6 @@ Future submitDemocracyUpdateProposalState( ); } - Future submitDemocracyProposal( BuildContext context, AppStore store, From 5d52e451b03281d3f5c65abb0bb6253e237ba3ef Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Sun, 16 Feb 2025 13:28:56 +0100 Subject: [PATCH 05/10] localize update button --- app/lib/l10n/arb/app_de.arb | 3 +++ app/lib/l10n/arb/app_en.arb | 3 +++ app/lib/l10n/arb/app_fr.arb | 3 +++ app/lib/l10n/arb/app_ru.arb | 3 +++ app/lib/l10n/arb/app_sw.arb | 3 +++ .../democracy/widgets/update_proposal_button.dart | 12 ++++++------ 6 files changed, 21 insertions(+), 6 deletions(-) diff --git a/app/lib/l10n/arb/app_de.arb b/app/lib/l10n/arb/app_de.arb index 337ba604c..4f7ad6e22 100644 --- a/app/lib/l10n/arb/app_de.arb +++ b/app/lib/l10n/arb/app_de.arb @@ -240,6 +240,9 @@ "proposalFieldErrorPositiveNumberRange": "Muss eine positive Zahl sein", "proposalFieldErrorEnterInactivityTimeout": "Inaktivitätszeitlimit eingeben", "proposalFieldErrorPositiveIntegerRange": "Muss eine positive ganze Zahl sein", + "proposalClose": "Schliessen", + "proposalUpdateState": "Aktualisieren", + "proposalUpdateExplanation": "Dies wird den Status des Vorschlags aktualisieren. Wenn er zu alt ist und nicht genügend Aye-Stimmen hat, wird er abgelehnt. Wenn er lange genug bestätigt wurde, wird er angenommen.", "proposalOnlyBootstrappersOrReputablesCanSubmit": "Nur Bootstrappers oder Reputables können einen Vorschlag einreichen.", "proposalSubmit": "Vorschlag einreichen", "proposalSuperseded": "Verdrängt", diff --git a/app/lib/l10n/arb/app_en.arb b/app/lib/l10n/arb/app_en.arb index 714bb0134..6f2e539b0 100644 --- a/app/lib/l10n/arb/app_en.arb +++ b/app/lib/l10n/arb/app_en.arb @@ -241,6 +241,9 @@ "proposalFieldErrorEnterInactivityTimeout": "Enter inactivity timeout", "proposalFieldErrorPositiveIntegerRange": "Must be a positive integer", "proposalOnlyBootstrappersOrReputablesCanSubmit": "Only bootstrappers or reputables can submit a proposal.", + "proposalClose": "Close", + "proposalUpdateState": "Update", + "proposalUpdateExplanation": "This will update the proposal state. If it is too old and does not have enough Aye votes, it will be rejected. If it has been confirming long enough, it will pass.", "proposalSubmit": "Submit Proposal", "proposalSuperseded": "Superseded", "proposalRejected": "Rejected", diff --git a/app/lib/l10n/arb/app_fr.arb b/app/lib/l10n/arb/app_fr.arb index b45949d39..2f56e830d 100644 --- a/app/lib/l10n/arb/app_fr.arb +++ b/app/lib/l10n/arb/app_fr.arb @@ -241,6 +241,9 @@ "proposalFieldErrorEnterInactivityTimeout": "Entrez le délai d'inactivité", "proposalFieldErrorPositiveIntegerRange": "Doit être un entier positif", "proposalOnlyBootstrappersOrReputablesCanSubmit": "Seuls les bootstrappers ou les Reputables peuvent soumettre une proposition.", + "proposalClose": "Fermer", + "proposalUpdateState": "Mettre à jour", + "proposalUpdateExplanation": "Cela mettra à jour l'état de la proposition. Si elle est trop ancienne et n'a pas suffisamment de votes Aye, elle sera rejetée. Si elle a été confirmée assez longtemps, elle sera acceptée.", "proposalSubmit": "Soumettre une proposition", "proposalSuperseded": "Epargné", "proposalRejected": "Refusé", diff --git a/app/lib/l10n/arb/app_ru.arb b/app/lib/l10n/arb/app_ru.arb index 9136d7153..0b93befe7 100644 --- a/app/lib/l10n/arb/app_ru.arb +++ b/app/lib/l10n/arb/app_ru.arb @@ -241,6 +241,9 @@ "proposalFieldErrorEnterInactivityTimeout": "Введите тайм-аут неактивности", "proposalFieldErrorPositiveIntegerRange": "Должно быть положительное целое число", "proposalOnlyBootstrappersOrReputablesCanSubmit": "Только бутстраперы или уважаемые участники могут подать предложение.", + "proposalClose": "Закрыть", + "proposalUpdateState": "Обновить", + "proposalUpdateExplanation": "Это обновит статус предложения. Если оно слишком старое и не имеет достаточного количества голосов 'За', оно будет отклонено. Если оно подтверждается достаточно долго, оно будет принято.", "proposalSubmit": "Подать предложение", "proposalRejected": "Отменено", "proposalSuperseded": "заменен", diff --git a/app/lib/l10n/arb/app_sw.arb b/app/lib/l10n/arb/app_sw.arb index 90e55475d..f18b88875 100644 --- a/app/lib/l10n/arb/app_sw.arb +++ b/app/lib/l10n/arb/app_sw.arb @@ -241,6 +241,9 @@ "proposalFieldErrorEnterInactivityTimeout": "Weka muda wa kutokufanya kazi", "proposalFieldErrorPositiveIntegerRange": "Lazima iwe namba kamili chanya", "proposalOnlyBootstrappersOrReputablesCanSubmit": "Ni bootstrappers au waheshimika pekee wanaoweza kuwasilisha pendekezo.", + "proposalClose": "Funga", + "proposalUpdateState": "Sasisha", + "proposalUpdateExplanation": "Hii itasasisha hali ya pendekezo. Ikiwa ni la zamani sana na halina kura za kutosha za 'Ndio', litakataliwa. Ikiwa limekuwa likithibitishwa kwa muda wa kutosha, litakubaliwa.", "proposalSubmit": "Wasilisha Pendekezo", "proposalSuperseded": "Iliyopita", "proposalRejected": "Imekaataliwa", diff --git a/app/lib/page-encointer/democracy/widgets/update_proposal_button.dart b/app/lib/page-encointer/democracy/widgets/update_proposal_button.dart index 51f371c46..2442b4e31 100644 --- a/app/lib/page-encointer/democracy/widgets/update_proposal_button.dart +++ b/app/lib/page-encointer/democracy/widgets/update_proposal_button.dart @@ -32,7 +32,7 @@ class _UpdateProposalButtonState extends State { @override Widget build(BuildContext context) { - // final l10n = context.l10n; + final l10n = context.l10n; final store = context.read(); return SubmitButtonSmall( @@ -40,7 +40,7 @@ class _UpdateProposalButtonState extends State { await _showSubmitUpdateProposalStateDialog(store, widget.proposalId); widget.onPressed(); }, - child: const Text('Update Proposal'), + child: Text(l10n.proposalClose), ); } @@ -50,9 +50,9 @@ class _UpdateProposalButtonState extends State { return AppAlert.showDialog( context, title: Text('${l10n.proposal} $proposalId'), - content: const Padding( - padding: EdgeInsets.only(top: 10), - child: Text('Update Proposal State'), + content: Padding( + padding: const EdgeInsets.only(top: 10), + child: Text(l10n.proposalUpdateExplanation), ), actions: [ Column( @@ -65,7 +65,7 @@ class _UpdateProposalButtonState extends State { await _submitUpdateProposalState(store); Navigator.of(context).pop(); }, - child: const Text('submit', style: TextStyle(color: Colors.green)), + child: Text(l10n.proposalUpdateState, style: const TextStyle(color: Colors.green)), ), CupertinoButton( onPressed: () => Navigator.of(context).pop(), From ed3a516316d559cadeacbc9242d19f3945958fdd Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Sun, 16 Feb 2025 13:35:27 +0100 Subject: [PATCH 06/10] add tx notification for updating the proposal state --- app/lib/l10n/arb/app_de.arb | 2 ++ app/lib/l10n/arb/app_en.arb | 2 ++ app/lib/l10n/arb/app_fr.arb | 2 ++ app/lib/l10n/arb/app_ru.arb | 2 ++ app/lib/l10n/arb/app_sw.arb | 2 ++ app/lib/service/tx/lib/src/submit_tx_wrappers.dart | 2 +- app/lib/service/tx/lib/src/tx_notification.dart | 5 +++++ 7 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/lib/l10n/arb/app_de.arb b/app/lib/l10n/arb/app_de.arb index 4f7ad6e22..304119b02 100644 --- a/app/lib/l10n/arb/app_de.arb +++ b/app/lib/l10n/arb/app_de.arb @@ -93,6 +93,8 @@ "democracyVotedNotificationTitle": "Abgestimmt", "democracySubmitProposalNotificationBody": "Du hast einen Vorschlag eingereicht, über den nun abgestimmt werden kann.", "democracySubmitProposalNotificationTitle": "Vorschlag eingereicht", + "democracyUpdatedProposalStateNotificationBody": "Du hast diesen Vorschlag aktualisiert", + "democracyUpdatedProposalStateNotificationTitle": "Vorschlag aktualisiert", "detail": "Detail", "detailsEnter": "Gib deine Details ein.", "developer": "Entwickler-Modus", diff --git a/app/lib/l10n/arb/app_en.arb b/app/lib/l10n/arb/app_en.arb index 6f2e539b0..a47697df2 100644 --- a/app/lib/l10n/arb/app_en.arb +++ b/app/lib/l10n/arb/app_en.arb @@ -91,6 +91,8 @@ "democracyDiscussion": "Discuss proposals in the Forum!", "democracyVotedNotificationBody": "You have voted for this proposal.", "democracyVotedNotificationTitle": "Voted", + "democracyUpdatedProposalStateNotificationBody": "You have updated this proposal", + "democracyUpdatedProposalStateNotificationTitle": "Proposal Updated", "democracySubmitProposalNotificationBody": "You made a proposal, which people can vote on now.", "democracySubmitProposalNotificationTitle": "Proposal submitted", "detail": "Detail", diff --git a/app/lib/l10n/arb/app_fr.arb b/app/lib/l10n/arb/app_fr.arb index 2f56e830d..26277c3a0 100644 --- a/app/lib/l10n/arb/app_fr.arb +++ b/app/lib/l10n/arb/app_fr.arb @@ -91,6 +91,8 @@ "democracyDiscussion": "Discute de suggestions dans le forum!", "democracyVotedNotificationBody": "Tu as voté pour cette proposition.", "democracyVotedNotificationTitle": "Voté", + "democracyUpdatedProposalStateNotificationBody": "Vous avez mis à jour cette proposition", + "democracyUpdatedProposalStateNotificationTitle": "Proposition mise à jour", "democracySubmitProposalNotificationBody": "Vous avez fait une proposition, sur laquelle les gens peuvent voter maintenant.", "democracySubmitProposalNotificationTitle": "Proposition soumise", "detail": "Détail", diff --git a/app/lib/l10n/arb/app_ru.arb b/app/lib/l10n/arb/app_ru.arb index 0b93befe7..d1621ff75 100644 --- a/app/lib/l10n/arb/app_ru.arb +++ b/app/lib/l10n/arb/app_ru.arb @@ -93,6 +93,8 @@ "democracyVotedNotificationTitle": "проголосовали", "democracySubmitProposalNotificationBody": "Вы внесли предложение, за которое люди могут проголосовать прямо сейчас.", "democracySubmitProposalNotificationTitle": "Предложение отправлено", + "democracyUpdatedProposalStateNotificationBody": "Вы обновили это предложение", + "democracyUpdatedProposalStateNotificationTitle": "Предложение обновлено", "detail": "Детали", "detailsEnter": "Введите свои данные", "developer": "Режим разработчика", diff --git a/app/lib/l10n/arb/app_sw.arb b/app/lib/l10n/arb/app_sw.arb index f18b88875..808336d25 100644 --- a/app/lib/l10n/arb/app_sw.arb +++ b/app/lib/l10n/arb/app_sw.arb @@ -93,6 +93,8 @@ "democracyVotedNotificationTitle": "Umepiga kura", "democracySubmitProposalNotificationBody": "Ulitoa pendekezo, ambalo watu wanaweza kulipigia kura sasa.", "democracySubmitProposalNotificationTitle": "Pendekezo limewasilishwa", + "democracyUpdatedProposalStateNotificationBody": "Umesasisha pendekezo hili", + "democracyUpdatedProposalStateNotificationTitle": "Pendekezo limesasishwa", "detail": "Taarifa", "detailsEnter": "ingiza taarifa zako.", "developer": "Developer mode", diff --git a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart index 8af0e5c7f..31b27868c 100644 --- a/app/lib/service/tx/lib/src/submit_tx_wrappers.dart +++ b/app/lib/service/tx/lib/src/submit_tx_wrappers.dart @@ -479,7 +479,7 @@ Future submitDemocracyUpdateProposalState( store, api, OpaqueExtrinsic(xt), - TxNotification.democracyVote(context.l10n), + TxNotification.democracyUpdateProposalState(context.l10n), ); } diff --git a/app/lib/service/tx/lib/src/tx_notification.dart b/app/lib/service/tx/lib/src/tx_notification.dart index 3512a6366..599a4a5ef 100644 --- a/app/lib/service/tx/lib/src/tx_notification.dart +++ b/app/lib/service/tx/lib/src/tx_notification.dart @@ -27,6 +27,11 @@ class TxNotification { body: l10n.democracyVotedNotificationBody, ); + factory TxNotification.democracyUpdateProposalState(AppLocalizations l10n) => TxNotification( + title: l10n.democracyUpdatedProposalStateNotificationTitle, + body: l10n.democracyUpdatedProposalStateNotificationBody, + ); + factory TxNotification.democracySubmitProposal(AppLocalizations l10n) => TxNotification( title: l10n.democracySubmitProposalNotificationTitle, body: l10n.democracySubmitProposalNotificationBody, From b19bb1e71f4d242b36cf37156af43b71b519bf30 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Sun, 16 Feb 2025 13:44:39 +0100 Subject: [PATCH 07/10] log extrinsic error --- app/lib/service/tx/lib/src/submit_to_inner.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/lib/service/tx/lib/src/submit_to_inner.dart b/app/lib/service/tx/lib/src/submit_to_inner.dart index 6cc149c1f..a961fff6b 100644 --- a/app/lib/service/tx/lib/src/submit_to_inner.dart +++ b/app/lib/service/tx/lib/src/submit_to_inner.dart @@ -48,6 +48,7 @@ Future submitTxInner( ); if (report.isExtrinsicFailed) { + Log.e('[TX] Extrinsic Failed: ${report.dispatchError!.toJson()}'); _onTxError(store); onError?.call(report.dispatchError!); final message = getLocalizedTxErrorMessage(l10n, report.dispatchError!); @@ -86,6 +87,8 @@ void _showErrorDialog(BuildContext context, ErrorNotificationMsg message) { final l10n = context.l10n; final languageCode = Localizations.localeOf(context).languageCode; + print('Should show error dialog'); + AppAlert.showDialog( context, title: Text(message.title), From 71409f8e949b1654db02ae6ac5dc0a4cedb42ff6 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Sun, 16 Feb 2025 13:52:57 +0100 Subject: [PATCH 08/10] add minor horizontal padding to submitButtonSmall --- app/lib/common/components/submit_button.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/common/components/submit_button.dart b/app/lib/common/components/submit_button.dart index dd3bc6d9d..e7516a808 100644 --- a/app/lib/common/components/submit_button.dart +++ b/app/lib/common/components/submit_button.dart @@ -74,7 +74,7 @@ class _SubmitButtonStateSmall extends State { return ElevatedButton( onPressed: (!_submitting && widget.onPressed != null) ? _onPressed : null, style: ElevatedButton.styleFrom( - padding: const EdgeInsets.symmetric(vertical: 14), + padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 4), backgroundColor: context.colorScheme.primary, foregroundColor: Colors.white, textStyle: context.titleSmall, From bad27922cbd3f2d5bff9a057145f7e57838c8329 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Sun, 16 Feb 2025 13:56:47 +0100 Subject: [PATCH 09/10] fmt --- app/lib/service/tx/lib/src/tx_notification.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/lib/service/tx/lib/src/tx_notification.dart b/app/lib/service/tx/lib/src/tx_notification.dart index 599a4a5ef..5fb6a7e27 100644 --- a/app/lib/service/tx/lib/src/tx_notification.dart +++ b/app/lib/service/tx/lib/src/tx_notification.dart @@ -28,9 +28,9 @@ class TxNotification { ); factory TxNotification.democracyUpdateProposalState(AppLocalizations l10n) => TxNotification( - title: l10n.democracyUpdatedProposalStateNotificationTitle, - body: l10n.democracyUpdatedProposalStateNotificationBody, - ); + title: l10n.democracyUpdatedProposalStateNotificationTitle, + body: l10n.democracyUpdatedProposalStateNotificationBody, + ); factory TxNotification.democracySubmitProposal(AppLocalizations l10n) => TxNotification( title: l10n.democracySubmitProposalNotificationTitle, From fbe66ba05bf0422dd9597e1103bd611e6bee0f90 Mon Sep 17 00:00:00 2001 From: clangenb <37865735+clangenb@users.noreply.github.com> Date: Sun, 16 Feb 2025 13:59:09 +0100 Subject: [PATCH 10/10] fix comment --- app/lib/page-encointer/democracy/widgets/proposal_tile.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/lib/page-encointer/democracy/widgets/proposal_tile.dart b/app/lib/page-encointer/democracy/widgets/proposal_tile.dart index 4900f5ab4..c4be4c663 100644 --- a/app/lib/page-encointer/democracy/widgets/proposal_tile.dart +++ b/app/lib/page-encointer/democracy/widgets/proposal_tile.dart @@ -174,7 +174,7 @@ class _ProposalTileState extends State { case Ongoing: final proposalLifetime = Duration(milliseconds: widget.params.proposalLifetime.toInt()); if (proposal.isOlderThan(proposalLifetime)) { - // confirmation time has passed + // Proposal lifetime has passed; proposal has expired. return SizedBox( height: 50, width: 60,