1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-05 13:29:05 +01:00
Telegram/Watch/Extension/TGLocationController.m
2015-10-01 19:19:52 +03:00

184 lines
5.7 KiB
Objective-C

#import "TGLocationController.h"
#import "TGBridgeLocationSignals.h"
#import "TGBridgeLocationVenue+TGTableItem.h"
#import "TGBridgeLocationMediaAttachment.h"
#import "WKInterfaceTable+TGDataDrivenTable.h"
#import "TGTableDeltaUpdater.h"
#import "TGLocationMapHeaderController.h"
#import "TGLocationVenueRowController.h"
NSString *const TGLocationControllerIdentifier = @"TGLocationController";
const NSUInteger TGLocationControllerBatchLimit = 16;
@implementation TGLocationControllerContext
@end
@interface TGLocationController () <TGTableDataSource>
{
TGLocationControllerContext *_context;
SMetaDisposable *_locationDisposable;
NSArray *_venueModels;
NSArray *_currentVenueModels;
CLLocation *_currentLocation;
}
@end
@implementation TGLocationController
- (instancetype)init
{
self = [super init];
if (self != nil)
{
_locationDisposable = [[SMetaDisposable alloc] init];
[self.alertGroup _setInitialHidden:true];
[self.table _setInitialHidden:true];
self.table.tableDataSource = self;
}
return self;
}
- (void)dealloc
{
[_locationDisposable dispose];
}
- (void)configureWithContext:(TGLocationControllerContext *)context
{
_context = context;
__weak TGLocationController *weakSelf = self;
[_locationDisposable setDisposable:[[[TGBridgeLocationSignals nearbyVenuesWithLimit:TGLocationControllerBatchLimit] deliverOn:[SQueue mainQueue]] startWithNext:^(id next)
{
__strong TGLocationController *strongSelf = weakSelf;
if (strongSelf == nil)
return;
if ([next isKindOfClass:[NSString class]])
{
[strongSelf performInterfaceUpdate:^(bool animated)
{
__strong TGLocationController *strongSelf = weakSelf;
if (strongSelf == nil)
return;
if ([next isEqualToString:TGBridgeLocationAccessRequiredKey])
{
strongSelf.alertGroup.hidden = false;
strongSelf.alertLabel.text = TGLocalized(@"Location.Access");
strongSelf.activityGroup.hidden = true;
}
else if ([next isEqualToString:TGBridgeLocationLoadingKey])
{
strongSelf.alertGroup.hidden = true;
strongSelf.activityGroup.hidden = false;
}
}];
}
else if ([next isKindOfClass:[CLLocation class]])
{
strongSelf->_currentLocation = (CLLocation *)next;
[strongSelf performInterfaceUpdate:^(bool animated)
{
__strong TGLocationController *strongSelf = weakSelf;
if (strongSelf == nil)
return;
strongSelf.table.hidden = false;
[strongSelf.table reloadData];
}];
}
else if ([next isKindOfClass:[NSArray class]])
{
strongSelf->_venueModels = (NSArray *)next;
[strongSelf performInterfaceUpdate:^(bool animated)
{
__strong TGLocationController *strongSelf = weakSelf;
if (strongSelf == nil)
return;
NSArray *currentVenueModels = strongSelf->_currentVenueModels;
strongSelf->_currentVenueModels = strongSelf->_venueModels;
strongSelf.alertGroup.hidden = true;
strongSelf.table.hidden = false;
strongSelf.activityGroup.hidden = true;
[TGTableDeltaUpdater updateTable:strongSelf.table oldData:currentVenueModels newData:strongSelf->_currentVenueModels controllerClassForIndexPath:^Class(TGIndexPath *indexPath)
{
return [strongSelf table:strongSelf.table rowControllerClassAtIndexPath:indexPath];
}];
}];
}
} error:^(id error)
{
} completed:^
{
}]];
}
- (Class)headerControllerClassForTable:(WKInterfaceTable *)table
{
return [TGLocationMapHeaderController class];
}
- (void)table:(WKInterfaceTable *)table updateHeaderController:(TGLocationMapHeaderController *)controller
{
__weak TGLocationController *weakSelf = self;
controller.currentLocationPressed = ^
{
__strong TGLocationController *strongSelf = weakSelf;
if (strongSelf == nil)
return;
TGBridgeLocationMediaAttachment *location = [[TGBridgeLocationMediaAttachment alloc] init];
location.latitude = strongSelf->_currentLocation.coordinate.latitude;
location.longitude = strongSelf->_currentLocation.coordinate.longitude;
[strongSelf dismissController];
if (strongSelf->_context.completionBlock != nil)
strongSelf->_context.completionBlock(location);
};
[controller updateWithLocation:_currentLocation];
}
- (NSUInteger)numberOfRowsInTable:(WKInterfaceTable *)table section:(NSUInteger)section
{
return _venueModels.count;
}
- (Class)table:(WKInterfaceTable *)table rowControllerClassAtIndexPath:(NSIndexPath *)indexPath
{
return [TGLocationVenueRowController class];
}
- (void)table:(WKInterfaceTable *)table updateRowController:(TGLocationVenueRowController *)controller forIndexPath:(TGIndexPath *)indexPath
{
[controller updateWithLocationVenue:_venueModels[indexPath.row]];
}
- (void)table:(WKInterfaceTable *)table didSelectRowAtIndexPath:(TGIndexPath *)indexPath
{
[self dismissController];
if (_context.completionBlock != nil)
_context.completionBlock([_venueModels[indexPath.row] locationAttachment]);
}
+ (NSString *)identifier
{
return TGLocationControllerIdentifier;
}
@end