feat(mining-app): add share pool balance display on contribution page

Display real-time share pool balance (积分股池实时余量) in the total
contribution card on the contribution page.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-01-15 04:27:48 -08:00
parent 19428a8cb7
commit d12bbb17be
1 changed files with 34 additions and 2 deletions

View File

@ -5,8 +5,10 @@ import '../../../core/constants/app_colors.dart';
import '../../../core/router/routes.dart';
import '../../../core/utils/format_utils.dart';
import '../../../domain/entities/contribution.dart';
import '../../../domain/entities/market_overview.dart';
import '../../providers/user_providers.dart';
import '../../providers/contribution_providers.dart';
import '../../providers/trading_providers.dart';
import '../../widgets/shimmer_loading.dart';
class ContributionPage extends ConsumerWidget {
@ -28,6 +30,8 @@ class ContributionPage extends ConsumerWidget {
//
final estimatedEarnings = ref.watch(estimatedEarningsProvider(accountSequence));
final statsAsync = ref.watch(contributionStatsProvider);
//
final marketAsync = ref.watch(marketOverviewProvider);
// Extract loading state and data from AsyncValue
final isLoading = contributionAsync.isLoading;
@ -35,6 +39,8 @@ class ContributionPage extends ConsumerWidget {
final hasError = contributionAsync.hasError;
final error = contributionAsync.error;
final isStatsLoading = statsAsync.isLoading;
final isMarketLoading = marketAsync.isLoading;
final market = marketAsync.valueOrNull;
return Scaffold(
backgroundColor: const Color(0xFFF5F5F5),
@ -44,6 +50,7 @@ class ContributionPage extends ConsumerWidget {
onRefresh: () async {
ref.invalidate(contributionProvider(accountSequence));
ref.invalidate(contributionStatsProvider);
ref.invalidate(marketOverviewProvider);
},
child: hasError && contribution == null
? Center(
@ -71,7 +78,7 @@ class ContributionPage extends ConsumerWidget {
sliver: SliverList(
delegate: SliverChildListDelegate([
//
_buildTotalContributionCard(ref, contribution, isLoading),
_buildTotalContributionCard(ref, contribution, isLoading, market, isMarketLoading),
const SizedBox(height: 16),
//
_buildThreeColumnStats(ref, contribution, isLoading),
@ -156,7 +163,13 @@ class ContributionPage extends ConsumerWidget {
);
}
Widget _buildTotalContributionCard(WidgetRef ref, Contribution? contribution, bool isLoading) {
Widget _buildTotalContributionCard(
WidgetRef ref,
Contribution? contribution,
bool isLoading,
MarketOverview? market,
bool isMarketLoading,
) {
final total = contribution?.totalContribution ?? '0';
final hideAmounts = ref.watch(hideAmountsProvider);
return Container(
@ -200,6 +213,25 @@ class ContributionPage extends ConsumerWidget {
),
),
const SizedBox(height: 12),
//
Row(
children: [
Text(
'积分股池实时余量: ',
style: TextStyle(fontSize: 12, color: _grayText.withOpacity(0.9)),
),
isMarketLoading
? const ShimmerText(
placeholder: '----',
style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: _orange),
)
: Text(
hideAmounts ? '******' : formatAmount(market?.greenPoints ?? '0'),
style: const TextStyle(fontSize: 12, fontWeight: FontWeight.w600, color: _orange),
),
],
),
const SizedBox(height: 8),
//
Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),