Browse Source

refresh title bar when webxdc app is open and app changed

this can happen if the document title changed so refresh title
adbenitez 1 year ago
parent
commit
34ac659adf
1 changed files with 45 additions and 18 deletions
  1. 45 18
      deltachat-ios/Controller/WebxdcViewController.swift

+ 45 - 18
deltachat-ios/Controller/WebxdcViewController.swift

@@ -13,6 +13,7 @@ class WebxdcViewController: WebViewViewController {
     let INTERNALSCHEMA = "webxdc"
     
     var messageId: Int
+    var msgChangedObserver: NSObjectProtocol?
     var webxdcUpdateObserver: NSObjectProtocol?
     var webxdcName: String = ""
     var sourceCodeUrl: String?
@@ -248,6 +249,22 @@ class WebxdcViewController: WebViewViewController {
     
     override func viewDidLoad() {
         super.viewDidLoad()
+        navigationItem.rightBarButtonItem = moreButton
+        refreshWebxdcInfo()
+    }
+
+    override func willMove(toParent parent: UIViewController?) {
+        super.willMove(toParent: parent)
+        let willBeRemoved = parent == nil
+        navigationController?.interactivePopGestureRecognizer?.isEnabled = willBeRemoved
+        if willBeRemoved {
+            removeObservers()
+        } else {
+            addObserver()
+        }
+    }
+
+    private func refreshWebxdcInfo() {
         let msg = dcContext.getMessage(id: messageId)
         let dict = msg.getWebxdcInfoDict()
 
@@ -257,29 +274,12 @@ class WebxdcViewController: WebViewViewController {
         self.allowInternet = dict["internet_access"] as? Bool ?? false
 
         self.title = document.isEmpty ? "\(webxdcName) – \(chatName)" : "\(document) – \(chatName)"
-        navigationItem.rightBarButtonItem = moreButton
-
         if let sourceCode = dict["source_code_url"] as? String,
            !sourceCode.isEmpty {
             sourceCodeUrl = sourceCode
         }
     }
-    
-    override func willMove(toParent parent: UIViewController?) {
-        super.willMove(toParent: parent)
-        let willBeRemoved = parent == nil
-        navigationController?.interactivePopGestureRecognizer?.isEnabled = willBeRemoved
-        if willBeRemoved {
-            let nc = NotificationCenter.default
-            if let webxdcUpdateObserver = webxdcUpdateObserver {
-                nc.removeObserver(webxdcUpdateObserver)
-            }
-            shortcutManager = nil
-        } else {
-            addObserver()
-        }
-    }
-    
+
     private func addObserver() {
         let nc = NotificationCenter.default
         webxdcUpdateObserver = nc.addObserver(
@@ -297,8 +297,35 @@ class WebxdcViewController: WebViewViewController {
                 self.updateWebxdc()
             }
         }
+
+        msgChangedObserver = nc.addObserver(
+            forName: dcNotificationChanged,
+            object: nil,
+            queue: OperationQueue.main
+        ) { [weak self] notification in
+            guard let self = self else { return }
+            guard let ui = notification.userInfo,
+                  let messageId = ui["message_id"] as? Int else {
+                      logger.error("failed to handle dcNotificationChanged")
+                      return
+                  }
+            if messageId == self.messageId {
+                refreshWebxdcInfo()
+            }
+        }
     }
     
+    private func removeObservers() {
+        let nc = NotificationCenter.default
+        if let webxdcUpdateObserver = webxdcUpdateObserver {
+            nc.removeObserver(webxdcUpdateObserver)
+        }
+        if let msgChangedObserver = self.msgChangedObserver {
+            nc.removeObserver(msgChangedObserver)
+        }
+        shortcutManager = nil
+    }
+
     override func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
         if let url = navigationAction.request.url {
             if url.scheme == "mailto" {