From 6de542fef895744be41415217c87b46419039657 Mon Sep 17 00:00:00 2001 From: lfoliveira Date: Wed, 19 Feb 2025 00:14:40 -0300 Subject: [PATCH] added(): reset password view controller --- .../LuzResetPasswordFactory.swift | 10 +++ .../LuzResetPasswordViewController.swift | 86 +++++++------------ .../LuzResetPasswordViewModel.swift | 48 +++++++++++ 3 files changed, 88 insertions(+), 56 deletions(-) create mode 100644 CleanCodeApp/Modules/Features/Luz/ResetPassword/LuzResetPasswordFactory.swift create mode 100644 CleanCodeApp/Modules/Features/Luz/ResetPassword/LuzResetPasswordViewModel.swift diff --git a/CleanCodeApp/Modules/Features/Luz/ResetPassword/LuzResetPasswordFactory.swift b/CleanCodeApp/Modules/Features/Luz/ResetPassword/LuzResetPasswordFactory.swift new file mode 100644 index 0000000..839abe6 --- /dev/null +++ b/CleanCodeApp/Modules/Features/Luz/ResetPassword/LuzResetPasswordFactory.swift @@ -0,0 +1,10 @@ +import UIKit + +enum LuzResetPasswordFactory { + static func make() -> UIViewController { + let viewModel = LuzResetPasswordViewModel() + let viewController = LuzResetPasswordViewController(viewModel: viewModel) + viewModel.delegate = viewController + return viewController + } +} diff --git a/CleanCodeApp/Modules/Features/Luz/ResetPassword/LuzResetPasswordViewController.swift b/CleanCodeApp/Modules/Features/Luz/ResetPassword/LuzResetPasswordViewController.swift index 7f27328..bf1f9c3 100644 --- a/CleanCodeApp/Modules/Features/Luz/ResetPassword/LuzResetPasswordViewController.swift +++ b/CleanCodeApp/Modules/Features/Luz/ResetPassword/LuzResetPasswordViewController.swift @@ -1,7 +1,6 @@ import UIKit final class LuzResetPasswordViewController: UIViewController { - @IBOutlet weak var emailTextfield: UITextField! @IBOutlet weak var recoverPasswordButton: UIButton! @IBOutlet weak var loginButton: UIButton! @@ -15,61 +14,52 @@ final class LuzResetPasswordViewController: UIViewController { var email = "" var recoveryEmail = false + private let viewModel: LuzResetPasswordViewModel + override func viewDidLoad() { super.viewDidLoad() configureUI() + viewModel.delegate = self } public override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } + init(viewModel: LuzResetPasswordViewModel) { + self.viewModel = viewModel + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + // MARK: - IBActions @IBAction func close(_ sender: Any) { dismiss(animated: true) } - @IBAction func recoverPasswordDidTap(_ sender: Any) { + @IBAction func didTapResetPassword(_ sender: Any) { if recoveryEmail { dismiss(animated: true) return } - - do { - try FormValidator.validateEmail(emailTextfield.text) - try ConnectivityValidator.checkInternetConnection() - } catch { - handleError(error) - return - } - - self.view.endEditing(true) - - BadNetworkLayer - .shared - .resetPassword( - self, - parameters: makeParams() - ) { success in - guard success else { - self.showErrorAlert() - return - } - self.handleSucess() - } + guard let email = emailTextfield.text else { return } + viewModel.recoverPassword(from: self, email: email) } - @IBAction func helpDidTap(_ sender: Any) { - let vc = LuzContactUsViewController() - vc.modalPresentationStyle = .fullScreen - vc.modalTransitionStyle = .coverVertical - self.present(vc, animated: true, completion: nil) + @IBAction func didTapContactUS(_ sender: Any) { + let contactUsViewController = LuzContactUsViewController() + contactUsViewController.modalPresentationStyle = .fullScreen + contactUsViewController.modalTransitionStyle = .coverVertical + self.present(contactUsViewController, animated: true, completion: nil) } - @IBAction func createAccountDidTap(_ sender: Any) { - let newVc = LuzCreateAccountViewController() - newVc.modalPresentationStyle = .fullScreen - present(newVc, animated: true) + @IBAction func didTapCreateAccount(_ sender: Any) { + let createAccountViewController = LuzCreateAccountViewController() + createAccountViewController.modalPresentationStyle = .fullScreen + present(createAccountViewController, animated: true) } @IBAction func emailBeginEditing(_ sender: Any) { @@ -171,30 +161,14 @@ private extension LuzResetPasswordViewController { alertController.addAction(action) self.present(alertController, animated: true) } +} - func handleError(_ error: Error) { - emailTextfield.setErrorColor() - textLabel.textColor = .red - - switch error { - case ValidationError.emptyEmail: - return textLabel.text = "E-mail não pode estar vazio" - case ValidationError.invalidFormat: - return textLabel.text = "Verifique o email informado" - case ConnectivityError.noInternet: - return Globals.showNoInternetCOnnection(controller: self) - default: - textLabel.text = "Ocorreu um erro inesperado" - } +extension LuzResetPasswordViewController: LuzResetPasswordViewModelDelegate { + func showError(_ message: String) { + self.showErrorAlert() } -} -// MARK: Make Params -private extension LuzResetPasswordViewController { - func makeParams() -> [String: String] { - let email = emailTextfield.text!.trimmingCharacters(in: .whitespaces) - return [ - "email" : email - ] + func showSuccess() { + self.handleSucess() } } diff --git a/CleanCodeApp/Modules/Features/Luz/ResetPassword/LuzResetPasswordViewModel.swift b/CleanCodeApp/Modules/Features/Luz/ResetPassword/LuzResetPasswordViewModel.swift new file mode 100644 index 0000000..777707d --- /dev/null +++ b/CleanCodeApp/Modules/Features/Luz/ResetPassword/LuzResetPasswordViewModel.swift @@ -0,0 +1,48 @@ +import UIKit + +protocol LuzResetPasswordViewModelDelegate: AnyObject { + func showError(_ message: String) + func showSuccess() +} + +final class LuzResetPasswordViewModel { + weak var delegate: LuzResetPasswordViewModelDelegate? + + func recoverPassword( + from viewController: UIViewController, + email: String + ) { + do { + try FormValidator.validateEmail(email) + try ConnectivityValidator.checkInternetConnection() + + } catch { + handleError(error) + return + } + + BadNetworkLayer.shared.resetPassword( + viewController, + parameters: ["email": email] + ) { success in + success ? self.delegate?.showSuccess() : self.delegate?.showError( + "Algo de errado aconteceu. Tente novamente mais tarde." + ) + } + } + + private func handleError(_ error: Error) { + let errorMessage: String + switch error { + case ValidationError.emptyEmail: + errorMessage = "E-mail não pode estar vazio" + case ValidationError.invalidFormat: + errorMessage = "Verifique o email informado" + case ConnectivityError.noInternet: + errorMessage = "Sem conexão com a internet" + default: + errorMessage = "Ocorreu um erro inesperado" + } + delegate?.showError(errorMessage) + } +}