rwadurian/frontend/mining-app/lib/presentation/providers/asset_providers.dart

78 lines
2.3 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:async';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../domain/entities/asset_display.dart';
import '../../domain/repositories/trading_repository.dart';
import '../../core/di/injection.dart';
import 'trading_providers.dart';
/// 我的资产显示 Provider (需要登录,使用 JWT token)
final myAssetProvider = FutureProvider<AssetDisplay?>((ref) async {
final repository = ref.watch(tradingRepositoryProvider);
final result = await repository.getMyAsset();
ref.keepAlive();
final timer = Timer(const Duration(minutes: 2), () {
ref.invalidateSelf();
});
ref.onDispose(() => timer.cancel());
return result.fold(
(failure) => throw Exception(failure.message),
(asset) => asset,
);
});
/// 指定账户资产显示 Provider (public API)
final accountAssetProvider = FutureProvider.family<AssetDisplay?, String>(
(ref, accountSequence) async {
if (accountSequence.isEmpty) return null;
final repository = ref.watch(tradingRepositoryProvider);
final result = await repository.getAccountAsset(accountSequence);
ref.keepAlive();
final timer = Timer(const Duration(minutes: 2), () {
ref.invalidateSelf();
});
ref.onDispose(() => timer.cancel());
return result.fold(
(failure) => throw Exception(failure.message),
(asset) => asset,
);
},
);
/// 资产显示值计算器 - 用于实时显示资产估值
/// displayAssetValue = (账户积分股 + 账户积分股 × 倍数) × 积分股价
class AssetValueCalculator {
final String shareBalance;
final String burnMultiplier;
final String currentPrice;
AssetValueCalculator({
required this.shareBalance,
required this.burnMultiplier,
required this.currentPrice,
});
/// 计算有效积分股 = 余额 × (1 + 倍数)
double get effectiveShares {
final balance = double.tryParse(shareBalance) ?? 0;
final multiplier = double.tryParse(burnMultiplier) ?? 0;
return balance * (1 + multiplier);
}
/// 计算资产显示值 = 有效积分股 × 价格
double get displayValue {
final price = double.tryParse(currentPrice) ?? 0;
return effectiveShares * price;
}
/// 计算每秒增长值
static double calculateGrowthPerSecond(String dailyAllocation) {
final daily = double.tryParse(dailyAllocation) ?? 0;
return daily / 24 / 60 / 60;
}
}