Passenger Collected page implemented
This commit is contained in:
parent
0dae5b1782
commit
3c537263fc
382
GMCabsDriverAssistantSolution/ViewModels/StartRideViewModel.cs
Normal file
382
GMCabsDriverAssistantSolution/ViewModels/StartRideViewModel.cs
Normal file
@ -0,0 +1,382 @@
|
||||
using GMCabsDriverAssistant.Models;
|
||||
using GMCabsDriverAssistant.Models.Rydo;
|
||||
using GMCabsDriverAssistant.Services;
|
||||
using GMCabsDriverAssistantSolution.Models.Rydo;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Text.Json;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace GMCabsDriverAssistantSolution.ViewModels
|
||||
{
|
||||
[QueryProperty(nameof(RideRequestJson), nameof(RideRequestJson))]
|
||||
public class StartRideViewModel : BaseViewModel
|
||||
{
|
||||
#region Fields
|
||||
private string rideRequestJson;
|
||||
private string passengerName;
|
||||
private bool isCorporate;
|
||||
private string fullDestinationAddress;
|
||||
private StartRideResponse startRideResponse;
|
||||
private int frameWidth;
|
||||
private bool stopOver = false;
|
||||
private bool noStopOver = false;
|
||||
private int index = 0;
|
||||
private double destinationCircleColorOpecity = 0.2;
|
||||
private string destinationStopLabelColorCode = "#BECEDA";
|
||||
private bool isStopOver = false;
|
||||
private bool isNoStopOver = false;
|
||||
StartRideRequestDto startRideRequestDto;
|
||||
Page _page;
|
||||
public string meterRunningStatus;
|
||||
private string locationSuburbName;
|
||||
private string startSuburb;
|
||||
private string pickUpDateTime;
|
||||
private string timerSeconds;
|
||||
public int seconds = 0;
|
||||
private bool visibleTrip;
|
||||
private bool isEndTripButtonVisible = true;
|
||||
private string startTimeOrEndLocation;
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
public List<StopoverLocations> StopoverLocations { get; }
|
||||
public ObservableCollection<StopoverLocations> StopoverLocationsList { get; }
|
||||
public Command OnPassengerCollectedClick { get; }
|
||||
public string RideRequestJson
|
||||
{
|
||||
get => rideRequestJson;
|
||||
set
|
||||
{
|
||||
rideRequestJson = value;
|
||||
ProcessRiding(value);
|
||||
}
|
||||
}
|
||||
public string PassengerName
|
||||
{
|
||||
get => passengerName;
|
||||
set => SetProperty(ref passengerName, value);
|
||||
}
|
||||
public bool IsCorporate
|
||||
{
|
||||
get => isCorporate;
|
||||
set => SetProperty(ref isCorporate, value);
|
||||
}
|
||||
public string FullDestinationAddress
|
||||
{
|
||||
get => fullDestinationAddress;
|
||||
set => SetProperty(ref fullDestinationAddress, value);
|
||||
}
|
||||
public bool StopOver
|
||||
{
|
||||
get => stopOver;
|
||||
set => SetProperty(ref stopOver, value);
|
||||
}
|
||||
public bool NoStopOver
|
||||
{
|
||||
get => noStopOver;
|
||||
set => SetProperty(ref noStopOver, value);
|
||||
}
|
||||
public bool IsStopOver
|
||||
{
|
||||
get => isStopOver;
|
||||
set => SetProperty(ref isStopOver, value);
|
||||
}
|
||||
public bool IsNoStopOver
|
||||
{
|
||||
get => isNoStopOver;
|
||||
set => SetProperty(ref isNoStopOver, value);
|
||||
}
|
||||
public int FrameWidth
|
||||
{
|
||||
get => frameWidth;
|
||||
set => SetProperty(ref frameWidth, value);
|
||||
}
|
||||
public double DestinationCircleColorOpecity
|
||||
{
|
||||
get => destinationCircleColorOpecity;
|
||||
set => SetProperty(ref destinationCircleColorOpecity, value);
|
||||
}
|
||||
public string DestinationStopLabelColorCode
|
||||
{
|
||||
get => destinationStopLabelColorCode;
|
||||
set => SetProperty(ref destinationStopLabelColorCode, value);
|
||||
}
|
||||
public string StartSuburb
|
||||
{
|
||||
get => startSuburb;
|
||||
set
|
||||
{
|
||||
SetProperty(ref startSuburb, value);
|
||||
}
|
||||
}
|
||||
public string PickUpDateTime
|
||||
{
|
||||
get => pickUpDateTime;
|
||||
set => SetProperty(ref pickUpDateTime, value);
|
||||
}
|
||||
public string TimerSeconds
|
||||
{
|
||||
get => timerSeconds;
|
||||
set => SetProperty(ref timerSeconds, value);
|
||||
}
|
||||
public bool VisibleTrip
|
||||
{
|
||||
get => visibleTrip;
|
||||
set => SetProperty(ref visibleTrip, value);
|
||||
}
|
||||
public bool IsEndTripButtonVisible
|
||||
{
|
||||
get => isEndTripButtonVisible;
|
||||
set => SetProperty(ref isEndTripButtonVisible, value);
|
||||
}
|
||||
public string StartTimeOrEndLocation
|
||||
{
|
||||
get => startTimeOrEndLocation;
|
||||
set => SetProperty(ref startTimeOrEndLocation, value);
|
||||
}
|
||||
public Command OnPassengerDroppedOffClick { get; }
|
||||
public Command onEndTripClick { get; }
|
||||
#endregion
|
||||
|
||||
#region Constructor
|
||||
public StartRideViewModel(Page page)
|
||||
{
|
||||
Title = "Passenger Collected";
|
||||
StopoverLocations = new List<StopoverLocations>();
|
||||
StopoverLocationsList = new ObservableCollection<StopoverLocations>();
|
||||
OnPassengerCollectedClick = new Command(PassengerCollected);
|
||||
startRideRequestDto = new StartRideRequestDto();
|
||||
OnPassengerDroppedOffClick = new Command(PassengerDroppedOff);
|
||||
_page = page;
|
||||
meterRunningStatus = Preferences.Get("MeterRunningStatus", "");
|
||||
StartTimeOrEndLocation = "Start Time";
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
private async void ProcessRiding(string rideRequestJson)
|
||||
{
|
||||
string rydoAccessToken = Preferences.Get(EftposLoginResponse.RYDO_ACCESS_TOKEN, "");
|
||||
GMCabsDriverService gmCabsDriverService = new GMCabsDriverService();
|
||||
startRideRequestDto = JsonSerializer.Deserialize<StartRideRequestDto>(rideRequestJson);
|
||||
StartRideRequest startRideRequest = startRideRequestDto.startRideRequest;
|
||||
if (startRideRequest.DriverId == "")
|
||||
{
|
||||
await Shell.Current.GoToAsync("..");
|
||||
}
|
||||
startRideResponse = new StartRideResponse();
|
||||
startRideResponse = await gmCabsDriverService.StartRiding(startRideRequest, rydoAccessToken, startRideRequestDto.BookingId.ToString());
|
||||
if (startRideResponse.StatusCode == (int)HttpStatusCode.OK)
|
||||
{
|
||||
PassengerName = startRideResponse.PassengerName;
|
||||
IsCorporate = startRideResponse.IsCorporate;
|
||||
startRideResponse.DriverId = startRideRequest.DriverId;
|
||||
startRideResponse.BookingId = startRideRequestDto.BookingId;
|
||||
if (IsCorporate)
|
||||
{
|
||||
FrameWidth = 310;
|
||||
}
|
||||
else
|
||||
{
|
||||
FrameWidth = 370;
|
||||
}
|
||||
startRideResponse.FrameWidth = FrameWidth;
|
||||
FullDestinationAddress = startRideResponse.EndAddress + " " + startRideResponse.EndSuburb;
|
||||
var locations = new List<StopoverLocations>();
|
||||
|
||||
//These below-mentioned commented out codes are witten for checking the lists of Stop Over Locations as a mock data
|
||||
//because of unable to fetch real stop over location data from the dev rydo booking page
|
||||
|
||||
//locations.Add(new StopoverLocations
|
||||
//{
|
||||
// Latitude = -32.63,
|
||||
// Longitude = 151.55,
|
||||
// Address = "1 Milson St",
|
||||
// Suburb = "Charlestown",
|
||||
// StopNumber = 1
|
||||
//});
|
||||
//locations.Add(new StopoverLocations
|
||||
//{
|
||||
// Latitude = -36.17,
|
||||
// Longitude = 144.66,
|
||||
// Address = "1/1 Milson St",
|
||||
// Suburb = "Charlestown",
|
||||
// StopNumber = 2
|
||||
//});
|
||||
//locations.Add(new StopoverLocations
|
||||
//{
|
||||
// Latitude = -36.17,
|
||||
// Longitude = 144.66,
|
||||
// Address = "1/1 Milson St",
|
||||
// Suburb = "Charlestown",
|
||||
// StopNumber = 3
|
||||
//});
|
||||
//locations.Add(new StopoverLocations
|
||||
//{
|
||||
// Latitude = -36.17,
|
||||
// Longitude = 144.66,
|
||||
// Address = "1/1 Milson St",
|
||||
// Suburb = "Charlestown",
|
||||
// StopNumber = 2
|
||||
//});
|
||||
//locations.Add(new StopoverLocations
|
||||
//{
|
||||
// Latitude = -36.17,
|
||||
// Longitude = 144.66,
|
||||
// Address = "1/1 Milson St",
|
||||
// Suburb = "Charlestown",
|
||||
// StopNumber = 2
|
||||
//});
|
||||
//locations.Add(new StopoverLocations
|
||||
//{
|
||||
// Latitude = -36.17,
|
||||
// Longitude = 144.66,
|
||||
// Address = "1/1 Milson St",
|
||||
// Suburb = "Charlestown",
|
||||
// StopNumber = 2
|
||||
//});
|
||||
locations.Add(new StopoverLocations
|
||||
{
|
||||
Latitude = startRideResponse.EndLatitude,
|
||||
Longitude = startRideResponse.EndLongitude,
|
||||
Address = startRideResponse.EndAddress,
|
||||
Suburb = startRideResponse.EndSuburb,
|
||||
StopNumber = startRideResponse.StopoverLocations.Count + 1
|
||||
});
|
||||
startRideResponse.StopoverLocations.AddRange(locations);
|
||||
if (startRideResponse.StopoverLocations.Count > 0)
|
||||
{
|
||||
StopOver = true;
|
||||
NoStopOver = false;
|
||||
IsStopOver = true;
|
||||
IsNoStopOver = false;
|
||||
StopoverLocations.Clear();
|
||||
foreach (var locationlists in startRideResponse.StopoverLocations)
|
||||
{
|
||||
StopoverLocations.Add(locationlists);
|
||||
}
|
||||
setPrimaryStopOverLocation(StopoverLocations);
|
||||
}
|
||||
else
|
||||
{
|
||||
StopOver = false;
|
||||
NoStopOver = true;
|
||||
IsStopOver = false;
|
||||
IsNoStopOver = true;
|
||||
}
|
||||
if (startRideResponse.FixedAmount != null)
|
||||
{
|
||||
decimal amount = Convert.ToDecimal(startRideResponse.FixedAmount) / 100.0m;
|
||||
amount = amount * 1.00m;
|
||||
startRideResponse.FixedAmount = amount;
|
||||
}
|
||||
}
|
||||
}
|
||||
private void setPrimaryStopOverLocation(List<StopoverLocations> stopoverLocations)
|
||||
{
|
||||
StopoverLocationsList.Clear();
|
||||
int stopOverLocationCount = 1;
|
||||
foreach (var location in stopoverLocations)
|
||||
{
|
||||
if (stopOverLocationCount == stopoverLocations.Count)
|
||||
{
|
||||
location.IsLineVisible = false;
|
||||
}
|
||||
location.LabelColor = "#BBB9B9";
|
||||
location.CircleColorOpecity = 0.2;
|
||||
StopoverLocationsList.Add(location);
|
||||
|
||||
if (stopoverLocations.Count == 1)
|
||||
{
|
||||
location.LabelColor = "Black";
|
||||
location.CircleColorOpecity = 0.5;
|
||||
IsStopOver = false;
|
||||
IsNoStopOver = true;
|
||||
}
|
||||
|
||||
stopOverLocationCount++;
|
||||
}
|
||||
}
|
||||
|
||||
private void setStopOverLocation(List<StopoverLocations> stopoverLocations)
|
||||
{
|
||||
StopoverLocationsList.Clear();
|
||||
int stopoverLocationIndex = 0;
|
||||
foreach (var location in stopoverLocations)
|
||||
{
|
||||
if (stopoverLocationIndex == stopoverLocations.Count - 1)
|
||||
{
|
||||
location.IsLineVisible = false;
|
||||
}
|
||||
|
||||
if (stopoverLocationIndex == index)
|
||||
{
|
||||
location.LabelColor = "Black";
|
||||
location.CircleColorOpecity = 0.5;
|
||||
}
|
||||
else
|
||||
{
|
||||
location.LabelColor = "#BBB9B9";
|
||||
location.CircleColorOpecity = 0.2;
|
||||
}
|
||||
StopoverLocationsList.Add(location);
|
||||
stopoverLocationIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
private async void PassengerCollected()
|
||||
{
|
||||
int stop_number = StopoverLocationsList[index].StopNumber;
|
||||
string booking_id = startRideRequestDto.BookingId.ToString();
|
||||
string rydoAccessToken = Preferences.Get(EftposLoginResponse.RYDO_ACCESS_TOKEN, "");
|
||||
GMCabsDriverService gmCabsDriverService = new GMCabsDriverService();
|
||||
await gmCabsDriverService.NotifyStop(stop_number, rydoAccessToken, booking_id);
|
||||
int StopoverLocationsListCount = StopoverLocationsList.Count;
|
||||
setStopOverLocation(StopoverLocations);
|
||||
if (index == StopoverLocationsListCount - 1)
|
||||
{
|
||||
DestinationStopLabelColorCode = "Black";
|
||||
DestinationCircleColorOpecity = 0.5;
|
||||
IsStopOver = false;
|
||||
IsNoStopOver = true;
|
||||
}
|
||||
index = index + 1;
|
||||
}
|
||||
|
||||
public async void PassengerDroppedOff()
|
||||
{
|
||||
//if (meterRunningStatus == "Stopped")
|
||||
//{
|
||||
//UpdateBookingStatus();
|
||||
//if (startRideResponse.PaymentMethodId == null && startRideResponse.FixedAmount == null)
|
||||
//{
|
||||
// await _page.Navigation.PushAsync(new PassengerDroppedWithNoPaymentMethodIdNoFixedFareTablet(startRideResponse));
|
||||
//}
|
||||
//else if (startRideResponse.PaymentMethodId == null && startRideResponse.FixedAmount != null)
|
||||
//{
|
||||
// await _page.Navigation.PushAsync(new PassengerDroppedWithNoPaymentMethodIdAndFixedFareTablet(startRideResponse));
|
||||
//}
|
||||
//else if (startRideResponse.PaymentMethodId != null && startRideResponse.FixedAmount != null)
|
||||
//{
|
||||
// await _page.Navigation.PushAsync(new PassengerDroppedWithPaymentMethodIdAndFixedFareTablet(startRideResponse));
|
||||
//}
|
||||
//else if (startRideResponse.PaymentMethodId != null && startRideResponse.FixedAmount == null)
|
||||
//{
|
||||
// await _page.Navigation.PushAsync(new PassengerDroppedWithPaymentMethodIdNoFixedFareTablet(startRideResponse));
|
||||
//}
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// _page.Navigation.ShowPopup(new MeterTripStatusDialogPage(this._page, startRideResponse));
|
||||
//}
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
130
GMCabsDriverAssistantSolution/Views/PassgerCollectedPage.xaml
Normal file
130
GMCabsDriverAssistantSolution/Views/PassgerCollectedPage.xaml
Normal file
@ -0,0 +1,130 @@
|
||||
<?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.PassgerCollectedPage"
|
||||
xmlns:d="http://schemas.microsoft.com/dotnet/2021/maui/design"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:viewmodels="clr-namespace:GMCabsDriverAssistantSolution.ViewModels"
|
||||
xmlns:models="clr-namespace:GMCabsDriverAssistant.Models"
|
||||
xmlns:UserControl="clr-namespace:GMCabsDriverAssistant.UserControl" x:DataType="viewmodels:StartRideViewModel"
|
||||
NavigationPage.HasBackButton="False"
|
||||
Title="{Binding Title}">
|
||||
<Shell.BackButtonBehavior>
|
||||
<BackButtonBehavior IsEnabled="false" IconOverride="ic_menu_blank.png" TextOverride="" />
|
||||
</Shell.BackButtonBehavior>
|
||||
<ContentPage.Content>
|
||||
<StackLayout Orientation="Horizontal"
|
||||
BackgroundColor="#DCDCDC">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<StackLayout Grid.Row="0"
|
||||
Grid.Column="0"
|
||||
BackgroundColor="#DCDCDC">
|
||||
<StackLayout>
|
||||
<RelativeLayout VerticalOptions="CenterAndExpand" Margin="30,30,10,10">
|
||||
<Frame BackgroundColor="#8B0000" WidthRequest="360" Margin="20,0,0,0" CornerRadius="10" IsVisible="{Binding IsCorporate}">
|
||||
<StackLayout HorizontalOptions="EndAndExpand">
|
||||
<Label FontSize="20" VerticalTextAlignment="End" TextColor="White" Text="VIP" />
|
||||
</StackLayout>
|
||||
</Frame>
|
||||
<Frame BackgroundColor="#E9E4D4" WidthRequest="{Binding FrameWidth}" IsVisible="True" CornerRadius="10">
|
||||
<StackLayout Orientation="Horizontal">
|
||||
<Image Source="passenger.png"
|
||||
HeightRequest="30"/>
|
||||
<Label FontSize="20" Text="{Binding PassengerName}" TextColor="Black" FontAttributes="Bold" />
|
||||
</StackLayout>
|
||||
</Frame>
|
||||
</RelativeLayout>
|
||||
|
||||
<Grid Margin="30,0,0,0" IsVisible="{Binding StopOver}">
|
||||
<CollectionView ItemsSource="{Binding StopoverLocationsList}">
|
||||
<CollectionView.ItemsLayout>
|
||||
<LinearItemsLayout
|
||||
Orientation="Vertical"
|
||||
ItemSpacing="0"/>
|
||||
</CollectionView.ItemsLayout>
|
||||
<CollectionView.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<RelativeLayout>
|
||||
<StackLayout x:DataType="models:StopoverLocations" Grid.Row="0" Grid.Column="0" Orientation="Vertical" HorizontalOptions="StartAndExpand">
|
||||
<Ellipse Fill="{StaticResource Primary}" Opacity="{Binding CircleColorOpecity}"
|
||||
WidthRequest="30"
|
||||
HeightRequest="30"
|
||||
HorizontalOptions="StartAndExpand" />
|
||||
</StackLayout>
|
||||
<StackLayout x:DataType="models:StopoverLocations" Orientation="Horizontal" VerticalOptions="Start" Margin="50,0,70,0">
|
||||
<Label FontSize="22"
|
||||
Text="{Binding FullStopOverAddress}"
|
||||
TextColor="{Binding LabelColor}"/>
|
||||
</StackLayout>
|
||||
<StackLayout x:DataType="models:StopoverLocations" VerticalOptions="CenterAndExpand" Margin="-25,30,0,0">
|
||||
<Line X1="40"
|
||||
Y1="0"
|
||||
X2="40"
|
||||
Y2="48"
|
||||
Stroke="white"
|
||||
StrokeDashArray="1,1"
|
||||
StrokeThickness="7"
|
||||
StrokeDashOffset="6"
|
||||
IsVisible="{Binding IsLineVisible}"/>
|
||||
</StackLayout>
|
||||
</RelativeLayout>
|
||||
</DataTemplate>
|
||||
</CollectionView.ItemTemplate>
|
||||
</CollectionView>
|
||||
<Grid VerticalOptions="CenterAndExpand" IsVisible="False">
|
||||
<StackLayout Grid.Row="0" Grid.Column="0" Orientation="Vertical" HorizontalOptions="StartAndExpand" Margin="0,10,0,0">
|
||||
<Ellipse Fill="{StaticResource Primary}" Opacity="{Binding DestinationCircleColorOpecity}"
|
||||
WidthRequest="30"
|
||||
HeightRequest="30"
|
||||
HorizontalOptions="StartAndExpand" />
|
||||
</StackLayout>
|
||||
<StackLayout Orientation="Horizontal" VerticalOptions="StartAndExpand" Margin="50,10,70,0">
|
||||
<Label FontSize="20"
|
||||
Text="{Binding FullDestinationAddress}"
|
||||
TextColor="{Binding DestinationStopLabelColorCode}"/>
|
||||
</StackLayout>
|
||||
</Grid>
|
||||
</Grid>
|
||||
|
||||
<Grid Margin="30,0,0,0" IsVisible="{Binding NoStopOver}">
|
||||
<StackLayout Grid.Row="0" Grid.Column="0" Orientation="Vertical" HorizontalOptions="StartAndExpand">
|
||||
<Ellipse Fill="{StaticResource Primary}" Opacity="0.5"
|
||||
WidthRequest="30"
|
||||
HeightRequest="30"
|
||||
HorizontalOptions="StartAndExpand" />
|
||||
</StackLayout>
|
||||
<StackLayout Orientation="Horizontal" VerticalOptions="CenterAndExpand" Margin="50,0,70,0">
|
||||
<Label FontSize="20"
|
||||
Text="{Binding FullDestinationAddress}"
|
||||
TextColor="Black"/>
|
||||
</StackLayout>
|
||||
</Grid>
|
||||
|
||||
</StackLayout>
|
||||
<StackLayout VerticalOptions="EndAndExpand" Orientation="Vertical" Margin="50,0,60,30" IsVisible="{Binding IsStopOver}">
|
||||
<Button
|
||||
Text="Passenger Collected"
|
||||
FontSize="20"
|
||||
TextTransform="Uppercase"
|
||||
Command="{Binding OnPassengerCollectedClick}"
|
||||
/>
|
||||
</StackLayout>
|
||||
<StackLayout VerticalOptions="EndAndExpand" Orientation="Vertical" Margin="50,0,60,30" IsVisible="{Binding IsNoStopOver}">
|
||||
<Button
|
||||
Text="Passenger Dropped Off"
|
||||
FontSize="20"
|
||||
TextTransform="Uppercase"
|
||||
Command="{Binding OnPassengerDroppedOffClick}"
|
||||
/>
|
||||
</StackLayout>
|
||||
</StackLayout>
|
||||
<UserControl:TripInformationPage Grid.Row="0"
|
||||
Grid.Column="1" />
|
||||
</Grid>
|
||||
</StackLayout>
|
||||
</ContentPage.Content>
|
||||
</ContentPage>
|
@ -0,0 +1,16 @@
|
||||
using GMCabsDriverAssistantSolution.ViewModels;
|
||||
|
||||
namespace GMCabsDriverAssistantSolution.Views;
|
||||
|
||||
public partial class PassgerCollectedPage : ContentPage
|
||||
{
|
||||
#region Fields
|
||||
private readonly StartRideViewModel _viewModel;
|
||||
#endregion
|
||||
public PassgerCollectedPage()
|
||||
{
|
||||
InitializeComponent();
|
||||
BindingContext = _viewModel = new StartRideViewModel(this);
|
||||
}
|
||||
protected override bool OnBackButtonPressed() => true;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user