git.iko.soy/dashared/GDproject
on master help sign in
Added alerts for log in and registration
commita733f641a7428aab75b4bdb0cfe3afeb985b0e5f authorDarya Rednikina <rednikina.com@yandex.ru> dateSat 11 May 2019, 19:21 (7 years ago) parent5334c41
9 files changed+105−21
GDproject/Base.lproj/Main.storyboard+6−6 GDproject/Controller/ News and channels/PostViewCell.swift+1 GDproject/Controller/Coordinators/LogInCoordinator.swift+2−1 GDproject/Controller/Log In/CodeViewController.swift+47−8 GDproject/Controller/Log In/LogInViewController.swift+24−1 GDproject/Controller/Log In/RegisterTableViewController.swift+13−2 GDproject/Controller/Profile/ProfileViewController.swift+1−1 GDproject/DataStorage.swift+8 GDproject/Simple model/Model.swift+3−2
GDproject/Base.lproj/Main.storyboard+6−6
@@ -248,37 +248,37 @@
248248 <stackView opaque="NO" contentMode="scaleToFill" spacing="12" translatesAutoresizingMaskIntoConstraints="NO" id="2Gj-pC-RZ2">
249249 <rect key="frame" x="37.5" y="99" width="300" height="58"/>
250250 <subviews>
251− <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="_" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="744-t1-YNn">
251+ <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="_" textAlignment="center" adjustsFontSizeToFit="NO" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="744-t1-YNn">
252252 <rect key="frame" x="0.0" y="0.0" width="40" height="58"/>
253253 <nil key="textColor"/>
254254 <fontDescription key="fontDescription" type="system" pointSize="45"/>
255255 <textInputTraits key="textInputTraits" keyboardType="numberPad"/>
256256 </textField>
257− <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="_" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="jcR-jp-s7a">
257+ <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="_" textAlignment="center" adjustsFontSizeToFit="NO" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="jcR-jp-s7a">
258258 <rect key="frame" x="52" y="0.0" width="40" height="58"/>
259259 <nil key="textColor"/>
260260 <fontDescription key="fontDescription" type="system" pointSize="45"/>
261261 <textInputTraits key="textInputTraits" keyboardType="numberPad"/>
262262 </textField>
263− <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="_" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="YKO-0M-KD8">
263+ <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="_" textAlignment="center" adjustsFontSizeToFit="NO" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="YKO-0M-KD8">
264264 <rect key="frame" x="104" y="0.0" width="40" height="58"/>
265265 <nil key="textColor"/>
266266 <fontDescription key="fontDescription" type="system" pointSize="45"/>
267267 <textInputTraits key="textInputTraits" keyboardType="numberPad"/>
268268 </textField>
269− <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="_" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="SmG-Ae-oOs">
269+ <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="_" textAlignment="center" adjustsFontSizeToFit="NO" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="SmG-Ae-oOs">
270270 <rect key="frame" x="156" y="0.0" width="40" height="58"/>
271271 <nil key="textColor"/>
272272 <fontDescription key="fontDescription" type="system" pointSize="45"/>
273273 <textInputTraits key="textInputTraits" keyboardType="numberPad"/>
274274 </textField>
275− <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="_" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="vaP-rO-NZW">
275+ <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="_" textAlignment="center" adjustsFontSizeToFit="NO" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="vaP-rO-NZW">
276276 <rect key="frame" x="208" y="0.0" width="40" height="58"/>
277277 <nil key="textColor"/>
278278 <fontDescription key="fontDescription" type="system" pointSize="45"/>
279279 <textInputTraits key="textInputTraits" keyboardType="numberPad"/>
280280 </textField>
281− <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="_" textAlignment="center" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="qDh-32-HSn">
281+ <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="_" textAlignment="center" adjustsFontSizeToFit="NO" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="qDh-32-HSn">
282282 <rect key="frame" x="260" y="0.0" width="40" height="58"/>
283283 <nil key="textColor"/>
284284 <fontDescription key="fontDescription" type="system" pointSize="45"/>
GDproject/Controller/ News and channels/PostViewCell.swift+1
@@ -42,6 +42,7 @@ class PostViewCell: UITableViewCell
4242
4343 let shareButton: UIButton = {
4444 let button = UIButton(type: UIButton.ButtonType.detailDisclosure)
45+ button.isHidden = true
4546 return button
4647 }()
4748
GDproject/Controller/Coordinators/LogInCoordinator.swift+2−1
@@ -26,13 +26,14 @@ class LogInCoordinator: BaseCoordinator {
2626 let logInVC = LogInViewController()
2727 logInVC.authenticate = { [weak self, weak logInVC] (email) in
2828
29+ DataStorage.standard.setEmail(email: email)
2930 Model.authenticate(with: email) { [weak self]
3031 (authStatus) in
3132
3233 print(authStatus.userStatus)
3334
3435 if (authStatus.userStatus == "invalid") {
35− logInVC?.mailTextField.text = "invalid"
36+ logInVC?.presentAlertInvalidCode()
3637 }
3738 else if (authStatus.userStatus == "canRegister") { // register form
3839 self?.presentRegisterVC()
GDproject/Controller/Log In/CodeViewController.swift+47−8
@@ -7,6 +7,7 @@
77//
88
99import UIKit
10+import TinyConstraints
1011
1112class CodeViewController: UIViewController {
1213
@@ -17,12 +18,16 @@ class CodeViewController: UIViewController {
1718 @IBOutlet weak var f5: UITextField!
1819 @IBOutlet weak var f6: UITextField!
1920
21+ var loading = UIActivityIndicatorView(style: .gray)
22+
2023 var onSuccessLogIn: (()->())?
2124
2225 override func viewDidLoad() {
2326 super.viewDidLoad()
2427 setUpConstraint()
2528
29+ navigationItem.title = DataStorage.standard.getEmail()
30+
2631 f1.addTarget(self, action: #selector(textFiledDidChange(textField:)), for: .editingChanged)
2732 f2.addTarget(self, action: #selector(textFiledDidChange(textField:)), for: .editingChanged)
2833 f3.addTarget(self, action: #selector(textFiledDidChange(textField:)), for: .editingChanged)
@@ -31,6 +36,12 @@ class CodeViewController: UIViewController {
3136 f6.addTarget(self, action: #selector(textFiledDidChange(textField:)), for: .editingChanged)
3237 }
3338
39+ override func viewWillDisappear(_ animated: Bool) {
40+ super.viewWillDisappear(animated)
41+
42+ loading.stopAnimating()
43+ }
44+
3445 override func viewWillAppear(_ animated: Bool) {
3546 super.viewWillAppear(animated)
3647
@@ -62,28 +73,56 @@ class CodeViewController: UIViewController {
6273 }
6374
6475
76+ func presentAlertInvalidData(with text: String)
77+ {
78+ let alert = UIAlertController(title: "Invalid code", message: text, preferredStyle: .alert)
79+ alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
80+ self.present(alert, animated: true, completion: nil)
81+
82+ loading.stopAnimating()
83+ }
84+
6585 @IBOutlet weak var bottomConstraint: NSLayoutConstraint!
6686
6787 @IBAction func whereToGoNext(_ sender: UIButton)
6888 {
89+ guard let f1t = f1.text, let f2t = f2.text, let f3t = f3.text, let f4t = f4.text, let f5t = f5.text, let f6t = f6.text else {
90+ presentAlertInvalidData(with: "Some fields are missing");
91+ return
92+ }
93+
94+ if f1t.isEmpty || f2t.isEmpty || f3t.isEmpty || f4t.isEmpty || f5t.isEmpty || f6t.isEmpty {
95+ presentAlertInvalidData(with: "Some fields are missing");
96+ return
97+ }
98+
6999 let code = "\(f1.text!)\(f2.text!)\(f3.text!)\(f4.text!)\(f5.text!)\(f6.text!)"
70100 if let codeToInt = Int(code)
71101 {
72− Model.verify(with: codeToInt) { _ in
102+ loading.startAnimating()
103+ Model.verify(with: codeToInt) { [weak self] in
73104 // if everything is okay we can authemticicate
74− // Model.authemticiateMe
75− Model.authenticateMe { [weak self] (res) in
76− if res {
77− self?.onSuccessLogIn?()
78− } else {
79− print("sosi")
105+ if !$0 {
106+ self?.presentAlertInvalidData(with: "Wrong code. Try again!")
107+ self?.loading.stopAnimating()
108+ return
109+ } else {
110+ // Model.authemticiateMe
111+ Model.authenticateMe { [weak self] (res) in
112+ if res {
113+ self?.onSuccessLogIn?()
114+ }
80115 }
116+ return
81117 }
82118 }
83119 }
84120 }
85121
86− func setUpConstraint(){
122+ func setUpConstraint()
123+ {
124+ self.view.addSubview(loading)
125+ loading.centerInSuperview()
87126 // for keyboard notifications
88127 NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardNotifications), name: UIResponder.keyboardWillShowNotification, object: nil)
89128
GDproject/Controller/Log In/LogInViewController.swift+24−1
@@ -14,8 +14,25 @@ import Result
1414
1515class LogInViewController: UIViewController {
1616
17+ var loading = UIActivityIndicatorView(style: .gray)
18+
1719 var authenticate: ((String)->())?
1820
21+ func presentAlertInvalidCode()
22+ {
23+ let alert = UIAlertController(title: "Invalid email", message: "Try again. Use @hse.ru mail.", preferredStyle: .alert)
24+ alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
25+ self.present(alert, animated: true, completion: nil)
26+ mailTextField.text = ""
27+ loading.stopAnimating()
28+ }
29+
30+ override func viewWillDisappear(_ animated: Bool) {
31+ super.viewWillDisappear(animated)
32+
33+ loading.stopAnimating()
34+ }
35+
1936 let logInLabel: UILabel = {
2037 let label = UILabel()
2138 label.text = "Log In"
@@ -45,6 +62,7 @@ class LogInViewController: UIViewController {
4562 }()
4663
4764 @objc func handleTap(){
65+ loading.startAnimating()
4866 authenticate?(mailTextField.text!)
4967 }
5068
@@ -55,6 +73,10 @@ class LogInViewController: UIViewController {
5573 func setUpView(){
5674 // logIn stack with textField and label
5775 view.addSubview(contentView)
76+ view.addSubview(loading)
77+
78+ loading.centerInSuperview()
79+
5880 contentView.edgesToSuperview(excluding: .bottom, insets: .left(16) + .right(16) + .top(80), usingSafeArea: true)
5981 let views = [logInLabel, mailTextField]
6082 contentView.stack(views, axis: .vertical, spacing: 10)
@@ -62,6 +84,7 @@ class LogInViewController: UIViewController {
6284
6385 func configureKeyboard(){
6486
87+ mailTextField.keyboardType = .emailAddress
6588 // configure keyboardBar setUp
6689 view.addSubview(keyboardBar)
6790 keyboardBar.height(50)
@@ -79,7 +102,7 @@ class LogInViewController: UIViewController {
79102 func logicOfLogInInputValidation() -> ((String?)->()) {
80103
81104 let logic: ((String?)->()) = { [weak self] (someText) in
82− if let text = someText, !text.isEmpty {
105+ if let text = someText, !text.isEmpty, text.contains("@") {
83106 self?.logInButton.isEnabled = true
84107 } else {
85108 self?.logInButton.isEnabled = false
GDproject/Controller/Log In/RegisterTableViewController.swift+13−2
@@ -11,6 +11,13 @@ import UIKit
1111class RegisterTableViewController: UITableViewController, ChosenFactulty
1212{
1313
14+ func presentAlertInvalidData()
15+ {
16+ let alert = UIAlertController(title: "Invalid data", message: "Some fields are missing. Add more information", preferredStyle: .alert)
17+ alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
18+ self.present(alert, animated: true, completion: nil)
19+ }
20+
1421 func onChooseFaculty(faculty: Model.Faculty) {
1522 self.faculty = faculty
1623 tableView.reloadData()
@@ -20,7 +27,7 @@ class RegisterTableViewController: UITableViewController, ChosenFactulty
2027 var onRegistration: (()->())?
2128
2229 var faculty: Model.Faculty?
23− var user: Model.NewRegistration = Model.NewRegistration(email: "dyurednikina@edu.hse.ru", firstName: nil, middleName: nil, lastName: nil, faculty: nil)
30+ var user: Model.NewRegistration = Model.NewRegistration(email: DataStorage.standard.getEmail()!, firstName: nil, middleName: nil, lastName: nil, faculty: nil)
2431
2532 override func viewDidLoad()
2633 {
@@ -34,10 +41,14 @@ class RegisterTableViewController: UITableViewController, ChosenFactulty
3441 @objc func endRegistration()
3542 {
3643 updateUser()
37− guard let faculty = faculty else { return }
44+ guard let faculty = faculty else { presentAlertInvalidData(); return }
3845
3946 user.faculty = faculty.url
4047
48+ guard let _ = user.firstName else { presentAlertInvalidData(); return }
49+ guard let _ = user.middleName else { presentAlertInvalidData(); return }
50+ guard let _ = user.lastName else { presentAlertInvalidData(); return }
51+
4152 Model.register(object: user)
4253 { [weak self] in
4354 self?.onRegistration?()
GDproject/Controller/Profile/ProfileViewController.swift+1−1
@@ -56,7 +56,7 @@ class ProfileViewController: UIViewController
5656 self.nameLabel.text = "\(user.firstName) \(user.middleName)"
5757 self.surnameLabel.text = "\(user.lastName)"
5858 self.profileImageView.image = protoDictionary[user.faculty.campusCode]?.roundedImage
59− self.placeLabel.text = "📍\(user.faculty.campusName)"
59+ self.placeLabel.text = "📍\(user.faculty.address)"
6060 if user.id == DataStorage.standard.getUserId() {
6161 newMessageButton.isHidden = true
6262 } else {
GDproject/DataStorage.swift+8
@@ -37,6 +37,13 @@ class DataStorage{
3737 return UserDefaults.standard.integer(forKey: UserDefaultsKeys.id.rawValue)
3838 }
3939
40+ func setEmail(email: String) {
41+ UserDefaults.standard.set(email, forKey: UserDefaultsKeys.email.rawValue)
42+ }
43+
44+ func getEmail() -> String? {
45+ return UserDefaults.standard.string(forKey: UserDefaultsKeys.email.rawValue)
46+ }
4047 /**
4148 Function to determine is user logged in already or not
4249 */
@@ -49,4 +56,5 @@ class DataStorage{
4956enum UserDefaultsKeys: String{
5057 case loggedIn
5158 case id
59+ case email
5260}
GDproject/Simple model/Model.swift+3−2
@@ -267,9 +267,9 @@ class Model{
267267 if statusCode == 204 {
268268 // at this point cookies are set
269269 completion(true)
270+ } else {
271+ completion(false)
270272 }
271−
272− completion(false)
273273 }
274274 }
275275
@@ -976,6 +976,7 @@ class Model{
976976 var campusCode: String
977977 var name: String
978978 var tags: [String]
979+ var address: String
979980
980981 }
981982