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
@@ -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
+