Bläddra i källkod

Add Inquiry and fix bugs

alqindiirsyam 2 år sedan
förälder
incheckning
a3bab5bf9a

+ 2 - 2
appbuilder-ios/AppBuilder/AppBuilder.xcodeproj/project.pbxproj

@@ -443,7 +443,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.0.0;
+				MARKETING_VERSION = 1.8.5.24;
 				PRODUCT_BUNDLE_IDENTIFIER = io.newuniverse.AppBuilder;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";
@@ -472,7 +472,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.0.0;
+				MARKETING_VERSION = 1.8.5.24;
 				PRODUCT_BUNDLE_IDENTIFIER = io.newuniverse.AppBuilder;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PROVISIONING_PROFILE_SPECIFIER = "";

+ 3 - 1
appbuilder-ios/AppBuilder/AppBuilder/AppDelegate.swift

@@ -167,9 +167,11 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
             }
         }
         let tabBarAppearance: UITabBarAppearance = UITabBarAppearance()
-        tabBarAppearance.configureWithDefaultBackground()
+        tabBarAppearance.configureWithOpaqueBackground()
         if Bundle.main.displayName == "DigiNetS" {
             tabBarAppearance.backgroundColor = .black.withAlphaComponent(0.7)
+        } else {
+            tabBarAppearance.backgroundColor = .white.withAlphaComponent(0.9)
         }
         if #available(iOS 13.0, *) {
             UITabBar.appearance().standardAppearance = tabBarAppearance

+ 21 - 5
appbuilder-ios/AppBuilder/AppBuilder/FirstTabViewController.swift

@@ -77,19 +77,19 @@ class FirstTabViewController: UIViewController, UIScrollViewDelegate, UIGestureR
         }
         switch(ViewController.sURL){
         case "0":
-            address = "\(PrefsUtil.getURLBase() ?? "https://qmera.io/")nexilis/pages/tab1-main-only?f_pin=\(me ?? "")&lang=\(intLang)"
+            address = "\(PrefsUtil.getURLBase())nexilis/pages/tab1-main-only?f_pin=\(me ?? "")&lang=\(intLang)"
             myURL = URL(string: address)
         case "1":
-            address = "\(PrefsUtil.getURLBase() ?? "https://qmera.io/")nexilis/pages/tab3-main-only?f_pin=\(me ?? "")&lang=\(intLang)"
+            address = "\(PrefsUtil.getURLBase())nexilis/pages/tab3-main-only?f_pin=\(me ?? "")&lang=\(intLang)"
             myURL = URL(string: address)
         case "2":
-            address = "\(PrefsUtil.getURLBase() ?? "https://qmera.io/")nexilis/pages/tab1-main?f_pin=\(me ?? "")&lang=\(intLang)"
+            address = "\(PrefsUtil.getURLBase())nexilis/pages/tab1-main?f_pin=\(me ?? "")&lang=\(intLang)"
             myURL = URL(string: address)
         case "3":
-            address = "\(PrefsUtil.getURLBase() ?? "https://qmera.io/")nexilis/pages/tab3-commerce?f_pin=\(me ?? "")&lang=\(intLang)"
+            address = "\(PrefsUtil.getURLBase())nexilis/pages/tab3-commerce?f_pin=\(me ?? "")&lang=\(intLang)"
             myURL = URL(string: address)
         case "4":
-            address = "\(PrefsUtil.getURLBase() ?? "https://qmera.io/")nexilis/pages/tab1-video?f_pin=\(me ?? "")&lang=\(intLang)"
+            address = "\(PrefsUtil.getURLBase())nexilis/pages/tab1-video?f_pin=\(me ?? "")&lang=\(intLang)"
             myURL = URL(string: address)
         default:
             if(!ViewController.sURL.isEmpty){
@@ -163,6 +163,14 @@ class FirstTabViewController: UIViewController, UIScrollViewDelegate, UIGestureR
                 }
                 ViewController.removeMiddleButton()
             }
+        } else if PrefsUtil.getCpaasMode() != PrefsUtil.CPAAS_MODE_DOCKED {
+            DispatchQueue.main.async {
+                if let viewController = viewController as? ViewController {
+                    if !viewController.tabBar.isHidden {
+                        viewController.tabBar.isHidden = true
+                    }
+                }
+            }
         }
     }
 
@@ -180,6 +188,14 @@ class FirstTabViewController: UIViewController, UIScrollViewDelegate, UIGestureR
                 viewController.tabBar.isHidden = false
                 ViewController.middleButton.isHidden = false
             }
+        } else if PrefsUtil.getCpaasMode() != PrefsUtil.CPAAS_MODE_DOCKED {
+            DispatchQueue.main.async {
+                if let viewController = viewController as? ViewController {
+                    if viewController.tabBar.isHidden {
+                        viewController.tabBar.isHidden = false
+                    }
+                }
+            }
         }
     }
 

+ 4 - 4
appbuilder-ios/AppBuilder/AppBuilder/PrefsUtil.swift

@@ -49,8 +49,8 @@ class PrefsUtil {
     static func getURLThirdTab() -> String? {
         return UserDefaults.standard.string(forKey: "app_builder_url_third_tab")
     }
-    static func getURLBase() -> String? {
-        return UserDefaults.standard.string(forKey: "app_builder_url_base")
+    static func getURLBase() -> String {
+        return UserDefaults.standard.string(forKey: "app_builder_url_base") ?? "https://newuniverse.io/"
     }
     static func getURLQMS() -> String? {
         return UserDefaults.standard.string(forKey: "app_builder_url_qms")
@@ -68,10 +68,10 @@ class PrefsUtil {
         return UserDefaults.standard.string(forKey: "app_builder_compressor")
     }
     static func getUrlSS() -> String? {
-        return PrefsUtil.getURLBase()! + "dashboardv2/uploads/splashscreen/" + PrefsUtil.getIconSS()!
+        return PrefsUtil.getURLBase() + "dashboardv2/uploads/splashscreen/" + PrefsUtil.getIconSS()!
     }
     static func getUrlDock() -> String? {
-        return PrefsUtil.getURLBase()! + "dashboardv2/uploads/fb_icon/" + PrefsUtil.getIconDock()!
+        return PrefsUtil.getURLBase() + "dashboardv2/uploads/fb_icon/" + PrefsUtil.getIconDock()!
     }
     
     static func setURLFirstTab(value: String) {

+ 1 - 1
appbuilder-ios/AppBuilder/AppBuilder/SecondTabViewController.swift

@@ -309,7 +309,7 @@ class SecondTabViewController: UIViewController, UIScrollViewDelegate, UIGesture
                 var bgChoosen = ""
                 let arrayBg = listBg.split(separator: ",")
                 bgChoosen = String(arrayBg[Int.random(in: 0..<arrayBg.count)])
-                ViewController.getDataImageFromUrl(from: URL(string: PrefsUtil.getURLBase()! + "/dashboardv2/uploads/background/" + bgChoosen)!) { data, response, error in
+                ViewController.getDataImageFromUrl(from: URL(string: PrefsUtil.getURLBase() + "/dashboardv2/uploads/background/" + bgChoosen)!) { data, response, error in
                     guard let data = data, error == nil else { return }
                     // always update the UI from the main thread
                     DispatchQueue.main.async() { [self] in

+ 3 - 1
appbuilder-ios/AppBuilder/AppBuilder/ViewController.swift

@@ -465,6 +465,8 @@ class ViewController: UITabBarController, UITabBarControllerDelegate, SettingMAB
             } else if customTab[0] == "4" {
                 fourthTab?.viewWillAppear(false)
             }
+        } else {
+            self.selectedViewController?.viewWillAppear(false)
         }
     }
     
@@ -482,7 +484,7 @@ class ViewController: UITabBarController, UITabBarControllerDelegate, SettingMAB
                     var bgChoosen = ""
                     let arrayBg = listBg.split(separator: ",")
                     bgChoosen = String(arrayBg[Int.random(in: 0..<arrayBg.count)])
-                    ViewController.getDataImageFromUrl(from: URL(string: PrefsUtil.getURLBase()! + "/dashboardv2/uploads/background/" + bgChoosen)!) { data, response, error in
+                    ViewController.getDataImageFromUrl(from: URL(string: PrefsUtil.getURLBase() + "/dashboardv2/uploads/background/" + bgChoosen)!) { data, response, error in
                         guard let data = data, error == nil else { return }
                         // always update the UI from the main thread
                         DispatchQueue.main.async() {

+ 24 - 2
appbuilder-ios/NexilisLite/NexilisLite/Source/CoreMessage_TMessageBank.swift

@@ -2057,8 +2057,30 @@ public class CoreMessage_TMessageBank {
         let tmessage = TMessage()
         let me = UserDefaults.standard.string(forKey: "me")!
         tmessage.mCode = CoreMessage_TMessageCode.GET_WORKING_AREA_CONTACT_CENTER
-        tmessage.mStatus = CoreMessage_TMessageUtil.getTID();
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
         tmessage.mPIN = me
-        return tmessage;
+        return tmessage
+    }
+    
+    public static func getInquiry(message_id: String, error_code: String, data: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.INQUIRY
+        tmessage.mStatus = message_id
+        tmessage.mPIN = "-1"
+        tmessage.mBodies[CoreMessage_TMessageKey._ID] = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_ID] = message_id
+        tmessage.mBodies[CoreMessage_TMessageKey.ERRCOD] = error_code
+        tmessage.mBodies[CoreMessage_TMessageKey.DATA] = data
+        return tmessage
+    }
+
+    public static func getMobileInquiry(message_id: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.MOBILE_INQUIRY;
+        tmessage.mStatus = message_id
+        tmessage.mPIN = "-1";
+        tmessage.mBodies[CoreMessage_TMessageKey._ID] = CoreMessage_TMessageUtil.getTID()
+        tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_ID] = message_id
+        return tmessage
     }
 }

+ 2 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/CoreMessage_TMessageCode.swift

@@ -725,4 +725,6 @@ public class CoreMessage_TMessageCode {
     public static let PULL_FLOATING_BUTTON = "PFB";
     
     public static let GET_CUSTOMER_INFO = "GCI"; // sync
+    public static let INQUIRY = "INQ";
+    public static let MOBILE_INQUIRY = "MINQ";
 }

+ 6 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/Database.swift

@@ -322,6 +322,12 @@ public class Database {
                                 "'message' text" +
                                 ")", values: nil)
         
+        try fmdb.executeUpdate("CREATE TABLE IF NOT EXISTS 'INQUIRY' (" +
+                                "'id' text PRIMARY KEY NOT NULL," +
+                                "'status' integer NOT NULL default 0," +
+                                "'message' text" +
+                                ")", values: nil)
+        
         try fmdb.executeUpdate("CREATE TABLE IF NOT EXISTS 'FOLLOW' (" +
                                 "'f_pin' text PRIMARY KEY NOT NULL" +
                                 ")", values: nil)

+ 50 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/IncomingThread.swift

@@ -140,6 +140,10 @@ class IncomingThread {
             endCall(message: message)
         } else if message.getCode() == CoreMessage_TMessageCode.PUSH_SERVICE_BNI {
             pushServiceBNI(message: message)
+        } else if message.getCode() == CoreMessage_TMessageCode.MOBILE_INQUIRY {
+            mobileInquiry(message: message)
+        } else if message.getCode() == CoreMessage_TMessageCode.INQUIRY {
+            inquiry(message: message)
         } else {
             print("unprocessed code", message.getCode())
             ack(message: message)
@@ -153,6 +157,52 @@ class IncomingThread {
      *
      */
     
+    private func inquiry(message: TMessage) {
+        let message_id = message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID, default_value: "")
+        var err_code = "10"
+        if !message_id.isEmpty {
+            Database.shared.database?.inTransaction({ (fmdb, rollback) in
+                if let cursor = Database.shared.getRecords(fmdb: fmdb, query: "select message_id from MESSAGE where message_id = '\(message_id)'") {
+                    if cursor.next() {
+                        err_code = "00"
+                    }
+                    _ = Nexilis.write(message: CoreMessage_TMessageBank.getInquiry(message_id: message_id, error_code: err_code, data: message_id))
+                    cursor.close()
+                }
+            })
+        }
+    }
+    
+    private func mobileInquiry(message: TMessage) {
+        var message_id = message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID)
+        let err_code = message.getBody(key: CoreMessage_TMessageKey.ERRCOD)
+        if message_id.isEmpty {
+            message_id = message.getStatus()
+        }
+        if err_code == "00" {
+            self.updateInquiry(messageId: message_id)
+        } else {
+            print("MASUK MINQ SEND CHAT")
+            Database.shared.database?.inTransaction({ (fmdb, rollback) in
+                if let cursor = Database.shared.getRecords(fmdb: fmdb, query: "select message from INQUIRY where id = '\(message_id)'"), cursor.next() {
+                    if let message = cursor.string(forColumnIndex: 0) {
+                        print("MASUK MINQ ADA MESSAGE")
+                        OutgoingThread.default.addQueue(message: TMessage(data: message))
+                    }
+                    cursor.close()
+                }
+            })
+        }
+    }
+    
+    private func updateInquiry(messageId: String) {
+        Database.shared.database?.inTransaction({ (fmdb, rollback) in
+            _ = Database.shared.updateRecord(fmdb: fmdb, table: "INQUIRY", cvalues: [
+                "status" : "1"
+            ], _where: "id = '\(messageId)'")
+        })
+    }
+    
     private func endCall(message: TMessage) {
         if let call = Nexilis.shared.callManager.call(with: message.mPIN) {
             call.isReceiveEnd = true

+ 122 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/InquiryThread.swift

@@ -0,0 +1,122 @@
+//
+//  InquiryThread.swift
+//  NexilisLite
+//
+//  Created by Akhmad Al Qindi Irsyam on 23/11/22.
+//
+
+import Foundation
+import FMDB
+
+class InquiryThread {
+    static let `default` = InquiryThread()
+    
+    private var isRunning = false
+    
+    private var semaphore = DispatchSemaphore(value: 0)
+    
+    private var connection = DispatchSemaphore(value: 0)
+    
+    private var dispatchQueue = DispatchQueue(label: "InquiryThread")
+    
+    private var queue = [TMessage]()
+    
+    init() {
+        Database.shared.database?.inTransaction({ (fmdb, rollback) in
+            if let cursor = Database.shared.getRecords(fmdb: fmdb, query: "select status, message from INQUIRY") {
+                while cursor.next() {
+                    let status = cursor.int(forColumnIndex: 0)
+                    if status == 1 {
+                        continue
+                    }
+                    if let message = cursor.string(forColumnIndex: 1) {
+                        addQueue(message: TMessage(data: message))
+                    }
+                }
+                cursor.close()
+            }
+        })
+    }
+    
+    func addQueue(message: TMessage) {
+        print("MASUK INQUIRY ADD")
+        addInquiry(message: message)
+        queue.append(message)
+        semaphore.signal()
+    }
+    
+    private func addQueue(_ message: TMessage, at: Int) {
+        Thread.sleep(forTimeInterval: 1)
+        queue.insert(message, at: at)
+        semaphore.signal()
+    }
+    
+    private func addInquiry(message: TMessage) {
+        DispatchQueue.global().async {
+            let messageId = message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID)
+            if !messageId.isEmpty {
+                Database.shared.database?.inTransaction({ (fmdb, rollback) in
+                    do {
+                        print("SIMPAN MESSAGE TO INQUIRY TABLE")
+                        _ = try Database.shared.insertRecord(fmdb: fmdb, table: "INQUIRY", cvalues: [
+                            "id" : messageId,
+                            "status" : 0,
+                            "message" : message.pack(),
+                        ], replace: true)
+                    } catch {
+                        rollback.pointee = true
+                        print(error)
+                    }
+                })
+            }
+        }
+    }
+    
+    private var isWait = false
+    
+    func set(wait: Bool) {
+        isWait = wait
+        if !isWait {
+            connection.signal()
+        }
+    }
+    
+    func getQueue() -> TMessage {
+        while queue.isEmpty || queue.count == 0 {
+            print("QUEUE INQUIRY.wait")
+            semaphore.wait()
+        }
+        return queue.remove(at: 0)
+    }
+    
+    func run() {
+        if (isRunning) {
+            return
+        }
+        isRunning = true
+        dispatchQueue.async {
+            while self.isRunning {
+                if self.isWait {
+                    print("CONNECTION INQUIRY.wait")
+                    self.connection.wait()
+                }
+                self.process(message: self.getQueue())
+            }
+        }
+    }
+    
+    private func process(message: TMessage) {
+        print("inquiry process", message.toLogString())
+        mobileInquiry(message: message)
+    }
+    
+    /**
+     *
+     */
+    
+    private func mobileInquiry(message: TMessage) {
+        Nexilis.saveMessage(message: message)
+        print("save message sendChat")
+        _ = Nexilis.write(message: CoreMessage_TMessageBank.getMobileInquiry(message_id: message.getBody(key: CoreMessage_TMessageKey.MESSAGE_ID)))
+    }
+}

+ 42 - 39
appbuilder-ios/NexilisLite/NexilisLite/Source/Nexilis.swift

@@ -73,8 +73,6 @@ public class Nexilis: NSObject {
             
             IncomingThread.default.run()
             
-            OutgoingThread.default.run()
-            
             if let _ = UserDefaults.standard.stringArray(forKey: "address") {
                 
             }
@@ -178,6 +176,9 @@ public class Nexilis: NSObject {
                 }
             }
             Nexilis.destroyAll()
+            OutgoingThread.default.run()
+            
+            InquiryThread.default.run()
         }
         catch {
             print(error)
@@ -262,7 +263,8 @@ public class Nexilis: NSObject {
     }
     
     public static func addQueueMessage(message: TMessage) {
-        OutgoingThread.default.addQueue(message: message)
+//        OutgoingThread.default.addQueue(message: message)
+        InquiryThread.default.addQueue(message: message)
     }
     
     private static var wbDelegate: WhiteboardDelegate?
@@ -879,15 +881,22 @@ public class Nexilis: NSObject {
         guard !f_pin.isEmpty else {
             return
         }
-        let l_pin = message.getBody(key : CoreMessage_TMessageKey.L_PIN, default_value : "")
-        let scope = message.getBody(key : CoreMessage_TMessageKey.MESSAGE_SCOPE_ID, default_value : "3")
-        let status = message.getBody(key : CoreMessage_TMessageKey.STATUS, default_value : "")
-        let chat_id = message.getBody(key : CoreMessage_TMessageKey.CHAT_ID, default_value : "")
-        let broadcast_flag = message.getBody(key: CoreMessage_TMessageKey.BROADCAST_FLAG, default_value: "0")
-        let is_call_center = message.getBody(key: CoreMessage_TMessageKey.IS_CALL_CENTER, default_value: "0")
-        let call_center_id = message.getBody(key: CoreMessage_TMessageKey.CALL_CENTER_ID, default_value: "")
-        print("prepare save db")
         Database.shared.database?.inTransaction({ (fmdb, rollback) in
+            if let cursor = Database.shared.getRecords(fmdb: fmdb, query: "select message_id from MESSAGE where message_id = '\(message_id)'") {
+                if cursor.next() {
+                    print("message exist")
+                    return
+                }
+                cursor.close()
+            }
+            let l_pin = message.getBody(key : CoreMessage_TMessageKey.L_PIN, default_value : "")
+            let scope = message.getBody(key : CoreMessage_TMessageKey.MESSAGE_SCOPE_ID, default_value : "3")
+            let status = message.getBody(key : CoreMessage_TMessageKey.STATUS, default_value : "")
+            let chat_id = message.getBody(key : CoreMessage_TMessageKey.CHAT_ID, default_value : "")
+            let broadcast_flag = message.getBody(key: CoreMessage_TMessageKey.BROADCAST_FLAG, default_value: "0")
+            let is_call_center = message.getBody(key: CoreMessage_TMessageKey.IS_CALL_CENTER, default_value: "0")
+            let call_center_id = message.getBody(key: CoreMessage_TMessageKey.CALL_CENTER_ID, default_value: "")
+            print("prepare save db")
             do {
                 _ = try Database.shared.insertRecord(fmdb: fmdb, table: "MESSAGE", cvalues: [
                     "message_id" : message_id,
@@ -923,10 +932,8 @@ public class Nexilis: NSObject {
                 rollback.pointee = true
                 print(error)
             }
-        })
-        
-        if withStatus {
-            Database.shared.database?.inTransaction({ (fmdb, rollback) in
+            
+            if withStatus {
                 do {
                     if scope == "4" {
                         for pin in getGroupMembers(fmdb: fmdb, l_pin: l_pin) {
@@ -950,35 +957,31 @@ public class Nexilis: NSObject {
                     rollback.pointee = true
                     print(error)
                 }
-            })
-        }
-        var pin = l_pin
-        if l_pin == me {
-            pin = f_pin
-        }
-        if !chat_id.isEmpty {
-            pin = chat_id
-        }
-        var counter : Int? = nil
-        if l_pin == me || (scope == "4" && f_pin != me) {
-            Database.shared.database?.inTransaction({ (fmdb, rollback) in
+            }
+            var pin = l_pin
+            if l_pin == me {
+                pin = f_pin
+            }
+            if !chat_id.isEmpty {
+                pin = chat_id
+            }
+            var counter : Int? = nil
+            if l_pin == me || (scope == "4" && f_pin != me) {
                 if let cursor = Database.shared.getRecords(fmdb: fmdb, query: "select counter from MESSAGE_SUMMARY where l_pin = '\(pin)'"), cursor.next() {
                     counter = Int(cursor.int(forColumnIndex: 0))
                     counter! += 1
                     cursor.close()
                     print("select db message summary")
                 }
-            })
+                if counter == nil {
+                    counter = 1
+                    print("set counter message summary")
+                }
+            }
             if counter == nil {
-                counter = 1
-                print("set counter message summary")
+                counter = 0
             }
-        }
-        if counter == nil {
-            counter = 0
-        }
-        if is_call_center == "0" {
-            Database.shared.database?.inTransaction({ (fmdb, rollback) in
+            if is_call_center == "0" {
                 do {
                     _ = try Database.shared.insertRecord(fmdb: fmdb, table: "MESSAGE_SUMMARY", cvalues: [
                         "l_pin" : pin,
@@ -989,9 +992,9 @@ public class Nexilis: NSObject {
                     rollback.pointee = true
                     print(error)
                 }
-            })
-        }
-        print("insert db message summary \(message_id)")
+            }
+            print("insert db message summary \(message_id)")
+        })
         
     }
     

+ 5 - 8
appbuilder-ios/NexilisLite/NexilisLite/Source/OutgoingThread.swift

@@ -122,9 +122,6 @@ class OutgoingThread {
      */
     
     private func sendChat(message: TMessage) {
-        Nexilis.saveMessage(message: message)
-        print("save message sendChat")
-        
         // if media exist upload first
         var fileName = message.getBody(key: CoreMessage_TMessageKey.IMAGE_ID, default_value: "")
         if fileName.isEmpty {
@@ -167,11 +164,11 @@ class OutgoingThread {
                                             self.delOutgoing(fmdb: fmdb, messageId: messageId)
                                         })
                                     } else {
-                                        self.addQueue(message, at: 0)
+                                        InquiryThread.default.addQueue(message: message)
                                     }
                                 }
                             } else {
-                                self.addQueue(message, at: 0)
+                                InquiryThread.default.addQueue(message: message)
                             }
                         }
                     }
@@ -193,11 +190,11 @@ class OutgoingThread {
                                     self.delOutgoing(fmdb: fmdb, messageId: messageId)
                                 })
                             } else {
-                                self.addQueue(message, at: 0)
+                                InquiryThread.default.addQueue(message: message)
                             }
                         }
                     } else {
-                        self.addQueue(message, at: 0)
+                        InquiryThread.default.addQueue(message: message)
                     }
                 }
             }
@@ -212,7 +209,7 @@ class OutgoingThread {
                     self.delOutgoing(fmdb: fmdb, messageId: messageId)
                 })
             } else {
-                self.addQueue(message, at: 0)
+                InquiryThread.default.addQueue(message: message)
             }
         }
     }

+ 1 - 1
appbuilder-ios/NexilisLite/NexilisLite/Source/TMessage.swift

@@ -43,7 +43,7 @@ public class TMessage {
         _ = unpack(data: data)
     }
     
-    init(type: String, version: String, code: String,status: String, pin: String, l_pin: String, bodies:[String: String], media:  [UInt8]) {
+    init(type: String, version: String = "1.0.106", code: String,status: String, pin: String, l_pin: String, bodies:[String: String], media:  [UInt8]) {
         mType = type
         mVersion = version
         mCode = code

+ 2 - 1
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/ChangeNamePassswordViewController.swift

@@ -71,7 +71,8 @@ public class ChangeNamePassswordViewController: UIViewController {
             self.navigationController?.popViewController(animated: true)
             self.isSuccess?()
         } else {
-            self.dismiss(animated: true, completion: nil)
+            let vc = self.navigationController?.presentingViewController
+            vc?.dismiss(animated: true, completion: nil)
         }
     }
     

+ 3 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/ContactChatViewController.swift

@@ -689,6 +689,9 @@ extension ContactChatViewController {
             if content.subviews.count > 0 {
                 content.subviews.forEach { $0.removeFromSuperview() }
             }
+            if chats.count == 0 {
+                return cell
+            }
             let data: Chat
             if isFilltering {
                 data = fillteredData[indexPath.row] as! Chat