7 Commits

Author SHA1 Message Date
e3ac91bf48 remove todo
All checks were successful
Pull Request Pipeline / test (pull_request) Successful in 2m9s
Pull Request Pipeline / lint (pull_request) Successful in 2m11s
2025-12-05 19:41:01 +01:00
dba448b9c1 added const 2025-12-05 19:39:35 +01:00
d8551b3a27 add db functionality 2025-12-05 19:35:14 +01:00
8f2c7493d0 re-set gameListFuture to reload the games after changing the winner 2025-12-05 19:35:04 +01:00
f7f97fcdcb made tapping on game tile redirect to GameResultView 2025-12-05 19:26:47 +01:00
9ac6b6e04c added ontap feature & argument 2025-12-05 19:25:52 +01:00
e77896c1d4 removed settings icon leading to game result view 2025-12-05 19:25:31 +01:00
4 changed files with 140 additions and 139 deletions

View File

@@ -1,12 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:game_tracker/core/custom_theme.dart'; import 'package:game_tracker/core/custom_theme.dart';
import 'package:game_tracker/data/dto/game.dart';
import 'package:game_tracker/data/dto/group.dart';
import 'package:game_tracker/data/dto/player.dart';
import 'package:game_tracker/presentation/views/main_menu/game_history_view.dart'; import 'package:game_tracker/presentation/views/main_menu/game_history_view.dart';
import 'package:game_tracker/presentation/views/main_menu/game_result_view.dart';
import 'package:game_tracker/presentation/views/main_menu/groups_view.dart'; import 'package:game_tracker/presentation/views/main_menu/groups_view.dart';
import 'package:game_tracker/presentation/views/main_menu/home_view.dart'; import 'package:game_tracker/presentation/views/main_menu/home_view.dart';
import 'package:game_tracker/presentation/views/main_menu/settings_view.dart';
import 'package:game_tracker/presentation/views/main_menu/statistics_view.dart'; import 'package:game_tracker/presentation/views/main_menu/statistics_view.dart';
import 'package:game_tracker/presentation/widgets/navbar_item.dart'; import 'package:game_tracker/presentation/widgets/navbar_item.dart';
@@ -59,26 +56,7 @@ class _CustomNavigationBarState extends State<CustomNavigationBar>
onPressed: () async { onPressed: () async {
await Navigator.push( await Navigator.push(
context, context,
MaterialPageRoute( MaterialPageRoute(builder: (_) => const SettingsView()),
builder: (_) => GameResultView(
game: Game(
name: 'Test Game',
players: [
Player(name: 'Petrus'),
Player(name: 'Peter'),
Player(name: 'Petra'),
],
group: Group(
name: 'Die Petris',
members: [
Player(name: 'Petralia'),
Player(name: 'Petrenlia'),
Player(name: 'Petrumlia'),
],
),
),
),
), //TODO Replace with Settingsview
); );
setState(() { setState(() {
tabKeyCount++; tabKeyCount++;

View File

@@ -5,6 +5,7 @@ import 'package:game_tracker/data/dto/game.dart';
import 'package:game_tracker/data/dto/group.dart'; import 'package:game_tracker/data/dto/group.dart';
import 'package:game_tracker/data/dto/player.dart'; import 'package:game_tracker/data/dto/player.dart';
import 'package:game_tracker/presentation/views/main_menu/create_group_view.dart'; import 'package:game_tracker/presentation/views/main_menu/create_group_view.dart';
import 'package:game_tracker/presentation/views/main_menu/game_result_view.dart';
import 'package:game_tracker/presentation/widgets/app_skeleton.dart'; import 'package:game_tracker/presentation/widgets/app_skeleton.dart';
import 'package:game_tracker/presentation/widgets/buttons/custom_width_button.dart'; import 'package:game_tracker/presentation/widgets/buttons/custom_width_button.dart';
import 'package:game_tracker/presentation/widgets/tiles/game_history_tile.dart'; import 'package:game_tracker/presentation/widgets/tiles/game_history_tile.dart';
@@ -21,7 +22,6 @@ class GameHistoryView extends StatefulWidget {
class _GameHistoryViewState extends State<GameHistoryView> { class _GameHistoryViewState extends State<GameHistoryView> {
late Future<List<Game>> _gameListFuture; late Future<List<Game>> _gameListFuture;
late final AppDatabase db; late final AppDatabase db;
late bool isLoading = true;
late final List<Game> skeletonData = List.filled( late final List<Game> skeletonData = List.filled(
4, 4,
@@ -50,9 +50,6 @@ class _GameHistoryViewState extends State<GameHistoryView> {
Future.wait([_gameListFuture]).then((result) async { Future.wait([_gameListFuture]).then((result) async {
await Future.delayed(const Duration(milliseconds: 250)); await Future.delayed(const Duration(milliseconds: 250));
setState(() {
isLoading = false;
});
}); });
} }
@@ -86,14 +83,14 @@ class _GameHistoryViewState extends State<GameHistoryView> {
), ),
); );
} }
final bool isLoading =
snapshot.connectionState == ConnectionState.waiting;
final List<Game> games = final List<Game> games =
(isLoading ? skeletonData : (snapshot.data ?? []) (isLoading ? skeletonData : (snapshot.data ?? [])
..sort( ..sort(
(a, b) => b.createdAt.compareTo(a.createdAt), (a, b) => b.createdAt.compareTo(a.createdAt),
)) ))
.toList(); .toList();
return AppSkeleton( return AppSkeleton(
enabled: isLoading, enabled: isLoading,
child: ListView.builder( child: ListView.builder(
@@ -106,8 +103,20 @@ class _GameHistoryViewState extends State<GameHistoryView> {
); );
} }
return GameHistoryTile( return GameHistoryTile(
onTap: () async {
await Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
GameResultView(game: games[index]),
),
);
setState(() {
_gameListFuture = db.gameDao.getAllGames();
});
},
game: games[index], game: games[index],
); // Placeholder );
}, },
), ),
); );

View File

@@ -1,10 +1,12 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:game_tracker/core/custom_theme.dart'; import 'package:game_tracker/core/custom_theme.dart';
import 'package:game_tracker/data/db/database.dart';
import 'package:game_tracker/data/dto/game.dart'; import 'package:game_tracker/data/dto/game.dart';
import 'package:game_tracker/data/dto/player.dart'; import 'package:game_tracker/data/dto/player.dart';
import 'package:game_tracker/presentation/widgets/buttons/custom_width_button.dart'; import 'package:game_tracker/presentation/widgets/buttons/custom_width_button.dart';
import 'package:game_tracker/presentation/widgets/tiles/custom_radio_list_tile.dart'; import 'package:game_tracker/presentation/widgets/tiles/custom_radio_list_tile.dart';
import 'package:game_tracker/presentation/widgets/top_centered_message.dart'; import 'package:game_tracker/presentation/widgets/top_centered_message.dart';
import 'package:provider/provider.dart';
class GameResultView extends StatefulWidget { class GameResultView extends StatefulWidget {
final Game game; final Game game;
@@ -17,11 +19,16 @@ class GameResultView extends StatefulWidget {
class _GameResultViewState extends State<GameResultView> { class _GameResultViewState extends State<GameResultView> {
late final List<Player> allPlayers; late final List<Player> allPlayers;
Player? _player; //TODO: Set last winner as selected late final AppDatabase db;
Player? _player;
@override @override
void initState() { void initState() {
db = Provider.of<AppDatabase>(context, listen: false);
allPlayers = getAllPlayers(widget.game); allPlayers = getAllPlayers(widget.game);
if (widget.game.winner != null) {
_player = allPlayers.firstWhere((p) => p.id == widget.game.winner!.id);
}
super.initState(); super.initState();
} }
@@ -112,11 +119,29 @@ class _GameResultViewState extends State<GameResultView> {
text: 'Save', text: 'Save',
sizeRelativeToWidth: 0.95, sizeRelativeToWidth: 0.95,
onPressed: _player != null onPressed: _player != null
? () { ? () async {
print( print('Selected Winner: ${_player!.name}');
'Selected Winner: ${_player!.name}', bool success = await db.gameDao.setWinner(
); //TODO: Add winner to db gameId: widget.game.id,
winnerId: _player!.id,
);
if (!context.mounted) return;
if (success) {
Navigator.pop(context); Navigator.pop(context);
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
backgroundColor: CustomTheme.boxColor,
content: const Center(
child: Text(
'Error while setting winner, please try again',
style: TextStyle(color: Colors.white),
),
),
),
);
}
setState(() {});
} }
: null, : null,
), ),

View File

@@ -6,25 +6,24 @@ import 'package:intl/intl.dart';
class GameHistoryTile extends StatefulWidget { class GameHistoryTile extends StatefulWidget {
final Game game; final Game game;
final VoidCallback onTap;
const GameHistoryTile({ const GameHistoryTile({super.key, required this.game, required this.onTap});
super.key,
required this.game,
});
@override @override
State<GameHistoryTile> createState() => _GameHistoryTileState(); State<GameHistoryTile> createState() => _GameHistoryTileState();
} }
class _GameHistoryTileState extends State<GameHistoryTile> { class _GameHistoryTileState extends State<GameHistoryTile> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final group = widget.game.group; final group = widget.game.group;
final winner = widget.game.winner; final winner = widget.game.winner;
final allPlayers = _getAllPlayers(); final allPlayers = _getAllPlayers();
return Container( return GestureDetector(
onTap: widget.onTap,
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 12, vertical: 6), margin: const EdgeInsets.symmetric(horizontal: 12, vertical: 6),
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
decoration: BoxDecoration( decoration: BoxDecoration(
@@ -50,10 +49,7 @@ class _GameHistoryTileState extends State<GameHistoryTile> {
), ),
Text( Text(
_formatDate(widget.game.createdAt), _formatDate(widget.game.createdAt),
style: const TextStyle( style: const TextStyle(fontSize: 12, color: Colors.grey),
fontSize: 12,
color: Colors.grey,
),
), ),
], ],
), ),
@@ -63,19 +59,12 @@ class _GameHistoryTileState extends State<GameHistoryTile> {
if (group != null) ...[ if (group != null) ...[
Row( Row(
children: [ children: [
const Icon( const Icon(Icons.group, size: 16, color: Colors.grey),
Icons.group,
size: 16,
color: Colors.grey,
),
const SizedBox(width: 6), const SizedBox(width: 6),
Expanded( Expanded(
child: Text( child: Text(
group.name, group.name,
style: const TextStyle( style: const TextStyle(fontSize: 14, color: Colors.grey),
fontSize: 14,
color: Colors.grey,
),
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
), ),
), ),
@@ -86,7 +75,10 @@ class _GameHistoryTileState extends State<GameHistoryTile> {
if (winner != null) ...[ if (winner != null) ...[
Container( Container(
padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 12), padding: const EdgeInsets.symmetric(
vertical: 8,
horizontal: 12,
),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.green.withValues(alpha: 0.1), color: Colors.green.withValues(alpha: 0.1),
borderRadius: BorderRadius.circular(8), borderRadius: BorderRadius.circular(8),
@@ -134,15 +126,13 @@ class _GameHistoryTileState extends State<GameHistoryTile> {
spacing: 6, spacing: 6,
runSpacing: 6, runSpacing: 6,
children: allPlayers.map((player) { children: allPlayers.map((player) {
return TextIconTile( return TextIconTile(text: player.name, iconEnabled: false);
text: player.name,
iconEnabled: false,
);
}).toList(), }).toList(),
), ),
], ],
], ],
), ),
),
); );
} }
@@ -187,5 +177,4 @@ class _GameHistoryTileState extends State<GameHistoryTile> {
return allPlayers; return allPlayers;
} }
} }