// // LoginVC.swift // Sirani // // Created by Anhar Solehudin on 24/03/19. // Copyright © 2019 Anhar Solehudin. All rights reserved. // import UIKit class LoginVC: UIViewController { // Outlets @IBOutlet weak var loginLayout: UIScrollView! @IBOutlet weak var profileLayout: UIScrollView! @IBOutlet weak var inputUsername: RoundTextField! @IBOutlet weak var inputPassword: RoundTextField! @IBOutlet weak var txtUsernameError: UILabel! @IBOutlet weak var txtPasswordError: UILabel! @IBOutlet weak var progress: UIView! @IBOutlet weak var btnTogglePassword: UIButton! @IBOutlet weak var fullname: UILabel! @IBOutlet weak var btnOptionsRoles: UIButton! @IBOutlet weak var optionsRolesLayout: UIView! @IBOutlet weak var optionsTV: UITableView! @IBOutlet weak var imgDropdownOptionsRoles: UIImageView! // Initialize private var presenter: LoginPresenter! // Constant private let alertNoConnectionTitle = "Informasi" private let alertNoConnectionMsg = "Sepertinya Anda sedang tidak tersambung pada koneksi internet" private let alertNoConnectionActionYes = "OK" private let alertLoginFailedTitle = "Informasi" private let alertLoginFailedActionYes = "OK" private let urlResetPassword = "https://sertifikasi.postel.go.id/registrasi/forget" // private let urlRegister = "https://sertifikasi.postel.go.id/registrasi/daftar" private let urlRegister = "https://sertifikasi.postel.go.id/registrasi/daftar" private let urlRegisterOpen = "https://sertifikasi.postel.go.id/registrasi/forget" private let availableRoles = ["C","1","7","8","11"] private let CUSTOMER_ROLE_ID = "C" private let OPERATOR_ROLE_ID = "1" private let KEPALA_SEKSI_ROLE_ID = "7" private let KEPALA_SUB_DIREKTORAT_ROLE_ID = "11" private let DIREKTUR_ROLE_ID = "8" private let CUSTOMER_ROLE = "Customer" private let OPERATOR_ROLE = "Operator" private let KEPALA_SEKSI_ROLE = "Sub Koordinator" private let KEPALA_SUB_DIREKTORAT_ROLE = "Koordinator" private let DIREKTUR_ROLE = "Direktur" // Variables private var loading = false private var optionsRoles = [OptionItem]() // View Lifecycles override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } override func viewWillAppear(_ animated: Bool) { presenter.attachView(view: self) checkUserState() } override func viewDidLoad() { super.viewDidLoad() presenter = LoginPresenter(siraniApiServices: SiraniApiServices()) } override func viewDidDisappear(_ animated: Bool) { presenter.detachView() } // private functions private func checkUserState() { let isLoggedIn = UserState.instance.isLoggedIn() if isLoggedIn { showProfileLayout() } else { showLoginLayout() } } private func showLoginLayout() { inputUsername.text = "" inputPassword.text = "" loginLayout.show() profileLayout.hide() } private func showProfileLayout() { let name = UserState.instance.getFullname() fullname.text = name optionsRoles.removeAll() let userRoles = UserState.instance.getRoles() if !userRoles.isEmpty { let roles = userRoles.components(separatedBy: ";") for role in roles { if availableRoles.contains(role) { if role == CUSTOMER_ROLE_ID { let optionItem = OptionItem(label: CUSTOMER_ROLE, value: CUSTOMER_ROLE_ID) optionsRoles.append(optionItem) } else if role == OPERATOR_ROLE_ID { let optionItem = OptionItem(label: OPERATOR_ROLE, value: OPERATOR_ROLE_ID) optionsRoles.append(optionItem) } else if role == KEPALA_SEKSI_ROLE_ID { let optionItem = OptionItem(label: KEPALA_SEKSI_ROLE, value: KEPALA_SEKSI_ROLE_ID) optionsRoles.append(optionItem) } else if role == KEPALA_SUB_DIREKTORAT_ROLE_ID { let optionItem = OptionItem(label: KEPALA_SUB_DIREKTORAT_ROLE, value: KEPALA_SUB_DIREKTORAT_ROLE_ID) optionsRoles.append(optionItem) } else if role == DIREKTUR_ROLE_ID { let optionItem = OptionItem(label: DIREKTUR_ROLE, value: DIREKTUR_ROLE_ID) optionsRoles.append(optionItem) } } } btnOptionsRoles.layer.masksToBounds = false btnOptionsRoles.layer.shadowColor = #colorLiteral(red: 0.6000000238, green: 0.6000000238, blue: 0.6000000238, alpha: 1) btnOptionsRoles.layer.shadowOpacity = 0.5 btnOptionsRoles.layer.shadowOffset = CGSize(width: 1, height: 1) btnOptionsRoles.layer.shadowRadius = 1 var selectedRole = "Pilih Role" let userRoleId = UserState.instance.getRoleId() if availableRoles.contains(userRoleId) { if userRoleId == CUSTOMER_ROLE_ID { selectedRole = CUSTOMER_ROLE } else if userRoleId == OPERATOR_ROLE_ID { selectedRole = OPERATOR_ROLE } else if userRoleId == KEPALA_SEKSI_ROLE_ID { selectedRole = KEPALA_SEKSI_ROLE } else if userRoleId == KEPALA_SUB_DIREKTORAT_ROLE_ID { selectedRole = KEPALA_SUB_DIREKTORAT_ROLE } else if userRoleId == DIREKTUR_ROLE_ID { selectedRole = DIREKTUR_ROLE } } btnOptionsRoles.setTitle(selectedRole, for: .normal) optionsTV.delegate = self optionsTV.dataSource = self optionsTV.tableFooterView = UIView() optionsTV.reloadData() if roles.count > 1 { btnOptionsRoles.show() imgDropdownOptionsRoles.show() } else { btnOptionsRoles.hide() imgDropdownOptionsRoles.hide() } } else { btnOptionsRoles.hide() imgDropdownOptionsRoles.hide() } profileLayout.show() loginLayout.hide() } private func inputValid(username: String, password: String) -> Bool { var valid = true if username.isEmpty { txtUsernameError.show() valid = false } else { txtUsernameError.hide() } if password.isEmpty { txtPasswordError.show() valid = false } else { txtPasswordError.hide() } return valid } private func login(username: String, password: String) { if !loading { if ConnectionHelper.isConnectedToNetwork() { presenter.login(username: username, password: password) } else { showNoConnection() } } } // Actions @IBAction func onBtnTogglePasswordTap(_ sender: Any) { let passHidden = inputPassword.isSecureTextEntry if passHidden { inputPassword.isSecureTextEntry = false btnTogglePassword.setImage(UIImage(named: "hide-password"), for: .normal) } else { inputPassword.isSecureTextEntry = true btnTogglePassword.setImage(UIImage(named: "show-password"), for: .normal) } } @IBAction func onBtnLoginTapped(_ sender: Any) { if !loading { let username = inputUsername.getText() ?? "" let password = inputPassword.getText() ?? "" if inputValid(username: username, password: password) { login(username: username, password: password) } } } // @IBAction func onBtnForgotPasswordTapped(_ sender: Any) { // if !loading { // //openWebPage(urlPage: urlResetPassword) // // if let url = URL(string: urlResetPassword) { // UIApplication.shared.open(url) // } // // } // } // // @IBAction func onBtnRegisterTapped(_ sender: Any) { // if !loading { // //openWebPage(urlPage: urlRegister) // // if let url = URL(string: urlRegister) { // UIApplication.shared.open(url) // } // // } // } @IBAction func onBtnOptionsRolesTap(_ sender: Any) { optionsRolesLayout.show() } @IBAction func onBtnLogoutTap(_ sender: Any) { showLoading() let isLoggedOut = UserState.instance.userDataCleared() DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { self.hideLoading() if isLoggedOut { self.showLoginLayout() } } } @IBAction func onInputUsernameKeyTap(_ sender: Any) { inputPassword.becomeFirstResponder() } @IBAction func onInputPasswordKeyTap(_ sender: Any) { view.endEditing(true) } private func openWebPage(urlPage: String) { if let url = URL(string: urlPage) { if UIApplication.shared.canOpenURL(url) { if #available(iOS 10.0, *) { UIApplication.shared.open(url) } else { UIApplication.shared.openURL(url) } } } } private func showAlert(title: String, message: String, actionTitle: String) { let alertController = UIAlertController( title: title, message: message, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: actionTitle, style: .default)) self.present(alertController, animated: true, completion: nil) } } extension LoginVC: LoginViewDelegate { func showNoConnection() { let alertNoConnection = UIAlertController( title: alertNoConnectionTitle, message: alertNoConnectionMsg, preferredStyle: .alert ) alertNoConnection.addAction( UIAlertAction(title: alertNoConnectionActionYes, style: .default, handler: nil) ) self.present(alertNoConnection, animated: true, completion: nil) } func showLoading() { loading = true progress.show() } func hideLoading() { loading = false progress.hide() } func onFailedLogin(message: String) { let alertLoginFailed = UIAlertController( title: alertLoginFailedTitle, message: message, preferredStyle: .alert ) alertLoginFailed.addAction( UIAlertAction(title: alertLoginFailedActionYes, style: .default, handler: nil) ) self.present(alertLoginFailed, animated: true, completion: nil) } func onSuccessLogin(user: User) { debugPrint(user) showProfileLayout() } } extension LoginVC: UITableViewDelegate, UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return optionsRoles.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if let cell = tableView.dequeueReusableCell(withIdentifier: "AccountOptionCell", for: indexPath) as? OptionsCell { let optionItem = optionsRoles[indexPath.row] cell.updateViews(item: optionItem) return cell } else { return OptionsCell() } } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { var selectedRole = "Pilih Role" let selectedRoleId = optionsRoles[indexPath.row].value as! String if availableRoles.contains(selectedRoleId) { if selectedRoleId == CUSTOMER_ROLE_ID { selectedRole = CUSTOMER_ROLE } else if selectedRoleId == OPERATOR_ROLE_ID { selectedRole = OPERATOR_ROLE } else if selectedRoleId == KEPALA_SEKSI_ROLE_ID { selectedRole = KEPALA_SEKSI_ROLE } else if selectedRoleId == KEPALA_SUB_DIREKTORAT_ROLE_ID { selectedRole = KEPALA_SUB_DIREKTORAT_ROLE } else if selectedRoleId == DIREKTUR_ROLE_ID { selectedRole = DIREKTUR_ROLE } } let saved = UserState.instance.saveRoleId(roleId: selectedRoleId) if saved { btnOptionsRoles.setTitle(selectedRole, for: .normal) optionsRolesLayout.hide() } else { btnOptionsRoles.setTitle(selectedRole, for: .normal) optionsRolesLayout.hide() } } }