Skip to content

Commit 341c02b

Browse files
committed
feat: ✨ Add a control to check if UCO balance is not too low after action validation
1 parent cb6ee88 commit 341c02b

File tree

5 files changed

+180
-8
lines changed

5 files changed

+180
-8
lines changed

lib/application/dex_token.g.dart

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/l10n/intl_en.arb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,5 +481,7 @@
481481
"mobileInfoTxt5": "Thank you for your understanding.",
482482
"maintenanceInfoGlobal": "aeSwap is currently undergoing maintenance to improve your experience.\nWe apologize for the inconvenience.\nPlease try again later.\nThank you for your understanding.",
483483
"maintenanceInfoFarmLock": "Earn features are currently undergoing maintenance to improve your experience.\nWe apologize for the inconvenience.\nPlease try again later.\nThank you for your understanding.",
484-
"swapControlTokenSwappedAmountExceedReserve": "The swapped amount exceeds the available reserve in the pool."
484+
"swapControlTokenSwappedAmountExceedReserve": "The swapped amount exceeds the available reserve in the pool.",
485+
"lowUCOWarningPopupTitle": "Warning",
486+
"lowUCOWarningPopupDesc": "Once this action is confirmed, you will no longer have enough UCO to cover the transaction fees for other actions.\n\nAre you sure to confirm the action?"
485487
}

lib/ui/views/liquidity_add/layouts/components/liquidity_add_confirm_sheet.dart

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
/// SPDX-License-Identifier: AGPL-3.0-or-later
2+
23
import 'dart:async';
34

45
import 'package:aedex/ui/views/liquidity_add/bloc/provider.dart';
56
import 'package:aedex/ui/views/liquidity_add/layouts/components/liquidity_add_confirm_infos.dart';
67
import 'package:aedex/ui/views/liquidity_add/layouts/components/liquidity_add_in_progress_popup.dart';
8+
import 'package:aedex/ui/views/util/components/low_uco_warning_popup.dart';
79
import 'package:aedex/ui/views/util/consent_uri.dart';
810
import 'package:archethic_dapp_framework_flutter/archethic_dapp_framework_flutter.dart'
911
as aedappfm;
12+
import 'package:decimal/decimal.dart';
1013
import 'package:flutter/material.dart';
1114
import 'package:flutter_gen/gen_l10n/localizations.dart';
1215
import 'package:flutter_riverpod/flutter_riverpod.dart';
@@ -75,15 +78,50 @@ class LiquidityAddConfirmSheetState
7578
labelBtn: AppLocalizations.of(context)!.btn_confirm_liquidity_add,
7679
disabled: !consentChecked && liquidityAdd.consentDateTime == null,
7780
onPressed: () async {
81+
if (liquidityAdd.token1 != null &&
82+
liquidityAdd.token1!.isUCO &&
83+
(Decimal.parse(
84+
liquidityAdd.token1Balance.toString(),
85+
) -
86+
Decimal.parse(
87+
liquidityAdd.token1Amount.toString(),
88+
))
89+
.toDouble() <
90+
kLowUCOWarningValue) {
91+
final result = await LowUCOWarningPopup.getDialog(context);
92+
if (result != null && result == false) {
93+
return;
94+
}
95+
}
96+
if (liquidityAdd.token2 != null &&
97+
liquidityAdd.token2!.isUCO &&
98+
(Decimal.parse(
99+
liquidityAdd.token2Balance.toString(),
100+
) -
101+
Decimal.parse(
102+
liquidityAdd.token2Amount.toString(),
103+
))
104+
.toDouble() <
105+
kLowUCOWarningValue) {
106+
if (context.mounted) {
107+
final result = await LowUCOWarningPopup.getDialog(context);
108+
if (result != null && result == false) {
109+
return;
110+
}
111+
}
112+
}
113+
78114
final liquidityAddNotifier =
79115
ref.read(liquidityAddFormNotifierProvider.notifier);
80-
unawaited(
81-
liquidityAddNotifier.add(AppLocalizations.of(context)!),
82-
);
83-
await LiquidityAddInProgressPopup.getDialog(
84-
context,
85-
ref,
86-
);
116+
if (context.mounted) {
117+
unawaited(
118+
liquidityAddNotifier.add(AppLocalizations.of(context)!),
119+
);
120+
await LiquidityAddInProgressPopup.getDialog(
121+
context,
122+
ref,
123+
);
124+
}
87125
},
88126
),
89127
const SizedBox(

lib/ui/views/swap/layouts/components/swap_confirm_sheet.dart

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
/// SPDX-License-Identifier: AGPL-3.0-or-later
2+
// ignore_for_file: use_build_context_synchronously
3+
24
import 'dart:async';
35

46
import 'package:aedex/ui/views/swap/bloc/provider.dart';
57
import 'package:aedex/ui/views/swap/layouts/components/swap_confirm_infos.dart';
68
import 'package:aedex/ui/views/swap/layouts/components/swap_in_progress_popup.dart';
9+
import 'package:aedex/ui/views/util/components/low_uco_warning_popup.dart';
710
import 'package:aedex/ui/views/util/consent_uri.dart';
811
import 'package:archethic_dapp_framework_flutter/archethic_dapp_framework_flutter.dart'
912
as aedappfm;
13+
import 'package:decimal/decimal.dart';
1014
import 'package:flutter/material.dart';
1115
import 'package:flutter_gen/gen_l10n/localizations.dart';
1216
import 'package:flutter_riverpod/flutter_riverpod.dart';
@@ -73,6 +77,20 @@ class SwapConfirmSheetState extends ConsumerState<SwapConfirmSheet> {
7377
labelBtn: AppLocalizations.of(context)!.btn_confirm_swap,
7478
disabled: !consentChecked && swap.consentDateTime == null,
7579
onPressed: () async {
80+
if (swap.tokenToSwap != null &&
81+
swap.tokenToSwap!.isUCO &&
82+
(Decimal.parse(
83+
swap.tokenToSwapBalance.toString(),
84+
) -
85+
Decimal.parse(swap.tokenToSwapAmount.toString()))
86+
.toDouble() <
87+
kLowUCOWarningValue) {
88+
final result = await LowUCOWarningPopup.getDialog(context);
89+
if (result != null && result == false) {
90+
return;
91+
}
92+
}
93+
7694
final swapNotifier = ref.read(swapFormNotifierProvider.notifier);
7795
unawaited(swapNotifier.swap(AppLocalizations.of(context)!));
7896
await SwapInProgressPopup.getDialog(
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
import 'package:archethic_dapp_framework_flutter/archethic_dapp_framework_flutter.dart'
2+
as aedappfm;
3+
import 'package:flutter/material.dart';
4+
import 'package:flutter_gen/gen_l10n/localizations.dart';
5+
import 'package:go_router/go_router.dart';
6+
7+
const kLowUCOWarningValue = 5;
8+
9+
class LowUCOWarningPopup {
10+
static Future<bool?> getDialog(
11+
BuildContext context,
12+
) async {
13+
return showDialog<bool?>(
14+
context: context,
15+
builder: (context) {
16+
return ScaffoldMessenger(
17+
child: Builder(
18+
builder: (context) {
19+
return AlertDialog(
20+
insetPadding: const EdgeInsets.symmetric(
21+
horizontal: 10,
22+
),
23+
backgroundColor: aedappfm.AppThemeBase.backgroundPopupColor,
24+
contentPadding: const EdgeInsets.only(
25+
top: 10,
26+
),
27+
content: Container(
28+
color: Colors.transparent,
29+
padding: const EdgeInsets.symmetric(
30+
horizontal: 10,
31+
),
32+
child: Column(
33+
mainAxisSize: MainAxisSize.min,
34+
children: <Widget>[
35+
Padding(
36+
padding: const EdgeInsets.all(10),
37+
child: Text(
38+
AppLocalizations.of(context)!.lowUCOWarningPopupTitle,
39+
style: Theme.of(context)
40+
.textTheme
41+
.titleMedium!
42+
.copyWith(
43+
fontSize:
44+
aedappfm.Responsive.fontSizeFromTextStyle(
45+
context,
46+
Theme.of(context).textTheme.titleMedium!,
47+
),
48+
),
49+
),
50+
),
51+
Padding(
52+
padding: const EdgeInsets.all(10),
53+
child: Text(
54+
AppLocalizations.of(context)!.lowUCOWarningPopupDesc,
55+
softWrap: true,
56+
style: Theme.of(context)
57+
.textTheme
58+
.bodyMedium!
59+
.copyWith(
60+
fontSize:
61+
aedappfm.Responsive.fontSizeFromTextStyle(
62+
context,
63+
Theme.of(context).textTheme.bodyMedium!,
64+
),
65+
),
66+
),
67+
),
68+
const SizedBox(
69+
height: 20,
70+
),
71+
Container(
72+
constraints: const BoxConstraints(
73+
minWidth: 100,
74+
),
75+
width: 300,
76+
padding: const EdgeInsets.only(
77+
bottom: 20,
78+
),
79+
child: Row(
80+
children: [
81+
Expanded(
82+
child: aedappfm.AppButton(
83+
labelBtn: AppLocalizations.of(context)!.no,
84+
onPressed: () async {
85+
context.pop(false);
86+
},
87+
),
88+
),
89+
Expanded(
90+
child: aedappfm.AppButton(
91+
labelBtn: AppLocalizations.of(context)!.yes,
92+
onPressed: () async {
93+
context.pop(true);
94+
},
95+
),
96+
),
97+
],
98+
),
99+
),
100+
],
101+
),
102+
),
103+
);
104+
},
105+
),
106+
);
107+
},
108+
);
109+
}
110+
}

0 commit comments

Comments
 (0)