mvcgen 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +115 -0
- data/bin/mvcgen +9 -0
- data/lib/mvcgen.rb +6 -0
- data/lib/mvcgen/dirutils.rb +17 -0
- data/lib/mvcgen/filemanager.rb +51 -0
- data/lib/mvcgen/generator.rb +58 -0
- data/lib/mvcgen/mvcthor.rb +19 -0
- data/lib/mvcgen/templatemanager.rb +53 -0
- data/lib/mvcgen/version.rb +4 -0
- data/lib/templates/default/mvcspec.yml +4 -0
- data/lib/templates/default/objc/DataManager/VIPERDataManager.h +15 -0
- data/lib/templates/default/objc/DataManager/VIPERDataManager.m +11 -0
- data/lib/templates/default/objc/Interactor/VIPERInteractor.h +16 -0
- data/lib/templates/default/objc/Interactor/VIPERInteractor.m +10 -0
- data/lib/templates/default/objc/Presenter/VIPERPresenter.h +18 -0
- data/lib/templates/default/objc/Presenter/VIPERPresenter.m +11 -0
- data/lib/templates/default/objc/Protocols/VIPERProtocols.h +64 -0
- data/lib/templates/default/objc/ViewController/VIPERViewController.h +13 -0
- data/lib/templates/default/objc/ViewController/VIPERViewController.m +32 -0
- data/lib/templates/default/objc/WireFrame/VIPERWireFrame.h +19 -0
- data/lib/templates/default/objc/WireFrame/VIPERWireFrame.m +31 -0
- data/lib/templates/default/swift/Config/Config.plist +58 -0
- data/lib/templates/default/swift/Config/Config.swift +50 -0
- data/lib/templates/default/swift/Extensions/Buttons.swift +110 -0
- data/lib/templates/default/swift/Extensions/ColorHex.swift +32 -0
- data/lib/templates/default/swift/Helper/APIHelper.swift +98 -0
- data/lib/templates/default/swift/Helper/APIManager.swift +217 -0
- data/lib/templates/default/swift/Helper/APIRequestBody.swift +81 -0
- data/lib/templates/default/swift/Helper/AWSManager.swift +29 -0
- data/lib/templates/default/swift/Helper/FilesManager.swift +97 -0
- data/lib/templates/default/swift/Helper/S3Manager.swift +113 -0
- data/lib/templates/default/swift/Helper/Utils.swift +69 -0
- data/lib/templates/default/swift/Models/Managers/UserManager.swift +56 -0
- data/lib/templates/default/swift/Models/Responses/BaseResponse.swift +75 -0
- data/lib/templates/default/swift/Models/Responses/UserResponse.swift +30 -0
- data/lib/templates/default/swift/Models/Responses/UserSingupResponse.swift +27 -0
- data/lib/templates/default/swift/Models/User.swift +92 -0
- data/spec/mvcgen/mvcgen_spec.rb +131 -0
- data/spec/spec_helper.rb +4 -0
- metadata +159 -0
@@ -0,0 +1,64 @@
|
|
1
|
+
//
|
2
|
+
// Created by Pedro Piñera Buendía on 2014.
|
3
|
+
// Copyright (c) 2014 Redbooth. All rights reserved.
|
4
|
+
//
|
5
|
+
|
6
|
+
#import <Foundation/Foundation.h>
|
7
|
+
#import <UIKit/UIKit.h>
|
8
|
+
|
9
|
+
@protocol VIPERDataManagerOutputProtocol;
|
10
|
+
@protocol VIPERInteractorOutputProtocol;
|
11
|
+
@protocol VIPERInteractorInputProtocol;
|
12
|
+
@protocol VIPERViewProtocol;
|
13
|
+
@protocol VIPERPresenterProtocol;
|
14
|
+
@protocol VIPERDataManagerInputProtocol;
|
15
|
+
@class VIPERWireFrame;
|
16
|
+
|
17
|
+
typedef void (^CompletionBlock)(NSError **error);
|
18
|
+
|
19
|
+
@protocol VIPERViewProtocol
|
20
|
+
@required
|
21
|
+
@property (nonatomic, strong) id <VIPERPresenterProtocol> presenter;
|
22
|
+
/**
|
23
|
+
* Add here your methods for communication VIEWCONTROLLER -> PRESENTER
|
24
|
+
*/
|
25
|
+
@end
|
26
|
+
|
27
|
+
@protocol VIPERPresenterProtocol
|
28
|
+
@required
|
29
|
+
@property (nonatomic, weak) id <VIPERViewProtocol> view;
|
30
|
+
@property (nonatomic, strong) id <VIPERInteractorInputProtocol> interactor;
|
31
|
+
@property (nonatomic, strong) VIPERWireFrame *wireFrame;
|
32
|
+
/**
|
33
|
+
* Add here your methods for communication VIEWCONTROLLER/WIREFRAME -> PRESENTER
|
34
|
+
*/
|
35
|
+
@end
|
36
|
+
|
37
|
+
@protocol VIPERInteractorOutputProtocol
|
38
|
+
/**
|
39
|
+
* Add here your methods for communication INTERACTOR -> PRESENTER
|
40
|
+
*/
|
41
|
+
@end
|
42
|
+
|
43
|
+
@protocol VIPERInteractorInputProtocol
|
44
|
+
@required
|
45
|
+
@property (nonatomic, weak) id <VIPERInteractorOutputProtocol> presenter;
|
46
|
+
/**
|
47
|
+
* Add here your methods for communication PRESENTER -> INTERACTOR
|
48
|
+
*/
|
49
|
+
@end
|
50
|
+
|
51
|
+
|
52
|
+
@protocol VIPERDataManagerInputProtocol
|
53
|
+
@property (nonatomic, weak) id <VIPERDataManagerOutputProtocol> interactor;
|
54
|
+
/**
|
55
|
+
* Add here your methods for communication INTERACTOR -> DATAMANAGER
|
56
|
+
*/
|
57
|
+
@end
|
58
|
+
|
59
|
+
@protocol VIPERDataManagerOutputProtocol
|
60
|
+
@property (nonatomic, strong) id <VIPERDataManagerInputProtocol> dataManager;
|
61
|
+
/**
|
62
|
+
* Add here your methods for communication DATAMANAGER -> INTERACTOR
|
63
|
+
*/
|
64
|
+
@end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
//
|
2
|
+
// Created by Pedro Piñera Buendía on 2014.
|
3
|
+
// Copyright (c) 2014 Redbooth. All rights reserved.
|
4
|
+
//
|
5
|
+
|
6
|
+
#import <UIKit/UIKit.h>
|
7
|
+
#import "VIPERProtocols.h"
|
8
|
+
|
9
|
+
@interface VIPERViewController : UIViewController <VIPERViewProtocol>
|
10
|
+
|
11
|
+
@property (nonatomic, strong) id <VIPERPresenterProtocol> presenter;
|
12
|
+
|
13
|
+
@end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
//
|
2
|
+
// Created by Pedro Piñera Buendía on 2014.
|
3
|
+
// Copyright (c) 2014 Redbooth. All rights reserved.
|
4
|
+
//
|
5
|
+
|
6
|
+
#import "VIPERViewController.h"
|
7
|
+
|
8
|
+
@implementation VIPERViewController
|
9
|
+
|
10
|
+
#pragma mark - ViewController Lifecycle
|
11
|
+
|
12
|
+
- (void)viewDidLoad
|
13
|
+
{
|
14
|
+
[super viewDidLoad];
|
15
|
+
}
|
16
|
+
|
17
|
+
- (void)viewDidDisappear:(BOOL)animated
|
18
|
+
{
|
19
|
+
[super viewDidDisappear:animated];
|
20
|
+
}
|
21
|
+
|
22
|
+
- (void)viewWillAppear:(BOOL)animated
|
23
|
+
{
|
24
|
+
[super viewWillAppear:animated];
|
25
|
+
}
|
26
|
+
|
27
|
+
- (void)viewWillDisappear:(BOOL)animated
|
28
|
+
{
|
29
|
+
[super viewWillDisappear:animated];
|
30
|
+
}
|
31
|
+
|
32
|
+
@end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
//
|
2
|
+
// Created by Pedro Piñera Buendía on 2014.
|
3
|
+
// Copyright (c) 2014 Redbooth. All rights reserved.
|
4
|
+
//
|
5
|
+
|
6
|
+
#import <Foundation/Foundation.h>
|
7
|
+
#import "VIPERProtocols.h"
|
8
|
+
#import "VIPERViewController.h"
|
9
|
+
#import "VIPERDataManager.h"
|
10
|
+
#import "VIPERInteractor.h"
|
11
|
+
#import "VIPERPresenter.h"
|
12
|
+
#import "VIPERWireframe.h"
|
13
|
+
#import <UIKit/UIKit.h>
|
14
|
+
|
15
|
+
@interface VIPERWireFrame : NSObject
|
16
|
+
|
17
|
+
+ (void)presentVIPERModuleFrom:(id)fromView;
|
18
|
+
|
19
|
+
@end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
//
|
2
|
+
// Created by Pedro Piñera Buendía on 2014.
|
3
|
+
// Copyright (c) 2014 Redbooth. All rights reserved.
|
4
|
+
//
|
5
|
+
|
6
|
+
#import "VIPERWireFrame.h"
|
7
|
+
|
8
|
+
@implementation VIPERWireFrame
|
9
|
+
|
10
|
+
+ (void)presentVIPERModuleFrom:(UIViewController*)fromViewController
|
11
|
+
{
|
12
|
+
// Generating module components
|
13
|
+
UIViewController <VIPERViewProtocol> *viewController = [[VIPERViewController alloc] init];
|
14
|
+
id <VIPERPresenterProtocol, VIPERInteractorOutputProtocol> presenter = [VIPERPresenter new];
|
15
|
+
id <VIPERInteractorInputProtocol, VIPERDataManagerOutputProtocol> interactor = [VIPERInteractor new];
|
16
|
+
id <VIPERDataManagerInputProtocol> dataManager = [VIPERDataManager new];
|
17
|
+
VIPERWireFrame *wireFrame = [VIPERWireFrame new];
|
18
|
+
|
19
|
+
// Connecting
|
20
|
+
viewController.presenter = presenter;
|
21
|
+
presenter.view = viewController;
|
22
|
+
presenter.wireFrame = wireFrame;
|
23
|
+
presenter.interactor = interactor;
|
24
|
+
interactor.presenter = presenter;
|
25
|
+
interactor.dataManager = dataManager;
|
26
|
+
dataManager.interactor = interactor;
|
27
|
+
|
28
|
+
//TOODO - New view controller presentation (present, push, pop, .. )
|
29
|
+
}
|
30
|
+
|
31
|
+
@end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
3
|
+
<plist version="1.0">
|
4
|
+
<dict>
|
5
|
+
<key>Development</key>
|
6
|
+
<dict>
|
7
|
+
<key>AWSIdentityPoolId</key>
|
8
|
+
<string></string>
|
9
|
+
<key>S3BucketName</key>
|
10
|
+
<string></string>
|
11
|
+
<key>ServicesURL</key>
|
12
|
+
<string></string>
|
13
|
+
<key>OneSignalAppId</key>
|
14
|
+
<string></string>
|
15
|
+
<key>ServicesVersion</key>
|
16
|
+
<string></string>
|
17
|
+
</dict>
|
18
|
+
<key>QA</key>
|
19
|
+
<dict>
|
20
|
+
<key>AWSIdentityPoolId</key>
|
21
|
+
<string></string>
|
22
|
+
<key>S3BucketName</key>
|
23
|
+
<string></string>
|
24
|
+
<key>ServicesURL</key>
|
25
|
+
<string></string>
|
26
|
+
<key>OneSignalAppId</key>
|
27
|
+
<string></string>
|
28
|
+
<key>ServicesVersion</key>
|
29
|
+
<string></string>
|
30
|
+
</dict>
|
31
|
+
<key>Staging</key>
|
32
|
+
<dict>
|
33
|
+
<key>AWSIdentityPoolId</key>
|
34
|
+
<string></string>
|
35
|
+
<key>S3BucketName</key>
|
36
|
+
<string></string>
|
37
|
+
<key>ServicesURL</key>
|
38
|
+
<string></string>
|
39
|
+
<key>OneSignalAppId</key>
|
40
|
+
<string></string>
|
41
|
+
<key>ServicesVersion</key>
|
42
|
+
<string></string>
|
43
|
+
</dict>
|
44
|
+
<key>Production</key>
|
45
|
+
<dict>
|
46
|
+
<key>AWSIdentityPoolId</key>
|
47
|
+
<string></string>
|
48
|
+
<key>S3BucketName</key>
|
49
|
+
<string></string>
|
50
|
+
<key>ServicesURL</key>
|
51
|
+
<string></string>
|
52
|
+
<key>OneSignalAppId</key>
|
53
|
+
<string></string>
|
54
|
+
<key>ServicesVersion</key>
|
55
|
+
<string></string>
|
56
|
+
</dict>
|
57
|
+
</dict>
|
58
|
+
</plist>
|
@@ -0,0 +1,50 @@
|
|
1
|
+
//
|
2
|
+
// Config.swift
|
3
|
+
// MVCGEN
|
4
|
+
//
|
5
|
+
// Created by Daniel Martinez on 23/7/18.
|
6
|
+
// Copyright © 2018 DanielMartinez. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
|
10
|
+
import UIKit
|
11
|
+
|
12
|
+
class Config: NSObject {
|
13
|
+
|
14
|
+
// MARK: - Singleton
|
15
|
+
|
16
|
+
static let sharedInstance = Config()
|
17
|
+
|
18
|
+
var config: NSDictionary?
|
19
|
+
|
20
|
+
private override init() {
|
21
|
+
|
22
|
+
let currentConfiguration = Bundle.main.object(forInfoDictionaryKey: "Config")!
|
23
|
+
|
24
|
+
let path = Bundle.main.path(forResource: "Config", ofType: "plist")!
|
25
|
+
|
26
|
+
self.config = NSDictionary(contentsOfFile: path)?.object(forKey: currentConfiguration) as? NSDictionary
|
27
|
+
}
|
28
|
+
|
29
|
+
func servicesURL() -> String {
|
30
|
+
return self.config?.object(forKey: "ServicesURL") as? String ?? ""
|
31
|
+
}
|
32
|
+
|
33
|
+
func servicesVersion() -> String {
|
34
|
+
return self.config?.object(forKey: "ServicesVersion") as? String ?? ""
|
35
|
+
}
|
36
|
+
|
37
|
+
func oneSignalAppId() -> String {
|
38
|
+
return self.config?.object(forKey: "OneSignalAppId") as? String ?? ""
|
39
|
+
}
|
40
|
+
|
41
|
+
func s3BucketName() -> String {
|
42
|
+
return self.config?.object(forKey: "S3BucketName") as? String ?? ""
|
43
|
+
}
|
44
|
+
|
45
|
+
func awsIdentityPoolId() -> String {
|
46
|
+
return self.config?.object(forKey: "AWSIdentityPoolId") as? String ?? ""
|
47
|
+
}
|
48
|
+
|
49
|
+
}
|
50
|
+
|
@@ -0,0 +1,110 @@
|
|
1
|
+
//
|
2
|
+
// Buttons.swift
|
3
|
+
// MVCGEN
|
4
|
+
//
|
5
|
+
// Created by Daniel Martinez on 23/7/18.
|
6
|
+
// Copyright © 2018 DanielMartinez. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import UIKit
|
10
|
+
|
11
|
+
class LoadingButton: UIButton {
|
12
|
+
|
13
|
+
var originalButtonText: String?
|
14
|
+
var activityIndicator: UIActivityIndicatorView!
|
15
|
+
var activityIndicatorColor: UIColor = UIColor.white {
|
16
|
+
didSet {
|
17
|
+
if self.activityIndicator != nil {
|
18
|
+
self.activityIndicator.color = activityIndicatorColor
|
19
|
+
}
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
func showLoading() {
|
24
|
+
self.isEnabled = false
|
25
|
+
originalButtonText = self.titleLabel?.text
|
26
|
+
self.setTitle("", for: .normal)
|
27
|
+
|
28
|
+
if (activityIndicator == nil) {
|
29
|
+
activityIndicator = createActivityIndicator()
|
30
|
+
}
|
31
|
+
|
32
|
+
showSpinning()
|
33
|
+
}
|
34
|
+
|
35
|
+
func hideLoading() {
|
36
|
+
self.isEnabled = true
|
37
|
+
self.setTitle(originalButtonText, for: .normal)
|
38
|
+
if let activityIndicator = self.activityIndicator {
|
39
|
+
activityIndicator.stopAnimating()
|
40
|
+
}
|
41
|
+
}
|
42
|
+
|
43
|
+
private func createActivityIndicator() -> UIActivityIndicatorView {
|
44
|
+
let activityIndicator = UIActivityIndicatorView()
|
45
|
+
activityIndicator.hidesWhenStopped = true
|
46
|
+
activityIndicator.color = activityIndicatorColor
|
47
|
+
return activityIndicator
|
48
|
+
}
|
49
|
+
|
50
|
+
private func showSpinning() {
|
51
|
+
activityIndicator.translatesAutoresizingMaskIntoConstraints = false
|
52
|
+
self.addSubview(activityIndicator)
|
53
|
+
centerActivityIndicatorInButton()
|
54
|
+
activityIndicator.startAnimating()
|
55
|
+
}
|
56
|
+
|
57
|
+
private func centerActivityIndicatorInButton() {
|
58
|
+
let xCenterConstraint = NSLayoutConstraint(item: self, attribute: .centerX, relatedBy: .equal, toItem: activityIndicator, attribute: .centerX, multiplier: 1, constant: 0)
|
59
|
+
self.addConstraint(xCenterConstraint)
|
60
|
+
|
61
|
+
let yCenterConstraint = NSLayoutConstraint(item: self, attribute: .centerY, relatedBy: .equal, toItem: activityIndicator, attribute: .centerY, multiplier: 1, constant: 0)
|
62
|
+
self.addConstraint(yCenterConstraint)
|
63
|
+
}
|
64
|
+
|
65
|
+
}
|
66
|
+
|
67
|
+
@IBDesignable
|
68
|
+
class GradientButton: UIButton {
|
69
|
+
let gradientLayer = CAGradientLayer()
|
70
|
+
|
71
|
+
@IBInspectable
|
72
|
+
var topGradientColor: UIColor? {
|
73
|
+
didSet {
|
74
|
+
setGradient(topGradientColor: topGradientColor, bottomGradientColor: bottomGradientColor)
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
@IBInspectable
|
79
|
+
var bottomGradientColor: UIColor? {
|
80
|
+
didSet {
|
81
|
+
setGradient(topGradientColor: topGradientColor, bottomGradientColor: bottomGradientColor)
|
82
|
+
}
|
83
|
+
}
|
84
|
+
|
85
|
+
private func setGradient(topGradientColor: UIColor?, bottomGradientColor: UIColor?) {
|
86
|
+
if let topGradientColor = topGradientColor, let bottomGradientColor = bottomGradientColor {
|
87
|
+
gradientLayer.frame = bounds
|
88
|
+
gradientLayer.colors = [topGradientColor.cgColor, bottomGradientColor.cgColor]
|
89
|
+
gradientLayer.borderColor = layer.borderColor
|
90
|
+
gradientLayer.borderWidth = layer.borderWidth
|
91
|
+
gradientLayer.cornerRadius = layer.cornerRadius
|
92
|
+
layer.insertSublayer(gradientLayer, at: 0)
|
93
|
+
} else {
|
94
|
+
gradientLayer.removeFromSuperlayer()
|
95
|
+
}
|
96
|
+
}
|
97
|
+
}
|
98
|
+
|
99
|
+
extension UIButton {
|
100
|
+
|
101
|
+
func addShadow(){
|
102
|
+
// Shadow and Radius
|
103
|
+
self.layer.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.15).cgColor
|
104
|
+
self.layer.shadowOffset = CGSize(width: 0.0, height: 2.0)
|
105
|
+
self.layer.shadowOpacity = 1.0
|
106
|
+
self.layer.shadowRadius = 0.0
|
107
|
+
self.layer.masksToBounds = false
|
108
|
+
}
|
109
|
+
}
|
110
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
//
|
2
|
+
// ColorHex.swift
|
3
|
+
// MVCGEN
|
4
|
+
//
|
5
|
+
// Created by Daniel Martinez on 23/7/18.
|
6
|
+
// Copyright © 2018 DanielMartinez. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import UIKit
|
10
|
+
|
11
|
+
extension UIColor {
|
12
|
+
|
13
|
+
convenience init(hex: String) {
|
14
|
+
let scanner = Scanner(string: hex)
|
15
|
+
scanner.scanLocation = 0
|
16
|
+
|
17
|
+
var rgbValue: UInt64 = 0
|
18
|
+
|
19
|
+
scanner.scanHexInt64(&rgbValue)
|
20
|
+
|
21
|
+
let r = (rgbValue & 0xff0000) >> 16
|
22
|
+
let g = (rgbValue & 0xff00) >> 8
|
23
|
+
let b = rgbValue & 0xff
|
24
|
+
|
25
|
+
self.init(
|
26
|
+
red: CGFloat(r) / 0xff,
|
27
|
+
green: CGFloat(g) / 0xff,
|
28
|
+
blue: CGFloat(b) / 0xff, alpha: 1
|
29
|
+
)
|
30
|
+
}
|
31
|
+
|
32
|
+
}
|
@@ -0,0 +1,98 @@
|
|
1
|
+
//
|
2
|
+
// Config.swift
|
3
|
+
// MVCGEN
|
4
|
+
//
|
5
|
+
// Created by Daniel Martinez on 23/7/18.
|
6
|
+
// Copyright © 2018 DanielMartinez. All rights reserved.
|
7
|
+
//
|
8
|
+
|
9
|
+
import Alamofire
|
10
|
+
import SwiftyJSON
|
11
|
+
import NotificationBannerSwift
|
12
|
+
|
13
|
+
class APIHelper {
|
14
|
+
|
15
|
+
static let sharedInstance = APIHelper()
|
16
|
+
|
17
|
+
lazy var servicesURL = Config.sharedInstance.servicesURL()
|
18
|
+
|
19
|
+
lazy var servicesVersion = Config.sharedInstance.servicesVersion()
|
20
|
+
|
21
|
+
lazy var successBanner = NotificationBanner(title: "", subtitle: "", style: .success)
|
22
|
+
|
23
|
+
lazy var errorBanner = NotificationBanner(title: "", subtitle: "", style: .danger)
|
24
|
+
|
25
|
+
func getHeaders() -> [String : String]? {
|
26
|
+
if let userId = UserDefaults.standard.value(forKey: Constants.userId) as? String, let token = UserDefaults.standard.value(forKey: Constants.userAuthTokenKey) as? String {
|
27
|
+
// Token stored in UserDefaults.
|
28
|
+
var userAuthB64 = "Basic "
|
29
|
+
let userAuth = "\(userId):\(token)"
|
30
|
+
let userAuthData = userAuth.data(using: .utf8)!
|
31
|
+
userAuthB64 += userAuthData.base64EncodedString(options: [])
|
32
|
+
|
33
|
+
// TODO: check Accept variable, change mvcgen for project name
|
34
|
+
return [
|
35
|
+
"Authorization" : userAuthB64,
|
36
|
+
"Content-Type" : "application/json",
|
37
|
+
"Accept" : "application/vnd.mvcgen.v"+self.servicesVersion+"+json",
|
38
|
+
"X-app-version" : self.getVersionBuild(),
|
39
|
+
"X-app-device" : self.getDeviceInfo()
|
40
|
+
]
|
41
|
+
}
|
42
|
+
return nil
|
43
|
+
|
44
|
+
}
|
45
|
+
|
46
|
+
func getVersionBuild() -> String {
|
47
|
+
var versionBuild = ""
|
48
|
+
if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
|
49
|
+
versionBuild = version
|
50
|
+
}
|
51
|
+
if let buildVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
|
52
|
+
versionBuild += " " + buildVersion
|
53
|
+
}
|
54
|
+
return versionBuild
|
55
|
+
}
|
56
|
+
|
57
|
+
func getDeviceInfo() -> String {
|
58
|
+
return UIDevice.current.model + " iOS: " + UIDevice.current.systemVersion
|
59
|
+
}
|
60
|
+
|
61
|
+
func wsResponse(onError error: Int){
|
62
|
+
switch error {
|
63
|
+
case 300..<400:
|
64
|
+
// Bad auth error
|
65
|
+
print("error is \(error)")
|
66
|
+
// let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate
|
67
|
+
// appDelegate.logout()
|
68
|
+
case 801:
|
69
|
+
break
|
70
|
+
default:
|
71
|
+
print("error is \(error)")
|
72
|
+
break
|
73
|
+
}
|
74
|
+
}
|
75
|
+
|
76
|
+
func showSuccesMessage(with title : String, and subtitle : String){
|
77
|
+
NotificationBannerQueue.default.removeAll()
|
78
|
+
if !successBanner.isDisplaying{
|
79
|
+
successBanner.titleLabel?.text = title
|
80
|
+
successBanner.subtitleLabel?.text = subtitle
|
81
|
+
successBanner.show()
|
82
|
+
}
|
83
|
+
}
|
84
|
+
|
85
|
+
func showErrorMessage(with title : String, and subtitle : String){
|
86
|
+
NotificationBannerQueue.default.removeAll()
|
87
|
+
if !errorBanner.isDisplaying{
|
88
|
+
errorBanner.titleLabel?.text = title
|
89
|
+
errorBanner.subtitleLabel?.text = subtitle
|
90
|
+
errorBanner.show()
|
91
|
+
}
|
92
|
+
}
|
93
|
+
}
|
94
|
+
|
95
|
+
enum VoidResult {
|
96
|
+
case success
|
97
|
+
case failure
|
98
|
+
}
|