AccountInputController.swift 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. //
  2. // AccountInputController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by User-Tangchao on 2024/10/22.
  6. //
  7. import Cocoa
  8. class AccountInputController: NSViewController {
  9. @IBOutlet weak var leftBox: NSBox!
  10. @IBOutlet weak var rightBox: NSBox!
  11. @IBOutlet weak var leftBackgroundIv: NSImageView!
  12. @IBOutlet weak var leftTitleLabel: NSTextField!
  13. @IBOutlet weak var leftListBox: NSBox!
  14. var glayer: CAGradientLayer?
  15. var rightListView: AccountRightListView?
  16. private var signInView_: AccountSignInView?
  17. private var loginView_: AccountLoginView?
  18. var rightDatas: [String] = [] {
  19. didSet {
  20. self.rightListView?.rightDatas = self.rightDatas
  21. }
  22. }
  23. var itemClick: KMCommonClickBlock?
  24. convenience init() {
  25. self.init(nibName: "AccountInputController", bundle: MainBundle)
  26. }
  27. override func viewDidLoad() {
  28. super.viewDidLoad()
  29. // Do view setup here.
  30. self.initSubviews()
  31. self.initDefaultValue()
  32. }
  33. func initDefaultValue() {
  34. self.leftBackgroundIv.image = NSImage(named: "KMImageNameAccountLeftBackgroundIcon")
  35. self.leftTitleLabel.stringValue = NSLocalizedString("Log in for a 7-Day Free Trial", comment: "")
  36. self.leftTitleLabel.font = .systemFont(ofSize: 20)
  37. self.leftTitleLabel.textColor = KMAppearance.themeColor()
  38. let gradientLayer = CAGradientLayer()
  39. let startColor = NSColor(red: 245/255.0, green: 73/255.0, blue: 212/255.0, alpha: 1.0)
  40. let endColor = NSColor(red: 125/255.0, green: 96/255.0, blue: 255/255.0, alpha: 1.0)
  41. gradientLayer.colors = [startColor, endColor]
  42. gradientLayer.startPoint = CGPoint(x: 0.5, y: 1)
  43. gradientLayer.endPoint = CGPoint(x: 0.5, y: 0)
  44. //// gradientLayer.locations = [0, 1]
  45. // self.leftTitleLabel.wantsLayer = true
  46. gradientLayer.frame = self.leftListBox.bounds
  47. //// gradientLayer.mask = self.leftTitleLabel.layer
  48. //// self.leftTitleLabel.layer?.frame = gradientLayer.bounds
  49. // self.glayer = gradientLayer
  50. //
  51. // self.leftBox.contentView?.wantsLayer = true
  52. //// self.leftBox.contentView?.layer?.insertSublayer(gradientLayer, at: 0)
  53. // self.leftBox.contentView?.layer?.addSublayer(gradientLayer)
  54. // self.leftTitleLabel.layer?.backgroundColor = NSColor.red.cgColor
  55. // self.leftTitleLabel.layer?.addSublayer(gradientLayer)
  56. self.leftListBox.wantsLayer = true
  57. self.leftListBox.layer?.addSublayer(gradientLayer)
  58. // 假设你已经有一个NSTextField实例叫textField
  59. // NSTextField *textField = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 50)];
  60. // 创建CAGradientLayer实例
  61. // CAGradientLayer *gradientLayer = [CAGradientLayer layer];
  62. // gradientLayer.frame = textField.bounds; // 确保渐变层的大小和位置与textField相匹配
  63. // gradientLayer.colors = @[(id)[NSColor redColor].CGColor, (id)[NSColor blueColor].CGColor]; // 设置渐变色
  64. // 将textField的layer的背景色设置为Clear Color
  65. // [textField.layer setBackgroundColor: [NSColor clearColor].CGColor];
  66. // 添加渐变层作为子层
  67. // [textField.layer addSublayer:gradientLayer];
  68. // 如果需要,你可以继续自定义gradientLayer的其他属性,例如startPoint和endPoint来改变渐变方向
  69. self.leftListBox.borderWidth = 0
  70. self.leftListBox.fillColor = .clear
  71. self.leftBox.borderWidth = 0
  72. self.rightBox.borderWidth = 0
  73. }
  74. func initSubviews() {
  75. let rightListView = AccountRightListView.createFromNib()
  76. self.leftListBox.contentView = rightListView
  77. self.rightListView = rightListView
  78. rightListView?.rightDatas = self.rightDatas
  79. }
  80. func goToSignIn() {
  81. self._showSignInView()
  82. }
  83. func gotoLogin() {
  84. self._showLoginView()
  85. }
  86. private func _showSignInView() {
  87. let view = AccountSignInView.createFromNib()
  88. self.rightBox.contentView = view
  89. self.signInView_ = view
  90. view?.itemClick = { [weak self] idx, params in
  91. if idx == 1 { //切换登录
  92. self?._showLoginView()
  93. } else if idx == 2 { // 注册
  94. let state = self?._isConnectionAvailable() ?? false
  95. if !state {
  96. self?._showHud(msg: NSLocalizedString("Unable to connect to server, please check your connection.", comment: ""))
  97. return
  98. }
  99. guard let email = params.first as? String, email.isEmpty == false else {
  100. let string = NSLocalizedString("Please enter an email address.", comment: "")
  101. self?.signInView_?.inputView.showAccountError(string)
  102. return
  103. }
  104. if email.count > 50 {
  105. let string = NSLocalizedString("Email address must be no longer than 50 characters.", comment: "")
  106. self?.signInView_?.inputView.showAccountError(string)
  107. return
  108. }
  109. let valid = self?._validateEmail(email: email) ?? false
  110. if valid == false {
  111. let string = NSLocalizedString("Please enter a valid email address.", comment: "")
  112. self?.signInView_?.inputView.showAccountError(string)
  113. return
  114. }
  115. guard let pString = params.last as? String, pString.isEmpty == false else {
  116. let string = NSLocalizedString("Please enter a password.", comment: "")
  117. self?.signInView_?.inputView.showPasswordError(string)
  118. return
  119. }
  120. if pString.count < 6 {
  121. let string = NSLocalizedString("Password length must be 6-16 characters.", comment: "")
  122. self?.signInView_?.inputView.showPasswordError(string)
  123. return
  124. }
  125. let uuid = GetHardwareUUID()
  126. let params = ["email" : email, "password" : KMHTTP.md5(pString), "device_code" : uuid]
  127. self?.signInView_?.kStartloading()
  128. KMHTTP.OEM_POST(urlString: kURLAPI_oemRegister, parameter: params, headers: nil) { success , dataModel, err in
  129. let model = AccountInfoModel(dict: dataModel?.data as? [String : Any] ?? [:])
  130. self?.signInView_?.kEndLoading()
  131. if success == false {
  132. if dataModel?.code == 406 {
  133. let msg = dataModel?.msg ?? "The email address has been registered."
  134. let string = NSLocalizedString(msg, comment: "")
  135. self?.signInView_?.inputView.showAccountError(string)
  136. } else {
  137. let code = dataModel?.code ?? 0
  138. if code == 423 || code == 412 || code == 1000 || code == 407 {
  139. let msg = dataModel?.msg ?? ""
  140. let string = NSLocalizedString(msg, comment: "")
  141. self?.signInView_?.inputView.showAccountError(string)
  142. }
  143. }
  144. return
  145. }
  146. self?.itemClick?(1, model)
  147. }
  148. }
  149. }
  150. }
  151. private func _showLoginView() {
  152. let view = AccountLoginView.createFromNib()
  153. self.rightBox.contentView = view
  154. self.loginView_ = view
  155. if let data = KMDataManager.ud_string(forKey: kAccountEmailKey) {
  156. view?.inputView.accountTextFiled.stringValue = data
  157. }
  158. view?.itemClick = { [weak self] idx, params in
  159. if idx == 1 { //切换注册
  160. self?._showSignInView()
  161. } else if idx == 2 { // 登陆
  162. let state = self?._isConnectionAvailable() ?? false
  163. if !state {
  164. self?._showHud(msg: NSLocalizedString("Unable to connect to server, please check your connection.", comment: ""))
  165. return
  166. }
  167. guard let email = params.first as? String, email.isEmpty == false else {
  168. let string = NSLocalizedString("Please enter an email address.", comment: "")
  169. self?.loginView_?.inputView.showAccountError(string)
  170. return
  171. }
  172. if email.count > 50 {
  173. let string = NSLocalizedString("Email address must be no longer than 50 characters.", comment: "")
  174. self?.loginView_?.inputView.showAccountError(string)
  175. return
  176. }
  177. let valid = self?._validateEmail(email: email) ?? false
  178. if valid == false {
  179. let string = NSLocalizedString("Please enter a valid email address.", comment: "")
  180. self?.loginView_?.inputView.showAccountError(string)
  181. return
  182. }
  183. guard let pString = params.last as? String, pString.isEmpty == false else {
  184. let string = NSLocalizedString("Please enter a password.", comment: "")
  185. self?.loginView_?.inputView.showPasswordError(string)
  186. return
  187. }
  188. if pString.count < 6 {
  189. let string = NSLocalizedString("Password length must be 6-16 characters.", comment: "")
  190. self?.loginView_?.inputView.showPasswordError(string)
  191. return
  192. }
  193. let uuid = GetHardwareUUID()
  194. let params = ["email" : email, "password" : KMHTTP.md5(pString), "device_code" : uuid]
  195. self?.loginView_?.kStartloading()
  196. KMHTTP.OEM_POST(urlString: kURLAPI_oemLogin, parameter: params, headers: nil) { success , dataModel, err in
  197. let model = AccountInfoModel(dict: dataModel?.data as? [String : Any] ?? [:])
  198. self?.loginView_?.kEndLoading()
  199. if success == false {
  200. if dataModel?.code == 410 {
  201. let msg = dataModel?.msg ?? "Please enter a password."
  202. let string = NSLocalizedString(msg, comment: "")
  203. self?.loginView_?.inputView.showAccountError(string)
  204. } else if dataModel?.code == 409 {
  205. let msg = dataModel?.msg ?? "Please enter the correct password."
  206. let string = NSLocalizedString(msg, comment: "")
  207. self?.loginView_?.inputView.showPasswordError(string)
  208. } else {
  209. let code = dataModel?.code ?? 0
  210. if code == 422 || code == 415 || code == 414 || code == 1001 || code == 407 || code == 405 || code == 401 {
  211. let msg = dataModel?.msg ?? ""
  212. let string = NSLocalizedString(msg, comment: "")
  213. self?.loginView_?.inputView.showPasswordError(string)
  214. }
  215. }
  216. return
  217. }
  218. self?.itemClick?(1, model)
  219. }
  220. } else if idx == 3 { // 忘记密码
  221. KMTools.openURL(urlString: kResetpasswordUrlString)
  222. }
  223. }
  224. }
  225. private func _validateEmail(email: String) -> Bool {
  226. // let ss = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
  227. let regex = "^[a-z0-9A-Z+-\\._]+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)*\\.)+[a-zA-Z]{2,}$"
  228. // let regex = "^[a-z0-9A-Z+-]+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)*)+[a-zA-Z]{2,}$"
  229. let pred = NSPredicate(format: "SELF MATCHES %@", regex)
  230. return pred.evaluate(with: email)
  231. }
  232. private func _isConnectionAvailable() -> Bool {
  233. if Reachability.forInternetConnection().currentReachabilityStatus().rawValue == 0 {
  234. return false
  235. }
  236. return true
  237. }
  238. private func _showHud(msg: String) {
  239. // if let data = self.view {
  240. // _ = CustomAlertView(message: msg, from: data, with: .black)
  241. CustomAlertView.alertView(message: msg, fromView: self.view, withStyle: .black)
  242. // }
  243. }
  244. }