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.new, ); final audioServiceProvider = Provider((ref) { final service = AudioService(); ref.onDispose(service.dispose); return service; }); /// Overridden with the opened repository in main() (and in tests). final saveRepositoryProvider = Provider( (ref) => throw UnimplementedError('override with an opened SaveRepository'), ); final progressProvider = NotifierProvider>( ProgressNotifier.new, ); final seasonFlowProvider = NotifierProvider( SeasonFlowNotifier.new, ); final contentRepositoryProvider = Provider((ref) => ContentRepository()); final seasonsProvider = FutureProvider>( (ref) => ref.read(contentRepositoryProvider).availableSeasons(), ); final streakProvider = NotifierProvider( StreakNotifier.new, ); final tutorialProvider = NotifierProvider( 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((ref) { final flow = ref.watch(seasonFlowProvider); return flow?.pack.theme ?? SeasonTheme.fallback; });