-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGlobals.swift
229 lines (193 loc) · 7.29 KB
/
Globals.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
//
// Globals.swift
// FieldTasksApp
// Cache frequently used values for user's account.
//
// Created by CRH on 8/26/16.
// Copyright © 2016 CRH. All rights reserved.
//
import UIKit
import FlatUIKit
import SVProgressHUD
import SwiftDate
class Globals {
static let shared = Globals()
var utcFormatter = DateFormatter() // Convert UTC date strings
var dateFormatter = DateFormatter() // For visual display
var timeFormatter = DateFormatter() // For visual display
let smallFont = UIFont.flatFont(ofSize: 13.0)!
let mediumFont = UIFont.flatFont(ofSize: 16.0)!
let bigFont = UIFont.boldFlatFont(ofSize: 18.0)!
let textColor = UIColor.clouds()
let bgColor = UIColor.greenSea()
let barColor = UIColor.asbestos()
let barButtonColor = UIColor.peterRiver()
let selectionColor = UIColor.wetAsphalt()
// MARK: Login Tokens -------------------------------------------------------------------------------
private var _login : Login?
private var login : Login {
get {
if let login = _login {
return login
} else {
_login = CoreDataMgr.fetchLogin(context: CoreDataMgr.shared.mainThreadContext!)
return _login!
}
}
}
var loginToken : String {
get {
let login = self.login
return login.token ?? ""
}
}
var loginEmail : String {
get {
// We'll use
let login = self.login
return login.email ?? ""
}
set(newEmail) {
let login = self.login
login.email = newEmail
}
}
var tenantName : String {
get {
let login = self.login
return login.tenant ?? ""
}
set(newTenant) {
let login = self.login
login.tenant = newTenant
}
}
var tokenExpired : Bool {
get {
let login = self.login
if let expiration = login.expiration {
let dateTimeStamp = Date(timeIntervalSince1970: TimeInterval(truncating: expiration))
return Date().timeIntervalSince(dateTimeStamp) > 0
}
return true
}
}
func setToken(token : String, expiration: Int64, email: String, tenant: String) {
let login = self.login
login.token = token
login.expiration = expiration as NSNumber
login.email = email
login.tenant = tenant
CoreDataMgr.shared.saveOnMainThread()
}
func clearToken() {
login.token = nil
login.expiration = 0
CoreDataMgr.shared.saveOnMainThread()
NotificationCenter.default.post(Notification(name: Notification.Name(rawValue: cAppLoggedOut)))
}
init() {
utcFormatter.locale = Locale(identifier: "en_US_POSIX")
utcFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"
utcFormatter.timeZone = TimeZone(secondsFromGMT: 0)
dateFormatter.dateStyle = .medium
dateFormatter.timeStyle = .short
timeFormatter.dateStyle = .none
timeFormatter.timeStyle = .long
UIBarButtonItem.configureFlatButtons(with: barButtonColor, highlightedColor: barButtonColor, cornerRadius: 3.0)
SVProgressHUD.setMinimumDismissTimeInterval(3)
// tab bar
UITabBar.appearance().tintColor = UIColor.clouds()
UITabBar.appearance().barTintColor = UIColor.peterRiver()
// Text
UITextField.appearance().tintColor = UIColor.midnightBlue()
UITextView.appearance().tintColor = UIColor.midnightBlue()
}
class func saveSettingsValue(key: String, value: AnyObject) {
UserDefaults.standard.set(value, forKey: key)
UserDefaults.standard.synchronize()
}
class func getSettingsValue(key: String) -> AnyObject? {
return UserDefaults.standard.object(forKey: key) as AnyObject?
}
// MARK: Dates -------------------------------------------------------------------------------
func encodeDate(date: Date) -> String? {
let dateString = utcFormatter.string(from: date)
return dateString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
}
func formatDate(date: Date) -> String {
let dateString = dateFormatter.string(from: date)
return dateString
}
func formatTime(date: Date) -> String {
let timeString = timeFormatter.string(from: date)
return timeString
}
private func _stringToDate(dateString: String, format: String ) -> Date? {
let dateStringFormatter = DateFormatter()
dateStringFormatter.dateFormat = format
dateStringFormatter.locale = Locale(identifier: "en_US_POSIX")
if let d = dateStringFormatter.date(from: dateString) {
return Date(timeInterval:0, since:d)
}
return nil
}
func stringToDate(dateString: String) -> Date? {
return _stringToDate(dateString: dateString, format: "yyyy-MM-dd")
}
func serverStringToDate(dateString: String) -> Date? {
return _stringToDate(dateString: dateString, format: "E, dd MMM yyyy HH:mm:ss zzz")
}
}
// MARK: Files -------------------------------------------------------------------------------
func getDocumentsDirectory() -> URL {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]
return documentsDirectory
}
// Use caches directly for images. this means that we need to make sure images are uploaded to server before placed here so they aren't lost.
func getImageDirectory() -> URL {
let paths = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)
let documentsDirectory = paths[0]
return documentsDirectory
}
func randomName(length: Int) -> String {
let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
let len = UInt32(letters.length)
var randomString = ""
for _ in 0 ..< length {
let rand = arc4random_uniform(len)
var nextChar = letters.character(at: Int(rand))
randomString += NSString(characters: &nextChar, length: 1) as String
}
return randomString
}
func className(object: Any) -> String {
return (object is Any.Type) ? "\(object)" : "\(type(of: object))"
}
// MARK: Error Asserts -------------------------------------------------------------------------------
enum FTError : Error {
case RunTimeError(String)
}
func FTAssert(isTrue: Bool, error: String, method: String = #function, line: Int = #line) {
if !isTrue {
FTErrorMessage(error: error, method: method, line: line)
}
}
func FTAssert(exists: Any?, error: String, method: String = #function, line: Int = #line) {
if exists == nil {
FTErrorMessage(error: error, method: method, line: line)
}
}
func FTAssertString(error: String?, method: String = #function, line: Int = #line) {
if let error = error {
FTErrorMessage(error: error, method: method, line: line)
}
}
func FTErrorMessage(error: String, method: String = #function, line: Int = #line) {
print("Assert failure: \(error) - \(method):\(line)")
}
func FTPrint(s: String, method: String = #function, line: Int = #line) {
let nowString = Globals.shared.formatTime(date: Date())
print(s + " : " + nowString)
}