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((ref) { return ClubService(); }); /// Stream of the active user's active Club memberships. /// Gated to registered, non-anonymous users. final myClubsProvider = StreamProvider>((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>((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((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((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, 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, 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((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>((ref) { final service = ref.watch(clubServiceProvider); return service.discoverPublicClubs(limit: 25); });