// // ReferringViewController.swift // GMERemittance // // Created by FMI-12 on 2/28/18. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved. // import UIKit class ReferringViewController: UIViewController { @IBOutlet weak var textFieldFullName: UITextField! @IBOutlet weak var textFieldMobileNo: UITextField! @IBOutlet weak var textFieldEmail: UITextField! @IBOutlet weak var viewContent: UIView! private var movement: CGFloat = 0.0 private var activeTextField: UITextField? private var isScrolled: Bool = false public let inviteviewmodel = InviteViewModel() private var invitee: InviteeModel? private var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView() override func viewDidAppear(_ animated: Bool) { setUpAnotherLoginListener(genericviewmodel: inviteviewmodel) } override func viewDidLoad() { super.viewDidLoad() setUpNavBar(id: 201,title: "Invite") registerTapListener() textFieldFullName.autocorrectionType = .no textFieldMobileNo.autocorrectionType = .no textFieldEmail.autocorrectionType = .no textFieldFullName.delegate = self textFieldMobileNo.delegate = self textFieldEmail.delegate = self inviteviewmodel.inviteeConnectionTimeOut.value = nil /** connection timeout */ inviteviewmodel.inviteeConnectionTimeOut.bind { [unowned self] in guard $0 != nil else { return } self.stopLoading() self.popUpMessage(value: 20) } /** Check internet connection */ inviteviewmodel.internetConnection.value = nil inviteviewmodel.internetConnection.bind { [unowned self] in guard $0 != nil else { return } self.stopLoading() self.popUpMessage(value: 15) } setUpListener() } /** Disable user interaction while fetching data from api */ func startLoading(){ disableUserInteractions() showActivityIndicator(activityIndicator: activityIndicator) } /** Enable user interaction after fetching data from api */ func stopLoading(){ self.enableUserInteractions() self.dismissActivityIndicator(activityIndicator: self.activityIndicator) } /** UI invite button action */ @IBAction func buttomInviteTap(_ sender: Any) { InviteViewController.inviteStatus = true activeTextField?.resignFirstResponder() textFieldValidation() } /** Check empty textfield validation */ func textFieldValidation(){ let textFieldArray = [textFieldFullName.text, textFieldMobileNo.text, textFieldEmail.text] guard inviteviewmodel.allFieldsFilled(arrayofInfo: textFieldArray as! [String]) else { self.popUpMessageError(value: 11, message: "Please fill all the fields") return } self.startLoading() inviteviewmodel.createInvitee(name: textFieldFullName.text!, mobileNumber: textFieldMobileNo.text!, email: textFieldEmail.text!) } /** Submit an invitation */ func setUpListener() { inviteviewmodel.inviteeCreated.bind { [unowned self] in guard $0 != nil else { return } guard $0! else { self.stopLoading() self.popUpMessageError(value: 10, message: self.inviteviewmodel.getErrorMessage()) return } self.stopLoading() self.invitee = self.inviteviewmodel.getCreatedInvitee() self.popUpMessageInvite(value: 12) self.textFieldFullName.text = "" self.textFieldMobileNo.text = "" self.textFieldEmail.text = "" } } /** Dialog with a submission message. */ func popUpMessageInvite(value: Int){ guard let navController = self.navigationController else { return } let popUpViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "popUpInfo") as! PopUpGeneralInfo popUpViewController.indexValue = value popUpViewController.inviteeName = textFieldFullName.text navController.addChildViewController(popUpViewController) popUpViewController.view.frame = navController.view.bounds navController.view.addSubview(popUpViewController.view) popUpViewController.didMove(toParentViewController: navController) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } extension ReferringViewController: UITextFieldDelegate { func textFieldDidBeginEditing(_ textField: UITextField) { activeTextField = textField checkScroll() } func textFieldDidEndEditing(_ textField: UITextField) { checkScroll() } /** The text field calls this method whenever the user taps the return button in keypad. */ func textFieldShouldReturn(_ textField: UITextField) -> Bool { if textField == textFieldFullName { textFieldMobileNo.becomeFirstResponder() } else if textField == textFieldMobileNo { textFieldEmail.becomeFirstResponder() } else { textFieldEmail.resignFirstResponder() } return true } } extension ReferringViewController: ScrollableProtocol { /** - Returns offset value to animate */ var offset: CGFloat { get { return 50 } } /** - Returns if var isScrolled is false then scrolling is inactive and vice-versa. */ var viewScrolled: Bool { get { return isScrolled } } /** Check if textfield is active and required scroll */ func checkScroll() { if !viewScrolled { performScroll(direction: 0) isScrolled = !isScrolled } else { performScroll(direction: 1) isScrolled = !isScrolled } } /** Register tap listener */ func registerTapListener() { let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(clearKeyboard)) view.addGestureRecognizer(tap) } /** Hide keypad when ever user tap on screen condition when keypad is active */ @objc func clearKeyboard() { activeTextField?.resignFirstResponder() if viewScrolled { performScroll(direction: 1) isScrolled = !isScrolled } } /** Animate scroll UI in case when textfield is active and also if inactive. */ func performScroll(direction: Int) { if direction == 0 { UIView.animate(withDuration: 0.3, animations: { self.view.frame = self.view.frame.offsetBy(dx: 0, dy: self.offset * -1) }) } else if direction == 1 { UIView.animate(withDuration: 0.3, animations: { self.view.frame = self.view.frame.offsetBy(dx: 0, dy: self.offset) }) } } }