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.

502 lines
14 KiB

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