diff --git a/creche_app/lib/features/diary/diary_history_screen.dart b/creche_app/lib/features/diary/diary_history_screen.dart deleted file mode 100644 index 6c7e2e1..0000000 --- a/creche_app/lib/features/diary/diary_history_screen.dart +++ /dev/null @@ -1,258 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:supabase_flutter/supabase_flutter.dart'; -import 'package:table_calendar/table_calendar.dart'; -import 'package:intl/intl.dart'; -import '/models/daily_diary.dart'; - -class DiaryHistoryScreen extends ConsumerStatefulWidget { - final String childId; - const DiaryHistoryScreen({super.key, required this.childId}); - - @override - ConsumerState createState() => - _DiaryHistoryScreenState(); -} - -class _DiaryHistoryScreenState extends ConsumerState { - DateTime _focusedDay = DateTime.now(); - DateTime? _selectedDay; - - String _moodEmoji(String? mood) { - switch (mood) { - case 'happy': return '😊'; - case 'normal': return '😐'; - case 'sad': return '😟'; - case 'sick': return '🤒'; - case 'excited': return '😃'; - default: return '😐'; - } - } - - @override - Widget build(BuildContext context) { - final supabase = Supabase.instance.client; - - return Scaffold( - backgroundColor: const Color(0xFF1A1A2E), - appBar: AppBar( - backgroundColor: const Color(0xFF16213E), - title: const Text('Histórico do Diário', - style: TextStyle(color: Color(0xFF4FC3F7))), - ), - body: Column( - children: [ - // Calendário - Container( - color: const Color(0xFF16213E), - child: TableCalendar( - firstDay: DateTime.now().subtract(const Duration(days: 365)), - lastDay: DateTime.now(), - focusedDay: _focusedDay, - selectedDayPredicate: (day) => isSameDay(_selectedDay, day), - onDaySelected: (selected, focused) { - setState(() { - _selectedDay = selected; - _focusedDay = focused; - }); - }, - calendarStyle: const CalendarStyle( - defaultTextStyle: TextStyle(color: Colors.white), - weekendTextStyle: TextStyle(color: Color(0xFF4FC3F7)), - selectedDecoration: BoxDecoration( - color: Color(0xFF4FC3F7), - shape: BoxShape.circle, - ), - todayDecoration: BoxDecoration( - color: Color(0xFF333366), - shape: BoxShape.circle, - ), - outsideDaysVisible: false, - ), - headerStyle: const HeaderStyle( - formatButtonVisible: false, - titleCentered: true, - titleTextStyle: TextStyle(color: Colors.white, fontSize: 16), - leftChevronIcon: - Icon(Icons.chevron_left, color: Color(0xFF4FC3F7)), - rightChevronIcon: - Icon(Icons.chevron_right, color: Color(0xFF4FC3F7)), - ), - daysOfWeekStyle: const DaysOfWeekStyle( - weekdayStyle: TextStyle(color: Color(0xFF888888)), - weekendStyle: TextStyle(color: Color(0xFF4FC3F7)), - ), - ), - ), - - // Lista de diários - Expanded( - child: StreamBuilder>>( - stream: supabase - .from('daily_diaries') - .stream(primaryKey: ['id']).eq('child_id', widget.childId), - builder: (context, snapshot) { - if (!snapshot.hasData) { - return const Center( - child: CircularProgressIndicator( - color: Color(0xFF4FC3F7))); - } - - var diaries = - snapshot.data!.map(DailyDiary.fromMap).toList() - ..sort((a, b) => b.date.compareTo(a.date)); - - if (_selectedDay != null) { - diaries = diaries - .where((d) => isSameDay(d.date, _selectedDay)) - .toList(); - } - - if (diaries.isEmpty) { - return const Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Icon(Icons.book_outlined, - size: 60, color: Color(0xFF333366)), - SizedBox(height: 12), - Text('Sem diários neste dia.', - style: TextStyle(color: Color(0xFF888888))), - ], - ), - ); - } - - return ListView.builder( - padding: const EdgeInsets.all(16), - itemCount: diaries.length, - itemBuilder: (context, i) { - final diary = diaries[i]; - return _DiaryCard(diary: diary, moodEmoji: _moodEmoji); - }, - ); - }, - ), - ), - ], - ), - ); - } -} - -class _DiaryCard extends StatelessWidget { - final DailyDiary diary; - final String Function(String?) moodEmoji; - const _DiaryCard({required this.diary, required this.moodEmoji}); - - @override - Widget build(BuildContext context) { - return Container( - margin: const EdgeInsets.only(bottom: 14), - padding: const EdgeInsets.all(16), - decoration: BoxDecoration( - color: const Color(0xFF16213E), - borderRadius: BorderRadius.circular(16), - border: Border.all(color: const Color(0xFF333366)), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // Header: data + humor - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - DateFormat('d MMMM yyyy', 'pt_PT').format(diary.date), - style: const TextStyle( - color: Color(0xFF4FC3F7), - fontWeight: FontWeight.bold, - fontSize: 15), - ), - Text(moodEmoji(diary.mood), - style: const TextStyle(fontSize: 28)), - ], - ), - const Divider(color: Color(0xFF333366), height: 16), - - // Alimentação - if (diary.food != null && diary.food!.isNotEmpty) - _InfoRow(icon: Icons.restaurant, label: 'Alimentação', value: diary.food!), - - // Sono - if (diary.sleepMinutes != null && diary.sleepMinutes! > 0) - _InfoRow( - icon: Icons.bedtime, - label: 'Sono', - value: - '${diary.sleepMinutes! ~/ 60}h ${diary.sleepMinutes! % 60}min', - ), - - // Atividades - if (diary.activities != null && diary.activities!.isNotEmpty) - _InfoRow( - icon: Icons.sports_esports, - label: 'Atividades', - value: diary.activities!), - - // Notas - if (diary.notes != null && diary.notes!.isNotEmpty) - _InfoRow( - icon: Icons.note, - label: 'Notas', - value: diary.notes!), - - // Fotos - if (diary.photos.isNotEmpty) ...[ - const SizedBox(height: 8), - SizedBox( - height: 80, - child: ListView.builder( - scrollDirection: Axis.horizontal, - itemCount: diary.photos.length, - itemBuilder: (context, i) => Padding( - padding: const EdgeInsets.only(right: 8), - child: ClipRRect( - borderRadius: BorderRadius.circular(8), - child: Image.network(diary.photos[i], - width: 80, height: 80, fit: BoxFit.cover), - ), - ), - ), - ), - ], - ], - ), - ); - } -} - -class _InfoRow extends StatelessWidget { - final IconData icon; - final String label; - final String value; - const _InfoRow( - {required this.icon, required this.label, required this.value}); - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.only(bottom: 8), - child: Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Icon(icon, size: 16, color: const Color(0xFF4FC3F7)), - const SizedBox(width: 8), - Text('$label: ', - style: const TextStyle( - color: Color(0xFF888888), - fontSize: 13, - fontWeight: FontWeight.w500)), - Expanded( - child: Text(value, - style: const TextStyle(color: Colors.white, fontSize: 13))), - ], - ), - ); - } -}