From ae932ca582daaf1fb166cc4aeb20d83dde382735 Mon Sep 17 00:00:00 2001 From: Felipe Date: Sat, 6 Jan 2024 18:14:35 -0500 Subject: [PATCH] calendario disponibles y ocupados --- .../presentation/screens/calendar_pro.dart | 214 +++++++++++------- 1 file changed, 130 insertions(+), 84 deletions(-) diff --git a/lib/src/presentation/screens/calendar_pro.dart b/lib/src/presentation/screens/calendar_pro.dart index e1420d6..11df537 100644 --- a/lib/src/presentation/screens/calendar_pro.dart +++ b/lib/src/presentation/screens/calendar_pro.dart @@ -6,6 +6,7 @@ import 'package:prosappco/src/components/schedule_picker.dart'; import 'package:prosappco/src/models/event_model.dart'; import 'package:prosappco/src/models/professional_model.dart'; import 'package:prosappco/src/presentation/screens/map/service.dart'; +import 'package:prosappco/src/presentation/widgets/shared/warning_snackbar.dart'; import 'package:prosappco/src/utils/time_of_day_utils.dart'; import 'package:table_calendar/table_calendar.dart'; import 'package:intl/intl.dart'; @@ -21,7 +22,6 @@ class CalendarProScreen extends StatefulWidget { class _CalendarProScreenState extends State { final uid = AuthenticationRepository.instance.getCurrentUserUid(); - List? _events; EventoService eventoService = EventoService(); CalendarFormat _calendarFormat = CalendarFormat.month; @@ -30,6 +30,8 @@ class _CalendarProScreenState extends State { DateTime now = DateTime.now(); late int numDay; + List? _events; + Map? _horarios; @override @@ -46,15 +48,16 @@ class _CalendarProScreenState extends State { ); } + if (_events == null) { + Event.getEventsAllById(widget.professional.id.toString()).then((value) { + setState(() { + _events = value; + }); + }); + } + today = DateTime.utc(today.year, today.month, today.day); numDay = today.weekday; - - if (_events == null) { - Event.getEventsAllByIdStatus(uid ?? "", 'aprobado') - .then((value) => setState(() { - _events = value; - })); - } } void _onDaySelected(DateTime day, DateTime focusedDay) { @@ -80,8 +83,6 @@ class _CalendarProScreenState extends State { ); } - var events = _events!; - DateTime lastDay = today.add(const Duration(days: 365)); return Scaffold( @@ -109,17 +110,6 @@ class _CalendarProScreenState extends State { selectedDayPredicate: (day) => isSameDay(day, today), calendarFormat: _calendarFormat, onFormatChanged: _onFormatChange, - // eventLoader: (date) { - // return events - // .where((element) { - // DateTime day = DateTime.parse(element.day); - // return (date.year == day.year && - // date.month == day.month && - // date.day == day.day); - // }) - // .map((e) => e.description) - // .toList(); - // }, availableCalendarFormats: const { CalendarFormat.month: 'Mes', CalendarFormat.week: 'Semana', @@ -185,7 +175,7 @@ class _CalendarProScreenState extends State { schedule.range2Hour2!, ); - return rangesItemsa(ranges); + return rangesItemList(ranges, _events); } else { List ranges1 = TimeOfDayUtils.genRanges( schedule.range1Hour1!, @@ -197,73 +187,129 @@ class _CalendarProScreenState extends State { ); return [ - ...rangesItemsa(ranges1), - ...rangesItemsa(ranges2), + ...rangesItemList(ranges1, _events), + ...rangesItemList(ranges2, _events), ]; } } - List rangesItemsa(List ranges) { - return ranges - .map((time) => Card( - elevation: 4, - margin: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10), + List rangesItemList(List ranges, List? events) { + return ranges.map((time) { + if (_isHora1Ocupada(time, events)) { + return Card( + elevation: 4, + margin: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + child: ListTile( + onTap: () { + WarningSnackbar.show( + title: 'Ocupado', + message: 'Este horĂ¡rio ya se encuentra ocupado', + ); + }, + contentPadding: const EdgeInsets.all(16), + leading: Container( + width: 40, + height: 40, + decoration: const BoxDecoration( + gradient: LinearGradient( + colors: [Colors.yellow, Colors.red, Colors.red], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + shape: BoxShape.circle, ), - child: ListTile( - onTap: () { - Navigator.pop(context, [today, time, widget.professional]); + child: const Center( + child: Icon( + Icons.access_time, + color: Colors.white, + ), + ), + ), + title: Text( + time.format(context), + style: const TextStyle(fontSize: 15, fontWeight: FontWeight.bold), + ), + subtitle: const Text( + 'Ocupado', + style: TextStyle( + color: Colors.red, fontSize: 13, fontWeight: FontWeight.bold), + ), + trailing: const Icon( + Icons.arrow_forward_ios, + color: Colors.grey, + ), + ), + ); + } else { + return Card( + elevation: 4, + margin: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + child: ListTile( + onTap: () { + Navigator.pop(context, [today, time, widget.professional]); + }, + contentPadding: const EdgeInsets.all(16), + leading: Container( + width: 40, + height: 40, + decoration: const BoxDecoration( + gradient: LinearGradient( + colors: [Colors.blue, Colors.green], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + shape: BoxShape.circle, + ), + child: const Center( + child: Icon( + Icons.access_time, + color: Colors.white, + ), + ), + ), + title: Text( + time.format(context), + style: const TextStyle(fontSize: 15, fontWeight: FontWeight.bold), + ), + subtitle: const Text( + 'Disponible', + style: TextStyle( + color: Colors.green, + fontSize: 13, + fontWeight: FontWeight.bold), + ), + trailing: const Icon( + Icons.arrow_forward_ios, + color: Colors.grey, + ), + ), + ); + } + }).toList(); + } - // Navigator.pushAndRemoveUntil( - // context, - // MaterialPageRoute( - // builder: (context) => ServiceScreen( - // fechaSeleccionada: today, - // horaSeleccionada: time, - // professionalSeleccionado: widget.professional, - // ), - // ), - // (route) => false, - // ); - }, - contentPadding: const EdgeInsets.all(16), - leading: Container( - width: 40, - height: 40, - decoration: const BoxDecoration( - gradient: LinearGradient( - colors: [Colors.blue, Colors.green], - begin: Alignment.topLeft, - end: Alignment.bottomRight, - ), - shape: BoxShape.circle, - ), - child: const Center( - child: Icon( - Icons.access_time, - color: Colors.white, - ), - ), - ), - title: Text( - time.format(context), - style: const TextStyle( - fontSize: 15, fontWeight: FontWeight.bold), - ), - subtitle: const Text( - 'Disponible', - style: TextStyle( - color: Colors.green, - fontSize: 13, - fontWeight: FontWeight.bold), - ), - trailing: const Icon( - Icons.arrow_forward_ios, - color: Colors.grey, - ), - ), - )) - .toList(); + bool _isHora1Ocupada(TimeOfDay hora1, List? events) { + if (events != null) { + for (Event event in events) { + DateTime time1 = DateTime( + today.year, + today.month, + today.day, + hora1.hour, + hora1.minute, + ); + + if (event.range1Hour1 == time1.toString()) { + return true; + } + } + } + return false; } }