...
This commit is contained in:
@@ -4,6 +4,8 @@ import 'package:flutter/foundation.dart';
|
||||
import '../../../core/utils/error_utils.dart';
|
||||
import '../models/gamification_models.dart';
|
||||
import '../services/gamification_service.dart';
|
||||
import '../../events/services/events_service.dart';
|
||||
import '../../events/models/event_models.dart';
|
||||
|
||||
class GamificationProvider extends ChangeNotifier {
|
||||
final GamificationService _service = GamificationService();
|
||||
@@ -16,6 +18,7 @@ class GamificationProvider extends ChangeNotifier {
|
||||
List<SubmissionModel> submissions = [];
|
||||
CurrentUserStats? currentUserStats;
|
||||
int totalParticipants = 0;
|
||||
List<String> eventCategories = [];
|
||||
|
||||
// Leaderboard filters — matches web version
|
||||
String leaderboardDistrict = 'Overall Kerala';
|
||||
@@ -44,26 +47,53 @@ class GamificationProvider extends ChangeNotifier {
|
||||
|
||||
try {
|
||||
final results = await Future.wait([
|
||||
_service.getDashboard(),
|
||||
_service.getShopItems(),
|
||||
_service.getAchievements(),
|
||||
_service.getDashboard().catchError((e) {
|
||||
debugPrint('Dashboard error: $e');
|
||||
return const DashboardResponse(profile: UserGamificationProfile(userId: '', lifetimeEp: 0, currentEp: 0, currentRp: 0, tier: ContributorTier.BRONZE));
|
||||
}),
|
||||
_service.getLeaderboard(district: leaderboardDistrict, timePeriod: leaderboardTimePeriod).catchError((e) {
|
||||
debugPrint('Leaderboard error: $e');
|
||||
return const LeaderboardResponse(entries: []);
|
||||
}),
|
||||
_service.getShopItems().catchError((e) {
|
||||
debugPrint('Shop error: $e');
|
||||
return <ShopItem>[];
|
||||
}),
|
||||
_service.getAchievements().catchError((e) {
|
||||
debugPrint('Achievements error: $e');
|
||||
return <AchievementBadge>[];
|
||||
}),
|
||||
EventsService().getEventTypes().catchError((e) {
|
||||
debugPrint('EventTypes error: $e');
|
||||
return <EventTypeModel>[];
|
||||
}),
|
||||
]);
|
||||
|
||||
final dashboard = results[0] as DashboardResponse;
|
||||
profile = dashboard.profile;
|
||||
submissions = dashboard.submissions;
|
||||
|
||||
shopItems = results[1] as List<ShopItem>;
|
||||
final lbResponse = results[1] as LeaderboardResponse;
|
||||
leaderboard = _filterAndReRank(lbResponse.entries, leaderboardDistrict, leaderboardTimePeriod);
|
||||
currentUserStats = lbResponse.currentUser;
|
||||
totalParticipants = lbResponse.totalParticipants;
|
||||
|
||||
shopItems = results[2] as List<ShopItem>;
|
||||
|
||||
// Prefer achievements from dashboard API; fall back to fetched or existing defaults
|
||||
final dashAchievements = dashboard.achievements;
|
||||
final fetchedAchievements = results[2] as List<AchievementBadge>;
|
||||
final fetchedAchievements = results[3] as List<AchievementBadge>;
|
||||
|
||||
if (dashAchievements.isNotEmpty) {
|
||||
achievements = dashAchievements;
|
||||
} else if (fetchedAchievements.isNotEmpty) {
|
||||
achievements = fetchedAchievements;
|
||||
}
|
||||
|
||||
final eventTypes = results[4] as List<EventTypeModel>;
|
||||
if (eventTypes.isNotEmpty) {
|
||||
eventCategories = eventTypes.map((e) => e.name).toList();
|
||||
}
|
||||
// Otherwise, keep current defaults
|
||||
|
||||
_lastLoadTime = DateTime.now();
|
||||
@@ -107,7 +137,7 @@ class GamificationProvider extends ChangeNotifier {
|
||||
notifyListeners();
|
||||
try {
|
||||
final response = await _service.getLeaderboard(district: district, timePeriod: leaderboardTimePeriod);
|
||||
leaderboard = response.entries;
|
||||
leaderboard = _filterAndReRank(response.entries, district, leaderboardTimePeriod);
|
||||
currentUserStats = response.currentUser;
|
||||
totalParticipants = response.totalParticipants;
|
||||
} catch (e) {
|
||||
@@ -128,7 +158,7 @@ class GamificationProvider extends ChangeNotifier {
|
||||
notifyListeners();
|
||||
try {
|
||||
final response = await _service.getLeaderboard(district: leaderboardDistrict, timePeriod: period);
|
||||
leaderboard = response.entries;
|
||||
leaderboard = _filterAndReRank(response.entries, leaderboardDistrict, period);
|
||||
currentUserStats = response.currentUser;
|
||||
totalParticipants = response.totalParticipants;
|
||||
} catch (e) {
|
||||
@@ -182,4 +212,41 @@ class GamificationProvider extends ChangeNotifier {
|
||||
Future<void> submitContribution(Map<String, dynamic> data) async {
|
||||
await _service.submitContribution(data);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Helper: Filter by district and re-rank results locally.
|
||||
// This is a fallback in case the backend returns a global list for a district-specific query.
|
||||
// ---------------------------------------------------------------------------
|
||||
List<LeaderboardEntry> _filterAndReRank(List<LeaderboardEntry> entries, String district, String period) {
|
||||
if (entries.isEmpty) return [];
|
||||
|
||||
List<LeaderboardEntry> result = entries;
|
||||
if (district != 'Overall Kerala') {
|
||||
// Case-insensitive filtering to be robust
|
||||
result = entries.where((e) => e.district?.toLowerCase() == district.toLowerCase()).toList();
|
||||
}
|
||||
|
||||
// Sort based on period
|
||||
if (period == 'this_month') {
|
||||
result.sort((a, b) => b.monthlyPoints.compareTo(a.monthlyPoints));
|
||||
} else {
|
||||
result.sort((a, b) => b.lifetimeEp.compareTo(a.lifetimeEp));
|
||||
}
|
||||
|
||||
// Assign new ranks based on local sort order
|
||||
return List.generate(result.length, (i) {
|
||||
final e = result[i];
|
||||
return LeaderboardEntry(
|
||||
rank: i + 1,
|
||||
username: e.username,
|
||||
avatarUrl: e.avatarUrl,
|
||||
lifetimeEp: e.lifetimeEp,
|
||||
monthlyPoints: e.monthlyPoints,
|
||||
tier: e.tier,
|
||||
eventsCount: e.eventsCount,
|
||||
isCurrentUser: e.isCurrentUser,
|
||||
district: e.district,
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user