diff --git a/lib/data/save_repository.dart b/lib/data/save_repository.dart index 181d726..1403c19 100644 --- a/lib/data/save_repository.dart +++ b/lib/data/save_repository.dart @@ -56,6 +56,9 @@ class SaveRepository { for (final t in BoosterType.values) { _boosters[t] = boosters[t.name] as int? ?? 0; } + final daily = json['daily'] as Map?; + _dailyLastClaimedYmd = daily?['lastYmd'] as String?; + _dailyCalendarDay = daily?['day'] as int? ?? 0; } } @@ -76,6 +79,8 @@ class SaveRepository { final Map _boosters = { for (final t in BoosterType.values) t: 0, }; + String? _dailyLastClaimedYmd; + int _dailyCalendarDay = 0; StreakState get streak => _streak; bool get tutorialDone => _tutorialDone; @@ -133,6 +138,15 @@ class SaveRepository { return true; } + String? get dailyLastClaimedYmd => _dailyLastClaimedYmd; + int get dailyCalendarDay => _dailyCalendarDay; + + Future recordDailyClaim(String ymd, int day) { + _dailyLastClaimedYmd = ymd; + _dailyCalendarDay = day; + return _flush(); + } + Future recordEndlessScore(int score) { if (score > _endlessBest) _endlessBest = score; return _flush(); @@ -210,6 +224,7 @@ class SaveRepository { }, 'endless': {'best': _endlessBest}, 'boosters': {for (final t in BoosterType.values) t.name: _boosters[t]}, + 'daily': {'lastYmd': _dailyLastClaimedYmd, 'day': _dailyCalendarDay}, }), ); } diff --git a/test/data/save_repository_daily_test.dart b/test/data/save_repository_daily_test.dart new file mode 100644 index 0000000..61bf52f --- /dev/null +++ b/test/data/save_repository_daily_test.dart @@ -0,0 +1,29 @@ +import 'package:block_seasons/data/save_repository.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + Future fresh() async { + SharedPreferences.setMockInitialValues({}); + return SaveRepository(await SharedPreferences.getInstance()); + } + + test('daily claim fields start empty', () async { + final repo = await fresh(); + expect(repo.dailyLastClaimedYmd, isNull); + expect(repo.dailyCalendarDay, 0); + }); + + test('recordDailyClaim persists day and ymd across reload', () async { + final repo = await fresh(); + await repo.recordDailyClaim('2026-06-18', 3); + expect(repo.dailyLastClaimedYmd, '2026-06-18'); + expect(repo.dailyCalendarDay, 3); + + final reloaded = SaveRepository(await SharedPreferences.getInstance()); + expect(reloaded.dailyLastClaimedYmd, '2026-06-18'); + expect(reloaded.dailyCalendarDay, 3); + }); +}