MotorSignal-App/lib/services/clubs/club_providers.dart

84 lines
3.1 KiB
Dart

import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../auth/auth_providers.dart';
import 'club_models.dart';
import 'club_service.dart';
/// Provider for ClubService.
final clubServiceProvider = Provider<ClubService>((ref) {
return ClubService();
});
/// Stream of the active user's active Club memberships.
/// Gated to registered, non-anonymous users.
final myClubsProvider = StreamProvider<List<ClubMember>>((ref) {
final user = ref.watch(currentUserProvider);
if (user == null || user.isAnonymous) {
return Stream.value(const []);
}
final service = ref.watch(clubServiceProvider);
return service.myActiveClubsStream(user.uid);
});
/// Stream of incoming club invitations for the active user.
/// Gated to registered, non-anonymous users.
final myClubInvitesProvider = StreamProvider<List<ClubMember>>((ref) {
final user = ref.watch(currentUserProvider);
if (user == null || user.isAnonymous) {
return Stream.value(const []);
}
final service = ref.watch(clubServiceProvider);
return service.myInvitationsStream(user.uid);
});
/// Realtime stream of a specific Club's root document.
final clubDetailProvider = StreamProvider.family<Club?, String>((ref, clubId) {
final service = ref.watch(clubServiceProvider);
return service.clubStream(clubId);
});
/// Realtime stream of the active caller's membership document within a specific Club.
final currentMemberProvider = StreamProvider.family<ClubMember?, String>((ref, clubId) {
final user = ref.watch(currentUserProvider);
if (user == null || user.isAnonymous) {
return Stream.value(null);
}
final service = ref.watch(clubServiceProvider);
return service.memberStream(clubId, user.uid);
});
/// Realtime stream of active members for a specific Club (paginated limit 50).
final clubMembersProvider = StreamProvider.family<List<ClubMember>, String>((ref, clubId) {
final service = ref.watch(clubServiceProvider);
return service.activeMembersStream(clubId);
});
/// Realtime stream of pending join requests for a specific Club (leadership only).
final pendingClubRequestsProvider = StreamProvider.family<List<ClubMember>, String>((ref, clubId) {
final service = ref.watch(clubServiceProvider);
return service.pendingRequestsStream(clubId);
});
/// FutureProvider resolving a Club by its unique slug handle.
/// Gated to registered, non-anonymous riders.
final clubBySlugProvider = FutureProvider.family<Club?, String>((ref, slug) async {
final user = ref.watch(currentUserProvider);
if (user == null || user.isAnonymous) {
return null;
}
final service = ref.watch(clubServiceProvider);
return service.getClubBySlug(slug);
});
/// FutureProvider for public club discovery (initial limit 25).
final publicClubsProvider = FutureProvider<List<Club>>((ref) {
final service = ref.watch(clubServiceProvider);
return service.discoverPublicClubs(limit: 25);
});
/// FutureProvider fetching discoverable upcoming Club GroupRides through the authenticated API.
final clubDiscoveryRidesProvider =
FutureProvider.family<List<ClubRideDiscovery>, String>((ref, clubId) async {
final service = ref.watch(clubServiceProvider);
return service.fetchClubDiscoveryRides(clubId);
});