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,93 @@
1
+ //
2
+ // AboutUsVC.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
+ // TODO: Temp picture struct
12
+ struct Pic{
13
+
14
+ var url = ""
15
+
16
+ init(url: String) {
17
+ self.url = url
18
+ }
19
+
20
+ }
21
+
22
+ class AboutUsVC: UIViewController, UITableViewDelegate, UITableViewDataSource{
23
+
24
+ // MARK: - Outlets
25
+
26
+ @IBOutlet var gradientView: UIView!
27
+
28
+ @IBOutlet weak var tableView: UITableView!
29
+
30
+ @IBOutlet weak var backButton: UIButton!
31
+
32
+ // MARK: - Properties
33
+
34
+ var pictures = [Pic]()
35
+
36
+
37
+ override func viewDidLoad() {
38
+ super.viewDidLoad()
39
+
40
+ setup()
41
+
42
+ // TODO: Add some pictures
43
+ self.pictures.append(Pic(url: "http://detoqueytoque.com/Fotos_Web_new/Home/grupo%20en%20TLG.jpg"))
44
+ }
45
+
46
+ override func viewWillAppear(_ animated: Bool) {
47
+ super.viewWillAppear(true)
48
+ self.navigationController?.navigationBar.isHidden = true
49
+ self.navigationController?.navigationItem.hidesBackButton = true
50
+
51
+ }
52
+ private func setup() {
53
+
54
+ self.gradientView.applyGradient(withColours: [Colors.firstGradientColor, Colors.thirdGradientColor], locations: [0, 0.5])
55
+
56
+ self.tableView.rowHeight = UITableViewAutomaticDimension
57
+
58
+ let origImage = UIImage(named: "Back")
59
+ let tintedImage = origImage?.withRenderingMode(.alwaysTemplate)
60
+ self.backButton.setImage(tintedImage, for: .normal)
61
+ self.backButton.tintColor = UIColor(red: 107.0/255.0, green: 255.0/255.0, blue: 192.0/255.0, alpha: 1)
62
+ }
63
+
64
+ @IBAction func backTapped(_ sender: UIButton) {
65
+ self.navigationController?.popViewController(animated: true)
66
+ }
67
+
68
+ // MARK: - Table view
69
+
70
+ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
71
+ return 1
72
+ }
73
+
74
+ func numberOfSections(in tableView: UITableView) -> Int {
75
+ return 2
76
+ }
77
+
78
+ func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
79
+ switch indexPath.section{
80
+ case 0:
81
+ let cell = tableView.dequeueReusableCell(withIdentifier: "aboutUsImageCell", for: indexPath) as! AboutUsImageCell
82
+ cell.pictures = self.pictures
83
+ cell.pageControl.numberOfPages = self.pictures.count
84
+ return cell
85
+ default:
86
+ let cell = tableView.dequeueReusableCell(withIdentifier: "descriptionCell", for: indexPath) as! DescriptionCell
87
+ // TODO: Add description
88
+ cell.descriptionTextView.text = "About us description"
89
+ return cell
90
+ }
91
+ }
92
+ }
93
+
@@ -0,0 +1,66 @@
1
+ //
2
+ // AboutUsImageCell.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 Kingfisher
11
+
12
+ class AboutUsImageCell: UITableViewCell {
13
+
14
+ @IBOutlet weak var collectionView: UICollectionView!
15
+ @IBOutlet weak var pageControl: UIPageControl!
16
+ var pictures : [Pic] = []
17
+
18
+ var thisWidth:CGFloat = 0
19
+
20
+
21
+ override func awakeFromNib() {
22
+ super.awakeFromNib()
23
+ self.collectionView.dataSource = self
24
+ self.collectionView.delegate = self
25
+
26
+ self.pageControl.hidesForSinglePage = true
27
+ self.pageControl.numberOfPages = self.pictures.count
28
+ // Initialization code
29
+ }
30
+
31
+ override func setSelected(_ selected: Bool, animated: Bool) {
32
+ super.setSelected(selected, animated: animated)
33
+
34
+ // Configure the view for the selected state
35
+ }
36
+
37
+ }
38
+ extension AboutUsImageCell : UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout{
39
+ func numberOfSections(in collectionView: UICollectionView) -> Int {
40
+ return self.pictures.count
41
+ }
42
+
43
+ func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
44
+ return 1
45
+ }
46
+
47
+ func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
48
+
49
+ let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "imagesCollectionViewCell", for: indexPath) as! ImagesCollectionViewCell
50
+ let picture = pictures[indexPath.section]
51
+ cell.imageOutlet.kf.indicatorType = .activity
52
+ cell.imageOutlet.kf.setImage(with: URL(string : picture.url))
53
+ return cell
54
+
55
+ }
56
+
57
+ func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
58
+ self.pageControl.currentPage = indexPath.section
59
+ }
60
+
61
+ func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
62
+ thisWidth = self.collectionView.frame.width
63
+ return CGSize(width: thisWidth, height: self.collectionView.frame.height)
64
+ }
65
+
66
+ }
@@ -0,0 +1,16 @@
1
+ //
2
+ // DescriptionCell.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 DescriptionCell: UITableViewCell {
12
+
13
+ @IBOutlet weak var descriptionTextView: UITextView!
14
+
15
+ }
16
+
@@ -0,0 +1,35 @@
1
+ //
2
+ // DestinationCell.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 DestinationCell: UICollectionViewCell {
12
+
13
+ @IBOutlet weak var destinationBackgroundImage: UIImageView!
14
+
15
+ @IBOutlet weak var destinationLabel: UILabel!
16
+
17
+ @IBOutlet weak var blueGradientView: UIView!
18
+
19
+ @IBOutlet weak var tickImage: UIImageView!
20
+
21
+ override func awakeFromNib() {
22
+ super.awakeFromNib()
23
+ // Initialization code
24
+ self.blueGradientView.applyGradient(withColours: [Colors.firstGradientColor, UIColor.clear], alpha: 0.8, angle: 90)
25
+ }
26
+
27
+ override var isSelected: Bool {
28
+ didSet {
29
+ self.layer.borderWidth = 1.0
30
+ self.layer.borderColor = isSelected ? Colors.firstGradientColor.cgColor : UIColor.clear.cgColor
31
+ self.blueGradientView.backgroundColor = isSelected ? Colors.thirdGradientColor : UIColor.clear
32
+ self.tickImage.image = isSelected ? UIImage(named: "Tick") : nil
33
+ }
34
+ }
35
+ }
@@ -0,0 +1,84 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
3
+ <device id="retina4_7" orientation="portrait">
4
+ <adaptation id="fullscreen"/>
5
+ </device>
6
+ <dependencies>
7
+ <deployment identifier="iOS"/>
8
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
9
+ <capability name="Safe area layout guides" minToolsVersion="9.0"/>
10
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
11
+ </dependencies>
12
+ <customFonts key="customFonts">
13
+ <array key="Quicksand-Light.ttf">
14
+ <string>Quicksand-Light</string>
15
+ </array>
16
+ </customFonts>
17
+ <objects>
18
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="FilterTravelGroupsVC" customModule="NT_Dev" customModuleProvider="target"/>
19
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
20
+ <view clipsSubviews="YES" contentMode="scaleAspectFill" restorationIdentifier="DestinationCellView" id="iN0-l3-epB" customClass="DestinationCell" customModule="NT_Dev" customModuleProvider="target">
21
+ <rect key="frame" x="0.0" y="0.0" width="375" height="150"/>
22
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
23
+ <subviews>
24
+ <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="egypt_color" translatesAutoresizingMaskIntoConstraints="NO" id="ZIW-cb-MdB">
25
+ <rect key="frame" x="0.0" y="0.0" width="375" height="150"/>
26
+ </imageView>
27
+ <view clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="T6C-j1-5G0">
28
+ <rect key="frame" x="0.0" y="0.0" width="375" height="150"/>
29
+ <subviews>
30
+ <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="DUZ-yF-H2J">
31
+ <rect key="frame" x="157" y="45" width="60" height="60"/>
32
+ <constraints>
33
+ <constraint firstAttribute="height" constant="60" id="ImN-yp-2bS"/>
34
+ <constraint firstAttribute="width" constant="60" id="vBT-aO-c3d"/>
35
+ </constraints>
36
+ </imageView>
37
+ </subviews>
38
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
39
+ <constraints>
40
+ <constraint firstItem="DUZ-yF-H2J" firstAttribute="centerY" secondItem="T6C-j1-5G0" secondAttribute="centerY" id="5XI-WP-f5H"/>
41
+ <constraint firstItem="DUZ-yF-H2J" firstAttribute="centerX" secondItem="T6C-j1-5G0" secondAttribute="centerX" id="cIr-3l-AB4"/>
42
+ </constraints>
43
+ </view>
44
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="center" horizontalHuggingPriority="249" verticalHuggingPriority="248" text="Egipto" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" adjustsFontForContentSizeCategory="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cmq-b1-dok" customClass="BottomAlignedLabel" customModule="NT_Dev" customModuleProvider="target">
45
+ <rect key="frame" x="20" y="59" width="335" height="32.5"/>
46
+ <fontDescription key="fontDescription" name="Quicksand-Light" family="Quicksand" pointSize="26"/>
47
+ <color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
48
+ <nil key="highlightedColor"/>
49
+ </label>
50
+ </subviews>
51
+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
52
+ <constraints>
53
+ <constraint firstItem="cmq-b1-dok" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="20" id="DWl-x3-DSL"/>
54
+ <constraint firstItem="cmq-b1-dok" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="J54-jr-Ciz"/>
55
+ <constraint firstItem="ZIW-cb-MdB" firstAttribute="top" secondItem="vUN-kp-3ea" secondAttribute="top" id="N89-SN-5g0"/>
56
+ <constraint firstItem="vUN-kp-3ea" firstAttribute="bottom" secondItem="ZIW-cb-MdB" secondAttribute="bottom" id="QHQ-By-FPQ"/>
57
+ <constraint firstItem="vUN-kp-3ea" firstAttribute="bottom" secondItem="T6C-j1-5G0" secondAttribute="bottom" id="Tqy-qe-vOv"/>
58
+ <constraint firstItem="ZIW-cb-MdB" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" id="YQi-Wi-Fxf"/>
59
+ <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="ZIW-cb-MdB" secondAttribute="trailing" id="g4G-Av-AB8"/>
60
+ <constraint firstItem="T6C-j1-5G0" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" id="gJN-3H-ddk"/>
61
+ <constraint firstItem="T6C-j1-5G0" firstAttribute="top" secondItem="vUN-kp-3ea" secondAttribute="top" id="jZF-Mk-OHL"/>
62
+ <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="cmq-b1-dok" secondAttribute="trailing" constant="20" id="oZS-k2-cNC"/>
63
+ <constraint firstItem="vUN-kp-3ea" firstAttribute="trailing" secondItem="T6C-j1-5G0" secondAttribute="trailing" id="wLo-sS-qFc"/>
64
+ </constraints>
65
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
66
+ <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
67
+ <userDefinedRuntimeAttributes>
68
+ <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
69
+ <integer key="value" value="5"/>
70
+ </userDefinedRuntimeAttribute>
71
+ </userDefinedRuntimeAttributes>
72
+ <connections>
73
+ <outlet property="blueGradientView" destination="T6C-j1-5G0" id="B8q-Bn-4iB"/>
74
+ <outlet property="destinationBackgroundImage" destination="ZIW-cb-MdB" id="uEs-ch-6kk"/>
75
+ <outlet property="destinationLabel" destination="cmq-b1-dok" id="2Y8-v2-0FB"/>
76
+ <outlet property="tickImage" destination="DUZ-yF-H2J" id="9Jz-YO-bco"/>
77
+ </connections>
78
+ <point key="canvasLocation" x="33.5" y="-208"/>
79
+ </view>
80
+ </objects>
81
+ <resources>
82
+ <image name="egypt_color" width="1280" height="823"/>
83
+ </resources>
84
+ </document>
@@ -0,0 +1,24 @@
1
+ //
2
+ // FavoriteCollectionCell.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 FavoriteCollectionCell: UICollectionViewCell {
12
+
13
+ @IBOutlet weak var favoriteBackgroundView: UIView! {
14
+ didSet {
15
+ favoriteBackgroundView.layer.cornerRadius = favoriteBackgroundView.frame.size.height/2
16
+ favoriteBackgroundView.layer.masksToBounds = true
17
+ }
18
+ }
19
+
20
+ @IBOutlet weak var destinationLabel: UILabel!
21
+
22
+ @IBOutlet weak var removeButton: UIButton!
23
+
24
+ }
@@ -0,0 +1,15 @@
1
+ //
2
+ // ImagesCollectionViewCell.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 ImagesCollectionViewCell: UICollectionViewCell {
12
+ @IBOutlet weak var imageOutlet: UIImageView!
13
+
14
+ }
15
+
@@ -0,0 +1,72 @@
1
+ //
2
+ // ProfileContainerVC.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 ProfileContainerVC: UIViewController {
12
+
13
+ @IBOutlet weak var gradientView: UIView!
14
+
15
+ @IBOutlet weak var containerView: UIView!
16
+
17
+ let homeStoryboard = UIStoryboard(name: "Home", bundle: Bundle.main)
18
+
19
+ override func viewDidLoad() {
20
+ super.viewDidLoad()
21
+
22
+ setupNavigationBar()
23
+
24
+ self.add(asChildViewController: self.profileTVC)
25
+ }
26
+ override func viewDidLayoutSubviews() {
27
+ super.viewDidLayoutSubviews()
28
+
29
+ // self.gradientView.backgroundColor = ColorConstants.backgroundColor
30
+
31
+ self.gradientView.applyGradient(withColours: [Colors.firstGradientColor, Colors.thirdGradientColor], locations: [0, 0.5])
32
+
33
+ }
34
+
35
+ func setupNavigationBar() {
36
+ self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
37
+ self.navigationController?.navigationBar.shadowImage = UIImage()
38
+ self.navigationController?.navigationBar.isTranslucent = true
39
+ self.navigationController?.view.backgroundColor = UIColor.clear
40
+
41
+ }
42
+
43
+ private lazy var profileTVC: ProfileTVC = {
44
+
45
+ return self.homeStoryboard.instantiateViewController(withIdentifier: "ProfileTVC") as! ProfileTVC
46
+
47
+ }()
48
+
49
+ private func add(asChildViewController viewController: UIViewController) {
50
+ addChildViewController(viewController)
51
+
52
+ containerView.addSubview(viewController.view)
53
+
54
+ // Configure Child View
55
+ viewController.view.frame = containerView.bounds
56
+ viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
57
+
58
+ // Notify Child View Controller
59
+ viewController.didMove(toParentViewController: self)
60
+ }
61
+
62
+ private func remove(asChildViewController viewController: UIViewController) {
63
+ // Notify Child View Controller
64
+ viewController.willMove(toParentViewController: nil)
65
+
66
+ viewController.view.removeFromSuperview()
67
+
68
+ // Notify Child View Controller
69
+ viewController.removeFromParentViewController()
70
+ }
71
+
72
+ }
@@ -0,0 +1,581 @@
1
+ //
2
+ // ProfileVC.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 AVFoundation
11
+ import MobileCoreServices
12
+ import DKImagePickerController
13
+ import ActionSheetPicker_3_0
14
+ import Kingfisher
15
+ import NVActivityIndicatorView
16
+
17
+ struct Favorite {
18
+ var name: String = ""
19
+ }
20
+
21
+ struct UserHistory{
22
+ var name: String = ""
23
+ var thumbnailUrl: String = ""
24
+ }
25
+
26
+ class ProfileTVC: UITableViewController, UITextFieldDelegate, NotificationReadProtocol, UITextViewDelegate {
27
+
28
+
29
+ // MARK: - Outlets
30
+
31
+ @IBOutlet weak var editProfileImageButton: UIButton! {
32
+ didSet {
33
+ editProfileImageButton.imageView?.contentMode = .scaleAspectFit
34
+ editProfileImageButton.layer.cornerRadius = editProfileImageButton.frame.size.height/2
35
+ editProfileImageButton.layer.masksToBounds = true
36
+ }
37
+ }
38
+
39
+ @IBOutlet weak var editProfileImageView: UIImageView! {
40
+ didSet {
41
+ editProfileImageView.layer.cornerRadius = editProfileImageView.frame.size.height/2
42
+ editProfileImageView.layer.masksToBounds = true
43
+ editProfileImageView.layer.borderWidth = 1.0
44
+ editProfileImageView.layer.borderColor = UIColor.white.cgColor
45
+ }
46
+ }
47
+
48
+ @IBOutlet weak var profileImageLoading: NVActivityIndicatorView!
49
+
50
+ @IBOutlet weak var phonePrefix: UILabel!
51
+
52
+ @IBOutlet weak var phoneFlagImage: UIImageView!
53
+
54
+ @IBOutlet weak var phoneFlagLabel: UILabel!
55
+
56
+ @IBOutlet weak var nameTextField: UnderlinedWithIconTextField!
57
+
58
+ @IBOutlet weak var lastnameTextField: UnderlinedWithIconTextField!
59
+
60
+ @IBOutlet weak var emailTextField: UnderlinedWithIconTextField!
61
+
62
+ @IBOutlet weak var phoneTextField: UnderlinedWithIconTextField!
63
+
64
+ @IBOutlet weak var aboutMeTextView: UnderlinedTextView!
65
+
66
+ @IBOutlet weak var favoritesCollectionView: UICollectionView!
67
+
68
+ @IBOutlet weak var historyTripsCollectionView: UICollectionView!
69
+
70
+ @IBOutlet weak var saveChangesButton: LoadingButton!
71
+
72
+ @IBOutlet weak var logoutButton: LoadingButton!
73
+
74
+ @IBOutlet weak var noFavoritesView: UIView!{
75
+ didSet {
76
+ noFavoritesView.layer.cornerRadius = noFavoritesView.frame.size.height/2
77
+ noFavoritesView.layer.masksToBounds = true
78
+ }
79
+ }
80
+ @IBOutlet weak var noTravelsView: UIView!
81
+
82
+ @IBOutlet weak var notificationImage: UIImageView!
83
+
84
+ @IBOutlet weak var notificationButton: UIButton!{
85
+ didSet{
86
+ notificationButton.layer.shadowColor = UIColor.black.cgColor
87
+ notificationButton.layer.shadowOffset = CGSize(width: 0.0, height: 2.0)
88
+ notificationButton.layer.masksToBounds = false
89
+ notificationButton.layer.shadowRadius = 1.0
90
+ notificationButton.layer.shadowOpacity = 0.5
91
+ notificationButton.layer.cornerRadius = notificationButton.frame.width / 2
92
+ }
93
+ }
94
+
95
+ @IBOutlet weak var noTravelsMessageView: UIView!{
96
+ didSet{
97
+ noTravelsMessageView.layer.borderWidth = 1.0
98
+ noTravelsMessageView.layer.borderColor = UIColor.white.cgColor
99
+ }
100
+ }
101
+
102
+ @IBOutlet weak var notificationsTapView: UIView!
103
+
104
+ @IBOutlet weak var notificationBadgeView: UIView!{
105
+ didSet{
106
+ self.notificationBadgeView.layer.shadowColor = UIColor.black.cgColor
107
+ self.notificationBadgeView.layer.shadowOffset = CGSize(width: 0.0, height: 2.0)
108
+ self.notificationBadgeView.layer.shadowRadius = 1.0
109
+ self.notificationBadgeView.layer.shadowOpacity = 0.5
110
+ self.notificationBadgeView.layer.masksToBounds = false
111
+ self.notificationBadgeView.layer.cornerRadius = self.notificationBadgeView.frame.height/2
112
+ self.notificationBadgeView.layer.borderColor = UIColor.white.cgColor
113
+ self.notificationBadgeView.layer.borderWidth = 0.5
114
+ }
115
+ }
116
+ @IBOutlet weak var notificationBadgeCountLabel: UILabel!
117
+
118
+ // MARK: - Properties
119
+
120
+ let homeStoryboard = UIStoryboard(name: "Home", bundle: Bundle.main)
121
+
122
+ var profileImageChanged: Bool = false
123
+
124
+ var favorites: [Favorite] = []{
125
+ didSet{
126
+ if self.favorites.count > 0{
127
+ self.noFavoritesView.isHidden = true
128
+ self.favoritesCollectionView.isHidden = false
129
+ } else {
130
+ self.noFavoritesView.isHidden = false
131
+ self.favoritesCollectionView.isHidden = true
132
+ }
133
+ }
134
+ }
135
+
136
+ var noMoreFavorites: [Favorite] = []
137
+
138
+ var userHistory: [UserHistory] = []{
139
+ didSet{
140
+ if self.userHistory.count > 0{
141
+ self.noTravelsView.isHidden = true
142
+ self.historyTripsCollectionView.isHidden = false
143
+ } else {
144
+ self.noTravelsView.isHidden = false
145
+ self.historyTripsCollectionView.isHidden = true
146
+ }
147
+ }
148
+ }
149
+
150
+ private var countries = [Country]()
151
+
152
+ var user: User?
153
+
154
+ var phoneCountry = ""
155
+
156
+ var newNotifications = false{
157
+ didSet{
158
+ if newNotifications{
159
+ self.notificationBadgeView.isHidden = false
160
+ } else {
161
+ self.notificationBadgeView.isHidden = true
162
+ }
163
+ }
164
+ }
165
+
166
+ var notifications = [Notif]()
167
+
168
+ override func viewDidLoad() {
169
+ super.viewDidLoad()
170
+ self.fetchData()
171
+ self.setupViews()
172
+
173
+ if #available(iOS 11.0, *) {
174
+ self.tableView.contentInsetAdjustmentBehavior = .never
175
+ }
176
+
177
+ let tap = UITapGestureRecognizer(target: self, action: #selector(self.handleNotificationTap(_:)))
178
+
179
+ self.notificationsTapView.addGestureRecognizer(tap)
180
+
181
+ aboutMeTextView.delegate = self
182
+
183
+ hideKeyboardWhenTappedAround()
184
+
185
+ NotificationCenter.default.addObserver(self, selector: #selector(handleFavoritesUpdated(_:)), name: Notification.Name("FavoritesUpdated"), object: nil)
186
+
187
+
188
+ }
189
+
190
+
191
+ override func viewWillAppear(_ animated: Bool) {
192
+ super.viewWillAppear(true)
193
+ //self.updateFavourites()
194
+ self.navigationController?.navigationBar.isHidden = false
195
+ self.navigationItem.hidesBackButton = true
196
+
197
+ setNotificationBadge()
198
+
199
+ }
200
+
201
+ func setNotificationBadge(){
202
+ // TODO: enable when done
203
+ // APIManager.sharedInstance.getNotifications(){
204
+ // result, notifications in
205
+ // self.notifications = notifications.sorted(by: {$0.createdDate.compare($1.createdDate) == .orderedDescending})
206
+ // let unreadNotif = notifications.filter({!$0.read})
207
+ // if unreadNotif.count == 0{
208
+ // self.notificationBadgeView.isHidden = true
209
+ // } else {
210
+ // self.notificationBadgeView.isHidden = false
211
+ // if unreadNotif.count <= 99{
212
+ // self.notificationBadgeCountLabel.text = "\(unreadNotif.count)"
213
+ // } else {
214
+ // self.notificationBadgeCountLabel.text = "99+"
215
+ // }
216
+ // }
217
+ // }
218
+ }
219
+
220
+
221
+ func fetchData() {
222
+ self.profileImageLoading.startAnimating()
223
+
224
+ self.emailTextField.text = "John"
225
+ self.nameTextField.text = "Doe"
226
+ self.lastnameTextField.text = "johndoe@test.com"
227
+ self.phoneFlagLabel.text = "🇺🇾"
228
+ self.phoneCountry = "Uruguay"
229
+ self.phonePrefix.text = "+598"
230
+
231
+ self.aboutMeTextView.text = NSLocalizedString("Add something about yourself!", comment: "")
232
+ self.aboutMeTextView.textColor = UIColor.lightGray
233
+
234
+ self.profileImageLoading.stopAnimating()
235
+ self.editProfileImageView.image = Asset.userTestPhoto.image
236
+
237
+ // TODO: Add favorites and history
238
+
239
+ }
240
+
241
+ func setupViews() {
242
+
243
+ self.notificationImage.image = UIImage(named: "notification")
244
+
245
+ self.logoutButton.layoutIfNeeded()
246
+ self.logoutButton.layer.cornerRadius = self.logoutButton.frame.height/7
247
+ self.logoutButton.layer.masksToBounds = true
248
+ self.logoutButton.layer.borderWidth = 1
249
+ self.logoutButton.layer.borderColor = UIColor.white.cgColor
250
+ self.logoutButton.activityIndicatorColor = UIColor.white
251
+
252
+ self.saveChangesButton.layoutIfNeeded()
253
+ self.saveChangesButton.layer.cornerRadius = self.saveChangesButton.frame.height/7
254
+ self.saveChangesButton.layer.masksToBounds = true
255
+ self.saveChangesButton.activityIndicatorColor = UIColor.white
256
+
257
+ self.nameTextField.underlined(color: UIColor.white, width: 1.0)
258
+ self.lastnameTextField.underlined(color: UIColor.white, width: 1.0)
259
+ self.emailTextField.underlined(color: UIColor.white, width: 1.0)
260
+ self.phoneTextField.underlined(color: UIColor.white, width: 1.0)
261
+
262
+ self.nameTextField.delegate = self
263
+ self.lastnameTextField.delegate = self
264
+ self.phoneTextField.delegate = self
265
+ self.emailTextField.delegate = self
266
+
267
+ favoritesCollectionView.delegate = self
268
+ favoritesCollectionView.dataSource = self
269
+
270
+ historyTripsCollectionView.delegate = self
271
+ historyTripsCollectionView.dataSource = self
272
+ historyTripsCollectionView.isMultipleTouchEnabled = false
273
+ historyTripsCollectionView.allowsSelection = false
274
+ let destNib = UINib(nibName: "DestinationCellView", bundle: nil)
275
+ historyTripsCollectionView.register(destNib, forCellWithReuseIdentifier: "DestinationCellView")
276
+
277
+ }
278
+
279
+ override func viewDidLayoutSubviews() {
280
+ super.viewDidLayoutSubviews()
281
+
282
+ self.aboutMeTextView.layoutIfNeeded()
283
+ self.aboutMeTextView.changeBorderColor(newColor: UIColor.white)
284
+ }
285
+
286
+ // MARK: - TextViewDelegate
287
+
288
+ func textViewDidBeginEditing(_ textView: UITextView) {
289
+ if textView.textColor == UIColor.lightGray {
290
+ textView.text = nil
291
+ textView.textColor = UIColor.white
292
+ }
293
+ }
294
+
295
+ func textViewDidEndEditing(_ textView: UITextView) {
296
+ if textView.text.isEmpty {
297
+ textView.text = NSLocalizedString("Add something about yourself!", comment: "")
298
+ textView.textColor = UIColor.lightGray
299
+ }
300
+ }
301
+
302
+ // MARK: - TextFieldDelegate
303
+
304
+ func textFieldShouldReturn(_ textField: UITextField) -> Bool {
305
+
306
+ let nextTage=textField.tag+1
307
+
308
+ // Try to find next responder
309
+ let nextResponder=textField.superview?.superview?.superview?.viewWithTag(nextTage) as UIResponder!
310
+
311
+ if (nextResponder != nil){
312
+ // Found next responder, so set it.
313
+ nextResponder?.becomeFirstResponder()
314
+ }
315
+ else
316
+ {
317
+ // Not found, so remove keyboard
318
+ textField.resignFirstResponder()
319
+ }
320
+ return false // We do not want UITextField to insert line-breaks.
321
+ }
322
+
323
+ override var prefersStatusBarHidden: Bool {
324
+ return navigationController?.isNavigationBarHidden ?? false
325
+ }
326
+
327
+ // MARK: - Actions
328
+
329
+ // function which is triggered when handleTap is called
330
+ @objc func handleNotificationTap(_ sender: UITapGestureRecognizer) {
331
+ self.animateViewBounceAndZoom(viewToAnimate: self.notificationButton)
332
+ guard let vc = self.homeStoryboard.instantiateViewController(withIdentifier: "NotificationsVC") as? NotificationsVC else { return }
333
+ vc.delegate = self
334
+ vc.notifications = self.notifications
335
+ self.navigationController?.pushViewController(vc, animated: true)
336
+ }
337
+
338
+ func setAsRead(value: Bool) {
339
+ // TODO: enable when done
340
+ // if value {
341
+ // APIManager.sharedInstance.readNotifications(){
342
+ // result in
343
+ // if result == .success {
344
+ // self.setNotificationBadge()
345
+ // }
346
+ // }
347
+ //
348
+ // }
349
+ }
350
+
351
+ @IBAction func handleEditProfileImageButton(_ sender: Any) {
352
+
353
+ let pickerController = DKImagePickerController()
354
+ pickerController.UIDelegate = CustomUIDelegate()
355
+ pickerController.assetType = .allPhotos
356
+ pickerController.singleSelect = true
357
+ pickerController.didSelectAssets = { (assets: [DKAsset]) in
358
+ for asset in assets {
359
+ //Gets a fullscreen image for the asset to show in the CollectionView
360
+ asset.fetchFullScreenImageWithCompleteBlock({ (image, info) in
361
+
362
+ self.profileImageChanged = true
363
+ self.editProfileImageView.image = image
364
+
365
+ })
366
+ }
367
+ }
368
+ self.present(pickerController, animated: true, completion: nil)
369
+ }
370
+
371
+ @IBAction func saveDataTapped(_ sender: UIButton) {
372
+ if self.validateData(){
373
+ // TODO
374
+
375
+ }
376
+ }
377
+
378
+ // func updateProfileImage(name:String,lastname:String,aboutMe:String,phoneCountry:String,phone:String){
379
+ // let filename = "profile.jpg"
380
+ //
381
+ // var localsFileToUpload = [Int:[String]]()
382
+ //
383
+ // if !FilesManager.sharedInstance.removeMedia(filename: filename) {
384
+ // print("Error deleting provider profile image file")
385
+ // }
386
+ // let keyPath = "users/\(self.user?.id ?? "")/profile.jpg"
387
+ //
388
+ //
389
+ // if FilesManager.sharedInstance.saveMedia(UIImageJPEGRepresentation(self.editProfileImageView.image!, 0.8)!, filename: filename) {
390
+ //
391
+ //
392
+ // let thumbnailKeyPath = "users/\(self.user?.id ?? "")/profile-thumbnail.jpg"
393
+ // let thumbnailFilename = "profile-thumbnail.jpg"
394
+ // let thumbnailImage = self.editProfileImageView.image?.resize(targetSize: CGSize(width: 200, height: 200))
395
+ //
396
+ // if !FilesManager.sharedInstance.removeMedia(filename: thumbnailFilename) {
397
+ // print("Error deleting provider profile thumbnail file")
398
+ // }
399
+ //
400
+ //
401
+ // if FilesManager.sharedInstance.saveMedia(UIImageJPEGRepresentation(thumbnailImage!, 0.8)!, filename: thumbnailFilename) {
402
+ //
403
+ // localsFileToUpload[0] = [thumbnailFilename, thumbnailKeyPath]
404
+ // localsFileToUpload[1] = [filename, keyPath]
405
+ //
406
+ // for file in localsFileToUpload{
407
+ // S3Manager.sharedInstance.uploadToS3(url: URL(fileURLWithPath: FilesManager.sharedInstance.fileInDocumentsDirectory(file.value[0])), name: file.value[1], completeBlock: { (success: Bool) -> Void in
408
+ // })
409
+ // }
410
+ //
411
+ // UserRepository.sharedInstance.updateLoggedUser(name: name, lastname: lastname, aboutMe: aboutMe, phoneCountry: phoneCountry, phone: phone, favorites: self.favorites, noMoreFavDest: noMoreFavorites, picture:keyPath, thumbnailPicture: thumbnailKeyPath) { result in
412
+ // if result == .success {
413
+ // self.noMoreFavorites.removeAll(keepingCapacity: false)
414
+ // APIHelper.sharedInstance.showSuccesMessage(with: NSLocalizedString("Saved!", comment: ""), and: NSLocalizedString("Your data has been updated.", comment: ""))
415
+ // } else {
416
+ // APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Save error.", comment: ""), and: NSLocalizedString("Please try again.", comment: ""))
417
+ // }
418
+ // }
419
+ // }
420
+ //
421
+ // }
422
+ // }
423
+
424
+ func isValidEmail(_ testStr:String) -> Bool {
425
+ let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
426
+ let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
427
+ return emailTest.evaluate(with: testStr)
428
+ }
429
+
430
+ func isValidName(_ testStr:String) -> Bool {
431
+ let nameRegEx = "[A-Za-z\\s]+"
432
+ let nameTest = NSPredicate(format:"SELF MATCHES %@", nameRegEx)
433
+ return nameTest.evaluate(with: testStr)
434
+ }
435
+
436
+ func isValidPhone(_ testStr:String) -> Bool {
437
+ let phoneRegEx = "[0-9]*"
438
+ let phoneTest = NSPredicate(format:"SELF MATCHES %@", phoneRegEx)
439
+ return phoneTest.evaluate(with: testStr)
440
+ }
441
+
442
+ func validateData() -> Bool{
443
+ if let name = self.nameTextField.text, let lastname = self.lastnameTextField.text, let phone = self.phoneTextField.text {
444
+ if !isValidName(name){
445
+ APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Invalid name", comment: ""), and: "")
446
+ return false
447
+ } else if !isValidName(lastname){
448
+ APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Invalid lastname", comment: ""), and: "")
449
+ return false
450
+ } else if !isValidPhone(phone.trimmingCharacters(in: .whitespacesAndNewlines)) {
451
+ APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Invalid phone number", comment: ""), and: "")
452
+ return false
453
+ }
454
+ }
455
+ return true
456
+ }
457
+
458
+ @IBAction func selectCountryTapped(_ sender: UIButton) {
459
+ if self.countries.isEmpty {
460
+ // TODO: Set countries
461
+ } else {
462
+ self.addActionSheetPicker(sender)
463
+ }
464
+ }
465
+
466
+ func addActionSheetPicker(_ sender: UIButton){
467
+ let prevCountryValue = self.phonePrefix.text
468
+ let prevPhoneCountryValue = self.phoneCountry
469
+ let acp = ActionSheetStringPicker(title: "", rows: self.countries.map{$0.name}, initialSelection: 0, doneBlock: {
470
+ picker, values, indexes in
471
+
472
+ self.phonePrefix.text = self.countries[values].dial_code
473
+ self.phoneCountry = self.countries[values].name
474
+ self.phoneFlagLabel.text = self.countries[values].flag
475
+ return
476
+ }, cancel: {
477
+ ActionStringCancelBlock in
478
+ self.phonePrefix.text = prevCountryValue
479
+ self.phoneCountry = prevPhoneCountryValue
480
+ return }, origin: sender)
481
+
482
+ acp?.setTextColor(Colors.firstGradientColor)
483
+ acp?.pickerBackgroundColor = UIColor.white
484
+ acp?.toolbarBackgroundColor = UIColor.white
485
+ acp?.toolbarButtonsColor = Colors.firstGradientColor
486
+ acp?.show()
487
+ }
488
+
489
+ @IBAction func handleLogoutButton(_ sender: UIButton) {
490
+
491
+ // TODO: logout remote action
492
+ let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
493
+ appDelegate.logout()
494
+
495
+ }
496
+
497
+ @IBAction func aboutUsTapped(_ sender: UIButton) {
498
+ guard let vc = self.homeStoryboard.instantiateViewController(withIdentifier: "AboutUsVC") as? AboutUsVC else { return }
499
+ self.navigationController?.pushViewController(vc, animated: true)
500
+ }
501
+
502
+ @objc func handleFavoritesUpdated(_ notification: Foundation.Notification) {
503
+ //TODO: Get favorites again
504
+
505
+ }
506
+
507
+ }
508
+
509
+ open class CustomUIDelegate: DKImagePickerControllerDefaultUIDelegate {
510
+
511
+ open override func imagePickerControllerCreateCamera(_ imagePickerController: DKImagePickerController) -> UIViewController {
512
+
513
+ let picker = CustomCamera()
514
+ picker.sourceType = .camera
515
+ picker.mediaTypes = [kUTTypeImage as String]
516
+ return picker
517
+ }
518
+
519
+ }
520
+
521
+ extension ProfileTVC: UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
522
+
523
+ func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
524
+ if collectionView == favoritesCollectionView {
525
+ return favorites.count
526
+ } else {
527
+ return userHistory.count
528
+ }
529
+ }
530
+
531
+ func numberOfSections(in collectionView: UICollectionView) -> Int {
532
+ return 1
533
+ }
534
+
535
+ func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
536
+
537
+ if collectionView == favoritesCollectionView {
538
+
539
+ let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FavoriteCollectionCell", for: indexPath) as! FavoriteCollectionCell
540
+
541
+ let favorite = favorites[indexPath.row]
542
+ cell.destinationLabel.text = favorite.name
543
+ cell.removeButton.addTarget(self, action: #selector(handleRemoveButton(_:)), for: .touchUpInside)
544
+ return cell
545
+
546
+ } else {
547
+ let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "DestinationCellView", for: indexPath) as! DestinationCell
548
+
549
+ let history = userHistory[indexPath.row]
550
+ cell.destinationLabel.text = history.name.capitalized
551
+ cell.destinationBackgroundImage.kf.indicatorType = .activity
552
+ cell.destinationBackgroundImage.kf.setImage(with: URL(string: history.thumbnailUrl), options: [.transition(.fade(0.2))])
553
+ // for dest in travelGroup.destinations {
554
+ // cell.cityLabel.text = "\(cell.cityLabel.text!)\(travelGroup.destinations[0].destination?.city ?? ""), "
555
+ // }
556
+ // cell.cityLabel.text?.removeLast(2)
557
+ return cell
558
+ }
559
+ }
560
+
561
+ @objc func handleRemoveButton(_ sender: UIButton) {
562
+ let touchPoint = sender.convert(CGPoint.zero, to: self.favoritesCollectionView)
563
+ if let clickedIndexPath = self.favoritesCollectionView.indexPathForItem(at: touchPoint) {
564
+ self.noMoreFavorites.append(favorites[clickedIndexPath.row])
565
+ let removeDest = self.favorites.remove(at: clickedIndexPath.row)
566
+ self.noMoreFavorites.append(removeDest)
567
+ self.favoritesCollectionView.deleteItems(at: [clickedIndexPath])
568
+ }
569
+ }
570
+
571
+ func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
572
+ if collectionView == favoritesCollectionView {
573
+ let size = (favorites[indexPath.row].name as NSString).size(withAttributes: [NSAttributedStringKey.font : UIFont.systemFont(ofSize: 16.0)])
574
+ return CGSize(width: size.width + 65, height: 40)
575
+ } else {
576
+ return CGSize(width: 200, height: 100)
577
+ }
578
+ }
579
+
580
+ }
581
+