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.
- checksums.yaml +4 -4
- data/lib/mvcgen/filemanager.rb +1 -1
- data/lib/mvcgen/generator.rb +36 -33
- data/lib/mvcgen/version.rb +1 -1
- data/lib/templates/default/mvcspec.yml +1 -1
- data/lib/templates/default/podfile/Podfile +73 -0
- data/lib/templates/default/swift/AppDelegate.swift +181 -0
- data/lib/templates/default/swift/Assets.xcassets/AppIcon.appiconset/Contents.json +133 -0
- data/lib/templates/default/swift/Assets.xcassets/Back.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/Back.imageset/icons8-back-filled-100-2.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Contents.json +6 -0
- data/lib/templates/default/swift/Assets.xcassets/Down.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/Down.imageset/icons8-expand-arrow-filled-100.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Forward.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/Forward.imageset/icons8-forward-filled-100.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Key.imageset/Contents.json +1 -0
- data/lib/templates/default/swift/Assets.xcassets/Key.imageset/universal_Key.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Shopping-cart.imageset/Contents.json +1 -0
- data/lib/templates/default/swift/Assets.xcassets/Shopping-cart.imageset/universal_Shopping-cart.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Tick.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/Tick.imageset/icons8-Checkmark-96 (1).png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Up.imageset/Contents.json +22 -0
- data/lib/templates/default/swift/Assets.xcassets/Up.imageset/icons8-collapse-arrow-100.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Up.imageset/icons8-collapse-arrow-50.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Uruguay.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/Uruguay.imageset/icons8-uruguay-40.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Wallet.imageset/Contents.json +1 -0
- data/lib/templates/default/swift/Assets.xcassets/Wallet.imageset/universal_Wallet.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Welcome_001.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/Welcome_001.imageset/Icons_NotATour_Welcome_001.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Welcome_002.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/Welcome_002.imageset/Icons_NotATour_Welcome_002.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Welcome_003.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/Welcome_003.imageset/Icons_NotATour_Welcome_003.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/Welcome_004.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/Welcome_004.imageset/Icons_NotATour_Welcome_004.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/alert_beach.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/alert_beach.imageset/icons8-beach-64.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/alert_nobaggage.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/alert_nobaggage.imageset/icons8-no-baggage-100.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/alert_signpost.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/alert_signpost.imageset/icons8-signpost-64.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/alert_sunbed.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/alert_sunbed.imageset/sunbed.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/arrow.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/arrow.imageset/arrow.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/baggage.imageset/Contents.json +22 -0
- data/lib/templates/default/swift/Assets.xcassets/baggage.imageset/baggage.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/baggage.imageset/baggage@2x.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/burger.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/burger.imageset/burger.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/calendar-white.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/calendar-white.imageset/icons8-calendar.pdf +70 -0
- data/lib/templates/default/swift/Assets.xcassets/calendar.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/calendar.imageset/calendar.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/dots.imageset/Contents.json +24 -0
- data/lib/templates/default/swift/Assets.xcassets/dots.imageset/dots.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/edit.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/edit.imageset/edit.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/emptylogin.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/emptylogin.imageset/empty state loging.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/envelope.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/envelope.imageset/icons8-envelope.pdf +70 -0
- data/lib/templates/default/swift/Assets.xcassets/expandSection.imageset/Contents.json +22 -0
- data/lib/templates/default/swift/Assets.xcassets/expandSection.imageset/icons8-expand-arrow-100.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/expandSection.imageset/icons8-expand-arrow-50.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/facebook.imageset/Contents.json +24 -0
- data/lib/templates/default/swift/Assets.xcassets/facebook.imageset/icons8-facebook-f.pdf +68 -0
- data/lib/templates/default/swift/Assets.xcassets/filter-white.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/filter-white.imageset/icons8-adjust (3).pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/filter.imageset/Contents.json +15 -0
- data/lib/templates/default/swift/Assets.xcassets/filter.imageset/filter.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/food.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/food.imageset/food.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/forgot-password.imageset/Contents.json +23 -0
- data/lib/templates/default/swift/Assets.xcassets/forgot-password.imageset/page-1.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/forgot-password.imageset/page-1@2x.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/forgot-password.imageset/page-1@3x.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/heart-active.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/heart-active.imageset/favortio activo.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/heart.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/heart.imageset/favorito inactivo.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/icons8-delete.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/icons8-delete.imageset/icons8-delete (3).pdf +69 -0
- data/lib/templates/default/swift/Assets.xcassets/lock.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/lock.imageset/icons8-lock.pdf +69 -0
- data/lib/templates/default/swift/Assets.xcassets/man-avatar.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/man-avatar.imageset/man-avatar.pdf +1149 -1
- data/lib/templates/default/swift/Assets.xcassets/new-notification.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/new-notification.imageset/icons8-filled-circle-filled-100.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/no-fav.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/no-fav.imageset/page-1@2x.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/notificaciones.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/notificaciones.imageset/notificaciones.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/notification.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/notification.imageset/icons8-notification-100.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/other.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/other.imageset/other.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/page-1.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/page-1.imageset/page-1@2x.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/page-3.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/page-3.imageset/page-1@2x.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/photo.imageset/Contents.json +24 -0
- data/lib/templates/default/swift/Assets.xcassets/photo.imageset/photo.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/plus-white.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/plus-white.imageset/icons8-plus-math-26.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/plus.imageset/+.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/plus.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/register.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/register.imageset/registro.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/search.imageset/Contents.json +15 -0
- data/lib/templates/default/swift/Assets.xcassets/search.imageset/search.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/settings.imageset/Contents.json +23 -0
- data/lib/templates/default/swift/Assets.xcassets/settings.imageset/icons8-settings-100.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/settings.imageset/icons8-settings-50.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/settings.imageset/icons8-settings-500.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/shape.imageset/Contents.json +23 -0
- data/lib/templates/default/swift/Assets.xcassets/shape.imageset/shape.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/shape.imageset/shape@2x.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/shape.imageset/shape@3x.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/signpost.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/signpost.imageset/icons8-signpost-50.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/stars.imageset/Contents.json +24 -0
- data/lib/templates/default/swift/Assets.xcassets/stars.imageset/stars.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/terms.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/terms.imageset/terminos y condiciones.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/tickets.imageset/Contents.json +12 -0
- data/lib/templates/default/swift/Assets.xcassets/tickets.imageset/tickets.pdf +0 -0
- data/lib/templates/default/swift/Assets.xcassets/user.imageset/Contents.json +22 -0
- data/lib/templates/default/swift/Assets.xcassets/user.imageset/icons8-account-100.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/user.imageset/icons8-account-50.png +0 -0
- data/lib/templates/default/swift/Assets.xcassets/visa.imageset/Contents.json +21 -0
- data/lib/templates/default/swift/Assets.xcassets/visa.imageset/visa.png +0 -0
- data/lib/templates/default/swift/Config/Config.swift +1 -1
- data/lib/templates/default/swift/Controllers/Login/ForgetPasswordVC.swift +125 -0
- data/lib/templates/default/swift/Controllers/Login/LoginVC.swift +244 -0
- data/lib/templates/default/swift/Controllers/Login/RegisterVC.swift +213 -0
- data/lib/templates/default/swift/Controllers/Notifications/Cells/NotificationCell.swift +51 -0
- data/lib/templates/default/swift/Controllers/Notifications/NotificationsVC.swift +164 -0
- data/lib/templates/default/swift/Controllers/OtherLogin/ForgetPasswordTVC.swift +98 -0
- data/lib/templates/default/swift/Controllers/OtherLogin/LoginTVC.swift +245 -0
- data/lib/templates/default/swift/Controllers/OtherLogin/OtherRegisterVC.swift +299 -0
- data/lib/templates/default/swift/Controllers/OtherLogin/SelectLanguageCell.swift +17 -0
- data/lib/templates/default/swift/Controllers/OtherLogin/SelectLanguageVC.swift +116 -0
- data/lib/templates/default/swift/Controllers/OtherLogin/TermsAndConditionsVC.swift +76 -0
- data/lib/templates/default/swift/Controllers/Profile/AboutUsVC.swift +93 -0
- data/lib/templates/default/swift/Controllers/Profile/Cells/AboutUsImageCell.swift +66 -0
- data/lib/templates/default/swift/Controllers/Profile/Cells/DescriptionCell.swift +16 -0
- data/lib/templates/default/swift/Controllers/Profile/Cells/DestinationCell.swift +35 -0
- data/lib/templates/default/swift/Controllers/Profile/Cells/DestinationCellView.xib +84 -0
- data/lib/templates/default/swift/Controllers/Profile/Cells/FavoriteCollectionCell.swift +24 -0
- data/lib/templates/default/swift/Controllers/Profile/Cells/ImagesCollectionViewCell.swift +15 -0
- data/lib/templates/default/swift/Controllers/Profile/ProfileContainerVC.swift +72 -0
- data/lib/templates/default/swift/Controllers/Profile/ProfileTVC.swift +581 -0
- data/lib/templates/default/swift/Controllers/Tutorial/TutorialVC.swift +121 -0
- data/lib/templates/default/swift/Extensions/ArrayDuplicates.swift +35 -0
- data/lib/templates/default/swift/Extensions/Buttons.swift +1 -1
- data/lib/templates/default/swift/Extensions/CustomCamera.swift +65 -0
- data/lib/templates/default/swift/Extensions/GradientView.swift +121 -0
- data/lib/templates/default/swift/Extensions/HideKeyboard.swift +22 -0
- data/lib/templates/default/swift/Extensions/Images.swift +82 -0
- data/lib/templates/default/swift/Extensions/InnerShadowExtension.swift +83 -0
- data/lib/templates/default/swift/Extensions/TableViewEmptyView.swift +30 -0
- data/lib/templates/default/swift/Extensions/TapEffectExtension.swift +48 -0
- data/lib/templates/default/swift/Extensions/{ColorHex.swift → UIColorExtensions.swift} +2 -2
- data/lib/templates/default/swift/Extensions/UnderlinedTextView.swift +61 -0
- data/lib/templates/default/swift/Extensions/UnderlinedWithIconTextField.swift +55 -0
- data/lib/templates/default/swift/Helper/APIHelper.swift +4 -4
- data/lib/templates/default/swift/Helper/APIManager.swift +81 -14
- data/lib/templates/default/swift/Helper/APIRequestBody.swift +1 -1
- data/lib/templates/default/swift/Helper/AWSManager.swift +1 -1
- data/lib/templates/default/swift/Helper/FilesManager.swift +1 -1
- data/lib/templates/default/swift/Helper/S3Manager.swift +1 -1
- data/lib/templates/default/swift/Helper/Utils.swift +3 -1
- data/lib/templates/default/swift/Info.plist +53 -0
- data/lib/templates/default/swift/Models/Country.swift +28 -0
- data/lib/templates/default/swift/Models/Managers/UserManager.swift +1 -1
- data/lib/templates/default/swift/Models/Notif.swift +71 -0
- data/lib/templates/default/swift/Models/Responses/BaseResponse.swift +1 -1
- data/lib/templates/default/swift/Models/Responses/NotificationResponse.swift +24 -0
- data/lib/templates/default/swift/Models/Responses/UserResponse.swift +1 -1
- data/lib/templates/default/swift/Models/Responses/UserSingupResponse.swift +1 -1
- data/lib/templates/default/swift/Models/User.swift +2 -2
- data/lib/templates/default/swift/UI/Storyboards/Home.storyboard +2113 -0
- data/lib/templates/default/swift/UI/Storyboards/Login.storyboard +814 -0
- data/lib/templates/default/swift/UI/Storyboards/OtherLogin.storyboard +1031 -0
- data/lib/templates/default/swift/UI/Views/EmptyTableView/EmptyTableLabelView.swift +18 -0
- data/lib/templates/default/swift/UI/Views/EmptyTableView/NoNotificationView.swift +16 -0
- data/lib/templates/default/swift/UI/Views/EmptyTableView/Xibs/EmptyTableLabelView.xib +72 -0
- data/lib/templates/default/swift/UI/Views/EmptyTableView/Xibs/NoNotificationsView.xib +61 -0
- 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
|
+
|