Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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));
        }
Example #4
0
        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);
        }