Implementation of Bookings Page and its View Model
This commit is contained in:
parent
8d3ffa99b2
commit
54f6600e69
162
GMCabsDriverAssistantSolution/ViewModels/BookingsViewModel.cs
Normal file
162
GMCabsDriverAssistantSolution/ViewModels/BookingsViewModel.cs
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
using GMCabsDriverAssistant.Models;
|
||||||
|
using GMCabsDriverAssistant.Services;
|
||||||
|
using GMCabsDriverAssistant.Utils;
|
||||||
|
using GMCabsDriverAssistantSolution.Models.Rydo;
|
||||||
|
using GMCabsDriverAssistantSolution.Views;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace GMCabsDriverAssistantSolution.ViewModels
|
||||||
|
{
|
||||||
|
class BookingsViewModel : BaseViewModel
|
||||||
|
{
|
||||||
|
#region Fields
|
||||||
|
private string startSuburb;
|
||||||
|
|
||||||
|
private string endSuburb;
|
||||||
|
|
||||||
|
private float distance;
|
||||||
|
private string formattedDistance;
|
||||||
|
|
||||||
|
private bool isFutureBooking;
|
||||||
|
|
||||||
|
private BookingDto selectedBooking;
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Properties
|
||||||
|
|
||||||
|
public string StartSuburb
|
||||||
|
{
|
||||||
|
get => startSuburb;
|
||||||
|
set => SetProperty(ref startSuburb, value);
|
||||||
|
}
|
||||||
|
public string EndSuburb
|
||||||
|
{
|
||||||
|
get => endSuburb;
|
||||||
|
set => SetProperty(ref endSuburb, value);
|
||||||
|
}
|
||||||
|
public float Distance
|
||||||
|
{
|
||||||
|
get => distance;
|
||||||
|
set => SetProperty(ref distance, value);
|
||||||
|
}
|
||||||
|
public string FormattedDistance
|
||||||
|
{
|
||||||
|
get => (distance >= 1000) ? $"{distance / 1000:0.##}k" : $"{(int)distance}m";
|
||||||
|
set => SetProperty(ref formattedDistance, value);
|
||||||
|
}
|
||||||
|
public bool IsFutureBooking
|
||||||
|
{
|
||||||
|
get => isFutureBooking;
|
||||||
|
set => SetProperty(ref isFutureBooking, value);
|
||||||
|
}
|
||||||
|
public BookingDto SelectedBooking
|
||||||
|
{
|
||||||
|
get => selectedBooking;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
SetProperty(ref selectedBooking, value);
|
||||||
|
OnBookingSelected(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public Command OnRefreshClicked { get; }
|
||||||
|
public ObservableCollection<BookingDto> Bookings { get; }
|
||||||
|
public Command<BookingDto> BookingTapped { get; }
|
||||||
|
public double CurrentLat { get; set; }
|
||||||
|
public double CurrentLng { get; set; }
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Constructor
|
||||||
|
public BookingsViewModel()
|
||||||
|
{
|
||||||
|
Title = "Available Bookings";
|
||||||
|
Bookings = new ObservableCollection<BookingDto>();
|
||||||
|
OnRefreshClicked = new Command(async () => { await GetBookings(); });
|
||||||
|
BookingTapped = new Command<BookingDto>(OnBookingSelected);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Methods
|
||||||
|
public void OnAppearing()
|
||||||
|
{
|
||||||
|
//IsBusy = true;
|
||||||
|
SelectedBooking = null;
|
||||||
|
Task.Run(async () =>
|
||||||
|
{
|
||||||
|
await GetBookings();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task GetBookings()
|
||||||
|
{
|
||||||
|
List<string> seenBookingList = new List<string>();
|
||||||
|
var seenBooking = Preferences.Get(SecureStorageData.UnSeenBooking, "");
|
||||||
|
if (!String.IsNullOrEmpty(seenBooking))
|
||||||
|
{
|
||||||
|
var arrList = seenBooking.Split(',');
|
||||||
|
if (arrList != null)
|
||||||
|
{
|
||||||
|
foreach (var item in arrList)
|
||||||
|
{
|
||||||
|
seenBookingList.Add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
string rydoAccessToken = Preferences.Get(EftposLoginResponse.RYDO_ACCESS_TOKEN, "");
|
||||||
|
Guid driverId = Guid.Parse(Preferences.Get(LoginResponseDto.USER_CODE, ""));
|
||||||
|
GMCabsDriverService gmCabsDriverService = new GMCabsDriverService();
|
||||||
|
Bookings.Clear();
|
||||||
|
var bookings = await gmCabsDriverService.GetBookings(rydoAccessToken, driverId, CurrentLat, CurrentLng);
|
||||||
|
if (bookings.Count > 0)
|
||||||
|
{
|
||||||
|
foreach (BookingDto booking in bookings)
|
||||||
|
{
|
||||||
|
if (seenBookingList.Count > 0 && seenBookingList.Contains(booking.BookingId.ToString()))
|
||||||
|
{
|
||||||
|
booking.IsSeenBooking = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
booking.IsSeenBooking = true;
|
||||||
|
}
|
||||||
|
Bookings.Add(booking);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Preferences.Set(SecureStorageData.UnSeenBooking, "");
|
||||||
|
await Shell.Current.GoToAsync("..");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
async void OnBookingSelected(BookingDto booking)
|
||||||
|
{
|
||||||
|
if (booking == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// This will push the ItemDetailPage onto the navigation stack
|
||||||
|
|
||||||
|
var seenBooking = Preferences.Get(SecureStorageData.UnSeenBooking, "");
|
||||||
|
if (String.IsNullOrEmpty(seenBooking))
|
||||||
|
{
|
||||||
|
seenBooking = booking.BookingId.ToString();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
seenBooking = seenBooking + "," + booking.BookingId.ToString();
|
||||||
|
}
|
||||||
|
Preferences.Set(SecureStorageData.UnSeenBooking, seenBooking);
|
||||||
|
// await Shell.Current.GoToAsync($"{nameof(BookingDetailsPage)}?{nameof(BookingDetailViewModel.BookingId)}={booking.BookingId:N}");
|
||||||
|
string bookingJson = JsonSerializer.Serialize(booking);
|
||||||
|
await Shell.Current.GoToAsync($"{nameof(BookingDetailsPage)}?{nameof(BookingDetailViewModel.BookingJson)}={bookingJson}");
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
139
GMCabsDriverAssistantSolution/Views/BookingsPage.xaml
Normal file
139
GMCabsDriverAssistantSolution/Views/BookingsPage.xaml
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
|
||||||
|
x:Class="GMCabsDriverAssistantSolution.Views.BookingsPage"
|
||||||
|
xmlns:cmp="clr-namespace:Microsoft.Maui.Controls.Compatibility;assembly=Microsoft.Maui.Controls"
|
||||||
|
xmlns:vm="clr-namespace:GMCabsDriverAssistantSolution.ViewModels" x:DataType="vm:BookingsViewModel"
|
||||||
|
xmlns:models="clr-namespace:GMCabsDriverAssistant.Models"
|
||||||
|
Title="{Binding Title}">
|
||||||
|
<ContentPage.Resources>
|
||||||
|
<ResourceDictionary>
|
||||||
|
<Color x:Key="Accent">#96d1ff</Color>
|
||||||
|
</ResourceDictionary>
|
||||||
|
</ContentPage.Resources>
|
||||||
|
<ContentPage.Content>
|
||||||
|
<StackLayout Orientation="Vertical"
|
||||||
|
BackgroundColor="#DCDCDC"
|
||||||
|
x:DataType="vm:BookingsViewModel">
|
||||||
|
<Frame Margin="10,40,10,10"
|
||||||
|
CornerRadius="10"
|
||||||
|
BackgroundColor="#E8E8E8">
|
||||||
|
<CollectionView ItemsSource="{Binding Bookings}">
|
||||||
|
<CollectionView.ItemsLayout>
|
||||||
|
<LinearItemsLayout
|
||||||
|
Orientation="Vertical"
|
||||||
|
ItemSpacing="10"
|
||||||
|
/>
|
||||||
|
</CollectionView.ItemsLayout>
|
||||||
|
<CollectionView.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<cmp:RelativeLayout>
|
||||||
|
<Frame x:DataType="models:BookingDto"
|
||||||
|
CornerRadius="10"
|
||||||
|
BackgroundColor="{StaticResource Primary}"
|
||||||
|
Margin="0, 30, 0, 0"
|
||||||
|
Padding="8">
|
||||||
|
<StackLayout Orientation="Vertical" Margin="0,10,0,0">
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
<ColumnDefinition Width="1*"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Label Grid.Row="0"
|
||||||
|
Grid.Column="0"
|
||||||
|
Text="{Binding StartSuburb}"
|
||||||
|
TextColor="White"
|
||||||
|
FontFamily="Bold"
|
||||||
|
HorizontalOptions="StartAndExpand"
|
||||||
|
FontSize="17"/>
|
||||||
|
|
||||||
|
<Label
|
||||||
|
Grid.Row="0"
|
||||||
|
Grid.Column="1"
|
||||||
|
VerticalTextAlignment="Center"
|
||||||
|
HorizontalOptions="EndAndExpand"
|
||||||
|
FontSize="17"
|
||||||
|
TextColor="White">
|
||||||
|
<Label.Triggers>
|
||||||
|
<DataTrigger TargetType="Label" Binding="{Binding FutureBooking}" Value="True">
|
||||||
|
<Setter Property="Text" Value="{Binding FormattedPickUpTimeDateOnly}"/>
|
||||||
|
</DataTrigger>
|
||||||
|
<DataTrigger TargetType="Label" Binding="{Binding FutureBooking}" Value="False">
|
||||||
|
<Setter Property="Text" Value="{Binding FormattedDistance}" />
|
||||||
|
</DataTrigger>
|
||||||
|
</Label.Triggers>
|
||||||
|
</Label>
|
||||||
|
|
||||||
|
<Label Grid.Row="1"
|
||||||
|
Grid.Column="0"
|
||||||
|
Text="{Binding EndSuburb}"
|
||||||
|
TextColor="White"
|
||||||
|
FontFamily="Bold"
|
||||||
|
HorizontalOptions="StartAndExpand"
|
||||||
|
FontSize="17"/>
|
||||||
|
<Label
|
||||||
|
Grid.Row="1"
|
||||||
|
Grid.Column="1"
|
||||||
|
VerticalTextAlignment="Center"
|
||||||
|
HorizontalOptions="EndAndExpand"
|
||||||
|
FontSize="17"
|
||||||
|
TextColor="White">
|
||||||
|
<Label.Triggers>
|
||||||
|
<DataTrigger TargetType="Label" Binding="{Binding FutureBooking}" Value="True">
|
||||||
|
<Setter Property="Text" Value="{Binding FormattedPickUpTimeTimeOnly}" />
|
||||||
|
</DataTrigger>
|
||||||
|
<DataTrigger TargetType="Label" Binding="{Binding FutureBooking}" Value="False">
|
||||||
|
<Setter Property="Text" Value="ASAP" />
|
||||||
|
</DataTrigger>
|
||||||
|
</Label.Triggers>
|
||||||
|
</Label>
|
||||||
|
</Grid>
|
||||||
|
</StackLayout>
|
||||||
|
<Frame.GestureRecognizers>
|
||||||
|
<TapGestureRecognizer
|
||||||
|
NumberOfTapsRequired="1"
|
||||||
|
Command="{Binding Source={RelativeSource AncestorType={x:Type vm:BookingsViewModel}}, Path=BookingTapped}"
|
||||||
|
CommandParameter="{Binding .}">
|
||||||
|
</TapGestureRecognizer>
|
||||||
|
<!--<TapGestureRecognizer Tapped="OnBookingViewClicked"/>-->
|
||||||
|
</Frame.GestureRecognizers>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
<Frame x:DataType="models:BookingDto"
|
||||||
|
IsVisible="{Binding IsSeenBooking}"
|
||||||
|
CornerRadius="10"
|
||||||
|
BackgroundColor="#B40431"
|
||||||
|
Padding="8,4"
|
||||||
|
Margin="9 ,16"
|
||||||
|
cmp:RelativeLayout.XConstraint=
|
||||||
|
"{cmp:ConstraintExpression
|
||||||
|
Type=RelativeToParent,
|
||||||
|
Property=Width,
|
||||||
|
Factor=1,
|
||||||
|
Constant=-75
|
||||||
|
}">
|
||||||
|
<Label Grid.Row="0"
|
||||||
|
Grid.Column="0"
|
||||||
|
Text="NEW"
|
||||||
|
TextColor="White"
|
||||||
|
FontFamily="Bold"
|
||||||
|
HorizontalOptions="StartAndExpand"
|
||||||
|
FontSize="16"/>
|
||||||
|
</Frame>
|
||||||
|
|
||||||
|
</cmp:RelativeLayout>
|
||||||
|
|
||||||
|
</DataTemplate>
|
||||||
|
</CollectionView.ItemTemplate>
|
||||||
|
</CollectionView>
|
||||||
|
</Frame>
|
||||||
|
<Button VerticalOptions="EndAndExpand"
|
||||||
|
Margin="40,0,40,15"
|
||||||
|
Text="REFRESH"
|
||||||
|
FontSize="20"
|
||||||
|
Visual="Default"
|
||||||
|
TextColor="White"
|
||||||
|
Command="{Binding OnRefreshClicked}"/>
|
||||||
|
</StackLayout>
|
||||||
|
</ContentPage.Content>
|
||||||
|
</ContentPage>
|
42
GMCabsDriverAssistantSolution/Views/BookingsPage.xaml.cs
Normal file
42
GMCabsDriverAssistantSolution/Views/BookingsPage.xaml.cs
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
using GMCabsDriverAssistantSolution.ViewModels;
|
||||||
|
|
||||||
|
namespace GMCabsDriverAssistantSolution.Views;
|
||||||
|
|
||||||
|
public partial class BookingsPage : ContentPage
|
||||||
|
{
|
||||||
|
#region Fields
|
||||||
|
private readonly BookingsViewModel _viewModel;
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Properties
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Constructor
|
||||||
|
public BookingsPage(double? lat, double? lng)
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
BindingContext = _viewModel = new BookingsViewModel();
|
||||||
|
if (lat == null)
|
||||||
|
{
|
||||||
|
var currentLocation = Geolocation.GetLastKnownLocationAsync();
|
||||||
|
lat = currentLocation.Result.Latitude;
|
||||||
|
lng = currentLocation.Result.Longitude;
|
||||||
|
}
|
||||||
|
_viewModel.CurrentLat = lat.Value;
|
||||||
|
_viewModel.CurrentLng = lng.Value;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Methods
|
||||||
|
protected override void OnAppearing()
|
||||||
|
{
|
||||||
|
base.OnAppearing();
|
||||||
|
_viewModel.OnAppearing();
|
||||||
|
}
|
||||||
|
private async void OnBookingViewClicked(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
await Navigation.PushAsync(new BookingDetailsPage(), true);
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user