CAKE-192 | implemented unstoppable domain address to the app

This commit is contained in:
OleksandrSobol
2021-04-20 20:49:53 +03:00
parent 5faf7f5cba
commit ae9efb0ae8
29 changed files with 327 additions and 46 deletions
+73 -8
View File
@@ -1,7 +1,7 @@
import 'dart:ui';
import 'package:cake_wallet/entities/sync_status.dart';
import 'package:cake_wallet/entities/wallet_type.dart';
import 'package:cake_wallet/exchange/changenow/changenow_exchange_provider.dart';
import 'package:cake_wallet/src/screens/send/widgets/unstoppable_domain_address_alert.dart';
import 'package:cake_wallet/src/widgets/standard_checkbox.dart';
import 'package:dotted_border/dotted_border.dart';
import 'package:flutter/cupertino.dart';
@@ -9,8 +9,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_mobx/flutter_mobx.dart';
import 'package:keyboard_actions/keyboard_actions.dart';
import 'package:mobx/mobx.dart';
import 'package:cake_wallet/exchange/exchange_provider.dart';
import 'package:cake_wallet/core/execution_state.dart';
import 'package:cake_wallet/exchange/exchange_template.dart';
import 'package:cake_wallet/exchange/exchange_trade_state.dart';
import 'package:cake_wallet/exchange/limits_state.dart';
@@ -23,7 +21,6 @@ import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:cake_wallet/routes.dart';
import 'package:cake_wallet/generated/i18n.dart';
import 'package:cake_wallet/entities/crypto_currency.dart';
import 'package:cake_wallet/exchange/xmrto/xmrto_exchange_provider.dart';
import 'package:cake_wallet/src/screens/exchange/widgets/exchange_card.dart';
import 'package:cake_wallet/src/widgets/primary_button.dart';
import 'package:cake_wallet/src/widgets/scollable_with_bottom_section.dart';
@@ -42,7 +39,9 @@ class ExchangePage extends BasePage {
final checkBoxKey = GlobalKey<StandardCheckboxState>();
final _formKey = GlobalKey<FormState>();
final _depositAmountFocus = FocusNode();
final _depositAddressFocus = FocusNode();
final _receiveAmountFocus = FocusNode();
final _receiveAddressFocus = FocusNode();
var _isReactionsSet = false;
@override
@@ -52,7 +51,7 @@ class ExchangePage extends BasePage {
Color get titleColor => Colors.white;
@override
bool get resizeToAvoidBottomPadding => false;
bool get resizeToAvoidBottomInset => false;
@override
bool get extendBodyBehindAppBar => true;
@@ -171,6 +170,7 @@ class ExchangePage extends BasePage {
.calculateDepositAllAmount()
: null,
amountFocusNode: _depositAmountFocus,
addressFocusNode: _depositAddressFocus,
key: depositKey,
title: S.of(context).you_will_send,
initialCurrency:
@@ -223,6 +223,15 @@ class ExchangePage extends BasePage {
type: exchangeViewModel.wallet.type),
addressTextFieldValidator: AddressValidator(
type: exchangeViewModel.depositCurrency),
onPushPasteButton: (context) async {
final domain =
exchangeViewModel.depositAddress;
final ticker =
exchangeViewModel.depositCurrency.title;
exchangeViewModel.depositAddress =
await applyUnstoppableDomainAddress(
context, domain, ticker);
},
),
),
),
@@ -232,6 +241,7 @@ class ExchangePage extends BasePage {
child: Observer(
builder: (_) => ExchangeCard(
amountFocusNode: _receiveAmountFocus,
addressFocusNode: _receiveAddressFocus,
key: receiveKey,
title: S.of(context).you_will_get,
initialCurrency:
@@ -268,6 +278,15 @@ class ExchangePage extends BasePage {
AddressValidator(
type: exchangeViewModel
.receiveCurrency),
onPushPasteButton: (context) async {
final domain =
exchangeViewModel.receiveAddress;
final ticker =
exchangeViewModel.receiveCurrency.title;
exchangeViewModel.receiveAddress =
await applyUnstoppableDomainAddress(
context, domain, ticker);
},
)),
)
],
@@ -371,7 +390,7 @@ class ExchangePage extends BasePage {
from: template.depositCurrency,
to: template.receiveCurrency,
onTap: () {
applyTemplate(
applyTemplate(context,
exchangeViewModel, template);
},
onRemove: () {
@@ -472,8 +491,8 @@ class ExchangePage extends BasePage {
));
}
void applyTemplate(
ExchangeViewModel exchangeViewModel, ExchangeTemplate template) {
void applyTemplate(BuildContext context,
ExchangeViewModel exchangeViewModel, ExchangeTemplate template) async {
exchangeViewModel.changeDepositCurrency(
currency: CryptoCurrency.fromString(template.depositCurrency));
exchangeViewModel.changeReceiveCurrency(
@@ -491,6 +510,16 @@ class ExchangePage extends BasePage {
exchangeViewModel.receiveAddress = template.receiveAddress;
exchangeViewModel.isReceiveAmountEntered = false;
exchangeViewModel.isFixedRateMode = false;
var domain = template.depositAddress;
var ticker = template.depositCurrency;
exchangeViewModel.depositAddress =
await applyUnstoppableDomainAddress(context, domain, ticker);
domain = template.receiveAddress;
ticker = template.receiveCurrency;
exchangeViewModel.receiveAddress =
await applyUnstoppableDomainAddress(context, domain, ticker);
}
void _setReactions(
@@ -656,6 +685,26 @@ class ExchangePage extends BasePage {
}
});
_depositAddressFocus.addListener(() async {
if (!_depositAddressFocus.hasFocus &&
depositAddressController.text.isNotEmpty) {
final domain = depositAddressController.text;
final ticker = exchangeViewModel.depositCurrency.title;
exchangeViewModel.depositAddress =
await applyUnstoppableDomainAddress(context, domain, ticker);
}
});
_receiveAddressFocus.addListener(() async {
if (!_receiveAddressFocus.hasFocus &&
receiveAddressController.text.isNotEmpty) {
final domain = receiveAddressController.text;
final ticker = exchangeViewModel.receiveCurrency.title;
exchangeViewModel.receiveAddress =
await applyUnstoppableDomainAddress(context, domain, ticker);
}
});
_receiveAmountFocus.addListener(() {
if (_receiveAmountFocus.hasFocus && !exchangeViewModel.isFixedRateMode) {
showPopUp<void>(
@@ -726,4 +775,20 @@ class ExchangePage extends BasePage {
key.currentState.addressController.text = null;
}
}
Future<String> applyUnstoppableDomainAddress(BuildContext context,
String domain, String ticker) async {
try {
final address =
await exchangeViewModel.getUnstoppableDomainAddress(domain, ticker);
if ((address != null)&&address.isNotEmpty) {
unstoppableDomainAddressAlert(context, domain);
return address;
}
} catch (e) {
print(e.toString());
}
return domain;
}
}
@@ -37,7 +37,7 @@ class ExchangeTemplatePage extends BasePage {
Color get titleColor => Colors.white;
@override
bool get resizeToAvoidBottomPadding => false;
bool get resizeToAvoidBottomInset => false;
@override
bool get extendBodyBehindAppBar => true;
@@ -150,9 +150,8 @@ class ExchangeTemplatePage extends BasePage {
.color,
currencyValueValidator: AmountValidator(
type: exchangeViewModel.wallet.type),
addressTextFieldValidator: AddressValidator(
type:
exchangeViewModel.depositCurrency),
//addressTextFieldValidator: AddressValidator(
// type: exchangeViewModel.depositCurrency),
),
),
),
@@ -190,8 +189,8 @@ class ExchangeTemplatePage extends BasePage {
.decorationColor,
currencyValueValidator: AmountValidator(
type: exchangeViewModel.wallet.type),
addressTextFieldValidator: AddressValidator(
type: exchangeViewModel.receiveCurrency),
//addressTextFieldValidator: AddressValidator(
// type: exchangeViewModel.receiveCurrency),
)),
)
],
@@ -28,8 +28,10 @@ class ExchangeCard extends StatefulWidget {
this.currencyValueValidator,
this.addressTextFieldValidator,
this.amountFocusNode,
this.addressFocusNode,
this.hasAllAmount = false,
this.allAmount})
this.allAmount,
this.onPushPasteButton})
: super(key: key);
final List<CryptoCurrency> currencies;
@@ -49,8 +51,10 @@ class ExchangeCard extends StatefulWidget {
final FormFieldValidator<String> currencyValueValidator;
final FormFieldValidator<String> addressTextFieldValidator;
final FocusNode amountFocusNode;
final FocusNode addressFocusNode;
final bool hasAllAmount;
Function allAmount;
final Function allAmount;
final Function(BuildContext context) onPushPasteButton;
@override
ExchangeCardState createState() => ExchangeCardState();
@@ -288,6 +292,7 @@ class ExchangeCardState extends State<ExchangeCard> {
? Padding(
padding: EdgeInsets.only(top: 20),
child: AddressTextField(
focusNode: widget.addressFocusNode,
controller: addressController,
placeholder: widget.hasRefundAddress
? S.of(context).refund_address
@@ -311,6 +316,7 @@ class ExchangeCardState extends State<ExchangeCard> {
.decorationColor),
buttonColor: widget.addressButtonsColor,
validator: widget.addressTextFieldValidator,
onPushPasteButton: widget.onPushPasteButton,
),
)
: Padding(
+28 -6
View File
@@ -1,6 +1,6 @@
import 'dart:ui';
import 'package:cake_wallet/entities/monero_transaction_priority.dart';
import 'package:cake_wallet/entities/transaction_priority.dart';
import 'package:cake_wallet/src/screens/send/widgets/unstoppable_domain_address_alert.dart';
import 'package:cake_wallet/src/widgets/alert_with_two_actions.dart';
import 'package:cake_wallet/src/widgets/keyboard_done_button.dart';
import 'package:cake_wallet/src/widgets/picker.dart';
@@ -38,9 +38,10 @@ class SendPage extends BasePage {
_cryptoAmountFocus = FocusNode(),
_fiatAmountFocus = FocusNode(),
_addressFocusNode = FocusNode() {
_addressFocusNode.addListener(() {
_addressFocusNode.addListener(() async {
if (!_addressFocusNode.hasFocus && _addressController.text.isNotEmpty) {
getOpenaliasRecord(_addressFocusNode.context);
await getOpenaliasRecord(_addressFocusNode.context);
await applyUnstoppableDomainAddress(_addressFocusNode.context);
}
});
}
@@ -67,7 +68,7 @@ class SendPage extends BasePage {
Color get titleColor => Colors.white;
@override
bool get resizeToAvoidBottomPadding => false;
bool get resizeToAvoidBottomInset => false;
@override
bool get extendBodyBehindAppBar => true;
@@ -173,6 +174,10 @@ class SendPage extends BasePage {
.headline
.decorationColor),
validator: sendViewModel.addressValidator,
onPushPasteButton: (context) async {
await getOpenaliasRecord(context);
await applyUnstoppableDomainAddress(context);
},
),
Observer(
builder: (_) => Padding(
@@ -513,12 +518,13 @@ class SendPage extends BasePage {
to: template.name,
amount: template.amount,
from: template.cryptoCurrency,
onTap: () {
onTap: () async {
_addressController.text =
template.address;
_cryptoAmountController.text =
template.amount;
getOpenaliasRecord(context);
await getOpenaliasRecord(context);
await applyUnstoppableDomainAddress(context);
},
onRemove: () {
showPopUp<void>(
@@ -770,4 +776,20 @@ class SendPage extends BasePage {
),
context: context);
}
Future<void> applyUnstoppableDomainAddress(BuildContext context) async {
try {
final address = await sendViewModel
.getUnstoppableDomainAddress(
_addressController.text);
if ((address != null)&&address.isNotEmpty) {
unstoppableDomainAddressAlert(
context, _addressController.text);
_addressController.text = address;
}
} catch (e) {
print(e.toString());
}
}
}
+2 -2
View File
@@ -34,7 +34,7 @@ class SendTemplatePage extends BasePage {
Color get titleColor => Colors.white;
@override
bool get resizeToAvoidBottomPadding => false;
bool get resizeToAvoidBottomInset => false;
@override
bool get extendBodyBehindAppBar => true;
@@ -145,7 +145,7 @@ class SendTemplatePage extends BasePage {
.primaryTextTheme
.headline
.decorationColor),
validator: sendViewModel.addressValidator,
//validator: sendViewModel.addressValidator,
),
),
Observer(builder: (_) {
@@ -0,0 +1,17 @@
import 'package:cake_wallet/src/widgets/alert_with_one_action.dart';
import 'package:cake_wallet/utils/show_pop_up.dart';
import 'package:flutter/material.dart';
import 'package:cake_wallet/generated/i18n.dart';
void unstoppableDomainAddressAlert(BuildContext context, String domain) async {
await showPopUp<void>(
context: context,
builder: (BuildContext context) {
return AlertWithOneAction(
alertTitle: S.of(context).address_detected,
alertContent: S.of(context).address_from_domain(domain),
buttonText: S.of(context).ok,
buttonAction: () => Navigator.of(context).pop());
});
}
+5 -1
View File
@@ -24,7 +24,8 @@ class AddressTextField extends StatelessWidget {
this.iconColor,
this.textStyle,
this.hintStyle,
this.validator});
this.validator,
this.onPushPasteButton});
static const prefixIconWidth = 34.0;
static const prefixIconHeight = 34.0;
@@ -43,6 +44,7 @@ class AddressTextField extends StatelessWidget {
final TextStyle textStyle;
final TextStyle hintStyle;
final FocusNode focusNode;
final Function(BuildContext context) onPushPasteButton;
@override
Widget build(BuildContext context) {
@@ -225,5 +227,7 @@ class AddressTextField extends StatelessWidget {
if (address?.isNotEmpty ?? false) {
controller.text = address;
}
onPushPasteButton?.call(context);
}
}