| 
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -21,7 +21,7 @@ extension ContextMenuVC {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        let actionType: ActionType
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        let shouldDismissInfoScreen: Bool
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        let accessibilityLabel: String?
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        let work: () -> Void
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        let work: ((() -> Void)?) -> Void
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        enum ActionType {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            case emoji
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -41,7 +41,7 @@ extension ContextMenuVC {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            actionType: ActionType = .generic,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            shouldDismissInfoScreen: Bool = false,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            accessibilityLabel: String? = nil,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            work: @escaping () -> Void
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            work: @escaping ((() -> Void)?) -> Void
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        ) {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            self.icon = icon
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            self.title = title
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -61,7 +61,7 @@ extension ContextMenuVC {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                icon: UIImage(named: "ic_info"),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                title: "info".localized(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                accessibilityLabel: "Message info"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { delegate?.info(cellViewModel) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { _ in delegate?.info(cellViewModel) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        static func retry(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -72,7 +72,7 @@ extension ContextMenuVC {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                    "resend".localized()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                ),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                accessibilityLabel: (cellViewModel.state == .failedToSync ? "Resync message" : "Resend message")
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { delegate?.retry(cellViewModel) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { _ in delegate?.retry(cellViewModel) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        static func reply(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -81,7 +81,7 @@ extension ContextMenuVC {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                title: "reply".localized(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                shouldDismissInfoScreen: true,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                accessibilityLabel: "Reply to message"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { delegate?.reply(cellViewModel) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { _ in delegate?.reply(cellViewModel) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        static func copy(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -90,7 +90,7 @@ extension ContextMenuVC {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                title: "copy".localized(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                feedback: "copied".localized(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                accessibilityLabel: "Copy text"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { delegate?.copy(cellViewModel) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { _ in delegate?.copy(cellViewModel) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        static func copySessionID(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -99,7 +99,7 @@ extension ContextMenuVC {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                title: "accountIDCopy".localized(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                feedback: "copied".localized(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                accessibilityLabel: "Copy Session ID"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { delegate?.copySessionID(cellViewModel) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { _ in delegate?.copySessionID(cellViewModel) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        static func delete(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -113,7 +113,7 @@ extension ContextMenuVC {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                themeColor: .danger,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                shouldDismissInfoScreen: true,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                accessibilityLabel: "Delete message"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { delegate?.delete(cellViewModel) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { completion in delegate?.delete(cellViewModel, completion: completion) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        static func save(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -122,7 +122,7 @@ extension ContextMenuVC {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                title: "save".localized(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                feedback: "saved".localized(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                accessibilityLabel: "Save attachment"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { delegate?.save(cellViewModel) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { _ in delegate?.save(cellViewModel) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        static func ban(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -131,7 +131,7 @@ extension ContextMenuVC {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                title: "banUser".localized(),
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                themeColor: .danger,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                accessibilityLabel: "Ban user"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { delegate?.ban(cellViewModel) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { completion in delegate?.ban(cellViewModel, completion: completion) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        static func banAndDeleteAllMessages(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action {
 | 
			
		
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
			
			 | 
			 | 
			
				@ -141,27 +141,27 @@ extension ContextMenuVC {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                themeColor: .danger,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                shouldDismissInfoScreen: true,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                accessibilityLabel: "Ban user and delete"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { delegate?.banAndDeleteAllMessages(cellViewModel) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { completion in delegate?.banAndDeleteAllMessages(cellViewModel, completion: completion) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        static func react(_ cellViewModel: MessageViewModel, _ emoji: EmojiWithSkinTones, _ delegate: ContextMenuActionDelegate?) -> Action {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return Action(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                title: emoji.rawValue,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                actionType: .emoji
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { delegate?.react(cellViewModel, with: emoji) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { _ in delegate?.react(cellViewModel, with: emoji) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        static func emojiPlusButton(_ cellViewModel: MessageViewModel, _ delegate: ContextMenuActionDelegate?) -> Action {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return Action(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                actionType: .emojiPlus,
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                accessibilityLabel: "Add emoji"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { delegate?.showFullEmojiKeyboard(cellViewModel) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { _ in delegate?.showFullEmojiKeyboard(cellViewModel) }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        static func dismiss(_ delegate: ContextMenuActionDelegate?) -> Action {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            return Action(
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				                actionType: .dismiss
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { delegate?.contextMenuDismissed() }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				            ) { _ in delegate?.contextMenuDismissed() }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				        }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    }
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
			
			 | 
			 | 
			
				@ -308,10 +308,10 @@ protocol ContextMenuActionDelegate {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    func reply(_ cellViewModel: MessageViewModel)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    func copy(_ cellViewModel: MessageViewModel)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    func copySessionID(_ cellViewModel: MessageViewModel)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    func delete(_ cellViewModel: MessageViewModel)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    func delete(_ cellViewModel: MessageViewModel, completion: (() -> Void)?)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    func save(_ cellViewModel: MessageViewModel)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    func ban(_ cellViewModel: MessageViewModel)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    func banAndDeleteAllMessages(_ cellViewModel: MessageViewModel)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    func ban(_ cellViewModel: MessageViewModel, completion: (() -> Void)?)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    func banAndDeleteAllMessages(_ cellViewModel: MessageViewModel, completion: (() -> Void)?)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    func react(_ cellViewModel: MessageViewModel, with emoji: EmojiWithSkinTones)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    func showFullEmojiKeyboard(_ cellViewModel: MessageViewModel)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				    func contextMenuDismissed()
 | 
			
		
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
			
			 | 
			 | 
			
				
 
 |