import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:prosappco/src/components/primary_btn.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.now(); TimeOfDay? range1Hour2 = TimeOfDay.now(); TimeOfDay? range2Hour1 = TimeOfDay.now(); TimeOfDay? range2Hour2 = TimeOfDay.now(); Schedule(this.habilitado, this.jornadaContinua, this.range1Hour1, this.range1Hour2, this.range2Hour1, this.range2Hour2); static Future> fromJson( Map? json) async { try { if (json == null) { return { "Lunes": Schedule(false, false, null, null, null, null), "Martes": Schedule(false, false, null, null, null, null), "Miercoles": Schedule(false, false, null, null, null, null), "Jueves": Schedule(false, false, null, null, null, null), "Viernes": Schedule(false, false, null, null, null, null), "Sabado": Schedule(false, false, null, null, null, null), "Domingo": Schedule(false, false, null, null, null, null), }; } Map horarios = json['horario']; horarios.entries; print('Entrada ${horarios.entries}'); var hora = horarios.map((key, value) => MapEntry( key, Schedule( value['habilitado'], value['jornadaContinua'], stringToTimeOfDay(value['range1Hour1']), stringToTimeOfDay(value['range1Hour2']), stringToTimeOfDay(value['range2Hour1']), stringToTimeOfDay(value['range2Hour2'])))); print('Entradas ${hora}'); return hora; } catch (e) { return { "Lunes": Schedule(false, false, null, null, null, null), "Martes": Schedule(false, false, null, null, null, null), "Miercoles": Schedule(false, false, null, null, null, null), "Jueves": Schedule(false, false, null, null, null, null), "Viernes": Schedule(false, false, null, null, null, null), "Sabado": Schedule(false, false, null, null, null, null), "Domingo": Schedule(false, false, null, null, null, null), }; } } static TimeOfDay stringToTimeOfDay(String? tod) { if (tod == null) { return TimeOfDay.now(); } final format = DateFormat.jm(); return TimeOfDay.fromDateTime(format.parse(tod)); } static Future> getHorarios(String uid) async { try { final snapshot = await FirebaseFirestore.instance.collection('users').doc(uid).get(); final Map? data = snapshot.data(); return fromJson(data); } catch (e) { print('Error getting user: $e'); return { "Lunes": Schedule(false, false, null, null, null, null), "Martes": Schedule(false, false, null, null, null, null), "Miercoles": Schedule(false, false, null, null, null, null), "Jueves": Schedule(false, false, null, null, null, null), "Viernes": Schedule(false, false, null, null, null, null), "Sabado": Schedule(false, false, null, null, null, null), "Domingo": Schedule(false, false, null, null, null, null), }; } } }