placeholders removidos e todos os dados reais colocados, com conquistas e tudo

This commit is contained in:
2026-05-17 17:29:47 +01:00
parent 6ba5c837ce
commit 49a7a6fe02
17 changed files with 4688 additions and 142 deletions

View File

@@ -2,30 +2,81 @@ import 'package:flutter/material.dart';
import 'package:flutter_animate/flutter_animate.dart';
import '../../../../core/theme/app_theme_extension.dart';
import '../../../../core/services/gamification_service.dart';
import '../../../../core/models/user_stats.dart';
import '../../../../core/services/auth_service.dart';
/// Progress tracking hero section for student dashboard
class ProgressHeroWidget extends StatelessWidget {
class ProgressHeroWidget extends StatefulWidget {
final String userName;
final double overallProgress;
final List<String> masteredConcepts;
final int studyTimeMinutes;
final int streakDays;
const ProgressHeroWidget({
super.key,
required this.userName,
this.overallProgress = 0.65,
this.masteredConcepts = const [
'Fundamentos de Programação',
'Algoritmos Básicos',
'Estruturas de Dados',
],
this.studyTimeMinutes = 245,
this.streakDays = 7,
});
@override
State<ProgressHeroWidget> createState() => _ProgressHeroWidgetState();
}
class _ProgressHeroWidgetState extends State<ProgressHeroWidget> {
@override
Widget build(BuildContext context) {
return FutureBuilder<UserStats?>(
future: _loadUserStats(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return _buildLoadingState();
}
if (snapshot.hasError) {
return _buildErrorState();
}
final userStats = snapshot.data;
return _buildContent(userStats);
},
);
}
Future<UserStats?> _loadUserStats() async {
try {
final user = AuthService.currentUser;
if (user != null) {
return await GamificationService.getUserStats(user.uid);
}
return null;
} catch (e) {
print('Error loading user stats: $e');
return null;
}
}
double _calculateOverallProgress(UserStats? userStats) {
if (userStats == null || userStats.masteredConcepts.isEmpty) {
return 0.0;
}
final totalMastery = userStats.masteredConcepts
.map((c) => c.masteryLevel)
.reduce((a, b) => a + b);
return totalMastery / (userStats.masteredConcepts.length * 100);
}
Widget _buildLoadingState() {
return const Center(child: CircularProgressIndicator());
}
Widget _buildErrorState() {
return const Center(child: Text('Erro ao carregar dados'));
}
Widget _buildContent(UserStats? userStats) {
final streakDays = userStats?.currentStreak ?? 0;
final overallProgress = _calculateOverallProgress(userStats);
final masteredConcepts = userStats?.masteredConcepts.map((c) => c.conceptName).toList() ?? [];
final studyTimeMinutes = userStats?.totalStudyTime ?? 0;
return Container(
margin: const EdgeInsets.only(bottom: 24),
child: Column(
@@ -48,7 +99,7 @@ class ProgressHeroWidget extends StatelessWidget {
),
const SizedBox(height: 4),
Text(
'Continue assim, $userName!',
'Continue assim, ${widget.userName}!',
style: TextStyle(
color: Theme.of(context).colorScheme.onSurfaceVariant,
fontSize: 16,