Muitas coisas e já me esqueci delas todas, cenas principalmente no dashboard do aluno bug fixes e etc

This commit is contained in:
2026-05-17 19:42:49 +01:00
parent 7a26223a01
commit e388ca3b67
20 changed files with 1989 additions and 1224 deletions

View File

@@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter_animate/flutter_animate.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import '../../../../core/theme/app_theme_extension.dart';
@@ -11,10 +10,7 @@ import '../../../../core/services/auth_service.dart';
class TeacherHeroWidget extends StatefulWidget {
final String userName;
const TeacherHeroWidget({
super.key,
required this.userName,
});
const TeacherHeroWidget({super.key, required this.userName});
@override
State<TeacherHeroWidget> createState() => _TeacherHeroWidgetState();
@@ -35,18 +31,21 @@ class _TeacherHeroWidgetState extends State<TeacherHeroWidget> {
final user = AuthService.currentUser;
if (user == null) return;
// Obter turmas do professor
// Obter disciplinas do professor
final classesSnapshot = await FirebaseFirestore.instance
.collection('classes')
.where('teacherId', isEqualTo: user.uid)
.get();
final classStatsList = <ClassStats>[];
for (final classDoc in classesSnapshot.docs) {
final classId = classDoc.id;
// Forçar atualização para obter dados mais recentes
final stats = await GamificationService.getClassStats(classId, forceRefresh: true);
final stats = await GamificationService.getClassStats(
classId,
forceRefresh: true,
);
if (stats != null) {
classStatsList.add(stats);
}
@@ -68,23 +67,31 @@ class _TeacherHeroWidgetState extends State<TeacherHeroWidget> {
}
}
int get totalStudents => _classStats.fold(0, (sum, stats) => sum + stats.totalStudents);
int get activeQuizzes => _classStats.fold(0, (sum, stats) => sum + stats.activeQuizzes);
int get uploadedContent => _classStats.fold(0, (sum, stats) => sum + stats.totalContent);
int get totalStudents =>
_classStats.fold(0, (sum, stats) => sum + stats.totalStudents);
int get activeQuizzes =>
_classStats.fold(0, (sum, stats) => sum + stats.activeQuizzes);
int get uploadedContent =>
_classStats.fold(0, (sum, stats) => sum + stats.totalContent);
double get classAverageProgress {
if (_classStats.isEmpty) return 0.0;
final totalProgress = _classStats.fold(0.0, (sum, stats) => sum + stats.averageProgress);
final totalProgress = _classStats.fold(
0.0,
(sum, stats) => sum + stats.averageProgress,
);
final average = totalProgress / _classStats.length;
print('=== UI PROGRESS DEBUG ===');
print('Number of classes: ${_classStats.length}');
for (int i = 0; i < _classStats.length; i++) {
print('Class ${i + 1}: ${_classStats[i].className} - ${_classStats[i].averageProgress} (${(_classStats[i].averageProgress * 100).toInt()}%)');
print(
'Class ${i + 1}: ${_classStats[i].className} - ${_classStats[i].averageProgress} (${(_classStats[i].averageProgress * 100).toInt()}%)',
);
}
print('Total progress sum: $totalProgress');
print('Calculated average: $average (${(average * 100).toInt()}%)');
print('=== END UI PROGRESS DEBUG ===');
return average;
}
@@ -109,7 +116,7 @@ class _TeacherHeroWidgetState extends State<TeacherHeroWidget> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Visão Geral da Turma',
'Visão Geral da Disciplina',
style: TextStyle(
color: Theme.of(context).colorScheme.onSurface,
fontSize: 20,
@@ -186,7 +193,7 @@ class _TeacherHeroWidgetState extends State<TeacherHeroWidget> {
children: [
const Flexible(
child: Text(
'Progresso Médio da Turma',
'Progresso Médio da Disciplina',
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: TextStyle(
@@ -198,7 +205,8 @@ class _TeacherHeroWidgetState extends State<TeacherHeroWidget> {
),
Builder(
builder: (context) {
final displayValue = (classAverageProgress * 100).toInt();
final displayValue = (classAverageProgress * 100)
.toInt();
print('=== RENDER DEBUG ===');
print('classAverageProgress: $classAverageProgress');
print('displayValue: $displayValue%');
@@ -264,66 +272,53 @@ class _TeacherHeroWidgetState extends State<TeacherHeroWidget> {
),
],
),
).animate().scale(
duration: const Duration(milliseconds: 600),
curve: Curves.elasticOut,
),
const SizedBox(height: 20),
// Recent Activity
Container(
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface,
borderRadius: BorderRadius.circular(16),
border: Border.all(
color: Theme.of(
context,
).colorScheme.outline.withOpacity(0.2),
),
boxShadow: [
BoxShadow(
color: Theme.of(
context,
).colorScheme.shadow.withOpacity(0.05),
blurRadius: 10,
offset: const Offset(0, 4),
),
],
padding: const EdgeInsets.all(20),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface,
borderRadius: BorderRadius.circular(16),
border: Border.all(
color: Theme.of(context).colorScheme.outline.withOpacity(0.2),
),
boxShadow: [
BoxShadow(
color: Theme.of(context).colorScheme.shadow.withOpacity(0.05),
blurRadius: 10,
offset: const Offset(0, 4),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Row(
children: [
Icon(
Icons.trending_up,
color: Theme.of(context).colorScheme.secondary,
size: 20,
),
const SizedBox(width: 8),
Text(
'Atividade Recente',
style: TextStyle(
color: Theme.of(context).colorScheme.onSurface,
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
],
Icon(
Icons.trending_up,
color: Theme.of(context).colorScheme.secondary,
size: 20,
),
const SizedBox(width: 8),
Text(
'Atividade Recente',
style: TextStyle(
color: Theme.of(context).colorScheme.onSurface,
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 12),
..._buildRecentActivities(),
],
),
)
.animate()
.slideX(
duration: const Duration(milliseconds: 800),
curve: Curves.easeOut,
)
.then(delay: const Duration(milliseconds: 200)),
const SizedBox(height: 12),
..._buildRecentActivities(),
],
),
),
],
),
);
@@ -368,46 +363,54 @@ class _TeacherHeroWidgetState extends State<TeacherHeroWidget> {
List<Widget> _buildRecentActivities() {
final activities = <Widget>[];
if (_classStats.isEmpty) {
activities.add(_buildActivityItem(
context,
'Nenhuma atividade recente',
'Comece criando turmas e conteúdos',
Theme.of(context).colorScheme.onSurfaceVariant,
));
activities.add(
_buildActivityItem(
context,
'Nenhuma atividade recente',
'Comece criando disciplinas e conteúdos',
Theme.of(context).colorScheme.onSurfaceVariant,
),
);
return activities;
}
// Adicionar atividades baseadas nas estatísticas das turmas
// Adicionar atividades baseadas nas estatísticas das disciplinas
for (final stats in _classStats.take(3)) {
if (stats.activeQuizzes > 0) {
activities.add(_buildActivityItem(
context,
'${stats.activeQuizzes} quizzes ativos em ${stats.className}',
'Recente',
Theme.of(context).colorScheme.primary,
));
activities.add(
_buildActivityItem(
context,
'${stats.activeQuizzes} quizzes ativos em ${stats.className}',
'Recente',
Theme.of(context).colorScheme.primary,
),
);
activities.add(const SizedBox(height: 8));
}
if (stats.studentsNeedingSupport.isNotEmpty) {
activities.add(_buildActivityItem(
context,
'${stats.studentsNeedingSupport.length} alunos precisam de apoio em ${stats.className}',
'Ver analytics',
Theme.of(context).colorScheme.error,
));
activities.add(
_buildActivityItem(
context,
'${stats.studentsNeedingSupport.length} alunos precisam de apoio em ${stats.className}',
'Ver analytics',
Theme.of(context).colorScheme.error,
),
);
activities.add(const SizedBox(height: 8));
}
if (stats.totalContent > 0) {
activities.add(_buildActivityItem(
context,
'${stats.totalContent} conteúdos disponíveis em ${stats.className}',
'Atualizado',
Theme.of(context).colorScheme.secondary,
));
activities.add(
_buildActivityItem(
context,
'${stats.totalContent} conteúdos disponíveis em ${stats.className}',
'Atualizado',
Theme.of(context).colorScheme.secondary,
),
);
activities.add(const SizedBox(height: 8));
}
}
@@ -417,14 +420,16 @@ class _TeacherHeroWidgetState extends State<TeacherHeroWidget> {
activities.removeLast();
}
return activities.isEmpty ? [
_buildActivityItem(
context,
'Nenhuma atividade recente',
'Comece criando turmas e conteúdos',
Theme.of(context).colorScheme.onSurfaceVariant,
)
] : activities;
return activities.isEmpty
? [
_buildActivityItem(
context,
'Nenhuma atividade recente',
'Comece criando disciplinas e conteúdos',
Theme.of(context).colorScheme.onSurfaceVariant,
),
]
: activities;
}
Widget _buildActivityItem(