You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-ios/Session/Conversations/ConversationViewItem+Refact...

127 lines
5.2 KiB
Swift

// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
import Foundation
import SessionSnodeKit
import SessionMessagingKit
extension ConversationViewItem {
func deleteLocallyAction() {
guard let message: TSMessage = self.interaction as? TSMessage else { return }
Storage.write { transaction in
MessageInvalidator.invalidate(message, with: transaction)
message.remove(with: transaction)
if message.interactionType() == .outgoingMessage {
Storage.shared.cancelPendingMessageSendJobIfNeeded(for: message.timestamp, using: transaction)
}
}
}
func deleteRemotelyAction() {
guard let message: TSMessage = self.interaction as? TSMessage else { return }
if isGroupThread {
guard let groupThread: TSGroupThread = message.thread as? TSGroupThread else { return }
// Only allow deletion on incoming and outgoing messages
guard message.interactionType() == .incomingMessage || message.interactionType() == .outgoingMessage else {
return
}
if groupThread.isOpenGroup {
// Make sure it's an open group message and get the open group
guard message.isOpenGroupMessage, let uniqueId: String = groupThread.uniqueId, let openGroup: OpenGroup = Storage.shared.getOpenGroup(for: uniqueId) else {
return
}
// If it's an incoming message the user must have moderator status
if message.interactionType() == .incomingMessage {
guard let userPublicKey: String = Storage.shared.getUserPublicKey() else { return }
if !OpenGroupManager.isUserModeratorOrAdmin(userPublicKey, for: openGroup.room, on: openGroup.server) {
return
}
}
// Delete the message
OpenGroupAPI.messageDelete(message.openGroupServerMessageID, in: openGroup.room, on: openGroup.server)
.catch { _ in
// Roll back
message.save()
}
.retainUntilComplete()
}
else {
guard let serverHash: String = message.serverHash else { return }
let groupPublicKey: String = LKGroupUtilities.getDecodedGroupID(groupThread.groupModel.groupId)
SnodeAPI.deleteMessage(publicKey: groupPublicKey, serverHashes: [serverHash])
.catch { _ in
// Roll back
message.save()
}
.retainUntilComplete()
}
}
else {
guard let contactThread: TSContactThread = message.thread as? TSContactThread, let serverHash: String = message.serverHash else {
return
}
SnodeAPI.deleteMessage(publicKey: contactThread.contactSessionID(), serverHashes: [serverHash])
.catch { _ in
// Roll back
message.save()
}
.retainUntilComplete()
}
}
// Remove this after the unsend request is enabled
func deleteAction() {
Storage.write { transaction in
self.interaction.remove(with: transaction)
if self.interaction.interactionType() == .outgoingMessage {
Storage.shared.cancelPendingMessageSendJobIfNeeded(for: self.interaction.timestamp, using: transaction)
}
}
if self.isGroupThread {
guard let message: TSMessage = self.interaction as? TSMessage, let groupThread: TSGroupThread = message.thread as? TSGroupThread else {
return
}
// Only allow deletion on incoming and outgoing messages
guard message.interactionType() == .incomingMessage || message.interactionType() == .outgoingMessage else {
return
}
// Make sure it's an open group message and get the open group
guard message.isOpenGroupMessage, let uniqueId: String = groupThread.uniqueId, let openGroup: OpenGroup = Storage.shared.getOpenGroup(for: uniqueId) else {
return
}
// If it's an incoming message the user must have moderator status
if message.interactionType() == .incomingMessage {
guard let userPublicKey: String = Storage.shared.getUserPublicKey() else { return }
if !OpenGroupManager.isUserModeratorOrAdmin(userPublicKey, for: openGroup.room, on: openGroup.server) {
return
}
}
// Delete the message
OpenGroupAPI.messageDelete(message.openGroupServerMessageID, in: openGroup.room, on: openGroup.server)
.catch { _ in
// Roll back
message.save()
}
.retainUntilComplete()
}
}
}