From c728931b705b61cc9727fa7689a6dd26fab178cd Mon Sep 17 00:00:00 2001 From: OleksandrSobol Date: Mon, 4 Oct 2021 16:03:35 +0300 Subject: [PATCH] CAKE-360 | added shouldShowYatPopup parameter to settings_store.dart and applied this parameter to dashboard_view_model.dart and dashboard_page.dart; added scrollbar to choose_yat_address_alert.dart; changed yat logo; fixed fetchYatAddress() method in the yat_store.dart; created class YatLink --- assets/images/yat_logo.png | Bin 1130 -> 7785 bytes lib/entities/preferences_key.dart | 1 + lib/src/screens/dashboard/dashboard_page.dart | 19 +-- .../widgets/choose_yat_address_alert.dart | 136 ++++++++++++------ lib/src/screens/yat/widgets/yat_bar.dart | 2 +- lib/src/screens/yat/yat_alert.dart | 10 +- lib/src/screens/yat/yat_popup.dart | 10 +- lib/store/settings_store.dart | 15 +- lib/store/yat/yat_store.dart | 47 +++--- .../dashboard/dashboard_view_model.dart | 6 + 10 files changed, 167 insertions(+), 79 deletions(-) diff --git a/assets/images/yat_logo.png b/assets/images/yat_logo.png index 73732566f8e9023ee3619fd8c4bd6999bcfb857c..1139e40d83132d55096de1f180d06e0a7703d55c 100644 GIT binary patch literal 7785 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 N002ovPDHLkV1f`Q{jUH3 diff --git a/lib/entities/preferences_key.dart b/lib/entities/preferences_key.dart index 82db7d5d9..3c94e8322 100644 --- a/lib/entities/preferences_key.dart +++ b/lib/entities/preferences_key.dart @@ -20,4 +20,5 @@ class PreferencesKey { static const moneroTransactionPriority = 'current_fee_priority_monero'; static const bitcoinTransactionPriority = 'current_fee_priority_bitcoin'; static const shouldShowReceiveWarning = 'should_show_receive_warning'; + static const shouldShowYatPopup = 'should_show_yat_popup'; } diff --git a/lib/src/screens/dashboard/dashboard_page.dart b/lib/src/screens/dashboard/dashboard_page.dart index a7070f5ce..8cf178153 100644 --- a/lib/src/screens/dashboard/dashboard_page.dart +++ b/lib/src/screens/dashboard/dashboard_page.dart @@ -156,14 +156,17 @@ class DashboardPage extends BasePage { pages.add(BalancePage(dashboardViewModel: walletViewModel)); pages.add(TransactionsPage(dashboardViewModel: walletViewModel)); - await Future.delayed(Duration(seconds: 1)); - await showPopUp( - context: context, - builder: (BuildContext context) { - return YatPopup( - dashboardViewModel: walletViewModel, - onClose: () => Navigator.of(context).pop()); - }); + if (walletViewModel.shouldShowYatPopup) { + await Future.delayed(Duration(seconds: 1)); + await showPopUp( + context: context, + builder: (BuildContext context) { + return YatPopup( + dashboardViewModel: walletViewModel, + onClose: () => Navigator.of(context).pop()); + }); + walletViewModel.furtherShowYatPopup(false); + } autorun((_) async { if (!walletViewModel.isOutdatedElectrumWallet) { diff --git a/lib/src/screens/send/widgets/choose_yat_address_alert.dart b/lib/src/screens/send/widgets/choose_yat_address_alert.dart index 64020a200..2b19075ff 100644 --- a/lib/src/screens/send/widgets/choose_yat_address_alert.dart +++ b/lib/src/screens/send/widgets/choose_yat_address_alert.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/src/widgets/cake_scrollbar.dart'; import 'package:flutter/material.dart'; import 'package:cake_wallet/src/widgets/base_alert_dialog.dart'; @@ -22,51 +23,98 @@ class ChooseYatAddressAlert extends BaseAlertDialog { bool get barrierDismissible => false; @override - Widget actionButtons(BuildContext context) { - return Container( - width: 300, - height: 105, - color: Theme.of(context).accentTextTheme.body1.backgroundColor, - child: ListView.separated( - padding: EdgeInsets.all(0), - itemCount: addresses.length, - separatorBuilder: (_, __) => Container( - height: 1, - color: Theme.of(context).dividerColor, - ), - itemBuilder: (context, index) { - final address = addresses[index]; + Widget actionButtons(BuildContext context) => + ChooseYatAddressButtons(addresses); +} - return GestureDetector( - onTap: () => Navigator.of(context).pop(address), - child: Container( - width: 300, - height: 52, - padding: EdgeInsets.only(left: 24, right: 24), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Expanded( - child: Text( - address, - textAlign: TextAlign.center, - maxLines: 1, - overflow: TextOverflow.ellipsis, - style: TextStyle( - fontSize: 15, - fontWeight: FontWeight.w600, - fontFamily: 'Lato', - color: Theme.of(context).primaryTextTheme.title.color, - decoration: TextDecoration.none, - ), - ) - ) - ], - ) - ), - ); - }) +class ChooseYatAddressButtons extends StatefulWidget { + ChooseYatAddressButtons(this.addresses); + + final List addresses; + + @override + ChooseYatAddressButtonsState createState() => + ChooseYatAddressButtonsState(addresses); +} + +class ChooseYatAddressButtonsState extends State { + ChooseYatAddressButtonsState(this.addresses) + : itemCount = addresses?.length ?? 0; + + final List addresses; + final int itemCount; + final double backgroundHeight = 118; + final double thumbHeight = 72; + ScrollController controller = ScrollController(); + double fromTop = 0; + + @override + Widget build(BuildContext context) { + controller.addListener(() { + fromTop = controller.hasClients + ? (controller.offset / controller.position.maxScrollExtent * + (backgroundHeight - thumbHeight)) + : 0; + setState(() {}); + }); + + return Stack( + alignment: Alignment.center, + clipBehavior: Clip.none, + children: [ + Container( + width: 300, + height: 158, + color: Theme.of(context).accentTextTheme.body1.backgroundColor, + child: ListView.separated( + controller: controller, + padding: EdgeInsets.all(0), + itemCount: itemCount, + separatorBuilder: (_, __) => Container( + height: 1, + color: Theme.of(context).dividerColor, + ), + itemBuilder: (context, index) { + final address = addresses[index]; + + return GestureDetector( + onTap: () => Navigator.of(context).pop(address), + child: Container( + width: 300, + height: 52, + padding: EdgeInsets.only(left: 24, right: 24), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: Text( + address, + textAlign: TextAlign.center, + maxLines: 1, + overflow: TextOverflow.ellipsis, + style: TextStyle( + fontSize: 15, + fontWeight: FontWeight.w600, + fontFamily: 'Lato', + color: Theme.of(context).primaryTextTheme.title.color, + decoration: TextDecoration.none, + ), + ) + ) + ], + ) + ), + ); + }) + ), + if (itemCount > 3) CakeScrollbar( + backgroundHeight: backgroundHeight, + thumbHeight: thumbHeight, + fromTop: fromTop, + //rightOffset: -15 + ) + ] ); } } \ No newline at end of file diff --git a/lib/src/screens/yat/widgets/yat_bar.dart b/lib/src/screens/yat/widgets/yat_bar.dart index 03b3556b0..7e1d725b2 100644 --- a/lib/src/screens/yat/widgets/yat_bar.dart +++ b/lib/src/screens/yat/widgets/yat_bar.dart @@ -5,7 +5,7 @@ class YatBar extends StatelessWidget { YatBar({this.onClose}); final VoidCallback onClose; - final image = Image.asset('assets/images/yat_logo.png'); + final image = Image.asset('assets/images/yat_logo.png', width: 81, height: 28); @override Widget build(BuildContext context) { diff --git a/lib/src/screens/yat/yat_alert.dart b/lib/src/screens/yat/yat_alert.dart index 7c97e6c22..8f54282b3 100644 --- a/lib/src/screens/yat/yat_alert.dart +++ b/lib/src/screens/yat/yat_alert.dart @@ -11,7 +11,9 @@ import 'package:lottie/lottie.dart'; class YatAlert extends StatelessWidget { YatAlert(this.yatStore) - : baseUrl = isYatDevMode ? baseDevUrl : baseReleaseUrl; + : baseUrl = YatLink.isDevMode + ? YatLink.baseDevUrl + : YatLink.baseReleaseUrl; final YatStore yatStore; final String baseUrl; @@ -86,7 +88,7 @@ class YatAlert extends StatelessWidget { .arrow_up_right_square, mainAxisAlignment: MainAxisAlignment.end, onPressed: () { - final url = baseUrl + createSuffix; + final url = baseUrl + YatLink.createSuffix; launch(url); }), Padding( @@ -102,11 +104,11 @@ class YatAlert extends StatelessWidget { .arrow_up_right_square, mainAxisAlignment: MainAxisAlignment.end, onPressed: () { - String url = baseUrl + signInSuffix; + String url = baseUrl + YatLink.signInSuffix; final parameters = yatStore.defineQueryParameters(); if (parameters.isNotEmpty) { - url += queryParameter + parameters; + url += YatLink.queryParameter + parameters; } launch(url); }) diff --git a/lib/src/screens/yat/yat_popup.dart b/lib/src/screens/yat/yat_popup.dart index 05d0c8dad..bae0af591 100644 --- a/lib/src/screens/yat/yat_popup.dart +++ b/lib/src/screens/yat/yat_popup.dart @@ -14,7 +14,9 @@ import 'package:url_launcher/url_launcher.dart'; class YatPopup extends StatelessWidget { YatPopup({this.dashboardViewModel, this.onClose}) - : baseUrl = isYatDevMode ? baseDevUrl : baseReleaseUrl; + : baseUrl = YatLink.isDevMode + ? YatLink.baseDevUrl + : YatLink.baseReleaseUrl; static const durationInMilliseconds = 250; @@ -157,15 +159,15 @@ class YatPopup extends StatelessWidget { child: ThirdIntroduction( onClose: onClose, onGet: () { - final url = baseUrl + createSuffix; + final url = baseUrl + YatLink.createSuffix; launch(url); }, onConnect: () { - String url = baseUrl + signInSuffix; + String url = baseUrl + YatLink.signInSuffix; final parameters = dashboardViewModel .yatStore.defineQueryParameters(); if (parameters.isNotEmpty) { - url += queryParameter + parameters; + url += YatLink.queryParameter + parameters; } launch(url); } diff --git a/lib/store/settings_store.dart b/lib/store/settings_store.dart index 84887d32a..5b52f9b19 100644 --- a/lib/store/settings_store.dart +++ b/lib/store/settings_store.dart @@ -38,6 +38,7 @@ abstract class SettingsStoreBase with Store { @required Map nodes, @required TransactionPriority initialBitcoinTransactionPriority, @required TransactionPriority initialMoneroTransactionPriority, + @required this.shouldShowYatPopup, @required this.isBitcoinBuyEnabled, this.actionlistDisplayMode}) { fiatCurrency = initialFiatCurrency; @@ -59,6 +60,11 @@ abstract class SettingsStoreBase with Store { (FiatCurrency fiatCurrency) => sharedPreferences.setString( PreferencesKey.currentFiatCurrencyKey, fiatCurrency.serialize())); + reaction( + (_) => shouldShowYatPopup, + (bool shouldShowYatPopup) => sharedPreferences + .setBool(PreferencesKey.shouldShowYatPopup, shouldShowYatPopup)); + priority.observe((change) { final key = change.key == WalletType.monero ? PreferencesKey.moneroTransactionPriority @@ -110,6 +116,9 @@ abstract class SettingsStoreBase with Store { @observable FiatCurrency fiatCurrency; + @observable + bool shouldShowYatPopup; + @observable ObservableList actionlistDisplayMode; @@ -217,6 +226,8 @@ abstract class SettingsStoreBase with Store { final bitcoinElectrumServer = nodeSource.get(bitcoinElectrumServerId); final litecoinElectrumServer = nodeSource.get(litecoinElectrumServerId); final packageInfo = await PackageInfo.fromPlatform(); + final shouldShowYatPopup = + sharedPreferences.getBool(PreferencesKey.shouldShowYatPopup) ?? true; return SettingsStore( sharedPreferences: sharedPreferences, @@ -236,7 +247,8 @@ abstract class SettingsStoreBase with Store { initialPinLength: pinLength, initialLanguageCode: savedLanguageCode, initialMoneroTransactionPriority: moneroTransactionPriority, - initialBitcoinTransactionPriority: bitcoinTransactionPriority); + initialBitcoinTransactionPriority: bitcoinTransactionPriority, + shouldShowYatPopup: shouldShowYatPopup); } Future reload( @@ -270,6 +282,7 @@ abstract class SettingsStoreBase with Store { pinCodeLength = settings.pinCodeLength; languageCode = settings.languageCode; appVersion = settings.appVersion; + shouldShowYatPopup = settings.shouldShowYatPopup; } Future _saveCurrentNode(Node node, WalletType walletType) async { diff --git a/lib/store/yat/yat_store.dart b/lib/store/yat/yat_store.dart index 5c66c2937..6af8c99fc 100644 --- a/lib/store/yat/yat_store.dart +++ b/lib/store/yat/yat_store.dart @@ -15,18 +15,24 @@ import 'package:http/http.dart'; part 'yat_store.g.dart'; -const baseDevUrl = 'https://yat.fyi'; -const baseReleaseUrl = 'https://y.at'; -const signInSuffix = '/partner/CW/link-email'; -const createSuffix = '/create'; -const queryParameter = '?addresses='; -const requestDevUrl = 'https://a.yat.fyi/emoji_id/'; -const requestReleaseUrl = 'https://a.y.at/emoji_id/'; -const isYatDevMode = true; +class YatLink { + static const baseDevUrl = 'https://yat.fyi'; + static const baseReleaseUrl = 'https://y.at'; + static const signInSuffix = '/partner/CW/link-email'; + static const createSuffix = '/create'; + static const queryParameter = '?addresses='; + static const requestDevUrl = 'https://a.yat.fyi/emoji_id/'; + static const requestReleaseUrl = 'https://a.y.at/emoji_id/'; + static const isDevMode = true; + static const tags = >{"XMR" : ['0x1001', '0x1002'], + "BTC" : ['0x1003'], "LTC" : ['0x3fff']}; +} Future> fetchYatAddress(String emojiId, String ticker) async { - final requestURL = isYatDevMode ? requestDevUrl : requestReleaseUrl; - final url = requestURL + emojiId + '/' + ticker.toUpperCase(); + final requestURL = YatLink.isDevMode + ? YatLink.requestDevUrl + : YatLink.requestReleaseUrl; + final url = requestURL + emojiId; final response = await get(url); if (response.statusCode != 200) { @@ -41,11 +47,18 @@ Future> fetchYatAddress(String emojiId, String ticker) async { } final List addresses = []; + final currency = ticker.toUpperCase(); for (var elem in result) { - final yatAddress = elem['data'] as String; - if (yatAddress?.isNotEmpty ?? false) { - addresses.add(yatAddress); + final tag = elem['tag'] as String; + if (tag?.isEmpty ?? true) { + continue; + } + if (YatLink.tags[currency]?.contains(tag) ?? false) { + final yatAddress = elem['data'] as String; + if (yatAddress?.isNotEmpty ?? false) { + addresses.add(yatAddress); + } } } @@ -123,8 +136,8 @@ abstract class YatStoreBase with Store { } parameters += subaddress.address.startsWith('4') - ? '0x1001%3D' - : '0x1002%3D'; + ? YatLink.tags["XMR"].first + '%3D' + : YatLink.tags["XMR"].last + '%3D'; parameters += subaddress.address; }); @@ -141,7 +154,7 @@ abstract class YatStoreBase with Store { isFirstAddress = !isFirstAddress; } - parameters += '0x1003%3D' + record.address; + parameters += YatLink.tags["BTC"].first + '%3D' + record.address; }); break; case WalletType.litecoin: @@ -155,7 +168,7 @@ abstract class YatStoreBase with Store { isFirstAddress = !isFirstAddress; } - parameters += '0x3fff%3D' + record.address; + parameters += YatLink.tags["LTC"].first + '%3D' + record.address; }); break; default: diff --git a/lib/view_model/dashboard/dashboard_view_model.dart b/lib/view_model/dashboard/dashboard_view_model.dart index 623a2af86..b99e03ca6 100644 --- a/lib/view_model/dashboard/dashboard_view_model.dart +++ b/lib/view_model/dashboard/dashboard_view_model.dart @@ -236,6 +236,12 @@ abstract class DashboardViewModelBase with Store { bool get isBuyEnabled => settingsStore.isBitcoinBuyEnabled; + bool get shouldShowYatPopup => settingsStore.shouldShowYatPopup; + + @action + void furtherShowYatPopup(bool shouldShow) => + settingsStore.shouldShowYatPopup = shouldShow; + ReactionDisposer _onMoneroAccountChangeReaction; ReactionDisposer _onMoneroBalanceChangeReaction;