From 3d9bc99c2ae652ef8df393e20e53ff69ed6d3a69 Mon Sep 17 00:00:00 2001 From: RuiAlonso Date: Wed, 16 Mar 2022 18:59:32 +0100 Subject: [PATCH] feat: added bloc for request ranking --- lib/leaderboard/bloc/leaderboard_bloc.dart | 59 +++++++++++++++++++++ lib/leaderboard/bloc/leaderboard_event.dart | 10 ++++ lib/leaderboard/bloc/leaderboard_state.dart | 43 +++++++++++++++ lib/leaderboard/leaderboard.dart | 1 + 4 files changed, 113 insertions(+) create mode 100644 lib/leaderboard/bloc/leaderboard_bloc.dart create mode 100644 lib/leaderboard/bloc/leaderboard_event.dart create mode 100644 lib/leaderboard/bloc/leaderboard_state.dart create mode 100644 lib/leaderboard/leaderboard.dart diff --git a/lib/leaderboard/bloc/leaderboard_bloc.dart b/lib/leaderboard/bloc/leaderboard_bloc.dart new file mode 100644 index 00000000..f580ed61 --- /dev/null +++ b/lib/leaderboard/bloc/leaderboard_bloc.dart @@ -0,0 +1,59 @@ +import 'dart:async'; + +import 'package:bloc/bloc.dart'; +import 'package:equatable/equatable.dart'; +import 'package:pinball_theme/pinball_theme.dart'; + +part 'leaderboard_event.dart'; +part 'leaderboard_state.dart'; + +class LeaderboardBloc extends Bloc { + LeaderboardBloc() : super(const LeaderboardState()) { + on(_onLeaderboardRequested); + } + + FutureOr _onLeaderboardRequested( + LeaderboardRequested event, + Emitter emit, + ) { + emit(state.copyWith(status: LeaderboardStatus.loading)); + try { + const ranking = [ + Competitor( + rank: 1, + characterTheme: DashTheme(), + initials: 'ABC', + score: 100, + ), + Competitor( + rank: 2, + characterTheme: SparkyTheme(), + initials: 'DEF', + score: 200, + ), + Competitor( + rank: 3, + characterTheme: AndroidTheme(), + initials: 'GHI', + score: 300, + ), + Competitor( + rank: 4, + characterTheme: DinoTheme(), + initials: 'JKL', + score: 400, + ), + ]; + + emit( + state.copyWith( + status: LeaderboardStatus.success, + ranking: ranking, + ), + ); + } catch (error, _) { + emit(state.copyWith(status: LeaderboardStatus.error)); + addError(error); + } + } +} diff --git a/lib/leaderboard/bloc/leaderboard_event.dart b/lib/leaderboard/bloc/leaderboard_event.dart new file mode 100644 index 00000000..48123221 --- /dev/null +++ b/lib/leaderboard/bloc/leaderboard_event.dart @@ -0,0 +1,10 @@ +part of 'leaderboard_bloc.dart'; + +abstract class LeaderboardEvent extends Equatable { + const LeaderboardEvent(); + + @override + List get props => []; +} + +class LeaderboardRequested extends LeaderboardEvent {} diff --git a/lib/leaderboard/bloc/leaderboard_state.dart b/lib/leaderboard/bloc/leaderboard_state.dart new file mode 100644 index 00000000..7d2a43b8 --- /dev/null +++ b/lib/leaderboard/bloc/leaderboard_state.dart @@ -0,0 +1,43 @@ +part of 'leaderboard_bloc.dart'; + +enum LeaderboardStatus { loading, success, error } + +class LeaderboardState extends Equatable { + const LeaderboardState({ + this.status = LeaderboardStatus.loading, + this.ranking = const [], + }); + + final LeaderboardStatus status; + final List ranking; + + @override + List get props => [status, ranking]; + + LeaderboardState copyWith({ + LeaderboardStatus? status, + List? ranking, + }) { + return LeaderboardState( + status: status ?? this.status, + ranking: ranking ?? this.ranking, + ); + } +} + +class Competitor extends Equatable { + const Competitor({ + required this.rank, + required this.characterTheme, + required this.initials, + required this.score, + }); + + final int rank; + final CharacterTheme characterTheme; + final String initials; + final int score; + + @override + List get props => [rank, characterTheme, initials, score]; +} diff --git a/lib/leaderboard/leaderboard.dart b/lib/leaderboard/leaderboard.dart new file mode 100644 index 00000000..13d71e40 --- /dev/null +++ b/lib/leaderboard/leaderboard.dart @@ -0,0 +1 @@ +export 'bloc/leaderboard_bloc.dart';