82 lines
2.4 KiB
Dart
82 lines
2.4 KiB
Dart
import 'package:supabase_flutter/supabase_flutter.dart';
|
|
|
|
class TeamController {
|
|
final _supabase = Supabase.instance.client;
|
|
|
|
// 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));
|
|
}
|
|
|
|
// CRIAR
|
|
Future<void> createTeam(String name, String season, String? imageUrl) async {
|
|
try {
|
|
await _supabase.from('teams').insert({
|
|
'name': name,
|
|
'season': season,
|
|
'image_url': imageUrl,
|
|
'is_favorite': false,
|
|
});
|
|
print("✅ Equipa guardada no Supabase!");
|
|
} catch (e) {
|
|
print("❌ Erro ao criar: $e");
|
|
}
|
|
}
|
|
|
|
// 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");
|
|
}
|
|
}
|
|
|
|
// FAVORITAR
|
|
Future<void> toggleFavorite(String teamId, bool currentStatus) async {
|
|
try {
|
|
await _supabase
|
|
.from('teams')
|
|
.update({'is_favorite': !currentStatus})
|
|
.eq('id', teamId);
|
|
} catch (e) {
|
|
print("❌ Erro ao favoritar: $e");
|
|
}
|
|
}
|
|
|
|
// CONTAR JOGADORES (AGORA COM CACHE DE MEMÓRIA!)
|
|
Stream<int> getPlayerCountStream(String teamId) {
|
|
// 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);
|
|
|
|
_playerCountStreams[teamId] = newStream; // Guarda no dicionário
|
|
return newStream;
|
|
}
|
|
|
|
// LIMPEZA FINAL QUANDO SAÍMOS DA PÁGINA
|
|
void dispose() {
|
|
// Limpamos o dicionário de streams para libertar memória RAM
|
|
_playerCountStreams.clear();
|
|
}
|
|
} |