d0a2be15ba
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
44 lines
1.4 KiB
Dart
44 lines
1.4 KiB
Dart
// 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);
|
||
ref.read(analyticsProvider).dailyRewardClaimed(day: r.day, doubled: doubled);
|
||
for (final e in reward.entries) {
|
||
ref.read(analyticsProvider).boosterGranted(
|
||
type: e.key.name,
|
||
count: e.value * (doubled ? 2 : 1),
|
||
source: 'daily',
|
||
);
|
||
}
|
||
state = _resolve();
|
||
}
|
||
}
|