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.
		
		
		
		
		
			
		
			
				
	
	
		
			95 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			95 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Swift
		
	
 | 
						|
extension ContextMenuVC {
 | 
						|
 | 
						|
    struct Action {
 | 
						|
        let icon: UIImage
 | 
						|
        let title: String
 | 
						|
        let work: () -> Void
 | 
						|
 | 
						|
        static func reply(_ viewItem: ConversationViewItem, _ delegate: ContextMenuActionDelegate?) -> Action {
 | 
						|
            let title = NSLocalizedString("context_menu_reply", comment: "")
 | 
						|
            return Action(icon: UIImage(named: "ic_reply")!, title: title) { delegate?.reply(viewItem) }
 | 
						|
        }
 | 
						|
 | 
						|
        static func copy(_ viewItem: ConversationViewItem, _ delegate: ContextMenuActionDelegate?) -> Action {
 | 
						|
            let title = NSLocalizedString("copy", comment: "")
 | 
						|
            return Action(icon: UIImage(named: "ic_copy")!, title: title) { delegate?.copy(viewItem) }
 | 
						|
        }
 | 
						|
 | 
						|
        static func copySessionID(_ viewItem: ConversationViewItem, _ delegate: ContextMenuActionDelegate?) -> Action {
 | 
						|
            let title = NSLocalizedString("vc_conversation_settings_copy_session_id_button_title", comment: "")
 | 
						|
            return Action(icon: UIImage(named: "ic_copy")!, title: title) { delegate?.copySessionID(viewItem) }
 | 
						|
        }
 | 
						|
 | 
						|
        static func delete(_ viewItem: ConversationViewItem, _ delegate: ContextMenuActionDelegate?) -> Action {
 | 
						|
            let title = NSLocalizedString("TXT_DELETE_TITLE", comment: "")
 | 
						|
            return Action(icon: UIImage(named: "ic_trash")!, title: title) { delegate?.delete(viewItem) }
 | 
						|
        }
 | 
						|
 | 
						|
        static func save(_ viewItem: ConversationViewItem, _ delegate: ContextMenuActionDelegate?) -> Action {
 | 
						|
            let title = NSLocalizedString("context_menu_save", comment: "")
 | 
						|
            return Action(icon: UIImage(named: "ic_download")!, title: title) { delegate?.save(viewItem) }
 | 
						|
        }
 | 
						|
 | 
						|
        static func ban(_ viewItem: ConversationViewItem, _ delegate: ContextMenuActionDelegate?) -> Action {
 | 
						|
            let title = NSLocalizedString("context_menu_ban_user", comment: "")
 | 
						|
            return Action(icon: UIImage(named: "ic_block")!, title: title) { delegate?.ban(viewItem) }
 | 
						|
        }
 | 
						|
        
 | 
						|
        static func banAndDeleteAllMessages(_ viewItem: ConversationViewItem, _ delegate: ContextMenuActionDelegate?) -> Action {
 | 
						|
            let title = NSLocalizedString("context_menu_ban_and_delete_all", comment: "")
 | 
						|
            return Action(icon: UIImage(named: "ic_block")!, title: title) { delegate?.banAndDeleteAllMessages(viewItem) }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    static func actions(for viewItem: ConversationViewItem, delegate: ContextMenuActionDelegate?) -> [Action] {
 | 
						|
        func isReplyingAllowed() -> Bool {
 | 
						|
            guard let message = viewItem.interaction as? TSOutgoingMessage else { return true }
 | 
						|
            switch message.messageState {
 | 
						|
            case .failed, .sending: return false
 | 
						|
            default: return true
 | 
						|
            }
 | 
						|
        }
 | 
						|
        switch viewItem.messageCellType {
 | 
						|
        case .textOnlyMessage:
 | 
						|
            var result: [Action] = []
 | 
						|
            if isReplyingAllowed() { result.append(Action.reply(viewItem, delegate)) }
 | 
						|
            result.append(Action.copy(viewItem, delegate))
 | 
						|
            let isGroup = viewItem.isGroupThread
 | 
						|
            if isGroup && viewItem.interaction is TSIncomingMessage { result.append(Action.copySessionID(viewItem, delegate)) }
 | 
						|
            if !isGroup || viewItem.userCanDeleteGroupMessage { result.append(Action.delete(viewItem, delegate)) }
 | 
						|
            if isGroup && viewItem.interaction is TSIncomingMessage && viewItem.userHasModerationPermission {
 | 
						|
                result.append(Action.ban(viewItem, delegate))
 | 
						|
                result.append(Action.banAndDeleteAllMessages(viewItem, delegate))
 | 
						|
            }
 | 
						|
            return result
 | 
						|
        case .mediaMessage, .audio, .genericAttachment:
 | 
						|
            var result: [Action] = []
 | 
						|
            if isReplyingAllowed() { result.append(Action.reply(viewItem, delegate)) }
 | 
						|
            if viewItem.canCopyMedia() { result.append(Action.copy(viewItem, delegate)) }
 | 
						|
            if viewItem.canSaveMedia() { result.append(Action.save(viewItem, delegate)) }
 | 
						|
            let isGroup = viewItem.isGroupThread
 | 
						|
            if isGroup && viewItem.interaction is TSIncomingMessage { result.append(Action.copySessionID(viewItem, delegate)) }
 | 
						|
            if !isGroup || viewItem.userCanDeleteGroupMessage { result.append(Action.delete(viewItem, delegate)) }
 | 
						|
            if isGroup && viewItem.interaction is TSIncomingMessage && viewItem.userHasModerationPermission {
 | 
						|
                result.append(Action.ban(viewItem, delegate))
 | 
						|
                result.append(Action.banAndDeleteAllMessages(viewItem, delegate))
 | 
						|
            }
 | 
						|
            return result
 | 
						|
        default: return []
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
// MARK: Delegate
 | 
						|
protocol ContextMenuActionDelegate : AnyObject {
 | 
						|
    
 | 
						|
    func reply(_ viewItem: ConversationViewItem)
 | 
						|
    func copy(_ viewItem: ConversationViewItem)
 | 
						|
    func copySessionID(_ viewItem: ConversationViewItem)
 | 
						|
    func delete(_ viewItem: ConversationViewItem)
 | 
						|
    func save(_ viewItem: ConversationViewItem)
 | 
						|
    func ban(_ viewItem: ConversationViewItem)
 | 
						|
    func banAndDeleteAllMessages(_ viewItem: ConversationViewItem)
 | 
						|
}
 |