Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(market-metrics): hd mode switching values shown, graph interaction, and loading speed #2558

Open
wants to merge 14 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 13 additions & 16 deletions lib/bloc/app_bloc_root.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ import 'package:web_dex/bloc/auth_bloc/auth_bloc.dart';
import 'package:web_dex/bloc/bitrefill/bloc/bitrefill_bloc.dart';
import 'package:web_dex/bloc/bridge_form/bridge_bloc.dart';
import 'package:web_dex/bloc/bridge_form/bridge_repository.dart';
import 'package:web_dex/bloc/cex_market_data/mockup/generator.dart';
import 'package:web_dex/bloc/cex_market_data/mockup/mock_transaction_history_repository.dart';
import 'package:web_dex/bloc/cex_market_data/mockup/performance_mode.dart';
import 'package:web_dex/bloc/cex_market_data/portfolio_growth/portfolio_growth_bloc.dart';
import 'package:web_dex/bloc/cex_market_data/portfolio_growth/portfolio_growth_repository.dart';
Expand Down Expand Up @@ -76,7 +78,7 @@ class AppBlocRoot extends StatelessWidget {
final KomodoDefiSdk komodoDefiSdk;

// TODO: Refactor to clean up the bloat in this main file
void _clearCachesIfPerformanceModeChanged(
Future<void> _clearCachesIfPerformanceModeChanged(
PerformanceMode? performanceMode,
ProfitLossRepository profitLossRepo,
PortfolioGrowthRepository portfolioGrowthRepo,
Expand Down Expand Up @@ -115,33 +117,28 @@ class AppBlocRoot extends StatelessWidget {
final trezorRepo = RepositoryProvider.of<TrezorRepo>(context);
final trezorBloc = RepositoryProvider.of<TrezorCoinsBloc>(context);

// TODO: SDK Port needed, not sure about this part
final transactionsRepo = /*performanceMode != null
final transactionsRepo = performanceMode != null
? MockTransactionHistoryRepo(
api: mm2Api,
client: Client(),
performanceMode: performanceMode,
demoDataGenerator: DemoDataCache.withDefaults(),
)
: */
SdkTransactionHistoryRepository(sdk: komodoDefiSdk);
: SdkTransactionHistoryRepository(sdk: komodoDefiSdk);

final profitLossRepo = ProfitLossRepository.withDefaults(
transactionHistoryRepo: transactionsRepo,
cexRepository: binanceRepository,
// Returns real data if performanceMode is null. Consider changing the
// other repositories to use this pattern.
demoMode: performanceMode,
coinsRepository: coinsRepository,
mm2Api: mm2Api,
sdk: komodoDefiSdk,
);

final portfolioGrowthRepo = PortfolioGrowthRepository.withDefaults(
transactionHistoryRepo: transactionsRepo,
cexRepository: binanceRepository,
demoMode: performanceMode,
coinsRepository: coinsRepository,
mm2Api: mm2Api,
sdk: komodoDefiSdk,
);

_clearCachesIfPerformanceModeChanged(
Expand Down Expand Up @@ -201,21 +198,21 @@ class AppBlocRoot extends StatelessWidget {
),
BlocProvider<AssetOverviewBloc>(
create: (context) => AssetOverviewBloc(
investmentRepository: InvestmentRepository(
profitLossRepository: profitLossRepo,
),
profitLossRepository: profitLossRepo,
profitLossRepo,
InvestmentRepository(profitLossRepository: profitLossRepo),
komodoDefiSdk,
),
),
BlocProvider<ProfitLossBloc>(
create: (context) => ProfitLossBloc(
profitLossRepository: profitLossRepo,
profitLossRepo,
komodoDefiSdk,
),
),
BlocProvider<PortfolioGrowthBloc>(
create: (BuildContext ctx) => PortfolioGrowthBloc(
portfolioGrowthRepository: portfolioGrowthRepo,
coinsRepository: coinsRepository,
sdk: komodoDefiSdk,
),
),
BlocProvider<TransactionHistoryBloc>(
Expand Down
40 changes: 23 additions & 17 deletions lib/bloc/assets_overview/bloc/asset_overview_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,24 @@ import 'dart:async';

import 'package:bloc/bloc.dart';
import 'package:equatable/equatable.dart';
import 'package:komodo_defi_sdk/komodo_defi_sdk.dart';
import 'package:logging/logging.dart';
import 'package:web_dex/bloc/assets_overview/investment_repository.dart';
import 'package:web_dex/bloc/cex_market_data/profit_loss/models/fiat_value.dart';
import 'package:web_dex/bloc/cex_market_data/profit_loss/models/profit_loss.dart';
import 'package:web_dex/bloc/cex_market_data/profit_loss/profit_loss_repository.dart';
import 'package:web_dex/bloc/cex_market_data/sdk_auth_activation_extension.dart';
import 'package:web_dex/model/coin.dart';
import 'package:web_dex/shared/utils/utils.dart' as logger;

part 'asset_overview_event.dart';
part 'asset_overview_state.dart';

class AssetOverviewBloc extends Bloc<AssetOverviewEvent, AssetOverviewState> {
AssetOverviewBloc({
required this.profitLossRepository,
required this.investmentRepository,
}) : super(const AssetOverviewInitial()) {
AssetOverviewBloc(
this._profitLossRepository,
this._investmentRepository,
this._sdk,
) : super(const AssetOverviewInitial()) {
on<AssetOverviewLoadRequested>(_onLoad);
on<AssetOverviewClearRequested>(_onClear);
on<PortfolioAssetsOverviewLoadRequested>(_onLoadPortfolio);
Expand All @@ -26,9 +29,10 @@ class AssetOverviewBloc extends Bloc<AssetOverviewEvent, AssetOverviewState> {
on<PortfolioAssetsOverviewUnsubscriptionRequested>(_onUnsubscribePortfolio);
}

final ProfitLossRepository profitLossRepository;
final InvestmentRepository investmentRepository;

final ProfitLossRepository _profitLossRepository;
final InvestmentRepository _investmentRepository;
final KomodoDefiSdk _sdk;
final _log = Logger('AssetOverviewBloc');
Timer? _updateTimer;

Future<void> _onLoad(
Expand All @@ -38,14 +42,14 @@ class AssetOverviewBloc extends Bloc<AssetOverviewEvent, AssetOverviewState> {
emit(const AssetOverviewLoadInProgress());

try {
final profitLosses = await profitLossRepository.getProfitLoss(
final profitLosses = await _profitLossRepository.getProfitLoss(
event.coin.id,
'USDT',
event.walletId,
);

final totalInvestment =
await investmentRepository.calculateTotalInvestment(
await _investmentRepository.calculateTotalInvestment(
event.walletId,
[event.coin],
);
Expand All @@ -65,8 +69,8 @@ class AssetOverviewBloc extends Bloc<AssetOverviewEvent, AssetOverviewState> {
investmentReturnPercentage: investmentReturnPercentage,
),
);
} catch (e) {
logger.log('Failed to load asset overview: $e', isError: true);
} catch (e, s) {
_log.shout('Failed to load asset overview', e, s);
if (state is! AssetOverviewLoadSuccess) {
emit(AssetOverviewLoadFailure(error: e.toString()));
}
Expand All @@ -90,12 +94,14 @@ class AssetOverviewBloc extends Bloc<AssetOverviewEvent, AssetOverviewState> {
// emit(const AssetOverviewLoadInProgress());

try {
await _sdk.waitForEnabledCoinsToPassThreshold(event.coins);

final profitLossesFutures = event.coins.map((coin) async {
// Catch errors that occur for single coins and exclude them from the
// total so that transaction fetching errors for a single coin do not
// affect the total investment calculation.
try {
return await profitLossRepository.getProfitLoss(
return await _profitLossRepository.getProfitLoss(
coin.id,
'USDT',
event.walletId,
Expand All @@ -108,7 +114,7 @@ class AssetOverviewBloc extends Bloc<AssetOverviewEvent, AssetOverviewState> {
final profitLosses = await Future.wait(profitLossesFutures);

final totalInvestment =
await investmentRepository.calculateTotalInvestment(
await _investmentRepository.calculateTotalInvestment(
event.walletId,
event.coins,
);
Expand All @@ -125,16 +131,16 @@ class AssetOverviewBloc extends Bloc<AssetOverviewEvent, AssetOverviewState> {

emit(
PortfolioAssetsOverviewLoadSuccess(
selectedAssetIds: event.coins.map((coin) => coin.abbr).toList(),
selectedAssetIds: event.coins.map((coin) => coin.id.id).toList(),
assetPortionPercentages: assetPortionPercentages,
totalInvestment: totalInvestment,
totalValue: FiatValue.usd(profitAmount),
profitAmount: FiatValue.usd(profitAmount),
profitIncreasePercentage: portfolioInvestmentReturnPercentage,
),
);
} catch (e) {
logger.log('Failed to load portfolio assets overview: $e', isError: true);
} catch (e, s) {
_log.shout('Failed to load portfolio assets overview', e, s);
if (state is! PortfolioAssetsOverviewLoadSuccess) {
emit(AssetOverviewLoadFailure(error: e.toString()));
}
Expand Down
5 changes: 5 additions & 0 deletions lib/bloc/auth_bloc/auth_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:equatable/equatable.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:komodo_defi_sdk/komodo_defi_sdk.dart';
import 'package:komodo_defi_types/komodo_defi_types.dart';
import 'package:web_dex/app_config/app_config.dart';
import 'package:web_dex/blocs/wallets_repository.dart';
import 'package:web_dex/model/authorize_mode.dart';
import 'package:web_dex/model/kdf_auth_metadata_extension.dart';
Expand Down Expand Up @@ -137,6 +138,8 @@ class AuthBloc extends Bloc<AuthBlocEvent, AuthBlocState> {
log('registered from a wallet', path: 'auth_bloc => _register').ignore();
await _kdfSdk.setWalletType(event.wallet.config.type);
await _kdfSdk.confirmSeedBackup(hasBackup: false);
await _kdfSdk.addActivatedCoins(enabledByDefaultCoins);

final currentUser = await _kdfSdk.auth.currentUser;
if (currentUser == null) {
throw Exception('Registration failed: user is not signed in');
Expand Down Expand Up @@ -181,6 +184,8 @@ class AuthBloc extends Bloc<AuthBlocEvent, AuthBlocState> {
log('restored from a wallet', path: 'auth_bloc => _restore').ignore();
await _kdfSdk.setWalletType(event.wallet.config.type);
await _kdfSdk.confirmSeedBackup(hasBackup: event.wallet.config.hasBackup);
await _kdfSdk.addActivatedCoins(enabledByDefaultCoins);

final currentUser = await _kdfSdk.auth.currentUser;
if (currentUser == null) {
throw Exception('Registration failed: user is not signed in');
Expand Down
5 changes: 2 additions & 3 deletions lib/bloc/cex_market_data/mockup/generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,12 @@ final _supportedCoinsCache = <String, List<String>>{};
final _transactionsCache = <String, Map<PerformanceMode, List<Transaction>>>{};

class DemoDataCache {
final DemoDataGenerator _generator;

DemoDataCache(this._generator);
DemoDataCache.withDefaults()
: _generator = DemoDataGenerator(
BinanceRepository(binanceProvider: const BinanceProvider()),
);
final DemoDataGenerator _generator;

Future<List<String>> supportedCoinsDemoData() async {
const cacheKey = 'supportedCoins';
Expand All @@ -27,7 +26,7 @@ class DemoDataCache {

final String response =
await rootBundle.loadString('assets/debug/demo_trade_data.json');
final Map<String, dynamic> data = json.decode(response);
final data = json.decode(response) as Map<String, dynamic>;
final result = (data['profit'] as Map<String, dynamic>).keys.toList();
_supportedCoinsCache[cacheKey] = result;
return result;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import 'package:http/http.dart';
import 'package:komodo_cex_market_data/komodo_cex_market_data.dart';
import 'package:komodo_persistence_layer/komodo_persistence_layer.dart';
import 'package:web_dex/bloc/cex_market_data/mockup/generator.dart';
Expand All @@ -7,37 +6,33 @@ import 'package:web_dex/bloc/cex_market_data/mockup/performance_mode.dart';
import 'package:web_dex/bloc/cex_market_data/models/graph_cache.dart';
import 'package:web_dex/bloc/cex_market_data/models/graph_type.dart';
import 'package:web_dex/bloc/cex_market_data/portfolio_growth/portfolio_growth_repository.dart';
import 'package:web_dex/bloc/coins_bloc/coins_repo.dart';
import 'package:web_dex/mm2/mm2_api/mm2_api.dart';

class MockPortfolioGrowthRepository extends PortfolioGrowthRepository {
final PerformanceMode performanceMode;

MockPortfolioGrowthRepository({
required super.cexRepository,
required super.transactionHistoryRepo,
required super.cacheProvider,
required this.performanceMode,
required super.coinsRepository,
required super.sdk,
});

MockPortfolioGrowthRepository.withDefaults({
required this.performanceMode,
required CoinsRepo coinsRepository,
required Mm2Api mm2Api,
required super.coinsRepository,
required super.sdk,
}) : super(
cexRepository: BinanceRepository(
binanceProvider: const BinanceProvider(),
),
transactionHistoryRepo: MockTransactionHistoryRepo(
api: mm2Api,
client: Client(),
performanceMode: performanceMode,
demoDataGenerator: DemoDataCache.withDefaults(),
),
cacheProvider: HiveLazyBoxProvider<String, GraphCache>(
name: GraphType.balanceGrowth.tableName,
),
coinsRepository: coinsRepository,
);

final PerformanceMode performanceMode;
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,17 @@
import 'package:http/http.dart';
import 'package:komodo_defi_types/komodo_defi_types.dart';
import 'package:web_dex/bloc/cex_market_data/mockup/generator.dart';
import 'package:web_dex/bloc/cex_market_data/mockup/performance_mode.dart';
import 'package:web_dex/bloc/transaction_history/transaction_history_repo.dart';
import 'package:web_dex/mm2/mm2_api/mm2_api.dart';

class MockTransactionHistoryRepo implements TransactionHistoryRepo {
final PerformanceMode performanceMode;
final DemoDataCache demoDataGenerator;

MockTransactionHistoryRepo({
required Mm2Api api,
required Client client,
required this.performanceMode,
required this.demoDataGenerator,
});

final PerformanceMode performanceMode;
final DemoDataCache demoDataGenerator;

@override
Future<List<Transaction>> fetch(AssetId assetId) {
return demoDataGenerator.loadTransactionsDemoData(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,16 @@ class GraphCacheAdapter extends TypeAdapter<GraphCache> {
graph: (fields[3] as List<dynamic>).cast<Point<double>>(),
graphType: GraphType.fromName(fields[4] as String),
walletId: fields[5] as String,
// Load conditionally, and set a default value for backwards compatibility
// with existing data
isHdWallet: fields.containsKey(6) ? fields[6] as bool : false,
);
}

@override
void write(BinaryWriter writer, GraphCache obj) {
writer
..writeByte(6)
..writeByte(7)
..writeByte(0)
..write(obj.coinId)
..writeByte(1)
Expand All @@ -39,7 +42,9 @@ class GraphCacheAdapter extends TypeAdapter<GraphCache> {
..writeByte(4)
..write(obj.graphType.name)
..writeByte(5)
..write(obj.walletId);
..write(obj.walletId)
..writeByte(6)
..write(obj.isHdWallet);
}

@override
Expand Down
Loading
Loading