Browse Source

relay message text

B. Petersen 2 years ago
parent
commit
af6a182e83

+ 1 - 1
deltachat-ios/AppDelegate.swift

@@ -589,7 +589,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
         setStockTranslations()
         locationManager.reloadDcContext()
         notificationManager.reloadDcContext()
-        RelayHelper.shared.cancel()
+        RelayHelper.shared.finishRelaying()
         _ = RelayHelper.setup(dcAccounts.getSelected())
         if dcAccounts.getSelected().isConfigured() {
             appCoordinator.resetTabBarRootViewControllers()

+ 9 - 4
deltachat-ios/Chat/ChatViewController.swift

@@ -484,10 +484,15 @@ class ChatViewController: UITableViewController, UITableViewDropDelegate {
         }
 
         if RelayHelper.shared.isForwarding() {
-            askToForwardMessage()
+            if RelayHelper.shared.forwardIds != nil {
+                askToForwardMessage()
+            } else if let text = RelayHelper.shared.forwardText {
+                messageInputBar.inputTextView.text = text // TODO: handle RelayHelper.shared.fileBase64
+                RelayHelper.shared.finishRelaying()
+            }
         } else if RelayHelper.shared.isMailtoHandling() {
             messageInputBar.inputTextView.text = RelayHelper.shared.mailtoDraft
-            RelayHelper.shared.finishMailto()
+            RelayHelper.shared.finishRelaying()
         }
     }
 
@@ -1478,13 +1483,13 @@ class ChatViewController: UITableViewController, UITableViewDropDelegate {
     private func askToForwardMessage() {
         let chat = dcContext.getChat(chatId: self.chatId)
         if chat.isSelfTalk {
-            RelayHelper.shared.forward(to: self.chatId)
+            RelayHelper.shared.forwardIdsAndFinishRelaying(to: self.chatId)
             refreshMessages()
         } else {
             confirmationAlert(title: String.localizedStringWithFormat(String.localized("ask_forward"), chat.name),
                               actionTitle: String.localized("menu_forward"),
                               actionHandler: { _ in
-                                RelayHelper.shared.forward(to: self.chatId)
+                                RelayHelper.shared.forwardIdsAndFinishRelaying(to: self.chatId)
                                 self.dismiss(animated: true, completion: nil)},
                               cancelHandler: { _ in
                                 self.dismiss(animated: false, completion: nil)

+ 2 - 3
deltachat-ios/Controller/ChatListController.swift

@@ -363,8 +363,7 @@ class ChatListController: UITableViewController {
         if tableView.isEditing {
             self.setLongTapEditing(false)
         } else {
-            // cancel forwarding
-            RelayHelper.shared.cancel()
+            RelayHelper.shared.finishRelaying()
             updateTitle()
             refreshInBg()
         }
@@ -815,7 +814,7 @@ class ChatListController: UITableViewController {
         }))
         alert.addAction(UIAlertAction(title: String.localized("cancel"), style: .cancel, handler: { _ in
             if RelayHelper.shared.isMailtoHandling() {
-                RelayHelper.shared.finishMailto()
+                RelayHelper.shared.finishRelaying()
             }
         }))
         present(alert, animated: true, completion: nil)

+ 5 - 1
deltachat-ios/Controller/WebxdcViewController.swift

@@ -359,8 +359,12 @@ extension WebxdcViewController: WKScriptMessageHandler {
             _ = dcContext.sendWebxdcStatusUpdate(msgId: messageId, payload: payloadString, description: description)
 
         case .sendToChat:
+            guard let dict = message.body as? [String: AnyObject] else {
+                logger.error("failed to parse sendToChat parameters \(message.body)")
+                return
+            }
             logger.debug("send to chat: \(message.body)")
-            RelayHelper.shared.setForwardMessage(messageId: messageId) // TOOD: set message.* as data to the RelayHelper, make RelayHelper produce a draft
+            RelayHelper.shared.setForwardMessage(text: dict["text"] as? String, fileBase64: dict["base64"] as? String, fileName: dict["name"] as? String)
             navigationController?.popViewControllers(viewsToPop: 2, animated: true) // TODO: xdc may be in profile, all media, whatnot, just popping 2 is wrong
 
         default:

+ 1 - 1
deltachat-ios/Coordinator/AppCoordinator.swift

@@ -199,7 +199,7 @@ class AppCoordinator {
         } else {
             logger.warning("Could not parse mailto: URL")
         }
-        RelayHelper.shared.finishMailto()
+        RelayHelper.shared.finishRelaying()
         return false
     }
 

+ 35 - 19
deltachat-ios/Helper/RelayHelper.swift

@@ -4,7 +4,11 @@ import DcCore
 class RelayHelper {
     static var shared: RelayHelper = RelayHelper()
     private static var dcContext: DcContext?
-    var messageIds: [Int]?
+
+    var forwardIds: [Int]?
+    var forwardText: String?
+    var forwardFileBase64: String?
+    var forwardFileName: String?
 
     var mailtoDraft: String = ""
     var mailtoAddress: String?
@@ -21,47 +25,59 @@ class RelayHelper {
         return shared
     }
 
+    // forwarding messages
+
+    func setForwardMessage(text: String?, fileBase64: String?, fileName: String?) {
+        finishRelaying()
+        self.forwardText = text
+        self.forwardFileBase64 = fileBase64
+        self.forwardFileName = fileName
+    }
+
     func setForwardMessage(messageId: Int) {
-        self.messageIds = [messageId]
+        finishRelaying()
+        self.forwardIds = [messageId]
     }
 
     func setForwardMessages(messageIds: [Int]) {
-        self.messageIds = messageIds
+        finishRelaying()
+        if !messageIds.isEmpty {
+            self.forwardIds = messageIds
+        }
     }
 
     func isForwarding() -> Bool {
-        return !(messageIds?.isEmpty ?? true)
+        return forwardIds != nil || forwardText != nil || forwardFileBase64 != nil
     }
 
-    func forward(to chat: Int) {
-        if let messageIds = self.messageIds {
+    func forwardIdsAndFinishRelaying(to chat: Int) {
+        if let messageIds = self.forwardIds {
             RelayHelper.dcContext?.forwardMessages(with: messageIds, to: chat)
         }
-        self.messageIds = nil
-    }
-
-    func cancel() {
-        messageIds = nil
-    }
-
-    func isMailtoHandling() -> Bool {
-        return !mailtoDraft.isEmpty || mailtoAddress != nil
+        finishRelaying()
     }
 
-    func finishMailto() {
+    func finishRelaying() {
+        forwardIds = nil
+        forwardText = nil
+        forwardFileBase64 = nil
+        forwardFileName = nil
         mailtoDraft = ""
         mailtoAddress = nil
         askToChatWithMailto = true
     }
 
 
+    // mailto: handling
+
+    func isMailtoHandling() -> Bool {
+        return !mailtoDraft.isEmpty || mailtoAddress != nil
+    }
+
     func splitString(_ value: String) -> [String] {
         return value.split(separator: ",").map(String.init)
     }
 
-    /**
-            returns true if parsing was successful
-     */
     func parseMailtoUrl(_ url: URL) -> Bool {
         if let urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false) {
             var subject: String = ""