tempo e time out

This commit is contained in:
2026-03-05 10:40:40 +00:00
parent e6b08befc7
commit f7efe47907

View File

@@ -56,57 +56,82 @@ class PlacarController {
Timer? timer;
bool isRunning = false;
// --- INICIALIZAÇÃO E BD ---
Future<void> loadPlayers() async {
Future<void> loadPlayers() async {
final supabase = Supabase.instance.client;
try {
// 1. Buscar os IDs das equipas
final teamsResponse = await supabase.from('teams').select('id, name').inFilter('name', [myTeam, opponentTeam]);
// 1. Limpeza de segurança para evitar duplicados em "Hot Reload"
myCourt.clear(); myBench.clear(); oppCourt.clear(); oppBench.clear();
playerStats.clear(); playerNumbers.clear(); playerDbIds.clear();
myFouls = 0; opponentFouls = 0;
await Future.delayed(const Duration(milliseconds: 1500));
// 2. Buscar dados do JOGO (Placar)
final gameResponse = await supabase.from('games').select().eq('id', gameId).single();
myScore = gameResponse['my_score'] ?? 0;
opponentScore = gameResponse['opponent_score'] ?? 0;
// 3. Buscar IDs das Equipas
final teamsResponse = await supabase.from('teams').select('id, name').inFilter('name', [myTeam, opponentTeam]);
for (var t in teamsResponse) {
if (t['name'] == myTeam) myTeamDbId = t['id'];
if (t['name'] == opponentTeam) oppTeamDbId = t['id'];
}
// 2. Buscar os Jogadores
List<dynamic> myPlayers = myTeamDbId != null ? await supabase.from('members').select().eq('team_id', myTeamDbId!).eq('type', 'Jogador') : [];
List<dynamic> oppPlayers = oppTeamDbId != null ? await supabase.from('members').select().eq('team_id', oppTeamDbId!).eq('type', 'Jogador') : [];
// 4. Buscar Membros e ESTATÍSTICAS existentes
final myPlayers = myTeamDbId != null ? await supabase.from('members').select().eq('team_id', myTeamDbId!).eq('type', 'Jogador') : [];
final oppPlayers = oppTeamDbId != null ? await supabase.from('members').select().eq('team_id', oppTeamDbId!).eq('type', 'Jogador') : [];
// Buscar todas as stats deste jogo de uma vez
final statsResponse = await supabase.from('player_stats').select().eq('game_id', gameId);
final Map<String, dynamic> savedStatsMap = {
for (var s in statsResponse) s['member_id'].toString(): s
};
// 3. Registar a tua equipa
// 5. Processar Minha Equipa
for (int i = 0; i < myPlayers.length; i++) {
_registerPlayer(
name: myPlayers[i]['name'].toString(),
number: myPlayers[i]['number']?.toString() ?? "0",
dbId: myPlayers[i]['id'].toString(), // Guarda o UUID real
isMyTeam: true,
isCourt: i < 5
);
String dbId = myPlayers[i]['id'].toString();
String name = myPlayers[i]['name'].toString();
_registerPlayer(name: name, number: myPlayers[i]['number']?.toString() ?? "0", dbId: dbId, isMyTeam: true, isCourt: i < 5);
if (savedStatsMap.containsKey(dbId)) {
_injectStats(name, savedStatsMap[dbId], true);
}
}
_padTeam(myCourt, myBench, "Jogador", isMyTeam: true);
// 4. Registar a equipa adversária
// 6. Processar Adversário
for (int i = 0; i < oppPlayers.length; i++) {
_registerPlayer(
name: oppPlayers[i]['name'].toString(),
number: oppPlayers[i]['number']?.toString() ?? "0",
dbId: oppPlayers[i]['id'].toString(), // Guarda o UUID real
isMyTeam: false,
isCourt: i < 5
);
String dbId = oppPlayers[i]['id'].toString();
String name = oppPlayers[i]['name'].toString();
_registerPlayer(name: name, number: oppPlayers[i]['number']?.toString() ?? "0", dbId: dbId, isMyTeam: false, isCourt: i < 5);
if (savedStatsMap.containsKey(dbId)) {
_injectStats(name, savedStatsMap[dbId], false);
}
}
_padTeam(oppCourt, oppBench, "Adversário", isMyTeam: false);
isLoading = false;
onUpdate();
} catch (e) {
debugPrint("Erro ao carregar jogadores: $e");
_padTeam(myCourt, myBench, "Falha", isMyTeam: true);
_padTeam(oppCourt, oppBench, "Falha Opp", isMyTeam: false);
debugPrint("Erro ao carregar: $e");
isLoading = false;
onUpdate();
}
}
// Função auxiliar para injetar os dados salvos
void _injectStats(String playerName, Map<String, dynamic> s, bool isMyTeam) {
playerStats[playerName] = {
"pts": s['pts'] ?? 0, "rbs": s['rbs'] ?? 0, "ast": s['ast'] ?? 0,
"stl": s['stl'] ?? 0, "tov": s['tov'] ?? 0, "blk": s['blk'] ?? 0,
"fls": s['fls'] ?? 0, "fgm": s['fgm'] ?? 0, "fga": s['fga'] ?? 0,
};
if (isMyTeam) myFouls += (s['fls'] as int? ?? 0);
else opponentFouls += (s['fls'] as int? ?? 0);
}
void _registerPlayer({required String name, required String number, String? dbId, required bool isMyTeam, required bool isCourt}) {
if (playerNumbers.containsKey(name)) name = "$name (Opp)";