123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- /**
- * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
- * SPDX-License-Identifier: GPL-3.0-or-later
- */
- #import "ChatTableViewCell.h"
- #import "NextcloudTalk-Swift.h"
- typedef void (^GetMenuUserActionsForMessageCompletionBlock)(NSArray *menuItems);
- @interface ChatTableViewCell () <UITextFieldDelegate>
- @property (nonatomic, strong) DRCellSlideGestureRecognizer *replyGestureRecognizer;
- @end
- @implementation ChatTableViewCell
- - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
- {
- self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
- if (self) {
- // Initialization
- }
- return self;
- }
- - (void)prepareForReuse
- {
- [super prepareForReuse];
- self.messageId = -1;
- self.message = nil;
- [self removeGestureRecognizer:self.replyGestureRecognizer];
- }
- - (void)addReplyGestureWithActionBlock:(DRCellSlideActionBlock)block
- {
- self.replyGestureRecognizer = [DRCellSlideGestureRecognizer new];
- self.replyGestureRecognizer.leftActionStartPosition = 80;
- DRCellSlideAction *action = [DRCellSlideAction actionForFraction:0.2];
- action.behavior = DRCellSlideActionPullBehavior;
- action.activeColor = [UIColor labelColor];
- action.inactiveColor = [UIColor placeholderTextColor];
- action.activeBackgroundColor = self.backgroundColor;
- action.inactiveBackgroundColor = self.backgroundColor;
- action.icon = [UIImage systemImageNamed:@"arrowshape.turn.up.left"];
- [action setWillTriggerBlock:^(UITableView *tableView, NSIndexPath *indexPath) {
- block(tableView, indexPath);
- }];
- [action setDidChangeStateBlock:^(DRCellSlideAction *action, BOOL active) {
- if (active) {
- // Actuate `Peek` feedback (weak boom)
- AudioServicesPlaySystemSound(1519);
- }
- }];
- [self.replyGestureRecognizer addActions:action];
- [self addGestureRecognizer:self.replyGestureRecognizer];
- }
- - (UIMenu *)getDeferredUserMenuForMessage:(NCChatMessage *)message
- {
- TalkAccount *activeAccount = [[NCDatabaseManager sharedInstance] activeAccount];
- if (![message.actorType isEqualToString:@"users"] || [message.actorId isEqualToString:activeAccount.userId]) {
- return nil;
- }
- UIDeferredMenuElement *deferredMenuElement;
- // Use an uncached provider so local time is not cached
- deferredMenuElement = [UIDeferredMenuElement elementWithUncachedProvider:^(void (^ _Nonnull completion)(NSArray<UIMenuElement *> * _Nonnull)) {
- [self getMenuUserActionsForMessage:message withCompletionBlock:^(NSArray *menuItems) {
- completion(menuItems);
- }];
- }];
- return [UIMenu menuWithTitle:message.actorDisplayName children:@[deferredMenuElement]];
- }
- - (void)getMenuUserActionsForMessage:(NCChatMessage *)message withCompletionBlock:(GetMenuUserActionsForMessageCompletionBlock)block
- {
- TalkAccount *activeAccount = [[NCDatabaseManager sharedInstance] activeAccount];
- [[NCAPIController sharedInstance] getUserActionsForUser:message.actorId usingAccount:activeAccount withCompletionBlock:^(NSDictionary *userActions, NSError *error) {
- if (error) {
- if (block) {
- UIAction *errorAction = [UIAction actionWithTitle:NSLocalizedString(@"No actions available", nil) image:nil identifier:nil handler:^(UIAction *action) {}];
- errorAction.attributes = UIMenuElementAttributesDisabled;
- block(@[errorAction]);
- }
- return;
- }
- NSArray *actions = [userActions objectForKey:@"actions"];
- if (![actions isKindOfClass:[NSArray class]]) {
- if (block) {
- UIAction *errorAction = [UIAction actionWithTitle:NSLocalizedString(@"No actions available", nil) image:nil identifier:nil handler:^(UIAction *action) {}];
- errorAction.attributes = UIMenuElementAttributesDisabled;
- block(@[errorAction]);
- }
- return;
- }
- NSMutableArray *items = [[NSMutableArray alloc] init];
- for (NSDictionary *action in actions) {
- NSString *appId = [action objectForKey:@"appId"];
- NSString *title = [action objectForKey:@"title"];
- NSString *link = [action objectForKey:@"hyperlink"];
- // Talk to user action
- if ([appId isEqualToString:@"spreed"]) {
- UIAction *talkAction = [UIAction actionWithTitle:title
- image:[[UIImage imageNamed:@"talk-20"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]
- identifier:nil
- handler:^(UIAction *action) {
- NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] init];
- NSString *userId = [userActions objectForKey:@"userId"];
- [userInfo setObject:userId forKey:@"actorId"];
- [[NSNotificationCenter defaultCenter] postNotificationName:NSNotification.NCChatViewControllerTalkToUserNotification
- object:self
- userInfo:userInfo];
- }];
- [items addObject:talkAction];
- continue;
- }
- // Other user actions
- UIAction *otherAction = [UIAction actionWithTitle:title
- image:nil
- identifier:nil
- handler:^(UIAction *action) {
- NSURL *actionURL = [NSURL URLWithString:[link stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]];
- [[UIApplication sharedApplication] openURL:actionURL options:@{} completionHandler:nil];
- }];
- if ([appId isEqualToString:@"profile"]) {
- [otherAction setImage:[UIImage systemImageNamed:@"person"]];
- } else if ([appId isEqualToString:@"email"]) {
- [otherAction setImage:[UIImage systemImageNamed:@"envelope"]];
- } else if ([appId isEqualToString:@"timezone"]) {
- [otherAction setImage:[UIImage systemImageNamed:@"clock"]];
- } else if ([appId isEqualToString:@"social"]) {
- [otherAction setImage:[UIImage systemImageNamed:@"heart"]];
- }
- [items addObject:otherAction];
- }
- if (block) {
- block(items);
- }
- }];
- }
- @end
|