1
0
mirror of https://github.com/danog/Telegram.git synced 2024-12-02 09:27:55 +01:00
Telegram/Telegraph/TGPrivacyCustomShareListController.m
2015-10-01 19:19:52 +03:00

350 lines
11 KiB
Objective-C

#import "TGPrivacyCustomShareListController.h"
#import "ActionStage.h"
#import "TGButtonCollectionItem.h"
#import "TGCommentCollectionItem.h"
#import "TGUserCollectionItem.h"
#import "TGUser.h"
#import "TGConversation.h"
#import "TGForwardTargetController.h"
#import "TGDatabase.h"
#import "TGTelegraph.h"
#import "TGInterfaceManager.h"
@interface TGPrivacyCustomShareListControllerAddCoordinator : NSObject <ASWatcher>
@property (nonatomic, strong) ASHandle *actionHandle;
@property (nonatomic, copy) void (^completion)(NSArray *);
@end
@implementation TGPrivacyCustomShareListControllerAddCoordinator
- (instancetype)init
{
self = [super init];
if (self != nil)
{
_actionHandle = [[ASHandle alloc] initWithDelegate:self releaseOnMainThread:true];
}
return self;
}
- (void)actionStageActionRequested:(NSString *)action options:(id)options
{
if ([action isEqualToString:@"blockUser"])
{
TGUser *user = options;
if (user.uid != 0)
{
TGUser *user = options;
if (user != nil)
{
int32_t uid = user.uid;
if (_completion)
_completion(@[@(uid)]);
}
}
}
else if ([action isEqualToString:@"leaveConversation"])
{
TGConversation *conversation = options;
if (conversation.conversationId != 0)
{
if (_completion)
_completion(conversation.chatParticipants.chatParticipantUids);
}
}
else if ([action isEqualToString:@"multipleUsersSelected"])
{
NSMutableArray *userIds = [[NSMutableArray alloc] init];
for (TGUser *user in options)
{
if (user.uid != TGTelegraphInstance.clientUserId)
[userIds addObject:@(user.uid)];
}
if (_completion)
_completion(userIds);
}
}
@end
@interface TGPrivacyCustomShareListController () <ASWatcher>
{
NSString *_contactSearchPlaceholder;
TGCollectionMenuSection *_usersSection;
NSArray *_users;
void (^_userIdsChanged)(NSArray *);
TGPrivacyCustomShareListControllerAddCoordinator *_coordinator;
}
@property (nonatomic, strong) ASHandle *actionHandle;
@end
@implementation TGPrivacyCustomShareListController
- (instancetype)initWithTitle:(NSString *)title contactSearchPlaceholder:(NSString *)contactSearchPlaceholder userIds:(NSArray *)userIds userIdsChanged:(void (^)(NSArray *))userIdsChanged
{
self = [super init];
if (self != nil)
{
_actionHandle = [[ASHandle alloc] initWithDelegate:self releaseOnMainThread:true];
_userIdsChanged = [userIdsChanged copy];
_contactSearchPlaceholder = contactSearchPlaceholder;
self.title = title;
NSMutableArray *usersSectionItems = [[NSMutableArray alloc] init];
TGButtonCollectionItem *addButton = [[TGButtonCollectionItem alloc] initWithTitle:TGLocalized(@"BlockedUsers.AddNew") action:@selector(addNewPressed)];
addButton.leftInset = 15.0f + 40.0f + 8.0f;
[usersSectionItems addObject:addButton];
_usersSection = [[TGCollectionMenuSection alloc] initWithItems:usersSectionItems];
UIEdgeInsets topSectionInsets = _usersSection.insets;
topSectionInsets.top = 32.0f;
_usersSection.insets = topSectionInsets;
[self.menuSections addSection:_usersSection];
[self setUserIds:userIds];
}
return self;
}
+ (id)presentAddInterfaceWithTitle:(NSString *)title contactSearchPlaceholder:(NSString *)contactSearchPlaceholder onController:(UIViewController *)controller completion:(void (^)(NSArray *))completion
{
TGPrivacyCustomShareListControllerAddCoordinator *coordinator = [[TGPrivacyCustomShareListControllerAddCoordinator alloc] init];
coordinator.completion = completion;
TGForwardTargetController *selectionController = [[TGForwardTargetController alloc] initWithSelectPrivacyTarget:title placeholder:contactSearchPlaceholder];
selectionController.watcherHandle = coordinator.actionHandle;
TGNavigationController *navigationController = [TGNavigationController navigationControllerWithControllers:@[selectionController]];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
{
navigationController.presentationStyle = TGNavigationControllerPresentationStyleInFormSheet;
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
}
[controller presentViewController:navigationController animated:true completion:nil];
return coordinator;
}
- (void)editButtonPressed
{
[self enterEditingMode:true];
}
- (void)doneButtonPressed
{
[self leaveEditingMode:true];
}
- (void)didEnterEditingMode:(bool)animated
{
[super didEnterEditingMode:animated];
[self setRightBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:TGLocalized(@"Common.Done") style:UIBarButtonItemStyleDone target:self action:@selector(doneButtonPressed)] animated:animated];
}
- (void)didLeaveEditingMode:(bool)animated
{
[super didLeaveEditingMode:animated];
[self setRightBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:TGLocalized(@"Common.Edit") style:UIBarButtonItemStylePlain target:self action:@selector(editButtonPressed)] animated:animated];
}
- (void)addNewPressed
{
__weak TGPrivacyCustomShareListController *weakSelf = self;
_coordinator = [TGPrivacyCustomShareListController presentAddInterfaceWithTitle:self.title contactSearchPlaceholder:_contactSearchPlaceholder onController:self completion:^(NSArray *userIds)
{
__strong TGPrivacyCustomShareListController *strongSelf = weakSelf;
if (strongSelf != nil)
{
NSMutableArray *updatedUserIds = [[NSMutableArray alloc] init];
for (TGUser *user in strongSelf->_users)
{
[updatedUserIds addObject:@(user.uid)];
}
for (NSNumber *nUserId in userIds)
{
if (TGTelegraphInstance.clientUserId == [nUserId intValue])
continue;
if (![updatedUserIds containsObject:nUserId])
[updatedUserIds addObject:nUserId];
}
[strongSelf setUserIds:updatedUserIds];
if (strongSelf->_userIdsChanged)
strongSelf->_userIdsChanged(updatedUserIds);
[strongSelf dismissViewControllerAnimated:true completion:nil];
strongSelf->_coordinator = nil;
}
}];
}
- (void)setUserIds:(NSArray *)userIds
{
NSMutableArray *users = [[NSMutableArray alloc] init];
for (NSNumber *nUserId in userIds)
{
TGUser *user = [TGDatabaseInstance() loadUser:[nUserId intValue]];
if (user != nil)
[users addObject:user];
}
_users = users;
[self _copyUsersToCurrentList:_users];
}
- (void)_copyUsersToCurrentList:(NSArray *)users
{
if (self.menuSections.sections.count < 1)
return;
users = [users sortedArrayUsingComparator:^NSComparisonResult(TGUser *user1, TGUser *user2)
{
NSComparisonResult result = [user1.lastName compare:user2.lastName];
if (result == NSOrderedSame)
result = [user1.firstName compare:user2.firstName];
return result;
}];
while (_usersSection.items.count > 1)
{
[self.menuSections deleteItemFromSection:0 atIndex:0];
}
NSMutableArray *userIds = [[NSMutableArray alloc] init];
int insertIndex = 0;
for (TGUser *user in users)
{
[userIds addObject:@(user.uid)];
TGUserCollectionItem *item = [[TGUserCollectionItem alloc] init];
item.deleteActionTitle = TGLocalized(@"PrivacyLastSeenSettings.CustomShareSettings.Delete");
item.user = user;
item.interfaceHandle = _actionHandle;
item.showAvatar = true;
item.deselectAutomatically = [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad;
[self.menuSections insertItem:item toSection:0 atIndex:insertIndex];
insertIndex++;
}
[self.collectionView reloadData];
if (_userIdsChanged)
_userIdsChanged(userIds);
[self _updateEmptyState:false];
}
- (void)_updateEmptyState:(bool)animated
{
if (((TGCollectionMenuSection *)self.menuSections.sections[0]).items.count == 1)
{
[self leaveEditingMode:animated];
[self setRightBarButtonItem:nil animated:animated];
}
else
{
if (self.collectionView.editing)
{
[self setRightBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:TGLocalized(@"Common.Done") style:UIBarButtonItemStyleDone target:self action:@selector(doneButtonPressed)] animated:animated];
}
else
{
[self setRightBarButtonItem:[[UIBarButtonItem alloc] initWithTitle:TGLocalized(@"Common.Edit") style:UIBarButtonItemStylePlain target:self action:@selector(editButtonPressed)] animated:animated];
}
}
}
- (void)_deleteUserWithUid:(int32_t)uid
{
bool wasEmpty = ((TGCollectionMenuSection *)self.menuSections.sections[0]).items.count <= 1;
int index = -1;
for (id item in ((TGCollectionMenuSection *)self.menuSections.sections[0]).items)
{
index++;
if ([item isKindOfClass:[TGUserCollectionItem class]])
{
if (((TGUserCollectionItem *)item).user.uid == uid)
{
UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForItem:index inSection:0]];
if (cell != nil)
[cell.superview sendSubviewToBack:cell];
[self.menuSections beginRecordingChanges];
[self.menuSections deleteItemFromSection:0 atIndex:index];
[self.menuSections commitRecordedChanges:self.collectionView];
break;
}
}
}
NSMutableArray *users = [[NSMutableArray alloc] initWithArray:_users];
for (NSUInteger i = 0; i < users.count; i++)
{
TGUser *user = users[i];
if (user.uid == uid)
{
[users removeObjectAtIndex:i];
break;
}
}
_users = users;
if (wasEmpty != (((TGCollectionMenuSection *)self.menuSections.sections[0]).items.count <= 1))
[self _updateEmptyState:true];
NSMutableArray *userIds = [[NSMutableArray alloc] init];
for (TGUser *user in _users)
{
[userIds addObject:@(user.uid)];
}
if (_userIdsChanged)
_userIdsChanged(userIds);
}
- (void)actionStageActionRequested:(NSString *)action options:(id)options
{
if ([action isEqualToString:@"userItemDeleteRequested"])
{
int32_t uid = [options[@"uid"] int32Value];
if (uid != 0)
[self _deleteUserWithUid:uid];
}
else if ([action isEqualToString:@"userItemSelected"])
{
int32_t uid = [options[@"uid"] int32Value];
if (uid != 0)
{
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
[[TGInterfaceManager instance] navigateToProfileOfUser:uid shareVCard:nil];
else
[[TGInterfaceManager instance] navigateToConversationWithId:uid conversation:nil];
}
}
}
@end