import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import '../services/auth_service.dart'; class ScheduleScreen extends StatefulWidget { @override _ScheduleScreenState createState() => _ScheduleScreenState(); } class _ScheduleScreenState extends State { DateTime currentWeek = DateTime.now(); bool loading = false; List workdays = []; String? errorMsg; @override Widget build(BuildContext context) { final df = DateFormat('yyyy. MMM d.'); final weekStart = currentWeek.subtract(Duration(days: currentWeek.weekday - 1)); final weekDays = List.generate(7, (i) => weekStart.add(Duration(days: i))); return Scaffold( appBar: AppBar(title: Text('Beosztás')), body: Padding( padding: const EdgeInsets.all(12.0), child: Column( children: [ Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ IconButton(icon: Icon(Icons.chevron_left), onPressed: () { setState(() { currentWeek = currentWeek.subtract(Duration(days: 7)); }); fetchWorkdays(); }), Text('${df.format(weekStart)} - ${df.format(weekStart.add(Duration(days:6)))}', style: TextStyle(fontWeight: FontWeight.bold)), IconButton(icon: Icon(Icons.chevron_right), onPressed: () { setState(() { currentWeek = currentWeek.add(Duration(days: 7)); }); fetchWorkdays(); }), ]), SizedBox(height: 8), if (errorMsg != null) ...[ Text(errorMsg!, style: TextStyle(color: Colors.red)), SizedBox(height: 8), ElevatedButton(onPressed: fetchWorkdays, child: Text('Próbálja újra')), SizedBox(height: 8), ], loading ? Padding( padding: const EdgeInsets.all(24.0), child: Center(child: CircularProgressIndicator()), ) : Expanded( child: RefreshIndicator( onRefresh: fetchWorkdays, child: LayoutBuilder(builder: (ctx, cons) { final cross = cons.maxWidth > 480 ? 4 : 2; return GridView.count( crossAxisCount: cross, childAspectRatio: 0.9, children: weekDays.map((day) { final formatted = DateFormat('yyyy-MM-dd').format(day); final wd = workdays.firstWhere((w) => (w['WorkDay'] ?? '').toString().substring(0,10) == formatted, orElse: () => null); String title = ''; if (wd != null) { if (wd['Type'] == 1) title = 'PN'; else if (wd['Type'] == 10) title = wd['text'] ?? ''; } return Card( color: wd != null && wd['Type'] == 10 ? Color(0xFFA24BFA) : (wd != null && wd['Type'] == 1 ? Color(0xFFB388FF) : Color(0xFFede7f6)), child: Center( child: Column(mainAxisSize: MainAxisSize.min, children: [ Text('${day.day}', style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)), SizedBox(height: 6), Text(title, style: TextStyle(fontSize: 14, fontWeight: FontWeight.bold)), ]), ), ); }).toList(), ); }), ), ), ], ), ), ); } Future fetchWorkdays() async { setState(() { loading = true; }); final auth = Provider.of(context, listen: false); final token = auth.token; if (token == null) { setState(() { workdays = []; loading = false; }); return; } final weekStart = currentWeek.subtract(Duration(days: currentWeek.weekday - 1)); final weekEnd = weekStart.add(Duration(days: 6)); final months = {weekStart.month, weekEnd.month}; final years = {weekStart.year, weekEnd.year}; List all = []; for (final y in years) { for (final m in months) { try { final resList = await auth.fetchSchedule(y, m); if (resList.isNotEmpty) all.addAll(resList); } catch (e) { // ignore per-month errors } } } setState(() { workdays = all; loading = false; }); } @override void initState() { super.initState(); fetchWorkdays(); } }