Files
SideStore/AltStore/Authentication/AuthenticationViewController.swift

161 lines
4.8 KiB
Swift
Raw Normal View History

//
// AuthenticationViewController.swift
// AltStore
//
2019-09-07 15:29:19 -07:00
// Created by Riley Testut on 9/5/19.
// Copyright © 2019 Riley Testut. All rights reserved.
//
import UIKit
import AltSign
2019-09-07 15:29:19 -07:00
class AuthenticationViewController: UIViewController
{
var authenticationHandler: (((ALTAccount, String)?) -> Void)?
2019-09-07 15:29:19 -07:00
private weak var toastView: ToastView?
2019-09-07 15:29:19 -07:00
@IBOutlet private var appleIDTextField: UITextField!
@IBOutlet private var passwordTextField: UITextField!
2019-09-07 15:29:19 -07:00
@IBOutlet private var signInButton: UIButton!
@IBOutlet private var appleIDBackgroundView: UIView!
@IBOutlet private var passwordBackgroundView: UIView!
@IBOutlet private var scrollView: UIScrollView!
@IBOutlet private var contentStackView: UIStackView!
override func viewDidLoad()
{
super.viewDidLoad()
2019-09-07 15:29:19 -07:00
for view in [self.appleIDBackgroundView!, self.passwordBackgroundView!, self.signInButton!]
{
2019-09-07 15:29:19 -07:00
view.clipsToBounds = true
view.layer.cornerRadius = 16
}
2019-09-07 15:29:19 -07:00
if UIScreen.main.isExtraCompactHeight
{
self.contentStackView.spacing = 20
}
NotificationCenter.default.addObserver(self, selector: #selector(AuthenticationViewController.textFieldDidChangeText(_:)), name: UITextField.textDidChangeNotification, object: self.appleIDTextField)
NotificationCenter.default.addObserver(self, selector: #selector(AuthenticationViewController.textFieldDidChangeText(_:)), name: UITextField.textDidChangeNotification, object: self.passwordTextField)
2019-09-07 15:29:19 -07:00
self.update()
}
override func viewDidDisappear(_ animated: Bool)
{
super.viewDidDisappear(animated)
2019-09-07 15:29:19 -07:00
self.signInButton.isIndicatingActivity = false
self.toastView?.dismiss()
}
}
private extension AuthenticationViewController
{
func update()
{
if let _ = self.validate()
{
2019-09-07 15:29:19 -07:00
self.signInButton.isEnabled = true
self.signInButton.alpha = 1.0
}
else
{
2019-09-07 15:29:19 -07:00
self.signInButton.isEnabled = false
self.signInButton.alpha = 0.6
}
}
func validate() -> (String, String)?
{
guard
2019-09-07 15:29:19 -07:00
let emailAddress = self.appleIDTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines), !emailAddress.isEmpty,
let password = self.passwordTextField.text?.trimmingCharacters(in: .whitespacesAndNewlines), !password.isEmpty
else { return nil }
return (emailAddress, password)
}
}
private extension AuthenticationViewController
{
@IBAction func authenticate()
{
guard let (emailAddress, password) = self.validate() else { return }
2019-09-07 15:29:19 -07:00
self.appleIDTextField.resignFirstResponder()
self.passwordTextField.resignFirstResponder()
2019-09-07 15:29:19 -07:00
self.signInButton.isIndicatingActivity = true
ALTAppleAPI.shared.authenticate(appleID: emailAddress, password: password) { (account, error) in
do
{
let account = try Result(account, error).get()
self.authenticationHandler?((account, password))
}
catch
{
DispatchQueue.main.async {
2019-09-07 15:29:19 -07:00
let toastView = ToastView(text: NSLocalizedString("Failed to Log In", comment: ""), detailText: error.localizedDescription)
toastView.tintColor = .altGreen
toastView.show(in: self.navigationController?.view ?? self.view)
self.toastView = toastView
2019-09-07 15:29:19 -07:00
self.signInButton.isIndicatingActivity = false
}
}
2019-09-07 15:29:19 -07:00
DispatchQueue.main.async {
self.scrollView.setContentOffset(CGPoint(x: 0, y: -self.view.safeAreaInsets.top), animated: true)
}
}
}
2019-09-07 15:29:19 -07:00
@IBAction func cancel(_ sender: UIBarButtonItem)
{
self.authenticationHandler?(nil)
}
}
extension AuthenticationViewController: UITextFieldDelegate
{
func textFieldShouldReturn(_ textField: UITextField) -> Bool
{
switch textField
{
2019-09-07 15:29:19 -07:00
case self.appleIDTextField: self.passwordTextField.becomeFirstResponder()
case self.passwordTextField: self.authenticate()
default: break
}
self.update()
return false
}
2019-09-07 15:29:19 -07:00
func textFieldDidBeginEditing(_ textField: UITextField)
{
2019-09-07 15:29:19 -07:00
guard UIScreen.main.isExtraCompactHeight else { return }
2019-09-07 15:29:19 -07:00
// Position all the controls within visible frame.
var contentOffset = self.scrollView.contentOffset
contentOffset.y = 44
self.scrollView.setContentOffset(contentOffset, animated: true)
}
}
extension AuthenticationViewController
{
@objc func textFieldDidChangeText(_ notification: Notification)
{
self.update()
}
}