Skip to content

Instantly share code, notes, and snippets.

@rdelrosario
Created January 12, 2022 20:46
Show Gist options
  • Save rdelrosario/87b0c884f37a7a59ead1a6d1459bef5c to your computer and use it in GitHub Desktop.
Save rdelrosario/87b0c884f37a7a59ead1a6d1459bef5c to your computer and use it in GitHub Desktop.
namespace UberClone.ViewModels
{
public class MapPageViewModel : INotifyPropertyChanged
{
...
public MapPageViewModel()
{
var _stateMachine = new StateMachine<XUberState, XUberTrigger>(XUberState.Initial);
CalculateRouteTrigger = _stateMachine.SetTriggerParameters<GooglePlaceAutoCompletePrediction>(XUberTrigger.CalculateRoute);
_stateMachine.Configure(XUberState.Initial)
.OnEntry(Initialize)
.OnExit(() => { Places = new ObservableCollection<GooglePlaceAutoCompletePrediction>(RecentPlaces); })
.OnActivateAsync(GetActualUserLocation)
.Permit(XUberTrigger.ChooseDestination, XUberState.SearchingDestination)
.Permit(XUberTrigger.CalculateRoute, XUberState.CalculatingRoute);
_stateMachine
.Configure(XUberState.SearchingOrigin)
.Permit(XUberTrigger.Cancel, XUberState.Initial)
.Permit(XUberTrigger.ChooseDestination, XUberState.SearchingDestination);
_stateMachine
.Configure(XUberState.SearchingDestination)
.Permit(XUberTrigger.Cancel, XUberState.Initial)
.Permit(XUberTrigger.ChooseOrigin, XUberState.SearchingOrigin)
.PermitIf(XUberTrigger.CalculateRoute, XUberState.CalculatingRoute, () => OriginCoordinates != null);
_stateMachine
.Configure(XUberState.CalculatingRoute)
.OnEntryFromAsync(CalculateRouteTrigger, GetPlacesDetail)
.Permit(XUberTrigger.ChooseRide, XUberState.ChoosingRide)
.Permit(XUberTrigger.Cancel, XUberState.Initial);
_stateMachine
.Configure(XUberState.ChoosingRide)
.Permit(XUberTrigger.Cancel, XUberState.Initial)
.Permit(XUberTrigger.ChooseDestination, XUberState.SearchingDestination)
.Permit(XUberTrigger.ConfirmPickUp, XUberState.ConfirmingPickUp);
_stateMachine
.Configure(XUberState.ConfirmingPickUp)
.Permit(XUberTrigger.ChooseRide, XUberState.ChoosingRide)
.Permit(XUberTrigger.ShowXUberPass, XUberState.ShowingXUberPass);
_stateMachine
.Configure(XUberState.ShowingXUberPass)
.Permit(XUberTrigger.ConfirmPickUp, XUberState.ConfirmingPickUp)
.Permit(XUberTrigger.WaitForDriver, XUberState.WaitingForDriver);
_stateMachine
.Configure(XUberState.WaitingForDriver)
.Permit(XUberTrigger.CancelTrip, XUberState.Initial)
.Permit(XUberTrigger.StartTrip, XUberState.TripInProgress);
State = _stateMachine.State;
_stateMachine.ActivateAsync();
}
private void Initialize()
{
CleanPolylineCommand.Execute(null);
DestinationLocation = string.Empty;
}
private async Task GetActualUserLocation()
{
try
{
await Task.Yield();
var request = new GeolocationRequest(GeolocationAccuracy.High,TimeSpan.FromSeconds(5000));
var location = await Geolocation.GetLocationAsync(request);
if (location != null)
{
OriginCoordinates = location;
CenterMapCommand.Execute(location);
GetLocationNameCommand.Execute(new Position(location.Latitude, location.Longitude));
}
}
catch (Exception)
{
await UserDialogs.Instance.AlertAsync("Error", "Unable to get actual location", "Ok");
}
}
...
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment