From c1edbe0971731c69d037b73fd1d45eaecf42d80e Mon Sep 17 00:00:00 2001 From: Pearoo <63553775+rnxm@users.noreply.github.com> Date: Sat, 13 Sep 2025 20:14:04 +0200 Subject: [PATCH] feat(timetable): cache next & previous weeks --- .../ui/phone/pages/home/home_timetable.dart | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/firka/lib/ui/phone/pages/home/home_timetable.dart b/firka/lib/ui/phone/pages/home/home_timetable.dart index d7460c1..074f365 100644 --- a/firka/lib/ui/phone/pages/home/home_timetable.dart +++ b/firka/lib/ui/phone/pages/home/home_timetable.dart @@ -105,6 +105,36 @@ class _HomeTimetableScreen extends FirkaState } } + Future maybeCacheNextWeek(int active) async { + DateTime monday = now!.getMonday().getMidnight(); + if (active >= 3) { + // thursday + monday = monday.add(Duration(days: 14)); + } else { + return; + } + if (timeNow().add(Duration(days: 31)).isBefore(monday)) return; + logger.finest("caching next week for $monday"); + var sunday = monday.add(Duration(days: 6)); + await widget.data.client.getTimeTable(monday, sunday); + await widget.data.client.getTests(); + } + + Future maybeCachePreviousWeek(int active) async { + DateTime monday = now!.getMonday().getMidnight(); + if (active <= 2) { + // wednesday + monday = monday.subtract(Duration(days: 7)); + } else { + return; + } + if (timeNow().subtract(Duration(days: 120)).isAfter(monday)) return; + logger.finest("caching previous week for $monday"); + var sunday = monday.add(Duration(days: 6)); + await widget.data.client.getTimeTable(monday, sunday); + await widget.data.client.getTests(); + } + Future initForWeek(DateTime now, {bool forceCache = true}) async { var monday = now.getMonday().getMidnight(); var sunday = monday.add(Duration(days: 6)); @@ -179,6 +209,8 @@ class _HomeTimetableScreen extends FirkaState void _handleNavTap(int oldIndex, int targetIndex) async { if (animating) return; + maybeCacheNextWeek(targetIndex); + maybeCachePreviousWeek(targetIndex); active = -1; @@ -485,6 +517,8 @@ class _HomeTimetableScreen extends FirkaState initialPage: active, onPageChanged: (i, _) { if (animating || !mounted) return; + maybeCacheNextWeek(i); + maybeCachePreviousWeek(i); setState(() { active = i; });