diff --git a/lib/extensions/date_time.dart b/lib/extensions/date_time.dart index b21f7e8..2476ca7 100644 --- a/lib/extensions/date_time.dart +++ b/lib/extensions/date_time.dart @@ -64,6 +64,9 @@ extension DateTimeFormatting on DateTime { String formatRelative() => Jiffy.parseFromDateTime(this).fromNow(); + /// Compact `yyyyMMdd` key, e.g. to identify a week-start in timetable caches. + String weekKey() => Jiffy.parseFromDateTime(this).format(pattern: 'yyyyMMdd'); + String timeRangeTo(DateTime end) => '${formatHm()} - ${end.formatHm()}'; String formatDateRelativeShort({DateTime? now}) { diff --git a/lib/state/app/modules/foreign_timetable/bloc/foreign_timetable_bloc.dart b/lib/state/app/modules/foreign_timetable/bloc/foreign_timetable_bloc.dart index e4ce3aa..12b7c78 100644 --- a/lib/state/app/modules/foreign_timetable/bloc/foreign_timetable_bloc.dart +++ b/lib/state/app/modules/foreign_timetable/bloc/foreign_timetable_bloc.dart @@ -1,7 +1,5 @@ import 'dart:developer'; -import 'package:intl/intl.dart'; - import '../../../../../api/marianumconnect/queries/timetable_get_element_week/timetable_element_type.dart'; import '../../../../../api/marianumconnect/queries/timetable_get_week/timetable_get_week_response.dart'; import '../../../../../extensions/date_time.dart'; @@ -24,7 +22,6 @@ class ForeignTimetableBloc TimetableState, ForeignTimetableRepository > { - static final DateFormat _weekKeyFormat = DateFormat('yyyyMMdd'); final TimetableElementType type; // Named `elementId` rather than `id` to avoid shadowing HydratedMixin's @@ -183,7 +180,7 @@ class ForeignTimetableBloc } void _writeWeekToCache(DateTime weekStart, TimetableGetWeekResponse week) { - final key = _weekKeyFormat.format(weekStart); + final key = weekStart.weekKey(); add( Emit((s) { final updated = Map.of(s.weekCache); diff --git a/lib/state/app/modules/timetable/bloc/timetable_bloc.dart b/lib/state/app/modules/timetable/bloc/timetable_bloc.dart index 3e9160f..8519361 100644 --- a/lib/state/app/modules/timetable/bloc/timetable_bloc.dart +++ b/lib/state/app/modules/timetable/bloc/timetable_bloc.dart @@ -1,7 +1,5 @@ import 'dart:developer'; -import 'package:intl/intl.dart'; - import '../../../../../api/marianumconnect/queries/timetable_custom_events/custom_events_migration.dart'; import '../../../../../api/marianumconnect/queries/timetable_get_week/timetable_get_week_response.dart'; import '../../../../../api/mhsl/custom_timetable_event/custom_timetable_event.dart'; @@ -19,8 +17,6 @@ class TimetableBloc TimetableState, TimetableRepository > { - static final DateFormat _weekKeyFormat = DateFormat('yyyyMMdd'); - DateTime _lastWeekRequestStart = DateTime.fromMillisecondsSinceEpoch(0); /// Set by [retry] to force the next [gatherData] to bypass cache freshness @@ -247,7 +243,7 @@ class TimetableBloc } void _writeWeekToCache(DateTime weekStart, TimetableGetWeekResponse week) { - final key = _weekKeyFormat.format(weekStart); + final key = weekStart.weekKey(); add( Emit((s) { final updated = Map.of(s.weekCache); diff --git a/lib/view/login/post_login_splash.dart b/lib/view/login/post_login_splash.dart index 41777e0..230fa78 100644 --- a/lib/view/login/post_login_splash.dart +++ b/lib/view/login/post_login_splash.dart @@ -19,7 +19,11 @@ class PostLoginSplash extends StatefulWidget { try { _darkComposition ??= await AssetLottie(_darkAsset).load(); _lightComposition ??= await AssetLottie(_lightAsset).load(); - } catch (_) {} + } catch (e) { + // Precache is a best-effort warm-up; the splash falls back to loading the + // composition on demand. Log so a broken asset is at least diagnosable. + debugPrint('PostLoginSplash.precache failed: $e'); + } } final VoidCallback onComplete; diff --git a/test/extensions/date_time_test.dart b/test/extensions/date_time_test.dart index fa5b89b..c1eb7be 100644 --- a/test/extensions/date_time_test.dart +++ b/test/extensions/date_time_test.dart @@ -115,6 +115,11 @@ void main() { final end = dt.add(const Duration(minutes: 45)); expect(dt.timeRangeTo(end), '09:07 - 09:52'); }); + + test('weekKey renders a zero-padded yyyyMMdd key', () { + expect(dt.weekKey(), '20260508'); + expect(DateTime(2026, 12, 31).weekKey(), '20261231'); + }); }); group('formatDateRelativeShort', () {