Renamed every instance of "game" to "match"

This commit is contained in:
2025-12-11 20:07:32 +01:00
parent d0059b44a8
commit 99cea1e703
41 changed files with 1525 additions and 1459 deletions

View File

@@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import 'package:game_tracker/core/custom_theme.dart';
import 'package:game_tracker/presentation/views/main_menu/game_history_view.dart';
import 'package:game_tracker/presentation/views/main_menu/groups_view.dart';
import 'package:game_tracker/presentation/views/main_menu/group_view/groups_view.dart';
import 'package:game_tracker/presentation/views/main_menu/home_view.dart';
import 'package:game_tracker/presentation/views/main_menu/match_view/match_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/widgets/navbar_item.dart';
@@ -30,8 +30,8 @@ class _CustomNavigationBarState extends State<CustomNavigationBar>
final List<Widget> tabs = [
KeyedSubtree(key: ValueKey('home_$tabKeyCount'), child: const HomeView()),
KeyedSubtree(
key: ValueKey('games_$tabKeyCount'),
child: const GameHistoryView(),
key: ValueKey('matches_$tabKeyCount'),
child: const MatchView(),
),
KeyedSubtree(
key: ValueKey('groups_$tabKeyCount'),
@@ -96,7 +96,7 @@ class _CustomNavigationBarState extends State<CustomNavigationBar>
index: 1,
isSelected: currentIndex == 1,
icon: Icons.gamepad_rounded,
label: 'Games',
label: 'Matches',
onTabTapped: onTabTapped,
),
NavbarItem(
@@ -133,7 +133,7 @@ class _CustomNavigationBarState extends State<CustomNavigationBar>
case 0:
return 'Home';
case 1:
return 'Game History';
return 'Matches';
case 2:
return 'Groups';
case 3:

View File

@@ -3,7 +3,7 @@ import 'package:game_tracker/core/custom_theme.dart';
import 'package:game_tracker/data/db/database.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/create_group_view.dart';
import 'package:game_tracker/presentation/views/main_menu/group_view/create_group_view.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/tiles/group_tile.dart';
@@ -25,7 +25,7 @@ class _GroupsViewState extends State<GroupsView> {
late final List<Group> skeletonData = List.filled(
7,
Group(
name: 'Skeleton Game',
name: 'Skeleton Match',
members: [player, player, player, player, player, player],
),
);

View File

@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:game_tracker/data/db/database.dart';
import 'package:game_tracker/data/dto/game.dart';
import 'package:game_tracker/data/dto/group.dart';
import 'package:game_tracker/data/dto/match.dart';
import 'package:game_tracker/data/dto/player.dart';
import 'package:game_tracker/presentation/widgets/app_skeleton.dart';
import 'package:game_tracker/presentation/widgets/buttons/quick_create_button.dart';
@@ -18,15 +18,15 @@ class HomeView extends StatefulWidget {
}
class _HomeViewState extends State<HomeView> {
late Future<int> _gameCountFuture;
late Future<int> _matchCountFuture;
late Future<int> _groupCountFuture;
late Future<List<Game>> _recentGamesFuture;
late Future<List<Match>> _recentMatchesFuture;
bool isLoading = true;
late final List<Game> skeletonData = List.filled(
late final List<Match> skeletonData = List.filled(
2,
Game(
name: 'Skeleton Game',
Match(
name: 'Skeleton Match',
group: Group(
name: 'Skeleton Group',
members: [
@@ -42,20 +42,22 @@ class _HomeViewState extends State<HomeView> {
initState() {
super.initState();
final db = Provider.of<AppDatabase>(context, listen: false);
_gameCountFuture = db.gameDao.getGameCount();
_matchCountFuture = db.matchDao.getMatchCount();
_groupCountFuture = db.groupDao.getGroupCount();
_recentGamesFuture = db.gameDao.getAllGames();
_recentMatchesFuture = db.matchDao.getAllMatches();
Future.wait([_gameCountFuture, _groupCountFuture, _recentGamesFuture]).then(
(_) async {
await Future.delayed(const Duration(milliseconds: 250));
if (mounted) {
setState(() {
isLoading = false;
});
}
},
);
Future.wait([
_matchCountFuture,
_groupCountFuture,
_recentMatchesFuture,
]).then((_) async {
await Future.delayed(const Duration(milliseconds: 250));
if (mounted) {
setState(() {
isLoading = false;
});
}
});
}
@override
@@ -72,7 +74,7 @@ class _HomeViewState extends State<HomeView> {
mainAxisAlignment: MainAxisAlignment.center,
children: [
FutureBuilder<int>(
future: _gameCountFuture,
future: _matchCountFuture,
builder: (context, snapshot) {
final int count = (snapshot.hasData)
? snapshot.data!
@@ -115,11 +117,11 @@ class _HomeViewState extends State<HomeView> {
content: Padding(
padding: const EdgeInsets.symmetric(horizontal: 40.0),
child: FutureBuilder(
future: _recentGamesFuture,
future: _recentMatchesFuture,
builder:
(
BuildContext context,
AsyncSnapshot<List<Game>> snapshot,
AsyncSnapshot<List<Match>> snapshot,
) {
if (snapshot.hasError) {
return const Center(
@@ -129,7 +131,7 @@ class _HomeViewState extends State<HomeView> {
),
);
}
final List<Game> games =
final List<Match> matches =
(isLoading
? skeletonData
: (snapshot.data ?? [])
@@ -140,19 +142,19 @@ class _HomeViewState extends State<HomeView> {
))
.take(2)
.toList();
if (games.isNotEmpty) {
if (matches.isNotEmpty) {
return Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
GameTile(
gameTitle: games[0].name,
gameType: 'Winner',
MatchTile(
matchTitle: matches[0].name,
game: 'Winner',
ruleset: 'Ruleset',
players: _getPlayerText(games[0]),
winner: games[0].winner == null
players: _getPlayerText(matches[0]),
winner: matches[0].winner == null
? 'Game in progress...'
: games[0].winner!.name,
: matches[0].winner!.name,
),
const Padding(
padding: EdgeInsets.symmetric(
@@ -160,15 +162,15 @@ class _HomeViewState extends State<HomeView> {
),
child: Divider(),
),
if (games.length > 1) ...[
GameTile(
gameTitle: games[1].name,
gameType: 'Winner',
if (matches.length > 1) ...[
MatchTile(
matchTitle: matches[1].name,
game: 'Winner',
ruleset: 'Ruleset',
players: _getPlayerText(games[1]),
winner: games[1].winner == null
players: _getPlayerText(matches[1]),
winner: matches[1].winner == null
? 'Game in progress...'
: games[1].winner!.name,
: matches[1].winner!.name,
),
const SizedBox(height: 8),
] else ...[
@@ -249,7 +251,7 @@ class _HomeViewState extends State<HomeView> {
);
}
String _getPlayerText(Game game) {
String _getPlayerText(Match game) {
if (game.group == null) {
final playerCount = game.players?.length ?? 0;
return '$playerCount Players';

View File

@@ -3,28 +3,28 @@ import 'package:flutter/material.dart';
import 'package:game_tracker/core/custom_theme.dart';
import 'package:game_tracker/core/enums.dart';
import 'package:game_tracker/data/db/database.dart';
import 'package:game_tracker/data/dto/game.dart';
import 'package:game_tracker/data/dto/group.dart';
import 'package:game_tracker/data/dto/match.dart';
import 'package:game_tracker/data/dto/player.dart';
import 'package:game_tracker/presentation/views/main_menu/create_game/choose_game_view.dart';
import 'package:game_tracker/presentation/views/main_menu/create_game/choose_group_view.dart';
import 'package:game_tracker/presentation/views/main_menu/create_game/choose_ruleset_view.dart';
import 'package:game_tracker/presentation/views/main_menu/game_result_view.dart';
import 'package:game_tracker/presentation/views/main_menu/match_view/create_match/choose_game_view.dart';
import 'package:game_tracker/presentation/views/main_menu/match_view/create_match/choose_group_view.dart';
import 'package:game_tracker/presentation/views/main_menu/match_view/create_match/choose_ruleset_view.dart';
import 'package:game_tracker/presentation/views/main_menu/match_view/match_result_view.dart';
import 'package:game_tracker/presentation/widgets/buttons/custom_width_button.dart';
import 'package:game_tracker/presentation/widgets/player_selection.dart';
import 'package:game_tracker/presentation/widgets/text_input/text_input_field.dart';
import 'package:game_tracker/presentation/widgets/tiles/choose_tile.dart';
import 'package:provider/provider.dart';
class CreateGameView extends StatefulWidget {
class CreateMatchView extends StatefulWidget {
final VoidCallback? onWinnerChanged;
const CreateGameView({super.key, this.onWinnerChanged});
const CreateMatchView({super.key, this.onWinnerChanged});
@override
State<CreateGameView> createState() => _CreateGameViewState();
State<CreateMatchView> createState() => _CreateMatchViewState();
}
class _CreateGameViewState extends State<CreateGameView> {
class _CreateMatchViewState extends State<CreateMatchView> {
/// Reference to the app database
late final AppDatabase db;
@@ -234,20 +234,20 @@ class _CreateGameViewState extends State<CreateGameView> {
buttonType: ButtonType.primary,
onPressed: _enableCreateGameButton()
? () async {
Game game = Game(
Match match = Match(
name: _gameNameController.text.trim(),
createdAt: DateTime.now(),
group: selectedGroup,
players: selectedPlayers,
);
await db.gameDao.addGame(game: game);
await db.matchDao.addMatch(match: match);
if (context.mounted) {
Navigator.pushReplacement(
context,
CupertinoPageRoute(
fullscreenDialog: true,
builder: (context) => GameResultView(
game: game,
match: match,
onWinnerChanged: widget.onWinnerChanged,
),
),

View File

@@ -1,17 +1,17 @@
import 'package:flutter/material.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/match.dart';
import 'package:game_tracker/data/dto/player.dart';
import 'package:game_tracker/presentation/widgets/tiles/custom_radio_list_tile.dart';
import 'package:provider/provider.dart';
class GameResultView extends StatefulWidget {
final Game game;
final Match match;
final VoidCallback? onWinnerChanged;
const GameResultView({super.key, required this.game, this.onWinnerChanged});
const GameResultView({super.key, required this.match, this.onWinnerChanged});
@override
State<GameResultView> createState() => _GameResultViewState();
}
@@ -24,10 +24,10 @@ class _GameResultViewState extends State<GameResultView> {
@override
void initState() {
db = Provider.of<AppDatabase>(context, listen: false);
allPlayers = getAllPlayers(widget.game);
if (widget.game.winner != null) {
allPlayers = getAllPlayers(widget.match);
if (widget.match.winner != null) {
_selectedPlayer = allPlayers.firstWhere(
(p) => p.id == widget.game.winner!.id,
(p) => p.id == widget.match.winner!.id,
);
}
super.initState();
@@ -41,7 +41,7 @@ class _GameResultViewState extends State<GameResultView> {
backgroundColor: CustomTheme.backgroundColor,
scrolledUnderElevation: 0,
title: Text(
widget.game.name,
widget.match.name,
style: const TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
@@ -125,17 +125,17 @@ class _GameResultViewState extends State<GameResultView> {
Future<void> _handleWinnerSaving() async {
if (_selectedPlayer == null) {
await db.gameDao.removeWinner(gameId: widget.game.id);
await db.matchDao.removeWinner(matchId: widget.match.id);
} else {
await db.gameDao.setWinner(
gameId: widget.game.id,
await db.matchDao.setWinner(
matchId: widget.match.id,
winnerId: _selectedPlayer!.id,
);
}
widget.onWinnerChanged?.call();
}
List<Player> getAllPlayers(Game game) {
List<Player> getAllPlayers(Match game) {
if (game.group == null && game.players != null) {
return [...game.players!];
} else if (game.group != null && game.players != null) {

View File

@@ -1,32 +1,34 @@
import 'dart:core' hide Match;
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.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/group.dart';
import 'package:game_tracker/data/dto/match.dart';
import 'package:game_tracker/data/dto/player.dart';
import 'package:game_tracker/presentation/views/main_menu/create_game/create_game_view.dart';
import 'package:game_tracker/presentation/views/main_menu/game_result_view.dart';
import 'package:game_tracker/presentation/views/main_menu/match_view/create_match/create_match_view.dart';
import 'package:game_tracker/presentation/views/main_menu/match_view/match_result_view.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/tiles/game_history_tile.dart';
import 'package:game_tracker/presentation/widgets/top_centered_message.dart';
import 'package:provider/provider.dart';
class GameHistoryView extends StatefulWidget {
const GameHistoryView({super.key});
class MatchView extends StatefulWidget {
const MatchView({super.key});
@override
State<GameHistoryView> createState() => _GameHistoryViewState();
State<MatchView> createState() => _MatchViewState();
}
class _GameHistoryViewState extends State<GameHistoryView> {
late Future<List<Game>> _gameListFuture;
class _MatchViewState extends State<MatchView> {
late Future<List<Match>> _gameListFuture;
late final AppDatabase db;
late final List<Game> skeletonData = List.filled(
late final List<Match> skeletonData = List.filled(
4,
Game(
Match(
name: 'Skeleton Gamename',
group: Group(
name: 'Groupname',
@@ -43,7 +45,7 @@ class _GameHistoryViewState extends State<GameHistoryView> {
db = Provider.of<AppDatabase>(context, listen: false);
_gameListFuture = Future.delayed(
const Duration(milliseconds: 250),
() => db.gameDao.getAllGames(),
() => db.matchDao.getAllMatches(),
);
}
@@ -54,10 +56,10 @@ class _GameHistoryViewState extends State<GameHistoryView> {
body: Stack(
alignment: Alignment.center,
children: [
FutureBuilder<List<Game>>(
FutureBuilder<List<Match>>(
future: _gameListFuture,
builder:
(BuildContext context, AsyncSnapshot<List<Game>> snapshot) {
(BuildContext context, AsyncSnapshot<List<Match>> snapshot) {
if (snapshot.hasError) {
return const Center(
child: TopCenteredMessage(
@@ -79,7 +81,7 @@ class _GameHistoryViewState extends State<GameHistoryView> {
}
final bool isLoading =
snapshot.connectionState == ConnectionState.waiting;
final List<Game> games =
final List<Match> matches =
(isLoading ? skeletonData : (snapshot.data ?? [])
..sort(
(a, b) => b.createdAt.compareTo(a.createdAt),
@@ -89,9 +91,9 @@ class _GameHistoryViewState extends State<GameHistoryView> {
enabled: isLoading,
child: ListView.builder(
padding: const EdgeInsets.only(bottom: 85),
itemCount: games.length + 1,
itemCount: matches.length + 1,
itemBuilder: (BuildContext context, int index) {
if (index == games.length) {
if (index == matches.length) {
return SizedBox(
height: MediaQuery.paddingOf(context).bottom - 80,
);
@@ -103,13 +105,13 @@ class _GameHistoryViewState extends State<GameHistoryView> {
CupertinoPageRoute(
fullscreenDialog: true,
builder: (context) => GameResultView(
game: games[index],
match: matches[index],
onWinnerChanged: refreshGameList,
),
),
);
},
game: games[index],
match: matches[index],
);
},
),
@@ -126,7 +128,7 @@ class _GameHistoryViewState extends State<GameHistoryView> {
context,
MaterialPageRoute(
builder: (context) =>
CreateGameView(onWinnerChanged: refreshGameList),
CreateMatchView(onWinnerChanged: refreshGameList),
),
);
},
@@ -139,7 +141,7 @@ class _GameHistoryViewState extends State<GameHistoryView> {
void refreshGameList() {
setState(() {
_gameListFuture = db.gameDao.getAllGames();
_gameListFuture = db.matchDao.getAllMatches();
});
}
}

View File

@@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:game_tracker/data/db/database.dart';
import 'package:game_tracker/data/dto/game.dart';
import 'package:game_tracker/data/dto/match.dart';
import 'package:game_tracker/data/dto/player.dart';
import 'package:game_tracker/presentation/widgets/app_skeleton.dart';
import 'package:game_tracker/presentation/widgets/tiles/statistics_tile.dart';
@@ -14,10 +14,10 @@ class StatisticsView extends StatefulWidget {
}
class _StatisticsViewState extends State<StatisticsView> {
late Future<List<Game>> _gamesFuture;
late Future<List<Match>> _matchesFuture;
late Future<List<Player>> _playersFuture;
List<(String, int)> winCounts = List.filled(6, ('Skeleton Player', 1));
List<(String, int)> gameCounts = List.filled(6, ('Skeleton Player', 1));
List<(String, int)> matchCounts = List.filled(6, ('Skeleton Player', 1));
List<(String, double)> winRates = List.filled(6, ('Skeleton Player', 1));
bool isLoading = true;
@@ -25,16 +25,16 @@ class _StatisticsViewState extends State<StatisticsView> {
void initState() {
super.initState();
final db = Provider.of<AppDatabase>(context, listen: false);
_gamesFuture = db.gameDao.getAllGames();
_matchesFuture = db.matchDao.getAllMatches();
_playersFuture = db.playerDao.getAllPlayers();
Future.wait([_gamesFuture, _playersFuture]).then((results) async {
Future.wait([_matchesFuture, _playersFuture]).then((results) async {
await Future.delayed(const Duration(milliseconds: 250));
final games = results[0] as List<Game>;
final matches = results[0] as List<Match>;
final players = results[1] as List<Player>;
winCounts = _calculateWinsForAllPlayers(games, players);
gameCounts = _calculateGameAmountsForAllPlayers(games, players);
winRates = computeWinRatePercent(wins: winCounts, games: gameCounts);
winCounts = _calculateWinsForAllPlayers(matches, players);
matchCounts = _calculateGameAmountsForAllPlayers(matches, players);
winRates = computeWinRatePercent(wins: winCounts, matches: matchCounts);
if (mounted) {
setState(() {
isLoading = false;
@@ -78,9 +78,9 @@ class _StatisticsViewState extends State<StatisticsView> {
SizedBox(height: constraints.maxHeight * 0.02),
StatisticsTile(
icon: Icons.casino,
title: 'Games per Player',
title: 'Match per Player',
width: constraints.maxWidth * 0.95,
values: gameCounts,
values: matchCounts,
itemCount: 10,
barColor: Colors.green,
),
@@ -97,7 +97,7 @@ class _StatisticsViewState extends State<StatisticsView> {
/// Calculates the number of wins for each player
/// and returns a sorted list of tuples (playerName, winCount)
List<(String, int)> _calculateWinsForAllPlayers(
List<Game> games,
List<Match> games,
List<Player> players,
) {
List<(String, int)> winCounts = [];
@@ -141,39 +141,39 @@ class _StatisticsViewState extends State<StatisticsView> {
return winCounts;
}
/// Calculates the number of games played for each player
/// and returns a sorted list of tuples (playerName, gameCount)
/// Calculates the number of matches played for each player
/// and returns a sorted list of tuples (playerName, matchCount)
List<(String, int)> _calculateGameAmountsForAllPlayers(
List<Game> games,
List<Match> matches,
List<Player> players,
) {
List<(String, int)> gameCounts = [];
List<(String, int)> matchCounts = [];
// Counting games for each player
for (var game in games) {
if (game.group != null) {
final members = game.group!.members.map((p) => p.id).toList();
// Counting matches for each player
for (var match in matches) {
if (match.group != null) {
final members = match.group!.members.map((p) => p.id).toList();
for (var playerId in members) {
final index = gameCounts.indexWhere((entry) => entry.$1 == playerId);
final index = matchCounts.indexWhere((entry) => entry.$1 == playerId);
// -1 means player not found in gameCounts
if (index != -1) {
final current = gameCounts[index].$2;
gameCounts[index] = (playerId, current + 1);
final current = matchCounts[index].$2;
matchCounts[index] = (playerId, current + 1);
} else {
gameCounts.add((playerId, 1));
matchCounts.add((playerId, 1));
}
}
}
if (game.players != null) {
final members = game.players!.map((p) => p.id).toList();
if (match.players != null) {
final members = match.players!.map((p) => p.id).toList();
for (var playerId in members) {
final index = gameCounts.indexWhere((entry) => entry.$1 == playerId);
final index = matchCounts.indexWhere((entry) => entry.$1 == playerId);
// -1 means player not found in gameCounts
if (index != -1) {
final current = gameCounts[index].$2;
gameCounts[index] = (playerId, current + 1);
final current = matchCounts[index].$2;
matchCounts[index] = (playerId, current + 1);
} else {
gameCounts.add((playerId, 1));
matchCounts.add((playerId, 1));
}
}
}
@@ -181,35 +181,35 @@ class _StatisticsViewState extends State<StatisticsView> {
// Adding all players with zero games
for (var player in players) {
final index = gameCounts.indexWhere((entry) => entry.$1 == player.id);
final index = matchCounts.indexWhere((entry) => entry.$1 == player.id);
// -1 means player not found in gameCounts
if (index == -1) {
gameCounts.add((player.id, 0));
matchCounts.add((player.id, 0));
}
}
// Replace player IDs with names
for (int i = 0; i < gameCounts.length; i++) {
final playerId = gameCounts[i].$1;
for (int i = 0; i < matchCounts.length; i++) {
final playerId = matchCounts[i].$1;
final player = players.firstWhere(
(p) => p.id == playerId,
orElse: () => Player(id: playerId, name: 'N.a.'),
);
gameCounts[i] = (player.name, gameCounts[i].$2);
matchCounts[i] = (player.name, matchCounts[i].$2);
}
gameCounts.sort((a, b) => b.$2.compareTo(a.$2));
matchCounts.sort((a, b) => b.$2.compareTo(a.$2));
return gameCounts;
return matchCounts;
}
// dart
List<(String, double)> computeWinRatePercent({
required List<(String, int)> wins,
required List<(String, int)> games,
required List<(String, int)> matches,
}) {
final Map<String, int> winsMap = {for (var e in wins) e.$1: e.$2};
final Map<String, int> gamesMap = {for (var e in games) e.$1: e.$2};
final Map<String, int> gamesMap = {for (var e in matches) e.$1: e.$2};
// Get all unique player names
final names = {...winsMap.keys, ...gamesMap.keys};

View File

@@ -1,14 +1,14 @@
import 'package:flutter/material.dart';
import 'package:game_tracker/core/custom_theme.dart';
import 'package:game_tracker/data/dto/game.dart';
import 'package:game_tracker/data/dto/match.dart';
import 'package:game_tracker/presentation/widgets/tiles/text_icon_tile.dart';
import 'package:intl/intl.dart';
class GameHistoryTile extends StatefulWidget {
final Game game;
final Match match;
final VoidCallback onTap;
const GameHistoryTile({super.key, required this.game, required this.onTap});
const GameHistoryTile({super.key, required this.match, required this.onTap});
@override
State<GameHistoryTile> createState() => _GameHistoryTileState();
@@ -17,8 +17,8 @@ class GameHistoryTile extends StatefulWidget {
class _GameHistoryTileState extends State<GameHistoryTile> {
@override
Widget build(BuildContext context) {
final group = widget.game.group;
final winner = widget.game.winner;
final group = widget.match.group;
final winner = widget.match.winner;
final allPlayers = _getAllPlayers();
return GestureDetector(
@@ -39,7 +39,7 @@ class _GameHistoryTileState extends State<GameHistoryTile> {
children: [
Expanded(
child: Text(
widget.game.name,
widget.match.name,
style: const TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
@@ -48,7 +48,7 @@ class _GameHistoryTileState extends State<GameHistoryTile> {
),
),
Text(
_formatDate(widget.game.createdAt),
_formatDate(widget.match.createdAt),
style: const TextStyle(fontSize: 12, color: Colors.grey),
),
],
@@ -156,8 +156,8 @@ class _GameHistoryTileState extends State<GameHistoryTile> {
final playerIds = <String>{};
// Add players from game.players
if (widget.game.players != null) {
for (var player in widget.game.players!) {
if (widget.match.players != null) {
for (var player in widget.match.players!) {
if (!playerIds.contains(player.id)) {
allPlayers.add(player);
playerIds.add(player.id);
@@ -166,8 +166,8 @@ class _GameHistoryTileState extends State<GameHistoryTile> {
}
// Add players from game.group.players
if (widget.game.group?.members != null) {
for (var player in widget.game.group!.members) {
if (widget.match.group?.members != null) {
for (var player in widget.match.group!.members) {
if (!playerIds.contains(player.id)) {
allPlayers.add(player);
playerIds.add(player.id);

View File

@@ -2,27 +2,27 @@ import 'package:flutter/material.dart';
import 'package:game_tracker/core/custom_theme.dart';
import 'package:skeletonizer/skeletonizer.dart';
class GameTile extends StatefulWidget {
final String gameTitle;
final String gameType;
class MatchTile extends StatefulWidget {
final String matchTitle;
final String game;
final String ruleset;
final String players;
final String winner;
const GameTile({
const MatchTile({
super.key,
required this.gameTitle,
required this.gameType,
required this.matchTitle,
required this.game,
required this.ruleset,
required this.players,
required this.winner,
});
@override
State<GameTile> createState() => _GameTileState();
State<MatchTile> createState() => _MatchTileState();
}
class _GameTileState extends State<GameTile> {
class _MatchTileState extends State<MatchTile> {
@override
Widget build(BuildContext context) {
return Column(
@@ -31,12 +31,12 @@ class _GameTileState extends State<GameTile> {
Row(
children: [
Text(
widget.gameTitle,
widget.matchTitle,
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
),
const SizedBox(width: 5),
Text(
widget.gameType,
widget.game,
style: const TextStyle(fontSize: 14, color: Colors.grey),
),
],

View File

@@ -40,11 +40,11 @@ class StatisticsTile extends StatelessWidget {
child: Column(
children: List.generate(min(values.length, itemCount), (index) {
/// The maximum wins among all players
final maxGames = values.isNotEmpty ? values[0].$2 : 0;
final maxMatches = values.isNotEmpty ? values[0].$2 : 0;
/// Fraction of wins
final double fraction = (maxGames > 0)
? (values[index].$2 / maxGames)
final double fraction = (maxMatches > 0)
? (values[index].$2 / maxMatches)
: 0.0;
/// Calculated width for current the bar