feat: pre fetch leaderboard (#389)

pull/358/head
Erick 3 years ago committed by alestiago
parent e7385266ab
commit a406ace890

@ -18,7 +18,11 @@ class Backbox extends PositionComponent with ZIndex, HasGameRef {
/// {@macro backbox}
Backbox({
required LeaderboardRepository leaderboardRepository,
}) : _bloc = BackboxBloc(leaderboardRepository: leaderboardRepository),
required List<LeaderboardEntryData>? entries,
}) : _bloc = BackboxBloc(
leaderboardRepository: leaderboardRepository,
initialEntries: entries,
),
_platformHelper = PlatformHelper();
/// {@macro backbox}
@ -40,8 +44,6 @@ class Backbox extends PositionComponent with ZIndex, HasGameRef {
anchor = Anchor.bottomCenter;
zIndex = ZIndexes.backbox;
_bloc.add(LeaderboardRequested());
await add(_BackboxSpriteComponent());
await add(_display = Component());
_build(_bloc.state);

@ -14,8 +14,13 @@ class BackboxBloc extends Bloc<BackboxEvent, BackboxState> {
/// {@macro backbox_bloc}
BackboxBloc({
required LeaderboardRepository leaderboardRepository,
required List<LeaderboardEntryData>? initialEntries,
}) : _leaderboardRepository = leaderboardRepository,
super(LoadingState()) {
super(
initialEntries != null
? LeaderboardSuccessState(entries: initialEntries)
: LeaderboardFailureState(),
) {
on<PlayerInitialsRequested>(_onPlayerInitialsRequested);
on<PlayerInitialsSubmitted>(_onPlayerInitialsSubmitted);
on<LeaderboardRequested>(_onLeaderboardRequested);

@ -55,6 +55,18 @@ class PinballGame extends PinballForge2DGame
final GameBloc _gameBloc;
List<LeaderboardEntryData>? _entries;
Future<void> preFetchLeaderboard() async {
try {
_entries = await leaderboardRepository.fetchTop10Leaderboard();
} catch (_) {
// An initial null leaderboard means that we couldn't fetch
// the entries for the [Backbox] and it will show the relevant display.
_entries = null;
}
}
@override
Future<void> onLoad() async {
await add(
@ -91,7 +103,10 @@ class PinballGame extends PinballForge2DGame
children: [
BoardBackgroundSpriteComponent(),
Boundaries(),
Backbox(leaderboardRepository: leaderboardRepository),
Backbox(
leaderboardRepository: leaderboardRepository,
entries: _entries,
),
GoogleWord(position: Vector2(-4.45, 1.8)),
Multipliers(),
Multiballs(),

@ -50,6 +50,7 @@ class PinballGamePage extends StatelessWidget {
);
final loadables = [
game.preFetchLeaderboard(),
...game.preLoadAssets(),
...player.load(),
...BonusAnimation.loadAssets(),

@ -133,19 +133,6 @@ void main() {
},
);
flameTester.test(
'adds LeaderboardRequested when loaded',
(game) async {
final backbox = Backbox.test(
bloc: bloc,
platformHelper: platformHelper,
);
await game.pump(backbox);
verify(() => bloc.add(LeaderboardRequested())).called(1);
},
);
flameTester.testGameWidget(
'renders correctly',
setUp: (game, tester) async {
@ -175,6 +162,7 @@ void main() {
final backbox = Backbox.test(
bloc: BackboxBloc(
leaderboardRepository: _MockLeaderboardRepository(),
initialEntries: [LeaderboardEntryData.empty],
),
platformHelper: platformHelper,
);

@ -12,14 +12,37 @@ class _MockLeaderboardRepository extends Mock implements LeaderboardRepository {
void main() {
late LeaderboardRepository leaderboardRepository;
const emptyEntries = <LeaderboardEntryData>[];
const filledEntries = [LeaderboardEntryData.empty];
group('BackboxBloc', () {
test('inits state with LeaderboardSuccessState when has entries', () {
leaderboardRepository = _MockLeaderboardRepository();
final bloc = BackboxBloc(
leaderboardRepository: leaderboardRepository,
initialEntries: filledEntries,
);
expect(bloc.state, isA<LeaderboardSuccessState>());
});
test('inits state with LeaderboardFailureState when has no entries', () {
leaderboardRepository = _MockLeaderboardRepository();
final bloc = BackboxBloc(
leaderboardRepository: leaderboardRepository,
initialEntries: null,
);
expect(bloc.state, isA<LeaderboardFailureState>());
});
blocTest<BackboxBloc, BackboxState>(
'adds InitialsFormState on PlayerInitialsRequested',
setUp: () {
leaderboardRepository = _MockLeaderboardRepository();
},
build: () => BackboxBloc(leaderboardRepository: leaderboardRepository),
build: () => BackboxBloc(
leaderboardRepository: leaderboardRepository,
initialEntries: emptyEntries,
),
act: (bloc) => bloc.add(
PlayerInitialsRequested(
score: 100,
@ -46,7 +69,10 @@ void main() {
),
).thenAnswer((_) async {});
},
build: () => BackboxBloc(leaderboardRepository: leaderboardRepository),
build: () => BackboxBloc(
leaderboardRepository: leaderboardRepository,
initialEntries: emptyEntries,
),
act: (bloc) => bloc.add(
PlayerInitialsSubmitted(
score: 10,
@ -74,7 +100,10 @@ void main() {
),
).thenThrow(Exception('Error'));
},
build: () => BackboxBloc(leaderboardRepository: leaderboardRepository),
build: () => BackboxBloc(
leaderboardRepository: leaderboardRepository,
initialEntries: emptyEntries,
),
act: (bloc) => bloc.add(
PlayerInitialsSubmitted(
score: 10,
@ -100,7 +129,10 @@ void main() {
(_) async => [LeaderboardEntryData.empty],
);
},
build: () => BackboxBloc(leaderboardRepository: leaderboardRepository),
build: () => BackboxBloc(
leaderboardRepository: leaderboardRepository,
initialEntries: emptyEntries,
),
act: (bloc) => bloc.add(LeaderboardRequested()),
expect: () => [
LoadingState(),
@ -116,7 +148,10 @@ void main() {
() => leaderboardRepository.fetchTop10Leaderboard(),
).thenThrow(Exception('Error'));
},
build: () => BackboxBloc(leaderboardRepository: leaderboardRepository),
build: () => BackboxBloc(
leaderboardRepository: leaderboardRepository,
initialEntries: emptyEntries,
),
act: (bloc) => bloc.add(LeaderboardRequested()),
expect: () => [
LoadingState(),

@ -150,7 +150,10 @@ void main() {
(game) async {
final component = GameBlocStatusListener();
final repository = _MockLeaderboardRepository();
final backbox = Backbox(leaderboardRepository: repository);
final backbox = Backbox(
leaderboardRepository: repository,
entries: const [],
);
await game.pump([component, backbox]);
@ -163,7 +166,10 @@ void main() {
(game) async {
final component = GameBlocStatusListener();
final repository = _MockLeaderboardRepository();
final backbox = Backbox(leaderboardRepository: repository);
final backbox = Backbox(
leaderboardRepository: repository,
entries: const [],
);
final flipper = Flipper.test(side: BoardSide.left);
final behavior = FlipperKeyControllingBehavior();
@ -188,7 +194,10 @@ void main() {
final player = _MockPinballPlayer();
final component = GameBlocStatusListener();
final repository = _MockLeaderboardRepository();
final backbox = Backbox(leaderboardRepository: repository);
final backbox = Backbox(
leaderboardRepository: repository,
entries: const [],
);
await game.pump([component, backbox], pinballPlayer: player);
component.onNewState(state);
@ -226,7 +235,10 @@ void main() {
(game) async {
final component = GameBlocStatusListener();
final repository = _MockLeaderboardRepository();
final backbox = Backbox(leaderboardRepository: repository);
final backbox = Backbox(
leaderboardRepository: repository,
entries: const [],
);
final flipper = Flipper.test(side: BoardSide.left);
await game.pump([component, backbox, flipper]);

@ -32,7 +32,10 @@ class _TestPinballGame extends PinballGame {
@override
Future<void> onLoad() async {
images.prefix = '';
final futures = preLoadAssets();
final futures = [
...preLoadAssets(),
preFetchLeaderboard(),
];
await Future.wait<void>(futures);
return super.onLoad();

Loading…
Cancel
Save