import 'dart:async'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:syncfusion_flutter_calendar/calendar.dart'; import '../../../homescreen_widgets/timetable/timetableHomeWidget.dart'; import '../../../model/timetable/timetableProps.dart'; import '../../../storage/base/settingsProvider.dart'; import '../../../widget/loadingSpinner.dart'; import '../../../widget/placeholderView.dart'; import 'calendar.dart'; import 'customTimetableEventEditDialog.dart'; import 'viewCustomTimetableEvents.dart'; class Timetable extends StatefulWidget { const Timetable({super.key}); @override State<Timetable> createState() => _TimetableState(); } enum CalendarActions { addEvent, viewEvents } class _TimetableState extends State<Timetable> { CalendarController controller = CalendarController(); late Timer updateTimings; late SettingsProvider settings; @override void initState() { settings = Provider.of<SettingsProvider>(context, listen: false); WidgetsBinding.instance.addPostFrameCallback((timeStamp) { Provider.of<TimetableProps>(context, listen: false).run(); }); controller.displayDate = DateTime.now().add(const Duration(days: 2)); updateTimings = Timer.periodic(const Duration(seconds: 30), (Timer t) => setState((){})); super.initState(); } @override Widget build(BuildContext context) => Scaffold( appBar: AppBar( title: const Text('Stunden & Vertretungsplan'), actions: [ IconButton(onPressed: () => TimetableHomeWidget.update(context), icon: Icon(Icons.screen_share_outlined)), IconButton( icon: const Icon(Icons.home_outlined), onPressed: () { controller.displayDate = DateTime.now().add(const Duration(days: 2)); } ), PopupMenuButton<CalendarActions>( icon: const Icon(Icons.edit_calendar_outlined), itemBuilder: (context) => CalendarActions.values.map( (e) { String title; Icon icon; switch(e) { case CalendarActions.addEvent: title = 'Kalendereintrag hinzufügen'; icon = const Icon(Icons.add); case CalendarActions.viewEvents: title = 'Kalendereinträge anzeigen'; icon = const Icon(Icons.perm_contact_calendar_outlined); } return PopupMenuItem<CalendarActions>( value: e, child: ListTile( title: Text(title), leading: icon, ) ); } ).toList(), onSelected: (value) { switch(value) { case CalendarActions.addEvent: showDialog( context: context, builder: (context) => const CustomTimetableEventEditDialog(), barrierDismissible: false, ); case CalendarActions.viewEvents: Navigator.of(context).push(MaterialPageRoute(builder: (context) => const ViewCustomTimetableEvents())); } }, ) ], ), body: Consumer<TimetableProps>( builder: (context, value, child) { if(value.hasError) { return PlaceholderView( icon: Icons.calendar_month, text: 'Webuntis error: ${value.error.toString()}', button: TextButton( child: const Text('Neu laden'), onPressed: () { controller.displayDate = DateTime.now().add(const Duration(days: 2)); Provider.of<TimetableProps>(context, listen: false).resetWeek(); }, ), ); } if(value.primaryLoading()) return const LoadingSpinner(); return RefreshIndicator( child: Calendar( controller: controller, timetableProps: value, settings: settings, ), onRefresh: () async { Provider.of<TimetableProps>(context, listen: false).run(renew: true); return Future.delayed(const Duration(seconds: 3)); } ); }, ) ); @override void dispose() { updateTimings.cancel(); super.dispose(); } }