mvcgen 0.1.14 → 0.1.18

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,51 @@
1
+ //
2
+ // NotificationCell.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
+
11
+ class NotificationCell: UITableViewCell {
12
+
13
+ @IBOutlet weak var notificationImage: UIImageView!{
14
+ didSet{
15
+ self.notificationImage.layoutIfNeeded()
16
+ self.notificationImage.layer.cornerRadius = self.notificationImage.frame.height/2
17
+ self.notificationImage.layer.masksToBounds = true
18
+ self.notificationImage.layer.borderColor = UIColor(red: 155/255, green: 155/255, blue: 155/255, alpha: 1.0).cgColor
19
+ self.notificationImage.layer.borderWidth = 0.5
20
+ }
21
+ }
22
+ @IBOutlet weak var notificationText: UILabel!
23
+ @IBOutlet weak var notificationDate: UILabel!
24
+ @IBOutlet weak var newNotificationView: UIView!{
25
+ didSet{
26
+ self.newNotificationView.layer.shadowColor = UIColor.black.cgColor
27
+ self.newNotificationView.layer.shadowOffset = CGSize(width: 0.0, height: 2.0)
28
+ self.newNotificationView.layer.shadowRadius = 1.0
29
+ self.newNotificationView.layer.shadowOpacity = 0.5
30
+ self.newNotificationView.layer.masksToBounds = false
31
+ self.newNotificationView.layer.cornerRadius = self.newNotificationView.frame.height/2
32
+ }
33
+ }
34
+
35
+ override func awakeFromNib() {
36
+ super.awakeFromNib()
37
+ // Initialization code
38
+
39
+ self.newNotificationView.isHidden = true
40
+
41
+ }
42
+
43
+ override func prepareForReuse() {
44
+ super.prepareForReuse()
45
+
46
+ self.notificationImage.image = UIImage(named: "notificaciones")
47
+
48
+ self.newNotificationView.isHidden = true
49
+ }
50
+
51
+ }
@@ -0,0 +1,164 @@
1
+ //
2
+ // NotificationsVC.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 SwiftDate
11
+ import Kingfisher
12
+ import PMAlertController
13
+
14
+ class NotificationsVC: UIViewController, UITableViewDelegate, UITableViewDataSource{
15
+
16
+ // MARK: - Outlets
17
+
18
+ @IBOutlet var gradientView: UIView!
19
+
20
+ @IBOutlet weak var tableView: UITableView!
21
+
22
+ @IBOutlet weak var backButton: UIButton!
23
+
24
+ // MARK: - Properties
25
+
26
+ let homeStoryboard = UIStoryboard(name: "Home", bundle: Bundle.main)
27
+
28
+ var notifications = [Notif]()
29
+
30
+ var selectedNotification: Notif?
31
+
32
+ var delegate: NotificationReadProtocol?
33
+
34
+ override func viewDidLoad() {
35
+ super.viewDidLoad()
36
+
37
+ setup()
38
+
39
+ }
40
+
41
+ override func viewWillAppear(_ animated: Bool) {
42
+ super.viewWillAppear(true)
43
+
44
+ self.navigationController?.navigationBar.isHidden = true
45
+ self.tableView.isUserInteractionEnabled = true
46
+
47
+ self.tableView.reloadData()
48
+ }
49
+
50
+ override func viewDidLayoutSubviews() {
51
+ super.viewDidLayoutSubviews()
52
+
53
+ self.gradientView.applyGradient(withColours: [Colors.firstGradientColor, Colors.thirdGradientColor], locations: [0, 0.5])
54
+ }
55
+
56
+ private func setup() {
57
+
58
+ self.tableView.rowHeight = UITableViewAutomaticDimension
59
+
60
+ let origImage = UIImage(named: "Back")
61
+ let tintedImage = origImage?.withRenderingMode(.alwaysTemplate)
62
+ self.backButton.setImage(tintedImage, for: .normal)
63
+ self.backButton.tintColor = UIColor(red: 107.0/255.0, green: 255.0/255.0, blue: 192.0/255.0, alpha: 1)
64
+ }
65
+
66
+
67
+
68
+ @IBAction func backTapped(_ sender: UIButton) {
69
+ self.navigationController?.popViewController(animated: true)
70
+ }
71
+ override func viewWillDisappear(_ animated: Bool) {
72
+ super.viewWillDisappear(animated)
73
+
74
+ if self.isMovingFromParentViewController{
75
+ delegate?.setAsRead(value: true)
76
+ }
77
+ }
78
+
79
+ // MARK: - Table view
80
+
81
+ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
82
+ return notifications.count
83
+ }
84
+
85
+ func numberOfSections(in tableView: UITableView) -> Int {
86
+ if notifications.count > 0 {
87
+ self.hideNoNotificationsView()
88
+ return 1
89
+ }
90
+ self.setNoNotificationsView()
91
+ return 0
92
+
93
+ }
94
+
95
+ func setNoNotificationsView(){
96
+ let emptyTableLabelViewNib = UINib(nibName: "NoNotificationsView", bundle: nil)
97
+ let emptyTableLabelView = emptyTableLabelViewNib.instantiate(withOwner: nil, options: nil)[0] as! NoNotificationView
98
+ emptyTableLabelView.tag = 100
99
+ self.tableView.separatorStyle = .none
100
+ self.tableView.backgroundView = emptyTableLabelView
101
+ }
102
+
103
+ func hideNoNotificationsView(){
104
+ self.tableView.separatorStyle = .singleLine
105
+ if let viewWithTag = self.tableView.viewWithTag(100) {
106
+ viewWithTag.isHidden = true
107
+ }
108
+ }
109
+
110
+ func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
111
+
112
+ let cell = tableView.dequeueReusableCell(withIdentifier: "NotificationCell", for: indexPath) as! NotificationCell
113
+
114
+ let notification = self.notifications[indexPath.row]
115
+
116
+ cell.notificationText.text = notification.body
117
+
118
+ if !notification.read{
119
+ cell.newNotificationView.isHidden = false
120
+ }
121
+
122
+ let region = Region.Local()
123
+ let dateB = DateInRegion(absoluteDate: notification.createdDate as Date, in: region)
124
+ let (colloquial, _) = try! dateB.colloquialSinceNow()
125
+ cell.notificationDate.text = colloquial
126
+ switch notification.notifType{
127
+ case .broadcast:
128
+ break
129
+ case .generic:
130
+ break
131
+ default:
132
+ break
133
+ }
134
+ return cell
135
+ }
136
+
137
+ func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
138
+ self.tableView.isUserInteractionEnabled = false
139
+
140
+ let selectedNotif = self.notifications[indexPath.row]
141
+
142
+ self.selectedNotification = selectedNotif
143
+
144
+ switch selectedNotif.notifType {
145
+ case .broadcast:
146
+ self.tableView.isUserInteractionEnabled = true
147
+ break
148
+ case .generic:
149
+ self.tableView.isUserInteractionEnabled = true
150
+ //Perform segue to detail
151
+ break
152
+ default:
153
+ self.tableView.isUserInteractionEnabled = true
154
+ break
155
+ }
156
+ }
157
+
158
+ }
159
+
160
+ protocol NotificationReadProtocol {
161
+ func setAsRead(value: Bool)
162
+ }
163
+
164
+
@@ -0,0 +1,98 @@
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 UIKit
10
+
11
+ class ForgetPasswordTVC: UITableViewController, UITextFieldDelegate {
12
+
13
+ @IBOutlet weak var backgroundGradientView: UIView!
14
+
15
+ @IBOutlet weak var sendLinkButton: LoadingButton!
16
+
17
+ @IBOutlet weak var emailTextField: UnderlinedWithIconTextField!
18
+
19
+ @IBOutlet weak var instructionsLabel: UILabel!
20
+
21
+ override func viewDidLoad() {
22
+ super.viewDidLoad()
23
+
24
+ setupViews()
25
+
26
+ hideKeyboardWhenTappedAround()
27
+ }
28
+
29
+ func setupViews() {
30
+ self.sendLinkButton.layoutIfNeeded()
31
+ self.sendLinkButton.layer.cornerRadius = self.sendLinkButton.frame.height/7
32
+ self.sendLinkButton.layer.masksToBounds = true
33
+ self.sendLinkButton.activityIndicatorColor = UIColor.white
34
+
35
+ self.emailTextField.underlined(color: UIColor.white, width: 1.0)
36
+ self.emailTextField.addLeftIcon("envelope")
37
+
38
+ self.instructionsLabel.addCharacterSpacing(space: 0.9)
39
+ self.instructionsLabel.addLineSpacing(lineHeightMultiple: 1.4)
40
+ self.instructionsLabel.textAlignment = NSTextAlignment.center
41
+
42
+ self.emailTextField.delegate = self
43
+ }
44
+
45
+ override func viewDidLayoutSubviews() {
46
+ super.viewDidLayoutSubviews()
47
+ self.backgroundGradientView.applyGradient(withColours: [ColorConstants.fromGradient, ColorConstants.fromGradient, ColorConstants.toGradient], locations: [0, 0.2, 0.98])
48
+ }
49
+
50
+ func textFieldShouldReturn(_ textField: UITextField) -> Bool {
51
+
52
+ if textField.tag == 0 {
53
+ textField.resignFirstResponder()
54
+ forgetPasswordTapped()
55
+ return true
56
+ }
57
+
58
+ let nextTage = textField.tag+1
59
+
60
+ // Try to find next responder
61
+ guard let nextResponder = textField.superview?.superview?.superview?.viewWithTag(nextTage) as UIResponder? else {
62
+ textField.resignFirstResponder()
63
+ return false
64
+ }
65
+
66
+ nextResponder.becomeFirstResponder()
67
+
68
+ return false // We do not want UITextField to insert line-breaks.
69
+ }
70
+
71
+ private func isValidEmail(_ testStr:String) -> Bool {
72
+ let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
73
+ let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
74
+ return emailTest.evaluate(with: testStr)
75
+ }
76
+
77
+ @IBAction func sendLinkTapped(_ sender: LoadingButton) {
78
+ forgetPasswordTapped()
79
+ }
80
+
81
+ private func forgetPasswordTapped(){
82
+ if let email = self.emailTextField.text, isValidEmail(email){
83
+ self.sendLinkButton.showLoading()
84
+ RemoteUserRepository.sharedInstance.forgetPassword(email: email) { result in
85
+ self.sendLinkButton.hideLoading()
86
+ if result == .success{
87
+ APIHelper.sharedInstance.showSuccesMessage(with: NSLocalizedString("Email sent!", comment: ""), and: "")
88
+ }
89
+ }
90
+ } else {
91
+ APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Invalid email", comment: ""), and: "")
92
+ }
93
+ }
94
+
95
+ @IBAction func handleCloseButton(_ sender: UIButton) {
96
+ dismiss(animated: true, completion: nil)
97
+ }
98
+ }
@@ -0,0 +1,245 @@
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
+ }
245
+