You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

484 lines
13 KiB

6 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
6 years ago
5 years ago
5 years ago
6 years ago
  1. //
  2. // AppConstants.swift
  3. // GMERemittance
  4. //
  5. // Created by gme_2 on 10/09/2018.
  6. // Copyright © 2018 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import Foundation
  9. class AppConstants {
  10. static let uuid = "uuid"
  11. static let dateFormat = "yyyy-MM-dd"
  12. static let humanReadableDateFormat = "MMM d, yyyy"
  13. static let errorBorderWidth: CGFloat = 0.1
  14. static let emergencyLogoutErrorCode = -1111
  15. static let maxKoreanMobileNoLength = 11
  16. static let MainWireFrameNotificationName = "MainViewControllerSelect"
  17. static let yearlyLimitNotification = "Yearly LImit"
  18. }
  19. enum Devices {
  20. case iphone5
  21. case iphone678
  22. case iphone678Plus
  23. case iphoneX
  24. case ipad
  25. case other
  26. }
  27. //pennyTestStatus='0'-----0 not started, 1 requested , 2 completed
  28. enum PennyTestStatusCode: String {
  29. case notStarted = "0"
  30. case requested = "1"
  31. case completed = "2"
  32. case cancelled = "3"
  33. }
  34. enum Language: String {
  35. case en
  36. case kr
  37. case kh
  38. case lk
  39. case th
  40. case id
  41. case mn
  42. case mm
  43. case np
  44. case bd
  45. case ru
  46. case uz
  47. case vn
  48. var code: String {
  49. switch self {
  50. case .en, .th, .id, .mn, .uz:
  51. return self.rawValue
  52. case .kr:
  53. return "ko"
  54. case .kh:
  55. return "km"
  56. case .lk:
  57. return "si"
  58. case .mm:
  59. return "my"
  60. case .np:
  61. return "ne"
  62. case .bd:
  63. return "bn"
  64. case .ru:
  65. return "ru-RU"
  66. case .vn:
  67. return "vi-VN"
  68. }
  69. }
  70. var title: String {
  71. switch self {
  72. case .en:
  73. return "English"
  74. case .kr:
  75. return "한국"
  76. case .kh:
  77. return "ភាសាខ្មែរ"
  78. case .lk:
  79. return "සිංහල"
  80. case .th:
  81. return "ไทย"
  82. case .id:
  83. return "Bahasa Indonesia"
  84. case .mn:
  85. return "Монгол"
  86. case .mm:
  87. return "Myanmar"
  88. case .np:
  89. return "नेपाली"
  90. case .bd:
  91. return "বাংলা"
  92. case .ru:
  93. return "русский"
  94. case .uz:
  95. return "O\'zbek"
  96. case .vn:
  97. return "Tiếng Việt"
  98. }
  99. }
  100. }
  101. extension String {
  102. var languageCode: Language? {
  103. switch self {
  104. case "ko", "kr":
  105. return .kr
  106. case "km", "kh":
  107. return .kh
  108. case "si", "lk":
  109. return .lk
  110. case "my", "mm":
  111. return .mm
  112. case "ne", "np":
  113. return .np
  114. case "bn", "bd":
  115. return .bd
  116. case "ru-RU", "ru":
  117. return .ru
  118. case "vi-VN", "vn":
  119. return .vn
  120. case "en", "th", "id", "mn", "uz":
  121. return Language.init(rawValue: self)!
  122. default:
  123. return nil
  124. }
  125. }
  126. }
  127. class Utility {
  128. static let database = GMEDB.shared
  129. static func getDeviceModel() -> Devices {
  130. if UIDevice().userInterfaceIdiom == .phone {
  131. switch UIScreen.main.nativeBounds.height {
  132. case 1136:
  133. return .iphone5
  134. case 1334:
  135. return .iphone678
  136. case 2208:
  137. return .iphone678Plus
  138. case 2436:
  139. return .iphoneX
  140. default:
  141. return .other
  142. }
  143. } else {
  144. return .ipad
  145. }
  146. }
  147. static func getLanguageHeader(for currentLanugage: String) -> String {
  148. var header = ""
  149. switch currentLanugage {
  150. case "ko":
  151. header = "kr"
  152. case "km":
  153. header = "kh"
  154. case "si":
  155. header = "lk"
  156. case "my":
  157. header = "mm"
  158. case "ne":
  159. header = "np"
  160. case "bn":
  161. header = "bd"
  162. case "ru-RU":
  163. header = "ru"
  164. case "vi-VN":
  165. header = "vn"
  166. case "uz":
  167. header = "uz"
  168. case "mn":
  169. header = "mn"
  170. case "id":
  171. header = "id"
  172. case "th":
  173. header = "th"
  174. default:
  175. header = "en"
  176. }
  177. return header
  178. }
  179. static func isVerifiedUser() -> Bool {
  180. return database.user.bool(.verified)
  181. }
  182. static func didSubmitKyc() -> Bool {
  183. return database.user.bool(.kyc)
  184. }
  185. static func isCriticalUpdate() -> Bool {
  186. return database.app.string(.criticalUpdate)?.lowercased() == "Y".lowercased()
  187. }
  188. static func didPennyTestRequested() -> Bool {
  189. return database.user.string(.pennyTestStatusCode) ??
  190. "0" == PennyTestStatusCode.requested.rawValue
  191. }
  192. static func pennyTestPresentedOnce() -> Bool {
  193. return database.user.bool(.pennyTestPresentedOnce)
  194. }
  195. static func didPennyTestCancelled() -> Bool {
  196. return database.user.string(.pennyTestStatusCode) ??
  197. "0" == PennyTestStatusCode.cancelled.rawValue
  198. }
  199. static func didPennyTestNotInitiated() -> Bool {
  200. return database.user.string(.pennyTestStatusCode) ??
  201. PennyTestStatusCode.notStarted.rawValue == PennyTestStatusCode.notStarted.rawValue
  202. }
  203. static func pennyTestVerified() -> Bool {
  204. return database.user.string(.pennyTestStatusCode) ??
  205. PennyTestStatusCode.notStarted.rawValue == PennyTestStatusCode.completed.rawValue
  206. }
  207. static func shouldShowPennyTestError() -> Bool {
  208. return database.user.string(.pennyTestStatusCode) ??
  209. PennyTestStatusCode.notStarted.rawValue != PennyTestStatusCode.completed.rawValue
  210. }
  211. static func shouldShowPennyTestScreen() -> Bool {
  212. let completed = database.user.string(.pennyTestStatusCode) ??
  213. PennyTestStatusCode.notStarted.rawValue == PennyTestStatusCode.completed.rawValue
  214. let cancelled = Utility.didPennyTestCancelled()
  215. let requested = Utility.didPennyTestRequested()
  216. return !cancelled && !completed && !requested
  217. }
  218. static func getMyUserName() -> String {
  219. return database.user.string(.userId) ?? ""
  220. }
  221. static func getMyId() -> String {
  222. return database.user.string(.senderId) ?? ""
  223. }
  224. static func getMyKftcClientId() -> String {
  225. return database.user.string(.kftcClientId) ?? ""
  226. }
  227. static func getMyIdNumber() -> String {
  228. return database.user.string(.idNumber) ?? ""
  229. }
  230. static func getMyPrimaryAccountNumber() -> String {
  231. return database.user.string(.primaryAccountNumber) ?? ""
  232. }
  233. static func isValidEmail(email: String) -> Bool {
  234. let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
  235. let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegex)
  236. return emailTest.evaluate(with: email)
  237. }
  238. static func getCommaSeperatedString(numberString: String) -> String? {
  239. let text = numberString.extract(regex: "[0-9.]")
  240. if let number = Double(text) {
  241. let nsNumber = NSNumber.init(value: number)
  242. let currencyFormatter = NumberFormatter()
  243. currencyFormatter.locale = Locale(identifier: "en_US")
  244. currencyFormatter.numberStyle = .decimal
  245. let commaSeperatedNumberString = currencyFormatter.string(for: nsNumber)
  246. let text = commaSeperatedNumberString?.replacingOccurrences(of: ".", with: ",")
  247. return text
  248. }
  249. return nil
  250. }
  251. static func getCommaSeperatedStringWithDecimal(numberString: String) -> String? {
  252. let text = numberString.extract(regex: "[0-9.]")
  253. if let number = Double(text) {
  254. let nsNumber = NSNumber.init(value: number)
  255. let currencyFormatter = NumberFormatter()
  256. currencyFormatter.locale = Locale(identifier: "en_US")
  257. currencyFormatter.numberStyle = .decimal
  258. currencyFormatter.groupingSize = 3
  259. currencyFormatter.usesGroupingSeparator = true
  260. let commaSeperatedNumberString = currencyFormatter.string(for: nsNumber)
  261. return commaSeperatedNumberString
  262. }
  263. return nil
  264. }
  265. static func save(
  266. user: User?,
  267. accessCodeBase64: String? = nil,
  268. password: String? = nil,
  269. login: Bool? = false
  270. ) {
  271. if login ?? false {
  272. GMEDB
  273. .shared
  274. .user
  275. .set(accessCodeBase64, .accessCode)
  276. .set(user?.kftcClientId, .kftcClientId)
  277. }
  278. GMEDB
  279. .shared
  280. .setUser(user)
  281. // save remind day of KFTC Token
  282. let remindDay = calculateDDay(registDate: user?.accessTokenRegTime)
  283. // let remindDay = calculateDDay(registDate: "7/20/2018 4:49:32 PM")
  284. GMEDB.shared.user.set(remindDay, .remindKFTCTokenDay)
  285. guard let encryptedPassword = password else { return }
  286. let id = GMEDB.shared.user.string(.userId) ?? ""
  287. if id != KeyChain.shared.get(key: .id) {
  288. KeyChain.shared.remove(key: .biometricAuth)
  289. }
  290. KeyChain.shared.save(data: id, key: .id)
  291. KeyChain.shared.save(data: encryptedPassword, key: .password)
  292. KeyChain.shared.save(data: "1", key: .login)
  293. }
  294. static func calculateDDay(registDate: String?) -> String? {
  295. let dateFormatter = DateFormatter()
  296. dateFormatter.dateFormat = "M/d/yyyy h:mm:ss a"
  297. dateFormatter.locale = Locale(identifier: "ko_kr")
  298. dateFormatter.timeZone = TimeZone(abbreviation: "KST")
  299. var dateComponent = DateComponents()
  300. dateComponent.year = 1
  301. guard
  302. let resigstDate = registDate,
  303. let date = dateFormatter.date(from: resigstDate),
  304. let expireDate = Calendar.current.date(byAdding: dateComponent, to: date) else {return nil}
  305. let now = Date()
  306. let calendar = Calendar.current
  307. let startDate = calendar.startOfDay(for: now)
  308. let endDate = calendar.startOfDay(for: expireDate)
  309. guard let remindDay = calendar.dateComponents([.day], from: startDate, to: endDate).day else {
  310. return nil
  311. }
  312. return "\(remindDay)"
  313. }
  314. static func numberWithoutprecedingZero(str: String) -> String {
  315. let formatter = NumberFormatter()
  316. let number = formatter.number(from: str)
  317. return "\(number ?? 0)"
  318. }
  319. static func getAppVersion () -> String? {
  320. let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
  321. return version
  322. }
  323. static func getOsVersion() -> String {
  324. let version = UIDevice.current.systemVersion
  325. return version
  326. }
  327. static func getPhoneBrand() -> String {
  328. let phoneName = UIDevice.current.model
  329. return phoneName
  330. }
  331. static func getPhoneOs() -> String {
  332. let os = UIDevice.current.systemName
  333. return os
  334. }
  335. static func getUUid() -> String? {
  336. let uuid = UIDevice.current.identifierForVendor?.uuidString
  337. return uuid
  338. }
  339. static func getCliendId() -> String {
  340. return "172017F9EC11222E8107142733"
  341. }
  342. }
  343. extension Utility {
  344. static func getLanguages() -> [SendMoneyCountryViewModel] {
  345. let english = SendMoneyCountryViewModel()
  346. english.name = "english_language_text".localized()
  347. english.id = "english_language_text"
  348. english.title = "English"
  349. english.code = "en"
  350. let korean = SendMoneyCountryViewModel()
  351. korean.name = "korean_language_text".localized()
  352. korean.id = "korean_language_text"
  353. korean.title = "한국"
  354. korean.code = "kr"
  355. let cambodia = SendMoneyCountryViewModel()
  356. cambodia.name = "cambodia_lanugage_text".localized()
  357. cambodia.id = "cambodia_lanugage_text"
  358. cambodia.title = "ភាសាខ្មែរ"
  359. cambodia.code = "kh"
  360. let srilanka = SendMoneyCountryViewModel()
  361. srilanka.name = "srilanka_lanugage_text".localized()
  362. srilanka.id = "srilanka_lanugage_text"
  363. srilanka.title = "සිංහල"
  364. srilanka.code = "lk"
  365. let myanmar = SendMoneyCountryViewModel()
  366. myanmar.name = "myanmar_language_text".localized()
  367. myanmar.id = "myanmar_language_text"
  368. myanmar.title = "Myanmar"
  369. myanmar.code = "mm"
  370. let russian = SendMoneyCountryViewModel()
  371. russian.name = "russian_langugae_text".localized()
  372. russian.id = "русский"
  373. russian.title = "русский"
  374. russian.code = "ru"
  375. let vietnam = SendMoneyCountryViewModel()
  376. vietnam.name = "vietnam_language_text".localized()
  377. vietnam.id = "vietnam_language_text"
  378. vietnam.title = "Tiếng Việt"
  379. vietnam.code = "vn"
  380. let thailand = SendMoneyCountryViewModel()
  381. thailand.name = "thailand_language_text".localized()
  382. thailand.id = "thailand_language_text"
  383. thailand.title = "ไทย"
  384. thailand.code = "th"
  385. let indonesia = SendMoneyCountryViewModel()
  386. indonesia.name = "indonesia_language_text".localized()
  387. indonesia.id = "indonesia_language_text"
  388. indonesia.title = "Bahasa Indonesia"
  389. indonesia.code = "id"
  390. let mongolia = SendMoneyCountryViewModel()
  391. mongolia.name = "mongolia_language_text".localized()
  392. mongolia.id = "mongolia_language_text"
  393. mongolia.title = "Монгол"
  394. mongolia.code = "mn"
  395. let nepal = SendMoneyCountryViewModel()
  396. nepal.name = "nepali_language_text".localized()
  397. nepal.id = "nepali_language_text"
  398. nepal.title = "नेपाली"
  399. nepal.code = "np"
  400. let bangladesh = SendMoneyCountryViewModel()
  401. bangladesh.name = "bengali_language_text".localized()
  402. bangladesh.id = "bengali_language_text"
  403. bangladesh.title = "বাংলা"
  404. bangladesh.code = "bd"
  405. let uzbek = SendMoneyCountryViewModel()
  406. uzbek.name = "uzbek_language_text".localized()
  407. uzbek.id = "uzbek_language_text"
  408. uzbek.title = "O'zbek"
  409. uzbek.code = "uz"
  410. let languages = [
  411. english, bangladesh, cambodia, indonesia, korean, nepal, mongolia, myanmar, russian, srilanka,
  412. thailand, uzbek, vietnam
  413. ]
  414. return languages
  415. }
  416. }