| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- //
- // LNAccountManager.swift
- // Lanu
- //
- // Created by OneeChan on 2025/11/6.
- //
- import Foundation
- import GoogleSignIn
- protocol LNAccountManagerNotify {
- func onUserLogin()
- func onUserLogout()
- }
- extension LNAccountManagerNotify {
- func onUserLogin() {}
- func onUserLogout() {}
- }
- extension String {
- var isMyUid: Bool {
- myUid == self
- }
- }
- var myUid: String {
- LNAccountManager.shared.uid
- }
- var hasLogin: Bool {
- !myUid.isEmpty
- }
- class LNAccountManager {
- static let shared = LNAccountManager()
-
- private(set) var token = LNUserDefaults[.token, ""] {
- didSet { LNUserDefaults[.token] = token }
- }
- private(set) var uid: String = LNUserDefaults[.uid, ""] {
- didSet { LNUserDefaults[.uid] = uid }
- }
-
- var wasLogin: Bool {
- !token.isEmpty && !uid.isEmpty
- }
-
- private init() {
- let clientID = if LNAppConfig.shared.curEnv == .test {
- "981655295954-noc65ii1gfgpq3mrc0r75t7gq66v57bj.apps.googleusercontent.com"
- } else {
- "955524882346-a7fs1l3798khu5hn058m0veqqcvli7h4.apps.googleusercontent.com"
- }
-
- GIDSignIn.sharedInstance.configuration = GIDConfiguration(clientID: clientID)
- }
-
- func loginByToken(completion: ((Bool) -> Void)? = nil) {
- LNHttpManager.shared.refreshToken { [weak self] res, err in
- guard let self else { return }
- guard err == nil, let res else {
- if case .serverError = err {
- self.clean()
- }
- showToast(err?.errorDesc)
- completion?(false)
- return
- }
- self.token = res.token
- completion?(true)
-
- self.notifyUserLogin()
- }
- }
-
- func loginByGoogle(data: String, completion: ((Bool) -> Void)? = nil) {
- LNHttpManager.shared.loginByGoogle(token: data) { [weak self] response, err in
- guard let self else { return }
- guard err == nil, let response else {
- showToast(err?.errorDesc)
- completion?(false)
- self.clean()
- return
- }
- self.token = response.token
- self.uid = response.userProfile.userNo
- completion?(true)
-
- self.notifyUserLogin()
- }
- }
-
- func loginByApple(data: String, completion: ((Bool) -> Void)? = nil) {
- LNHttpManager.shared.loginByApple(token: data) { [weak self] response, err in
- guard let self else { return }
- guard err == nil, let response else {
- showToast(err?.errorDesc)
- completion?(false)
- self.clean()
- return
- }
- self.token = response.token
- self.uid = response.userProfile.userNo
- completion?(true)
-
- self.notifyUserLogin()
- }
- }
-
- func logout() {
- LNHttpManager.shared.logout { [weak self] err in
- guard let self else { return }
- guard err == nil else {
- return
- }
- self.clean()
- }
- }
-
- #if DEBUG
- func loginByEmail(email: String, completion: @escaping (Bool) -> Void) {
- LNHttpManager.shared.loginByEmail(email: email) { [weak self] response, err in
- guard let self else { return }
- guard err == nil, let response else {
- showToast(err?.errorDesc)
- completion(false)
- self.clean()
- return
- }
- self.token = response.token
- self.uid = response.userProfile.userNo
- completion(true)
-
- self.notifyUserLogin()
- }
- }
- #endif
- }
- extension LNAccountManager {
- func clean() {
- let wasLogin = !token.isEmpty
- token = ""
- uid = ""
-
- if wasLogin {
- notifyUserLogout()
- }
- }
- }
- extension LNAccountManager {
- func notifyUserLogin() {
- LNEventDeliver.notifyEvent { ($0 as? LNAccountManagerNotify)?.onUserLogin() }
- }
- func notifyUserLogout() {
- LNEventDeliver.notifyEvent { ($0 as? LNAccountManagerNotify)?.onUserLogout() }
- }
- }
|