mapa de calor ?
This commit is contained in:
@@ -1,19 +1,24 @@
|
||||
import 'package:supabase_flutter/supabase_flutter.dart';
|
||||
|
||||
class TeamController {
|
||||
// Instância do cliente Supabase
|
||||
final _supabase = Supabase.instance.client;
|
||||
|
||||
// 1. STREAM (Realtime)
|
||||
Stream<List<Map<String, dynamic>>> get teamsStream {
|
||||
return _supabase
|
||||
// 1. Variável fixa para guardar o Stream principal
|
||||
late final Stream<List<Map<String, dynamic>>> teamsStream;
|
||||
|
||||
// 2. Dicionário (Cache) para não recriar Streams de contagem repetidos
|
||||
final Map<String, Stream<int>> _playerCountStreams = {};
|
||||
|
||||
TeamController() {
|
||||
// INICIALIZAÇÃO: O stream é criado APENAS UMA VEZ quando abres a página!
|
||||
teamsStream = _supabase
|
||||
.from('teams')
|
||||
.stream(primaryKey: ['id'])
|
||||
.order('name', ascending: true)
|
||||
.map((data) => List<Map<String, dynamic>>.from(data));
|
||||
}
|
||||
|
||||
// 2. CRIAR
|
||||
// CRIAR
|
||||
Future<void> createTeam(String name, String season, String? imageUrl) async {
|
||||
try {
|
||||
await _supabase.from('teams').insert({
|
||||
@@ -28,35 +33,50 @@ class TeamController {
|
||||
}
|
||||
}
|
||||
|
||||
// 3. ELIMINAR
|
||||
// ELIMINAR
|
||||
Future<void> deleteTeam(String id) async {
|
||||
try {
|
||||
await _supabase.from('teams').delete().eq('id', id);
|
||||
// Limpa o cache deste teamId se a equipa for apagada
|
||||
_playerCountStreams.remove(id);
|
||||
} catch (e) {
|
||||
print("❌ Erro ao eliminar: $e");
|
||||
}
|
||||
}
|
||||
|
||||
// 4. FAVORITAR
|
||||
// FAVORITAR
|
||||
Future<void> toggleFavorite(String teamId, bool currentStatus) async {
|
||||
try {
|
||||
await _supabase
|
||||
.from('teams')
|
||||
.update({'is_favorite': !currentStatus}) // Inverte o valor
|
||||
.update({'is_favorite': !currentStatus})
|
||||
.eq('id', teamId);
|
||||
} catch (e) {
|
||||
print("❌ Erro ao favoritar: $e");
|
||||
}
|
||||
}
|
||||
|
||||
// 5. CONTAR JOGADORES (AGORA EM TEMPO REAL COM STREAM!)
|
||||
// CONTAR JOGADORES (AGORA COM CACHE DE MEMÓRIA!)
|
||||
Stream<int> getPlayerCountStream(String teamId) {
|
||||
return _supabase
|
||||
// Se já criámos um "Tubo de ligação" para esta equipa, REUTILIZA-O!
|
||||
if (_playerCountStreams.containsKey(teamId)) {
|
||||
return _playerCountStreams[teamId]!;
|
||||
}
|
||||
|
||||
// Se é a primeira vez que pede esta equipa, cria a ligação e guarda na memória
|
||||
final newStream = _supabase
|
||||
.from('members')
|
||||
.stream(primaryKey: ['id'])
|
||||
.eq('team_id', teamId)
|
||||
.map((data) => data.length); // O tamanho da lista é o número de jogadores
|
||||
.map((data) => data.length);
|
||||
|
||||
_playerCountStreams[teamId] = newStream; // Guarda no dicionário
|
||||
return newStream;
|
||||
}
|
||||
|
||||
void dispose() {}
|
||||
// LIMPEZA FINAL QUANDO SAÍMOS DA PÁGINA
|
||||
void dispose() {
|
||||
// Limpamos o dicionário de streams para libertar memória RAM
|
||||
_playerCountStreams.clear();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user