diff options
Diffstat (limited to 'lib/screens/events_screen.dart')
-rw-r--r-- | lib/screens/events_screen.dart | 87 |
1 files changed, 68 insertions, 19 deletions
diff --git a/lib/screens/events_screen.dart b/lib/screens/events_screen.dart index 0b78fbe..9183e5e 100644 --- a/lib/screens/events_screen.dart +++ b/lib/screens/events_screen.dart @@ -1,6 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:pmsna1/utils.dart'; +import 'package:provider/provider.dart'; import 'package:table_calendar/table_calendar.dart'; +import '../models/event.dart'; +import '../providers/events_provider.dart'; import '../widgets/event_list.dart'; enum Vista { calendario, lista } @@ -18,8 +22,32 @@ class _EventsScreenState extends State<EventsScreen> { DateTime _focusedDay = DateTime.now(); CalendarFormat _calendarFormat = CalendarFormat.month; + Color? getEventColor(Event e) { + DateTime today = DateTime.now(); + if (daysBetween(today, e.date) > 0 && daysBetween(today, e.date) <= 2) { + // 7. Cuando el evento esté a 2 días de realizarse, la + // celda del calendario deberá pintarse de color amarillo + return Colors.yellow; + } else if (isSameDay(e.date, today)) { + // 8. Cuando el evento sea el día en curso cambiará a un + // color verde + return Colors.green; + } else if (today.isAfter(e.date) && !e.completed) { + // 9. Cuando el evento ya haya pasado y no se haya + // completado, entonces se marcará en rojo + return Colors.red; + } else if (today.isAfter(e.date) && e.completed) { + // 10. Si el evento ya pasó y está como completado se + // dejará en verde + return Colors.green; + } + return null; + } + @override Widget build(BuildContext context) { + EventsProvider provider = Provider.of<EventsProvider>(context); + return Scaffold( appBar: AppBar( title: const Text('Eventos'), @@ -47,25 +75,46 @@ class _EventsScreenState extends State<EventsScreen> { ), body: Container( child: vista == Vista.calendario - ? TableCalendar( - firstDay: DateTime.fromMicrosecondsSinceEpoch(0), - lastDay: DateTime.utc(9000, 12, 31), - focusedDay: _focusedDay, - selectedDayPredicate: (day) { - return isSameDay(_selectedDay, day); - }, - onDaySelected: (selectedDay, focusedDay) { - setState(() { - _selectedDay = selectedDay; - _focusedDay = focusedDay; - }); - }, - calendarFormat: _calendarFormat, - onFormatChanged: (format) { - setState(() { - _calendarFormat = format; - }); - }, + ? SingleChildScrollView( + child: TableCalendar( + firstDay: DateTime.fromMicrosecondsSinceEpoch(0), + lastDay: DateTime.utc(9000, 12, 31), + focusedDay: _focusedDay, + selectedDayPredicate: (day) { + return isSameDay(_selectedDay, day); + }, + onDaySelected: (selectedDay, focusedDay) { + setState(() { + _selectedDay = selectedDay; + _focusedDay = focusedDay; + }); + }, + calendarFormat: _calendarFormat, + onFormatChanged: (format) { + setState(() { + _calendarFormat = format; + }); + }, + eventLoader: (day) => provider.getEventsForDay(day), + // Source: https://stackoverflow.com/a/69036998 + calendarBuilders: CalendarBuilders( + singleMarkerBuilder: (context, day, event) { + if (event == null) return null; + Event e = event as Event; + Color color = getEventColor(e) ?? + Theme.of(context).colorScheme.onSurface; + return Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + color: color, + ), + width: 5.0, + height: 5.0, + margin: const EdgeInsets.symmetric(horizontal: 1.5), + ); + }, + ), + ), ) : const EventList()), floatingActionButton: FloatingActionButton.extended( |