From 4446e3b70c1d43effa933acc1951447e7c95d228 Mon Sep 17 00:00:00 2001 From: Serhii Date: Mon, 29 Jan 2024 13:40:40 +0200 Subject: [PATCH] update the UI --- assets/images/thorchain.png | Bin 0 -> 5478 bytes lib/di.dart | 3 + lib/entities/preferences_key.dart | 1 + .../exchange_provider_description.dart | 2 +- .../provider/thorchain_exchange.provider.dart | 35 ++++++++--- .../screens/dashboard/widgets/trade_row.dart | 38 +----------- lib/src/screens/exchange/exchange_page.dart | 5 +- .../exchange/exchange_trade_view_model.dart | 2 +- .../exchange/exchange_view_model.dart | 2 +- lib/view_model/trade_details_view_model.dart | 58 ++++++++---------- 10 files changed, 67 insertions(+), 79 deletions(-) create mode 100644 assets/images/thorchain.png diff --git a/assets/images/thorchain.png b/assets/images/thorchain.png new file mode 100644 index 0000000000000000000000000000000000000000..674b60f824c16848aaef27b347588ffeb8051deb GIT binary patch literal 5478 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 aYt7G+@%vUxf9L setup({ getIt.registerFactory(() => NFTViewModel(appStore, getIt.get())); getIt.registerFactory(() => TorPage(getIt.get())); + getIt.registerFactory(() => ThorChainExchangeProvider(tradesStore: tradesSource)); + _isSetupFinished = true; } diff --git a/lib/entities/preferences_key.dart b/lib/entities/preferences_key.dart index 2d5e64817..13b2fe8ae 100644 --- a/lib/entities/preferences_key.dart +++ b/lib/entities/preferences_key.dart @@ -96,4 +96,5 @@ class PreferencesKey { static const selectedCake2FAPreset = 'selected_cake_2fa_preset'; static const totpSecretKey = 'totp_secret_key'; static const currentSeedPhraseLength = 'current_seed_phrase_length'; + static const thorChainTradeCounter = 'thor_chain_trade_counter'; } diff --git a/lib/exchange/exchange_provider_description.dart b/lib/exchange/exchange_provider_description.dart index 6d141cb54..fab35537a 100644 --- a/lib/exchange/exchange_provider_description.dart +++ b/lib/exchange/exchange_provider_description.dart @@ -23,7 +23,7 @@ class ExchangeProviderDescription extends EnumerableItem with Serializable< static const exolix = ExchangeProviderDescription(title: 'Exolix', raw: 6, image: 'assets/images/exolix.png'); static const thorChain = - ExchangeProviderDescription(title: 'ThorChain', raw: 7, image: 'assets/images/exolix.png'); + ExchangeProviderDescription(title: 'ThorChain' , raw: 7, image: 'assets/images/thorchain.png'); static const all = ExchangeProviderDescription(title: 'All trades', raw: 8, image: ''); diff --git a/lib/exchange/provider/thorchain_exchange.provider.dart b/lib/exchange/provider/thorchain_exchange.provider.dart index ea8abc5d9..ca000baa2 100644 --- a/lib/exchange/provider/thorchain_exchange.provider.dart +++ b/lib/exchange/provider/thorchain_exchange.provider.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:cake_wallet/entities/preferences_key.dart'; import 'package:cake_wallet/exchange/exchange_provider_description.dart'; import 'package:cake_wallet/exchange/limits.dart'; import 'package:cake_wallet/exchange/provider/exchange_provider.dart'; @@ -7,12 +8,17 @@ import 'package:cake_wallet/exchange/trade.dart'; import 'package:cake_wallet/exchange/trade_request.dart'; import 'package:cake_wallet/exchange/trade_state.dart'; import 'package:cake_wallet/exchange/utils/currency_pairs_utils.dart'; +import 'package:cake_wallet/store/dashboard/trades_store.dart'; import 'package:cw_core/amount_converter.dart'; import 'package:cw_core/crypto_currency.dart'; +import 'package:hive/hive.dart'; import 'package:http/http.dart' as http; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:collection/collection.dart'; class ThorChainExchangeProvider extends ExchangeProvider { - ThorChainExchangeProvider() : super(pairList: supportedPairs(_notSupported)); + ThorChainExchangeProvider({required this.tradesStore}) + : super(pairList: supportedPairs(_notSupported)); static final List _notSupported = [ ...(CryptoCurrency.all @@ -30,6 +36,8 @@ class ThorChainExchangeProvider extends ExchangeProvider { static const _affiliateName = 'cakewallet'; static const _affiliateBps = '0'; + final Box tradesStore; + @override String get title => 'ThorChain'; @@ -96,22 +104,22 @@ class ThorChainExchangeProvider extends ExchangeProvider { 'amount': formattedAmount, 'destination': request.toAddress, 'affiliate': _affiliateName, - 'affiliate_bps': _affiliateBps}; + 'affiliate_bps': _affiliateBps + }; final responseJSON = await _getSwapQuote(params); print('createTrade _ responseJSON________: $responseJSON'); final inputAddress = responseJSON['inbound_address'] as String?; final memo = responseJSON['memo'] as String?; + final tradeId = await getNextTradeCounter(); return Trade( - id: 'id', + id: tradeId.toString(), from: request.fromCurrency, to: request.toCurrency, provider: description, inputAddress: inputAddress, - refundAddress: 'refundAddress', - extraId: 'extraId', createdAt: DateTime.now(), amount: request.fromAmount, state: TradeState.created, @@ -156,9 +164,12 @@ class ThorChainExchangeProvider extends ExchangeProvider { } } - @override - Future findTradeById({required String id}) { - throw UnimplementedError('findTradeById'); + Future findTradeById({required String id}) async { + final foundTrade = tradesStore.values.firstWhereOrNull((element) => element.id == id); + if (foundTrade == null) { + throw Exception('Trade with id $id not found'); + } + return foundTrade; } String _normalizeCurrency(CryptoCurrency currency) { @@ -175,4 +186,12 @@ class ThorChainExchangeProvider extends ExchangeProvider { return currency.title.toLowerCase(); } } + + Future getNextTradeCounter() async { + final prefs = await SharedPreferences.getInstance(); + int currentCounter = prefs.getInt(PreferencesKey.thorChainTradeCounter) ?? 0; + currentCounter++; + await prefs.setInt(PreferencesKey.thorChainTradeCounter, currentCounter); + return currentCounter; + } } diff --git a/lib/src/screens/dashboard/widgets/trade_row.dart b/lib/src/screens/dashboard/widgets/trade_row.dart index 7f570b98e..caccb8047 100644 --- a/lib/src/screens/dashboard/widgets/trade_row.dart +++ b/lib/src/screens/dashboard/widgets/trade_row.dart @@ -34,7 +34,9 @@ class TradeRow extends StatelessWidget { mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.center, children: [ - _getPoweredImage(provider)!, + ClipRRect( + borderRadius: BorderRadius.circular(50), + child: Image.asset(provider.image, width: 36, height: 36)), SizedBox(width: 12), Expanded( child: Column( @@ -69,38 +71,4 @@ class TradeRow extends StatelessWidget { ), )); } - - Widget? _getPoweredImage(ExchangeProviderDescription provider) { - Widget? image; - - switch (provider) { - case ExchangeProviderDescription.xmrto: - image = Image.asset('assets/images/xmrto.png', height: 36, width: 36); - break; - case ExchangeProviderDescription.changeNow: - image = Image.asset('assets/images/changenow.png', height: 36, width: 36); - break; - case ExchangeProviderDescription.morphToken: - image = Image.asset('assets/images/morph.png', height: 36, width: 36); - break; - case ExchangeProviderDescription.sideShift: - image = Image.asset('assets/images/sideshift.png', width: 36, height: 36); - break; - case ExchangeProviderDescription.simpleSwap: - image = Image.asset('assets/images/simpleSwap.png', width: 36, height: 36); - break; - case ExchangeProviderDescription.trocador: - image = ClipRRect( - borderRadius: BorderRadius.circular(50), - child: Image.asset('assets/images/trocador.png', width: 36, height: 36)); - break; - case ExchangeProviderDescription.exolix: - image = Image.asset('assets/images/exolix.png', width: 36, height: 36); - break; - default: - image = null; - } - - return image; - } } diff --git a/lib/src/screens/exchange/exchange_page.dart b/lib/src/screens/exchange/exchange_page.dart index b3fbd19a7..76b1596ac 100644 --- a/lib/src/screens/exchange/exchange_page.dart +++ b/lib/src/screens/exchange/exchange_page.dart @@ -1,3 +1,4 @@ +import 'package:cake_wallet/exchange/exchange_provider_description.dart'; import 'package:cake_wallet/themes/extensions/exchange_page_theme.dart'; import 'package:cake_wallet/themes/extensions/keyboard_theme.dart'; import 'package:cake_wallet/core/auth_service.dart'; @@ -431,7 +432,9 @@ class ExchangePage extends BasePage { } if (state is TradeIsCreatedSuccessfully) { exchangeViewModel.reset(); - Navigator.of(context).pushNamed(Routes.exchangeConfirm); + (exchangeViewModel.tradesStore.trade?.provider == ExchangeProviderDescription.thorChain) + ? Navigator.of(context).pushReplacementNamed(Routes.exchangeTrade) + : Navigator.of(context).pushReplacementNamed(Routes.exchangeConfirm); } }); diff --git a/lib/view_model/exchange/exchange_trade_view_model.dart b/lib/view_model/exchange/exchange_trade_view_model.dart index b85776f71..687d87f80 100644 --- a/lib/view_model/exchange/exchange_trade_view_model.dart +++ b/lib/view_model/exchange/exchange_trade_view_model.dart @@ -49,7 +49,7 @@ abstract class ExchangeTradeViewModelBase with Store { _provider = ExolixExchangeProvider(); break; case ExchangeProviderDescription.thorChain: - _provider = ThorChainExchangeProvider(); + _provider = ThorChainExchangeProvider(tradesStore: trades); break; } diff --git a/lib/view_model/exchange/exchange_view_model.dart b/lib/view_model/exchange/exchange_view_model.dart index f96bd39f0..831141987 100644 --- a/lib/view_model/exchange/exchange_view_model.dart +++ b/lib/view_model/exchange/exchange_view_model.dart @@ -148,7 +148,7 @@ abstract class ExchangeViewModelBase extends WalletChangeListenerViewModel with SimpleSwapExchangeProvider(), TrocadorExchangeProvider(useTorOnly: _useTorOnly, providerStates: _settingsStore.trocadorProviderStates), - ThorChainExchangeProvider(), + ThorChainExchangeProvider(tradesStore: trades), if (FeatureFlag.isExolixEnabled) ExolixExchangeProvider(), ]; diff --git a/lib/view_model/trade_details_view_model.dart b/lib/view_model/trade_details_view_model.dart index f5aa2122a..2a0733ed7 100644 --- a/lib/view_model/trade_details_view_model.dart +++ b/lib/view_model/trade_details_view_model.dart @@ -54,7 +54,7 @@ abstract class TradeDetailsViewModelBase with Store { _provider = ExolixExchangeProvider(); break; case ExchangeProviderDescription.thorChain: - _provider = ThorChainExchangeProvider(); + _provider = ThorChainExchangeProvider(tradesStore: trades); break; } @@ -66,6 +66,24 @@ abstract class TradeDetailsViewModelBase with Store { } } + static String? getTrackUrl(ExchangeProviderDescription provider, Trade trade) { + switch (provider) { + case ExchangeProviderDescription.changeNow: + return 'https://changenow.io/exchange/txs/${trade.id}'; + case ExchangeProviderDescription.sideShift: + return 'https://sideshift.ai/orders/${trade.id}'; + case ExchangeProviderDescription.simpleSwap: + return 'https://simpleswap.io/exchange?id=${trade.id}'; + case ExchangeProviderDescription.trocador: + return 'https://trocador.app/en/checkout/${trade.id}'; + case ExchangeProviderDescription.exolix: + return 'https://exolix.com/transaction/${trade.id}'; + case ExchangeProviderDescription.thorChain: + return 'https://track.ninerealms.com/${trade.id}'; + } + return null; + } + final Box trades; @observable @@ -129,46 +147,22 @@ abstract class TradeDetailsViewModelBase with Store { items.add(StandartListItem( title: S.current.trade_details_provider, value: trade.provider.toString())); - if (trade.provider == ExchangeProviderDescription.changeNow) { - final buildURL = 'https://changenow.io/exchange/txs/${trade.id.toString()}'; - items.add(TrackTradeListItem( - title: 'Track', - value: buildURL, - onTap: () { - _launchUrl(buildURL); - })); - } - - if (trade.provider == ExchangeProviderDescription.sideShift) { - final buildURL = 'https://sideshift.ai/orders/${trade.id.toString()}'; + final trackUrl = TradeDetailsViewModelBase.getTrackUrl(trade.provider, trade); + if (trackUrl != null) { items.add( - TrackTradeListItem(title: 'Track', value: buildURL, onTap: () => _launchUrl(buildURL))); - } - - if (trade.provider == ExchangeProviderDescription.simpleSwap) { - final buildURL = 'https://simpleswap.io/exchange?id=${trade.id.toString()}'; - items.add( - TrackTradeListItem(title: 'Track', value: buildURL, onTap: () => _launchUrl(buildURL))); + TrackTradeListItem(title: 'Track', value: trackUrl,onTap: () => _launchUrl(trackUrl))); } if (trade.provider == ExchangeProviderDescription.trocador) { - final buildURL = 'https://trocador.app/en/checkout/${trade.id.toString()}'; - items.add( - TrackTradeListItem(title: 'Track', value: buildURL, onTap: () => _launchUrl(buildURL))); - items.add(StandartListItem( title: '${trade.providerName} ${S.current.id.toUpperCase()}', value: trade.providerId ?? '')); - if (trade.password != null && trade.password!.isNotEmpty) + if (trade.password != null && trade.password!.isNotEmpty) { items.add(StandartListItem( - title: '${trade.providerName} ${S.current.password}', value: trade.password ?? '')); - } - - if (trade.provider == ExchangeProviderDescription.exolix) { - final buildURL = 'https://exolix.com/transaction/${trade.id.toString()}'; - items.add( - TrackTradeListItem(title: 'Track', value: buildURL, onTap: () => _launchUrl(buildURL))); + title: '${trade.providerName} ${S.current.password}', + value: trade.password ?? '')); + } } }