2018-07-12 20:47:54 +02:00
|
|
|
//
|
|
|
|
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
import Foundation
|
|
|
|
|
|
|
|
@objc
|
|
|
|
protocol MessageActionsDelegate: class {
|
2020-02-06 04:13:07 +01:00
|
|
|
func report(_ conversationViewItem: ConversationViewItem)
|
2018-07-12 20:47:54 +02:00
|
|
|
func messageActionsShowDetailsForItem(_ conversationViewItem: ConversationViewItem)
|
|
|
|
func messageActionsReplyToItem(_ conversationViewItem: ConversationViewItem)
|
2019-09-12 05:30:07 +02:00
|
|
|
func copyPublicKey(for conversationViewItem: ConversationViewItem)
|
2018-07-12 20:47:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
struct MessageActionBuilder {
|
|
|
|
static func reply(conversationViewItem: ConversationViewItem, delegate: MessageActionsDelegate) -> MenuAction {
|
|
|
|
return MenuAction(image: #imageLiteral(resourceName: "ic_reply"),
|
|
|
|
title: NSLocalizedString("MESSAGE_ACTION_REPLY", comment: "Action sheet button title"),
|
|
|
|
subtitle: nil,
|
|
|
|
block: { [weak delegate] (_) in
|
|
|
|
delegate?.messageActionsReplyToItem(conversationViewItem)
|
|
|
|
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
static func copyText(conversationViewItem: ConversationViewItem, delegate: MessageActionsDelegate) -> MenuAction {
|
|
|
|
return MenuAction(image: #imageLiteral(resourceName: "ic_copy"),
|
|
|
|
title: NSLocalizedString("MESSAGE_ACTION_COPY_TEXT", comment: "Action sheet button title"),
|
|
|
|
subtitle: nil,
|
|
|
|
block: { (_) in
|
|
|
|
conversationViewItem.copyTextAction()
|
|
|
|
})
|
|
|
|
}
|
2019-09-12 05:30:07 +02:00
|
|
|
|
|
|
|
static func copyPublicKey(conversationViewItem: ConversationViewItem, delegate: MessageActionsDelegate) -> MenuAction {
|
2020-09-16 02:32:23 +02:00
|
|
|
return MenuAction(image: #imageLiteral(resourceName: "Key").scaled(to: CGSize(width: 24, height: 24)),
|
2020-01-08 06:10:12 +01:00
|
|
|
title: NSLocalizedString("Copy Session ID", comment: ""),
|
2019-09-12 05:30:07 +02:00
|
|
|
subtitle: nil,
|
|
|
|
block: { [weak delegate] _ in delegate?.copyPublicKey(for: conversationViewItem) }
|
|
|
|
)
|
|
|
|
}
|
2018-07-12 20:47:54 +02:00
|
|
|
|
|
|
|
static func showDetails(conversationViewItem: ConversationViewItem, delegate: MessageActionsDelegate) -> MenuAction {
|
|
|
|
return MenuAction(image: #imageLiteral(resourceName: "ic_info"),
|
|
|
|
title: NSLocalizedString("MESSAGE_ACTION_DETAILS", comment: "Action sheet button title"),
|
|
|
|
subtitle: nil,
|
|
|
|
block: { [weak delegate] (_) in
|
|
|
|
delegate?.messageActionsShowDetailsForItem(conversationViewItem)
|
|
|
|
})
|
|
|
|
}
|
2020-02-06 04:13:07 +01:00
|
|
|
|
|
|
|
static func report(_ conversationViewItem: ConversationViewItem, delegate: MessageActionsDelegate) -> MenuAction {
|
|
|
|
return MenuAction(image: #imageLiteral(resourceName: "Flag"),
|
|
|
|
title: NSLocalizedString("Report", comment: ""),
|
|
|
|
subtitle: nil,
|
|
|
|
block: { [weak delegate] _ in delegate?.report(conversationViewItem) }
|
|
|
|
)
|
|
|
|
}
|
2018-07-12 20:47:54 +02:00
|
|
|
|
|
|
|
static func deleteMessage(conversationViewItem: ConversationViewItem, delegate: MessageActionsDelegate) -> MenuAction {
|
|
|
|
return MenuAction(image: #imageLiteral(resourceName: "ic_trash"),
|
|
|
|
title: NSLocalizedString("MESSAGE_ACTION_DELETE_MESSAGE", comment: "Action sheet button title"),
|
2019-09-02 06:39:02 +02:00
|
|
|
subtitle: nil,
|
2018-07-12 20:47:54 +02:00
|
|
|
block: { (_) in
|
|
|
|
conversationViewItem.deleteAction()
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
static func copyMedia(conversationViewItem: ConversationViewItem, delegate: MessageActionsDelegate) -> MenuAction {
|
|
|
|
return MenuAction(image: #imageLiteral(resourceName: "ic_copy"),
|
|
|
|
title: NSLocalizedString("MESSAGE_ACTION_COPY_MEDIA", comment: "Action sheet button title"),
|
|
|
|
subtitle: nil,
|
|
|
|
block: { (_) in
|
|
|
|
conversationViewItem.copyMediaAction()
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
static func saveMedia(conversationViewItem: ConversationViewItem, delegate: MessageActionsDelegate) -> MenuAction {
|
|
|
|
return MenuAction(image: #imageLiteral(resourceName: "ic_download"),
|
|
|
|
title: NSLocalizedString("MESSAGE_ACTION_SAVE_MEDIA", comment: "Action sheet button title"),
|
|
|
|
subtitle: nil,
|
|
|
|
block: { (_) in
|
|
|
|
conversationViewItem.saveMediaAction()
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-09-28 00:49:01 +02:00
|
|
|
@objc
|
|
|
|
class ConversationViewItemActions: NSObject {
|
2018-07-12 20:47:54 +02:00
|
|
|
|
|
|
|
@objc
|
2018-12-18 19:35:49 +01:00
|
|
|
class func textActions(conversationViewItem: ConversationViewItem, shouldAllowReply: Bool, delegate: MessageActionsDelegate) -> [MenuAction] {
|
2018-07-12 20:47:54 +02:00
|
|
|
var actions: [MenuAction] = []
|
|
|
|
|
2019-09-11 06:07:51 +02:00
|
|
|
let isGroup = conversationViewItem.isGroupThread;
|
2019-08-21 03:50:23 +02:00
|
|
|
|
2020-11-16 00:34:47 +01:00
|
|
|
if shouldAllowReply {
|
2018-12-17 22:15:51 +01:00
|
|
|
let replyAction = MessageActionBuilder.reply(conversationViewItem: conversationViewItem, delegate: delegate)
|
|
|
|
actions.append(replyAction)
|
|
|
|
}
|
2018-07-12 20:47:54 +02:00
|
|
|
|
2018-09-28 00:49:01 +02:00
|
|
|
if conversationViewItem.hasBodyTextActionContent {
|
|
|
|
let copyTextAction = MessageActionBuilder.copyText(conversationViewItem: conversationViewItem, delegate: delegate)
|
2018-07-12 20:47:54 +02:00
|
|
|
actions.append(copyTextAction)
|
|
|
|
}
|
2019-09-12 05:30:07 +02:00
|
|
|
|
2020-11-16 00:34:47 +01:00
|
|
|
if isGroup && conversationViewItem.interaction is TSIncomingMessage {
|
2019-09-12 05:30:07 +02:00
|
|
|
let copyPublicKeyAction = MessageActionBuilder.copyPublicKey(conversationViewItem: conversationViewItem, delegate: delegate)
|
|
|
|
actions.append(copyPublicKeyAction)
|
|
|
|
}
|
2018-07-12 20:47:54 +02:00
|
|
|
|
2019-09-02 05:27:12 +02:00
|
|
|
if !isGroup || conversationViewItem.userCanDeleteGroupMessage {
|
2019-08-21 03:50:23 +02:00
|
|
|
let deleteAction = MessageActionBuilder.deleteMessage(conversationViewItem: conversationViewItem, delegate: delegate)
|
|
|
|
actions.append(deleteAction)
|
|
|
|
}
|
2018-07-12 20:47:54 +02:00
|
|
|
|
2020-06-16 03:01:31 +02:00
|
|
|
if isGroup && conversationViewItem.interaction.thread.name() == "Loki Public Chat"
|
|
|
|
|| conversationViewItem.interaction.thread.name() == "Session Public Chat" {
|
2020-02-06 04:13:07 +01:00
|
|
|
let reportAction = MessageActionBuilder.report(conversationViewItem, delegate: delegate)
|
|
|
|
actions.append(reportAction)
|
|
|
|
}
|
|
|
|
|
2018-09-28 00:49:01 +02:00
|
|
|
let showDetailsAction = MessageActionBuilder.showDetails(conversationViewItem: conversationViewItem, delegate: delegate)
|
2018-07-12 20:47:54 +02:00
|
|
|
actions.append(showDetailsAction)
|
|
|
|
|
|
|
|
return actions
|
|
|
|
}
|
|
|
|
|
|
|
|
@objc
|
2018-12-18 19:35:49 +01:00
|
|
|
class func mediaActions(conversationViewItem: ConversationViewItem, shouldAllowReply: Bool, delegate: MessageActionsDelegate) -> [MenuAction] {
|
2018-07-12 20:47:54 +02:00
|
|
|
var actions: [MenuAction] = []
|
|
|
|
|
2019-11-14 06:47:02 +01:00
|
|
|
let isGroup = conversationViewItem.isGroupThread;
|
|
|
|
|
2020-11-16 00:34:47 +01:00
|
|
|
if shouldAllowReply {
|
2018-12-17 22:15:51 +01:00
|
|
|
let replyAction = MessageActionBuilder.reply(conversationViewItem: conversationViewItem, delegate: delegate)
|
|
|
|
actions.append(replyAction)
|
|
|
|
}
|
2018-07-12 20:47:54 +02:00
|
|
|
|
2018-09-28 00:49:01 +02:00
|
|
|
if conversationViewItem.hasMediaActionContent {
|
2018-11-06 16:08:14 +01:00
|
|
|
if conversationViewItem.canCopyMedia() {
|
|
|
|
let copyMediaAction = MessageActionBuilder.copyMedia(conversationViewItem: conversationViewItem, delegate: delegate)
|
|
|
|
actions.append(copyMediaAction)
|
|
|
|
}
|
2018-09-28 00:49:01 +02:00
|
|
|
if conversationViewItem.canSaveMedia() {
|
|
|
|
let saveMediaAction = MessageActionBuilder.saveMedia(conversationViewItem: conversationViewItem, delegate: delegate)
|
2018-08-07 23:38:59 +02:00
|
|
|
actions.append(saveMediaAction)
|
|
|
|
}
|
2018-07-12 20:47:54 +02:00
|
|
|
}
|
2020-02-14 01:03:25 +01:00
|
|
|
|
2020-11-16 00:34:47 +01:00
|
|
|
if isGroup && conversationViewItem.interaction is TSIncomingMessage {
|
2020-02-14 01:03:25 +01:00
|
|
|
let copyPublicKeyAction = MessageActionBuilder.copyPublicKey(conversationViewItem: conversationViewItem, delegate: delegate)
|
|
|
|
actions.append(copyPublicKeyAction)
|
|
|
|
}
|
2018-07-12 20:47:54 +02:00
|
|
|
|
2019-11-14 06:47:02 +01:00
|
|
|
if !isGroup || conversationViewItem.userCanDeleteGroupMessage {
|
|
|
|
let deleteAction = MessageActionBuilder.deleteMessage(conversationViewItem: conversationViewItem, delegate: delegate)
|
|
|
|
actions.append(deleteAction)
|
|
|
|
}
|
2018-07-12 20:47:54 +02:00
|
|
|
|
2020-06-16 03:01:31 +02:00
|
|
|
if isGroup && conversationViewItem.interaction.thread.name() == "Loki Public Chat"
|
|
|
|
|| conversationViewItem.interaction.thread.name() == "Session Public Chat" {
|
2020-02-06 04:13:07 +01:00
|
|
|
let reportAction = MessageActionBuilder.report(conversationViewItem, delegate: delegate)
|
|
|
|
actions.append(reportAction)
|
|
|
|
}
|
|
|
|
|
2018-09-28 00:49:01 +02:00
|
|
|
let showDetailsAction = MessageActionBuilder.showDetails(conversationViewItem: conversationViewItem, delegate: delegate)
|
2018-07-12 20:47:54 +02:00
|
|
|
actions.append(showDetailsAction)
|
|
|
|
|
|
|
|
return actions
|
|
|
|
}
|
|
|
|
|
|
|
|
@objc
|
2018-12-18 19:35:49 +01:00
|
|
|
class func quotedMessageActions(conversationViewItem: ConversationViewItem, shouldAllowReply: Bool, delegate: MessageActionsDelegate) -> [MenuAction] {
|
2018-12-17 22:15:51 +01:00
|
|
|
var actions: [MenuAction] = []
|
|
|
|
|
2018-12-18 19:35:49 +01:00
|
|
|
if shouldAllowReply {
|
2018-12-17 22:15:51 +01:00
|
|
|
let replyAction = MessageActionBuilder.reply(conversationViewItem: conversationViewItem, delegate: delegate)
|
|
|
|
actions.append(replyAction)
|
|
|
|
}
|
|
|
|
|
2019-09-12 02:38:10 +02:00
|
|
|
let isGroup = conversationViewItem.isGroupThread;
|
2019-09-12 05:30:07 +02:00
|
|
|
|
2020-11-16 00:34:47 +01:00
|
|
|
if isGroup && conversationViewItem.interaction is TSIncomingMessage {
|
2019-09-12 05:30:07 +02:00
|
|
|
let copyPublicKeyAction = MessageActionBuilder.copyPublicKey(conversationViewItem: conversationViewItem, delegate: delegate)
|
|
|
|
actions.append(copyPublicKeyAction)
|
|
|
|
}
|
2019-09-12 02:38:10 +02:00
|
|
|
|
|
|
|
if !isGroup || conversationViewItem.userCanDeleteGroupMessage {
|
|
|
|
let deleteAction = MessageActionBuilder.deleteMessage(conversationViewItem: conversationViewItem, delegate: delegate)
|
|
|
|
actions.append(deleteAction)
|
|
|
|
}
|
2018-12-18 17:03:00 +01:00
|
|
|
|
2020-06-16 03:01:31 +02:00
|
|
|
if isGroup && conversationViewItem.interaction.thread.name() == "Loki Public Chat"
|
|
|
|
|| conversationViewItem.interaction.thread.name() == "Session Public Chat" {
|
2020-02-06 04:13:07 +01:00
|
|
|
let reportAction = MessageActionBuilder.report(conversationViewItem, delegate: delegate)
|
|
|
|
actions.append(reportAction)
|
|
|
|
}
|
|
|
|
|
2018-09-28 00:49:01 +02:00
|
|
|
let showDetailsAction = MessageActionBuilder.showDetails(conversationViewItem: conversationViewItem, delegate: delegate)
|
2018-12-17 22:15:51 +01:00
|
|
|
actions.append(showDetailsAction)
|
2018-07-12 20:47:54 +02:00
|
|
|
|
2018-12-17 22:15:51 +01:00
|
|
|
return actions
|
2018-07-12 20:47:54 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@objc
|
2018-09-28 00:49:01 +02:00
|
|
|
class func infoMessageActions(conversationViewItem: ConversationViewItem, delegate: MessageActionsDelegate) -> [MenuAction] {
|
|
|
|
let deleteAction = MessageActionBuilder.deleteMessage(conversationViewItem: conversationViewItem, delegate: delegate)
|
2018-12-17 22:15:51 +01:00
|
|
|
return [deleteAction ]
|
2018-07-12 20:47:54 +02:00
|
|
|
}
|
|
|
|
}
|