From d7808773e27a236db910710451bcba10ebfd4a43 Mon Sep 17 00:00:00 2001 From: joschy2002 Date: Wed, 2 Jul 2025 10:31:35 +0200 Subject: [PATCH] Bug fixed --- trainerbox/lib/screens/home_screen.dart | 109 ++++++++++++++++-------- 1 file changed, 75 insertions(+), 34 deletions(-) diff --git a/trainerbox/lib/screens/home_screen.dart b/trainerbox/lib/screens/home_screen.dart index 793f0a0..3ca20c5 100644 --- a/trainerbox/lib/screens/home_screen.dart +++ b/trainerbox/lib/screens/home_screen.dart @@ -31,6 +31,7 @@ class _HomeScreenState extends State { List> _suggestions = []; bool _isLoadingSuggestions = true; String? _suggestionsError; + String? _userRole; @override void initState() { @@ -116,11 +117,11 @@ class _HomeScreenState extends State { if (!userDoc.exists) return; final userData = userDoc.data() as Map; - final userRole = userData['role'] as String?; + _userRole = userData['role'] as String?; final userClub = userData['club'] as String?; QuerySnapshot trainersSnapshot; - if (userRole == 'trainer') { + if (_userRole == 'trainer') { // Trainer sees only their own trainings trainersSnapshot = await FirebaseFirestore.instance .collection('User') @@ -153,45 +154,84 @@ class _HomeScreenState extends State { final trainingTimes = trainerData['trainingTimes'] as Map? ?? {}; final trainingDurations = trainerData['trainingDurations'] as Map? ?? {}; final cancelledTrainings = trainerData['cancelledTrainings'] as List? ?? []; + final trainings = trainerData['trainings'] as Map? ?? {}; - trainingTimes.forEach((day, timeStr) { - if (timeStr == null) return; + // First, check individual trainings (manually added) + trainings.forEach((dateString, trainingsList) { + final date = DateTime.tryParse(dateString); + if (date == null) return; - final timeParts = (timeStr as String).split(':'); - if (timeParts.length != 2) return; - - final hour = int.tryParse(timeParts[0]) ?? 0; - final minute = int.tryParse(timeParts[1]) ?? 0; + // Only consider future trainings + if (date.isBefore(now)) return; - final daysUntilNext = _getDaysUntilNext(day, now.weekday); - final eventDate = DateTime(now.year, now.month, now.day + daysUntilNext, hour, minute); - - // Check the next 4 weeks - for (var i = 0; i < 4; i++) { - final date = eventDate.add(Duration(days: i * 7)); - final normalizedDate = DateTime(date.year, date.month, date.day); - final dateString = normalizedDate.toIso8601String(); + final list = List>.from(trainingsList); + for (final training in list) { + final trainingTime = training['time'] as String? ?? '19:00'; + final trainingDuration = training['duration'] as int? ?? 60; - final isCancelled = cancelledTrainings.any((cancelled) { - if (cancelled is Map) { - final cancelledDate = DateTime.parse(cancelled['date'] as String); - return isSameDay(cancelledDate, normalizedDate); - } - return false; - }); - - if (!isCancelled && (nextTrainingDate == null || date.isBefore(nextTrainingDate!))) { - nextTrainingDate = date; + final timeParts = trainingTime.split(':'); + if (timeParts.length != 2) continue; + + final hour = int.tryParse(timeParts[0]) ?? 0; + final minute = int.tryParse(timeParts[1]) ?? 0; + final trainingDateTime = DateTime(date.year, date.month, date.day, hour, minute); + + if (trainingDateTime.isAfter(now) && (nextTrainingDate == null || trainingDateTime.isBefore(nextTrainingDate!))) { + nextTrainingDate = trainingDateTime; nextTraining = { 'date': dateString, - 'time': timeStr, - 'duration': trainingDurations[day] ?? 60, + 'time': trainingTime, + 'duration': trainingDuration, 'trainerName': trainerData['name'] ?? 'Unknown Trainer', - 'day': day, + 'day': DateFormat('EEEE', 'de_DE').format(date), }; } } }); + + // Then check regular training times (only if no individual training was found) + if (nextTrainingDate == null) { + trainingTimes.forEach((day, timeStr) { + if (timeStr == null) return; + + final timeParts = (timeStr as String).split(':'); + if (timeParts.length != 2) return; + + final hour = int.tryParse(timeParts[0]) ?? 0; + final minute = int.tryParse(timeParts[1]) ?? 0; + + final daysUntilNext = _getDaysUntilNext(day, now.weekday); + final eventDate = DateTime(now.year, now.month, now.day + daysUntilNext, hour, minute); + + // Check the next 4 weeks + for (var i = 0; i < 4; i++) { + final date = eventDate.add(Duration(days: i * 7)); + final normalizedDate = DateTime(date.year, date.month, date.day); + final dateString = normalizedDate.toIso8601String(); + + final isCancelled = cancelledTrainings.any((cancelled) { + if (cancelled is Map) { + final cancelledDate = DateTime.parse(cancelled['date'] as String); + return isSameDay(cancelledDate, normalizedDate); + } + return false; + }); + + if (!isCancelled) { + if (nextTrainingDate == null || date.isBefore(nextTrainingDate!)) { + nextTrainingDate = date; + nextTraining = { + 'date': dateString, + 'time': timeStr, + 'duration': trainingDurations[day] ?? 60, + 'trainerName': trainerData['name'] ?? 'Unknown Trainer', + 'day': day, + }; + } + } + } + }); + } } setState(() { @@ -237,9 +277,10 @@ class _HomeScreenState extends State { setState(() { _selectedIndex = index; }); - // Reload suggestions when switching to the Home tab + // Reload suggestions and next training when switching to the Home tab if (index == 0) { _loadSuggestions(); + _loadNextTraining(); } } } @@ -290,10 +331,10 @@ class _HomeScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 16), - const Center( + Center( child: Text( - 'Hallo Trainer!', - style: TextStyle( + _userRole == 'trainer' ? 'Hallo Trainer!' : 'Hallo Spieler!', + style: const TextStyle( fontSize: 32, fontWeight: FontWeight.bold, color: Color(0xFFE57399),