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