import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; typedef TimeCallback = void Function(TimeOfDay? pickedTime); class SchedulePicker extends StatefulWidget { final String name; Schedule schedule; SchedulePicker({super.key, required this.name, required this.schedule}); @override State createState() => _SchedulePickerState(); } class _SchedulePickerState extends State { @override Widget build(BuildContext context) { return Column( children: [ customSwitch(widget.name, widget.schedule.habilitado, (value) { widget.schedule.habilitado = value; }), ...datePickers(widget.schedule.habilitado), const Divider( height: 15, color: Colors.grey, ), ], ); } List datePickers(bool value) { if (!value) return []; return [ customSwitch( 'Jornada continua', widget.schedule.jornadaContinua, (value) { widget.schedule.jornadaContinua = value; }, ), Padding( padding: const EdgeInsets.symmetric(horizontal: 25), child: Row(children: [ datePicker(widget.schedule.range1Hour1, (pickedTime) => widget.schedule.range1Hour1 = pickedTime), const Text('-'), ...(!widget.schedule.jornadaContinua ? [ datePicker(widget.schedule.range1Hour2, (pickedTime) => widget.schedule.range1Hour2 = pickedTime), const Text(' '), ] : []), ...(!widget.schedule.jornadaContinua ? [ datePicker(widget.schedule.range2Hour1, (pickedTime) => widget.schedule.range2Hour1 = pickedTime), const Text('-'), ] : []), datePicker(widget.schedule.range2Hour2, (pickedTime) => widget.schedule.range2Hour2 = pickedTime), ]), ), ]; } datePicker(TimeOfDay? time, TimeCallback callback) { return Expanded( child: TextFormField( textAlign: TextAlign.center, onTap: () async { final TimeOfDay? pickedTime = await showTimePicker( context: context, initialTime: TimeOfDay.now(), ); if (pickedTime != null) { setState(() { callback(pickedTime); }); } }, readOnly: true, decoration: const InputDecoration( hintText: 'Hora', ), controller: TextEditingController( text: time == null ? '' : time.format(context), ), style: const TextStyle(fontSize: 15), ), ); } customSwitch(String text, bool switchValue, ValueChanged onChanged) { return Padding( padding: const EdgeInsets.symmetric(horizontal: 30), child: SizedBox( height: 40, child: Row( children: [ Expanded( child: Text( text, style: const TextStyle( fontSize: 15, color: Colors.black, ), )), Transform.scale( scale: 1.2, child: Switch( value: switchValue, onChanged: (bool newValue) { setState(() { onChanged(newValue); }); }, ), ), ], ), ), ); } } class Schedule { bool habilitado; bool jornadaContinua; TimeOfDay? range1Hour1; TimeOfDay? range1Hour2; TimeOfDay? range2Hour1; TimeOfDay? range2Hour2; Schedule( this.habilitado, this.jornadaContinua, this.range1Hour1, this.range1Hour2, this.range2Hour1, this.range2Hour2, ); static Schedule fromJson(Map json) { return Schedule( json['habilitado'], json['jornadaContinua'], _parseTime(json['range1Hour1']), _parseTime(json['range1Hour2']), _parseTime(json['range2Hour1']), _parseTime(json['range2Hour2']), ); } static TimeOfDay? _parseTime(String? time) { if (time == null) return null; final components = time.split(' '); final hourMinutes = components[0].split(':'); final hour = int.parse(hourMinutes[0]); final minutes = int.parse(hourMinutes[1]); if (components[1] == 'PM' && hour < 12) { return TimeOfDay(hour: hour + 12, minute: minutes); } else if (components[1] == 'AM' && hour == 12) { return TimeOfDay(hour: 0, minute: minutes); } return TimeOfDay(hour: hour, minute: minutes); } static TimeOfDay stringToTimeOfDay(String? tod) { if (tod == null) { return TimeOfDay.now(); } final format = DateFormat.jm(); return TimeOfDay.fromDateTime(format.parse(tod)); } @override String toString() { return 'Schedule(habilitado: $habilitado, jornadaContinua: $jornadaContinua, ' 'range1Hour1: $range1Hour1, range1Hour2: $range1Hour2, ' 'range2Hour1: $range2Hour1, range2Hour2: $range2Hour2)'; } static Future> getHorarios(String uid) async { try { final snapshot = await FirebaseFirestore.instance.collection('users').doc(uid).get(); final Map? data = snapshot.data(); final Map? horarioData = data?['horario']; final horarios = {}; horarioData?.forEach((key, value) { horarios[key] = Schedule.fromJson(value); }); return horarios; } catch (e) { print('Error getting user: $e'); return { "1": Schedule(false, false, null, null, null, null), "2": Schedule(false, false, null, null, null, null), "3": Schedule(false, false, null, null, null, null), "4": Schedule(false, false, null, null, null, null), "5": Schedule(false, false, null, null, null, null), "6": Schedule(false, false, null, null, null, null), "7": Schedule(false, false, null, null, null, null), }; } } }