import 'package:bloc/bloc.dart'; import 'package:equatable/equatable.dart'; import 'package:leaderboard_repository/leaderboard_repository.dart'; import 'package:pinball/leaderboard/models/leader_board_entry.dart'; import 'package:pinball_theme/pinball_theme.dart'; part 'backbox_event.dart'; part 'backbox_state.dart'; /// {@template backbox_bloc} /// Bloc which manages the Backbox display. /// {@endtemplate} class BackboxBloc extends Bloc { /// {@macro backbox_bloc} BackboxBloc({ required LeaderboardRepository leaderboardRepository, required List? initialEntries, }) : _leaderboardRepository = leaderboardRepository, super( initialEntries != null ? LeaderboardSuccessState(entries: initialEntries) : LeaderboardFailureState(), ) { on(_onPlayerInitialsRequested); on(_onPlayerInitialsSubmitted); on(_onScoreShareRequested); on(_onLeaderboardRequested); } final LeaderboardRepository _leaderboardRepository; void _onPlayerInitialsRequested( PlayerInitialsRequested event, Emitter emit, ) { emit( InitialsFormState( score: event.score, character: event.character, ), ); } Future _onPlayerInitialsSubmitted( PlayerInitialsSubmitted event, Emitter emit, ) async { try { emit(LoadingState()); await _leaderboardRepository.addLeaderboardEntry( LeaderboardEntryData( playerInitials: event.initials, score: event.score, character: event.character.toType, ), ); emit( InitialsSuccessState( score: event.score, ), ); } catch (error, stackTrace) { addError(error, stackTrace); emit( InitialsFailureState( score: event.score, character: event.character, ), ); } } Future _onScoreShareRequested( ShareScoreRequested event, Emitter emit, ) async { emit( ShareState(score: event.score), ); } Future _onLeaderboardRequested( LeaderboardRequested event, Emitter emit, ) async { try { emit(LoadingState()); final entries = await _leaderboardRepository.fetchTop10Leaderboard(); emit(LeaderboardSuccessState(entries: entries)); } catch (error, stackTrace) { addError(error, stackTrace); emit(LeaderboardFailureState()); } } }