86 lines
3.3 KiB
Dart
86 lines
3.3 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);
|
|
const definedUrl = String.fromEnvironment('MOTORSIGNAL_API_BASE_URL');
|
|
final baseUrl = definedUrl.isNotEmpty ? definedUrl : null;
|
|
return service.fetchClubDiscoveryRides(clubId, baseUrl: baseUrl);
|
|
});
|