git lixo 2

This commit is contained in:
2026-03-16 23:25:48 +00:00
parent a4ef651d64
commit ec5bdc4867
15 changed files with 974 additions and 1072 deletions

View File

@@ -5,7 +5,7 @@ class GameController {
final _supabase = Supabase.instance.client;
// 1. LER JOGOS (Stream em Tempo Real)
Stream<List<Game>> get gamesStream {
Stream<List<Game>> get gamesStream {
return _supabase
.from('games') // 1. Fica à escuta da tabela original (Garante o Tempo Real!)
.stream(primaryKey: ['id'])
@@ -21,6 +21,40 @@ Stream<List<Game>> get gamesStream {
return viewData.map((json) => Game.fromMap(json)).toList();
});
}
// =========================================================================
// 👇 NOVO: LER JOGOS COM FILTROS DE EQUIPA E TEMPORADA (MANTÉM OS LOGOS)
// =========================================================================
// =========================================================================
// 👇 LER JOGOS COM FILTROS DE EQUIPA E TEMPORADA (SEM ERROS DE QUERY)
// =========================================================================
Stream<List<Game>> getFilteredGames({required String teamFilter, required String seasonFilter}) {
return _supabase
.from('games')
.stream(primaryKey: ['id'])
.asyncMap((event) async {
// 1. Começamos a query APENAS com o select (Sem o order ainda!)
var query = _supabase.from('games_with_logos').select();
// 2. Se a temporada não for "Todas", aplicamos o filtro AQUI
if (seasonFilter != 'Todas') {
query = query.eq('season', seasonFilter);
}
// 3. Executamos a query e aplicamos o ORDER BY no final
final viewData = await query.order('game_date', ascending: false);
List<Game> games = viewData.map((json) => Game.fromMap(json)).toList();
// 4. Filtramos a equipa em memória
if (teamFilter != 'Todas') {
games = games.where((g) => g.myTeam == teamFilter || g.opponentTeam == teamFilter).toList();
}
return games;
});
}
// 2. CRIAR JOGO
// Retorna o ID do jogo criado para podermos navegar para o placar
Future<String?> createGame(String myTeam, String opponent, String season) async {

View File

@@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
class HomeController extends ChangeNotifier {
// Se precisar de estado para a home screen
int _selectedCardIndex = 0;
int get selectedCardIndex => _selectedCardIndex;
@@ -11,10 +10,8 @@ class HomeController extends ChangeNotifier {
notifyListeners();
}
// Métodos adicionais para lógica da home
void navigateToDetails(String playerName) {
print('Navegando para detalhes de $playerName');
// Implementar navegação
}
void refreshData() {

View File

@@ -5,7 +5,6 @@ class TeamController {
final _supabase = Supabase.instance.client;
// 1. STREAM (Realtime)
// Adicionei o .map() no final para garantir que o Dart entende que é uma List<Map>
Stream<List<Map<String, dynamic>>> get teamsStream {
return _supabase
.from('teams')
@@ -15,7 +14,6 @@ class TeamController {
}
// 2. CRIAR
// Alterei imageUrl para String? (pode ser nulo) para evitar erros se não houver imagem
Future<void> createTeam(String name, String season, String? imageUrl) async {
try {
await _supabase.from('teams').insert({
@@ -51,13 +49,12 @@ class TeamController {
}
}
// 5. CONTAR JOGADORES
// CORRIGIDO: A sintaxe antiga dava erro. O método .count() é o correto agora.
// 5. CONTAR JOGADORES (LEITURA ÚNICA)
Future<int> getPlayerCount(String teamId) async {
try {
final count = await _supabase
.from('members')
.count() // Retorna diretamente o número inteiro
.count()
.eq('team_id', teamId);
return count;
} catch (e) {
@@ -66,6 +63,17 @@ class TeamController {
}
}
// 👇 6. A FUNÇÃO QUE RESOLVE O ERRO (EM TEMPO REAL) 👇
Stream<int> getPlayerCountStream(String teamId) {
return _supabase
.from('members')
.stream(primaryKey: ['id'])
.eq('team_id', teamId)
.map((membros) => membros
.where((membro) => membro['type'] == 'Jogador')
.length);
}
// Mantemos o dispose vazio para não quebrar a chamada na TeamsPage
void dispose() {}
}