Переглянути джерело

Merge pull request #1664 from deltachat/message_resent

implement resend message feature
cyBerta 2 роки тому
батько
коміт
99bfe32e59

+ 4 - 0
DcCore/DcCore/DC/Wrapper.swift

@@ -425,6 +425,10 @@ public class DcContext {
         dc_delete_msgs(contextPointer, msgIds.compactMap { UInt32($0) }, Int32(msgIds.count))
     }
 
+    public func resendMessages(msgIds: [Int]) {
+        dc_resend_msgs(contextPointer, msgIds.compactMap { UInt32($0) }, Int32(msgIds.count))
+    }
+
     public func forwardMessage(with msgId: Int, to chat: Int) {
         dc_forward_msgs(contextPointer, [UInt32(msgId)], 1, UInt32(chat))
     }

+ 34 - 1
deltachat-ios/Chat/ChatViewController.swift

@@ -1382,7 +1382,22 @@ class ChatViewController: UITableViewController {
             }))
         present(alert, animated: true, completion: nil)
     }
-    
+
+    private func showMoreMenu() {
+        let alert = UIAlertController(title: nil, message: nil, preferredStyle: .safeActionSheet)
+        alert.addAction(UIAlertAction(title: String.localized("resend"), style: .default, handler: onResendActionPressed(_:)))
+        alert.addAction(UIAlertAction(title: String.localized("cancel"), style: .cancel, handler: nil))
+        present(alert, animated: true, completion: nil)
+    }
+
+    private func onResendActionPressed(_ action: UIAlertAction) {
+        if let rows = tableView.indexPathsForSelectedRows {
+            let selectedMsgIds = rows.compactMap { messageIds[$0.row] }
+            dcContext.resendMessages(msgIds: selectedMsgIds)
+            setEditing(isEditing: false)
+        }
+    }
+
     private func askToDeleteChat() {
         let title = String.localized(stringID: "ask_delete_chat", count: 1)
         confirmationAlert(title: title, actionTitle: String.localized("delete"), actionStyle: .destructive,
@@ -1905,6 +1920,20 @@ class ChatViewController: UITableViewController {
         } else {
             editingBar.isEnabled = false
         }
+        evaluateMoreButton()
+    }
+
+    func evaluateMoreButton() {
+        if let rows = tableView.indexPathsForSelectedRows {
+            let ids = rows.compactMap { messageIds[$0.row] }
+            for msgId in ids {
+                if !dcContext.getMessage(id: msgId).isFromCurrentSender {
+                    editingBar.moreButton.isEnabled = false
+                    return
+                }
+            }
+            editingBar.moreButton.isEnabled = true
+        }
     }
 
     func setEditing(isEditing: Bool, selectedAtIndexPath: IndexPath? = nil) {
@@ -2178,6 +2207,10 @@ extension ChatViewController: ChatEditingDelegate {
         }
     }
 
+    func onMorePressed() {
+        showMoreMenu()
+    }
+
     func onForwardPressed() {
         if let rows = tableView.indexPathsForSelectedRows {
             let messageIdsToForward = rows.compactMap { messageIds[$0.row] }

+ 29 - 2
deltachat-ios/Chat/Views/ChatEditingBar.swift

@@ -6,6 +6,7 @@ public protocol ChatEditingDelegate: class {
     func onForwardPressed()
     func onCancelPressed()
     func onCopyPressed()
+    func onMorePressed()
 }
 
 public class ChatEditingBar: UIView, InputItem {
@@ -19,6 +20,9 @@ public class ChatEditingBar: UIView, InputItem {
 
     public var isEnabled: Bool {
         willSet(newValue) {
+            if !newValue {
+                moreButton.isEnabled = newValue
+            }
             deleteButton.isEnabled = newValue
             forwardButton.isEnabled = newValue
             copyButton.isEnabled = newValue
@@ -27,6 +31,21 @@ public class ChatEditingBar: UIView, InputItem {
 
     weak var delegate: ChatEditingDelegate?
 
+    public lazy var moreButton: UIButton = {
+        let view = UIButton()
+        if #available(iOS 13.0, *) {
+            view.setImage(UIImage(systemName: "ellipsis.circle"), for: .normal)
+        } else {
+            view.setImage(UIImage(named: "ic_more"), for: .normal)
+        }
+        view.tintColor = .systemBlue
+        view.translatesAutoresizingMaskIntoConstraints = false
+        view.isUserInteractionEnabled = true
+        view.imageView?.contentMode = .scaleAspectFit
+        view.accessibilityLabel = String.localized("resend")
+        return view
+    }()
+
     private lazy var copyButton: UIButton = {
         let view = UIButton()
         if #available(iOS 13.0, *) {
@@ -72,7 +91,7 @@ public class ChatEditingBar: UIView, InputItem {
     }()
 
     private lazy var mainContentView: UIStackView = {
-        let view = UIStackView(arrangedSubviews: [copyButton, forwardButton, deleteButton])
+        let view = UIStackView(arrangedSubviews: [copyButton, forwardButton, deleteButton, moreButton])
         view.axis = .horizontal
         view.distribution = .fillEqually
         view.alignment = .center
@@ -105,12 +124,16 @@ public class ChatEditingBar: UIView, InputItem {
             mainContentView.constraintAlignTrailingTo(self),
             deleteButton.constraintHeightTo(36),
             forwardButton.constraintHeightTo(26),
-            copyButton.constraintHeightTo(36)
+            copyButton.constraintHeightTo(36),
+            moreButton.constraintHeightTo(36)
         ])
 
         let copyButtonGestureListener = UITapGestureRecognizer(target: self, action: #selector(onCopyPressed))
         copyButton.addGestureRecognizer(copyButtonGestureListener)
 
+        let moreBtnGestureListener = UITapGestureRecognizer(target: self, action: #selector(onMorePressed))
+        moreButton.addGestureRecognizer(moreBtnGestureListener)
+
         let forwardGestureListener = UITapGestureRecognizer(target: self, action: #selector(onForwardPressed))
         forwardButton.addGestureRecognizer(forwardGestureListener)
 
@@ -122,6 +145,10 @@ public class ChatEditingBar: UIView, InputItem {
         delegate?.onCopyPressed()
     }
 
+    @objc func onMorePressed() {
+        delegate?.onMorePressed()
+    }
+
     @objc func onForwardPressed() {
         delegate?.onForwardPressed()
     }