LNAccountManager.swift 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. //
  2. // LNAccountManager.swift
  3. // Lanu
  4. //
  5. // Created by OneeChan on 2025/11/6.
  6. //
  7. import Foundation
  8. import GoogleSignIn
  9. protocol LNAccountManagerNotify {
  10. func onUserLogin()
  11. func onUserLogout()
  12. }
  13. extension LNAccountManagerNotify {
  14. func onUserLogin() {}
  15. func onUserLogout() {}
  16. }
  17. extension String {
  18. var isMyUid: Bool {
  19. myUid == self
  20. }
  21. }
  22. var myUid: String {
  23. LNAccountManager.shared.uid
  24. }
  25. var hasLogin: Bool {
  26. !myUid.isEmpty
  27. }
  28. class LNAccountManager {
  29. static let shared = LNAccountManager()
  30. private(set) var token = LNUserDefaults[.token, ""] {
  31. didSet { LNUserDefaults[.token] = token }
  32. }
  33. private(set) var uid: String = LNUserDefaults[.uid, ""] {
  34. didSet { LNUserDefaults[.uid] = uid }
  35. }
  36. var wasLogin: Bool {
  37. !token.isEmpty && !uid.isEmpty
  38. }
  39. private init() {
  40. let clientID = if LNAppConfig.shared.curEnv == .test {
  41. "981655295954-noc65ii1gfgpq3mrc0r75t7gq66v57bj.apps.googleusercontent.com"
  42. } else {
  43. "955524882346-a7fs1l3798khu5hn058m0veqqcvli7h4.apps.googleusercontent.com"
  44. }
  45. GIDSignIn.sharedInstance.configuration = GIDConfiguration(clientID: clientID)
  46. }
  47. func loginByToken(completion: ((Bool) -> Void)? = nil) {
  48. LNHttpManager.shared.refreshToken { [weak self] res, err in
  49. guard let self else { return }
  50. guard err == nil, let res else {
  51. if case .serverError = err {
  52. self.clean()
  53. }
  54. showToast(err?.errorDesc)
  55. completion?(false)
  56. return
  57. }
  58. self.token = res.token
  59. completion?(true)
  60. self.notifyUserLogin()
  61. }
  62. }
  63. func loginByGoogle(data: String, completion: ((Bool) -> Void)? = nil) {
  64. LNHttpManager.shared.loginByGoogle(token: data) { [weak self] response, err in
  65. guard let self else { return }
  66. guard err == nil, let response else {
  67. showToast(err?.errorDesc)
  68. completion?(false)
  69. self.clean()
  70. return
  71. }
  72. self.token = response.token
  73. self.uid = response.userProfile.userNo
  74. completion?(true)
  75. self.notifyUserLogin()
  76. }
  77. }
  78. func loginByApple(data: String, completion: ((Bool) -> Void)? = nil) {
  79. LNHttpManager.shared.loginByApple(token: data) { [weak self] response, err in
  80. guard let self else { return }
  81. guard err == nil, let response else {
  82. showToast(err?.errorDesc)
  83. completion?(false)
  84. self.clean()
  85. return
  86. }
  87. self.token = response.token
  88. self.uid = response.userProfile.userNo
  89. completion?(true)
  90. self.notifyUserLogin()
  91. }
  92. }
  93. func logout() {
  94. LNHttpManager.shared.logout { [weak self] err in
  95. guard let self else { return }
  96. guard err == nil else {
  97. return
  98. }
  99. self.clean()
  100. }
  101. }
  102. #if DEBUG
  103. func loginByEmail(email: String, completion: @escaping (Bool) -> Void) {
  104. LNHttpManager.shared.loginByEmail(email: email) { [weak self] response, err in
  105. guard let self else { return }
  106. guard err == nil, let response else {
  107. showToast(err?.errorDesc)
  108. completion(false)
  109. self.clean()
  110. return
  111. }
  112. self.token = response.token
  113. self.uid = response.userProfile.userNo
  114. completion(true)
  115. self.notifyUserLogin()
  116. }
  117. }
  118. #endif
  119. }
  120. extension LNAccountManager {
  121. func clean() {
  122. let wasLogin = !token.isEmpty
  123. token = ""
  124. uid = ""
  125. if wasLogin {
  126. notifyUserLogout()
  127. }
  128. }
  129. }
  130. extension LNAccountManager {
  131. func notifyUserLogin() {
  132. LNEventDeliver.notifyEvent { ($0 as? LNAccountManagerNotify)?.onUserLogin() }
  133. }
  134. func notifyUserLogout() {
  135. LNEventDeliver.notifyEvent { ($0 as? LNAccountManagerNotify)?.onUserLogout() }
  136. }
  137. }