async Task <Ridesharing.StateBase> TryComputeRideOfferState(string userId, RideRelatedRequestStatus offerStatus) { string requestId = offerStatus.Id; string rideId = offerStatus.PendingRideId; if (string.IsNullOrEmpty(rideId)) { var requestNotifications = new PendingRideRelatedRequest(userId, requestId); // FIXME Retrieve old RideOffer corresponding to requestId return(new OfferPendingState(this, requestNotifications, null)); } PendingRideStatus status = await App.Current.DataStore.GetPendingRideStatus(rideId); if (status != null) { switch (status.State) { case PendingRideStatus.PendingRideState.Confirmed: if (status.ActiveRideId == null) { break; } ActiveRideStatus activeRide = await App.Current.DataStore.GetActiveRideStatus(status.ActiveRideId); if (activeRide == null) { break; } if (activeRide.RideState == ActiveRideStatus.State.InProgress) { return(new RideInProgressState(this, activeRide)); } break; case PendingRideStatus.PendingRideState.WaitingOnDriver: return(new OfferMatchedState(this, new MatchedRideRelatedRequest(userId, requestId, rideId))); case PendingRideStatus.PendingRideState.WaitingOnRiders: return(new WaitingForConfirmedState(this, new MatchedRideRelatedRequest(userId, requestId, rideId))); case PendingRideStatus.PendingRideState.Canceled: break; } } return(null); }
async Task <RideRelatedRequestStatus> GetUnexpiredRequest(bool isRideRequest, string userId) { var pendingRequestIds = isRideRequest ? await DataService.Instance.GetPendingRideRequestIds(userId) : await DataService.Instance.GetPendingRideOfferIds(userId); foreach (string requestId in pendingRequestIds) { RideRelatedRequestStatus status = await App.Current .DataStore.GetRideRelatedRequestStatus(userId, requestId); if (status != null && !status.IsExpired) { return(status); } } return(null); }
async Task <Ridesharing.StateBase> GetCurrentState() { string userId = App.Current.UserInfo.UserId; // Check if the user is currently in a ride. ActiveRideStatus activeRideStatus = await GetRideInProgress(userId); if (activeRideStatus != null) { return(new RideInProgressState(this, activeRideStatus)); } // Check if user has a ride request. RideRelatedRequestStatus requestStatus = await GetUnexpiredRequest(true, userId); if (requestStatus != null) { var result = await TryComputeRideRequestState(userId, requestStatus); if (result != null) { return(result); } } // Check if user has a ride offer. RideRelatedRequestStatus offerStatus = await GetUnexpiredRequest(false, userId); if (offerStatus != null) { var result = await TryComputeRideOfferState(userId, offerStatus); if (result != null) { return(result); } } return(new NoneState(this)); }
public async Task PostRideRelatedRequestStatus(string userId, string requestId, RideRelatedRequestStatus status) { if (DataStore == null) { return; } string data = JsonConvert.SerializeObject(status); await DataStore.PostStringResource(RideRelatedRequestStatusName(userId, requestId), data); }