feat: pre fetch leaderboard (#389)

pull/395/head
Erick 3 years ago committed by GitHub
parent 7f7c14477d
commit 7fb634bf96
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

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

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

@ -55,6 +55,18 @@ class PinballGame extends PinballForge2DGame
final GameBloc _gameBloc; 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 @override
Future<void> onLoad() async { Future<void> onLoad() async {
await add( await add(
@ -91,7 +103,10 @@ class PinballGame extends PinballForge2DGame
children: [ children: [
BoardBackgroundSpriteComponent(), BoardBackgroundSpriteComponent(),
Boundaries(), Boundaries(),
Backbox(leaderboardRepository: leaderboardRepository), Backbox(
leaderboardRepository: leaderboardRepository,
entries: _entries,
),
GoogleWord(position: Vector2(-4.45, 1.8)), GoogleWord(position: Vector2(-4.45, 1.8)),
Multipliers(), Multipliers(),
Multiballs(), Multiballs(),

@ -50,6 +50,7 @@ class PinballGamePage extends StatelessWidget {
); );
final loadables = [ final loadables = [
game.preFetchLeaderboard(),
...game.preLoadAssets(), ...game.preLoadAssets(),
...player.load(), ...player.load(),
...BonusAnimation.loadAssets(), ...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( flameTester.testGameWidget(
'renders correctly', 'renders correctly',
setUp: (game, tester) async { setUp: (game, tester) async {
@ -175,6 +162,7 @@ void main() {
final backbox = Backbox.test( final backbox = Backbox.test(
bloc: BackboxBloc( bloc: BackboxBloc(
leaderboardRepository: _MockLeaderboardRepository(), leaderboardRepository: _MockLeaderboardRepository(),
initialEntries: [LeaderboardEntryData.empty],
), ),
platformHelper: platformHelper, platformHelper: platformHelper,
); );

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

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

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

Loading…
Cancel
Save