refactor: removed props from state for sharing only score

pull/359/head
RuiAlonso 3 years ago
parent 6308606c21
commit 7840485c7d

@ -80,15 +80,11 @@ class Backbox extends PositionComponent with ZIndex {
GameOverInfoDisplay( GameOverInfoDisplay(
onShare: () { onShare: () {
_bloc.add( _bloc.add(
ShareScoreRequested( ShareScoreRequested(score: state.score),
score: state.score,
initials: state.initials,
character: state.character,
),
); );
}, },
onNavigate: () { onNavigate: () {
openLink(ShareRepository.openSourceUrl); openLink(ShareRepository.googleIOEvent);
}, },
), ),
); );

@ -51,9 +51,7 @@ class BackboxBloc extends Bloc<BackboxEvent, BackboxState> {
); );
emit( emit(
InitialsSuccessState( InitialsSuccessState(
initials: event.initials,
score: event.score, score: event.score,
character: event.character,
), ),
); );
} catch (error, stackTrace) { } catch (error, stackTrace) {
@ -68,9 +66,7 @@ class BackboxBloc extends Bloc<BackboxEvent, BackboxState> {
) async { ) async {
emit( emit(
ShareState( ShareState(
initials: event.initials,
score: event.score, score: event.score,
character: event.character,
), ),
); );
} }

@ -53,27 +53,19 @@ class PlayerInitialsSubmitted extends BackboxEvent {
} }
/// {@template share_score_requested} /// {@template share_score_requested}
/// Event that request the user to share score and initials. /// Event when user requests to share their score.
/// {@endtemplate} /// {@endtemplate}
class ShareScoreRequested extends BackboxEvent { class ShareScoreRequested extends BackboxEvent {
/// {@macro share_score_requested} /// {@macro share_score_requested}
const ShareScoreRequested({ const ShareScoreRequested({
required this.score, required this.score,
required this.initials,
required this.character,
}); });
/// Player's score. /// Player's score.
final int score; final int score;
/// Player's initials.
final String initials;
/// Player's character.
final CharacterTheme character;
@override @override
List<Object?> get props => [score, initials, character]; List<Object?> get props => [score];
} }
/// Event that triggers the fetching of the leaderboard /// Event that triggers the fetching of the leaderboard

@ -55,27 +55,19 @@ class InitialsFormState extends BackboxState {
} }
/// {@template initials_success_state} /// {@template initials_success_state}
/// State when the leaderboard was successfully loaded. /// State when the score was successfully sended.
/// {@endtemplate} /// {@endtemplate}
class InitialsSuccessState extends BackboxState { class InitialsSuccessState extends BackboxState {
/// {@macro initials_success_state} /// {@macro initials_success_state}
const InitialsSuccessState({ const InitialsSuccessState({
required this.score, required this.score,
required this.initials,
required this.character,
}) : super(); }) : super();
/// Player's score. /// Player's score.
final int score; final int score;
/// Player's initials.
final String initials;
/// Player's character.
final CharacterTheme character;
@override @override
List<Object?> get props => [score, initials, character]; List<Object?> get props => [score];
} }
/// State when the initials submission failed. /// State when the initials submission failed.
@ -91,19 +83,11 @@ class ShareState extends BackboxState {
/// {@macro share_state} /// {@macro share_state}
const ShareState({ const ShareState({
required this.score, required this.score,
required this.initials,
required this.character,
}) : super(); }) : super();
/// Player's score. /// Player's score.
final int score; final int score;
/// Player's initials.
final String initials;
/// Player's character.
final CharacterTheme character;
@override @override
List<Object?> get props => [score, initials, character]; List<Object?> get props => [score];
} }

@ -140,7 +140,8 @@ class _TitleBackgroundSpriteComponent extends SpriteComponent with HasGameRef {
Future<void> onLoad() async { Future<void> onLoad() async {
await super.onLoad(); await super.onLoad();
final sprite = Sprite( final sprite = Sprite(
gameRef.images.fromCache(Assets.images.backbox.button.share.keyName), gameRef.images
.fromCache(Assets.images.backbox.displayTitleDecoration.keyName),
); );
this.sprite = sprite; this.sprite = sprite;
size = sprite.originalSize / 22; size = sprite.originalSize / 22;

@ -100,7 +100,8 @@ extension PinballGameAssetsX on PinballGame {
images.load(components.Assets.images.sparky.bumper.c.dimmed.keyName), images.load(components.Assets.images.sparky.bumper.c.dimmed.keyName),
images.load(components.Assets.images.backbox.marquee.keyName), images.load(components.Assets.images.backbox.marquee.keyName),
images.load(components.Assets.images.backbox.displayDivider.keyName), images.load(components.Assets.images.backbox.displayDivider.keyName),
images.load(components.Assets.images.backbox.button.share.keyName), images.load(
components.Assets.images.backbox.displayTitleDecoration.keyName),
images.load(components.Assets.images.googleWord.letter1.lit.keyName), images.load(components.Assets.images.googleWord.letter1.lit.keyName),
images.load(components.Assets.images.googleWord.letter1.dimmed.keyName), images.load(components.Assets.images.googleWord.letter1.dimmed.keyName),
images.load(components.Assets.images.googleWord.letter2.lit.keyName), images.load(components.Assets.images.googleWord.letter2.lit.keyName),

@ -59,13 +59,14 @@ class $AssetsImagesAndroidGen {
class $AssetsImagesBackboxGen { class $AssetsImagesBackboxGen {
const $AssetsImagesBackboxGen(); const $AssetsImagesBackboxGen();
$AssetsImagesBackboxButtonGen get button =>
const $AssetsImagesBackboxButtonGen();
/// File path: assets/images/backbox/display-divider.png /// File path: assets/images/backbox/display-divider.png
AssetGenImage get displayDivider => AssetGenImage get displayDivider =>
const AssetGenImage('assets/images/backbox/display-divider.png'); const AssetGenImage('assets/images/backbox/display-divider.png');
/// File path: assets/images/backbox/display_title_decoration.png
AssetGenImage get displayTitleDecoration =>
const AssetGenImage('assets/images/backbox/display_title_decoration.png');
/// File path: assets/images/backbox/marquee.png /// File path: assets/images/backbox/marquee.png
AssetGenImage get marquee => AssetGenImage get marquee =>
const AssetGenImage('assets/images/backbox/marquee.png'); const AssetGenImage('assets/images/backbox/marquee.png');
@ -385,14 +386,6 @@ class $AssetsImagesAndroidSpaceshipGen {
const AssetGenImage('assets/images/android/spaceship/saucer.png'); const AssetGenImage('assets/images/android/spaceship/saucer.png');
} }
class $AssetsImagesBackboxButtonGen {
const $AssetsImagesBackboxButtonGen();
/// File path: assets/images/backbox/button/share.png
AssetGenImage get share =>
const AssetGenImage('assets/images/backbox/button/share.png');
}
class $AssetsImagesDashBumperGen { class $AssetsImagesDashBumperGen {
const $AssetsImagesDashBumperGen(); const $AssetsImagesDashBumperGen();

@ -12,7 +12,8 @@ class ShareRepository {
final String _appUrl; final String _appUrl;
/// Url to the Github Open Source Pinball project. /// Url to the Github Open Source Pinball project.
static const openSourceUrl = 'https://github.com/VGVentures/pinball'; static const openSourceCode = 'https://github.com/VGVentures/pinball';
static const googleIOEvent = 'https://events.google.com/io/';
/// Returns a url to share the [value] on the given [platform]. /// Returns a url to share the [value] on the given [platform].
/// ///

@ -38,7 +38,7 @@ class _TestGame extends Forge2DGame
character.leaderboardIcon.keyName, character.leaderboardIcon.keyName,
Assets.images.backbox.marquee.keyName, Assets.images.backbox.marquee.keyName,
Assets.images.backbox.displayDivider.keyName, Assets.images.backbox.displayDivider.keyName,
Assets.images.backbox.button.share.keyName, Assets.images.backbox.displayTitleDecoration.keyName,
]); ]);
} }
@ -298,6 +298,56 @@ void main() {
}, },
); );
flameTester.test(
'open Google IO Event url when navigating',
(game) async {
when(() => urlLauncher.canLaunch(any()))
.thenAnswer((_) async => true);
when(
() => urlLauncher.launch(
any(),
useSafariVC: any(named: 'useSafariVC'),
useWebView: any(named: 'useWebView'),
enableJavaScript: any(named: 'enableJavaScript'),
enableDomStorage: any(named: 'enableDomStorage'),
universalLinksOnly: any(named: 'universalLinksOnly'),
headers: any(named: 'headers'),
),
).thenAnswer((_) async => true);
final state = InitialsSuccessState(
score: 100,
initials: 'AAA',
character: theme.AndroidTheme(),
);
whenListen(
bloc,
Stream.value(state),
initialState: state,
);
final backbox = Backbox.test(bloc: bloc);
await game.pump(backbox);
final shareLink =
game.descendants().whereType<GoogleIOLinkComponent>().first;
shareLink.onTapDown(_MockTapDownInfo());
await game.ready();
verify(
() => urlLauncher.launch(
ShareRepository.googleIOEvent,
useSafariVC: any(named: 'useSafariVC'),
useWebView: any(named: 'useWebView'),
enableJavaScript: any(named: 'enableJavaScript'),
enableDomStorage: any(named: 'enableDomStorage'),
universalLinksOnly: any(named: 'universalLinksOnly'),
headers: any(named: 'headers'),
),
);
},
);
flameTester.test( flameTester.test(
'open OpenSource url when navigating', 'open OpenSource url when navigating',
(game) async { (game) async {
@ -336,7 +386,7 @@ void main() {
verify( verify(
() => urlLauncher.launch( () => urlLauncher.launch(
ShareRepository.openSourceUrl, ShareRepository.openSourceCode,
useSafariVC: any(named: 'useSafariVC'), useSafariVC: any(named: 'useSafariVC'),
useWebView: any(named: 'useWebView'), useWebView: any(named: 'useWebView'),
enableJavaScript: any(named: 'enableJavaScript'), enableJavaScript: any(named: 'enableJavaScript'),

@ -56,11 +56,7 @@ void main() {
), ),
expect: () => [ expect: () => [
LoadingState(), LoadingState(),
InitialsSuccessState( InitialsSuccessState(score: 10),
score: 10,
initials: 'AAA',
character: DashTheme(),
),
], ],
); );
@ -101,18 +97,10 @@ void main() {
}, },
build: () => BackboxBloc(leaderboardRepository: leaderboardRepository), build: () => BackboxBloc(leaderboardRepository: leaderboardRepository),
act: (bloc) => bloc.add( act: (bloc) => bloc.add(
ShareScoreRequested( ShareScoreRequested(score: 100),
score: 100,
initials: 'AAA',
character: AndroidTheme(),
),
), ),
expect: () => [ expect: () => [
ShareState( ShareState(score: 100),
score: 100,
initials: 'AAA',
character: AndroidTheme(),
),
], ],
); );
}); });

@ -126,78 +126,42 @@ void main() {
group('ScoreShareRequested', () { group('ScoreShareRequested', () {
test('can be instantiated', () { test('can be instantiated', () {
expect( expect(
ShareScoreRequested( ShareScoreRequested(score: 0),
score: 0,
initials: 'AAA',
character: AndroidTheme(),
),
isNotNull, isNotNull,
); );
}); });
test('supports value comparison', () { test('supports value comparison', () {
expect( expect(
ShareScoreRequested( ShareScoreRequested(score: 0),
score: 0,
initials: 'AAA',
character: AndroidTheme(),
),
equals( equals(
ShareScoreRequested( ShareScoreRequested(score: 0),
score: 0,
initials: 'AAA',
character: AndroidTheme(),
),
), ),
); );
expect( expect(
ShareScoreRequested( ShareScoreRequested(score: 0),
score: 0,
initials: 'AAA',
character: AndroidTheme(),
),
isNot( isNot(
equals( equals(
ShareScoreRequested( ShareScoreRequested(score: 1),
score: 1,
initials: 'AAA',
character: AndroidTheme(),
),
), ),
), ),
); );
expect( expect(
ShareScoreRequested( ShareScoreRequested(score: 0),
score: 0,
initials: 'AAA',
character: AndroidTheme(),
),
isNot( isNot(
equals( equals(
ShareScoreRequested( ShareScoreRequested(score: 0),
score: 0,
initials: 'AAA',
character: SparkyTheme(),
),
), ),
), ),
); );
expect( expect(
ShareScoreRequested( ShareScoreRequested(score: 0),
score: 0,
initials: 'AAA',
character: AndroidTheme(),
),
isNot( isNot(
equals( equals(
ShareScoreRequested( ShareScoreRequested(score: 0),
score: 0,
initials: 'BBB',
character: AndroidTheme(),
),
), ),
), ),
); );

@ -116,28 +116,16 @@ void main() {
group('InitialsSuccessState', () { group('InitialsSuccessState', () {
test('can be instantiated', () { test('can be instantiated', () {
expect( expect(
InitialsSuccessState( InitialsSuccessState(score: 0),
score: 0,
initials: 'AAA',
character: AndroidTheme(),
),
isNotNull, isNotNull,
); );
}); });
test('supports value comparison', () { test('supports value comparison', () {
expect( expect(
InitialsSuccessState( InitialsSuccessState(score: 0),
score: 0,
initials: 'AAA',
character: AndroidTheme(),
),
equals( equals(
InitialsSuccessState( InitialsSuccessState(score: 0),
score: 0,
initials: 'AAA',
character: AndroidTheme(),
),
), ),
); );
}); });
@ -155,28 +143,16 @@ void main() {
group('ShareState', () { group('ShareState', () {
test('can be instantiated', () { test('can be instantiated', () {
expect( expect(
ShareState( ShareState(score: 0),
score: 0,
initials: 'AAA',
character: AndroidTheme(),
),
isNotNull, isNotNull,
); );
}); });
test('supports value comparison', () { test('supports value comparison', () {
expect( expect(
ShareState( ShareState(score: 0),
score: 0,
initials: 'AAA',
character: AndroidTheme(),
),
equals( equals(
ShareState( ShareState(score: 0),
score: 0,
initials: 'AAA',
character: AndroidTheme(),
),
), ),
); );
}); });

@ -20,7 +20,7 @@ class _TestGame extends Forge2DGame with HasTappables {
images.prefix = ''; images.prefix = '';
await images.loadAll( await images.loadAll(
[ [
Assets.images.backbox.button.share.keyName, Assets.images.backbox.displayTitleDecoration.keyName,
], ],
); );
} }

Loading…
Cancel
Save