Skip to content

Commit fed71d2

Browse files
committed
Refactor commander link UI and improve game over page navigation
1 parent 137dc57 commit fed71d2

3 files changed

Lines changed: 90 additions & 100 deletions

File tree

lib/life_counter/view/game_over_page.dart

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import 'package:magic_yeti/l10n/l10n.dart';
1212
import 'package:magic_yeti/life_counter/bloc/game_over_bloc.dart';
1313
import 'package:magic_yeti/life_counter/view/game_page.dart';
1414
import 'package:magic_yeti/timer/bloc/timer_bloc.dart';
15-
import 'package:player_repository/models/player.dart';
1615
import 'package:player_repository/player_repository.dart';
1716

1817
class GameOverPage extends StatelessWidget {
@@ -53,14 +52,22 @@ class GameOverView extends StatelessWidget {
5352
return Scaffold(
5453
appBar: AppBar(
5554
title: Text(l10n.gameOverTitle),
56-
leading: IconButton(
57-
icon: const Icon(Icons.arrow_back),
58-
onPressed: () {
59-
context.go(GamePage.routePath);
60-
context.read<TimerBloc>().add(const TimerStartEvent());
61-
context.read<GameBloc>().add(const GameResumeEvent());
62-
},
63-
),
55+
leading: canRestoreGame
56+
? IconButton(
57+
icon: const Icon(Icons.arrow_back),
58+
onPressed: () {
59+
context.read<TimerBloc>().add(const TimerStartEvent());
60+
context.read<GameBloc>()
61+
..add(const GameRestoreRequested())
62+
..add(const GameResumeEvent());
63+
// Optionally show a snackbar or navigate
64+
ScaffoldMessenger.of(context).showSnackBar(
65+
SnackBar(content: Text(l10n.gameRestoredMessage)),
66+
);
67+
context.go(GamePage.routePath);
68+
},
69+
)
70+
: null,
6471
),
6572
body: BlocBuilder<GameOverBloc, GameOverState>(
6673
builder: (context, state) {
@@ -69,30 +76,6 @@ class GameOverView extends StatelessWidget {
6976

7077
return Column(
7178
children: [
72-
if (canRestoreGame)
73-
Padding(
74-
padding: const EdgeInsets.all(16.0),
75-
child: FilledButton.icon(
76-
icon: const Icon(Icons.undo, color: Colors.white),
77-
label: Text(l10n.undoGameOverButtonLabel),
78-
style: FilledButton.styleFrom(
79-
backgroundColor: Theme.of(context).colorScheme.primary,
80-
foregroundColor: Theme.of(context).colorScheme.onPrimary,
81-
minimumSize: const Size.fromHeight(48),
82-
textStyle: Theme.of(context).textTheme.titleMedium,
83-
),
84-
onPressed: () {
85-
context
86-
.read<GameBloc>()
87-
.add(const GameRestoreRequested());
88-
context.read<TimerBloc>().add(const TimerStartEvent());
89-
// Optionally show a snackbar or navigate
90-
ScaffoldMessenger.of(context).showSnackBar(
91-
SnackBar(content: Text(l10n.gameRestoredMessage)),
92-
);
93-
},
94-
),
95-
),
9679
Expanded(
9780
child: CustomScrollView(
9881
slivers: [

lib/match_details/view/match_details_page.dart

Lines changed: 33 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -338,13 +338,23 @@ class MatchWinnerWidget extends StatelessWidget {
338338
children: [
339339
Row(
340340
children: [
341-
CircleAvatar(
342-
backgroundImage:
343-
winner.commander?.imageUrl.isNotEmpty ?? false
344-
? NetworkImage(winner.commander!.imageUrl)
345-
: null,
346-
backgroundColor: Color(winner.color),
347-
radius: 50,
341+
GestureDetector(
342+
onTap: () async {
343+
final url = Uri.parse(
344+
winner.commander?.scryFallUrl ?? '',
345+
);
346+
if (await canLaunchUrl(url)) {
347+
await launchUrl(url);
348+
}
349+
},
350+
child: CircleAvatar(
351+
backgroundImage:
352+
winner.commander?.imageUrl.isNotEmpty ?? false
353+
? NetworkImage(winner.commander!.imageUrl)
354+
: null,
355+
backgroundColor: Color(winner.color),
356+
radius: 50,
357+
),
348358
),
349359
const SizedBox(width: 16),
350360
Expanded(
@@ -364,9 +374,6 @@ class MatchWinnerWidget extends StatelessWidget {
364374
),
365375
style: Theme.of(context).textTheme.bodyLarge,
366376
),
367-
LinkWidget(
368-
uri: winner.commander?.scryFallUrl ?? '',
369-
),
370377
],
371378
),
372379
if (winner.id == startingPlayerId)
@@ -391,33 +398,6 @@ class MatchWinnerWidget extends StatelessWidget {
391398
}
392399
}
393400

394-
class LinkWidget extends StatelessWidget {
395-
const LinkWidget({
396-
this.uri = '',
397-
super.key,
398-
});
399-
400-
final String uri;
401-
402-
@override
403-
Widget build(BuildContext context) {
404-
return uri.isEmpty
405-
? const SizedBox.shrink()
406-
: IconButton(
407-
icon: const Icon(Icons.link, color: AppColors.neutral60),
408-
onPressed: () async {
409-
final url = Uri.parse(
410-
uri,
411-
);
412-
if (await canLaunchUrl(url)) {
413-
await launchUrl(url);
414-
}
415-
},
416-
tooltip: context.l10n.viewOnScryfall,
417-
);
418-
}
419-
}
420-
421401
class MatchStandingsWidget extends StatelessWidget {
422402
const MatchStandingsWidget({
423403
required this.players,
@@ -550,12 +530,22 @@ class MatchStandingsWidget extends StatelessWidget {
550530
],
551531
),
552532
),
553-
CircleAvatar(
554-
backgroundImage:
555-
player.commander?.imageUrl.isNotEmpty ?? false
556-
? NetworkImage(player.commander!.imageUrl)
557-
: null,
558-
backgroundColor: Color(player.color),
533+
GestureDetector(
534+
child: CircleAvatar(
535+
backgroundImage:
536+
player.commander?.imageUrl.isNotEmpty ?? false
537+
? NetworkImage(player.commander!.imageUrl)
538+
: null,
539+
backgroundColor: Color(player.color),
540+
),
541+
onTap: () async {
542+
final url = Uri.parse(
543+
player.commander?.scryFallUrl ?? '',
544+
);
545+
if (await canLaunchUrl(url)) {
546+
await launchUrl(url);
547+
}
548+
},
559549
),
560550
const SizedBox(width: 16),
561551

@@ -574,9 +564,6 @@ class MatchStandingsWidget extends StatelessWidget {
574564
],
575565
),
576566
// Commander name and link
577-
if (player.commander?.name != null)
578-
LinkWidget(
579-
uri: player.commander?.scryFallUrl ?? ''),
580567
],
581568
),
582569
),

lib/player/view/customize_player_page.dart

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -67,24 +67,40 @@ class _CustomizePlayerViewState extends State<CustomizePlayerView> {
6767
return ValueListenableBuilder<bool>(
6868
valueListenable: rotationController,
6969
builder: (context, isRotated, child) {
70-
return Scaffold(
71-
resizeToAvoidBottomInset: true,
72-
appBar: AppBar(
73-
actions: [
74-
IconButton(
75-
icon: const Icon(Icons.screen_rotation),
76-
onPressed: toggleRotation,
70+
return BlocBuilder<PlayerCustomizationBloc, PlayerCustomizationState>(
71+
builder: (context, state) {
72+
return Scaffold(
73+
resizeToAvoidBottomInset: true,
74+
appBar: AppBar(
75+
actionsPadding: const EdgeInsets.fromLTRB(0, 0, 16, 0),
76+
actions: [
77+
ElevatedButton(
78+
style: ElevatedButton.styleFrom(
79+
backgroundColor: Colors.green),
80+
onPressed: () {
81+
context.read<PlayerBloc>().add(
82+
UpdatePlayerInfoEvent(
83+
playerName: textController.text,
84+
commander: state.commander,
85+
partner:
86+
state.hasPartner ? state.partner : null,
87+
playerId: widget.playerId,
88+
firebaseId: state.isAccountOwner
89+
? context.read<AppBloc>().state.user.id
90+
: null,
91+
),
92+
);
93+
94+
Navigator.pop(context);
95+
},
96+
child: const Text('Save')),
97+
],
7798
),
78-
],
79-
),
80-
body: SingleChildScrollView(
81-
controller: scrollController,
82-
child: Padding(
83-
padding: const EdgeInsets.all(AppSpacing.xxlg),
84-
child: BlocBuilder<PlayerCustomizationBloc,
85-
PlayerCustomizationState>(
86-
builder: (context, state) {
87-
return Column(
99+
body: SingleChildScrollView(
100+
controller: scrollController,
101+
child: Padding(
102+
padding: const EdgeInsets.all(AppSpacing.xxlg),
103+
child: Column(
88104
crossAxisAlignment: CrossAxisAlignment.stretch,
89105
children: [
90106
SizedBox(
@@ -102,6 +118,10 @@ class _CustomizePlayerViewState extends State<CustomizePlayerView> {
102118
: player.partner?.imageUrl,
103119
playerColor: player.color,
104120
),
121+
// IconButton(
122+
// icon: const Icon(Icons.screen_rotation),
123+
// onPressed: toggleRotation,
124+
// ),
105125
const SizedBox(width: AppSpacing.md),
106126
Expanded(
107127
child: Column(
@@ -143,11 +163,11 @@ class _CustomizePlayerViewState extends State<CustomizePlayerView> {
143163
scrollController: scrollController,
144164
),
145165
],
146-
);
147-
},
166+
),
167+
),
148168
),
149-
),
150-
),
169+
);
170+
},
151171
);
152172
},
153173
);

0 commit comments

Comments
 (0)