alqindiirsyam 2 年之前
父節點
當前提交
47e927e3e1

+ 47 - 4
appbuilder-ios/AppBuilder/AppBuilder/SecondTabViewController.swift

@@ -120,7 +120,7 @@ class SecondTabViewController: UIViewController, UIScrollViewDelegate, UIGesture
         
         definesPresentationContext = true
         
-        NotificationCenter.default.addObserver(self, selector: #selector(onReceiveMessage(notification:)), name: NSNotification.Name(rawValue: "onMessageChat"), object: nil)
+        NotificationCenter.default.addObserver(self, selector: #selector(onStatusChat(notification:)), name: NSNotification.Name(rawValue: "onMessageChat"), object: nil)
         NotificationCenter.default.addObserver(self, selector: #selector(onReceiveMessage(notification:)), name: NSNotification.Name(rawValue: "onReceiveChat"), object: nil)
         NotificationCenter.default.addObserver(self, selector: #selector(onReload(notification:)), name: NSNotification.Name(rawValue: "onMember"), object: nil)
         NotificationCenter.default.addObserver(self, selector: #selector(onReload(notification:)), name: NSNotification.Name(rawValue: "onUpdatePersonInfo"), object: nil)
@@ -431,9 +431,52 @@ class SecondTabViewController: UIViewController, UIScrollViewDelegate, UIGesture
     }
     
     @objc func onReceiveMessage(notification: NSNotification) {
-        self.getChats {
-            DispatchQueue.main.async {
-                self.tableView.reloadData()
+        DispatchQueue.main.async { [self] in
+            let data:[AnyHashable : Any] = notification.userInfo!
+            if let dataMessage = data["message"] as? TMessage {
+                let chatData = dataMessage.mBodies
+                if chatData[CoreMessage_TMessageKey.IS_CALL_CENTER] == "0" {
+                    var indexChat: Int?
+                    if chatData[CoreMessage_TMessageKey.MESSAGE_SCOPE_ID] == "3" && chatData[CoreMessage_TMessageKey.F_PIN] != User.getMyPin() {
+                        indexChat = chats.firstIndex(where: { $0.fpin == chatData[CoreMessage_TMessageKey.F_PIN] })
+                    } else if chatData[CoreMessage_TMessageKey.MESSAGE_SCOPE_ID] == "4" && chatData[CoreMessage_TMessageKey.F_PIN] != User.getMyPin() {
+                        indexChat = chats.firstIndex(where: { (chatData[CoreMessage_TMessageKey.CHAT_ID] ?? "").isEmpty ? $0.pin == chatData[CoreMessage_TMessageKey.L_PIN] : $0.pin == chatData[CoreMessage_TMessageKey.CHAT_ID] })
+                    }
+                    let newChat = Chat.getData(messageId: chatData[CoreMessage_TMessageKey.MESSAGE_ID] ?? "")
+                    if newChat.count > 0 {
+                        if indexChat != nil {
+                            chats[0] = newChat[0]
+                            let indexPathToMove = IndexPath(row: indexChat!, section: 0)
+                            let indexPathNewPosition = IndexPath(row: 0, section: 0)
+                            tableView.performBatchUpdates({
+                                tableView.moveRow(at: indexPathToMove, to: indexPathNewPosition)
+                            }, completion: nil)
+                            tableView.beginUpdates()
+                            tableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: .none)
+                            tableView.endUpdates()
+                        } else {
+                            chats.insert(newChat[0], at: 0)
+                            tableView.beginUpdates()
+                            tableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: .none)
+                            tableView.endUpdates()
+                        }
+                    }
+                }
+            }
+        }
+    }
+    
+    @objc func onStatusChat(notification: NSNotification) {
+        DispatchQueue.main.async { [self] in
+            let data:[AnyHashable : Any] = notification.userInfo!
+            if let dataMessage = data["message"] as? TMessage {
+                let chatData = dataMessage.mBodies
+                let indexChat = chats.firstIndex(where: { $0.messageId == chatData[CoreMessage_TMessageKey.MESSAGE_ID] })
+                if indexChat != nil {
+                    tableView.beginUpdates()
+                    tableView.reloadRows(at: [IndexPath(row: indexChat!, section: 0)], with: .none)
+                    tableView.endUpdates()
+                }
             }
         }
     }

+ 32 - 6
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Chat/EditorGroup.swift

@@ -224,9 +224,6 @@ public class EditorGroup: UIViewController {
                             self.navigationController?.popViewController(animated: true)
                         }
                     })
-//                    self.dataMessages.removeAll()
-//                    self.dataDates.removeAll()
-//                    self.tableChatView.reloadData()
                 }))
                 self.present(alert, animated: true, completion: nil)
             }),
@@ -737,10 +734,20 @@ public class EditorGroup: UIViewController {
                             self.counter = 0
                             self.updateCounter(counter: self.counter)
                         }
+                        let lastMarkerCounter = self.markerCounter
                         if self.markerCounter != nil {
                             self.markerCounter = nil
                         }
-                        self.tableChatView.reloadData()
+                        self.tableChatView.beginUpdates()
+                        let indexMessage = self.dataMessages.firstIndex(where: { $0["message_id"] as? String == lastMarkerCounter })
+                        if indexMessage != nil {
+                            let section = self.dataDates.firstIndex(of: self.dataMessages[indexMessage!]["chat_date"] as! String)
+                            let row = self.dataMessages.filter({ $0["chat_date"] as! String == self.dataMessages[indexMessage!]["chat_date"] as! String}).firstIndex(where: { $0["message_id"] as? String == self.dataMessages[indexMessage!]["message_id"] as? String })
+                            if row != nil && section != nil  {
+                                self.tableChatView.reloadRows(at: [IndexPath(row: row!, section: section!)], with: .none)
+                            }
+                        }
+                        self.tableChatView.endUpdates()
                     }
                     else if self.currentIndexpath == nil {
                         self.counter = 0
@@ -753,7 +760,16 @@ public class EditorGroup: UIViewController {
                         if !self.indicatorCounterBSTB.isDescendant(of: self.view) && self.buttonScrollToBottom.isDescendant(of: self.view) {
                             self.markerCounter = row["message_id"] as? String
                             self.addCounterAtButttonScrollToBottom()
-                            self.tableChatView.reloadData()
+                            self.tableChatView.beginUpdates()
+                            let indexMessage = self.dataMessages.firstIndex(where: { $0["message_id"] as? String == self.markerCounter })
+                            if indexMessage != nil {
+                                let section = self.dataDates.firstIndex(of: self.dataMessages[indexMessage!]["chat_date"] as! String)
+                                let row = self.dataMessages.filter({ $0["chat_date"] as! String == self.dataMessages[indexMessage!]["chat_date"] as! String}).firstIndex(where: { $0["message_id"] as? String == self.dataMessages[indexMessage!]["message_id"] as? String })
+                                if row != nil && section != nil  {
+                                    self.tableChatView.reloadRows(at: [IndexPath(row: row!, section: section!)], with: .none)
+                                }
+                            }
+                            self.tableChatView.endUpdates()
                         } else if self.indicatorCounterBSTB.isDescendant(of: self.view) {
                             self.labelCounter.text = "\(self.counter)"
                         }
@@ -1286,8 +1302,18 @@ public class EditorGroup: UIViewController {
         DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) {
             self.tableChatView.scrollToBottom()
             if self.markerCounter != nil {
+                let lastMarkerCounter = self.markerCounter
                 self.markerCounter = nil
-                self.tableChatView.reloadData()
+                self.tableChatView.beginUpdates()
+                let indexMessage = self.dataMessages.firstIndex(where: { $0["message_id"] as? String == lastMarkerCounter })
+                if indexMessage != nil {
+                    let section = self.dataDates.firstIndex(of: self.dataMessages[indexMessage!]["chat_date"] as! String)
+                    let row = self.dataMessages.filter({ $0["chat_date"] as! String == self.dataMessages[indexMessage!]["chat_date"] as! String}).firstIndex(where: { $0["message_id"] as? String == self.dataMessages[indexMessage!]["message_id"] as? String })
+                    if row != nil && section != nil  {
+                        self.tableChatView.reloadRows(at: [IndexPath(row: row!, section: section!)], with: .none)
+                    }
+                }
+                self.tableChatView.endUpdates()
             }
         }
     }

+ 32 - 17
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Chat/EditorPersonal.swift

@@ -291,9 +291,6 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                                 self.navigationController?.popViewController(animated: true)
                             }
                         })
-//                        self.dataMessages.removeAll()
-//                        self.dataDates.removeAll()
-//                        self.tableChatView.reloadData()
                     }))
                     self.present(alert, animated: true, completion: nil)
                 }
@@ -370,9 +367,6 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                                     self.navigationController?.popViewController(animated: true)
                                 }
                             })
-    //                        self.dataMessages.removeAll()
-    //                        self.dataDates.removeAll()
-    //                        self.tableChatView.reloadData()
                         }))
                         self.present(alert, animated: true, completion: nil)
                     }
@@ -447,9 +441,6 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                                         self.navigationController?.popViewController(animated: true)
                                     }
                                 })
-        //                        self.dataMessages.removeAll()
-        //                        self.dataDates.removeAll()
-        //                        self.tableChatView.reloadData()
                             }))
                             self.present(alert, animated: true, completion: nil)
                         }
@@ -489,9 +480,6 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                                         self.navigationController?.popViewController(animated: true)
                                     }
                                 })
-        //                        self.dataMessages.removeAll()
-        //                        self.dataDates.removeAll()
-        //                        self.tableChatView.reloadData()
                             }))
                             self.present(alert, animated: true, completion: nil)
                         }
@@ -1500,10 +1488,20 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                             self.counter = 0
                             self.updateCounter(counter: self.counter)
                         }
+                        let lastMarkerCounter = markerCounter
                         if self.markerCounter != nil {
                             self.markerCounter = nil
                         }
-                        self.tableChatView.reloadData()
+                        self.tableChatView.beginUpdates()
+                        let indexMessage = self.dataMessages.firstIndex(where: { $0["message_id"] as? String == lastMarkerCounter })
+                        if indexMessage != nil {
+                            let section = self.dataDates.firstIndex(of: self.dataMessages[indexMessage!]["chat_date"] as! String)
+                            let row = self.dataMessages.filter({ $0["chat_date"] as! String == self.dataMessages[indexMessage!]["chat_date"] as! String}).firstIndex(where: { $0["message_id"] as? String == self.dataMessages[indexMessage!]["message_id"] as? String })
+                            if row != nil && section != nil  {
+                                self.tableChatView.reloadRows(at: [IndexPath(row: row!, section: section!)], with: .none)
+                            }
+                        }
+                        self.tableChatView.endUpdates()
                     }
                     else if self.currentIndexpath == nil {
                         self.counter = 0
@@ -1516,7 +1514,16 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                         if !self.indicatorCounterBSTB.isDescendant(of: self.view) && self.buttonScrollToBottom.isDescendant(of: self.view) {
                             self.markerCounter = row["message_id"] as? String
                             self.addCounterAtButttonScrollToBottom()
-                            self.tableChatView.reloadData()
+                            self.tableChatView.beginUpdates()
+                            let indexMessage = self.dataMessages.firstIndex(where: { $0["message_id"] as? String == self.markerCounter })
+                            if indexMessage != nil {
+                                let section = self.dataDates.firstIndex(of: self.dataMessages[indexMessage!]["chat_date"] as! String)
+                                let row = self.dataMessages.filter({ $0["chat_date"] as! String == self.dataMessages[indexMessage!]["chat_date"] as! String}).firstIndex(where: { $0["message_id"] as? String == self.dataMessages[indexMessage!]["message_id"] as? String })
+                                if row != nil && section != nil  {
+                                    self.tableChatView.reloadRows(at: [IndexPath(row: row!, section: section!)], with: .none)
+                                }
+                            }
+                            self.tableChatView.endUpdates()
                         } else if self.indicatorCounterBSTB.isDescendant(of: self.view) {
                             self.labelCounter.text = "\(self.counter)"
                         }
@@ -1569,7 +1576,6 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                                 let row = self.dataMessages.filter({ $0["chat_date"] as! String == self.dataMessages[idx!]["chat_date"] as! String}).firstIndex(where: { $0["message_id"] as? String == self.dataMessages[idx!]["message_id"] as? String })
                                 if row != nil && section != nil  {
                                     self.tableChatView.reloadRows(at: [IndexPath(row: row!, section: section!)], with: .none)
-                                    self.tableChatView.reloadData()
                                 }
                                 if self.listTimerCredential[self.dataMessages[idx!]["message_id"] as! String] != nil {
                                     self.listTimerCredential.removeValue(forKey: self.dataMessages[idx!]["message_id"] as! String)
@@ -1600,7 +1606,6 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
                                 let row = self.dataMessages.filter({ $0["chat_date"] as! String == self.dataMessages[idx!]["chat_date"] as! String}).firstIndex(where: { $0["message_id"] as? String == self.dataMessages[idx!]["message_id"] as? String })
                                 if row != nil && section != nil  {
                                     self.tableChatView.reloadRows(at: [IndexPath(row: row!, section: section!)], with: .none)
-                                    self.tableChatView.reloadData()
                                 }
                                 if self.listTimerCredential[self.dataMessages[idx!]["message_id"] as! String] != nil {
                                     self.listTimerCredential.removeValue(forKey: self.dataMessages[idx!]["message_id"] as! String)
@@ -2301,8 +2306,18 @@ public class EditorPersonal: UIViewController, ImageVideoPickerDelegate, UIGestu
         DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) {
             self.tableChatView.scrollToBottom()
             if self.markerCounter != nil {
+                let lastMarkerCounter = self.markerCounter
                 self.markerCounter = nil
-                self.tableChatView.reloadData()
+                self.tableChatView.beginUpdates()
+                let indexMessage = self.dataMessages.firstIndex(where: { $0["message_id"] as? String == lastMarkerCounter })
+                if indexMessage != nil {
+                    let section = self.dataDates.firstIndex(of: self.dataMessages[indexMessage!]["chat_date"] as! String)
+                    let row = self.dataMessages.filter({ $0["chat_date"] as! String == self.dataMessages[indexMessage!]["chat_date"] as! String}).firstIndex(where: { $0["message_id"] as? String == self.dataMessages[indexMessage!]["message_id"] as? String })
+                    if row != nil && section != nil  {
+                        self.tableChatView.reloadRows(at: [IndexPath(row: row!, section: section!)], with: .none)
+                    }
+                }
+                self.tableChatView.endUpdates()
             }
         }
     }

+ 47 - 4
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/ContactChatViewController.swift

@@ -160,7 +160,7 @@ class ContactChatViewController: UITableViewController {
         segment.setTitleTextAttributes([NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 12.0)], for: .normal)
         Utils.inTabChats = true
         
-        NotificationCenter.default.addObserver(self, selector: #selector(onReceiveMessage(notification:)), name: NSNotification.Name(rawValue: "onMessageChat"), object: nil)
+        NotificationCenter.default.addObserver(self, selector: #selector(onStatusChat(notification:)), name: NSNotification.Name(rawValue: "onMessageChat"), object: nil)
         NotificationCenter.default.addObserver(self, selector: #selector(onReceiveMessage(notification:)), name: NSNotification.Name(rawValue: "onReceiveChat"), object: nil)
         NotificationCenter.default.addObserver(self, selector: #selector(onReload(notification:)), name: NSNotification.Name(rawValue: "onMember"), object: nil)
         NotificationCenter.default.addObserver(self, selector: #selector(onReload(notification:)), name: NSNotification.Name(rawValue: "onUpdatePersonInfo"), object: nil)
@@ -237,9 +237,52 @@ class ContactChatViewController: UITableViewController {
     }
     
     @objc func onReceiveMessage(notification: NSNotification) {
-        self.getChats {
-            DispatchQueue.main.async {
-                self.tableView.reloadData()
+        DispatchQueue.main.async { [self] in
+            let data:[AnyHashable : Any] = notification.userInfo!
+            if let dataMessage = data["message"] as? TMessage {
+                let chatData = dataMessage.mBodies
+                if chatData[CoreMessage_TMessageKey.IS_CALL_CENTER] == "0" {
+                    var indexChat: Int?
+                    if chatData[CoreMessage_TMessageKey.MESSAGE_SCOPE_ID] == "3" && chatData[CoreMessage_TMessageKey.F_PIN] != User.getMyPin() {
+                        indexChat = chats.firstIndex(where: { $0.fpin == chatData[CoreMessage_TMessageKey.F_PIN] })
+                    } else if chatData[CoreMessage_TMessageKey.MESSAGE_SCOPE_ID] == "4" && chatData[CoreMessage_TMessageKey.F_PIN] != User.getMyPin() {
+                        indexChat = chats.firstIndex(where: { (chatData[CoreMessage_TMessageKey.CHAT_ID] ?? "").isEmpty ? $0.pin == chatData[CoreMessage_TMessageKey.L_PIN] : $0.pin == chatData[CoreMessage_TMessageKey.CHAT_ID] })
+                    }
+                    let newChat = Chat.getData(messageId: chatData[CoreMessage_TMessageKey.MESSAGE_ID] ?? "")
+                    if newChat.count > 0 {
+                        if indexChat != nil {
+                            chats[0] = newChat[0]
+                            let indexPathToMove = IndexPath(row: indexChat!, section: 0)
+                            let indexPathNewPosition = IndexPath(row: 0, section: 0)
+                            tableView.performBatchUpdates({
+                                tableView.moveRow(at: indexPathToMove, to: indexPathNewPosition)
+                            }, completion: nil)
+                            tableView.beginUpdates()
+                            tableView.reloadRows(at: [IndexPath(row: 0, section: 0)], with: .none)
+                            tableView.endUpdates()
+                        } else {
+                            chats.insert(newChat[0], at: 0)
+                            tableView.beginUpdates()
+                            tableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: .none)
+                            tableView.endUpdates()
+                        }
+                    }
+                }
+            }
+        }
+    }
+    
+    @objc func onStatusChat(notification: NSNotification) {
+        DispatchQueue.main.async { [self] in
+            let data:[AnyHashable : Any] = notification.userInfo!
+            if let dataMessage = data["message"] as? TMessage {
+                let chatData = dataMessage.mBodies
+                let indexChat = chats.firstIndex(where: { $0.messageId == chatData[CoreMessage_TMessageKey.MESSAGE_ID] })
+                if indexChat != nil {
+                    tableView.beginUpdates()
+                    tableView.reloadRows(at: [IndexPath(row: indexChat!, section: 0)], with: .none)
+                    tableView.endUpdates()
+                }
             }
         }
     }