Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 18 additions & 3 deletions NextcloudTalk/NCChatMessage.m
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
30 changes: 24 additions & 6 deletions NextcloudTalk/NCChatViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down Expand Up @@ -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) {
Expand All @@ -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) {
Expand All @@ -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];
}
}];
}
Expand Down Expand Up @@ -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];
}
}

Expand Down Expand Up @@ -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--) {
Expand Down
1 change: 1 addition & 0 deletions NextcloudTalk/NCDatabaseManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
1 change: 1 addition & 0 deletions NextcloudTalk/NCDatabaseManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down