mvcgen 0.1.14 → 0.1.18
Sign up to get free protection for your applications and to get access to all the features.
- 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,51 @@
|
|
1
|
+
//
|
2
|
+
// NotificationCell.swift
|
3
|
+
// MVCGEN
|
4
|
+
//
|
5
|
+
// Created by Daniel Martinez on 23/7/18.
|
6
|
+
// Copyright © 2018 Houlak. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import UIKit
|
10
|
+
|
11
|
+
class NotificationCell: UITableViewCell {
|
12
|
+
|
13
|
+
@IBOutlet weak var notificationImage: UIImageView!{
|
14
|
+
didSet{
|
15
|
+
self.notificationImage.layoutIfNeeded()
|
16
|
+
self.notificationImage.layer.cornerRadius = self.notificationImage.frame.height/2
|
17
|
+
self.notificationImage.layer.masksToBounds = true
|
18
|
+
self.notificationImage.layer.borderColor = UIColor(red: 155/255, green: 155/255, blue: 155/255, alpha: 1.0).cgColor
|
19
|
+
self.notificationImage.layer.borderWidth = 0.5
|
20
|
+
}
|
21
|
+
}
|
22
|
+
@IBOutlet weak var notificationText: UILabel!
|
23
|
+
@IBOutlet weak var notificationDate: UILabel!
|
24
|
+
@IBOutlet weak var newNotificationView: UIView!{
|
25
|
+
didSet{
|
26
|
+
self.newNotificationView.layer.shadowColor = UIColor.black.cgColor
|
27
|
+
self.newNotificationView.layer.shadowOffset = CGSize(width: 0.0, height: 2.0)
|
28
|
+
self.newNotificationView.layer.shadowRadius = 1.0
|
29
|
+
self.newNotificationView.layer.shadowOpacity = 0.5
|
30
|
+
self.newNotificationView.layer.masksToBounds = false
|
31
|
+
self.newNotificationView.layer.cornerRadius = self.newNotificationView.frame.height/2
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
override func awakeFromNib() {
|
36
|
+
super.awakeFromNib()
|
37
|
+
// Initialization code
|
38
|
+
|
39
|
+
self.newNotificationView.isHidden = true
|
40
|
+
|
41
|
+
}
|
42
|
+
|
43
|
+
override func prepareForReuse() {
|
44
|
+
super.prepareForReuse()
|
45
|
+
|
46
|
+
self.notificationImage.image = UIImage(named: "notificaciones")
|
47
|
+
|
48
|
+
self.newNotificationView.isHidden = true
|
49
|
+
}
|
50
|
+
|
51
|
+
}
|
@@ -0,0 +1,164 @@
|
|
1
|
+
//
|
2
|
+
// NotificationsVC.swift
|
3
|
+
// MVCGEN
|
4
|
+
//
|
5
|
+
// Created by Daniel Martinez on 23/7/18.
|
6
|
+
// Copyright © 2018 Houlak. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import UIKit
|
10
|
+
import SwiftDate
|
11
|
+
import Kingfisher
|
12
|
+
import PMAlertController
|
13
|
+
|
14
|
+
class NotificationsVC: UIViewController, UITableViewDelegate, UITableViewDataSource{
|
15
|
+
|
16
|
+
// MARK: - Outlets
|
17
|
+
|
18
|
+
@IBOutlet var gradientView: UIView!
|
19
|
+
|
20
|
+
@IBOutlet weak var tableView: UITableView!
|
21
|
+
|
22
|
+
@IBOutlet weak var backButton: UIButton!
|
23
|
+
|
24
|
+
// MARK: - Properties
|
25
|
+
|
26
|
+
let homeStoryboard = UIStoryboard(name: "Home", bundle: Bundle.main)
|
27
|
+
|
28
|
+
var notifications = [Notif]()
|
29
|
+
|
30
|
+
var selectedNotification: Notif?
|
31
|
+
|
32
|
+
var delegate: NotificationReadProtocol?
|
33
|
+
|
34
|
+
override func viewDidLoad() {
|
35
|
+
super.viewDidLoad()
|
36
|
+
|
37
|
+
setup()
|
38
|
+
|
39
|
+
}
|
40
|
+
|
41
|
+
override func viewWillAppear(_ animated: Bool) {
|
42
|
+
super.viewWillAppear(true)
|
43
|
+
|
44
|
+
self.navigationController?.navigationBar.isHidden = true
|
45
|
+
self.tableView.isUserInteractionEnabled = true
|
46
|
+
|
47
|
+
self.tableView.reloadData()
|
48
|
+
}
|
49
|
+
|
50
|
+
override func viewDidLayoutSubviews() {
|
51
|
+
super.viewDidLayoutSubviews()
|
52
|
+
|
53
|
+
self.gradientView.applyGradient(withColours: [Colors.firstGradientColor, Colors.thirdGradientColor], locations: [0, 0.5])
|
54
|
+
}
|
55
|
+
|
56
|
+
private func setup() {
|
57
|
+
|
58
|
+
self.tableView.rowHeight = UITableViewAutomaticDimension
|
59
|
+
|
60
|
+
let origImage = UIImage(named: "Back")
|
61
|
+
let tintedImage = origImage?.withRenderingMode(.alwaysTemplate)
|
62
|
+
self.backButton.setImage(tintedImage, for: .normal)
|
63
|
+
self.backButton.tintColor = UIColor(red: 107.0/255.0, green: 255.0/255.0, blue: 192.0/255.0, alpha: 1)
|
64
|
+
}
|
65
|
+
|
66
|
+
|
67
|
+
|
68
|
+
@IBAction func backTapped(_ sender: UIButton) {
|
69
|
+
self.navigationController?.popViewController(animated: true)
|
70
|
+
}
|
71
|
+
override func viewWillDisappear(_ animated: Bool) {
|
72
|
+
super.viewWillDisappear(animated)
|
73
|
+
|
74
|
+
if self.isMovingFromParentViewController{
|
75
|
+
delegate?.setAsRead(value: true)
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
// MARK: - Table view
|
80
|
+
|
81
|
+
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
82
|
+
return notifications.count
|
83
|
+
}
|
84
|
+
|
85
|
+
func numberOfSections(in tableView: UITableView) -> Int {
|
86
|
+
if notifications.count > 0 {
|
87
|
+
self.hideNoNotificationsView()
|
88
|
+
return 1
|
89
|
+
}
|
90
|
+
self.setNoNotificationsView()
|
91
|
+
return 0
|
92
|
+
|
93
|
+
}
|
94
|
+
|
95
|
+
func setNoNotificationsView(){
|
96
|
+
let emptyTableLabelViewNib = UINib(nibName: "NoNotificationsView", bundle: nil)
|
97
|
+
let emptyTableLabelView = emptyTableLabelViewNib.instantiate(withOwner: nil, options: nil)[0] as! NoNotificationView
|
98
|
+
emptyTableLabelView.tag = 100
|
99
|
+
self.tableView.separatorStyle = .none
|
100
|
+
self.tableView.backgroundView = emptyTableLabelView
|
101
|
+
}
|
102
|
+
|
103
|
+
func hideNoNotificationsView(){
|
104
|
+
self.tableView.separatorStyle = .singleLine
|
105
|
+
if let viewWithTag = self.tableView.viewWithTag(100) {
|
106
|
+
viewWithTag.isHidden = true
|
107
|
+
}
|
108
|
+
}
|
109
|
+
|
110
|
+
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
111
|
+
|
112
|
+
let cell = tableView.dequeueReusableCell(withIdentifier: "NotificationCell", for: indexPath) as! NotificationCell
|
113
|
+
|
114
|
+
let notification = self.notifications[indexPath.row]
|
115
|
+
|
116
|
+
cell.notificationText.text = notification.body
|
117
|
+
|
118
|
+
if !notification.read{
|
119
|
+
cell.newNotificationView.isHidden = false
|
120
|
+
}
|
121
|
+
|
122
|
+
let region = Region.Local()
|
123
|
+
let dateB = DateInRegion(absoluteDate: notification.createdDate as Date, in: region)
|
124
|
+
let (colloquial, _) = try! dateB.colloquialSinceNow()
|
125
|
+
cell.notificationDate.text = colloquial
|
126
|
+
switch notification.notifType{
|
127
|
+
case .broadcast:
|
128
|
+
break
|
129
|
+
case .generic:
|
130
|
+
break
|
131
|
+
default:
|
132
|
+
break
|
133
|
+
}
|
134
|
+
return cell
|
135
|
+
}
|
136
|
+
|
137
|
+
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
|
138
|
+
self.tableView.isUserInteractionEnabled = false
|
139
|
+
|
140
|
+
let selectedNotif = self.notifications[indexPath.row]
|
141
|
+
|
142
|
+
self.selectedNotification = selectedNotif
|
143
|
+
|
144
|
+
switch selectedNotif.notifType {
|
145
|
+
case .broadcast:
|
146
|
+
self.tableView.isUserInteractionEnabled = true
|
147
|
+
break
|
148
|
+
case .generic:
|
149
|
+
self.tableView.isUserInteractionEnabled = true
|
150
|
+
//Perform segue to detail
|
151
|
+
break
|
152
|
+
default:
|
153
|
+
self.tableView.isUserInteractionEnabled = true
|
154
|
+
break
|
155
|
+
}
|
156
|
+
}
|
157
|
+
|
158
|
+
}
|
159
|
+
|
160
|
+
protocol NotificationReadProtocol {
|
161
|
+
func setAsRead(value: Bool)
|
162
|
+
}
|
163
|
+
|
164
|
+
|
@@ -0,0 +1,98 @@
|
|
1
|
+
//
|
2
|
+
// ForgetPasswordVC.swift
|
3
|
+
// MVCGEN
|
4
|
+
//
|
5
|
+
// Created by Daniel Martinez on 23/7/18.
|
6
|
+
// Copyright © 2018 Houlak. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import UIKit
|
10
|
+
|
11
|
+
class ForgetPasswordTVC: UITableViewController, UITextFieldDelegate {
|
12
|
+
|
13
|
+
@IBOutlet weak var backgroundGradientView: UIView!
|
14
|
+
|
15
|
+
@IBOutlet weak var sendLinkButton: LoadingButton!
|
16
|
+
|
17
|
+
@IBOutlet weak var emailTextField: UnderlinedWithIconTextField!
|
18
|
+
|
19
|
+
@IBOutlet weak var instructionsLabel: UILabel!
|
20
|
+
|
21
|
+
override func viewDidLoad() {
|
22
|
+
super.viewDidLoad()
|
23
|
+
|
24
|
+
setupViews()
|
25
|
+
|
26
|
+
hideKeyboardWhenTappedAround()
|
27
|
+
}
|
28
|
+
|
29
|
+
func setupViews() {
|
30
|
+
self.sendLinkButton.layoutIfNeeded()
|
31
|
+
self.sendLinkButton.layer.cornerRadius = self.sendLinkButton.frame.height/7
|
32
|
+
self.sendLinkButton.layer.masksToBounds = true
|
33
|
+
self.sendLinkButton.activityIndicatorColor = UIColor.white
|
34
|
+
|
35
|
+
self.emailTextField.underlined(color: UIColor.white, width: 1.0)
|
36
|
+
self.emailTextField.addLeftIcon("envelope")
|
37
|
+
|
38
|
+
self.instructionsLabel.addCharacterSpacing(space: 0.9)
|
39
|
+
self.instructionsLabel.addLineSpacing(lineHeightMultiple: 1.4)
|
40
|
+
self.instructionsLabel.textAlignment = NSTextAlignment.center
|
41
|
+
|
42
|
+
self.emailTextField.delegate = self
|
43
|
+
}
|
44
|
+
|
45
|
+
override func viewDidLayoutSubviews() {
|
46
|
+
super.viewDidLayoutSubviews()
|
47
|
+
self.backgroundGradientView.applyGradient(withColours: [ColorConstants.fromGradient, ColorConstants.fromGradient, ColorConstants.toGradient], locations: [0, 0.2, 0.98])
|
48
|
+
}
|
49
|
+
|
50
|
+
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
51
|
+
|
52
|
+
if textField.tag == 0 {
|
53
|
+
textField.resignFirstResponder()
|
54
|
+
forgetPasswordTapped()
|
55
|
+
return true
|
56
|
+
}
|
57
|
+
|
58
|
+
let nextTage = textField.tag+1
|
59
|
+
|
60
|
+
// Try to find next responder
|
61
|
+
guard let nextResponder = textField.superview?.superview?.superview?.viewWithTag(nextTage) as UIResponder? else {
|
62
|
+
textField.resignFirstResponder()
|
63
|
+
return false
|
64
|
+
}
|
65
|
+
|
66
|
+
nextResponder.becomeFirstResponder()
|
67
|
+
|
68
|
+
return false // We do not want UITextField to insert line-breaks.
|
69
|
+
}
|
70
|
+
|
71
|
+
private func isValidEmail(_ testStr:String) -> Bool {
|
72
|
+
let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
|
73
|
+
let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
|
74
|
+
return emailTest.evaluate(with: testStr)
|
75
|
+
}
|
76
|
+
|
77
|
+
@IBAction func sendLinkTapped(_ sender: LoadingButton) {
|
78
|
+
forgetPasswordTapped()
|
79
|
+
}
|
80
|
+
|
81
|
+
private func forgetPasswordTapped(){
|
82
|
+
if let email = self.emailTextField.text, isValidEmail(email){
|
83
|
+
self.sendLinkButton.showLoading()
|
84
|
+
RemoteUserRepository.sharedInstance.forgetPassword(email: email) { result in
|
85
|
+
self.sendLinkButton.hideLoading()
|
86
|
+
if result == .success{
|
87
|
+
APIHelper.sharedInstance.showSuccesMessage(with: NSLocalizedString("Email sent!", comment: ""), and: "")
|
88
|
+
}
|
89
|
+
}
|
90
|
+
} else {
|
91
|
+
APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Invalid email", comment: ""), and: "")
|
92
|
+
}
|
93
|
+
}
|
94
|
+
|
95
|
+
@IBAction func handleCloseButton(_ sender: UIButton) {
|
96
|
+
dismiss(animated: true, completion: nil)
|
97
|
+
}
|
98
|
+
}
|
@@ -0,0 +1,245 @@
|
|
1
|
+
//
|
2
|
+
// LoginVC.swift
|
3
|
+
// MVCGEN
|
4
|
+
//
|
5
|
+
// Created by Daniel Martinez on 23/7/18.
|
6
|
+
// Copyright © 2018 Houlak. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import UIKit
|
10
|
+
import Pastel
|
11
|
+
import FacebookLogin
|
12
|
+
|
13
|
+
class LoginVC: UITableViewController, UITextFieldDelegate, ForgetPasswordVCDelegate {
|
14
|
+
|
15
|
+
// MARK: - Outlets
|
16
|
+
|
17
|
+
@IBOutlet weak var emailTextField: UITextField!
|
18
|
+
@IBOutlet weak var passwordTextField: UITextField!
|
19
|
+
@IBOutlet weak var forgetPasswordLabel: UILabel!
|
20
|
+
@IBOutlet weak var loginButton: LoadingButton!{
|
21
|
+
didSet{
|
22
|
+
loginButton.addShadow()
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
private let homeStoryboard = UIStoryboard(name: "Home", bundle: Bundle.main)
|
27
|
+
|
28
|
+
@IBOutlet weak var registerButton: UIButton!{
|
29
|
+
didSet{
|
30
|
+
registerButton.addShadow()
|
31
|
+
}
|
32
|
+
}
|
33
|
+
|
34
|
+
@IBOutlet weak var facebookLoginButton: LoadingButton!{
|
35
|
+
didSet{
|
36
|
+
facebookLoginButton.addShadow()
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
private var pastelView: PastelView!
|
41
|
+
|
42
|
+
override func viewDidLoad() {
|
43
|
+
super.viewDidLoad()
|
44
|
+
|
45
|
+
|
46
|
+
self.emailTextField.delegate = self
|
47
|
+
self.passwordTextField.delegate = self
|
48
|
+
|
49
|
+
configureText()
|
50
|
+
|
51
|
+
configureViews()
|
52
|
+
|
53
|
+
hideKeyboardWhenTappedAround()
|
54
|
+
|
55
|
+
}
|
56
|
+
|
57
|
+
override func viewWillAppear(_ animated: Bool) {
|
58
|
+
super.viewWillAppear(animated)
|
59
|
+
|
60
|
+
self.pastelView.startAnimation()
|
61
|
+
}
|
62
|
+
|
63
|
+
// MARK: - Actions
|
64
|
+
|
65
|
+
@IBAction func loginTapped(_ sender: UIButton) {
|
66
|
+
self.emailLoginTapped()
|
67
|
+
}
|
68
|
+
|
69
|
+
@IBAction func facebookLoginTapped(_ sender: UIButton) {
|
70
|
+
self.facebookLoginButton.showLoading()
|
71
|
+
let fbLoginManager = LoginManager()
|
72
|
+
// TODO: Comment next line after logout is done
|
73
|
+
fbLoginManager.logOut()
|
74
|
+
fbLoginManager.logIn(readPermissions: [.email, .userBirthday, .publicProfile], viewController: self, completion: { loginResult in
|
75
|
+
switch loginResult {
|
76
|
+
case .failed(let error):
|
77
|
+
self.facebookLoginButton.hideLoading()
|
78
|
+
print(error)
|
79
|
+
break
|
80
|
+
case .cancelled:
|
81
|
+
self.facebookLoginButton.hideLoading()
|
82
|
+
print("User cancelled login.")
|
83
|
+
break
|
84
|
+
case .success(let grantedPermissions, let declinedPermissions, let accessToken):
|
85
|
+
// let photoURL = URL(string: "https://graph.facebook.com/\(accessToken.userId ?? "")/picture?type=large&return_ssl_resources=1")
|
86
|
+
APIManager.sharedInstance.loginfb(withParameters: APIRequestBody.getFbLoginBody(withAccesToken: accessToken.authenticationToken), completion: {
|
87
|
+
result in
|
88
|
+
self.facebookLoginButton.hideLoading()
|
89
|
+
if result == .success {
|
90
|
+
self.performSegue(withIdentifier: "GoHome", sender: nil)
|
91
|
+
}
|
92
|
+
})
|
93
|
+
}
|
94
|
+
})
|
95
|
+
}
|
96
|
+
|
97
|
+
@IBAction func forgetPasswordTapped(_ sender: UIButton) {
|
98
|
+
self.definesPresentationContext = true
|
99
|
+
self.providesPresentationContextTransitionStyle = true
|
100
|
+
|
101
|
+
self.overlayBlurredBackgroundView()
|
102
|
+
}
|
103
|
+
|
104
|
+
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
|
105
|
+
if let identifier = segue.identifier {
|
106
|
+
if identifier == "ShowForgetPassword" {
|
107
|
+
if let viewController = segue.destination as? ForgetPasswordVC {
|
108
|
+
viewController.delegate = self
|
109
|
+
viewController.modalPresentationStyle = .overFullScreen
|
110
|
+
}
|
111
|
+
}
|
112
|
+
}
|
113
|
+
}
|
114
|
+
|
115
|
+
// MARK: - UITextFieldDelegate
|
116
|
+
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
117
|
+
|
118
|
+
if textField.tag == 1 {
|
119
|
+
textField.resignFirstResponder()
|
120
|
+
emailLoginTapped()
|
121
|
+
return true
|
122
|
+
}
|
123
|
+
|
124
|
+
let nextTage = textField.tag+1
|
125
|
+
|
126
|
+
// Try to find next responder
|
127
|
+
guard let nextResponder = textField.superview?.superview?.superview?.viewWithTag(nextTage) as UIResponder? else {
|
128
|
+
textField.resignFirstResponder()
|
129
|
+
return false
|
130
|
+
}
|
131
|
+
|
132
|
+
nextResponder.becomeFirstResponder()
|
133
|
+
|
134
|
+
return false // We do not want UITextField to insert line-breaks.
|
135
|
+
}
|
136
|
+
|
137
|
+
// MARK: - Private
|
138
|
+
|
139
|
+
private func configureText(){
|
140
|
+
|
141
|
+
self.emailTextField.attributedPlaceholder = NSAttributedString(string: NSLocalizedString("Email", comment: ""),
|
142
|
+
attributes: [NSAttributedStringKey.foregroundColor: UIColor.lightGray, NSAttributedStringKey.font: Fonts.roboto(type: 1, fontSize: 17)])
|
143
|
+
self.passwordTextField.attributedPlaceholder = NSAttributedString(string: NSLocalizedString("Password", comment: ""),
|
144
|
+
attributes: [NSAttributedStringKey.foregroundColor: UIColor.lightGray, NSAttributedStringKey.font: Fonts.roboto(type: 1, fontSize: 17)])
|
145
|
+
|
146
|
+
let normalText = NSLocalizedString("Forget your password?", comment: "")
|
147
|
+
let normalAttrs = [NSAttributedStringKey.font : Fonts.roboto(type: 0, fontSize: 15)]
|
148
|
+
let normalString = NSMutableAttributedString(string:normalText,attributes: normalAttrs)
|
149
|
+
|
150
|
+
let boldText = NSLocalizedString(" Restore", comment: "")
|
151
|
+
let attrs = [NSAttributedStringKey.font : Fonts.roboto(type: 4, fontSize: 15)]
|
152
|
+
let attributedString = NSMutableAttributedString(string:boldText, attributes:attrs)
|
153
|
+
|
154
|
+
normalString.append(attributedString)
|
155
|
+
|
156
|
+
self.forgetPasswordLabel.attributedText = normalString
|
157
|
+
|
158
|
+
}
|
159
|
+
|
160
|
+
private func configureViews(){
|
161
|
+
self.pastelView = PastelView(frame: self.tableView.bounds)
|
162
|
+
|
163
|
+
// Custom Direction
|
164
|
+
pastelView.startPastelPoint = .bottomLeft
|
165
|
+
pastelView.endPastelPoint = .topRight
|
166
|
+
|
167
|
+
// Custom Duration
|
168
|
+
pastelView.animationDuration = 3.0
|
169
|
+
|
170
|
+
// Custom Color
|
171
|
+
pastelView.setColors([Colors.firstGradientColor, Colors.textColor, Colors.secondGradientColor, Colors.thirdGradientColor])
|
172
|
+
|
173
|
+
self.tableView.backgroundView = pastelView
|
174
|
+
|
175
|
+
}
|
176
|
+
|
177
|
+
private func emailLoginTapped(){
|
178
|
+
if self.validateForm(){
|
179
|
+
if let email = self.emailTextField.text, let password = self.passwordTextField.text{
|
180
|
+
self.loginButton.showLoading()
|
181
|
+
APIManager.sharedInstance.login(withParameters: APIRequestBody.getLoginBody(withEmail: email, withPassword: password), completion: {
|
182
|
+
result in
|
183
|
+
self.loginButton.hideLoading()
|
184
|
+
if result == .success {
|
185
|
+
let rootController = self.homeStoryboard.instantiateViewController(withIdentifier: "Home")
|
186
|
+
UIApplication.shared.keyWindow?.rootViewController = rootController
|
187
|
+
self.performSegue(withIdentifier: "GoHome", sender: nil)
|
188
|
+
}
|
189
|
+
})
|
190
|
+
}
|
191
|
+
}
|
192
|
+
}
|
193
|
+
|
194
|
+
private func validateForm() -> Bool {
|
195
|
+
|
196
|
+
if self.emailTextField.text == "" {
|
197
|
+
errorOnLogin(causeOfFailure: "email")
|
198
|
+
return false
|
199
|
+
}
|
200
|
+
|
201
|
+
if self.passwordTextField.text == "" {
|
202
|
+
errorOnLogin(causeOfFailure: "password")
|
203
|
+
return false
|
204
|
+
}
|
205
|
+
|
206
|
+
return true
|
207
|
+
}
|
208
|
+
|
209
|
+
private func errorOnLogin(causeOfFailure error: String){
|
210
|
+
|
211
|
+
switch error {
|
212
|
+
case "email":
|
213
|
+
APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("You must enter an email", comment: ""), and: "")
|
214
|
+
break
|
215
|
+
case "password":
|
216
|
+
APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("You must enter a password", comment: ""), and: "")
|
217
|
+
break
|
218
|
+
default:
|
219
|
+
APIHelper.sharedInstance.showErrorMessage(with: NSLocalizedString("Check the entered data", comment: ""), and: "")
|
220
|
+
break
|
221
|
+
}
|
222
|
+
|
223
|
+
}
|
224
|
+
|
225
|
+
private func overlayBlurredBackgroundView() {
|
226
|
+
|
227
|
+
let blurredBackgroundView = UIVisualEffectView()
|
228
|
+
|
229
|
+
blurredBackgroundView.frame = self.tableView.bounds
|
230
|
+
blurredBackgroundView.effect = UIBlurEffect(style: .dark)
|
231
|
+
|
232
|
+
self.tableView.addSubview(blurredBackgroundView)
|
233
|
+
|
234
|
+
}
|
235
|
+
|
236
|
+
@objc func removeBlurredBackgroundView() {
|
237
|
+
|
238
|
+
for subview in self.tableView.subviews {
|
239
|
+
if subview.isKind(of: UIVisualEffectView.self) {
|
240
|
+
subview.removeFromSuperview()
|
241
|
+
}
|
242
|
+
}
|
243
|
+
}
|
244
|
+
}
|
245
|
+
|