diff --git a/NextcloudTalk/NCChatMessage.m b/NextcloudTalk/NCChatMessage.m index 0eb396c2a..b1a422643 100644 --- a/NextcloudTalk/NCChatMessage.m +++ b/NextcloudTalk/NCChatMessage.m @@ -172,15 +172,30 @@ - (BOOL)isMessageFromUser:(NSString *)userId - (BOOL)isDeletableForAccount:(TalkAccount *)account andParticipantType:(NCParticipantType)participantType { NSInteger sixHoursAgoTimestamp = [[NSDate date] timeIntervalSince1970] - (6 * 3600); - BOOL canServerDeleteMessages = [[NCDatabaseManager sharedInstance] serverHasTalkCapability:kCapabilityDeleteMessages forAccountId:account.accountId]; - if ([self.messageType isEqualToString:kMessageTypeComment] && !self.isDeleting && !self.file && self.timestamp >= sixHoursAgoTimestamp && canServerDeleteMessages && - (participantType == kNCParticipantTypeOwner || participantType == kNCParticipantTypeModerator || [self isMessageFromUser:account.userId])) { + + BOOL severCanDeleteMessage = + // Delete normal messages + ([[NCDatabaseManager sharedInstance] serverHasTalkCapability:kCapabilityDeleteMessages forAccountId:account.accountId] && [self.messageType isEqualToString:kMessageTypeComment] && !self.file && ![self isObjectShare]) || + // Delete files or shared objects + ([[NCDatabaseManager sharedInstance] serverHasTalkCapability:kCapabilityRichObjectDelete forAccountId:account.accountId] && ([self.messageType isEqualToString:kMessageTypeVoiceMessage] || self.file || [self isObjectShare])); + + BOOL userCanDeleteMessage = (participantType == kNCParticipantTypeOwner || participantType == kNCParticipantTypeModerator || [self isMessageFromUser:account.userId]); + + if (severCanDeleteMessage && userCanDeleteMessage && !self.isDeleting && self.timestamp >= sixHoursAgoTimestamp) { return YES; } return NO; } +- (BOOL)isObjectShare +{ + if ([self.message isEqualToString:@"{object}"] && [self.messageParameters objectForKey:@"object"]) { + return YES; + } + return NO; +} + - (NCMessageParameter *)file; { if (!_fileParameter) { diff --git a/NextcloudTalk/NCChatViewController.m b/NextcloudTalk/NCChatViewController.m index c5eb27ddd..1f46f9371 100644 --- a/NextcloudTalk/NCChatViewController.m +++ b/NextcloudTalk/NCChatViewController.m @@ -963,11 +963,11 @@ - (void)setFailedStatusToMessageWithReferenceId:(NSString *)referenceId #pragma mark - Message updates -- (void)updateMessageWithReferenceId:(NSString *)referenceId withMessage:(NCChatMessage *)updatedMessage +- (void)updateMessageWithMessageId:(NSInteger)messageId withMessage:(NCChatMessage *)updatedMessage { dispatch_async(dispatch_get_main_queue(), ^{ NSMutableArray *reloadIndexPaths = [NSMutableArray new]; - NSIndexPath *indexPath = [self indexPathForMessageWithReferenceId:referenceId]; + NSIndexPath *indexPath = [self indexPathForMessageWithMessageId:messageId]; if (indexPath) { [reloadIndexPaths addObject:indexPath]; NSDate *keyDate = [self->_dateSections objectAtIndex:indexPath.section]; @@ -1274,7 +1274,7 @@ - (void)didPressDelete:(NCChatMessage *)message { NCChatMessage *deletingMessage = [message copy]; deletingMessage.message = NSLocalizedString(@"Deleting message", nil); deletingMessage.isDeleting = YES; - [self updateMessageWithReferenceId:deletingMessage.referenceId withMessage:deletingMessage]; + [self updateMessageWithMessageId:deletingMessage.messageId withMessage:deletingMessage]; // Delete message TalkAccount *activeAccount = [[NCDatabaseManager sharedInstance] activeAccount]; [[NCAPIController sharedInstance] deleteChatMessageInRoom:self->_room.token withMessageId:message.messageId forAccount:activeAccount withCompletionBlock:^(NSDictionary *messageDict, NSError *error, NSInteger statusCode) { @@ -1286,7 +1286,7 @@ - (void)didPressDelete:(NCChatMessage *)message { } NCChatMessage *deleteMessage = [NCChatMessage messageWithDictionary:[messageDict objectForKey:@"parent"] andAccountId:activeAccount.accountId]; if (deleteMessage) { - [self updateMessageWithReferenceId:deleteMessage.referenceId withMessage:deleteMessage]; + [self updateMessageWithMessageId:deleteMessage.messageId withMessage:deleteMessage]; } } else if (error) { if (statusCode == 400) { @@ -1297,7 +1297,7 @@ - (void)didPressDelete:(NCChatMessage *)message { [self.view makeToast:NSLocalizedString(@"An error occurred while deleting the message", nil) duration:5 position:CSToastPositionCenter]; } // Set back original message on failure - [self updateMessageWithReferenceId:message.referenceId withMessage:message]; + [self updateMessageWithMessageId:message.messageId withMessage:message]; } }]; } @@ -2478,7 +2478,7 @@ - (void)didReceiveDeletedMessage:(NSNotification *)notification NCChatMessage *message = [notification.userInfo objectForKey:@"deleteMessage"]; NCChatMessage *deleteMessage = message.parent; if (deleteMessage) { - [self updateMessageWithReferenceId:deleteMessage.referenceId withMessage:deleteMessage]; + [self updateMessageWithMessageId:deleteMessage.messageId withMessage:deleteMessage]; } } @@ -2671,6 +2671,24 @@ - (NSIndexPath *)indexPathForMessage:(NCChatMessage *)message return nil; } +- (NSIndexPath *)indexPathForMessageWithMessageId:(NSInteger)messageId +{ + for (NSInteger i = _dateSections.count - 1; i >= 0; i--) { + NSDate *keyDate = [_dateSections objectAtIndex:i]; + NSMutableArray *messages = [_messages objectForKey:keyDate]; + NCChatMessage *firstMessage = messages.firstObject; + if (firstMessage.messageId > messageId) continue; + for (NSInteger j = messages.count - 1; j >= 0; j--) { + NCChatMessage *currentMessage = messages[j]; + if (currentMessage.messageId == messageId) { + return [NSIndexPath indexPathForRow:j inSection:i]; + } + } + } + + return nil; +} + - (NSIndexPath *)indexPathForMessageWithReferenceId:(NSString *)referenceId { for (NSInteger i = _dateSections.count - 1; i >= 0; i--) { diff --git a/NextcloudTalk/NCDatabaseManager.h b/NextcloudTalk/NCDatabaseManager.h index 394bb06cb..d8afe0bdc 100644 --- a/NextcloudTalk/NCDatabaseManager.h +++ b/NextcloudTalk/NCDatabaseManager.h @@ -57,6 +57,7 @@ extern NSString * const kCapabilityDirectMentionFlag; extern NSString * const kCapabilityNotificationCalls; extern NSString * const kCapabilityConversationPermissions; extern NSString * const kCapabilityChatUnread; +extern NSString * const kCapabilityRichObjectDelete; extern NSString * const kMinimumRequiredTalkCapability; diff --git a/NextcloudTalk/NCDatabaseManager.m b/NextcloudTalk/NCDatabaseManager.m index c9534e760..dc878c07b 100644 --- a/NextcloudTalk/NCDatabaseManager.m +++ b/NextcloudTalk/NCDatabaseManager.m @@ -59,6 +59,7 @@ NSString * const kCapabilityNotificationCalls = @"notification-calls"; NSString * const kCapabilityConversationPermissions = @"conversation-permissions"; NSString * const kCapabilityChatUnread = @"chat-unread"; +NSString * const kCapabilityRichObjectDelete = @"rich-object-delete"; NSString * const kMinimumRequiredTalkCapability = kCapabilitySystemMessages; // Talk 4.0 is the minimum required version