78 lines
2.6 KiB
Dart
78 lines
2.6 KiB
Dart
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<GroupRideService>((ref) {
|
|
return GroupRideService();
|
|
});
|
|
|
|
/// Stream of a specific Group Ride by ID.
|
|
final groupRideStreamProvider =
|
|
StreamProvider.family<GroupRide?, String>((ref, rideId) {
|
|
final service = ref.watch(groupRideServiceProvider);
|
|
return service.groupRideStream(rideId);
|
|
});
|
|
|
|
/// Stream of participants for a specific Group Ride.
|
|
final groupRideParticipantsProvider =
|
|
StreamProvider.family<List<GroupRideParticipant>, String>((ref, rideId) {
|
|
final service = ref.watch(groupRideServiceProvider);
|
|
return service.participantsStream(rideId);
|
|
});
|
|
|
|
/// Stream of upcoming Group Rides for the current user.
|
|
final upcomingGroupRidesProvider = StreamProvider<List<GroupRide>>((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<List<LiveGroupPresence>, 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<bool>((ref) {
|
|
return false;
|
|
});
|
|
|
|
/// Active Group Ride ID currently being broadcasted to by the local rider, if any.
|
|
final activeLiveRideSharingIdProvider = StateProvider<String?>((ref) {
|
|
return null;
|
|
});
|
|
|
|
/// Provider that returns the first active group ride for the current user (assembling or underway).
|
|
final activeUserGroupRideProvider = Provider<GroupRide?>((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,
|
|
);
|
|
});
|
|
|