diff --git a/assets/images/zaddr_icon.png b/assets/images/zaddr_icon.png new file mode 100644 index 000000000..139acf84c Binary files /dev/null and b/assets/images/zaddr_icon.png differ diff --git a/assets/images/zec_icon.png b/assets/images/zec_icon.png new file mode 100644 index 000000000..139acf84c Binary files /dev/null and b/assets/images/zec_icon.png differ diff --git a/cw_core/lib/crypto_currency.dart b/cw_core/lib/crypto_currency.dart index ddcdb5856..802ef5e3e 100644 --- a/cw_core/lib/crypto_currency.dart +++ b/cw_core/lib/crypto_currency.dart @@ -5,9 +5,13 @@ part 'crypto_currency.g.dart'; @HiveType(typeId: 0) class CryptoCurrency extends EnumerableItem with Serializable { - const CryptoCurrency({final String title, final int raw}) + const CryptoCurrency({final String title, this.tag, this.name, this.iconPath, final int raw}) : super(title: title, raw: raw); + final String tag; + final String name; + final String iconPath; + static const all = [ CryptoCurrency.xmr, CryptoCurrency.ada, @@ -24,39 +28,44 @@ class CryptoCurrency extends EnumerableItem with Serializable { CryptoCurrency.usdterc20, CryptoCurrency.xlm, CryptoCurrency.xrp, - CryptoCurrency.xhv + CryptoCurrency.xhv, + CryptoCurrency.zaddr, + CryptoCurrency.zec ]; - static const xmr = CryptoCurrency(title: 'XMR', raw: 0); - static const ada = CryptoCurrency(title: 'ADA', raw: 1); - static const bch = CryptoCurrency(title: 'BCH', raw: 2); - static const bnb = CryptoCurrency(title: 'BNB BEP2', raw: 3); - static const btc = CryptoCurrency(title: 'BTC', raw: 4); - static const dai = CryptoCurrency(title: 'DAI', raw: 5); - static const dash = CryptoCurrency(title: 'DASH', raw: 6); - static const eos = CryptoCurrency(title: 'EOS', raw: 7); - static const eth = CryptoCurrency(title: 'ETH', raw: 8); - static const ltc = CryptoCurrency(title: 'LTC', raw: 9); + static const xmr = CryptoCurrency(title: 'XMR', iconPath: 'assets/images/monero_icon.png', name: 'Monero', raw: 0); + static const ada = CryptoCurrency(title: 'ADA', iconPath: 'assets/images/ada_icon.png', name: 'Cardano', raw: 1); + static const bch = CryptoCurrency(title: 'BCH', iconPath: 'assets/images/bch_icon.png',name: 'Bitcoin Cash', raw: 2); + static const bnb = CryptoCurrency(title: 'BNB', iconPath: 'assets/images/bnb_icon.png', tag: 'BSC', name: 'Binance Coin', raw: 3); + static const btc = CryptoCurrency(title: 'BTC', iconPath: 'assets/images/btc.png', name: 'Bitcoin', raw: 4); + static const dai = CryptoCurrency(title: 'DAI', iconPath: 'assets/images/dai_icon.png', tag: 'ETH', name: 'Dai', raw: 5); + static const dash = CryptoCurrency(title: 'DASH', iconPath: 'assets/images/dash_icon.png', name: 'Dash', raw: 6); + static const eos = CryptoCurrency(title: 'EOS', iconPath: 'assets/images/eos_icon.png', name: 'EOS', raw: 7); + static const eth = CryptoCurrency(title: 'ETH', iconPath: 'assets/images/eth_icon.png', name: 'Ethereum', raw: 8); + static const ltc = CryptoCurrency(title: 'LTC', iconPath: 'assets/images/litecoin-ltc_icon.png', name: 'Litecoin',raw: 9); static const nano = CryptoCurrency(title: 'NANO', raw: 10); - static const trx = CryptoCurrency(title: 'TRX', raw: 11); - static const usdt = CryptoCurrency(title: 'USDT', raw: 12); - static const usdterc20 = CryptoCurrency(title: 'USDTERC20', raw: 13); - static const xlm = CryptoCurrency(title: 'XLM', raw: 14); - static const xrp = CryptoCurrency(title: 'XRP', raw: 15); - static const xhv = CryptoCurrency(title: 'XHV', raw: 16); - - static const xag = CryptoCurrency(title: 'XAG', raw: 17); - static const xau = CryptoCurrency(title: 'XAU', raw: 18); - static const xaud = CryptoCurrency(title: 'XAUD', raw: 19); - static const xbtc = CryptoCurrency(title: 'XBTC', raw: 20); - static const xcad = CryptoCurrency(title: 'XCAD', raw: 21); - static const xchf = CryptoCurrency(title: 'XCHF', raw: 22); - static const xcny = CryptoCurrency(title: 'XCNY', raw: 23); - static const xeur = CryptoCurrency(title: 'XEUR', raw: 24); - static const xgbp = CryptoCurrency(title: 'XGBP', raw: 25); - static const xjpy = CryptoCurrency(title: 'XJPY', raw: 26); - static const xnok = CryptoCurrency(title: 'XNOK', raw: 27); - static const xnzd = CryptoCurrency(title: 'XNZD', raw: 28); - static const xusd = CryptoCurrency(title: 'XUSD', raw: 29); + static const trx = CryptoCurrency(title: 'TRX', iconPath: 'assets/images/trx_icon.png', name: 'TRON', raw: 11); + static const usdt = CryptoCurrency(title: 'USDT', iconPath: 'assets/images/usdt_icon.png', tag: 'OMNI', name: 'USDT', raw: 12); + static const usdterc20 = CryptoCurrency(title: 'USDT', iconPath: 'assets/images/usdterc20_icon.png', tag: 'ETH', name: 'USDT', raw: 13); + static const xlm = CryptoCurrency(title: 'XLM', iconPath: 'assets/images/xlm_icon.png', name: 'Stellar', raw: 14); + static const xrp = CryptoCurrency(title: 'XRP', iconPath: 'assets/images/xrp_icon.png', name: 'Ripple', raw: 15); + static const xhv = CryptoCurrency(title: 'XHV', iconPath: 'assets/images/xhv_logo.png', name: 'Haven Protocol', raw: 16); + + static const xag = CryptoCurrency(title: 'XAG', tag: 'XHV', raw: 17); + static const xau = CryptoCurrency(title: 'XAU', tag: 'XHV', raw: 18); + static const xaud = CryptoCurrency(title: 'XAUD', tag: 'XHV', raw: 19); + static const xbtc = CryptoCurrency(title: 'XBTC', tag: 'XHV', raw: 20); + static const xcad = CryptoCurrency(title: 'XCAD', tag: 'XHV', raw: 21); + static const xchf = CryptoCurrency(title: 'XCHF', tag: 'XHV', raw: 22); + static const xcny = CryptoCurrency(title: 'XCNY', tag: 'XHV', raw: 23); + static const xeur = CryptoCurrency(title: 'XEUR', tag: 'XHV', raw: 24); + static const xgbp = CryptoCurrency(title: 'XGBP', tag: 'XHV', raw: 25); + static const xjpy = CryptoCurrency(title: 'XJPY', tag: 'XHV', raw: 26); + static const xnok = CryptoCurrency(title: 'XNOK', tag: 'XHV', raw: 27); + static const xnzd = CryptoCurrency(title: 'XNZD', tag: 'XHV', raw: 28); + static const xusd = CryptoCurrency(title: 'XUSD', tag: 'XHV', raw: 29); + + static const zaddr = CryptoCurrency(title: 'ZZEC', tag: 'ZEC', name: 'Shielded Zcash', iconPath: 'assets/images/zaddr_icon.png', raw: 30); + static const zec = CryptoCurrency(title: 'TZEC', tag: 'ZEC', name: 'Transparent Zcash', iconPath: 'assets/images/zec_icon.png', raw: 31); static CryptoCurrency deserialize({int raw}) { switch (raw) { @@ -120,6 +129,10 @@ class CryptoCurrency extends EnumerableItem with Serializable { return CryptoCurrency.xnzd; case 29: return CryptoCurrency.xusd; + case 30: + return CryptoCurrency.zaddr; + case 31: + return CryptoCurrency.zec; default: return null; } @@ -187,6 +200,10 @@ class CryptoCurrency extends EnumerableItem with Serializable { return CryptoCurrency.xnzd; case 'xusd': return CryptoCurrency.xusd; + case 'zaddr': + return CryptoCurrency.zaddr; + case 'zec': + return CryptoCurrency.zec; default: return null; } diff --git a/lib/exchange/changenow/changenow_exchange_provider.dart b/lib/exchange/changenow/changenow_exchange_provider.dart index ba5c18bdc..c6594516d 100644 --- a/lib/exchange/changenow/changenow_exchange_provider.dart +++ b/lib/exchange/changenow/changenow_exchange_provider.dart @@ -240,33 +240,23 @@ class ChangeNowExchangeProvider extends ExchangeProvider { } String networkFor(CryptoCurrency currency) { - const bnbTitle = 'bnb'; - switch (currency) { case CryptoCurrency.usdt: return CryptoCurrency.btc.title.toLowerCase(); - case CryptoCurrency.usdterc20: - return CryptoCurrency.eth.title.toLowerCase(); - case CryptoCurrency.bnb: - return bnbTitle; - case CryptoCurrency.dai: - return CryptoCurrency.eth.title.toLowerCase(); default: - return currency.title.toLowerCase(); + return currency.tag != null + ? currency.tag.toLowerCase() + : currency.title.toLowerCase(); + } } } - static String normalizeCryptoCurrency(CryptoCurrency currency) { - const bnbTitle = 'bnb'; - - switch(currency) { - case CryptoCurrency.bnb: - return bnbTitle; - case CryptoCurrency.usdterc20: - return CryptoCurrency.usdt.title.toLowerCase(); + String normalizeCryptoCurrency(CryptoCurrency currency) { + switch(currency) { + case CryptoCurrency.zec: + return 'zec'; default: return currency.title.toLowerCase(); } } -} diff --git a/lib/exchange/sideshift/sideshift_exchange_provider.dart b/lib/exchange/sideshift/sideshift_exchange_provider.dart index d4db3dcae..b828c2f6f 100644 --- a/lib/exchange/sideshift/sideshift_exchange_provider.dart +++ b/lib/exchange/sideshift/sideshift_exchange_provider.dart @@ -250,14 +250,15 @@ class SideShiftExchangeProvider extends ExchangeProvider { String get title => 'SideShift'; static String normalizeCryptoCurrency(CryptoCurrency currency) { - const bnbTitle = 'bsc'; - const usdterc20 = 'usdtErc20'; - switch (currency) { + case CryptoCurrency.zaddr: + return 'zaddr'; + case CryptoCurrency.zec: + return 'zec'; case CryptoCurrency.bnb: - return bnbTitle; + return currency.tag.toLowerCase(); case CryptoCurrency.usdterc20: - return usdterc20; + return 'usdtErc20'; default: return currency.title.toLowerCase(); } diff --git a/lib/src/screens/exchange/widgets/currency_picker.dart b/lib/src/screens/exchange/widgets/currency_picker.dart index 5e4a31831..abe07e56b 100644 --- a/lib/src/screens/exchange/widgets/currency_picker.dart +++ b/lib/src/screens/exchange/widgets/currency_picker.dart @@ -1,6 +1,5 @@ import 'dart:ui'; import 'package:cake_wallet/src/screens/exchange/widgets/currency_picker_item_widget.dart'; -import 'package:cake_wallet/src/screens/exchange/widgets/currency_utils.dart'; import 'package:cake_wallet/src/screens/exchange/widgets/picker_item.dart'; import 'package:cake_wallet/src/widgets/alert_close_button.dart'; import 'package:flutter/cupertino.dart'; @@ -35,45 +34,33 @@ class CurrencyPickerState extends State { CurrencyPickerState(this.items) : isSearchBarActive = false, textFieldValue = '', - subPickerItemsList = [], + subPickerItemsList = items, appBarTextStyle = - TextStyle(fontSize: 20, fontFamily: 'Lato', backgroundColor: Colors.transparent, color: Colors.white); + TextStyle(fontSize: 20, fontFamily: 'Lato', backgroundColor: Colors.transparent, color: Colors.white); + - @override - void initState() { - pickerItemsList = CryptoCurrency.all - .map((CryptoCurrency cur) => PickerItem(cur, - title: CurrencyUtils.titleForCurrency(cur), - iconPath: CurrencyUtils.iconPathForCurrency(cur), - tag: CurrencyUtils.tagForCurrency(cur), - description: CurrencyUtils.descriptionForCurrency(cur))) - .toList(); - cleanSubPickerItemsList(); - super.initState(); - } List> pickerItemsList; List items; bool isSearchBarActive; String textFieldValue; - List> subPickerItemsList; + List subPickerItemsList; TextStyle appBarTextStyle; - void cleanSubPickerItemsList() { - subPickerItemsList = pickerItemsList.where((element) => items.contains(element.original)).toList(); - } + void cleanSubPickerItemsList() => subPickerItemsList = items; - void currencySearchBySubstring(String subString, List> list) { + void currencySearchBySubstring(String subString) { setState(() { if (subString.isNotEmpty) { - subPickerItemsList = subPickerItemsList + subPickerItemsList = items .where((element) => - element.title.contains(subString.toUpperCase()) || - element.description.contains(subString.toLowerCase())) + (element.title != null ? element.title.toLowerCase().contains(subString.toLowerCase()) : false) || + (element.tag != null ? element.tag.toLowerCase().contains(subString.toLowerCase()) : false) || + (element.name != null ? element.name.toLowerCase().contains(subString.toLowerCase()) : false)) .toList(); - } else { - cleanSubPickerItemsList(); + return; } + cleanSubPickerItemsList(); }); } @@ -140,7 +127,7 @@ class CurrencyPickerState extends State { onChanged: (value) { this.textFieldValue = value; cleanSubPickerItemsList(); - currencySearchBySubstring(textFieldValue, subPickerItemsList); + currencySearchBySubstring(textFieldValue); }, ), ), @@ -152,10 +139,10 @@ class CurrencyPickerState extends State { AspectRatio( aspectRatio: 6, child: PickerItemWidget( - title: pickerItemsList[widget.selectedAtIndex].title, - iconPath: pickerItemsList[widget.selectedAtIndex].iconPath, + title: items[widget.selectedAtIndex].title, + iconPath: items[widget.selectedAtIndex].iconPath, isSelected: true, - tag: pickerItemsList[widget.selectedAtIndex].tag, + tag: items[widget.selectedAtIndex].tag, ), ), Flexible( @@ -167,10 +154,10 @@ class CurrencyPickerState extends State { setState(() { widget.selectedAtIndex = index; }); - widget.onItemSelected(subPickerItemsList[index].original); + widget.onItemSelected(subPickerItemsList[index]); if (widget.isConvertFrom && !widget.isMoneroWallet && - (subPickerItemsList[index].original == CryptoCurrency.xmr)) { + (subPickerItemsList[index] == CryptoCurrency.xmr)) { } else { Navigator.of(context).pop(); } diff --git a/lib/src/screens/exchange/widgets/currency_picker_widget.dart b/lib/src/screens/exchange/widgets/currency_picker_widget.dart index ec0a11356..254e85d4a 100644 --- a/lib/src/screens/exchange/widgets/currency_picker_widget.dart +++ b/lib/src/screens/exchange/widgets/currency_picker_widget.dart @@ -14,7 +14,7 @@ class CurrencyPickerWidget extends StatelessWidget { final int crossAxisCount; final int selectedAtIndex; final Function pickListItem; - final List> pickerItemsList; + final List pickerItemsList; final ScrollController _scrollController = ScrollController(); diff --git a/lib/src/screens/exchange/widgets/currency_utils.dart b/lib/src/screens/exchange/widgets/currency_utils.dart deleted file mode 100644 index 83c6d0af9..000000000 --- a/lib/src/screens/exchange/widgets/currency_utils.dart +++ /dev/null @@ -1,101 +0,0 @@ -import 'package:cw_core/crypto_currency.dart'; - -class CurrencyUtils { - static String tagForCurrency(CryptoCurrency cur) { - switch (cur) { - case CryptoCurrency.bnb: - return 'BEP2'; - case CryptoCurrency.dai: - return 'ETH'; - case CryptoCurrency.usdt: - return 'OMNI'; - case CryptoCurrency.usdterc20: - return 'ETH'; - default: - return null; - } - } - - static String iconPathForCurrency(CryptoCurrency cur) { - switch (cur) { - case CryptoCurrency.xmr: - return 'assets/images/monero_icon.png'; - case CryptoCurrency.ada: - return 'assets/images/ada_icon.png'; - case CryptoCurrency.bch: - return 'assets/images/bch_icon.png'; - case CryptoCurrency.bnb: - return 'assets/images/bnb_icon.png'; - case CryptoCurrency.btc: - return 'assets/images/btc.png'; - case CryptoCurrency.dai: - return 'assets/images/dai_icon.png'; - case CryptoCurrency.dash: - return 'assets/images/dash_icon.png'; - case CryptoCurrency.eos: - return 'assets/images/eos_icon.png'; - case CryptoCurrency.eth: - return 'assets/images/eth_icon.png'; - case CryptoCurrency.ltc: - return 'assets/images/litecoin-ltc_icon.png'; - case CryptoCurrency.trx: - return 'assets/images/trx_icon.png'; - case CryptoCurrency.usdt: - return 'assets/images/usdt_icon.png'; - case CryptoCurrency.usdterc20: - return 'assets/images/usdterc20_icon.png'; - case CryptoCurrency.xlm: - return 'assets/images/xlm_icon.png'; - case CryptoCurrency.xrp: - return 'assets/images/xrp_icon.png'; - case CryptoCurrency.xhv: - return 'assets/images/xhv_logo.png'; - default: - return null; - } - } - - static String titleForCurrency(CryptoCurrency cur) { - switch (cur) { - case CryptoCurrency.bnb: - return 'BNB'; - case CryptoCurrency.usdterc20: - return 'USDT'; - default: - return cur.title; - } - } - - static String descriptionForCurrency(CryptoCurrency cur) { - switch (cur) { - case CryptoCurrency.xmr: - return 'monero'; - case CryptoCurrency.ada: - return 'cardano'; - case CryptoCurrency.bch: - return 'bitcoin cash'; - case CryptoCurrency.bnb: - return 'binance bep2'; - case CryptoCurrency.btc: - return 'bitcoin'; - case CryptoCurrency.dai: - return 'dai eth'; - case CryptoCurrency.eth: - return 'ethereum'; - case CryptoCurrency.ltc: - return 'litecoin'; - case CryptoCurrency.trx: - return 'tron'; - case CryptoCurrency.usdt: - return 'usdt omni'; - case CryptoCurrency.usdterc20: - return 'tether ERC20 eth'; - case CryptoCurrency.xlm: - return 'lumens'; - case CryptoCurrency.xrp: - return 'ripple'; - default: - return cur.title; - } - } -} diff --git a/lib/src/screens/exchange/widgets/exchange_card.dart b/lib/src/screens/exchange/widgets/exchange_card.dart index a330675fd..ac21408a3 100644 --- a/lib/src/screens/exchange/widgets/exchange_card.dart +++ b/lib/src/screens/exchange/widgets/exchange_card.dart @@ -176,7 +176,7 @@ class ExchangeCardState extends State { padding: EdgeInsets.only(right: 5), child: widget.imageArrow, ), - Text(_selectedCurrency.toString() + ':', + Text(_selectedCurrency.toString(), style: TextStyle( fontWeight: FontWeight.w600, fontSize: 16, @@ -184,6 +184,40 @@ class ExchangeCardState extends State { ]), ), ), + _selectedCurrency.tag != null ? Padding( + padding: const EdgeInsets.only(right:3.0), + child: Container( + height: 32, + decoration: BoxDecoration( + color: widget.addressButtonsColor ?? Theme.of(context) + .primaryTextTheme + .display1 + .color, + borderRadius: + BorderRadius.all(Radius.circular(6))), + child: Center( + child: Padding( + padding: const EdgeInsets.all(6.0), + child: Text(_selectedCurrency.tag, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: Theme.of(context) + .primaryTextTheme + .display1 + .decorationColor)), + ), + ), + ), + ) : Container(), + Padding( + padding: const EdgeInsets.only(right: 4.0), + child: Text(':', + style: TextStyle( + fontWeight: FontWeight.w600, + fontSize: 16, + color: Colors.white)), + ), Expanded( child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, diff --git a/lib/src/screens/send/widgets/send_card.dart b/lib/src/screens/send/widgets/send_card.dart index eb110f3b1..69858a3ac 100644 --- a/lib/src/screens/send/widgets/send_card.dart +++ b/lib/src/screens/send/widgets/send_card.dart @@ -173,85 +173,129 @@ class SendCardState extends State Observer( builder: (_) => Padding( padding: const EdgeInsets.only(top: 20), - child: Stack( - children: [ - BaseTextFormField( - focusNode: cryptoAmountFocus, - controller: cryptoAmountController, - keyboardType: - TextInputType.numberWithOptions( - signed: false, decimal: true), - inputFormatters: [ - FilteringTextInputFormatter.deny(RegExp('[\\-|\\ ]')) - ], - prefixIcon: Padding( - padding: EdgeInsets.only(top: 9), - child: Text( - sendViewModel.selectedCryptoCurrency.title + - ':', + child: Row( + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: Row( + children: [ + Text( + sendViewModel.selectedCryptoCurrency.title, + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: Colors.white, + )), + sendViewModel.selectedCryptoCurrency.tag != null ? Padding( + padding: const EdgeInsets.fromLTRB(3.0,0,3.0,0), + child: Container( + height: 32, + decoration: BoxDecoration( + color: Theme.of(context) + .primaryTextTheme + .display1 + .color, + borderRadius: + BorderRadius.all(Radius.circular(6))), + child: Center( + child: Padding( + padding: const EdgeInsets.all(6.0), + child: Text( sendViewModel.selectedCryptoCurrency.tag, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: Theme.of(context) + .primaryTextTheme + .display1 + .decorationColor)), + ), + ), + ), + ) : Container(), + Padding( + padding: const EdgeInsets.only(right: 10.0), + child: Text(':', style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - color: Colors.white, - )), + fontWeight: FontWeight.w600, + fontSize: 16, + color: Colors.white)), ), - suffixIcon: SizedBox( - width: prefixIconWidth, - ), - hintText: '0.0000', - borderColor: Theme.of(context) - .primaryTextTheme - .headline - .color, - textStyle: TextStyle( - fontSize: 14, - fontWeight: FontWeight.w500, - color: Colors.white), - placeholderTextStyle: TextStyle( - color: Theme.of(context) - .primaryTextTheme - .headline - .decorationColor, - fontWeight: FontWeight.w500, - fontSize: 14), - validator: output.sendAll - ? sendViewModel.allAmountValidator - : sendViewModel - .amountValidator), - if (!sendViewModel.isBatchSending) Positioned( - top: 2, - right: 0, - child: Container( - width: prefixIconWidth, - height: prefixIconHeight, - child: InkWell( - onTap: () async => - output.setSendAll(), - child: Container( - decoration: BoxDecoration( - color: Theme.of(context) - .primaryTextTheme - .display1 - .color, - borderRadius: - BorderRadius.all( - Radius.circular(6))), - child: Center( - child: Text( - S.of(context).all, - textAlign: - TextAlign.center, - style: TextStyle( - fontSize: 12, - fontWeight: - FontWeight.bold, - color: - Theme.of(context) - .primaryTextTheme - .display1 - .decorationColor))), - ))))]) + ], + ), + ), + Expanded( + child: Stack( + children: [ + BaseTextFormField( + focusNode: cryptoAmountFocus, + controller: cryptoAmountController, + keyboardType: + TextInputType.numberWithOptions( + signed: false, decimal: true), + inputFormatters: [ + FilteringTextInputFormatter.deny(RegExp('[\\-|\\ ]')) + ], + suffixIcon: SizedBox( + width: prefixIconWidth, + ), + hintText: '0.0000', + borderColor: Colors.transparent, + textStyle: TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + color: Colors.white), + placeholderTextStyle: TextStyle( + color: Theme.of(context) + .primaryTextTheme + .headline + .decorationColor, + fontWeight: FontWeight.w500, + fontSize: 14), + validator: output.sendAll + ? sendViewModel.allAmountValidator + : sendViewModel + .amountValidator), + if (!sendViewModel.isBatchSending) Positioned( + top: 2, + right: 0, + child: Container( + width: prefixIconWidth, + height: prefixIconHeight, + child: InkWell( + onTap: () async => + output.setSendAll(), + child: Container( + decoration: BoxDecoration( + color: Theme.of(context) + .primaryTextTheme + .display1 + .color, + borderRadius: + BorderRadius.all( + Radius.circular(6))), + child: Center( + child: Text( + S.of(context).all, + textAlign: + TextAlign.center, + style: TextStyle( + fontSize: 12, + fontWeight: + FontWeight.bold, + color: + Theme.of(context) + .primaryTextTheme + .display1 + .decorationColor))), + ))))]), + ), + ], + ) )), + Divider(height: 1,color: Theme.of(context) + .primaryTextTheme + .headline + .decorationColor), Observer( builder: (_) => Padding( padding: EdgeInsets.only(top: 10),