ソースを参照

menyamakan state dengan android

alqindiirsyam 2 年 前
コミット
c42dbcd943

+ 22 - 15
appbuilder-ios/AppBuilder/AppBuilder/FourthTabViewController.swift

@@ -152,13 +152,13 @@ public class FourthTabViewController: UIViewController, UITableViewDelegate, UIT
                         Item(icon: UIImage(systemName: "person.fill"), title: "Personal Information".localized()),
                         Item(icon: UIImage(systemName: "textformat.abc"), title: "Change Language".localized()),
                         Item(icon: UIImage(systemName: "person.crop.rectangle"), title: "Change Admin / Internal Password".localized()),
-                        Item(icon: UIImage(systemName: "laptopcomputer.and.iphone"), title: "Login to Web".localized()),
+                        Item(icon: UIImage(systemName: "laptopcomputer.and.iphone"), title: "Sign-In to Web".localized()),
                     ]
                 } else if cursorUser.string(forColumnIndex: 0) == "23" || cursorUser.string(forColumnIndex: 0) == "24" {
                     Item.menus["Personal"] = [
                         Item(icon: UIImage(systemName: "person.fill"), title: "Personal Information".localized()),
                         Item(icon: UIImage(systemName: "textformat.abc"), title: "Change Language".localized()),
-                        Item(icon: UIImage(systemName: "laptopcomputer.and.iphone"), title: "Login to Web".localized()),
+                        Item(icon: UIImage(systemName: "laptopcomputer.and.iphone"), title: "Sign-In to Web".localized()),
                     ]
                 } else {
                     Item.menus["Personal"] = [
@@ -168,9 +168,9 @@ public class FourthTabViewController: UIViewController, UITableViewDelegate, UIT
                     ]
                 }
                 if !isChangeProfile {
-                    Item.menus["Personal"]?.append(Item(icon: UIImage(systemName: "arrow.up.and.person.rectangle.portrait"), title: "Login".localized()))
+                    Item.menus["Personal"]?.append(Item(icon: UIImage(systemName: "arrow.up.and.person.rectangle.portrait"), title: "Sign-Up/Sign-In".localized()))
                 } else if isChangeProfile {
-                    Item.menus["Personal"]?.append(Item(icon: UIImage(systemName: "rectangle.portrait.and.arrow.right"), title: "Logout".localized()))
+                    Item.menus["Personal"]?.append(Item(icon: UIImage(systemName: "rectangle.portrait.and.arrow.right"), title: "Sign Out".localized()))
                 }
                 let image = cursorUser.string(forColumnIndex: 1)
                 if image != nil {
@@ -213,7 +213,7 @@ public class FourthTabViewController: UIViewController, UITableViewDelegate, UIT
                     Item(icon: UIImage(systemName: "person.fill"), title: "Personal Information".localized()),
                         Item(icon: UIImage(systemName: "textformat.abc"), title: "Change Language".localized()),
                     Item(icon: UIImage(systemName: "person.crop.rectangle"), title: "Access Admin / Internal Features".localized()),
-                    Item(icon: UIImage(systemName: "arrow.up.and.person.rectangle.portrait"), title: "Login".localized())
+                    Item(icon: UIImage(systemName: "arrow.up.and.person.rectangle.portrait"), title: "Sign-Up/Sign-In".localized())
                 ]
                 if !imageSignIn.isEmpty {
                     do {
@@ -330,9 +330,9 @@ public class FourthTabViewController: UIViewController, UITableViewDelegate, UIT
                 cell.accessoryType = .disclosureIndicator
             case "Access Admin / Internal Features".localized():
                 cell.accessoryType = .disclosureIndicator
-            case "Login to Web".localized():
+            case "Sign-In to Web".localized():
                 cell.accessoryType = .disclosureIndicator
-            case "Login".localized():
+            case "Sign-Up/Sign-In".localized():
                 cell.accessoryType = .disclosureIndicator
             case "Notification Message(s)".localized():
                 cell.accessoryType = .disclosureIndicator
@@ -446,15 +446,22 @@ public class FourthTabViewController: UIViewController, UITableViewDelegate, UIT
                 ThirdTabViewController.forceRefresh = true
             }))
             self.present(alert, animated: true, completion: nil)
-        } else if item.title == "Login".localized() {
+        } else if item.title == "Sign-In".localized() {
             let controller = AppStoryBoard.Palio.instance.instantiateViewController(withIdentifier: "changeDevice") as! ChangeDeviceViewController
             controller.isDismiss = { newThumb in
                 self.makeMenu(imageSignIn: newThumb)
                 self.tableView.reloadData()
             }
             navigationController?.show(controller, sender: nil)
-        } else if item.title == "Logout".localized() {
-            let alert = UIAlertController(title: "Logout".localized(), message: "Are you sure want to logout?".localized(), preferredStyle: .alert)
+        } else if item.title == "Sign-Up/Sign-In".localized() {
+            let controller = AppStoryBoard.Palio.instance.instantiateViewController(withIdentifier: "signupsignin") as! SignUpSignIn
+            controller.isDismiss = { newThumb in
+                self.makeMenu(imageSignIn: newThumb)
+                self.tableView.reloadData()
+            }
+            navigationController?.show(controller, sender: nil)
+        } else if item.title == "Sign Out".localized() {
+            let alert = UIAlertController(title: "Sign Out".localized(), message: "Are you sure want to logout?".localized(), preferredStyle: .alert)
             alert.addAction(UIAlertAction(title: "Cancel".localized(), style: UIAlertAction.Style.default, handler: nil))
             alert.addAction(UIAlertAction(title: "Yes".localized(), style: .destructive, handler: {(_) in
                 if !CheckConnection.isConnectedToNetwork()  || API.nGetCLXConnState() == 0 {
@@ -484,7 +491,7 @@ public class FourthTabViewController: UIViewController, UITableViewDelegate, UIT
                                 Nexilis.hideLoader(completion: {
                                     let imageView = UIImageView(image: UIImage(systemName: "checkmark.circle.fill"))
                                     imageView.tintColor = .white
-                                    let banner = FloatingNotificationBanner(title: "Successfully Logout".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
+                                    let banner = FloatingNotificationBanner(title: "Successfully Sign Out".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
                                     banner.show()
                                     var dataImage: [AnyHashable : Any] = [:]
                                     dataImage["name"] = ""
@@ -525,7 +532,7 @@ public class FourthTabViewController: UIViewController, UITableViewDelegate, UIT
                 }
             }))
             self.present(alert, animated: true, completion: nil)
-        } else if item.title == "Login to Web".localized() {
+        } else if item.title == "Sign-In to Web".localized() {
             var permissionCheck = -1
             if AVCaptureDevice.authorizationStatus(for: .video) ==  .authorized {
                 permissionCheck = 1
@@ -606,7 +613,7 @@ public class FourthTabViewController: UIViewController, UITableViewDelegate, UIT
                 buttonHideUnhide.tintColor = .black
                 buttonHideUnhide.addTarget(self, action: #selector(self.showPassword), for: .touchUpInside)
             }
-            let submitAction = UIAlertAction(title: "Login".localized(), style: .default, handler: { (action) -> Void in
+            let submitAction = UIAlertAction(title: "Sign-In".localized(), style: .default, handler: { (action) -> Void in
                 let textField = self.alert?.textFields![0]
                 if !CheckConnection.isConnectedToNetwork()  || API.nGetCLXConnState() == 0 {
                     let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
@@ -621,7 +628,7 @@ public class FourthTabViewController: UIViewController, UITableViewDelegate, UIT
                             DispatchQueue.main.async {
                                 let imageView = UIImageView(image: UIImage(systemName: "checkmark.circle.fill"))
                                 imageView.tintColor = .white
-                                let banner = FloatingNotificationBanner(title: "Successfully login Admin".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
+                                let banner = FloatingNotificationBanner(title: "Successfully Sign-In Admin".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
                                 banner.show()
                                 let itemCP = Item(icon: UIImage(systemName: "person.crop.rectangle"), title: "Change Admin / Internal Password".localized())
                                 Item.menus["Personal"]?[1] = itemCP
@@ -635,7 +642,7 @@ public class FourthTabViewController: UIViewController, UITableViewDelegate, UIT
                             DispatchQueue.main.async {
                                 let imageView = UIImageView(image: UIImage(systemName: "checkmark.circle.fill"))
                                 imageView.tintColor = .white
-                                let banner = FloatingNotificationBanner(title: "Successfully login Internal Team".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
+                                let banner = FloatingNotificationBanner(title: "Successfully Sign-In Internal Team".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
                                 banner.show()
                                 Item.menus["Personal"]?.remove(at: 1)
                                 self.tableView.reloadData()

+ 35 - 35
appbuilder-ios/AppBuilder/AppBuilder/ViewController.swift

@@ -67,13 +67,13 @@ class ViewController: UITabBarController, UITabBarControllerDelegate, SettingMAB
         self.delegate = self
         
         
-        firstTab?.tabBarItem.image = resizeImage(image: UIImage(named: "tab_1_icon")!, targetSize: CGSize(width: 40, height: 40)).withRenderingMode(.alwaysOriginal)
+        firstTab?.tabBarItem.image = resizeImage(image: UIImage(named: "tab_1_icon")!, targetSize: CGSize(width: 25, height: 25)).withRenderingMode(.alwaysOriginal)
         firstTab?.tabBarItem.imageInsets = UIEdgeInsets.init(top: 5,left: 0,bottom: -5,right: 0)
-        secondTab?.tabBarItem.image = resizeImage(image: UIImage(named: "tab_2_icon")!, targetSize: CGSize(width: 40, height: 40)).withRenderingMode(.alwaysOriginal)
+        secondTab?.tabBarItem.image = resizeImage(image: UIImage(named: "tab_2_icon")!, targetSize: CGSize(width: 25, height: 25)).withRenderingMode(.alwaysOriginal)
         secondTab?.tabBarItem.imageInsets = UIEdgeInsets.init(top: 5,left: 0,bottom: -5,right: 0)
-        thirdTab?.tabBarItem.image = resizeImage(image: UIImage(named: "tab_3_icon")!, targetSize: CGSize(width: 40, height: 40)).withRenderingMode(.alwaysOriginal)
+        thirdTab?.tabBarItem.image = resizeImage(image: UIImage(named: "tab_3_icon")!, targetSize: CGSize(width: 25, height: 25)).withRenderingMode(.alwaysOriginal)
         thirdTab?.tabBarItem.imageInsets = UIEdgeInsets.init(top: 5,left: 0,bottom: -5,right: 0)
-        fourthTab?.tabBarItem.image = resizeImage(image: UIImage(named: "tab_4_icon")!, targetSize: CGSize(width: 40, height: 40)).withRenderingMode(.alwaysOriginal)
+        fourthTab?.tabBarItem.image = resizeImage(image: UIImage(named: "tab_4_icon")!, targetSize: CGSize(width: 25, height: 25)).withRenderingMode(.alwaysOriginal)
         fourthTab?.tabBarItem.imageInsets = UIEdgeInsets.init(top: 5,left: 0,bottom: -5,right: 0)
         var i = 0
         var j = 0
@@ -159,7 +159,7 @@ class ViewController: UITabBarController, UITabBarControllerDelegate, SettingMAB
             self.tabBar.items?[2].isEnabled = false
         }
         let numberOfItems = CGFloat(tabBar.items!.count)
-        let tabBarItemSize = CGSize(width: tabBar.frame.width / numberOfItems, height: 65)
+        let tabBarItemSize = CGSize(width: tabBar.frame.width / numberOfItems, height: tabBar.frame.height)
         tabBar.selectionIndicatorImage = UIImage.imageWithColor(color: UIColor.black.withAlphaComponent(0.2), size: tabBarItemSize).resizableImage(withCapInsets: .zero)
         if Bundle.main.displayName == "DigiNetS" {
             tabBar.selectionIndicatorImage = UIImage.imageWithColor(color: UIColor.gray, size: tabBarItemSize).resizableImage(withCapInsets: .zero)
@@ -167,11 +167,11 @@ class ViewController: UITabBarController, UITabBarControllerDelegate, SettingMAB
         UIFont.overrideInitialize()
     }
 
-    override func viewDidLayoutSubviews() {
-        super.viewDidLayoutSubviews()
-        tabBar.frame.size.height = 65
-        tabBar.frame.origin.y = view.frame.height - 65
-    }
+//    override func viewDidLayoutSubviews() {
+//        super.viewDidLayoutSubviews()
+//        tabBar.frame.size.height = 65
+//        tabBar.frame.origin.y = view.frame.height - 65
+//    }
     
     func settingDelegate() {
         if self.viewControllers?.firstIndex(of: fourthTab!) == nil {
@@ -290,45 +290,45 @@ class ViewController: UITabBarController, UITabBarControllerDelegate, SettingMAB
     }
     
     func createMidFloatingButton(){
-        ViewController.chatButton = UIButton(frame: CGRect(x: self.view.bounds.width / 2 - 30 , y: self.view.bounds.height - 80, width: 60, height: 60))
+        ViewController.chatButton = UIButton(frame: CGRect(x: self.view.bounds.width / 2 - 30 , y: self.view.bounds.height - 80, width: 45, height: 45))
         ViewController.chatButton.setBackgroundImage(UIImage(named: "pb_button_chat", in: Bundle.resourceBundle(for: Nexilis.self), with: nil)!.withRenderingMode(.alwaysOriginal), for: .normal)
         ViewController.chatButton.layer.shadowColor = UIColor.black.cgColor
         ViewController.chatButton.layer.shadowOpacity = 0.1
         ViewController.chatButton.layer.shadowOffset = CGSize(width: 4, height: 4)
         ViewController.chatButton.addTarget(self, action: #selector(chatTap), for: .touchUpInside)
 
-        ViewController.callButton = UIButton(frame: CGRect(x: self.view.bounds.width / 2 - 30 , y: self.view.bounds.height - 80, width: 60, height: 60))
+        ViewController.callButton = UIButton(frame: CGRect(x: self.view.bounds.width / 2 - 30 , y: self.view.bounds.height - 80, width: 45, height: 45))
         ViewController.callButton.setBackgroundImage(UIImage(named: "pb_button_call", in: Bundle.resourceBundle(for: Nexilis.self), with: nil)!.withRenderingMode(.alwaysOriginal), for: .normal)
         ViewController.callButton.layer.shadowColor = UIColor.black.cgColor
         ViewController.callButton.layer.shadowOpacity = 0.1
         ViewController.callButton.layer.shadowOffset = CGSize(width: 4, height: 4)
         ViewController.callButton.addTarget(self, action: #selector(callTap), for: .touchUpInside)
 
-        ViewController.ccButton = UIButton(frame: CGRect(x: self.view.bounds.width / 2 - 30 , y: self.view.bounds.height - 80, width: 60, height: 60))
+        ViewController.ccButton = UIButton(frame: CGRect(x: self.view.bounds.width / 2 - 30 , y: self.view.bounds.height - 80, width: 45, height: 45))
         ViewController.ccButton.setBackgroundImage(UIImage(named: "pb_button_cc", in: Bundle.resourceBundle(for: Nexilis.self), with: nil)!.withRenderingMode(.alwaysOriginal), for: .normal)
         ViewController.ccButton.layer.shadowColor = UIColor.black.cgColor
         ViewController.ccButton.layer.shadowOpacity = 0.1
         ViewController.ccButton.layer.shadowOffset = CGSize(width: 4, height: 4)
         ViewController.ccButton.addTarget(self, action: #selector(ccTap), for: .touchUpInside)
 
-        ViewController.streamingButton = UIButton(frame: CGRect(x: self.view.bounds.width / 2 - 30 , y: self.view.bounds.height - 80, width: 60, height: 60))
+        ViewController.streamingButton = UIButton(frame: CGRect(x: self.view.bounds.width / 2 - 30 , y: self.view.bounds.height - 80, width: 45, height: 45))
         ViewController.streamingButton.setBackgroundImage(UIImage(named: "pb_button_stream", in: Bundle.resourceBundle(for: Nexilis.self), with: nil)!.withRenderingMode(.alwaysOriginal), for: .normal)
         ViewController.streamingButton.layer.shadowColor = UIColor.black.cgColor
         ViewController.streamingButton.layer.shadowOpacity = 0.1
         ViewController.streamingButton.layer.shadowOffset = CGSize(width: 4, height: 4)
         ViewController.streamingButton.addTarget(self, action: #selector(streamTap), for: .touchUpInside)
 
-        ViewController.postButton = UIButton(frame: CGRect(x: self.view.bounds.width / 2 - 30 , y: self.view.bounds.height - 80, width: 60, height: 60))
+        ViewController.postButton = UIButton(frame: CGRect(x: self.view.bounds.width / 2 - 30 , y: self.view.bounds.height - 80, width: 45, height: 45))
         ViewController.postButton.setBackgroundImage(UIImage(named: "pb_button_post", in: Bundle.resourceBundle(for: Nexilis.self), with: nil)!.withRenderingMode(.alwaysOriginal), for: .normal)
         ViewController.postButton.layer.shadowColor = UIColor.black.cgColor
         ViewController.postButton.layer.shadowOpacity = 0.1
         ViewController.postButton.layer.shadowOffset = CGSize(width: 4, height: 4)
         ViewController.postButton.addTarget(self, action: #selector(postTap), for: .touchUpInside)
         let buttonCenterX = self.view.bounds.width / 2
-        let buttonCenterY = self.view.bounds.height - 65
+        let buttonCenterY = self.view.bounds.height - self.tabBar.bounds.height
         print("buttonCenterX \(buttonCenterX)")
         print("buttonCenterY \(buttonCenterY)")
-        ViewController.middleButton = UIButton(frame: CGRect(x: buttonCenterX - 50 , y: buttonCenterY - 55, width: 100, height: 100))
+        ViewController.middleButton = UIButton(frame: CGRect(x: buttonCenterX - 40 , y: buttonCenterY - 40, width: 80, height: 80))
         if PrefsUtil.getIconDock() != nil {
             DispatchQueue.global().async {
                 ViewController.getDataImageFromUrl(from: URL(string: PrefsUtil.getUrlDock()!)!) { data, response, error in
@@ -935,20 +935,20 @@ class ViewController: UITabBarController, UITabBarControllerDelegate, SettingMAB
         }
         if ViewController.isExpandButton {
             ViewController.isExpandButton = false
-            let xChatPosition = ViewController.chatButton.frame.origin.x + 120
-            let yChatPosition = ViewController.chatButton.frame.origin.y + 55
+            let xChatPosition = ViewController.chatButton.frame.origin.x + 80
+            let yChatPosition = ViewController.chatButton.frame.origin.y + 20
 
-            let xCallPosition = ViewController.callButton.frame.origin.x + 75
-            let yCallPosition = ViewController.callButton.frame.origin.y + 110
+            let xCallPosition = ViewController.callButton.frame.origin.x + 50
+            let yCallPosition = ViewController.callButton.frame.origin.y + 70
 
             let xCCPosition = ViewController.ccButton.frame.origin.x
-            let yCCPosition = ViewController.ccButton.frame.origin.y + 135
+            let yCCPosition = ViewController.ccButton.frame.origin.y + 90
 
-            let xPostPosition = ViewController.postButton.frame.origin.x - 75
-            let yPostPosition = ViewController.postButton.frame.origin.y + 110
+            let xPostPosition = ViewController.postButton.frame.origin.x - 55
+            let yPostPosition = ViewController.postButton.frame.origin.y + 70
 
-            let xStreamingPosition = ViewController.streamingButton.frame.origin.x - 120
-            let yStreamingPosition = ViewController.streamingButton.frame.origin.y + 55
+            let xStreamingPosition = ViewController.streamingButton.frame.origin.x - 90
+            let yStreamingPosition = ViewController.streamingButton.frame.origin.y + 20
             UIView.animate(withDuration: 0.5, animations: {
 //                if !ViewController.isBlue {
 //                    ViewController.middleButton.transform = CGAffineTransform(rotationAngle: 0)
@@ -967,20 +967,20 @@ class ViewController: UITabBarController, UITabBarControllerDelegate, SettingMAB
         } else {
             ViewController.isExpandButton = true
             ViewController.showDockedButton()
-            let xChatPosition = ViewController.chatButton.frame.origin.x - 120
-            let yChatPosition = ViewController.chatButton.frame.origin.y - 55
+            let xChatPosition = ViewController.chatButton.frame.origin.x - 80
+            let yChatPosition = ViewController.chatButton.frame.origin.y - 20
 
-            let xCallPosition = ViewController.callButton.frame.origin.x - 75
-            let yCallPosition = ViewController.callButton.frame.origin.y - 110
+            let xCallPosition = ViewController.callButton.frame.origin.x - 50
+            let yCallPosition = ViewController.callButton.frame.origin.y - 70
 
             let xCCPosition = ViewController.ccButton.frame.origin.x
-            let yCCPosition = ViewController.ccButton.frame.origin.y - 135
+            let yCCPosition = ViewController.ccButton.frame.origin.y - 90
 
-            let xPostPosition = ViewController.postButton.frame.origin.x + 75
-            let yPostPosition = ViewController.postButton.frame.origin.y - 110
+            let xPostPosition = ViewController.postButton.frame.origin.x + 55
+            let yPostPosition = ViewController.postButton.frame.origin.y - 70
 
-            let xStreamingPosition = ViewController.streamingButton.frame.origin.x + 120
-            let yStreamingPosition = ViewController.streamingButton.frame.origin.y - 55
+            let xStreamingPosition = ViewController.streamingButton.frame.origin.x + 90
+            let yStreamingPosition = ViewController.streamingButton.frame.origin.y - 20
             UIView.animate(withDuration: 0.5, animations: {
 //                if !ViewController.isBlue{
 //                    ViewController.middleButton.transform = CGAffineTransform(rotationAngle: .pi / 2)

+ 30 - 38
appbuilder-ios/NexilisLite/NexilisLite.xcodeproj/project.pbxproj

@@ -91,13 +91,6 @@
 		249A7B6027DF06A000694745 /* CoreMessage_TMessageUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 249A7B1B27DF06A000694745 /* CoreMessage_TMessageUtil.swift */; };
 		6B16CD28273CC71800F9E528 /* Palio.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6B16CCE5273CC71800F9E528 /* Palio.storyboard */; };
 		6B16CD32273CC9FB00F9E528 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6B16CD31273CC9FB00F9E528 /* Assets.xcassets */; };
-		6B16CD3B273CCAC900F9E528 /* Poppins-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6B16CD34273CCAC900F9E528 /* Poppins-Light.ttf */; };
-		6B16CD3C273CCAC900F9E528 /* Poppins-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6B16CD35273CCAC900F9E528 /* Poppins-Medium.ttf */; };
-		6B16CD3D273CCAC900F9E528 /* Poppins-SemiBoldItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6B16CD36273CCAC900F9E528 /* Poppins-SemiBoldItalic.ttf */; };
-		6B16CD3E273CCAC900F9E528 /* Poppins-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6B16CD37273CCAC900F9E528 /* Poppins-Regular.ttf */; };
-		6B16CD3F273CCAC900F9E528 /* Poppins-LightItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6B16CD38273CCAC900F9E528 /* Poppins-LightItalic.ttf */; };
-		6B16CD40273CCAC900F9E528 /* Poppins-SemiBold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6B16CD39273CCAC900F9E528 /* Poppins-SemiBold.ttf */; };
-		6B16CD41273CCAC900F9E528 /* Poppins-MediumItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 6B16CD3A273CCAC900F9E528 /* Poppins-MediumItalic.ttf */; };
 		6B16CD44273CCB7F00F9E528 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6B16CD46273CCB7F00F9E528 /* Localizable.strings */; };
 		6B16CD99273CF75400F9E528 /* sticker_10000000_5.png in Resources */ = {isa = PBXBuildFile; fileRef = 6B16CD4D273CF75400F9E528 /* sticker_10000000_5.png */; };
 		6B16CD9A273CF75400F9E528 /* sticker_20000000_22.png in Resources */ = {isa = PBXBuildFile; fileRef = 6B16CD4E273CF75400F9E528 /* sticker_20000000_22.png */; };
@@ -176,6 +169,13 @@
 		6B16CDE3273CF75500F9E528 /* sticker_20000000_0.png in Resources */ = {isa = PBXBuildFile; fileRef = 6B16CD97273CF75400F9E528 /* sticker_20000000_0.png */; };
 		6B16CDE4273CF75500F9E528 /* sticker_10000000_8.png in Resources */ = {isa = PBXBuildFile; fileRef = 6B16CD98273CF75400F9E528 /* sticker_10000000_8.png */; };
 		6B36BE9D27477E29002807E0 /* NexilisLite.podspec in Resources */ = {isa = PBXBuildFile; fileRef = 6B36BE9C27477E29002807E0 /* NexilisLite.podspec */; };
+		CD22A37E29764B10008C107D /* NotificationSound.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD22A37729764B10008C107D /* NotificationSound.swift */; };
+		CD22A37F29764B10008C107D /* SetOfficerBNI.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD22A37829764B10008C107D /* SetOfficerBNI.swift */; };
+		CD22A38029764B10008C107D /* QRScannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD22A37929764B10008C107D /* QRScannerView.swift */; };
+		CD22A38129764B10008C107D /* ScannerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD22A37A29764B10008C107D /* ScannerViewController.swift */; };
+		CD22A38229764B10008C107D /* VerifyEmail.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD22A37B29764B10008C107D /* VerifyEmail.swift */; };
+		CD22A38329764B10008C107D /* MessageInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD22A37C29764B10008C107D /* MessageInfo.swift */; };
+		CD22A38429764B10008C107D /* SignUpSignIn.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD22A37D29764B10008C107D /* SignUpSignIn.swift */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXCopyFilesBuildPhase section */
@@ -281,13 +281,6 @@
 		6B16CC9B273CC66B00F9E528 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
 		6B16CCE5273CC71800F9E528 /* Palio.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Palio.storyboard; sourceTree = "<group>"; };
 		6B16CD31273CC9FB00F9E528 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
-		6B16CD34273CCAC900F9E528 /* Poppins-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Poppins-Light.ttf"; sourceTree = "<group>"; };
-		6B16CD35273CCAC900F9E528 /* Poppins-Medium.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Poppins-Medium.ttf"; sourceTree = "<group>"; };
-		6B16CD36273CCAC900F9E528 /* Poppins-SemiBoldItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Poppins-SemiBoldItalic.ttf"; sourceTree = "<group>"; };
-		6B16CD37273CCAC900F9E528 /* Poppins-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Poppins-Regular.ttf"; sourceTree = "<group>"; };
-		6B16CD38273CCAC900F9E528 /* Poppins-LightItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Poppins-LightItalic.ttf"; sourceTree = "<group>"; };
-		6B16CD39273CCAC900F9E528 /* Poppins-SemiBold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Poppins-SemiBold.ttf"; sourceTree = "<group>"; };
-		6B16CD3A273CCAC900F9E528 /* Poppins-MediumItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Poppins-MediumItalic.ttf"; sourceTree = "<group>"; };
 		6B16CD45273CCB7F00F9E528 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
 		6B16CD47273CCB9B00F9E528 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/Localizable.strings; sourceTree = "<group>"; };
 		6B16CD4D273CF75400F9E528 /* sticker_10000000_5.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = sticker_10000000_5.png; sourceTree = "<group>"; };
@@ -368,6 +361,13 @@
 		6B16CD98273CF75400F9E528 /* sticker_10000000_8.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = sticker_10000000_8.png; sourceTree = "<group>"; };
 		6B36BE9C27477E29002807E0 /* NexilisLite.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NexilisLite.podspec; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
 		7F4EF61950630BA832D1595D /* Pods-QmeraLite.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-QmeraLite.debug.xcconfig"; path = "Target Support Files/Pods-QmeraLite/Pods-QmeraLite.debug.xcconfig"; sourceTree = "<group>"; };
+		CD22A37729764B10008C107D /* NotificationSound.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationSound.swift; sourceTree = "<group>"; };
+		CD22A37829764B10008C107D /* SetOfficerBNI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SetOfficerBNI.swift; sourceTree = "<group>"; };
+		CD22A37929764B10008C107D /* QRScannerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QRScannerView.swift; sourceTree = "<group>"; };
+		CD22A37A29764B10008C107D /* ScannerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScannerViewController.swift; sourceTree = "<group>"; };
+		CD22A37B29764B10008C107D /* VerifyEmail.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VerifyEmail.swift; sourceTree = "<group>"; };
+		CD22A37C29764B10008C107D /* MessageInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageInfo.swift; sourceTree = "<group>"; };
+		CD22A37D29764B10008C107D /* SignUpSignIn.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignUpSignIn.swift; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -500,6 +500,13 @@
 		249A7AFD27DF06A000694745 /* Control */ = {
 			isa = PBXGroup;
 			children = (
+				CD22A37C29764B10008C107D /* MessageInfo.swift */,
+				CD22A37729764B10008C107D /* NotificationSound.swift */,
+				CD22A37929764B10008C107D /* QRScannerView.swift */,
+				CD22A37A29764B10008C107D /* ScannerViewController.swift */,
+				CD22A37829764B10008C107D /* SetOfficerBNI.swift */,
+				CD22A37D29764B10008C107D /* SignUpSignIn.swift */,
+				CD22A37B29764B10008C107D /* VerifyEmail.swift */,
 				2471CD0527FAA851006C38B5 /* ChangeDeviceViewController.swift */,
 				2471CD0427FAA851006C38B5 /* ChangeNamePassswordViewController.swift */,
 				2471CD0627FAA851006C38B5 /* ChangePasswordViewController.swift */,
@@ -570,26 +577,11 @@
 			path = NexilisLite;
 			sourceTree = "<group>";
 		};
-		6B16CD33273CCAC800F9E528 /* fonts */ = {
-			isa = PBXGroup;
-			children = (
-				6B16CD34273CCAC900F9E528 /* Poppins-Light.ttf */,
-				6B16CD35273CCAC900F9E528 /* Poppins-Medium.ttf */,
-				6B16CD36273CCAC900F9E528 /* Poppins-SemiBoldItalic.ttf */,
-				6B16CD37273CCAC900F9E528 /* Poppins-Regular.ttf */,
-				6B16CD38273CCAC900F9E528 /* Poppins-LightItalic.ttf */,
-				6B16CD39273CCAC900F9E528 /* Poppins-SemiBold.ttf */,
-				6B16CD3A273CCAC900F9E528 /* Poppins-MediumItalic.ttf */,
-			);
-			path = fonts;
-			sourceTree = "<group>";
-		};
 		6B16CD48273CCFF100F9E528 /* Resource */ = {
 			isa = PBXGroup;
 			children = (
 				6B16CD4C273CF75400F9E528 /* Stickers */,
 				6B16CD31273CC9FB00F9E528 /* Assets.xcassets */,
-				6B16CD33273CCAC800F9E528 /* fonts */,
 				6B16CD46273CCB7F00F9E528 /* Localizable.strings */,
 				6B16CCE5273CC71800F9E528 /* Palio.storyboard */,
 			);
@@ -781,7 +773,6 @@
 				6B16CDB2273CF75500F9E528 /* sticker_30000000_29.png in Resources */,
 				6B16CDCF273CF75500F9E528 /* sticker_20000000_2.png in Resources */,
 				6B16CD44273CCB7F00F9E528 /* Localizable.strings in Resources */,
-				6B16CD3E273CCAC900F9E528 /* Poppins-Regular.ttf in Resources */,
 				249A7B2E27DF06A000694745 /* PreviewAttachmentImageVideo.xib in Resources */,
 				6B16CDC5273CF75500F9E528 /* sticker_20000000_7.png in Resources */,
 				6B16CD9C273CF75400F9E528 /* sticker_30000000_10.png in Resources */,
@@ -791,11 +782,9 @@
 				6B16CDB4273CF75500F9E528 /* sticker_30000000_14.png in Resources */,
 				6B16CDB3273CF75500F9E528 /* sticker_30000000_28.png in Resources */,
 				6B16CDC0273CF75500F9E528 /* sticker_30000000_18.png in Resources */,
-				6B16CD3B273CCAC900F9E528 /* Poppins-Light.ttf in Resources */,
 				6B16CDD0273CF75500F9E528 /* sticker_20000000_11.png in Resources */,
 				6B16CDAE273CF75500F9E528 /* sticker_10000000_2.png in Resources */,
 				6B16CDE2273CF75500F9E528 /* sticker_20000000_13.png in Resources */,
-				6B16CD3C273CCAC900F9E528 /* Poppins-Medium.ttf in Resources */,
 				6B16CDB6273CF75500F9E528 /* sticker_10000000_1.png in Resources */,
 				6B16CDC3273CF75500F9E528 /* sticker_10000000_11.png in Resources */,
 				6B16CDA7273CF75500F9E528 /* sticker_20000000_20.png in Resources */,
@@ -812,8 +801,6 @@
 				6B16CDA0273CF75400F9E528 /* sticker_10000000_4.png in Resources */,
 				6B36BE9D27477E29002807E0 /* NexilisLite.podspec in Resources */,
 				6B16CDA5273CF75400F9E528 /* sticker_30000000_8.png in Resources */,
-				6B16CD40273CCAC900F9E528 /* Poppins-SemiBold.ttf in Resources */,
-				6B16CD3D273CCAC900F9E528 /* Poppins-SemiBoldItalic.ttf in Resources */,
 				6B16CDDC273CF75500F9E528 /* sticker_30000000_20.png in Resources */,
 				6B16CDAC273CF75500F9E528 /* sticker_30000000_17.png in Resources */,
 				6B16CDA1273CF75400F9E528 /* sticker_10000000_6.png in Resources */,
@@ -830,7 +817,6 @@
 				6B16CDC7273CF75500F9E528 /* sticker_30000000_26.png in Resources */,
 				6B16CD9A273CF75400F9E528 /* sticker_20000000_22.png in Resources */,
 				6B16CDD1273CF75500F9E528 /* sticker_30000000_37.png in Resources */,
-				6B16CD3F273CCAC900F9E528 /* Poppins-LightItalic.ttf in Resources */,
 				6B16CDC6273CF75500F9E528 /* sticker_30000000_32.png in Resources */,
 				6B16CDDE273CF75500F9E528 /* sticker_30000000_6.png in Resources */,
 				6B16CDCA273CF75500F9E528 /* sticker_30000000_27.png in Resources */,
@@ -838,7 +824,6 @@
 				6B16CDA9273CF75500F9E528 /* sticker_10000000_3.png in Resources */,
 				6B16CDD9273CF75500F9E528 /* sticker_10000000_9.png in Resources */,
 				6B16CDDB273CF75500F9E528 /* sticker_20000000_12.png in Resources */,
-				6B16CD41273CCAC900F9E528 /* Poppins-MediumItalic.ttf in Resources */,
 				6B16CDDD273CF75500F9E528 /* sticker_30000000_34.png in Resources */,
 				6B16CDA2273CF75400F9E528 /* sticker_20000000_21.png in Resources */,
 				6B16CDA8273CF75500F9E528 /* sticker_10000000_7.png in Resources */,
@@ -885,9 +870,13 @@
 			buildActionMask = 2147483647;
 			files = (
 				2471CD0927FAA852006C38B5 /* ChangeDeviceViewController.swift in Sources */,
+				CD22A37F29764B10008C107D /* SetOfficerBNI.swift in Sources */,
 				249A7B4B27DF06A000694745 /* GroupNameViewController.swift in Sources */,
+				CD22A38129764B10008C107D /* ScannerViewController.swift in Sources */,
 				249A7B5127DF06A000694745 /* BroadcastVariantViewController.swift in Sources */,
+				CD22A38029764B10008C107D /* QRScannerView.swift in Sources */,
 				249A7B3627DF06A000694745 /* QmeraUserChooserViewController.swift in Sources */,
+				CD22A38429764B10008C107D /* SignUpSignIn.swift in Sources */,
 				249A7B2627DF06A000694745 /* CoreMessage_TMessageKey.swift in Sources */,
 				249A7B4327DF06A000694745 /* GroupCreateViewController.swift in Sources */,
 				249A7B4C27DF06A000694745 /* GroupTopicViewController.swift in Sources */,
@@ -928,11 +917,13 @@
 				249A7B4727DF06A000694745 /* CheckConnection.swift in Sources */,
 				249A7B5427DF06A000694745 /* BroadcastMembersTableViewController.swift in Sources */,
 				249A7B3727DF06A000694745 /* StreamingViewController.swift in Sources */,
+				CD22A38329764B10008C107D /* MessageInfo.swift in Sources */,
 				249A7B2C27DF06A000694745 /* ContactCallViewController.swift in Sources */,
 				249A7B3E27DF06A000694745 /* QmeraCallContactViewController.swift in Sources */,
 				249A7B2527DF06A000694745 /* WhiteboardReceiver.swift in Sources */,
 				249A7B3C27DF06A000694745 /* CallProviderDelegate.swift in Sources */,
 				249A7B4E27DF06A000694745 /* BroadcastModeViewController.swift in Sources */,
+				CD22A37E29764B10008C107D /* NotificationSound.swift in Sources */,
 				249A7B3227DF06A000694745 /* CustomTextView.swift in Sources */,
 				249A7B2927DF06A000694745 /* Chat.swift in Sources */,
 				249A7B2027DF06A000694745 /* FloatingButton.swift in Sources */,
@@ -946,6 +937,7 @@
 				249A7B5227DF06A000694745 /* ImageVideoPicker.swift in Sources */,
 				249A7B4D27DF06A000694745 /* SettingTableViewController.swift in Sources */,
 				249A7B5E27DF06A000694745 /* CoreMessage_TMessageCode.swift in Sources */,
+				CD22A38229764B10008C107D /* VerifyEmail.swift in Sources */,
 				249A7B4527DF06A000694745 /* GroupDescViewController.swift in Sources */,
 				249A7B1C27DF06A000694745 /* OutgoingThread.swift in Sources */,
 				249A7B5927DF06A000694745 /* Utils.swift in Sources */,
@@ -1108,7 +1100,7 @@
 				BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
 				CODE_SIGN_STYLE = Automatic;
 				DEFINES_MODULE = YES;
-				DEVELOPMENT_TEAM = K6CBM92A46;
+				DEVELOPMENT_TEAM = ZGNLXSR5ZF;
 				DYLIB_COMPATIBILITY_VERSION = 1;
 				DYLIB_CURRENT_VERSION = 1;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";
@@ -1142,7 +1134,7 @@
 				BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
 				CODE_SIGN_STYLE = Automatic;
 				DEFINES_MODULE = YES;
-				DEVELOPMENT_TEAM = K6CBM92A46;
+				DEVELOPMENT_TEAM = ZGNLXSR5ZF;
 				DYLIB_COMPATIBILITY_VERSION = 1;
 				DYLIB_CURRENT_VERSION = 1;
 				DYLIB_INSTALL_NAME_BASE = "@rpath";

+ 95 - 4
appbuilder-ios/NexilisLite/NexilisLite/Resource/Palio.storyboard

@@ -1006,43 +1006,54 @@
                                 </constraints>
                             </imageView>
                             <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Your Nickname" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="1fG-j6-8fG">
-                                <rect key="frame" x="20" y="238" width="374" height="34"/>
+                                <rect key="frame" x="20" y="291.5" width="374" height="34"/>
                                 <color key="tintColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                 <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                 <textInputTraits key="textInputTraits"/>
                             </textField>
                             <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Password" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="8GQ-Mu-dYz" customClass="PasswordTextField" customModule="NexilisLite" customModuleProvider="target">
-                                <rect key="frame" x="20" y="282" width="374" height="34"/>
+                                <rect key="frame" x="20" y="335.5" width="374" height="34"/>
                                 <color key="tintColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                 <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                 <textInputTraits key="textInputTraits"/>
                             </textField>
                             <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="X96-Lm-m7m">
-                                <rect key="frame" x="356" y="288" width="27" height="22"/>
+                                <rect key="frame" x="356" y="341.5" width="27" height="22"/>
                                 <color key="tintColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                 <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
                                 <state key="normal" image="eye.fill" catalog="system"/>
                             </button>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Please enter your registered nickname or email address to Sign-In" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rgo-tO-vXt">
+                                <rect key="frame" x="40" y="248" width="334" height="33.5"/>
+                                <color key="tintColor" systemColor="tintColor"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                <color key="textColor" systemColor="systemGrayColor"/>
+                                <nil key="highlightedColor"/>
+                            </label>
                         </subviews>
                         <viewLayoutGuide key="safeArea" id="RPn-R1-EZG"/>
                         <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                         <constraints>
                             <constraint firstItem="X96-Lm-m7m" firstAttribute="top" secondItem="1fG-j6-8fG" secondAttribute="bottom" constant="16" id="3eH-AY-dnA"/>
+                            <constraint firstItem="rgo-tO-vXt" firstAttribute="top" secondItem="kTB-1V-x5Q" secondAttribute="bottom" constant="20" id="5mN-Lm-La3"/>
                             <constraint firstItem="QJj-ZS-JXF" firstAttribute="centerX" secondItem="UOk-bZ-ddQ" secondAttribute="centerX" id="I56-QT-7Lq"/>
                             <constraint firstItem="QJj-ZS-JXF" firstAttribute="top" secondItem="RPn-R1-EZG" secondAttribute="top" constant="40" id="IVA-v0-EhE"/>
+                            <constraint firstItem="rgo-tO-vXt" firstAttribute="leading" secondItem="RPn-R1-EZG" secondAttribute="leading" constant="40" id="Oqw-Zm-Csy"/>
+                            <constraint firstItem="RPn-R1-EZG" firstAttribute="trailing" secondItem="rgo-tO-vXt" secondAttribute="trailing" constant="40" id="QEU-wE-tmh"/>
                             <constraint firstItem="RPn-R1-EZG" firstAttribute="trailing" secondItem="8GQ-Mu-dYz" secondAttribute="trailing" constant="20" id="QvO-M0-7PR"/>
                             <constraint firstItem="RPn-R1-EZG" firstAttribute="trailing" secondItem="X96-Lm-m7m" secondAttribute="trailing" constant="31" id="Y3N-ed-Mqv"/>
                             <constraint firstItem="kTB-1V-x5Q" firstAttribute="leading" secondItem="UOk-bZ-ddQ" secondAttribute="leadingMargin" constant="20" id="b0l-Gg-PoT"/>
+                            <constraint firstItem="1fG-j6-8fG" firstAttribute="top" secondItem="rgo-tO-vXt" secondAttribute="bottom" constant="10" id="dk2-X5-Kmg"/>
                             <constraint firstItem="1fG-j6-8fG" firstAttribute="leading" secondItem="RPn-R1-EZG" secondAttribute="leading" constant="20" id="e90-zM-KqF"/>
                             <constraint firstItem="8GQ-Mu-dYz" firstAttribute="leading" secondItem="RPn-R1-EZG" secondAttribute="leading" constant="20" id="e9e-Xs-VMn"/>
                             <constraint firstItem="8GQ-Mu-dYz" firstAttribute="top" secondItem="1fG-j6-8fG" secondAttribute="bottom" constant="10" id="fF5-vW-iLt"/>
                             <constraint firstAttribute="trailingMargin" secondItem="kTB-1V-x5Q" secondAttribute="trailing" constant="20" id="fq6-94-LBa"/>
                             <constraint firstItem="kTB-1V-x5Q" firstAttribute="top" secondItem="QJj-ZS-JXF" secondAttribute="bottom" constant="10" id="he6-bL-CUk"/>
-                            <constraint firstItem="1fG-j6-8fG" firstAttribute="top" secondItem="kTB-1V-x5Q" secondAttribute="bottom" constant="10" id="oGe-aS-Aff"/>
                             <constraint firstItem="RPn-R1-EZG" firstAttribute="trailing" secondItem="1fG-j6-8fG" secondAttribute="trailing" constant="20" id="qLs-5G-Ibs"/>
                         </constraints>
                     </view>
                     <connections>
+                        <outlet property="descLogin" destination="rgo-tO-vXt" id="TeJ-Mv-oII"/>
                         <outlet property="passwordField" destination="8GQ-Mu-dYz" id="bKF-Lr-3Ei"/>
                         <outlet property="showPasswordButton" destination="X96-Lm-m7m" id="CzU-gt-gIw"/>
                         <outlet property="usernameField" destination="1fG-j6-8fG" id="6by-5I-8b1"/>
@@ -2919,6 +2930,86 @@
             </objects>
             <point key="canvasLocation" x="4366.666666666667" y="10.714285714285714"/>
         </scene>
+        <!--Sign Up Sign In-->
+        <scene sceneID="b6w-7N-ZWS">
+            <objects>
+                <viewController storyboardIdentifier="signupsignin" id="vsN-bz-ASW" customClass="SignUpSignIn" customModule="NexilisLite" customModuleProvider="target" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="j0h-JE-i7E">
+                        <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Q4b-oV-sHi">
+                                <rect key="frame" x="40" y="226" width="334" height="2"/>
+                                <color key="backgroundColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="2" id="0as-Zh-jRl"/>
+                                </constraints>
+                            </view>
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="pb_cd_person" translatesAutoresizingMaskIntoConstraints="NO" id="uMG-xq-HNf">
+                                <rect key="frame" x="87" y="88" width="240" height="128"/>
+                                <constraints>
+                                    <constraint firstAttribute="width" constant="240" id="PBy-BT-r38"/>
+                                    <constraint firstAttribute="height" constant="128" id="sJy-An-egS"/>
+                                </constraints>
+                            </imageView>
+                            <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Your Nickname" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="OGC-mO-8T0">
+                                <rect key="frame" x="20" y="291.5" width="374" height="34"/>
+                                <color key="tintColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                <textInputTraits key="textInputTraits"/>
+                            </textField>
+                            <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Password" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="5jw-G4-iGy" customClass="PasswordTextField" customModule="NexilisLite" customModuleProvider="target">
+                                <rect key="frame" x="20" y="335.5" width="374" height="34"/>
+                                <color key="tintColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                <textInputTraits key="textInputTraits"/>
+                            </textField>
+                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="SAR-sw-Oq9">
+                                <rect key="frame" x="356" y="341.5" width="27" height="22"/>
+                                <color key="tintColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                <state key="normal" image="eye.fill" catalog="system"/>
+                            </button>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Please enter your registered nickname or email address to Sign-In" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="kwq-ci-Qkk">
+                                <rect key="frame" x="40" y="248" width="334" height="33.5"/>
+                                <color key="tintColor" systemColor="tintColor"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                <color key="textColor" systemColor="systemGrayColor"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                        </subviews>
+                        <viewLayoutGuide key="safeArea" id="RRi-TQ-BYu"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        <constraints>
+                            <constraint firstItem="OGC-mO-8T0" firstAttribute="top" secondItem="kwq-ci-Qkk" secondAttribute="bottom" constant="10" id="0ZP-Ei-MVh"/>
+                            <constraint firstItem="SAR-sw-Oq9" firstAttribute="top" secondItem="OGC-mO-8T0" secondAttribute="bottom" constant="16" id="1bB-K3-4S8"/>
+                            <constraint firstItem="RRi-TQ-BYu" firstAttribute="trailing" secondItem="SAR-sw-Oq9" secondAttribute="trailing" constant="31" id="1ld-UJ-Qg9"/>
+                            <constraint firstItem="5jw-G4-iGy" firstAttribute="top" secondItem="OGC-mO-8T0" secondAttribute="bottom" constant="10" id="3Nv-d6-GGw"/>
+                            <constraint firstItem="5jw-G4-iGy" firstAttribute="leading" secondItem="RRi-TQ-BYu" secondAttribute="leading" constant="20" id="GiE-lA-JWU"/>
+                            <constraint firstItem="kwq-ci-Qkk" firstAttribute="top" secondItem="Q4b-oV-sHi" secondAttribute="bottom" constant="20" id="KWm-eW-sfD"/>
+                            <constraint firstItem="uMG-xq-HNf" firstAttribute="top" secondItem="RRi-TQ-BYu" secondAttribute="top" constant="40" id="Opj-Sk-O2m"/>
+                            <constraint firstItem="RRi-TQ-BYu" firstAttribute="trailing" secondItem="OGC-mO-8T0" secondAttribute="trailing" constant="20" id="P6s-86-sIR"/>
+                            <constraint firstItem="Q4b-oV-sHi" firstAttribute="top" secondItem="uMG-xq-HNf" secondAttribute="bottom" constant="10" id="RzA-zE-Hrr"/>
+                            <constraint firstItem="RRi-TQ-BYu" firstAttribute="trailing" secondItem="5jw-G4-iGy" secondAttribute="trailing" constant="20" id="iNS-JR-wnP"/>
+                            <constraint firstAttribute="trailingMargin" secondItem="Q4b-oV-sHi" secondAttribute="trailing" constant="20" id="kmp-rV-hmS"/>
+                            <constraint firstItem="Q4b-oV-sHi" firstAttribute="leading" secondItem="j0h-JE-i7E" secondAttribute="leadingMargin" constant="20" id="p1t-77-e6w"/>
+                            <constraint firstItem="RRi-TQ-BYu" firstAttribute="trailing" secondItem="kwq-ci-Qkk" secondAttribute="trailing" constant="40" id="pl1-5Z-wxf"/>
+                            <constraint firstItem="OGC-mO-8T0" firstAttribute="leading" secondItem="RRi-TQ-BYu" secondAttribute="leading" constant="20" id="qxd-Nm-RjI"/>
+                            <constraint firstItem="kwq-ci-Qkk" firstAttribute="leading" secondItem="RRi-TQ-BYu" secondAttribute="leading" constant="40" id="wUA-gp-1pR"/>
+                            <constraint firstItem="uMG-xq-HNf" firstAttribute="centerX" secondItem="j0h-JE-i7E" secondAttribute="centerX" id="z3S-Pf-Oua"/>
+                        </constraints>
+                    </view>
+                    <connections>
+                        <outlet property="descSignUpSignIn" destination="kwq-ci-Qkk" id="z3Q-k3-wbp"/>
+                        <outlet property="passwordField" destination="5jw-G4-iGy" id="o5r-JE-N89"/>
+                        <outlet property="showPasswordButton" destination="SAR-sw-Oq9" id="xhD-bu-DFc"/>
+                        <outlet property="usernameField" destination="OGC-mO-8T0" id="kOP-TB-DFc"/>
+                    </connections>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="mnb-fv-1Pu" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="4672" y="1443"/>
+        </scene>
     </scenes>
     <inferredMetricsTieBreakers>
         <segue reference="ZRi-3t-r4r"/>

+ 13 - 10
appbuilder-ios/NexilisLite/NexilisLite/Resource/id.lproj/Localizable.strings

@@ -62,7 +62,7 @@
 "User Profile Management" = "Manajemen Profil Pengguna";
 "Personal Information" = "Informasi Pengguna";
 "Email" = "Email";
-"Logout" = "Keluar Akun";
+"Sign Out" = "Keluar Akun";
 "IMI Membership Cards" = "Kartu Keanggotaan IMI";
 "IMI License & Association Cards" = "Kartu Izin & Asosiasi IMI";
 "IMI Membership Registration" = "Daftar Menjadi Anggota IMI";
@@ -72,7 +72,7 @@
 "Car" = "Mobil";
 "Motorbike" = "Motor";
 "eBike" = "Sepeda";
-"Login as Admin / Internal" = "Masuk sebagai Admin / Internal";
+"Sign-In as Admin / Internal" = "Masuk sebagai Admin / Internal";
 "Change Admin / Internal Password" = "Ubah Sandi Admin / Internal";
 "Change Device" = "Ubah Perangkat";
 "Change Language" = "Ubah Bahasa";
@@ -87,14 +87,14 @@
 "Sign-Up (Change profile)" = "Daftar (Ubah Profil)";
 "Change Profile" = "Ubah Profil";
 "Sign-In (Change Device)" = "Masuk (Ubah Perangkat)";
-"Successfully Logout" = "Berhasil Keluar";
-"Successfully changed device" = "Berhasil masuk/ubah perangkat";
+"Successfully Sign Out" = "Berhasil Keluar";
+"Successfully Sign-In" = "Berhasil masuk";
 "Successfully downloaded" = "Berhasil diunduh ke galeri";
-"Logout" = "Keluar";
+"Sign Out" = "Keluar";
 "Are you sure want to logout?" = "Apakah kamu ingin keluar?";
-"Successfully login Admin" = "Berhasil masuk sebagai Admin";
-"Successfully login Internal Team" = "Berhasil masuk sebagai Tim Internal";
-"Successfully login" = "Berhasil masuk";
+"Successfully Sign-In Admin" = "Berhasil masuk sebagai Admin";
+"Successfully Sign-In Internal Team" = "Berhasil masuk sebagai Tim Internal";
+"Successfully Sign-In" = "Berhasil masuk";
 "Must check at least one category" = "Harus pilih minimal satu kategori";
 "Coming soon feature" = "Fitur akan segera hadir";
 "No call center history" = "Tidak ada riwayat pusat panggilan";
@@ -122,7 +122,7 @@
 "This message was deleted" = "Pesan ini telah dihapus";
 "Are you sure to unfriend" = "Apakah kamu yakin membatalkan pertemanan dengan";
 "Back" = "Kembali";
-"Login" = "Masuk";
+"Sign-In" = "Masuk";
 "Your Nickname" = "Nama Pengguna";
 "Password" = "Kata Sandi";
 "Submit" = "Kirim";
@@ -186,7 +186,7 @@
 "Expired OTP" = "OTP telah kadaluarsa";
 "Invalid OTP" = "OTP tidak valid";
 "Successfully add friend" = "Berhasil menambahkan teman";
-"Login to Web" = "Masuk ke Web";
+"Sign-In to Web" = "Masuk ke Web";
 "of" = "dari";
 "matches" = "cocok";
 "Not found" = "Tidak ditemukan";
@@ -204,3 +204,6 @@
 "New password can't be empty" = "Kata sandi baru tidak boleh kosong";
 "New password min 6 character" = "Kata sandi baru min 6 karakter";
 "Successfully changed password" = "Berhasil mengubah kata sandi";
+"Please enter your registered nickname or email address to Sign-In" = "Harap masukkan nama atau alamat email Anda yang terdaftar untuk masuk";
+"Please enter your nickname or email address and your password" = "Harap masukkan nama atau alamat email Anda dan kata sandi Anda";
+"Sign-Up/Sign-In" = "Daftar/Masuk";

+ 10 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/CoreMessage_TMessageBank.swift

@@ -2083,4 +2083,14 @@ public class CoreMessage_TMessageBank {
         tmessage.mBodies[CoreMessage_TMessageKey.MESSAGE_ID] = message_id
         return tmessage
     }
+    
+    public static func getSignUpSignInAPI(p_name: String, p_password: String) -> TMessage {
+        let tmessage = TMessage()
+        tmessage.mCode = CoreMessage_TMessageCode.SIGN_UP_AND_SIGN_IN_API
+        tmessage.mStatus = CoreMessage_TMessageUtil.getTID()
+        tmessage.mPIN = UserDefaults.standard.string(forKey: "me")!
+        tmessage.mBodies[CoreMessage_TMessageKey.NAME] = p_name
+        tmessage.mBodies[CoreMessage_TMessageKey.PASSWORD] = p_password
+        return tmessage;
+    }
 }

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

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

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

@@ -993,6 +993,7 @@ class IncomingThread {
                     "ex_follower" : message.getBody(key: CoreMessage_TMessageKey.TOTAL_FOLLOWERS),
                     "ex_offmp" : message.getBody(key: CoreMessage_TMessageKey.OFFMP),
                     "ex_status" : "0",
+                    "device_id" : message.getBody(key: CoreMessage_TMessageKey.IMEI),
                     "shop_code" : message.getBody(key: CoreMessage_TMessageKey.SHOP_CODE),
                     "shop_name" : message.getBody(key: CoreMessage_TMessageKey.SHOP_NAME),
                     "extension" : message.getBody(key: CoreMessage_TMessageKey.EXTENSION),
@@ -1026,6 +1027,11 @@ class IncomingThread {
                     "area" : message.getBody(key: CoreMessage_TMessageKey.WORKING_AREA),
                     "is_second_layer" : message.getBody(key: CoreMessage_TMessageKey.IS_SECOND_LAYER),
                 ], replace: true)
+                let device_id = UserDefaults.standard.string(forKey: "device_id") ?? ""
+                if let cursorUser = Database.shared.getRecords(fmdb: fmdb, query: "SELECT f_pin FROM BUDDY where device_id='\(device_id)'"), cursorUser.next() {
+                    UserDefaults.standard.setValue(cursorUser.string(forColumnIndex: 0), forKey: "me")
+                    cursorUser.close()
+                }
                 ack(message: message)
                 let idMe = UserDefaults.standard.string(forKey: "me")!
                 if message.getBody(key: CoreMessage_TMessageKey.USER_TYPE) != "24" && message.getBody(key: CoreMessage_TMessageKey.F_PIN) == idMe {

+ 3 - 1
appbuilder-ios/NexilisLite/NexilisLite/Source/Nexilis.swift

@@ -104,7 +104,9 @@ public class Nexilis: NSObject {
             Nexilis.PORT = port
             //            print(API.sGetVersion())
             var id = ""
-            if let me = UserDefaults.standard.string(forKey: "me") {
+            if let device_id = UserDefaults.standard.string(forKey: "device_id") {
+                try API.initConnection(bSwitchIP: false, sAPIK: apiKey, aAppMain: nil, cbiI: Callback(), sTCPAddr: Nexilis.ADDRESS, nTCPPort: Nexilis.PORT, sUserID: device_id, sStartWH: "09:00")
+            } else if let me = UserDefaults.standard.string(forKey: "me") {
                 try API.initConnection(bSwitchIP: false, sAPIK: apiKey, aAppMain: nil, cbiI: Callback(), sTCPAddr: Nexilis.ADDRESS, nTCPPort: Nexilis.PORT, sUserID: me, sStartWH: "09:00")
             } else {
                 let uuid = UIDevice.current.identifierForVendor?.uuidString ?? "UNK-DEVICE"

+ 7 - 7
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/ChangeDeviceViewController.swift

@@ -13,6 +13,7 @@ public class ChangeDeviceViewController: UIViewController {
     @IBOutlet weak var usernameField: UITextField!
     @IBOutlet weak var passwordField: PasswordTextField!
     @IBOutlet weak var showPasswordButton: UIButton!
+    @IBOutlet weak var descLogin: UILabel!
     
     public var isDismiss: ((String) -> ())?
     public var forceLogin = false
@@ -23,7 +24,8 @@ public class ChangeDeviceViewController: UIViewController {
         
         self.view.backgroundColor = .white
 
-        self.title = "Login".localized()
+        self.title = "Sign-In".localized()
+        descLogin.text = "Please enter your registered nickname or email address to Sign-In".localized()
         navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Submit".localized(), style: .plain, target: self, action: #selector(didTapSubmit(sender:)))
         
         passwordField.addPadding(.right(40))
@@ -133,16 +135,15 @@ public class ChangeDeviceViewController: UIViewController {
                         let thumb = response.getBody(key: CoreMessage_TMessageKey.THUMB_ID, default_value: "")
                         if(!id.isEmpty) {
                             Nexilis.changeUser(f_pin: id)
-                            UserDefaults.standard.setValue(id, forKey: "me")
                             Utils.setProfile(value: true)
                             UserDefaults.standard.synchronize()
                             // pos registration
                             _ = Nexilis.write(message: CoreMessage_TMessageBank.getPostRegistration(p_pin: id))
-                            DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: {
+                            DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
                                 Nexilis.hideLoader(completion: {
                                     let imageView = UIImageView(image: UIImage(systemName: "checkmark.circle.fill"))
                                     imageView.tintColor = .white
-                                    let banner = FloatingNotificationBanner(title: "Successfully changed device".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
+                                    let banner = FloatingNotificationBanner(title: "Successfully Sign-In".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
                                     banner.show()
                                     if self.fromChangeNamePass{
                                         var vc = self.navigationController?.presentingViewController
@@ -246,16 +247,15 @@ public class ChangeDeviceViewController: UIViewController {
                     let thumb = response.getBody(key: CoreMessage_TMessageKey.THUMB_ID, default_value: "")
                     if(!id.isEmpty) {
                         Nexilis.changeUser(f_pin: id)
-                        UserDefaults.standard.setValue(id, forKey: "me")
                         Utils.setProfile(value: true)
                         UserDefaults.standard.synchronize()
                         // pos registration
                         _ = Nexilis.write(message: CoreMessage_TMessageBank.getPostRegistration(p_pin: id))
-                        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: {
+                        DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
                             Nexilis.hideLoader(completion: {
                                 let imageView = UIImageView(image: UIImage(systemName: "checkmark.circle.fill"))
                                 imageView.tintColor = .white
-                                let banner = FloatingNotificationBanner(title: "Successfully changed device".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
+                                let banner = FloatingNotificationBanner(title: "Successfully Sign-In".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
                                 banner.show()
                                 if self.fromChangeNamePass{
                                     var vc = self.navigationController?.presentingViewController

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

@@ -47,7 +47,7 @@ public class ChangeNamePassswordViewController: UIViewController {
         descField.text = "Please enter your desired Username and Password".localized()
         
         loginQuest.text = "Or do you have an account".localized()
-        loginButton.setTitle(("Login".localized()).uppercased(), for: .normal)
+        loginButton.setTitle(("Sign-In".localized()).uppercased(), for: .normal)
         loginButton.addTarget(self, action: #selector(showLogin), for: .touchUpInside)
         
         let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))

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

@@ -19,7 +19,7 @@ public class ScannerViewController: UIViewController, QRScannerViewDelegate {
     
     var titleInfo: UILabel = {
         let titleInfo = UILabel()
-        titleInfo.text = "Scan the QR login code on your web browser".localized()
+        titleInfo.text = "Scan the QR Sign-In code on your web browser".localized()
         titleInfo.font = .boldSystemFont(ofSize: 16.0)
         titleInfo.numberOfLines = 0
         titleInfo.textAlignment = .center
@@ -78,7 +78,7 @@ public class ScannerViewController: UIViewController, QRScannerViewDelegate {
                         DispatchQueue.main.async {
                             let imageView = UIImageView(image: UIImage(systemName: "checkmark.circle.fill"))
                             imageView.tintColor = .white
-                            let banner = FloatingNotificationBanner(title: "Successfully Login".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
+                            let banner = FloatingNotificationBanner(title: "Successfully Sign-In".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
                             banner.show()
                         }
                     }

+ 17 - 17
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/SettingTableViewController.swift

@@ -92,8 +92,8 @@ public class SettingTableViewController: UITableViewController {
                 Item.menus["Personal"] = [
                     Item(icon: UIImage(systemName: "person.fill"), title: "User Profile Management".localized()),
 //                    Item(icon: UIImage(systemName: "mail"), title: "Email".localized()),
-                    Item(icon: UIImage(systemName: "qrcode.viewfinder"), title: "Login to Nexilis Web".localized()),
-                    Item(icon: UIImage(systemName: "rectangle.portrait.and.arrow.right"), title: "Logout".localized())
+                    Item(icon: UIImage(systemName: "qrcode.viewfinder"), title: "Sign-In to Nexilis Web".localized()),
+                    Item(icon: UIImage(systemName: "rectangle.portrait.and.arrow.right"), title: "Sign Out".localized())
                 ]
                 let idMe = UserDefaults.standard.string(forKey: "me") as String?
                 if let cursorUser = Database.shared.getRecords(fmdb: fmdb, query: "SELECT user_type, image_id FROM BUDDY where f_pin='\(idMe!)'"), cursorUser.next() {
@@ -110,7 +110,7 @@ public class SettingTableViewController: UITableViewController {
                     if cursorUser.string(forColumnIndex: 0) == "23" && position == "1" {
                         Item.menus["Personal"]?.insert(Item(icon: UIImage(systemName: "person.crop.rectangle"), title: "Change Admin / Internal Password".localized()), at: 1)
                     } else if cursorUser.string(forColumnIndex: 0) != "23" && cursorUser.string(forColumnIndex: 0) != "24" {
-                        Item.menus["Personal"]?.insert(Item(icon: UIImage(systemName: "person.crop.rectangle"), title: "Sign In Admin / Internal".localized()), at: 1)
+                        Item.menus["Personal"]?.insert(Item(icon: UIImage(systemName: "person.crop.rectangle"), title: "Sign-In Admin / Internal".localized()), at: 1)
                     }
 //                    Item.menus["Personal"]?.insert(Item(icon: UIImage(named: "pb_button", in: Bundle.resourceBundle(for: Nexilis.self), with: nil), title: "Change Image FB Become Photo Profile".localized()), at: 2)
                     let image = cursorUser.string(forColumnIndex: 1)
@@ -228,7 +228,7 @@ public class SettingTableViewController: UITableViewController {
             switch menu.title {
             case "User Profile Management".localized():
                 cell.accessoryType = .disclosureIndicator
-            case "Sign In Admin / Internal".localized():
+            case "Sign-In Admin / Internal".localized():
                 cell.accessoryType = .disclosureIndicator
             case "Change Admin / Internal Password".localized():
                 cell.accessoryType = .disclosureIndicator
@@ -242,7 +242,7 @@ public class SettingTableViewController: UITableViewController {
                 cell.accessoryType = .disclosureIndicator
             case "Sign-In (Change Device)".localized():
                 cell.accessoryType = .disclosureIndicator
-            case "Login to Nexilis Web".localized():
+            case "Sign-In to Nexilis Web".localized():
                 cell.accessoryType = .disclosureIndicator
             case "Change Language".localized():
                 cell.accessoryType = .disclosureIndicator
@@ -327,8 +327,8 @@ public class SettingTableViewController: UITableViewController {
                 self.tableView.reloadData()
             }
             navigationController?.show(controller, sender: nil)
-        } else if item.title == "Logout".localized() {
-            let alert = UIAlertController(title: "Logout".localized(), message: "Are you sure want to logout?".localized(), preferredStyle: .alert)
+        } else if item.title == "Sign Out".localized() {
+            let alert = UIAlertController(title: "Sign Out".localized(), message: "Are you sure want to logout?".localized(), preferredStyle: .alert)
             alert.addAction(UIAlertAction(title: "Cancel".localized(), style: UIAlertAction.Style.default, handler: nil))
             alert.addAction(UIAlertAction(title: "Yes".localized(), style: .destructive, handler: {(_) in
                 if !CheckConnection.isConnectedToNetwork()  || API.nGetCLXConnState() == 0 {
@@ -355,7 +355,7 @@ public class SettingTableViewController: UITableViewController {
                             DispatchQueue.main.async {
                                 let imageView = UIImageView(image: UIImage(systemName: "checkmark.circle.fill"))
                                 imageView.tintColor = .white
-                                let banner = FloatingNotificationBanner(title: "Successfully Logout".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
+                                let banner = FloatingNotificationBanner(title: "Successfully Sign Out".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
                                 banner.show()
                                 var dataImage: [AnyHashable : Any] = [:]
                                 dataImage["name"] = ""
@@ -375,7 +375,7 @@ public class SettingTableViewController: UITableViewController {
                 }
             }))
             self.present(alert, animated: true, completion: nil)
-        } else if item.title == "Sign In Admin / Internal".localized() || item.title == "Change Admin / Internal Password".localized() {
+        } else if item.title == "Sign-In Admin / Internal".localized() || item.title == "Change Admin / Internal Password".localized() {
             if !CheckConnection.isConnectedToNetwork()  || API.nGetCLXConnState() == 0 {
                 let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
                 imageView.tintColor = .white
@@ -393,16 +393,16 @@ public class SettingTableViewController: UITableViewController {
                 }
             }
             else {
-                if let action = self.actionLogin(for: "admin", title: "Login as Admin".localized()) {
+                if let action = self.actionLogin(for: "admin", title: "Sign-In as Admin".localized()) {
                     alertController.addAction(action)
                 }
-                if let action = self.actionLogin(for: "internal", title: "Login as Internal Team".localized()) {
+                if let action = self.actionLogin(for: "internal", title: "Sign-In as Internal Team".localized()) {
                     alertController.addAction(action)
                 }
             }
             alertController.addAction(UIAlertAction(title: "Cancel".localized(), style: .cancel, handler: nil))
             self.present(alertController, animated: true)
-        } else if item.title == "Login to Nexilis Web".localized() {
+        } else if item.title == "Sign-In to Nexilis Web".localized() {
             var permissionCheck = -1
             if AVCaptureDevice.authorizationStatus(for: .video) ==  .authorized {
                 permissionCheck = 1
@@ -653,9 +653,9 @@ public class SettingTableViewController: UITableViewController {
     
     private func actionLogin(for type: String, title: String) -> UIAlertAction? {
         return UIAlertAction(title: title, style: .default) { _ in
-            self.alert = UIAlertController(title: "Login as Admin".localized(), message: nil, preferredStyle: .alert)
+            self.alert = UIAlertController(title: "Sign-In as Admin".localized(), message: nil, preferredStyle: .alert)
             if type == "internal" {
-                self.alert = UIAlertController(title: "Login as Internal Team".localized(), message: nil, preferredStyle: .alert)
+                self.alert = UIAlertController(title: "Sign-In as Internal Team".localized(), message: nil, preferredStyle: .alert)
             }
             self.textFields.removeAll()
             self.alert?.addTextField{ (texfield) in
@@ -672,7 +672,7 @@ public class SettingTableViewController: UITableViewController {
                 buttonHideUnhide.tintColor = .black
                 buttonHideUnhide.addTarget(self, action: #selector(self.showPassword), for: .touchUpInside)
             }
-            let submitAction = UIAlertAction(title: "Sign In".localized(), style: .default, handler: { (action) -> Void in
+            let submitAction = UIAlertAction(title: "Sign-In".localized(), style: .default, handler: { (action) -> Void in
                 let textField = self.alert?.textFields![0]
                 if !CheckConnection.isConnectedToNetwork()  || API.nGetCLXConnState() == 0 {
                     let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
@@ -687,7 +687,7 @@ public class SettingTableViewController: UITableViewController {
                             DispatchQueue.main.async {
                                 let imageView = UIImageView(image: UIImage(systemName: "checkmark.circle.fill"))
                                 imageView.tintColor = .white
-                                let banner = FloatingNotificationBanner(title: "Successfully login Admin".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
+                                let banner = FloatingNotificationBanner(title: "Successfully Sign-In Admin".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
                                 banner.show()
                                 let itemCP = Item(icon: UIImage(systemName: "person.crop.rectangle"), title: "Change Admin / Internal Password".localized())
                                 Item.menus["Personal"]?[1] = itemCP
@@ -701,7 +701,7 @@ public class SettingTableViewController: UITableViewController {
                             DispatchQueue.main.async {
                                 let imageView = UIImageView(image: UIImage(systemName: "checkmark.circle.fill"))
                                 imageView.tintColor = .white
-                                let banner = FloatingNotificationBanner(title: "Successfully login Internal Team".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
+                                let banner = FloatingNotificationBanner(title: "Successfully Sign-In Internal Team".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
                                 banner.show()
                                 Item.menus["Personal"]?.remove(at: 1)
                                 self.tableView.reloadData()

+ 344 - 0
appbuilder-ios/NexilisLite/NexilisLite/Source/View/Control/SignUpSignIn.swift

@@ -0,0 +1,344 @@
+//
+//  SignUpSignIn.swift
+//  NexilisLite
+//
+//  Created by Akhmad Al Qindi Irsyam on 17/01/23.
+//
+
+import UIKit
+import NotificationBannerSwift
+import nuSDKService
+
+public class SignUpSignIn: UIViewController {
+    @IBOutlet weak var descSignUpSignIn: UILabel!
+    @IBOutlet weak var usernameField: UITextField!
+    @IBOutlet weak var passwordField: PasswordTextField!
+    @IBOutlet weak var showPasswordButton: UIButton!
+    
+    public var isDismiss: ((String) -> ())?
+    public var forceLogin = false
+    public var fromChangeNamePass = false
+    
+    public override func viewDidLoad() {
+        super.viewDidLoad()
+
+        self.view.backgroundColor = .white
+
+        self.title = "Sign-Up/Sign-In".localized()
+        descSignUpSignIn.text = "Please enter your nickname or email address and your password".localized()
+        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Submit".localized(), style: .plain, target: self, action: #selector(didTapSubmit(sender:)))
+        
+        passwordField.addPadding(.right(40))
+        passwordField.isSecureTextEntry = true
+        showPasswordButton.setImage(UIImage(systemName: "eye.slash.fill"), for: .normal)
+        usernameField.placeholder = "Your Nickname".localized() + "/" + "Email".localized()
+        passwordField.placeholder = "Password".localized()
+        usernameField.addTarget(self, action: #selector(checkUsername(_:)), for: .editingChanged)
+        
+        showPasswordButton.addTarget(self, action: #selector(showPassword), for: .touchUpInside)
+        
+        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
+        tapGesture.cancelsTouchesInView = false
+        view.addGestureRecognizer(tapGesture)
+    }
+    
+    @objc func checkUsername(_ textField: UITextField) {
+        let text : String! = usernameField.text
+        if isValidEmail(text) {
+            passwordField.isHidden = true
+            showPasswordButton.isHidden = true
+        } else if passwordField.isHidden {
+            passwordField.isHidden = false
+            showPasswordButton.isHidden = false
+        }
+    }
+    
+    func isValidEmail(_ email: String) -> Bool {
+        let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
+
+        let emailPred = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
+        return emailPred.evaluate(with: email)
+    }
+    
+    @objc func dismissKeyboard() {
+        //Causes the view (or one of its embedded text fields) to resign the first responder status.
+        view.endEditing(true)
+    }
+    
+    @objc func showPassword() {
+        if passwordField.isSecureTextEntry {
+            passwordField.isSecureTextEntry = false
+            showPasswordButton.setImage(UIImage(systemName: "eye.fill"), for: .normal)
+        } else {
+            passwordField.isSecureTextEntry = true
+            showPasswordButton.setImage(UIImage(systemName: "eye.slash.fill"), for: .normal)
+        }
+    }
+    
+    func checkEmail(email: String) {
+        if !CheckConnection.isConnectedToNetwork() || API.nGetCLXConnState() == 0 {
+            let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
+            imageView.tintColor = .white
+            let banner = FloatingNotificationBanner(title: "Check your connection".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .danger, colors: nil, iconPosition: .center)
+            banner.show()
+            return
+        }
+        Nexilis.showLoader()
+        DispatchQueue.global().async {
+            if let response = Nexilis.writeSync(message: CoreMessage_TMessageBank.getSendOTPLogin(p_email: email), timeout: 30 * 1000) {
+                if response.getBody(key: CoreMessage_TMessageKey.ERRCOD, default_value: "99") != "00" {
+                    DispatchQueue.main.async {
+                        Nexilis.hideLoader(completion: {
+                            let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
+                            imageView.tintColor = .white
+                            let banner = FloatingNotificationBanner(title: "Unregistered email account".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .danger, colors: nil, iconPosition: .center)
+                            banner.show()
+                        })
+                    }
+                } else {
+                    DispatchQueue.main.async {
+                        Nexilis.hideLoader(completion: {
+                            self.showPageOTP(email: email)
+                        })
+                    }
+                }
+            } else {
+                DispatchQueue.main.async {
+                    Nexilis.hideLoader(completion: {
+                        let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
+                        imageView.tintColor = .white
+                        let banner = FloatingNotificationBanner(title: "Unable to access servers. Try again later".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .danger, colors: nil, iconPosition: .center)
+                        banner.show()
+                    })
+                }
+            }
+        }
+    }
+    
+    func showPageOTP(email: String, errCode:String = "") {
+        let showOTPVC = VerifyEmail()
+        showOTPVC.email = email
+        showOTPVC.showWrongOTP = errCode
+        showOTPVC.isDismiss = { code in
+            Nexilis.showLoader()
+            DispatchQueue.global().async {
+                if let response = Nexilis.writeSync(message: CoreMessage_TMessageBank.getSendVerifyChangeDevice(p_email: email, p_vercode: code), timeout: 30 * 1000) {
+                    if !response.isOk() {
+                        DispatchQueue.main.async {
+                            Nexilis.hideLoader(completion: {
+                                self.showPageOTP(email: email, errCode: response.getBody(key: CoreMessage_TMessageKey.ERRCOD, default_value: "99"))
+                            })
+                        }
+                    } else {
+                        self.deleteAllRecordDatabase()
+                        let id = response.getBody(key: CoreMessage_TMessageKey.F_PIN, default_value: "")
+                        let thumb = response.getBody(key: CoreMessage_TMessageKey.THUMB_ID, default_value: "")
+                        if(!id.isEmpty) {
+                            Nexilis.changeUser(f_pin: id)
+                            Utils.setProfile(value: true)
+                            UserDefaults.standard.synchronize()
+                            // pos registration
+                            _ = Nexilis.write(message: CoreMessage_TMessageBank.getPostRegistration(p_pin: id))
+                            DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
+                                Nexilis.hideLoader(completion: {
+                                    let imageView = UIImageView(image: UIImage(systemName: "checkmark.circle.fill"))
+                                    imageView.tintColor = .white
+                                    let banner = FloatingNotificationBanner(title: "Successfully Sign-In".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
+                                    banner.show()
+                                    if self.fromChangeNamePass{
+                                        var vc = self.navigationController?.presentingViewController
+                                        while vc?.presentingViewController != nil {
+                                            vc = vc?.presentingViewController
+                                        }
+                                        vc?.dismiss(animated: true, completion: nil)
+                                    }
+                                    else if !self.forceLogin {
+                                        self.navigationController?.popViewController(animated: true)
+                                    } else {
+                                        self.navigationController?.dismiss(animated: true)
+                                    }
+                                    self.isDismiss?(thumb)
+                                })
+                            })
+                        }
+                    }
+                } else {
+                    DispatchQueue.main.async {
+                        Nexilis.hideLoader(completion: {
+                            let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
+                            imageView.tintColor = .white
+                            let banner = FloatingNotificationBanner(title: "Unable to access servers. Try again later".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .danger, colors: nil, iconPosition: .center)
+                            banner.show()
+                        })
+                    }
+                }
+            }
+        }
+        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: {
+            self.navigationController?.present(showOTPVC, animated: true, completion: nil)
+        })
+    }
+    
+    @objc func didTapSubmit(sender: Any) {
+        guard let name = usernameField.text, !name.isEmpty else {
+            let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
+            imageView.tintColor = .white
+            let banner = FloatingNotificationBanner(title: "Username can't be empty".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .danger, colors: nil, iconPosition: .center)
+            banner.show()
+            return
+        }
+        let a = name.split(separator: " ", maxSplits: 1)
+        let first = String(a[0])
+        let last = a.count == 2 ? String(a[1]) : ""
+        
+        if first.count > 24 {
+            let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
+            imageView.tintColor = .white
+            let banner = FloatingNotificationBanner(title: "First name is too long".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .danger, colors: nil, iconPosition: .center)
+            banner.show()
+            return
+        }
+        
+        if last.count > 24 {
+            let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
+            imageView.tintColor = .white
+            let banner = FloatingNotificationBanner(title: "Last name is too long".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .danger, colors: nil, iconPosition: .center)
+            banner.show()
+            return
+        }
+        
+        let idMe = UserDefaults.standard.string(forKey: "me")!
+        
+        if isValidEmail(name) {
+            checkEmail(email: name)
+            return
+        }
+        if !name.matches("^[a-zA-Z ]*$") {
+            let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
+            imageView.tintColor = .white
+            let banner = FloatingNotificationBanner(title: "Contains prohibited characters. Only alphabetic characters are allowed.".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .danger, colors: nil, iconPosition: .center)
+            banner.show()
+            return
+        }
+        guard let password = passwordField.text, !password.isEmpty else {
+            let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
+            imageView.tintColor = .white
+            let banner = FloatingNotificationBanner(title: "Password can't be empty".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .danger, colors: nil, iconPosition: .center)
+            banner.show()
+            return
+        }
+        if password.count < 6 {
+            let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
+            imageView.tintColor = .white
+            let banner = FloatingNotificationBanner(title: "Password min 6 character".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .danger, colors: nil, iconPosition: .center)
+            banner.show()
+            return
+        }
+        if !CheckConnection.isConnectedToNetwork() || API.nGetCLXConnState() == 0 {
+            let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
+            imageView.tintColor = .white
+            let banner = FloatingNotificationBanner(title: "Check your connection".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .danger, colors: nil, iconPosition: .center)
+            banner.show()
+            return
+        }
+        Nexilis.showLoader()
+        DispatchQueue.global().async {
+            let md5Hex = Utils.getMD5(string: password).map { String(format: "%02hhx", $0) }.joined()
+            if let response = Nexilis.writeSync(message: CoreMessage_TMessageBank.getSignUpSignInAPI(p_name: name, p_password: md5Hex), timeout: 30 * 1000) {
+                if response.getBody(key: CoreMessage_TMessageKey.ERRCOD, default_value: "99") == "20" {
+                    DispatchQueue.main.async {
+                        Nexilis.hideLoader(completion: {
+                            let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
+                            imageView.tintColor = .white
+                            let banner = FloatingNotificationBanner(title: "Invalid user / Username and password does not match".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .danger, colors: nil, iconPosition: .center)
+                            banner.show()
+                        })
+                    }
+                } else if !response.isOk() {
+                    DispatchQueue.main.async {
+                        Nexilis.hideLoader(completion: {
+                            let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
+                            imageView.tintColor = .white
+                            let banner = FloatingNotificationBanner(title: "Unable to access servers. Try again later".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .danger, colors: nil, iconPosition: .center)
+                            banner.show()
+                        })
+                    }
+                } else {
+                    let sign = response.getBody(key: CoreMessage_TMessageKey.SIGN, default_value: "")
+                    if sign == "1" {
+                        self.deleteAllRecordDatabase()
+                        let id = response.getBody(key: CoreMessage_TMessageKey.F_PIN, default_value: "")
+                        let thumb = response.getBody(key: CoreMessage_TMessageKey.THUMB_ID, default_value: "")
+                        let device_id = response.getBody(key: CoreMessage_TMessageKey.IMEI, default_value: id)
+                        if(!id.isEmpty) {
+                            Nexilis.changeUser(f_pin: device_id)
+                            UserDefaults.standard.setValue(device_id, forKey: "device_id")
+                            Utils.setProfile(value: true)
+                            UserDefaults.standard.synchronize()
+                            // pos registration
+                            _ = Nexilis.write(message: CoreMessage_TMessageBank.getPostRegistration(p_pin: id))
+                            DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
+                                Nexilis.hideLoader(completion: {
+                                    let imageView = UIImageView(image: UIImage(systemName: "checkmark.circle.fill"))
+                                    imageView.tintColor = .white
+                                    let banner = FloatingNotificationBanner(title: "Successfully Sign-In".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
+                                    banner.show()
+                                    if self.fromChangeNamePass{
+                                        var vc = self.navigationController?.presentingViewController
+                                        while vc?.presentingViewController != nil {
+                                            vc = vc?.presentingViewController
+                                        }
+                                        vc?.dismiss(animated: true, completion: nil)
+                                    }
+                                    else if !self.forceLogin {
+                                        self.navigationController?.popViewController(animated: true)
+                                    } else {
+                                        self.navigationController?.dismiss(animated: true)
+                                    }
+                                    self.isDismiss?(thumb)
+                                })
+                            })
+                        }
+                    } else {
+                        Database.shared.database?.inTransaction({ fmdb, rollback in
+                            _ = Database.shared.updateRecord(fmdb: fmdb, table: "BUDDY", cvalues: ["first_name": first , "last_name": last], _where: "f_pin = '\(idMe)'")
+                        })
+                        Utils.setProfile(value: true)
+                        UserDefaults.standard.synchronize()
+    //                    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "updateFifthTab"), object: nil, userInfo: nil)
+                        DispatchQueue.main.async {
+                            Nexilis.hideLoader(completion: {
+                                let imageView = UIImageView(image: UIImage(systemName: "checkmark.circle.fill"))
+                                imageView.tintColor = .white
+                                let banner = FloatingNotificationBanner(title: "Successfully changed".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .success, colors: nil, iconPosition: .center)
+                                banner.show()
+                                if self.fromChangeNamePass{
+                                    var vc = self.navigationController?.presentingViewController
+                                    while vc?.presentingViewController != nil {
+                                        vc = vc?.presentingViewController
+                                    }
+                                    vc?.dismiss(animated: true, completion: nil)
+                                }
+                                else if !self.forceLogin {
+                                    self.navigationController?.popViewController(animated: true)
+                                } else {
+                                    self.navigationController?.dismiss(animated: true)
+                                }
+                            })
+                        }
+                    }
+                }
+            } else {
+                DispatchQueue.main.async {
+                    Nexilis.hideLoader(completion: {
+                        let imageView = UIImageView(image: UIImage(systemName: "xmark.circle.fill"))
+                        imageView.tintColor = .white
+                        let banner = FloatingNotificationBanner(title: "Unable to access servers. Try again later".localized(), subtitle: nil, titleFont: UIFont.systemFont(ofSize: 16), titleColor: nil, titleTextAlign: .left, subtitleFont: nil, subtitleColor: nil, subtitleTextAlign: nil, leftView: imageView, rightView: nil, style: .danger, colors: nil, iconPosition: .center)
+                        banner.show()
+                    })
+                }
+            }
+        }
+    }
+
+}

+ 2 - 2
appbuilder-ios/NexilisLite/Podfile.lock

@@ -1,5 +1,5 @@
 PODS:
-  - Alamofire (5.5.0)
+  - Alamofire (5.6.4)
   - FMDB (2.7.5):
     - FMDB/standard (= 2.7.5)
   - FMDB/standard (2.7.5)
@@ -29,7 +29,7 @@ SPEC REPOS:
     - SnapKit
 
 SPEC CHECKSUMS:
-  Alamofire: 1c4fb5369c3fe93d2857c780d8bbe09f06f97e7c
+  Alamofire: 4e95d97098eacb88856099c4fc79b526a299e48c
   FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
   Ji: d795fed288fe78658b404c88946d753b17d8d7f4
   MarqueeLabel: 00cc0bcd087111dca575878b3531af980559707d