Client/lib/model/timetable/timetableProps.dart

108 lines
3.3 KiB
Dart

import 'package:intl/intl.dart';
import '../../api/apiResponse.dart';
import '../../api/webuntis/queries/getHolidays/getHolidaysCache.dart';
import '../../api/webuntis/queries/getHolidays/getHolidaysResponse.dart';
import '../../api/webuntis/queries/getRooms/getRoomsCache.dart';
import '../../api/webuntis/queries/getRooms/getRoomsResponse.dart';
import '../../api/webuntis/queries/getSubjects/getSubjectsCache.dart';
import '../../api/webuntis/queries/getSubjects/getSubjectsResponse.dart';
import '../../api/webuntis/queries/getTimetable/getTimetableCache.dart';
import '../../api/webuntis/queries/getTimetable/getTimetableResponse.dart';
import '../../api/webuntis/webuntisError.dart';
import '../dataHolder.dart';
extension DateTimeExtension on DateTime {
DateTime jumpToNextWeekDay(int day) {
return add(
Duration(
days: (day - weekday) % DateTime.daysPerWeek,
),
);
}
}
class TimetableProps extends DataHolder {
final _queryWeek = DateTime.now().add(const Duration(days: 2));
late DateTime startDate = getDate(_queryWeek.subtract(Duration(days: _queryWeek.weekday - 1)));
late DateTime endDate = getDate(_queryWeek.add(Duration(days: DateTime.daysPerWeek - _queryWeek.weekday)));
GetTimetableResponse? _getTimetableResponse;
GetTimetableResponse get getTimetableResponse => _getTimetableResponse!;
GetRoomsResponse? _getRoomsResponse;
GetRoomsResponse get getRoomsResponse => _getRoomsResponse!;
GetSubjectsResponse? _getSubjectsResponse;
GetSubjectsResponse get getSubjectsResponse => _getSubjectsResponse!;
GetHolidaysResponse? _getHolidaysResponse;
GetHolidaysResponse get getHolidaysResponse => _getHolidaysResponse!;
WebuntisError? error;
WebuntisError? get getError => error;
bool get hasError => error != null;
@override
List<ApiResponse?> properties() {
return [_getTimetableResponse, _getRoomsResponse, _getSubjectsResponse, _getHolidaysResponse];
}
@override
void run() {
GetTimetableCache(
startdate: int.parse(DateFormat("yyyyMMdd").format(startDate)),
enddate: int.parse(DateFormat("yyyyMMdd").format(endDate)),
onUpdate: (GetTimetableResponse data) => {
_getTimetableResponse = data,
notifyListeners(),
},
onError: (Exception e) => {
error = e as WebuntisError?,
notifyListeners(),
}
);
GetRoomsCache(
onUpdate: (GetRoomsResponse data) => {
_getRoomsResponse = data,
notifyListeners(),
}
);
GetSubjectsCache(
onUpdate: (GetSubjectsResponse data) => {
_getSubjectsResponse = data,
notifyListeners(),
}
);
GetHolidaysCache(
onUpdate: (GetHolidaysResponse data) => {
_getHolidaysResponse = data,
notifyListeners(),
}
);
}
DateTime getDate(DateTime d) => DateTime(d.year, d.month, d.day);
bool isWeekend(DateTime queryDate) {
return queryDate.weekday == DateTime.saturday || queryDate.weekday == DateTime.sunday;
}
void updateWeek(DateTime start, DateTime end) {
properties().forEach((element) => element = null);
error = null;
notifyListeners();
startDate = start.subtract(const Duration(days: 7));
endDate = end.add(const Duration(days: 7));
try {
run();
} on WebuntisError catch(e) {
error = e;
notifyListeners();
}
}
}