mvcgen 0.1.14 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mvcgen/filemanager.rb +1 -1
  3. data/lib/mvcgen/generator.rb +36 -33
  4. data/lib/mvcgen/version.rb +1 -1
  5. data/lib/templates/default/mvcspec.yml +1 -1
  6. data/lib/templates/default/podfile/Podfile +73 -0
  7. data/lib/templates/default/swift/AppDelegate.swift +181 -0
  8. data/lib/templates/default/swift/Assets.xcassets/AppIcon.appiconset/Contents.json +133 -0
  9. data/lib/templates/default/swift/Assets.xcassets/Back.imageset/Contents.json +21 -0
  10. data/lib/templates/default/swift/Assets.xcassets/Back.imageset/icons8-back-filled-100-2.png +0 -0
  11. data/lib/templates/default/swift/Assets.xcassets/Contents.json +6 -0
  12. data/lib/templates/default/swift/Assets.xcassets/Down.imageset/Contents.json +21 -0
  13. data/lib/templates/default/swift/Assets.xcassets/Down.imageset/icons8-expand-arrow-filled-100.png +0 -0
  14. data/lib/templates/default/swift/Assets.xcassets/Forward.imageset/Contents.json +21 -0
  15. data/lib/templates/default/swift/Assets.xcassets/Forward.imageset/icons8-forward-filled-100.png +0 -0
  16. data/lib/templates/default/swift/Assets.xcassets/Key.imageset/Contents.json +1 -0
  17. data/lib/templates/default/swift/Assets.xcassets/Key.imageset/universal_Key.pdf +0 -0
  18. data/lib/templates/default/swift/Assets.xcassets/Shopping-cart.imageset/Contents.json +1 -0
  19. data/lib/templates/default/swift/Assets.xcassets/Shopping-cart.imageset/universal_Shopping-cart.pdf +0 -0
  20. data/lib/templates/default/swift/Assets.xcassets/Tick.imageset/Contents.json +21 -0
  21. data/lib/templates/default/swift/Assets.xcassets/Tick.imageset/icons8-Checkmark-96 (1).png +0 -0
  22. data/lib/templates/default/swift/Assets.xcassets/Up.imageset/Contents.json +22 -0
  23. data/lib/templates/default/swift/Assets.xcassets/Up.imageset/icons8-collapse-arrow-100.png +0 -0
  24. data/lib/templates/default/swift/Assets.xcassets/Up.imageset/icons8-collapse-arrow-50.png +0 -0
  25. data/lib/templates/default/swift/Assets.xcassets/Uruguay.imageset/Contents.json +21 -0
  26. data/lib/templates/default/swift/Assets.xcassets/Uruguay.imageset/icons8-uruguay-40.png +0 -0
  27. data/lib/templates/default/swift/Assets.xcassets/Wallet.imageset/Contents.json +1 -0
  28. data/lib/templates/default/swift/Assets.xcassets/Wallet.imageset/universal_Wallet.pdf +0 -0
  29. data/lib/templates/default/swift/Assets.xcassets/Welcome_001.imageset/Contents.json +12 -0
  30. data/lib/templates/default/swift/Assets.xcassets/Welcome_001.imageset/Icons_NotATour_Welcome_001.pdf +0 -0
  31. data/lib/templates/default/swift/Assets.xcassets/Welcome_002.imageset/Contents.json +12 -0
  32. data/lib/templates/default/swift/Assets.xcassets/Welcome_002.imageset/Icons_NotATour_Welcome_002.pdf +0 -0
  33. data/lib/templates/default/swift/Assets.xcassets/Welcome_003.imageset/Contents.json +12 -0
  34. data/lib/templates/default/swift/Assets.xcassets/Welcome_003.imageset/Icons_NotATour_Welcome_003.pdf +0 -0
  35. data/lib/templates/default/swift/Assets.xcassets/Welcome_004.imageset/Contents.json +12 -0
  36. data/lib/templates/default/swift/Assets.xcassets/Welcome_004.imageset/Icons_NotATour_Welcome_004.pdf +0 -0
  37. data/lib/templates/default/swift/Assets.xcassets/alert_beach.imageset/Contents.json +21 -0
  38. data/lib/templates/default/swift/Assets.xcassets/alert_beach.imageset/icons8-beach-64.png +0 -0
  39. data/lib/templates/default/swift/Assets.xcassets/alert_nobaggage.imageset/Contents.json +21 -0
  40. data/lib/templates/default/swift/Assets.xcassets/alert_nobaggage.imageset/icons8-no-baggage-100.png +0 -0
  41. data/lib/templates/default/swift/Assets.xcassets/alert_signpost.imageset/Contents.json +21 -0
  42. data/lib/templates/default/swift/Assets.xcassets/alert_signpost.imageset/icons8-signpost-64.png +0 -0
  43. data/lib/templates/default/swift/Assets.xcassets/alert_sunbed.imageset/Contents.json +21 -0
  44. data/lib/templates/default/swift/Assets.xcassets/alert_sunbed.imageset/sunbed.png +0 -0
  45. data/lib/templates/default/swift/Assets.xcassets/arrow.imageset/Contents.json +21 -0
  46. data/lib/templates/default/swift/Assets.xcassets/arrow.imageset/arrow.pdf +0 -0
  47. data/lib/templates/default/swift/Assets.xcassets/baggage.imageset/Contents.json +22 -0
  48. data/lib/templates/default/swift/Assets.xcassets/baggage.imageset/baggage.png +0 -0
  49. data/lib/templates/default/swift/Assets.xcassets/baggage.imageset/baggage@2x.png +0 -0
  50. data/lib/templates/default/swift/Assets.xcassets/burger.imageset/Contents.json +21 -0
  51. data/lib/templates/default/swift/Assets.xcassets/burger.imageset/burger.pdf +0 -0
  52. data/lib/templates/default/swift/Assets.xcassets/calendar-white.imageset/Contents.json +12 -0
  53. data/lib/templates/default/swift/Assets.xcassets/calendar-white.imageset/icons8-calendar.pdf +70 -0
  54. data/lib/templates/default/swift/Assets.xcassets/calendar.imageset/Contents.json +12 -0
  55. data/lib/templates/default/swift/Assets.xcassets/calendar.imageset/calendar.pdf +0 -0
  56. data/lib/templates/default/swift/Assets.xcassets/dots.imageset/Contents.json +24 -0
  57. data/lib/templates/default/swift/Assets.xcassets/dots.imageset/dots.pdf +0 -0
  58. data/lib/templates/default/swift/Assets.xcassets/edit.imageset/Contents.json +12 -0
  59. data/lib/templates/default/swift/Assets.xcassets/edit.imageset/edit.pdf +0 -0
  60. data/lib/templates/default/swift/Assets.xcassets/emptylogin.imageset/Contents.json +12 -0
  61. data/lib/templates/default/swift/Assets.xcassets/emptylogin.imageset/empty state loging.pdf +0 -0
  62. data/lib/templates/default/swift/Assets.xcassets/envelope.imageset/Contents.json +12 -0
  63. data/lib/templates/default/swift/Assets.xcassets/envelope.imageset/icons8-envelope.pdf +70 -0
  64. data/lib/templates/default/swift/Assets.xcassets/expandSection.imageset/Contents.json +22 -0
  65. data/lib/templates/default/swift/Assets.xcassets/expandSection.imageset/icons8-expand-arrow-100.png +0 -0
  66. data/lib/templates/default/swift/Assets.xcassets/expandSection.imageset/icons8-expand-arrow-50.png +0 -0
  67. data/lib/templates/default/swift/Assets.xcassets/facebook.imageset/Contents.json +24 -0
  68. data/lib/templates/default/swift/Assets.xcassets/facebook.imageset/icons8-facebook-f.pdf +68 -0
  69. data/lib/templates/default/swift/Assets.xcassets/filter-white.imageset/Contents.json +12 -0
  70. data/lib/templates/default/swift/Assets.xcassets/filter-white.imageset/icons8-adjust (3).pdf +0 -0
  71. data/lib/templates/default/swift/Assets.xcassets/filter.imageset/Contents.json +15 -0
  72. data/lib/templates/default/swift/Assets.xcassets/filter.imageset/filter.pdf +0 -0
  73. data/lib/templates/default/swift/Assets.xcassets/food.imageset/Contents.json +21 -0
  74. data/lib/templates/default/swift/Assets.xcassets/food.imageset/food.png +0 -0
  75. data/lib/templates/default/swift/Assets.xcassets/forgot-password.imageset/Contents.json +23 -0
  76. data/lib/templates/default/swift/Assets.xcassets/forgot-password.imageset/page-1.png +0 -0
  77. data/lib/templates/default/swift/Assets.xcassets/forgot-password.imageset/page-1@2x.png +0 -0
  78. data/lib/templates/default/swift/Assets.xcassets/forgot-password.imageset/page-1@3x.png +0 -0
  79. data/lib/templates/default/swift/Assets.xcassets/heart-active.imageset/Contents.json +12 -0
  80. data/lib/templates/default/swift/Assets.xcassets/heart-active.imageset/favortio activo.pdf +0 -0
  81. data/lib/templates/default/swift/Assets.xcassets/heart.imageset/Contents.json +12 -0
  82. data/lib/templates/default/swift/Assets.xcassets/heart.imageset/favorito inactivo.pdf +0 -0
  83. data/lib/templates/default/swift/Assets.xcassets/icons8-delete.imageset/Contents.json +12 -0
  84. data/lib/templates/default/swift/Assets.xcassets/icons8-delete.imageset/icons8-delete (3).pdf +69 -0
  85. data/lib/templates/default/swift/Assets.xcassets/lock.imageset/Contents.json +12 -0
  86. data/lib/templates/default/swift/Assets.xcassets/lock.imageset/icons8-lock.pdf +69 -0
  87. data/lib/templates/default/swift/Assets.xcassets/man-avatar.imageset/Contents.json +12 -0
  88. data/lib/templates/default/swift/Assets.xcassets/man-avatar.imageset/man-avatar.pdf +1149 -1
  89. data/lib/templates/default/swift/Assets.xcassets/new-notification.imageset/Contents.json +21 -0
  90. data/lib/templates/default/swift/Assets.xcassets/new-notification.imageset/icons8-filled-circle-filled-100.png +0 -0
  91. data/lib/templates/default/swift/Assets.xcassets/no-fav.imageset/Contents.json +21 -0
  92. data/lib/templates/default/swift/Assets.xcassets/no-fav.imageset/page-1@2x.png +0 -0
  93. data/lib/templates/default/swift/Assets.xcassets/notificaciones.imageset/Contents.json +12 -0
  94. data/lib/templates/default/swift/Assets.xcassets/notificaciones.imageset/notificaciones.pdf +0 -0
  95. data/lib/templates/default/swift/Assets.xcassets/notification.imageset/Contents.json +21 -0
  96. data/lib/templates/default/swift/Assets.xcassets/notification.imageset/icons8-notification-100.png +0 -0
  97. data/lib/templates/default/swift/Assets.xcassets/other.imageset/Contents.json +21 -0
  98. data/lib/templates/default/swift/Assets.xcassets/other.imageset/other.png +0 -0
  99. data/lib/templates/default/swift/Assets.xcassets/page-1.imageset/Contents.json +21 -0
  100. data/lib/templates/default/swift/Assets.xcassets/page-1.imageset/page-1@2x.png +0 -0
  101. data/lib/templates/default/swift/Assets.xcassets/page-3.imageset/Contents.json +21 -0
  102. data/lib/templates/default/swift/Assets.xcassets/page-3.imageset/page-1@2x.png +0 -0
  103. data/lib/templates/default/swift/Assets.xcassets/photo.imageset/Contents.json +24 -0
  104. data/lib/templates/default/swift/Assets.xcassets/photo.imageset/photo.pdf +0 -0
  105. data/lib/templates/default/swift/Assets.xcassets/plus-white.imageset/Contents.json +21 -0
  106. data/lib/templates/default/swift/Assets.xcassets/plus-white.imageset/icons8-plus-math-26.png +0 -0
  107. data/lib/templates/default/swift/Assets.xcassets/plus.imageset/+.pdf +0 -0
  108. data/lib/templates/default/swift/Assets.xcassets/plus.imageset/Contents.json +12 -0
  109. data/lib/templates/default/swift/Assets.xcassets/register.imageset/Contents.json +12 -0
  110. data/lib/templates/default/swift/Assets.xcassets/register.imageset/registro.pdf +0 -0
  111. data/lib/templates/default/swift/Assets.xcassets/search.imageset/Contents.json +15 -0
  112. data/lib/templates/default/swift/Assets.xcassets/search.imageset/search.pdf +0 -0
  113. data/lib/templates/default/swift/Assets.xcassets/settings.imageset/Contents.json +23 -0
  114. data/lib/templates/default/swift/Assets.xcassets/settings.imageset/icons8-settings-100.png +0 -0
  115. data/lib/templates/default/swift/Assets.xcassets/settings.imageset/icons8-settings-50.png +0 -0
  116. data/lib/templates/default/swift/Assets.xcassets/settings.imageset/icons8-settings-500.png +0 -0
  117. data/lib/templates/default/swift/Assets.xcassets/shape.imageset/Contents.json +23 -0
  118. data/lib/templates/default/swift/Assets.xcassets/shape.imageset/shape.png +0 -0
  119. data/lib/templates/default/swift/Assets.xcassets/shape.imageset/shape@2x.png +0 -0
  120. data/lib/templates/default/swift/Assets.xcassets/shape.imageset/shape@3x.png +0 -0
  121. data/lib/templates/default/swift/Assets.xcassets/signpost.imageset/Contents.json +21 -0
  122. data/lib/templates/default/swift/Assets.xcassets/signpost.imageset/icons8-signpost-50.png +0 -0
  123. data/lib/templates/default/swift/Assets.xcassets/stars.imageset/Contents.json +24 -0
  124. data/lib/templates/default/swift/Assets.xcassets/stars.imageset/stars.pdf +0 -0
  125. data/lib/templates/default/swift/Assets.xcassets/terms.imageset/Contents.json +12 -0
  126. data/lib/templates/default/swift/Assets.xcassets/terms.imageset/terminos y condiciones.pdf +0 -0
  127. data/lib/templates/default/swift/Assets.xcassets/tickets.imageset/Contents.json +12 -0
  128. data/lib/templates/default/swift/Assets.xcassets/tickets.imageset/tickets.pdf +0 -0
  129. data/lib/templates/default/swift/Assets.xcassets/user.imageset/Contents.json +22 -0
  130. data/lib/templates/default/swift/Assets.xcassets/user.imageset/icons8-account-100.png +0 -0
  131. data/lib/templates/default/swift/Assets.xcassets/user.imageset/icons8-account-50.png +0 -0
  132. data/lib/templates/default/swift/Assets.xcassets/visa.imageset/Contents.json +21 -0
  133. data/lib/templates/default/swift/Assets.xcassets/visa.imageset/visa.png +0 -0
  134. data/lib/templates/default/swift/Config/Config.swift +1 -1
  135. data/lib/templates/default/swift/Controllers/Login/ForgetPasswordVC.swift +125 -0
  136. data/lib/templates/default/swift/Controllers/Login/LoginVC.swift +244 -0
  137. data/lib/templates/default/swift/Controllers/Login/RegisterVC.swift +213 -0
  138. data/lib/templates/default/swift/Controllers/Notifications/Cells/NotificationCell.swift +51 -0
  139. data/lib/templates/default/swift/Controllers/Notifications/NotificationsVC.swift +164 -0
  140. data/lib/templates/default/swift/Controllers/OtherLogin/ForgetPasswordTVC.swift +98 -0
  141. data/lib/templates/default/swift/Controllers/OtherLogin/LoginTVC.swift +245 -0
  142. data/lib/templates/default/swift/Controllers/OtherLogin/OtherRegisterVC.swift +299 -0
  143. data/lib/templates/default/swift/Controllers/OtherLogin/SelectLanguageCell.swift +17 -0
  144. data/lib/templates/default/swift/Controllers/OtherLogin/SelectLanguageVC.swift +116 -0
  145. data/lib/templates/default/swift/Controllers/OtherLogin/TermsAndConditionsVC.swift +76 -0
  146. data/lib/templates/default/swift/Controllers/Profile/AboutUsVC.swift +93 -0
  147. data/lib/templates/default/swift/Controllers/Profile/Cells/AboutUsImageCell.swift +66 -0
  148. data/lib/templates/default/swift/Controllers/Profile/Cells/DescriptionCell.swift +16 -0
  149. data/lib/templates/default/swift/Controllers/Profile/Cells/DestinationCell.swift +35 -0
  150. data/lib/templates/default/swift/Controllers/Profile/Cells/DestinationCellView.xib +84 -0
  151. data/lib/templates/default/swift/Controllers/Profile/Cells/FavoriteCollectionCell.swift +24 -0
  152. data/lib/templates/default/swift/Controllers/Profile/Cells/ImagesCollectionViewCell.swift +15 -0
  153. data/lib/templates/default/swift/Controllers/Profile/ProfileContainerVC.swift +72 -0
  154. data/lib/templates/default/swift/Controllers/Profile/ProfileTVC.swift +581 -0
  155. data/lib/templates/default/swift/Controllers/Tutorial/TutorialVC.swift +121 -0
  156. data/lib/templates/default/swift/Extensions/ArrayDuplicates.swift +35 -0
  157. data/lib/templates/default/swift/Extensions/Buttons.swift +1 -1
  158. data/lib/templates/default/swift/Extensions/CustomCamera.swift +65 -0
  159. data/lib/templates/default/swift/Extensions/GradientView.swift +121 -0
  160. data/lib/templates/default/swift/Extensions/HideKeyboard.swift +22 -0
  161. data/lib/templates/default/swift/Extensions/Images.swift +82 -0
  162. data/lib/templates/default/swift/Extensions/InnerShadowExtension.swift +83 -0
  163. data/lib/templates/default/swift/Extensions/TableViewEmptyView.swift +30 -0
  164. data/lib/templates/default/swift/Extensions/TapEffectExtension.swift +48 -0
  165. data/lib/templates/default/swift/Extensions/{ColorHex.swift → UIColorExtensions.swift} +2 -2
  166. data/lib/templates/default/swift/Extensions/UnderlinedTextView.swift +61 -0
  167. data/lib/templates/default/swift/Extensions/UnderlinedWithIconTextField.swift +55 -0
  168. data/lib/templates/default/swift/Helper/APIHelper.swift +4 -4
  169. data/lib/templates/default/swift/Helper/APIManager.swift +81 -14
  170. data/lib/templates/default/swift/Helper/APIRequestBody.swift +1 -1
  171. data/lib/templates/default/swift/Helper/AWSManager.swift +1 -1
  172. data/lib/templates/default/swift/Helper/FilesManager.swift +1 -1
  173. data/lib/templates/default/swift/Helper/S3Manager.swift +1 -1
  174. data/lib/templates/default/swift/Helper/Utils.swift +3 -1
  175. data/lib/templates/default/swift/Info.plist +53 -0
  176. data/lib/templates/default/swift/Models/Country.swift +28 -0
  177. data/lib/templates/default/swift/Models/Managers/UserManager.swift +1 -1
  178. data/lib/templates/default/swift/Models/Notif.swift +71 -0
  179. data/lib/templates/default/swift/Models/Responses/BaseResponse.swift +1 -1
  180. data/lib/templates/default/swift/Models/Responses/NotificationResponse.swift +24 -0
  181. data/lib/templates/default/swift/Models/Responses/UserResponse.swift +1 -1
  182. data/lib/templates/default/swift/Models/Responses/UserSingupResponse.swift +1 -1
  183. data/lib/templates/default/swift/Models/User.swift +2 -2
  184. data/lib/templates/default/swift/UI/Storyboards/Home.storyboard +2113 -0
  185. data/lib/templates/default/swift/UI/Storyboards/Login.storyboard +814 -0
  186. data/lib/templates/default/swift/UI/Storyboards/OtherLogin.storyboard +1031 -0
  187. data/lib/templates/default/swift/UI/Views/EmptyTableView/EmptyTableLabelView.swift +18 -0
  188. data/lib/templates/default/swift/UI/Views/EmptyTableView/NoNotificationView.swift +16 -0
  189. data/lib/templates/default/swift/UI/Views/EmptyTableView/Xibs/EmptyTableLabelView.xib +72 -0
  190. data/lib/templates/default/swift/UI/Views/EmptyTableView/Xibs/NoNotificationsView.xib +61 -0
  191. metadata +176 -4
@@ -3,7 +3,7 @@
3
3
  // MVCGEN
4
4
  //
5
5
  // Created by Daniel Martinez on 23/7/18.
6
- // Copyright © 2018 DanielMartinez. All rights reserved.
6
+ // Copyright © 2018 Houlak. All rights reserved.
7
7
  //
8
8
 
9
9
 
@@ -0,0 +1,125 @@
1
+ //
2
+ // ForgetPasswordVC.swift
3
+ // MVCGEN
4
+ //
5
+ // Created by Daniel Martinez on 23/7/18.
6
+ // Copyright © 2018 Houlak. All rights reserved.
7
+ //
8
+
9
+ import Foundation
10
+
11
+ import UIKit
12
+
13
+ protocol ForgetPasswordVCDelegate: class {
14
+ func removeBlurredBackgroundView()
15
+ }
16
+ class ForgetPasswordVC: UIViewController, UIGestureRecognizerDelegate {
17
+
18
+ weak var delegate: ForgetPasswordVCDelegate?
19
+ private var keybaordIsShowing: Bool = false
20
+
21
+ @IBOutlet weak var cancelButton: UIButton!
22
+ @IBOutlet weak var bottomConstraint: NSLayoutConstraint!
23
+ @IBOutlet weak var topConstraint: NSLayoutConstraint!
24
+ @IBOutlet weak var backgroundView: UIView!
25
+ @IBOutlet weak var recoverView: UIView!
26
+ @IBOutlet weak var emailTextField: UITextField!
27
+ @IBOutlet weak var sendButton: LoadingButton!
28
+
29
+ override func viewDidLoad() {
30
+ super.viewDidLoad()
31
+
32
+ hideKeyboardWhenTappedAround()
33
+
34
+ let tap = UITapGestureRecognizer(target: self, action: #selector(dismissView))
35
+
36
+ tap.delegate = self
37
+
38
+ self.backgroundView.addGestureRecognizer(tap)
39
+
40
+ NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWasShown), name: .UIKeyboardWillShow, object: nil);
41
+ NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWasHidden), name: .UIKeyboardWillHide, object: nil);
42
+
43
+
44
+ }
45
+
46
+ func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
47
+ if keybaordIsShowing {
48
+ return false
49
+ }
50
+ if touch.view?.restorationIdentifier == "backViewID" {
51
+ return true
52
+ }
53
+ return false
54
+ }
55
+
56
+ @objc func dismissView(){
57
+ dismiss(animated: true, completion: nil)
58
+ delegate?.removeBlurredBackgroundView()
59
+ }
60
+
61
+
62
+ @objc func keyboardWasShown(notification: NSNotification) {
63
+
64
+ self.keybaordIsShowing = true
65
+
66
+ UIView.animate(withDuration: 0.5, animations: { () -> Void in
67
+ self.bottomConstraint.constant = 287
68
+ self.topConstraint.constant = 10
69
+ })
70
+ }
71
+
72
+ @objc func keyboardWasHidden(notification: NSNotification) {
73
+
74
+ self.keybaordIsShowing = false
75
+
76
+ UIView.animate(withDuration: 0.5, animations: { () -> Void in
77
+ self.topConstraint.constant = 148.5
78
+ self.bottomConstraint.constant = 148.5
79
+ })
80
+ }
81
+
82
+ override func viewDidLayoutSubviews() {
83
+ view.backgroundColor = UIColor.clear
84
+
85
+ //ensure that the icon embeded in the cancel button fits in nicely
86
+ cancelButton.imageView?.contentMode = .scaleAspectFit
87
+
88
+ //add a white tint color for the Cancel button image
89
+ // let cancelImage = UIImage(named: "Cancel")
90
+
91
+ // let tintedCancelImage = cancelImage?.withRenderingMode(.alwaysTemplate)
92
+ // cancelButton.setImage(tintedCancelImage, for: .normal)
93
+ // cancelButton.tintColor = .white
94
+ }
95
+
96
+ // MARK: - Actions
97
+ @IBAction func cancelTapped(_ sender: UIButton) {
98
+ self.dismissView()
99
+ }
100
+
101
+ @IBAction func sendTapped(_ sender: UIButton) {
102
+ if let email = self.emailTextField.text, isValidEmail(email) {
103
+ self.sendButton.showLoading()
104
+ APIManager.sharedInstance.forgotPwd(withParameters: APIRequestBody.forgotPwd(withEmail: email), completion: {
105
+ result in
106
+ self.sendButton.hideLoading()
107
+ if result == .success {
108
+ APIHelper.sharedInstance.showSuccesMessage(with: NSLocalizedString("Email sent!", comment: ""), and: "")
109
+ }
110
+ })
111
+ } else {
112
+ APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Invalid email", comment: ""), and: "")
113
+ }
114
+ }
115
+
116
+ // MARK: - Private
117
+
118
+ private func isValidEmail(_ testStr:String) -> Bool {
119
+ let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
120
+ let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
121
+ return emailTest.evaluate(with: testStr)
122
+ }
123
+
124
+
125
+ }
@@ -0,0 +1,244 @@
1
+ //
2
+ // LoginVC.swift
3
+ // MVCGEN
4
+ //
5
+ // Created by Daniel Martinez on 23/7/18.
6
+ // Copyright © 2018 Houlak. All rights reserved.
7
+ //
8
+
9
+ import UIKit
10
+ import Pastel
11
+ import FacebookLogin
12
+
13
+ class LoginVC: UITableViewController, UITextFieldDelegate, ForgetPasswordVCDelegate {
14
+
15
+ // MARK: - Outlets
16
+
17
+ @IBOutlet weak var emailTextField: UITextField!
18
+ @IBOutlet weak var passwordTextField: UITextField!
19
+ @IBOutlet weak var forgetPasswordLabel: UILabel!
20
+ @IBOutlet weak var loginButton: LoadingButton!{
21
+ didSet{
22
+ loginButton.addShadow()
23
+ }
24
+ }
25
+
26
+ private let homeStoryboard = UIStoryboard(name: "Home", bundle: Bundle.main)
27
+
28
+ @IBOutlet weak var registerButton: UIButton!{
29
+ didSet{
30
+ registerButton.addShadow()
31
+ }
32
+ }
33
+
34
+ @IBOutlet weak var facebookLoginButton: LoadingButton!{
35
+ didSet{
36
+ facebookLoginButton.addShadow()
37
+ }
38
+ }
39
+
40
+ private var pastelView: PastelView!
41
+
42
+ override func viewDidLoad() {
43
+ super.viewDidLoad()
44
+
45
+
46
+ self.emailTextField.delegate = self
47
+ self.passwordTextField.delegate = self
48
+
49
+ configureText()
50
+
51
+ configureViews()
52
+
53
+ hideKeyboardWhenTappedAround()
54
+
55
+ }
56
+
57
+ override func viewWillAppear(_ animated: Bool) {
58
+ super.viewWillAppear(animated)
59
+
60
+ self.pastelView.startAnimation()
61
+ }
62
+
63
+ // MARK: - Actions
64
+
65
+ @IBAction func loginTapped(_ sender: UIButton) {
66
+ self.emailLoginTapped()
67
+ }
68
+
69
+ @IBAction func facebookLoginTapped(_ sender: UIButton) {
70
+ self.facebookLoginButton.showLoading()
71
+ let fbLoginManager = LoginManager()
72
+ // TODO: Comment next line after logout is done
73
+ fbLoginManager.logOut()
74
+ fbLoginManager.logIn(readPermissions: [.email, .userBirthday, .publicProfile], viewController: self, completion: { loginResult in
75
+ switch loginResult {
76
+ case .failed(let error):
77
+ self.facebookLoginButton.hideLoading()
78
+ print(error)
79
+ break
80
+ case .cancelled:
81
+ self.facebookLoginButton.hideLoading()
82
+ print("User cancelled login.")
83
+ break
84
+ case .success(let grantedPermissions, let declinedPermissions, let accessToken):
85
+ // let photoURL = URL(string: "https://graph.facebook.com/\(accessToken.userId ?? "")/picture?type=large&return_ssl_resources=1")
86
+ APIManager.sharedInstance.loginfb(withParameters: APIRequestBody.getFbLoginBody(withAccesToken: accessToken.authenticationToken), completion: {
87
+ result in
88
+ self.facebookLoginButton.hideLoading()
89
+ if result == .success {
90
+ self.performSegue(withIdentifier: "GoHome", sender: nil)
91
+ }
92
+ })
93
+ }
94
+ })
95
+ }
96
+
97
+ @IBAction func forgetPasswordTapped(_ sender: UIButton) {
98
+ self.definesPresentationContext = true
99
+ self.providesPresentationContextTransitionStyle = true
100
+
101
+ self.overlayBlurredBackgroundView()
102
+ }
103
+
104
+ override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
105
+ if let identifier = segue.identifier {
106
+ if identifier == "ShowForgetPassword" {
107
+ if let viewController = segue.destination as? ForgetPasswordVC {
108
+ viewController.delegate = self
109
+ viewController.modalPresentationStyle = .overFullScreen
110
+ }
111
+ }
112
+ }
113
+ }
114
+
115
+ // MARK: - UITextFieldDelegate
116
+ func textFieldShouldReturn(_ textField: UITextField) -> Bool {
117
+
118
+ if textField.tag == 1 {
119
+ textField.resignFirstResponder()
120
+ emailLoginTapped()
121
+ return true
122
+ }
123
+
124
+ let nextTage = textField.tag+1
125
+
126
+ // Try to find next responder
127
+ guard let nextResponder = textField.superview?.superview?.superview?.viewWithTag(nextTage) as UIResponder? else {
128
+ textField.resignFirstResponder()
129
+ return false
130
+ }
131
+
132
+ nextResponder.becomeFirstResponder()
133
+
134
+ return false // We do not want UITextField to insert line-breaks.
135
+ }
136
+
137
+ // MARK: - Private
138
+
139
+ private func configureText(){
140
+
141
+ self.emailTextField.attributedPlaceholder = NSAttributedString(string: NSLocalizedString("Email", comment: ""),
142
+ attributes: [NSAttributedStringKey.foregroundColor: UIColor.lightGray, NSAttributedStringKey.font: Fonts.roboto(type: 1, fontSize: 17)])
143
+ self.passwordTextField.attributedPlaceholder = NSAttributedString(string: NSLocalizedString("Password", comment: ""),
144
+ attributes: [NSAttributedStringKey.foregroundColor: UIColor.lightGray, NSAttributedStringKey.font: Fonts.roboto(type: 1, fontSize: 17)])
145
+
146
+ let normalText = NSLocalizedString("Forget your password?", comment: "")
147
+ let normalAttrs = [NSAttributedStringKey.font : Fonts.roboto(type: 0, fontSize: 15)]
148
+ let normalString = NSMutableAttributedString(string:normalText,attributes: normalAttrs)
149
+
150
+ let boldText = NSLocalizedString(" Restore", comment: "")
151
+ let attrs = [NSAttributedStringKey.font : Fonts.roboto(type: 4, fontSize: 15)]
152
+ let attributedString = NSMutableAttributedString(string:boldText, attributes:attrs)
153
+
154
+ normalString.append(attributedString)
155
+
156
+ self.forgetPasswordLabel.attributedText = normalString
157
+
158
+ }
159
+
160
+ private func configureViews(){
161
+ self.pastelView = PastelView(frame: self.tableView.bounds)
162
+
163
+ // Custom Direction
164
+ pastelView.startPastelPoint = .bottomLeft
165
+ pastelView.endPastelPoint = .topRight
166
+
167
+ // Custom Duration
168
+ pastelView.animationDuration = 3.0
169
+
170
+ // Custom Color
171
+ pastelView.setColors([Colors.firstGradientColor, Colors.textColor, Colors.secondGradientColor, Colors.thirdGradientColor])
172
+
173
+ self.tableView.backgroundView = pastelView
174
+
175
+ }
176
+
177
+ private func emailLoginTapped(){
178
+ if self.validateForm(){
179
+ if let email = self.emailTextField.text, let password = self.passwordTextField.text{
180
+ self.loginButton.showLoading()
181
+ APIManager.sharedInstance.login(withParameters: APIRequestBody.getLoginBody(withEmail: email, withPassword: password), completion: {
182
+ result in
183
+ self.loginButton.hideLoading()
184
+ if result == .success {
185
+ let rootController = self.homeStoryboard.instantiateViewController(withIdentifier: "Home")
186
+ UIApplication.shared.keyWindow?.rootViewController = rootController
187
+ self.performSegue(withIdentifier: "GoHome", sender: nil)
188
+ }
189
+ })
190
+ }
191
+ }
192
+ }
193
+
194
+ private func validateForm() -> Bool {
195
+
196
+ if self.emailTextField.text == "" {
197
+ errorOnLogin(causeOfFailure: "email")
198
+ return false
199
+ }
200
+
201
+ if self.passwordTextField.text == "" {
202
+ errorOnLogin(causeOfFailure: "password")
203
+ return false
204
+ }
205
+
206
+ return true
207
+ }
208
+
209
+ private func errorOnLogin(causeOfFailure error: String){
210
+
211
+ switch error {
212
+ case "email":
213
+ APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("You must enter an email", comment: ""), and: "")
214
+ break
215
+ case "password":
216
+ APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("You must enter a password", comment: ""), and: "")
217
+ break
218
+ default:
219
+ APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Check the entered data", comment: ""), and: "")
220
+ break
221
+ }
222
+
223
+ }
224
+
225
+ private func overlayBlurredBackgroundView() {
226
+
227
+ let blurredBackgroundView = UIVisualEffectView()
228
+
229
+ blurredBackgroundView.frame = self.tableView.bounds
230
+ blurredBackgroundView.effect = UIBlurEffect(style: .dark)
231
+
232
+ self.tableView.addSubview(blurredBackgroundView)
233
+
234
+ }
235
+
236
+ @objc func removeBlurredBackgroundView() {
237
+
238
+ for subview in self.tableView.subviews {
239
+ if subview.isKind(of: UIVisualEffectView.self) {
240
+ subview.removeFromSuperview()
241
+ }
242
+ }
243
+ }
244
+ }
@@ -0,0 +1,213 @@
1
+ //
2
+ // RegisterVC.swift
3
+ // MVCGEN
4
+ //
5
+ // Created by Daniel Martinez on 23/7/18.
6
+ // Copyright © 2018 Houlak. All rights reserved.
7
+ //
8
+
9
+ import UIKit
10
+ import Pastel
11
+
12
+ class RegisterVC: UITableViewController, UITextFieldDelegate {
13
+
14
+ @IBOutlet weak var nameTextField: UITextField!
15
+ @IBOutlet weak var lastnameTextField: UITextField!
16
+ @IBOutlet weak var cellphoneTextField: UITextField!
17
+ @IBOutlet weak var emailTextField: UITextField!
18
+ @IBOutlet weak var passwordTextField: UITextField!
19
+ @IBOutlet weak var confirmPasswordTextField: UITextField!
20
+ @IBOutlet weak var createAccountButton: LoadingButton!{
21
+ didSet{
22
+ createAccountButton.addShadow()
23
+ }
24
+ }
25
+ @IBOutlet weak var acceptTermsButton: UIButton!
26
+
27
+ private var pastelView: PastelView!
28
+
29
+ private var termsAndConditionsAccepted: Bool = false
30
+
31
+ override func viewDidLoad() {
32
+ super.viewDidLoad()
33
+
34
+ self.nameTextField.delegate = self
35
+ self.lastnameTextField.delegate = self
36
+ self.cellphoneTextField.delegate = self
37
+ self.emailTextField.delegate = self
38
+ self.passwordTextField.delegate = self
39
+ self.confirmPasswordTextField.delegate = self
40
+
41
+ configureText()
42
+
43
+ configureViews()
44
+
45
+ hideKeyboardWhenTappedAround()
46
+
47
+ }
48
+
49
+ override func viewWillAppear(_ animated: Bool) {
50
+ super.viewWillAppear(animated)
51
+
52
+ self.pastelView.startAnimation()
53
+ }
54
+
55
+
56
+ // MARK: - UITextFieldDelegate
57
+ func textFieldShouldReturn(_ textField: UITextField) -> Bool {
58
+
59
+ let nextTage = textField.tag+1
60
+
61
+ // Try to find next responder
62
+ guard let nextResponder = textField.superview?.superview?.superview?.viewWithTag(nextTage) as UIResponder? else {
63
+ textField.resignFirstResponder()
64
+ return false
65
+ }
66
+
67
+ nextResponder.becomeFirstResponder()
68
+
69
+ return false // We do not want UITextField to insert line-breaks.
70
+ }
71
+
72
+ // MARK: - Actions
73
+
74
+ @IBAction func createTapped(_ sender: UIButton) {
75
+ if self.validateForm(){
76
+ if let email = self.emailTextField.text, let password = self.passwordTextField.text, let name = self.nameTextField.text, let lastname = self.lastnameTextField.text, let cellphone = self.cellphoneTextField.text {
77
+ self.createAccountButton.showLoading()
78
+ APIManager.sharedInstance.signup(withParameters: APIRequestBody.getSignupBody(withEmail: email, withPassword: password, withFirstName: name, withLastname: lastname, withPhone: cellphone, withProfilePic: "", withStudies: "", withCertifications: "", withAbout: ""), completion: {
79
+ result, user in
80
+ if result == .success {
81
+ APIManager.sharedInstance.login(withParameters: APIRequestBody.getLoginBody(withEmail: email, withPassword: password), completion: {
82
+ result in
83
+ self.createAccountButton.hideLoading()
84
+ if result == .success {
85
+ self.performSegue(withIdentifier: "SuccesfullySignup", sender: nil)
86
+ }
87
+ })
88
+ } else {
89
+ self.createAccountButton.hideLoading()
90
+ }
91
+ })
92
+ }
93
+ }
94
+ }
95
+
96
+ @IBAction func termsTapped(_ sender: UIButton) {
97
+ if !termsAndConditionsAccepted {
98
+ let tintedImage = Asset.tick.image.withRenderingMode(.alwaysTemplate)
99
+ sender.setImage(tintedImage, for: .normal)
100
+ sender.tintColor = UIColor.init(red: 51/255, green: 125/255, blue: 173/255, alpha: 1.0)
101
+ if let image = sender.imageView {
102
+ sender.bringSubview(toFront: image)
103
+ }
104
+ termsAndConditionsAccepted = true
105
+ } else {
106
+ sender.setImage(nil, for: .normal)
107
+ termsAndConditionsAccepted = false
108
+ }
109
+ }
110
+
111
+ @IBAction func termsAndConditionsTapped(_ sender: UIButton) {
112
+ // TODO: View url
113
+ if let url = URL(string: "http://dils.com/terms-and-conditions") {
114
+ UIApplication.shared.open(url, options: [:], completionHandler: nil)
115
+ }
116
+ }
117
+
118
+ @IBAction func alreadyHaveAccountTapped(_ sender: UIButton) {
119
+ self.dismiss(animated: true, completion: nil)
120
+ }
121
+
122
+
123
+
124
+ // MARK: - Private
125
+
126
+ private func configureText(){
127
+
128
+ self.emailTextField.attributedPlaceholder = NSAttributedString(string: NSLocalizedString("Email", comment: ""),
129
+ attributes: [NSAttributedStringKey.foregroundColor: UIColor.lightGray, NSAttributedStringKey.font: Fonts.roboto(type: 1, fontSize: 17)])
130
+
131
+ self.nameTextField.attributedPlaceholder = NSAttributedString(string: NSLocalizedString("Name", comment: ""),
132
+ attributes: [NSAttributedStringKey.foregroundColor: UIColor.lightGray, NSAttributedStringKey.font: Fonts.roboto(type: 1, fontSize: 17)])
133
+
134
+ self.lastnameTextField.attributedPlaceholder = NSAttributedString(string: NSLocalizedString("Lastname", comment: ""),
135
+ attributes: [NSAttributedStringKey.foregroundColor: UIColor.lightGray, NSAttributedStringKey.font: Fonts.roboto(type: 1, fontSize: 17)])
136
+
137
+ self.cellphoneTextField.attributedPlaceholder = NSAttributedString(string: NSLocalizedString("Cellphone (optional)", comment: ""),
138
+ attributes: [NSAttributedStringKey.foregroundColor: UIColor.lightGray, NSAttributedStringKey.font: Fonts.roboto(type: 1, fontSize: 17)])
139
+
140
+ self.passwordTextField.attributedPlaceholder = NSAttributedString(string: NSLocalizedString("Password", comment: ""),
141
+ attributes: [NSAttributedStringKey.foregroundColor: UIColor.lightGray, NSAttributedStringKey.font: Fonts.roboto(type: 1, fontSize: 17)])
142
+
143
+ self.confirmPasswordTextField.attributedPlaceholder = NSAttributedString(string: NSLocalizedString("Confirm password", comment: ""),
144
+ attributes: [NSAttributedStringKey.foregroundColor: UIColor.lightGray, NSAttributedStringKey.font: Fonts.roboto(type: 1, fontSize: 17)])
145
+
146
+
147
+ }
148
+
149
+ private func configureViews(){
150
+ self.pastelView = PastelView(frame: self.tableView.bounds)
151
+
152
+ // Custom Direction
153
+ pastelView.startPastelPoint = .bottomLeft
154
+ pastelView.endPastelPoint = .topRight
155
+
156
+ // Custom Duration
157
+ pastelView.animationDuration = 3.0
158
+
159
+ // Custom Color
160
+ pastelView.setColors([Colors.firstGradientColor, Colors.textColor, Colors.secondGradientColor, Colors.thirdGradientColor])
161
+
162
+ self.tableView.backgroundView = pastelView
163
+
164
+ }
165
+
166
+ private func validateForm() -> Bool {
167
+
168
+ if let password = self.passwordTextField.text, let confirmPassword = self.confirmPasswordTextField.text {
169
+ if password != confirmPassword {
170
+ APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Passwords don't match", comment: ""), and: "")
171
+ return false
172
+ }
173
+ }
174
+ if let name = self.nameTextField.text, name.isEmpty {
175
+ APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Check the entered data", comment: ""), and: "")
176
+ return false
177
+ }
178
+ if let lastname = self.lastnameTextField.text, lastname.isEmpty {
179
+ APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Check the entered data", comment: ""), and: "")
180
+ return false
181
+ }
182
+ if let email = self.emailTextField.text{
183
+ if !isValidEmail(email.trimmingCharacters(in: .whitespacesAndNewlines)) {
184
+ APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Invalid email", comment: ""), and: "")
185
+ return false
186
+ }
187
+ }
188
+ if !termsAndConditionsAccepted{
189
+ APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Check the entered data", comment: ""), and: NSLocalizedString("You have to accept terms & conditions", comment: ""))
190
+ return false
191
+ }
192
+ return true
193
+ }
194
+
195
+ private func isValidEmail(_ testStr:String) -> Bool {
196
+ let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
197
+ let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
198
+ return emailTest.evaluate(with: testStr)
199
+ }
200
+
201
+ private func isValidName(_ testStr:String) -> Bool {
202
+ let nameRegEx = "[A-Za-z\\s]+"
203
+ let nameTest = NSPredicate(format:"SELF MATCHES %@", nameRegEx)
204
+ return nameTest.evaluate(with: testStr)
205
+ }
206
+
207
+ private func isValidPhone(_ testStr:String) -> Bool {
208
+ let phoneRegEx = "[0-9]*"
209
+ let phoneTest = NSPredicate(format:"SELF MATCHES %@", phoneRegEx)
210
+ return phoneTest.evaluate(with: testStr)
211
+ }
212
+
213
+ }