This repository has been archived on 2022-11-03. You can view files and clone it, but cannot push or open issues or pull requests.
DevOpsOpenHack/MobileApps/MyDriving/MyDriving.iOS/Screens/Trips/TripsTableViewController.cs
2022-11-03 16:41:13 -04:00

152 lines
4.7 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for details.
using System;
using CoreGraphics;
using Foundation;
using ObjCRuntime;
using UIKit;
using MyDriving.ViewModel;
using SDWebImage;
namespace MyDriving.iOS
{
public partial class TripsTableViewController : UITableViewController
{
const string TripCellWithImageIdentifier = "TRIP_CELL_WITHIMAGE_IDENTIFIER";
const string TripCellIdentifier = "TRIP_CELL_IDENTIFIER";
const string PastTripSegueIdentifier = "pastTripSegue";
public TripsTableViewController(IntPtr handle) : base(handle)
{
}
public PastTripsViewModel ViewModel { get; set; }
public override async void ViewDidLoad()
{
base.ViewDidLoad();
ViewModel = new PastTripsViewModel();
await ViewModel.ExecuteLoadPastTripsCommandAsync();
TableView.ReloadData();
TableView.TableFooterView = new UIView(new CGRect(0, 0, 0, 0));
RefreshControl.AddTarget(this, new Selector("RefreshSource"), UIControlEvent.ValueChanged);
NSNotificationCenter.DefaultCenter.AddObserver(new NSString("RefreshPastTripsTable"),
HandleReloadTableNotification);
}
public override void PrepareForSegue(UIStoryboardSegue segue, NSObject sender)
{
if (segue.Identifier == PastTripSegueIdentifier)
{
var controller = segue.DestinationViewController as CurrentTripViewController;
var indexPath = TableView.IndexPathForCell(sender as UITableViewCell);
var trip = ViewModel.Trips[indexPath.Row];
controller.PastTripsDetailViewModel = new PastTripsDetailViewModel(trip);
}
}
[Export("RefreshSource")]
async void RefreshControl_ValueChanged()
{
await ViewModel.ExecuteLoadPastTripsCommandAsync();
InvokeOnMainThread(delegate
{
TableView.ReloadData();
RefreshControl.EndRefreshing();
});
}
async void HandleReloadTableNotification(NSNotification obj)
{
await ViewModel.ExecuteLoadPastTripsCommandAsync();
InvokeOnMainThread(delegate { TableView.ReloadData(); });
}
#region UITableViewSource
public override nint RowsInSection(UITableView tableView, nint section)
{
return ViewModel.Trips.Count;
}
public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
if (ViewModel.CanLoadMore && !ViewModel.IsBusy && ViewModel.Trips.Count > 0 && indexPath.Row == ViewModel.Trips.Count - 1)
{
ViewModel.ExecuteLoadMorePastTripsCommandAsync().ContinueWith((t) =>
{
InvokeOnMainThread(delegate { TableView.ReloadData(); });
}, scheduler: System.Threading.Tasks.TaskScheduler.Current);
}
var trip = ViewModel.Trips[indexPath.Row];
if (string.IsNullOrEmpty(trip.MainPhotoUrl))
{
var cell = tableView.DequeueReusableCell(TripCellIdentifier) as TripTableViewCell;
if (cell == null)
{
cell = new TripTableViewCell(new NSString(TripCellIdentifier));
}
cell.LocationName = trip.Name;
cell.TimeAgo = trip.TimeAgo;
cell.Distance = trip.TotalDistance;
return cell;
}
else
{
var cell = tableView.DequeueReusableCell(TripCellWithImageIdentifier) as TripTableViewCellWithImage;
if (cell == null)
{
cell = new TripTableViewCellWithImage(new NSString(TripCellWithImageIdentifier));
}
cell.DisplayImage.SetImage(new NSUrl(trip.MainPhotoUrl));
cell.LocationName = trip.Name;
cell.TimeAgo = trip.TimeAgo;
cell.Distance = trip.TotalDistance;
return cell;
}
}
public override nfloat GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
{
var trip = ViewModel.Trips[indexPath.Row];
if (string.IsNullOrEmpty(trip.MainPhotoUrl))
return 70;
else
return 221;
}
public override bool CanEditRow(UITableView tableView, NSIndexPath indexPath)
{
return true;
}
public override async void CommitEditingStyle(UITableView tableView, UITableViewCellEditingStyle editingStyle,
NSIndexPath indexPath)
{
switch (editingStyle)
{
case UITableViewCellEditingStyle.Delete:
var trip = ViewModel.Trips[indexPath.Row];
if(await ViewModel.ExecuteDeleteTripCommand(trip))
tableView.DeleteRows(new[] {indexPath}, UITableViewRowAnimation.Automatic);
break;
}
}
#endregion
}
}