MotorSignal-App/lib/services/group_rides/group_ride_providers.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,
);
});