1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-02 09:27:55 +01:00
Telegram/Telegraph/TGForwardTargetController.m
2016-02-25 01:03:51 +01:00

744 lines
33 KiB
Objective-C

#import "TGForwardTargetController.h"
#import "TGDialogListController.h"
#import "TGTelegraphDialogListCompanion.h"
#import "TGContactsController.h"
#import "TGInterfaceManager.h"
#import "TGInterfaceAssets.h"
#import "TGDatabase.h"
#import "TGFont.h"
#import "TGImageUtils.h"
#import "TGBackdropView.h"
#import "TGAlertView.h"
#import "TGAppDelegate.h"
@interface TGForwardContactsController : TGContactsController
@property (nonatomic, strong) ASHandle *watcher;
@end
@implementation TGForwardContactsController
@synthesize watcher = _watcher;
- (void)singleUserSelected:(TGUser *)user
{
[_watcher requestAction:@"userSelected" options:[NSDictionary dictionaryWithObjectsAndKeys:user, @"user", nil]];
}
@end
#pragma mark -
@interface TGForwardTargetController () <UIAlertViewDelegate>
{
NSString *_confirmationCustomFormat;
bool _targetMode;
bool _privacyMode;
bool _groupMode;
}
@property (nonatomic) bool blockMode;
@property (nonatomic, strong) UIView *toolbarContainerView;
@property (nonatomic, strong) UISegmentedControl *segmentedControl;
@property (nonatomic, strong) TGDialogListController *dialogListController;
@property (nonatomic, strong) TGTelegraphDialogListCompanion *dialogListCompanion;
@property (nonatomic, strong) TGForwardContactsController *contactsController;
@property (nonatomic, strong) TGViewController *currentViewController;
@property (nonatomic, strong) id selectedTarget;
@property (nonatomic, strong) NSArray *forwardMessages;
@property (nonatomic, strong) NSDictionary *shareLink;
@property (nonatomic, strong) NSArray *sendMessages;
@property (nonatomic, strong) NSURL *documentFileUrl;
@property (nonatomic, strong) NSArray *documentFileDescs;
@property (nonatomic, strong) UIAlertView *currentAlert;
@end
@implementation TGForwardTargetController
- (id)initWithForwardMessages:(NSArray *)forwardMessages sendMessages:(NSArray *)sendMessages shareLink:(NSDictionary *)shareLink showSecretChats:(bool)showSecretChats
{
self = [super init];
if (self)
{
_actionHandle = [[ASHandle alloc] initWithDelegate:self releaseOnMainThread:true];
_confirmationDefaultPersonFormat = TGLocalized(@"Conversation.ForwardToPersonFormat");
_confirmationDefaultGroupFormat = TGLocalized(@"Conversation.ForwardToGroupFormat");
_dialogListCompanion = [[TGTelegraphDialogListCompanion alloc] init];
_dialogListCompanion.forwardMode = true;
_dialogListCompanion.showSecretInForwardMode = showSecretChats;
_dialogListCompanion.conversatioSelectedWatcher = _actionHandle;
_dialogListController = [[TGDialogListController alloc] initWithCompanion:_dialogListCompanion];
_dialogListController.customParentViewController = self;
_dialogListController.doNotHideSearchAutomatically = true;
[ActionStageInstance() requestActor:[NSString stringWithFormat:@"/tg/dialoglist/(%d)", INT_MAX] options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:25], @"limit", [NSNumber numberWithInt:INT_MAX], @"date", nil] watcher:_dialogListCompanion];
_contactsController = [[TGForwardContactsController alloc] initWithContactsMode:TGContactsModeRegistered | TGContactsModeClearSelectionImmediately];
_contactsController.watcher = _actionHandle;
_contactsController.customParentViewController = self;
_forwardMessages = forwardMessages;
_sendMessages = sendMessages;
_shareLink = shareLink;
}
return self;
}
- (id)initWithSelectBlockTarget
{
self = [super init];
if (self)
{
_actionHandle = [[ASHandle alloc] initWithDelegate:self releaseOnMainThread:true];
_dialogListCompanion = [[TGTelegraphDialogListCompanion alloc] init];
_dialogListCompanion.forwardMode = true;
_dialogListCompanion.conversatioSelectedWatcher = _actionHandle;
_dialogListController = [[TGDialogListController alloc] initWithCompanion:_dialogListCompanion];
_dialogListController.customParentViewController = self;
_dialogListController.doNotHideSearchAutomatically = true;
[ActionStageInstance() requestActor:[NSString stringWithFormat:@"/tg/dialoglist/(%d)", INT_MAX] options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:25], @"limit", [NSNumber numberWithInt:INT_MAX], @"date", nil] watcher:_dialogListCompanion];
_contactsController = [[TGForwardContactsController alloc] initWithContactsMode:TGContactsModeRegistered | TGContactsModeClearSelectionImmediately];
_contactsController.watcher = _actionHandle;
_contactsController.customParentViewController = self;
_confirmationDefaultPersonFormat = _confirmationDefaultGroupFormat = TGLocalized(@"BlockedUsers.BlockFormat");
_controllerTitle = TGLocalized(@"BlockedUsers.BlockTitle");
_blockMode = true;
}
return self;
}
- (id)initWithSelectPrivacyTarget:(NSString *)title placeholder:(NSString *)placeholder
{
self = [super init];
if (self)
{
_actionHandle = [[ASHandle alloc] initWithDelegate:self releaseOnMainThread:true];
_dialogListCompanion = [[TGTelegraphDialogListCompanion alloc] init];
_dialogListCompanion.privacyMode = true;
_dialogListCompanion.conversatioSelectedWatcher = _actionHandle;
_dialogListController = [[TGDialogListController alloc] initWithCompanion:_dialogListCompanion];
_dialogListController.customParentViewController = self;
_dialogListController.doNotHideSearchAutomatically = true;
[ActionStageInstance() requestActor:[NSString stringWithFormat:@"/tg/dialoglist/(%d)", INT_MAX] options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:25], @"limit", [NSNumber numberWithInt:INT_MAX], @"date", nil] watcher:_dialogListCompanion];
_contactsController = [[TGForwardContactsController alloc] initWithContactsMode:TGContactsModeRegistered | TGContactsModeClearSelectionImmediately | TGContactsModeCompose];
_contactsController.watcher = _actionHandle;
_contactsController.customParentViewController = self;
_contactsController.composePlaceholder = placeholder;
_controllerTitle = title;
_privacyMode = true;
}
return self;
}
- (id)initWithSelectTarget
{
self = [super init];
if (self)
{
_actionHandle = [[ASHandle alloc] initWithDelegate:self releaseOnMainThread:true];
_dialogListCompanion = [[TGTelegraphDialogListCompanion alloc] init];
_dialogListCompanion.forwardMode = true;
_dialogListCompanion.conversatioSelectedWatcher = _actionHandle;
_dialogListController = [[TGDialogListController alloc] initWithCompanion:_dialogListCompanion];
_dialogListController.customParentViewController = self;
_dialogListController.doNotHideSearchAutomatically = true;
[ActionStageInstance() requestActor:[NSString stringWithFormat:@"/tg/dialoglist/(%d)", INT_MAX] options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:25], @"limit", [NSNumber numberWithInt:INT_MAX], @"date", nil] watcher:_dialogListCompanion];
_contactsController = [[TGForwardContactsController alloc] initWithContactsMode:TGContactsModeRegistered | TGContactsModeClearSelectionImmediately];
_contactsController.watcher = _actionHandle;
_contactsController.customParentViewController = self;
_controllerTitle = TGLocalized(@"BroadcastListInfo.AddRecipient");
_targetMode = true;
}
return self;
}
- (id)initWithSelectGroup
{
self = [super init];
if (self)
{
_actionHandle = [[ASHandle alloc] initWithDelegate:self releaseOnMainThread:true];
_groupMode = true;
_dialogListCompanion = [[TGTelegraphDialogListCompanion alloc] init];
_dialogListCompanion.forwardMode = true;
_dialogListCompanion.showGroupsOnly = true;
_dialogListCompanion.botStartMode = true;
_dialogListCompanion.conversatioSelectedWatcher = _actionHandle;
_dialogListController = [[TGDialogListController alloc] initWithCompanion:_dialogListCompanion];
_dialogListController.customParentViewController = self;
_dialogListController.doNotHideSearchAutomatically = true;
[ActionStageInstance() requestActor:[NSString stringWithFormat:@"/tg/dialoglist/(%d)", INT_MAX] options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:25], @"limit", [NSNumber numberWithInt:INT_MAX], @"date", nil] watcher:_dialogListCompanion];
_controllerTitle = TGLocalized(@"Target.SelectGroup");
_confirmationDefaultPersonFormat = _confirmationDefaultGroupFormat = TGLocalized(@"Target.InviteToGroupConfirmation");
}
return self;
}
- (id)initWithDocumentFile:(NSURL *)fileUrl size:(int)size
{
self = [super init];
if (self != nil)
{
NSString *genericFormat = TGLocalized(@"Document.TargetConfirmationFormat");
NSRange range = [genericFormat rangeOfString:@"{size}"];
if (range.location != 0)
{
NSString *sizeString = nil;
if (size < 1024)
sizeString = [[NSString alloc] initWithFormat:@"%dB", size];
else if (size < 1024 * 1024)
sizeString = [[NSString alloc] initWithFormat:@"%dKB", size / 1024];
else
sizeString = [[NSString alloc] initWithFormat:@"%.2fMB", size / (1024.0f * 1024.0f)];
genericFormat = [genericFormat stringByReplacingCharactersInRange:range withString:sizeString];
NSRange targetRange = [genericFormat rangeOfString:@"{target}"];
if (targetRange.location != NSNotFound)
genericFormat = [genericFormat stringByReplacingCharactersInRange:targetRange withString:@"%@"];
_confirmationCustomFormat = genericFormat;
}
_actionHandle = [[ASHandle alloc] initWithDelegate:self releaseOnMainThread:true];
_confirmationDefaultPersonFormat = TGLocalized(@"Conversation.ForwardToPersonFormat");
_confirmationDefaultGroupFormat = TGLocalized(@"Conversation.ForwardToGroupFormat");
_dialogListCompanion = [[TGTelegraphDialogListCompanion alloc] init];
_dialogListCompanion.forwardMode = true;
_dialogListCompanion.showSecretInForwardMode = true;
_dialogListCompanion.conversatioSelectedWatcher = _actionHandle;
_dialogListController = [[TGDialogListController alloc] initWithCompanion:_dialogListCompanion];
_dialogListController.customParentViewController = self;
_dialogListController.doNotHideSearchAutomatically = true;
[ActionStageInstance() requestActor:[NSString stringWithFormat:@"/tg/dialoglist/(%d)", INT_MAX] options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:25], @"limit", [NSNumber numberWithInt:INT_MAX], @"date", nil] watcher:_dialogListCompanion];
_contactsController = [[TGForwardContactsController alloc] initWithContactsMode:TGContactsModeRegistered | TGContactsModeClearSelectionImmediately];
_contactsController.watcher = _actionHandle;
_contactsController.customParentViewController = self;
_documentFileUrl = fileUrl;
}
return self;
}
- (NSString *)stringForMultipleFilesConfirmation:(NSUInteger)count
{
NSString *formatString = TGLocalized(@"Forward.ConfirmMultipleFiles_any");
if (count == 1)
formatString = TGLocalized(@"Forward.ConfirmMultipleFiles_1");
else if (count == 2)
formatString = TGLocalized(@"Forward.ConfirmMultipleFiles_2");
else if (count >= 3 && count <= 10)
formatString = TGLocalized(@"Forward.ConfirmMultipleFiles_3_10");
return [[NSString alloc] initWithFormat:formatString, [[NSString alloc] initWithFormat:@"%d", (int)count]];
}
- (id)initWithDocumentFiles:(NSArray *)fileDescs
{
self = [super init];
if (self != nil)
{
NSString *genericFormat = [self stringForMultipleFilesConfirmation:fileDescs.count];
NSRange targetRange = [genericFormat rangeOfString:@"{target}"];
if (targetRange.location != NSNotFound)
genericFormat = [genericFormat stringByReplacingCharactersInRange:targetRange withString:@"%@"];
_confirmationCustomFormat = genericFormat;
_actionHandle = [[ASHandle alloc] initWithDelegate:self releaseOnMainThread:true];
_confirmationDefaultPersonFormat = TGLocalized(@"Conversation.ForwardToPersonFormat");
_confirmationDefaultGroupFormat = TGLocalized(@"Conversation.ForwardToGroupFormat");
_dialogListCompanion = [[TGTelegraphDialogListCompanion alloc] init];
_dialogListCompanion.forwardMode = true;
_dialogListCompanion.showSecretInForwardMode = true;
_dialogListCompanion.conversatioSelectedWatcher = _actionHandle;
_dialogListController = [[TGDialogListController alloc] initWithCompanion:_dialogListCompanion];
_dialogListController.customParentViewController = self;
_dialogListController.doNotHideSearchAutomatically = true;
[ActionStageInstance() requestActor:[NSString stringWithFormat:@"/tg/dialoglist/(%d)", INT_MAX] options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:25], @"limit", [NSNumber numberWithInt:INT_MAX], @"date", nil] watcher:_dialogListCompanion];
_contactsController = [[TGForwardContactsController alloc] initWithContactsMode:TGContactsModeRegistered | TGContactsModeClearSelectionImmediately];
_contactsController.watcher = _actionHandle;
_contactsController.customParentViewController = self;
_documentFileDescs = fileDescs;
}
return self;
}
- (void)dealloc
{
[self doUnloadView];
_currentAlert.delegate = nil;
_dialogListController.customParentViewController = nil;
_contactsController.customParentViewController = nil;
[_actionHandle reset];
[ActionStageInstance() removeWatcher:self];
}
- (UIBarStyle)requiredNavigationBarStyle
{
if (_currentViewController != nil && [_currentViewController conformsToProtocol:@protocol(TGViewControllerNavigationBarAppearance) ] && [_currentViewController respondsToSelector:@selector(requiredNavigationBarStyle)])
return [(id<TGViewControllerNavigationBarAppearance>)_currentViewController requiredNavigationBarStyle];
return UIBarStyleDefault;
}
- (bool)navigationBarShouldBeHidden
{
if (_currentViewController != nil && [_currentViewController conformsToProtocol:@protocol(TGViewControllerNavigationBarAppearance) ] && [_currentViewController respondsToSelector:@selector(navigationBarShouldBeHidden)])
return [(id<TGViewControllerNavigationBarAppearance>)_currentViewController navigationBarShouldBeHidden];
return false;
}
- (bool)shouldBeRemovedFromNavigationAfterHiding
{
return true;
}
- (void)loadView
{
[super loadView];
self.titleText = _controllerTitle != nil ? _controllerTitle : TGLocalized(@"Conversation.ForwardTitle");
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:TGLocalized(@"Common.Cancel") style:UIBarButtonItemStylePlain target:self action:@selector(doneButtonPressed)];
if (_contactsController != nil)
{
_toolbarContainerView = [[UIView alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height - 44, self.view.frame.size.width, 44)];
_toolbarContainerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
if (TGBackdropEnabled())
{
UIView *backgroundView = [[UIToolbar alloc] initWithFrame:_toolbarContainerView.bounds];
backgroundView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[_toolbarContainerView addSubview:backgroundView];
}
else
{
UIView *backgroundView = [TGBackdropView viewWithLightNavigationBarStyle];
backgroundView.frame = _toolbarContainerView.bounds;
backgroundView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[_toolbarContainerView addSubview:backgroundView];
UIView *stripeView = [[UIView alloc] init];
stripeView.frame = CGRectMake(0.0f, 0.0f, _toolbarContainerView.frame.size.width, TGIsRetina() ? 0.5f : 1.0f);
stripeView.backgroundColor = UIColorRGB(0xb2b2b2);
stripeView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
[_toolbarContainerView addSubview:stripeView];
}
_segmentedControl = [[UISegmentedControl alloc] initWithItems:@[TGLocalized(@"DialogList.TabTitle"), TGLocalized(@"Contacts.TabTitle")]];
[_segmentedControl setBackgroundImage:[UIImage imageNamed:@"ModernSegmentedControlBackground.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[_segmentedControl setBackgroundImage:[UIImage imageNamed:@"ModernSegmentedControlSelected.png"] forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
[_segmentedControl setBackgroundImage:[UIImage imageNamed:@"ModernSegmentedControlSelected.png"] forState:UIControlStateSelected | UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
[_segmentedControl setBackgroundImage:[UIImage imageNamed:@"ModernSegmentedControlHighlighted.png"] forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
UIImage *dividerImage = [UIImage imageNamed:@"ModernSegmentedControlDivider.png"];
[_segmentedControl setDividerImage:dividerImage forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
_segmentedControl.frame = CGRectMake(CGFloor((_toolbarContainerView.frame.size.width - 182.0f) / 2), 8, 182.0f, 29.0f);
_segmentedControl.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;
[_segmentedControl setTitleTextAttributes:@{UITextAttributeTextColor: TGAccentColor(), UITextAttributeTextShadowColor: [UIColor clearColor], UITextAttributeFont: TGSystemFontOfSize(13)} forState:UIControlStateNormal];
[_segmentedControl setTitleTextAttributes:@{UITextAttributeTextColor: [UIColor whiteColor], UITextAttributeTextShadowColor: [UIColor clearColor], UITextAttributeFont: TGSystemFontOfSize(13)} forState:UIControlStateSelected];
[_segmentedControl setSelectedSegmentIndex:0];
[_segmentedControl addTarget:self action:@selector(segmentedControlChanged) forControlEvents:UIControlEventValueChanged];
[_toolbarContainerView addSubview:_segmentedControl];
if (_privacyMode)
{
[self setCurrentViewController:_contactsController];
[_segmentedControl setSelectedSegmentIndex:1];
}
else
[self setCurrentViewController:_dialogListController];
[self.view addSubview:_toolbarContainerView];
}
else
{
[self setCurrentViewController:_dialogListController];
}
}
- (void)viewWillAppear:(BOOL)animated
{
_toolbarContainerView.frame = CGRectMake(0, self.view.frame.size.height - 44, self.view.frame.size.width, 44);
_segmentedControl.frame = CGRectMake(CGFloor((_toolbarContainerView.frame.size.width - 182.0f) / 2), 8, 182.0f, 29.0f);
[super viewWillAppear:animated];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if (iosMajorVersion() < 7)
[self.view.window makeKeyWindow];
}
- (void)doUnloadView
{
[self setCurrentViewController:nil];
if (_dialogListController.isViewLoaded)
_dialogListController.view = nil;
if (_contactsController.isViewLoaded)
_contactsController.view = nil;
}
- (void)setCurrentViewController:(TGViewController *)currentViewController
{
if (_currentViewController != nil)
{
[_currentViewController willMoveToParentViewController:nil];
[_currentViewController.view removeFromSuperview];
[_currentViewController removeFromParentViewController];
[_currentViewController didMoveToParentViewController:nil];
}
_currentViewController = currentViewController;
if (_currentViewController != nil)
{
_currentViewController.parentInsets = UIEdgeInsetsMake(0, 0, _toolbarContainerView.frame.size.height, 0);
[_currentViewController willMoveToParentViewController:self];
[_currentViewController.view setFrame:self.view.bounds];
[self.view insertSubview:_currentViewController.view atIndex:0];
[self addChildViewController:_currentViewController];
[_currentViewController didMoveToParentViewController:self];
}
if (_privacyMode)
{
if (currentViewController == _contactsController)
{
[self setRightBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:TGLocalized(@"Common.Done") style:UIBarButtonItemStyleDone target:self action:@selector(donePressed)]];
}
else
[self setRightBarButtonItem:nil];
}
}
- (void)donePressed
{
if (_privacyMode)
{
[_watcherHandle requestAction:@"multipleUsersSelected" options:_contactsController.selectedComposeUsers];
}
}
/*- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
[super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
_toolbarContainerView.frame = CGRectMake(0, self.view.frame.size.height - 44, self.view.frame.size.width, 44);
if (_currentViewController != nil)
{
[_currentViewController.view setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - _toolbarContainerView.frame.size.height)];
}
}*/
#pragma mark -
- (void)doneButtonPressed
{
[self dismissSelf];
}
- (void)dismissSelf
{
[self.presentingViewController dismissViewControllerAnimated:true completion:nil];
}
- (UIStatusBarStyle)preferredStatusBarStyle
{
if (self.childViewControllers.count != 0)
return [self.childViewControllers[0] preferredStatusBarStyle];
return [super preferredStatusBarStyle];
}
- (void)segmentedControlChanged
{
int index = (int)_segmentedControl.selectedSegmentIndex;
if (index == 0)
{
if (_currentViewController != _dialogListController)
[self setCurrentViewController:_dialogListController];
}
else if (index == 1)
{
if (_currentViewController != _contactsController)
[self setCurrentViewController:_contactsController];
}
}
#pragma mark -
- (void)actionStageActionRequested:(NSString *)action options:(NSDictionary *)options
{
if ([action isEqualToString:@"userSelected"])
{
TGUser *user = [options objectForKey:@"user"];
if (user != nil)
{
if (_blockMode || _privacyMode)
{
[_watcherHandle requestAction:@"blockUser" options:user];
}
else
{
_selectedTarget = user;
if (_targetMode)
{
[_watcherHandle requestAction:@"userSelected" options:user];
}
else
{
if (!_skipConfirmation)
{
_currentAlert.delegate = nil;
NSString *alertText = nil;
if (_confirmationCustomFormat != nil)
alertText = [[NSString alloc] initWithFormat:_confirmationCustomFormat, user.displayName];
else
alertText = [NSString stringWithFormat:_confirmationDefaultPersonFormat, user.displayName];
_currentAlert = [[TGAlertView alloc] initWithTitle:nil message:alertText delegate:self cancelButtonTitle:TGLocalized(@"Common.No") otherButtonTitles:TGLocalized(@"Common.Yes"), nil];
[_currentAlert show];
}
else
{
[self confirmAction];
}
}
}
}
}
else if ([action isEqualToString:@"conversationSelected"])
{
TGConversation *conversation = [options objectForKey:@"conversation"];
if (conversation != nil)
{
_selectedTarget = conversation;
if (_targetMode)
{
if (conversation.isChat)
[_watcherHandle requestAction:@"conversationSelected" options:conversation];
else
{
TGUser *user = [TGDatabaseInstance() loadUser:(int32_t)conversation.conversationId];
if (user != nil)
[_watcherHandle requestAction:@"userSelected" options:user];
}
}
else
{
if ((conversation.isChat && conversation.conversationId > INT_MIN) || conversation.isChannel)
{
_selectedTarget = conversation;
if (!_skipConfirmation)
{
_currentAlert.delegate = nil;
NSString *alertText = nil;
if (_privacyMode)
{
NSString *formatString = TGLocalized(@"PrivacyLastSeenSettings.AddUsers_any");
if (conversation.chatParticipants.chatParticipantUids.count == 1)
formatString = TGLocalized(@"PrivacyLastSeenSettings.AddUsers_1");
else if (conversation.chatParticipants.chatParticipantUids.count == 2)
formatString = TGLocalized(@"PrivacyLastSeenSettings.AddUsers_2");
else if (conversation.chatParticipants.chatParticipantUids.count >= 3 && conversation.chatParticipants.chatParticipantUids.count <= 10)
formatString = TGLocalized(@"PrivacyLastSeenSettings.AddUsers_3_10");
alertText = [NSString stringWithFormat:formatString, @(conversation.chatParticipants.chatParticipantUids.count)];
_currentAlert = [[TGAlertView alloc] initWithTitle:nil message:alertText delegate:self cancelButtonTitle:TGLocalized(@"Common.No") otherButtonTitles:TGLocalized(@"Common.Yes"), nil];
[_currentAlert show];
}
else
{
if (_blockMode)
alertText = [NSString stringWithFormat:@"%@\"%@\"?", TGLocalized(@"BlockedUsers.LeavePrefix"), conversation.chatTitle];
else if (_confirmationCustomFormat != nil)
alertText = [[NSString alloc] initWithFormat:_confirmationCustomFormat, conversation.chatTitle];
else
alertText = [NSString stringWithFormat:_confirmationDefaultGroupFormat, conversation.chatTitle];
_currentAlert = [[TGAlertView alloc] initWithTitle:nil message:alertText delegate:self cancelButtonTitle:TGLocalized(@"Common.No") otherButtonTitles:TGLocalized(@"Common.Yes"), nil];
[_currentAlert show];
}
}
else
[self confirmAction];
}
else
{
int uid = 0;
if (conversation.isChat)
{
if (conversation.chatParticipants.chatParticipantUids.count != 0)
uid = [conversation.chatParticipants.chatParticipantUids[0] intValue];
}
else
uid = (int)conversation.conversationId;
TGUser *user = [TGDatabaseInstance() loadUser:uid];
if (user != nil)
{
if (_blockMode || _privacyMode)
{
[_watcherHandle requestAction:@"blockUser" options:user];
}
else
{
_selectedTarget = conversation.isChat ? conversation : user;
if (!_skipConfirmation)
{
_currentAlert.delegate = nil;
NSString *alertText = nil;
if (_confirmationCustomFormat != nil)
alertText = [[NSString alloc] initWithFormat:_confirmationCustomFormat, user.displayName];
else
alertText = [NSString stringWithFormat:_confirmationDefaultPersonFormat, user.displayName];
_currentAlert = [[TGAlertView alloc] initWithTitle:nil message:alertText delegate:self cancelButtonTitle:TGLocalized(@"Common.No") otherButtonTitles:TGLocalized(@"Common.Yes"), nil];
[_currentAlert show];
}
else
[self confirmAction];
}
}
}
}
}
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex != alertView.cancelButtonIndex && _selectedTarget != nil)
{
if (_blockMode || _privacyMode)
{
if ([_selectedTarget isKindOfClass:[TGUser class]])
[_watcherHandle requestAction:@"blockUser" options:_selectedTarget];
else if ([_selectedTarget isKindOfClass:[TGConversation class]])
[_watcherHandle requestAction:@"leaveConversation" options:_selectedTarget];
}
else
{
[self confirmAction];
}
}
_currentAlert.delegate = nil;
_currentAlert = nil;
}
- (void)confirmAction
{
if ([_selectedTarget isKindOfClass:[TGConversation class]])
{
TGConversation *conversation = (TGConversation *)_selectedTarget;
if (conversation.isChannel && !conversation.currentUserCanSendMessages) {
[[[TGAlertView alloc] initWithTitle:nil message:TGLocalized(@"Forward.ChannelReadOnly") cancelButtonTitle:TGLocalized(@"Common.OK") okButtonTitle:nil completionBlock:nil] show];
return;
}
}
id<ASWatcher> watcher = _watcherHandle.delegate;
if (watcher != nil && [watcher respondsToSelector:@selector(actionStageActionRequested:options:)])
[watcher actionStageActionRequested:@"willForwardMessages" options:[[NSDictionary alloc] initWithObjectsAndKeys:self, @"controller", _selectedTarget, @"target", nil]];
if (watcher == nil)
[self dismissSelf];
if (!_groupMode)
{
if (_documentFileDescs != nil)
{
if ([_selectedTarget isKindOfClass:[TGUser class]])
{
TGUser *user = (TGUser *)_selectedTarget;
[[TGInterfaceManager instance] navigateToConversationWithId:user.uid conversation:nil performActions:@{@"forwardMessages": [NSArray arrayWithArray:_forwardMessages], @"sendFiles": _documentFileDescs} animated:false];
}
else if ([_selectedTarget isKindOfClass:[TGConversation class]])
{
TGConversation *conversation = (TGConversation *)_selectedTarget;
[[TGInterfaceManager instance] navigateToConversationWithId:conversation.conversationId conversation:nil performActions:@{@"forwardMessages": [NSArray arrayWithArray:_forwardMessages], @"sendFiles": _documentFileDescs} animated:false];
}
}
else
{
if ([_selectedTarget isKindOfClass:[TGUser class]])
{
TGUser *user = (TGUser *)_selectedTarget;
[[TGInterfaceManager instance] navigateToConversationWithId:user.uid conversation:nil performActions:@{@"forwardMessages": [NSArray arrayWithArray:_forwardMessages], @"sendMessages": [NSArray arrayWithArray:_sendMessages], @"sendFiles": _documentFileUrl == nil ? @[] : @[@{@"url": _documentFileUrl}], @"shareLink": _shareLink == nil ? @{} : _shareLink} animated:false];
}
else if ([_selectedTarget isKindOfClass:[TGConversation class]])
{
TGConversation *conversation = (TGConversation *)_selectedTarget;
[[TGInterfaceManager instance] navigateToConversationWithId:conversation.conversationId conversation:nil performActions:@{@"forwardMessages": [NSArray arrayWithArray:_forwardMessages], @"sendMessages": [NSArray arrayWithArray:_sendMessages], @"sendFiles": _documentFileUrl == nil ? @[] : @[@{@"url": _documentFileUrl}], @"shareLink": _shareLink == nil ? @{} : _shareLink} animated:false];
}
}
}
}
- (TGContactsController *)contactsController
{
return _contactsController;
}
@end