@ -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 | |||||
} | |||||
} |
@ -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> |
@ -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 | |||||
} |