feat(state): DailyRewardNotifier with injectable clock
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
// lib/state/daily_reward_notifier.dart
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../data/save_repository.dart';
|
||||
import '../game/daily/daily_reward.dart';
|
||||
import 'providers.dart';
|
||||
|
||||
class DailyRewardNotifier extends Notifier<DailyResolution> {
|
||||
static const _cal = DailyRewardCalendar();
|
||||
|
||||
SaveRepository get _save => ref.read(saveRepositoryProvider);
|
||||
DateTime Function() get _now => ref.read(dailyNowProvider);
|
||||
|
||||
@override
|
||||
DailyResolution build() => _resolve();
|
||||
|
||||
DailyResolution _resolve() => _cal.resolve(
|
||||
lastClaimedYmd: _save.dailyLastClaimedYmd,
|
||||
storedDay: _save.dailyCalendarDay,
|
||||
today: _now(),
|
||||
);
|
||||
|
||||
/// Grants the current day's reward (×2 if [doubled]) and records the claim.
|
||||
Future<void> claim({bool doubled = false}) async {
|
||||
final r = state;
|
||||
if (!r.claimable) return;
|
||||
final reward = _cal.rewardFor(r.day);
|
||||
final inv = ref.read(boosterInventoryProvider.notifier);
|
||||
for (final entry in reward.entries) {
|
||||
await inv.grant(entry.key, entry.value * (doubled ? 2 : 1));
|
||||
}
|
||||
await _save.recordDailyClaim(_cal.ymd(_now()), r.day);
|
||||
state = _resolve();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user