import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../auth/auth_providers.dart'; import 'group_ride_models.dart'; import 'group_ride_service.dart'; /// Provider for GroupRideService. final groupRideServiceProvider = Provider((ref) { return GroupRideService(); }); /// Stream of a specific Group Ride by ID. final groupRideStreamProvider = StreamProvider.family((ref, rideId) { final service = ref.watch(groupRideServiceProvider); return service.groupRideStream(rideId); }); /// Stream of participants for a specific Group Ride. final groupRideParticipantsProvider = StreamProvider.family, String>((ref, rideId) { final service = ref.watch(groupRideServiceProvider); return service.participantsStream(rideId); }); /// Stream of upcoming Group Rides for the current user. final upcomingGroupRidesProvider = StreamProvider>((ref) { final user = ref.watch(currentUserProvider); if (user == null || user.isAnonymous) { return Stream.value([]); } final service = ref.watch(groupRideServiceProvider); return service.upcomingRidesStream(callerUid: user.uid); }); /// Stream of live presence records for all participants in a specific Group Ride. final groupRideLivePresenceProvider = StreamProvider.family, String>((ref, rideId) { final service = ref.watch(groupRideServiceProvider); return service.livePresenceStream(rideId); }); /// Master privacy setting: whether group ride live location sharing is permitted by user. /// Defaults to false (explicit opt-in required). final groupRideLiveSharingAllowedProvider = StateProvider((ref) { return false; }); /// Active Group Ride ID currently being broadcasted to by the local rider, if any. final activeLiveRideSharingIdProvider = StateProvider((ref) { return null; }); /// Provider that returns the first active group ride for the current user (assembling or underway). final activeUserGroupRideProvider = Provider((ref) { final upcomingAsync = ref.watch(upcomingGroupRidesProvider); final activeSharingId = ref.watch(activeLiveRideSharingIdProvider); return upcomingAsync.when( data: (rides) { if (activeSharingId != null) { try { return rides.firstWhere((r) => r.id == activeSharingId); } catch (_) {} } try { return rides.firstWhere((r) => r.status == GroupRideStatus.underway || r.status == GroupRideStatus.assembling); } catch (_) { return null; } }, loading: () => null, error: (_, _) => null, ); });