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