mirror of https://github.com/oxen-io/session-ios
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.
127 lines
5.2 KiB
Swift
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()
|
|
}
|
|
}
|
|
}
|