Skip to content

Commit 7b6e0e8

Browse files
authored
[democracy] updating the proposal state of an already updated proposal does properly pop the confirm dialog (#1764)
* [submit_tx] expose onFinish and onError for all transactions * [submit_tx] caller decides if the error dialog should be shown. * [submit_tx] add issue number to todo * fmt
1 parent 2dbc910 commit 7b6e0e8

File tree

11 files changed

+96
-4
lines changed

11 files changed

+96
-4
lines changed

app/lib/page-encointer/ceremony_box/ceremony_box.dart

+10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import 'dart:async';
22

3+
import 'package:encointer_wallet/service/tx/lib/src/error_notifications.dart';
4+
import 'package:encointer_wallet/service/tx/lib/src/submit_to_inner.dart';
35
import 'package:ew_test_keys/ew_test_keys.dart';
46
import 'package:flutter/cupertino.dart';
57
import 'package:flutter/material.dart';
@@ -84,6 +86,10 @@ class CeremonyBox extends StatelessWidget {
8486
store.account.getKeyringAccount(store.account.currentAccountPubKey!),
8587
store.encointer.chosenCid!,
8688
txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid),
89+
onError: (dispatchError) {
90+
final message = getLocalizedTxErrorMessage(context.l10n, dispatchError);
91+
showTxErrorDialog(context, message);
92+
},
8793
);
8894
}),
8995
),
@@ -131,6 +137,10 @@ class CeremonyBox extends StatelessWidget {
131137
store.account.getKeyringAccount(store.account.currentAccountPubKey!),
132138
store.encointer.chosenCid!,
133139
txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid),
140+
onError: (dispatchError) {
141+
final message = getLocalizedTxErrorMessage(context.l10n, dispatchError);
142+
showTxErrorDialog(context, message);
143+
},
134144
),
135145
),
136146
)

app/lib/page-encointer/ceremony_box/components/unregister_link_button.dart

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'package:encointer_wallet/service/tx/lib/src/error_notifications.dart';
2+
import 'package:encointer_wallet/service/tx/lib/src/submit_to_inner.dart';
13
import 'package:ew_test_keys/ew_test_keys.dart';
24
import 'package:flutter/cupertino.dart';
35
import 'package:flutter/material.dart';
@@ -41,6 +43,10 @@ class _UnregisteredLinkButtonState extends State<UnregisteredLinkButton> {
4143
store.encointer.chosenCid!,
4244
lastProofOfAttendance: lastProofOfAttendance,
4345
txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid),
46+
onError: (dispatchError) {
47+
final message = getLocalizedTxErrorMessage(context.l10n, dispatchError);
48+
showTxErrorDialog(context, message);
49+
},
4450
);
4551

4652
setState(() {

app/lib/page-encointer/democracy/proposal_page/propose_page.dart

+7
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import 'package:encointer_wallet/common/components/address_input_field.dart';
55
import 'package:encointer_wallet/common/components/submit_button.dart';
66
import 'package:encointer_wallet/page-encointer/democracy/proposal_page/helpers.dart';
77
import 'package:encointer_wallet/service/substrate_api/api.dart';
8+
import 'package:encointer_wallet/service/tx/lib/src/error_notifications.dart';
9+
import 'package:encointer_wallet/service/tx/lib/src/submit_to_inner.dart';
810
import 'package:encointer_wallet/service/tx/lib/tx.dart';
911
import 'package:encointer_wallet/store/account/types/account_data.dart';
1012
import 'package:encointer_wallet/store/app.dart';
@@ -550,6 +552,7 @@ class _ProposePageState extends State<ProposePage> {
550552
/// Handles form submission
551553
Future<void> _submitProposal() async {
552554
final store = context.read<AppStore>();
555+
final l10n = context.l10n;
553556

554557
if (_formKey.currentState!.validate()) {
555558
final action = getProposalAction(store);
@@ -561,6 +564,10 @@ class _ProposePageState extends State<ProposePage> {
561564
store.account.getKeyringAccount(store.account.currentAccountPubKey!),
562565
action,
563566
txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid),
567+
onError: (dispatchError) {
568+
final message = getLocalizedTxErrorMessage(l10n, dispatchError);
569+
showTxErrorDialog(context, message);
570+
},
564571
);
565572
}
566573
}

app/lib/page-encointer/democracy/widgets/update_proposal_button.dart

+1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ class _UpdateProposalButtonState extends State<UpdateProposalButton> {
8787
store.account.getKeyringAccount(store.account.currentAccountPubKey!),
8888
widget.proposalId,
8989
txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid),
90+
onError: (error) => Log.p('[updateProposal] error updating the proposal: ${error}'),
9091
);
9192

9293
setState(() {});

app/lib/page-encointer/meetup/ceremony_step3_finish.dart

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'package:encointer_wallet/service/tx/lib/src/error_notifications.dart';
2+
import 'package:encointer_wallet/service/tx/lib/src/submit_to_inner.dart';
13
import 'package:ew_test_keys/ew_test_keys.dart';
24
import 'package:flutter/material.dart';
35
import 'package:flutter_mobx/flutter_mobx.dart';
@@ -100,6 +102,10 @@ class CeremonyStep3Finish extends StatelessWidget {
100102
store.account.getKeyringAccount(store.account.currentAccountPubKey!),
101103
store.encointer.chosenCid!,
102104
txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid),
105+
onError: (dispatchError) {
106+
final message = getLocalizedTxErrorMessage(l10n, dispatchError);
107+
showTxErrorDialog(context, message);
108+
},
103109
),
104110
);
105111
} else {

app/lib/page/assets/index.dart

+6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import 'dart:async';
22
import 'dart:math';
33

4+
import 'package:encointer_wallet/service/tx/lib/src/error_notifications.dart';
5+
import 'package:encointer_wallet/service/tx/lib/src/submit_to_inner.dart';
46
import 'package:ew_test_keys/ew_test_keys.dart';
57
import 'package:flutter/cupertino.dart';
68
import 'package:flutter/material.dart';
@@ -267,6 +269,10 @@ class _AssetsViewState extends State<AssetsView> {
267269
store.account.getKeyringAccount(store.account.currentAccountPubKey!),
268270
widget.store.encointer.chosenCid!,
269271
txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid),
272+
onError: (dispatchError) {
273+
final message = getLocalizedTxErrorMessage(context.l10n, dispatchError);
274+
showTxErrorDialog(context, message);
275+
},
270276
),
271277
);
272278
} else {

app/lib/page/profile/account/faucet_list_tile.dart

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'package:encointer_wallet/service/tx/lib/src/error_notifications.dart';
2+
import 'package:encointer_wallet/service/tx/lib/src/submit_to_inner.dart';
13
import 'package:flutter/cupertino.dart';
24
import 'package:flutter/material.dart';
35

@@ -144,6 +146,10 @@ class _FaucetListTileState extends State<FaucetListTile> {
144146
e.value,
145147
e.key,
146148
txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid),
149+
onError: (dispatchError) {
150+
final message = getLocalizedTxErrorMessage(context.l10n, dispatchError);
151+
showTxErrorDialog(context, message);
152+
},
147153
);
148154
}
149155
}

app/lib/page/profile/account/remark.dart

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'package:encointer_wallet/service/tx/lib/src/error_notifications.dart';
2+
import 'package:encointer_wallet/service/tx/lib/src/submit_to_inner.dart';
13
import 'package:flutter/material.dart';
24

35
import 'package:encointer_wallet/store/app.dart';
@@ -82,6 +84,10 @@ class Remarks extends StatelessWidget {
8284
store.account.getKeyringAccount(store.account.currentAccountPubKey!),
8385
remark,
8486
txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid),
87+
onError: (dispatchError) {
88+
final message = getLocalizedTxErrorMessage(context.l10n, dispatchError);
89+
showTxErrorDialog(context, message);
90+
},
8591
);
8692
}
8793
}

app/lib/page/profile/contacts/contact_detail_page.dart

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'package:encointer_wallet/service/tx/lib/src/error_notifications.dart';
2+
import 'package:encointer_wallet/service/tx/lib/src/submit_to_inner.dart';
13
import 'package:flutter/cupertino.dart';
24
import 'package:flutter/material.dart';
35
import 'package:flutter_mobx/flutter_mobx.dart';
@@ -296,6 +298,10 @@ class EndorseButton extends StatelessWidget {
296298
store.encointer.chosenCid!,
297299
Address.decode(address),
298300
txPaymentAsset: store.encointer.getTxPaymentAsset(store.encointer.chosenCid),
301+
onError: (dispatchError) {
302+
final message = getLocalizedTxErrorMessage(context.l10n, dispatchError);
303+
showTxErrorDialog(context, message);
304+
},
299305
);
300306
}
301307
}

app/lib/service/tx/lib/src/submit_to_inner.dart

+2-4
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@ Future<void> submitTxInner(
5151
Log.e('[TX] Extrinsic Failed: ${report.dispatchError!.toJson()}');
5252
_onTxError(store);
5353
onError?.call(report.dispatchError!);
54-
final message = getLocalizedTxErrorMessage(l10n, report.dispatchError!);
55-
_showErrorDialog(context, message);
5654
} else {
5755
_onTxFinish(context, store, report, onTxFinishFn);
5856
}
@@ -65,7 +63,7 @@ Future<void> submitTxInner(
6563
} else if (e.toString().contains(insufficientFundsError)) {
6664
msg = ErrorNotificationMsg(title: l10n.insufficientFundsErrorTitle, body: l10n.insufficientFundsErrorBody);
6765
}
68-
_showErrorDialog(context, msg);
66+
showTxErrorDialog(context, msg);
6967
}
7068
} else {
7169
_showTxStatusSnackBar(l10n.txQueuedOffline, null);
@@ -83,7 +81,7 @@ void _onTxError(AppStore store) {
8381
store.assets.setSubmitting(false);
8482
}
8583

86-
void _showErrorDialog(BuildContext context, ErrorNotificationMsg message) {
84+
void showTxErrorDialog(BuildContext context, ErrorNotificationMsg message) {
8785
final l10n = context.l10n;
8886
final languageCode = Localizations.localeOf(context).languageCode;
8987

app/lib/service/tx/lib/src/submit_tx_wrappers.dart

+40
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ Future<void> submitClaimRewards(
7070
KeyringAccount signer,
7171
CommunityIdentifier chosenCid, {
7272
required CommunityIdentifier? txPaymentAsset,
73+
// todo: #1763
74+
// dynamic Function(BuildContext txPageContext, ExtrinsicReport report)? onFinish,
75+
void Function(DispatchError report)? onError,
7376
}) async {
7477
// meetupIndex = null; the chain will figure out the meetup index.
7578
final call = api.encointer.encointerKusama.tx.encointerCeremonies.claimRewards(cid: chosenCid.toPolkadart());
@@ -85,6 +88,7 @@ Future<void> submitClaimRewards(
8588
api,
8689
OpaqueExtrinsic(xt),
8790
TxNotification.claimRewards(context.l10n),
91+
onError: onError,
8892
onFinish: (BuildContext txPageContext, ExtrinsicReport report) {
8993
// Claiming the rewards creates a new reputation if successful.
9094
// Hence, we should update the state afterwards.
@@ -102,6 +106,8 @@ Future<void> submitRemark(
102106
KeyringAccount signer,
103107
String remark, {
104108
required CommunityIdentifier? txPaymentAsset,
109+
dynamic Function(BuildContext txPageContext, ExtrinsicReport report)? onFinish,
110+
void Function(DispatchError report)? onError,
105111
}) async {
106112
final remarkList = remark.codeUnits;
107113
final call = api.encointer.encointerKusama.tx.system.remarkWithEvent(remark: remarkList);
@@ -117,6 +123,8 @@ Future<void> submitRemark(
117123
api,
118124
OpaqueExtrinsic(xt),
119125
TxNotification.remark(context.l10n),
126+
onFinish: onFinish,
127+
onError: onError,
120128
);
121129
}
122130

@@ -128,6 +136,9 @@ Future<void> submitEndorseNewcomer(
128136
CommunityIdentifier chosenCid,
129137
Address newbie, {
130138
required CommunityIdentifier? txPaymentAsset,
139+
// todo: #1763
140+
// dynamic Function(BuildContext txPageContext, ExtrinsicReport report)? onFinish,
141+
void Function(DispatchError report)? onError,
131142
}) async {
132143
final call = api.encointer.encointerKusama.tx.encointerCeremonies.endorseNewcomer(
133144
cid: chosenCid.toPolkadart(),
@@ -145,6 +156,7 @@ Future<void> submitEndorseNewcomer(
145156
api,
146157
OpaqueExtrinsic(xt),
147158
TxNotification.endorseNewcomer(context.l10n),
159+
onError: onError,
148160
onFinish: (BuildContext txPageContext, ExtrinsicReport report) {
149161
store.encointer.account!.getNumberOfNewbieTicketsForReputable(at: report.blockHashBytes);
150162
store.encointer.communityAccount!.getNumberOfNewbieTicketsForBootstrapper(at: report.blockHashBytes);
@@ -160,6 +172,9 @@ Future<void> submitUnRegisterParticipant(
160172
CommunityIdentifier chosenCid, {
161173
required ProofOfAttendance? lastProofOfAttendance,
162174
required CommunityIdentifier? txPaymentAsset,
175+
// todo: #1763
176+
// dynamic Function(BuildContext txPageContext, ExtrinsicReport report)? onFinish,
177+
void Function(DispatchError report)? onError,
163178
}) async {
164179
final maybeReputationCommunityCeremony = (lastProofOfAttendance != null)
165180
? Tuple2(
@@ -185,6 +200,7 @@ Future<void> submitUnRegisterParticipant(
185200
webApi,
186201
OpaqueExtrinsic(xt),
187202
TxNotification.unregisterParticipant(context.l10n),
203+
onError: onError,
188204
onFinish: (BuildContext txPageContext, ExtrinsicReport report) async {
189205
await Future.wait([
190206
webApi.encointer.getReputations(),
@@ -208,6 +224,9 @@ Future<void> submitRegisterParticipant(
208224
KeyringAccount signer,
209225
CommunityIdentifier chosenCid, {
210226
required CommunityIdentifier? txPaymentAsset,
227+
// todo: #1763
228+
// dynamic Function(BuildContext txPageContext, ExtrinsicReport report)? onFinish,
229+
void Function(DispatchError report)? onError,
211230
}) async {
212231
final proof = api.encointer.getProofOfAttendance();
213232

@@ -228,6 +247,7 @@ Future<void> submitRegisterParticipant(
228247
api,
229248
OpaqueExtrinsic(xt),
230249
TxNotification.registerParticipant(context.l10n),
250+
onError: onError,
231251
onFinish: (BuildContext txPageContext, ExtrinsicReport report) async {
232252
store.encointer.account!.lastProofOfAttendance = (proof != null) ? ProofOfAttendance.fromPolkadart(proof) : null;
233253
final data = await webApi.encointer
@@ -263,6 +283,9 @@ Future<void> submitAttestAttendees(
263283
KeyringAccount signer,
264284
CommunityIdentifier chosenCid, {
265285
required CommunityIdentifier? txPaymentAsset,
286+
// todo: #1763
287+
// dynamic Function(BuildContext txPageContext, ExtrinsicReport report)? onFinish,
288+
void Function(DispatchError report)? onError,
266289
}) async {
267290
final attestations =
268291
store.encointer.communityAccount!.attendees!.map((address) => Address.decode(address).pubkey).toList();
@@ -289,6 +312,7 @@ Future<void> submitAttestAttendees(
289312
store.encointer.communityAccount!.setMeetupCompleted();
290313
Navigator.popUntil(txPageContext, (route) => route.isFirst);
291314
},
315+
onError: onError,
292316
);
293317
}
294318

@@ -301,6 +325,8 @@ Future<void> submitFaucetDrip(
301325
CommunityIdentifier cid,
302326
int cIndex, {
303327
required CommunityIdentifier? txPaymentAsset,
328+
dynamic Function(BuildContext txPageContext, ExtrinsicReport report)? onFinish,
329+
void Function(DispatchError report)? onError,
304330
}) async {
305331
final call = api.encointer.encointerKusama.tx.encointerFaucet.drip(
306332
faucetAccount: AddressUtils.pubKeyHexToPubKey(faucetPubKey).toList(),
@@ -320,6 +346,8 @@ Future<void> submitFaucetDrip(
320346
api,
321347
OpaqueExtrinsic(xt),
322348
TxNotification.faucetDrip(context.l10n),
349+
onFinish: onFinish,
350+
onError: onError,
323351
);
324352
}
325353

@@ -434,6 +462,8 @@ Future<void> submitDemocracyVote(
434462
Vote vote,
435463
Reputations reputations, {
436464
required CommunityIdentifier? txPaymentAsset,
465+
dynamic Function(BuildContext txPageContext, ExtrinsicReport report)? onFinish,
466+
void Function(DispatchError report)? onError,
437467
}) async {
438468
final call = api.encointer.encointerKusama.tx.encointerDemocracy.vote(
439469
proposalId: proposalId,
@@ -453,6 +483,8 @@ Future<void> submitDemocracyVote(
453483
api,
454484
OpaqueExtrinsic(xt),
455485
TxNotification.democracyVote(context.l10n),
486+
onFinish: onFinish,
487+
onError: onError,
456488
);
457489
}
458490

@@ -463,6 +495,8 @@ Future<void> submitDemocracyUpdateProposalState(
463495
KeyringAccount signer,
464496
BigInt proposalId, {
465497
required CommunityIdentifier? txPaymentAsset,
498+
dynamic Function(BuildContext txPageContext, ExtrinsicReport report)? onFinish,
499+
void Function(DispatchError report)? onError,
466500
}) async {
467501
final call = api.encointer.encointerKusama.tx.encointerDemocracy.updateProposalState(
468502
proposalId: proposalId,
@@ -480,6 +514,8 @@ Future<void> submitDemocracyUpdateProposalState(
480514
api,
481515
OpaqueExtrinsic(xt),
482516
TxNotification.democracyUpdateProposalState(context.l10n),
517+
onFinish: onFinish,
518+
onError: onError,
483519
);
484520
}
485521

@@ -490,6 +526,8 @@ Future<void> submitDemocracyProposal(
490526
KeyringAccount signer,
491527
ProposalAction proposalAction, {
492528
required CommunityIdentifier? txPaymentAsset,
529+
dynamic Function(BuildContext txPageContext, ExtrinsicReport report)? onFinish,
530+
void Function(DispatchError report)? onError,
493531
}) async {
494532
final call = api.encointer.encointerKusama.tx.encointerDemocracy.submitProposal(proposalAction: proposalAction);
495533

@@ -505,6 +543,8 @@ Future<void> submitDemocracyProposal(
505543
api,
506544
OpaqueExtrinsic(xt),
507545
TxNotification.democracySubmitProposal(context.l10n),
546+
onFinish: onFinish,
547+
onError: onError,
508548
);
509549
}
510550

0 commit comments

Comments
 (0)