3d1f3b30c7
Adds TutorialNotifier (dragPiece → clearLine → explainHud → null) backed by SaveRepository.markTutorialDone(); out-of-order events are silently ignored. Registers tutorialProvider in providers.dart. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
60 lines
1.8 KiB
Dart
60 lines
1.8 KiB
Dart
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
import '../data/content_repository.dart';
|
|
import '../data/save_repository.dart';
|
|
import '../data/streak.dart';
|
|
import '../game/models/season.dart';
|
|
import '../services/audio_service.dart';
|
|
import 'game_session_notifier.dart';
|
|
import 'progress_notifier.dart';
|
|
import 'season_flow_notifier.dart';
|
|
import 'streak_notifier.dart';
|
|
import 'tutorial_notifier.dart';
|
|
|
|
final gameSessionProvider =
|
|
NotifierProvider<GameSessionNotifier, GameViewState?>(
|
|
GameSessionNotifier.new,
|
|
);
|
|
|
|
final audioServiceProvider = Provider<AudioService>((ref) {
|
|
final service = AudioService();
|
|
ref.onDispose(service.dispose);
|
|
return service;
|
|
});
|
|
|
|
/// Overridden with the opened repository in main() (and in tests).
|
|
final saveRepositoryProvider = Provider<SaveRepository>(
|
|
(ref) => throw UnimplementedError('override with an opened SaveRepository'),
|
|
);
|
|
|
|
final progressProvider =
|
|
NotifierProvider<ProgressNotifier, Map<String, StageProgress>>(
|
|
ProgressNotifier.new,
|
|
);
|
|
|
|
final seasonFlowProvider = NotifierProvider<SeasonFlowNotifier, SeasonFlow?>(
|
|
SeasonFlowNotifier.new,
|
|
);
|
|
|
|
final contentRepositoryProvider =
|
|
Provider<ContentRepository>((ref) => ContentRepository());
|
|
|
|
final seasonsProvider = FutureProvider<List<SeasonPack>>(
|
|
(ref) => ref.read(contentRepositoryProvider).availableSeasons(),
|
|
);
|
|
|
|
final streakProvider = NotifierProvider<StreakNotifier, StreakState>(
|
|
StreakNotifier.new,
|
|
);
|
|
|
|
final tutorialProvider = NotifierProvider<TutorialNotifier, TutorialStep?>(
|
|
TutorialNotifier.new,
|
|
);
|
|
|
|
/// The visual theme of whatever season is in play; fallback outside seasons
|
|
/// (home, endless). Pure model — UI converts via ThemeColors.
|
|
final activeThemeProvider = Provider<SeasonTheme>((ref) {
|
|
final flow = ref.watch(seasonFlowProvider);
|
|
return flow?.pack.theme ?? SeasonTheme.fallback;
|
|
});
|