placeholders removidos e todos os dados reais colocados, com conquistas e tudo
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user