Files
prosappweb/lib/src/components/schedule_picker.dart
T
2024-01-05 15:57:46 -05:00

213 lines
6.1 KiB
Dart

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<SchedulePicker> createState() => _SchedulePickerState();
}
class _SchedulePickerState extends State<SchedulePicker> {
@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<Widget> 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<bool> 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<String, dynamic> 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<Map<String, Schedule>> getHorarios(String uid) async {
try {
final snapshot =
await FirebaseFirestore.instance.collection('users').doc(uid).get();
final Map<String, dynamic>? data = snapshot.data();
final Map<String, dynamic>? horarioData = data?['horario'];
final horarios = <String, Schedule>{};
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),
};
}
}
}