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

92 lines
2.7 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/contribution.dart';
import '../../domain/repositories/contribution_repository.dart';
import '../../core/di/injection.dart';
import 'user_providers.dart';
/// 用户统计数据 - 来自贡献值服务
class UserStats {
/// 是否已认种
final bool hasAdopted;
/// 直推认种用户数
final int directReferralAdoptedCount;
/// 已解锁层级深度(可理解为团队层数)
final int unlockedLevelDepth;
/// 已解锁奖励档位数VIP等级
final int unlockedBonusTiers;
/// 总贡献值
final String totalContribution;
const UserStats({
this.hasAdopted = false,
this.directReferralAdoptedCount = 0,
this.unlockedLevelDepth = 0,
this.unlockedBonusTiers = 0,
this.totalContribution = '0',
});
/// 从贡献值账户数据构建
factory UserStats.fromContribution(Contribution contribution) {
return UserStats(
hasAdopted: contribution.hasAdopted,
directReferralAdoptedCount: contribution.directReferralAdoptedCount,
unlockedLevelDepth: contribution.unlockedLevelDepth,
unlockedBonusTiers: contribution.unlockedBonusTiers,
totalContribution: contribution.totalContribution,
);
}
/// VIP等级显示
String get vipLevel {
if (unlockedBonusTiers <= 0) return '-';
return 'V$unlockedBonusTiers';
}
/// 认种数量(简化展示直推数)
int get adoptionCount => hasAdopted ? 1 : 0;
/// 团队人数估算(基于已解锁层级)
int get teamSize {
// 简单估算每层平均3人
if (unlockedLevelDepth <= 0) return 0;
int total = 0;
for (int i = 1; i <= unlockedLevelDepth; i++) {
total += (directReferralAdoptedCount > 0 ? directReferralAdoptedCount : 1) * i;
}
return total;
}
}
/// 用户统计数据 Provider
final userStatsProvider = FutureProvider<UserStats?>((ref) async {
final user = ref.watch(userNotifierProvider);
if (!user.isLoggedIn || user.accountSequence == null) {
return null;
}
final repository = getIt<ContributionRepository>();
final result = await repository.getUserContribution(user.accountSequence!);
ref.keepAlive();
final timer = Timer(const Duration(minutes: 5), () {
ref.invalidateSelf();
});
ref.onDispose(() => timer.cancel());
return result.fold(
(failure) => const UserStats(),
(contribution) => UserStats.fromContribution(contribution),
);
});
/// 邀请码 Provider - 使用账户序号作为邀请码
final invitationCodeProvider = Provider<String>((ref) {
final user = ref.watch(userNotifierProvider);
return user.accountSequence ?? '--------';
});