From d14e16ff23d0de1284fc764244982fdce0922267 Mon Sep 17 00:00:00 2001 From: RuiAlonso Date: Wed, 23 Mar 2022 22:44:13 +0100 Subject: [PATCH] feat: send user added to bloc and firebase --- lib/game/view/widgets/game_over_dialog.dart | 71 +++++++++++++++++-- .../view/widgets/game_over_dialog_test.dart | 29 ++++++++ 2 files changed, 93 insertions(+), 7 deletions(-) create mode 100644 test/game/view/widgets/game_over_dialog_test.dart diff --git a/lib/game/view/widgets/game_over_dialog.dart b/lib/game/view/widgets/game_over_dialog.dart index 824d6cf9..01f8614d 100644 --- a/lib/game/view/widgets/game_over_dialog.dart +++ b/lib/game/view/widgets/game_over_dialog.dart @@ -1,5 +1,10 @@ +// ignore_for_file: public_member_api_docs + import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:leaderboard_repository/leaderboard_repository.dart'; import 'package:pinball/game/game.dart'; +import 'package:pinball/leaderboard/leaderboard.dart'; import 'package:pinball_theme/pinball_theme.dart'; /// {@template game_over_dialog} @@ -13,6 +18,37 @@ class GameOverDialog extends StatelessWidget { final int score; final CharacterTheme theme; + @override + Widget build(BuildContext context) { + return BlocProvider( + create: (context) => LeaderboardBloc( + context.read(), + ), + child: GameOverDialogView(score: score, theme: theme), + ); + } +} + +class GameOverDialogView extends StatefulWidget { + const GameOverDialogView({Key? key, required this.score, required this.theme}) + : super(key: key); + + final int score; + final CharacterTheme theme; + + @override + State createState() => _GameOverDialogViewState(); +} + +class _GameOverDialogViewState extends State { + final playerInitialsInputController = TextEditingController(); + + @override + void dispose() { + playerInitialsInputController.dispose(); + super.dispose(); + } + @override Widget build(BuildContext context) { return Dialog( @@ -33,14 +69,15 @@ class GameOverDialog extends StatelessWidget { height: 20, ), Text( - 'Your score is $score', + 'Your score is ${widget.score}', style: Theme.of(context).textTheme.headline6, ), const SizedBox( height: 15, ), - const TextField( - decoration: InputDecoration( + TextField( + controller: playerInitialsInputController, + decoration: const InputDecoration( border: OutlineInputBorder(), hintText: 'Enter your initials', ), @@ -49,11 +86,31 @@ class GameOverDialog extends StatelessWidget { const SizedBox( height: 10, ), - TextButton( - onPressed: () { - //TODO: navigate to LeadersboardPage + BlocBuilder( + builder: (context, state) { + switch (state.status) { + case LeaderboardStatus.loading: + return TextButton( + onPressed: () { + context.read().add( + LeaderboardEntryAdded( + entry: LeaderboardEntryData( + playerInitials: + playerInitialsInputController.text, + score: widget.score, + character: widget.theme.toType, + ), + ), + ); + }, + child: const Text('Add User'), + ); + case LeaderboardStatus.success: + return const Text('succeed'); + case LeaderboardStatus.error: + return const Text('error'); + } }, - child: const Text('Add User'), ), ], ), diff --git a/test/game/view/widgets/game_over_dialog_test.dart b/test/game/view/widgets/game_over_dialog_test.dart new file mode 100644 index 00000000..17901df8 --- /dev/null +++ b/test/game/view/widgets/game_over_dialog_test.dart @@ -0,0 +1,29 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:pinball/game/game.dart'; +import 'package:pinball_theme/pinball_theme.dart'; + +import '../../../helpers/helpers.dart'; + +void main() { + group('GameOverDialog', () { + testWidgets('renders GameOverDialogView', (tester) async { + await tester.pumpApp( + GameOverDialog( + score: 1000, + theme: DashTheme(), + ), + ); + + expect(find.byType(LeaderboardView), findsOneWidget); + }); + + testWidgets('route returns a valid navigation route', (tester) async { + await expectNavigatesToRoute( + tester, + LeaderboardPage.route( + theme: DashTheme(), + ), + ); + }); + }); +}