diff --git a/assets/svg/exchange_icons/change_now_logo_1.svg b/assets/svg/exchange_icons/change_now_logo_1.svg index 323488e52..f901f3562 100644 --- a/assets/svg/exchange_icons/change_now_logo_1.svg +++ b/assets/svg/exchange_icons/change_now_logo_1.svg @@ -1,25 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/lib/pages/home_view/home_view.dart b/lib/pages/home_view/home_view.dart index 3080706ec..2bdcbace0 100644 --- a/lib/pages/home_view/home_view.dart +++ b/lib/pages/home_view/home_view.dart @@ -21,10 +21,10 @@ import 'package:stackwallet/utilities/theme/stack_colors.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/stack_dialog.dart'; -import 'package:stackwallet/hive/db.dart'; - import 'package:stackwallet/utilities/logger.dart'; +import 'package:stackwallet/utilities/prefs.dart'; + class HomeView extends ConsumerStatefulWidget { const HomeView({Key? key}) : super(key: key); @@ -86,9 +86,8 @@ class _HomeViewState extends ConsumerState { void _loadCNData() { // unawaited future // - final externalCalls = DB.instance - .get(boxName: DB.boxNamePrefs, key: "externalCalls") as bool?; - if (externalCalls ?? false) { + final externalCalls = Prefs.instance.externalCalls; + if (externalCalls) { _cnLoadingService.loadAll(ref); } else { Logging.instance.log("User does not want to use external calls", diff --git a/lib/pages/home_view/sub_widgets/home_view_button_bar.dart b/lib/pages/home_view/sub_widgets/home_view_button_bar.dart index fd3536ef1..e502d4537 100644 --- a/lib/pages/home_view/sub_widgets/home_view_button_bar.dart +++ b/lib/pages/home_view/sub_widgets/home_view_button_bar.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:stackwallet/providers/providers.dart'; @@ -6,8 +8,7 @@ import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/theme/stack_colors.dart'; import 'package:stackwallet/widgets/stack_dialog.dart'; -import 'package:stackwallet/hive/db.dart'; -import 'package:stackwallet/services/change_now/change_now_loading_service.dart'; +import 'package:stackwallet/utilities/prefs.dart'; class HomeViewButtonBar extends ConsumerStatefulWidget { const HomeViewButtonBar({Key? key}) : super(key: key); @@ -104,11 +105,9 @@ class _HomeViewButtonBarState extends ConsumerState { ref.read(homeViewPageIndexStateProvider.state).state = 1; } DateTime now = DateTime.now(); - // TODO: find out why it infinitely loads - final _cnLoadingService = ChangeNowLoadingService(); - final externalCalls = DB.instance.get( - boxName: DB.boxNamePrefs, key: "externalCalls") as bool?; - if (!(externalCalls ?? false)) { + final _cnLoadingService = ExchangeDataLoadingService(); + final externalCalls = Prefs.instance.externalCalls; + if (!externalCalls) { print("loading?"); unawaited(_cnLoadingService.loadAll(ref)); } diff --git a/lib/pages/intro_view.dart b/lib/pages/intro_view.dart index fe7d2a254..494f23973 100644 --- a/lib/pages/intro_view.dart +++ b/lib/pages/intro_view.dart @@ -1,16 +1,16 @@ -import 'dart:async'; - import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:stackwallet/hive/db.dart'; import 'package:stackwallet/pages/stack_privacy_calls.dart'; import 'package:stackwallet/utilities/assets.dart'; import 'package:stackwallet/utilities/text_styles.dart'; import 'package:stackwallet/utilities/theme/stack_colors.dart'; import 'package:stackwallet/utilities/util.dart'; +import 'package:tuple/tuple.dart'; import 'package:url_launcher/url_launcher.dart'; +import 'package:stackwallet/utilities/prefs.dart'; + class IntroView extends StatefulWidget { const IntroView({Key? key}) : super(key: key); @@ -244,10 +244,11 @@ class GetStartedButton extends StatelessWidget { .extension()! .getPrimaryEnabledButtonColor(context), onPressed: () { - unawaited(DB.instance.put( - boxName: DB.boxNamePrefs, key: "externalCalls", value: true)); - Navigator.of(context) - .pushNamed(StackPrivacyCalls.routeName, arguments: false); + Prefs.instance.externalCalls = true; + Navigator.of(context).pushNamed( + StackPrivacyCalls.routeName, + arguments: false, + ); }, child: Text( "Get started", @@ -262,8 +263,10 @@ class GetStartedButton extends StatelessWidget { .extension()! .getPrimaryEnabledButtonColor(context), onPressed: () { - Navigator.of(context) - .pushNamed(StackPrivacyCalls.routeName, arguments: false); + Navigator.of(context).pushNamed( + StackPrivacyCalls.routeName, + arguments: false, + ); }, child: Text( "Get started", diff --git a/lib/pages/settings_views/global_settings_view/advanced_views/advanced_settings_view.dart b/lib/pages/settings_views/global_settings_view/advanced_views/advanced_settings_view.dart index f1fc2e16d..86212e0c7 100644 --- a/lib/pages/settings_views/global_settings_view/advanced_views/advanced_settings_view.dart +++ b/lib/pages/settings_views/global_settings_view/advanced_views/advanced_settings_view.dart @@ -8,9 +8,9 @@ import 'package:stackwallet/utilities/theme/stack_colors.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/custom_buttons/draggable_switch_button.dart'; import 'package:stackwallet/widgets/rounded_white_container.dart'; +import 'package:tuple/tuple.dart'; -import '../../../../hive/db.dart'; -import '../../../stack_privacy_calls.dart'; +import 'package:stackwallet/pages/stack_privacy_calls.dart'; class AdvancedSettingsView extends StatelessWidget { const AdvancedSettingsView({ @@ -23,10 +23,6 @@ class AdvancedSettingsView extends StatelessWidget { Widget build(BuildContext context) { debugPrint("BUILD: $runtimeType"); - final externalCalls = DB.instance - .get(boxName: DB.boxNamePrefs, key: "externalCalls") ?? - true; - return Scaffold( backgroundColor: Theme.of(context).extension()!.background, appBar: AppBar( @@ -127,45 +123,55 @@ class AdvancedSettingsView extends StatelessWidget { ), RoundedWhiteContainer( padding: const EdgeInsets.all(0), - child: RawMaterialButton( - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular( - Constants.size.circularBorderRadius, - ), - ), - onPressed: () { - Navigator.of(context) - .pushNamed(StackPrivacyCalls.routeName, arguments: true); - }, - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 12, - vertical: 20, - ), - child: Row( - children: [ - RichText( - textAlign: TextAlign.left, - text: TextSpan( - children: [ - TextSpan( - text: "Stack Experience", - style: STextStyles.titleBold12(context), - ), - TextSpan( - text: externalCalls as bool - ? "\nEasy crypto" - : "\nIncognito", - style: STextStyles.label(context) - .copyWith(fontSize: 15.0), - ) - ], - ), + child: Consumer( + builder: (_, ref, __) { + final externalCalls = ref.watch( + prefsChangeNotifierProvider + .select((value) => value.externalCalls), + ); + return RawMaterialButton( + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, ), - ], - ), - ), + ), + onPressed: () { + Navigator.of(context).pushNamed( + StackPrivacyCalls.routeName, + arguments: true, + ); + }, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 20, + ), + child: Row( + children: [ + RichText( + textAlign: TextAlign.left, + text: TextSpan( + children: [ + TextSpan( + text: "Stack Experience", + style: STextStyles.titleBold12(context), + ), + TextSpan( + text: externalCalls + ? "\nEasy crypto" + : "\nIncognito", + style: STextStyles.label(context) + .copyWith(fontSize: 15.0), + ) + ], + ), + ), + ], + ), + ), + ); + }, ), ), ], diff --git a/lib/pages/stack_privacy_calls.dart b/lib/pages/stack_privacy_calls.dart index 03530fc07..e299572d0 100644 --- a/lib/pages/stack_privacy_calls.dart +++ b/lib/pages/stack_privacy_calls.dart @@ -10,6 +10,9 @@ import 'package:stackwallet/utilities/util.dart'; import 'package:stackwallet/widgets/custom_buttons/app_bar_icon_button.dart'; import 'package:stackwallet/widgets/rounded_white_container.dart'; +import 'package:stackwallet/providers/global/prefs_provider.dart'; +import 'package:stackwallet/utilities/prefs.dart'; + class StackPrivacyCalls extends ConsumerStatefulWidget { const StackPrivacyCalls({ Key? key, @@ -26,7 +29,7 @@ class StackPrivacyCalls extends ConsumerStatefulWidget { class _StackPrivacyCalls extends ConsumerState { late final bool isDesktop; - bool isEasy = true; + bool isEasy = Prefs.instance.externalCalls; final PageController _pageController = PageController(initialPage: 0, keepPage: true); @@ -78,11 +81,19 @@ class _StackPrivacyCalls extends ConsumerState { height: 36, ), Center( - child: CustomRadio((bool isEasy) { - setState(() { - this.isEasy = isEasy; - }); - }), + child: Consumer( + builder: (_, ref, __) { + final externalCalls = ref.watch( + prefsChangeNotifierProvider + .select((value) => value.externalCalls), + ); + return CustomRadio((bool isEasy) { + setState(() { + this.isEasy = isEasy; + }); + }, externalCalls); + }, + ), ), const SizedBox( height: 36, @@ -191,11 +202,7 @@ class ContinueButton extends StatelessWidget { print("Output of isEasy:"); print(isEasy); - DB.instance.put( - boxName: DB.boxNamePrefs, - key: "externalCalls", - value: isEasy, - ); + Prefs.instance.externalCalls = isEasy; if (!isSettings) { Navigator.of(context).pushNamed(CreatePinView.routeName); } @@ -216,14 +223,10 @@ class ContinueButton extends StatelessWidget { print("Output of isEasy:"); print(isEasy); - DB.instance.put( - boxName: DB.boxNamePrefs, - key: "externalCalls", - value: isEasy, - ); + Prefs.instance.externalCalls = isEasy; if (!isSettings) { - Navigator.of(context).pushNamed(StackPrivacyCalls.routeName); + Navigator.of(context).pushNamed(CreatePinView.routeName); } }, child: Text( @@ -236,8 +239,9 @@ class ContinueButton extends StatelessWidget { } class CustomRadio extends StatefulWidget { - CustomRadio(this.upperCall, {Key? key}) : super(key: key); + CustomRadio(this.upperCall, this.isEasy, {Key? key}) : super(key: key); + bool isEasy; Function upperCall; @override @@ -252,10 +256,10 @@ class CustomRadioState extends State { @override void initState() { super.initState(); - sampleData.add( - RadioModel(true, Assets.svg.personaEasy, 'Easy Crypto', 'Recommended')); sampleData.add(RadioModel( - false, Assets.svg.personaIncognito, 'Incognito', 'Privacy conscious')); + widget.isEasy, Assets.svg.personaEasy, 'Easy Crypto', 'Recommended')); + sampleData.add(RadioModel(!widget.isEasy, Assets.svg.personaIncognito, + 'Incognito', 'Privacy conscious')); } @override diff --git a/lib/pages/wallet_view/wallet_view.dart b/lib/pages/wallet_view/wallet_view.dart index 74299db98..488ed19cd 100644 --- a/lib/pages/wallet_view/wallet_view.dart +++ b/lib/pages/wallet_view/wallet_view.dart @@ -49,6 +49,8 @@ import 'package:stackwallet/hive/db.dart'; import 'package:stackwallet/utilities/logger.dart'; +import 'package:stackwallet/utilities/prefs.dart'; + /// [eventBus] should only be set during testing class WalletView extends ConsumerStatefulWidget { const WalletView({ @@ -233,6 +235,12 @@ class _WalletViewState extends ConsumerState { } void _onExchangePressed(BuildContext context) async { + final _cnLoadingService = ExchangeDataLoadingService(); + final externalCalls = Prefs.instance.externalCalls; + if (!externalCalls) { + print("loading?"); + unawaited(_cnLoadingService.loadAll(ref)); + } final coin = ref.read(managerProvider).coin; if (coin == Coin.epicCash) { diff --git a/lib/services/price.dart b/lib/services/price.dart index 96c849eb6..af2527696 100644 --- a/lib/services/price.dart +++ b/lib/services/price.dart @@ -9,6 +9,8 @@ import 'package:stackwallet/utilities/enums/coin_enum.dart'; import 'package:stackwallet/utilities/logger.dart'; import 'package:tuple/tuple.dart'; +import 'package:stackwallet/utilities/prefs.dart'; + class PriceAPI { static const refreshInterval = 60; @@ -76,9 +78,8 @@ class PriceAPI { return _cachedPrices; } - final externalCalls = DB.instance - .get(boxName: DB.boxNamePrefs, key: "externalCalls") as bool?; - if (!(externalCalls ?? false)) { + final externalCalls = Prefs.instance.externalCalls; + if (!externalCalls) { Logging.instance.log("User does not want to use external calls", level: LogLevel.Info); return _cachedPrices; @@ -122,10 +123,8 @@ class PriceAPI { } static Future?> availableBaseCurrencies() async { - final externalCalls = DB.instance - .get(boxName: DB.boxNamePrefs, key: "externalCalls") as bool?; - print("externalCalls hi2 $externalCalls"); - if (!(externalCalls ?? false)) { + final externalCalls = Prefs.instance.externalCalls; + if (!externalCalls) { Logging.instance.log("User does not want to use external calls", level: LogLevel.Info); return null; diff --git a/lib/utilities/prefs.dart b/lib/utilities/prefs.dart index 578cf35a4..ce76ecf2c 100644 --- a/lib/utilities/prefs.dart +++ b/lib/utilities/prefs.dart @@ -36,6 +36,7 @@ class Prefs extends ChangeNotifier { _hideBlockExplorerWarning = await _getHideBlockExplorerWarning(); _gotoWalletOnStartup = await _getGotoWalletOnStartup(); _startupWalletId = await _getStartupWalletId(); + _externalCalls = await _getExternalCalls(); _initialized = true; } @@ -179,6 +180,27 @@ class Prefs extends ChangeNotifier { false; } + // external calls + + bool _externalCalls = true; + + bool get externalCalls => _externalCalls; + + set externalCalls(bool eCalls) { + if (_externalCalls != eCalls) { + DB.instance.put( + boxName: DB.boxNamePrefs, key: "externalCalls", value: eCalls); + _externalCalls = eCalls; + notifyListeners(); + } + } + + Future _getExternalCalls() async { + return await DB.instance.get( + boxName: DB.boxNamePrefs, key: "externalCalls") as bool? ?? + true; + } + // show favorites bool _showFavoriteWallets = true; diff --git a/test/cached_electrumx_test.mocks.dart b/test/cached_electrumx_test.mocks.dart index ce37c93d1..52f6c40a5 100644 --- a/test/cached_electrumx_test.mocks.dart +++ b/test/cached_electrumx_test.mocks.dart @@ -276,6 +276,14 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs { super.noSuchMethod(Invocation.setter(#wifiOnly, wifiOnly), returnValueForMissingStub: null); @override + bool get externalCalls => + (super.noSuchMethod(Invocation.getter(#externalCalls), returnValue: false) + as bool); + @override + set externalCalls(bool? eCalls) => + super.noSuchMethod(Invocation.setter(#externalCalls, eCalls), + returnValueForMissingStub: null); + @override bool get showFavoriteWallets => (super.noSuchMethod(Invocation.getter(#showFavoriteWallets), returnValue: false) as bool); diff --git a/test/electrumx_test.mocks.dart b/test/electrumx_test.mocks.dart index fb115f9ab..b8ec89ff8 100644 --- a/test/electrumx_test.mocks.dart +++ b/test/electrumx_test.mocks.dart @@ -125,6 +125,14 @@ class MockPrefs extends _i1.Mock implements _i4.Prefs { super.noSuchMethod(Invocation.setter(#wifiOnly, wifiOnly), returnValueForMissingStub: null); @override + bool get externalCalls => + (super.noSuchMethod(Invocation.getter(#externalCalls), returnValue: false) + as bool); + @override + set externalCalls(bool? eCalls) => + super.noSuchMethod(Invocation.setter(#externalCalls, eCalls), + returnValueForMissingStub: null); + @override bool get showFavoriteWallets => (super.noSuchMethod(Invocation.getter(#showFavoriteWallets), returnValue: false) as bool); diff --git a/test/models/exchange/estimated_rate_exchange_form_state_test.dart b/test/models/exchange/estimated_rate_exchange_form_state_test.dart index 88b73ab47..42efa52e8 100644 --- a/test/models/exchange/estimated_rate_exchange_form_state_test.dart +++ b/test/models/exchange/estimated_rate_exchange_form_state_test.dart @@ -10,6 +10,8 @@ // // import 'estimated_rate_exchange_form_state_test.mocks.dart'; // +void main() {} + // @GenerateMocks([ChangeNowAPI]) // void main() { // final currencyA = Currency( diff --git a/test/screen_tests/exchange/exchange_view_test.mocks.dart b/test/screen_tests/exchange/exchange_view_test.mocks.dart index 6f98b499e..73667c366 100644 --- a/test/screen_tests/exchange/exchange_view_test.mocks.dart +++ b/test/screen_tests/exchange/exchange_view_test.mocks.dart @@ -107,6 +107,14 @@ class MockPrefs extends _i1.Mock implements _i3.Prefs { super.noSuchMethod(Invocation.setter(#wifiOnly, wifiOnly), returnValueForMissingStub: null); @override + bool get externalCalls => + (super.noSuchMethod(Invocation.getter(#externalCalls), returnValue: false) + as bool); + @override + set externalCalls(bool? eCalls) => + super.noSuchMethod(Invocation.setter(#externalCalls, eCalls), + returnValueForMissingStub: null); + @override bool get showFavoriteWallets => (super.noSuchMethod(Invocation.getter(#showFavoriteWallets), returnValue: false) as bool); diff --git a/test/services/change_now/change_now_test.dart b/test/services/change_now/change_now_test.dart index 9c8efb1ac..b7b504e98 100644 --- a/test/services/change_now/change_now_test.dart +++ b/test/services/change_now/change_now_test.dart @@ -8,6 +8,7 @@ import 'package:mockito/mockito.dart'; import 'package:stackwallet/models/exchange/change_now/estimated_exchange_amount.dart'; import 'package:stackwallet/models/exchange/change_now/exchange_transaction.dart'; import 'package:stackwallet/models/exchange/change_now/exchange_transaction_status.dart'; +import 'package:stackwallet/models/exchange/response_objects/estimate.dart'; import 'package:stackwallet/models/exchange/response_objects/pair.dart'; import 'package:stackwallet/services/exchange/change_now/change_now_api.dart'; import 'package:stackwallet/services/exchange/exchange_response.dart'; @@ -290,7 +291,7 @@ void main() { expect(result.exception, null); expect(result.value == null, false); - expect(result.value, isA()); + expect(result.value, isA()); }); test( @@ -574,7 +575,7 @@ void main() { "https://api.ChangeNow.io/v1/transactions/fixed-rate/testAPIKEY"), headers: {'Content-Type': 'application/json'}, body: - '{"from":"btc","to":"eth","address":"0x57f31ad4b64095347F87eDB1675566DAfF5EC886","amount":"0.3","flow":"fixed-rate","extraId":"","userId":"","contactEmail":"","refundAddress":"","refundExtraId":"","rateId":""}', + '{"from":"btc","to":"eth","address":"0x57f31ad4b64095347F87eDB1675566DAfF5EC886","flow":"fixed-rate","extraId":"","userId":"","contactEmail":"","refundAddress":"","refundExtraId":"","rateId":"","amount":"0.3"}', encoding: null, )).thenAnswer((realInvocation) async => Response( '{"payinAddress": "33eFX2jfeWbXMSmRe9ewUUTrmSVSxZi5cj", "payoutAddress": "0x57f31ad4b64095347F87eDB1675566DAfF5EC886","payoutExtraId": "", "fromCurrency": "btc", "toCurrency": "eth", "refundAddress": "","refundExtraId": "","validUntil": "2019-09-09T14:01:04.921Z","id": "a5c73e2603f40d","amount": 62.9737711}', @@ -625,8 +626,7 @@ void main() { reversed: false, ); - expect( - result.exception!.type, ExchangeExceptionType.serializeResponseError); + expect(result.exception!.type, ExchangeExceptionType.generic); expect(result.value == null, true); });