fix: implement async transaction status check in initState

This commit is contained in:
poka 2024-01-21 17:57:12 +01:00
parent 5bc261509a
commit 6b5bcadded
1 changed files with 25 additions and 8 deletions

View File

@ -6,6 +6,7 @@ import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/widgets/commons/loading.dart';
import 'package:gecko/widgets/transaction_status.dart'; import 'package:gecko/widgets/transaction_status.dart';
import 'package:gecko/widgets/transaction_status_icon.dart'; import 'package:gecko/widgets/transaction_status_icon.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -36,7 +37,7 @@ class _TransactionInProgressState extends State<TransactionInProgress> {
late String toUsernameFormat; late String toUsernameFormat;
late String amount; late String amount;
late bool isUdUnit; late bool isUdUnit;
late TransactionContent txContent; TransactionContent? txContent;
@override @override
void initState() { void initState() {
@ -59,33 +60,49 @@ class _TransactionInProgressState extends State<TransactionInProgress> {
amount = walletProfiles.payAmount.text; amount = walletProfiles.payAmount.text;
isUdUnit = configBox.get('isUdUnit') ?? false; isUdUnit = configBox.get('isUdUnit') ?? false;
waitForTransactionStatus();
super.initState(); super.initState();
} }
void waitForTransactionStatus() async {
final sub = Provider.of<SubstrateSdk>(context, listen: false);
while (!sub.transactionStatus.containsKey(widget.transactionId)) {
await Future.delayed(const Duration(seconds: 2));
}
setState(() {
txContent = sub.transactionStatus[widget.transactionId]!;
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final sub = Provider.of<SubstrateSdk>(context, listen: true); final sub = Provider.of<SubstrateSdk>(context, listen: true);
if (txContent == null) {
return const Center(child: Loading());
}
if (sub.transactionStatus.containsKey(widget.transactionId)) { if (sub.transactionStatus.containsKey(widget.transactionId)) {
txContent = sub.transactionStatus[widget.transactionId]!; txContent = sub.transactionStatus[widget.transactionId]!;
} }
if (txContent.status == TransactionStatus.success) { if (txContent!.status == TransactionStatus.success) {
resultText = 'extrinsicValidated' resultText = 'extrinsicValidated'
.tr(args: [actionMap[widget.transType] ?? 'strangeTransaction'.tr()]); .tr(args: [actionMap[widget.transType] ?? 'strangeTransaction'.tr()]);
} else if (txContent.status == TransactionStatus.failed) { } else if (txContent!.status == TransactionStatus.failed) {
resultText = errorTransactionMap[txContent.error] ?? txContent.error!; resultText = errorTransactionMap[txContent!.error] ?? txContent!.error!;
} else { } else {
resultText = statusStatusMap[txContent.status] ?? resultText = statusStatusMap[txContent!.status] ??
'Unknown status: ${txContent.status}'; 'Unknown status: ${txContent!.status}';
} }
Widget buildTransactionStatus() { Widget buildTransactionStatus() {
return Column( return Column(
children: [ children: [
TransactionStatusIcon(txContent.status), TransactionStatusIcon(txContent!.status),
ScaledSizedBox(height: 7), ScaledSizedBox(height: 7),
if (txContent.status != TransactionStatus.none) if (txContent!.status != TransactionStatus.none)
Text( Text(
resultText, resultText,
textAlign: TextAlign.center, textAlign: TextAlign.center,