ThimraTV/MoviaBox/Libs/Login/SPLoginManager.swift
2025-04-30 18:22:41 +08:00

173 lines
5.3 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// SPLoginManager.swift
// MoviaBox
//
// Created by on 2025/4/8.
//
import UIKit
import SmartCodable
class SPLoginManager: NSObject {
enum LoginType: String, SmartCaseDefaultable {
case apple = "Apple"
case faceBook = "Facebook"
case google = "Google"
case tiktok = "Tiktok"
}
static let manager = SPLoginManager()
private(set) var token: SPTokenModel?
private(set) var userInfo: SPUserInfo?
///
var isLogin: Bool {
return !(userInfo?.is_tourist ?? true)
}
///token
private(set) var isRefreshingToken = false
override init() {
super.init()
token = UserDefaults.jx_object(forKey: kSPLoginTokenDefaultsKey, class: SPTokenModel.self) as? SPTokenModel
userInfo = UserDefaults.jx_object(forKey: kSPLoginUserInfoDefaultsKey, class: SPUserInfo.self) as? SPUserInfo
}
///
func isLoginAndOpenLoginVC() -> Bool {
if !isLogin {
openLoginVC()
}
return isLogin
}
func openLoginVC() {
let vc = SPLoginViewController()
let nav = SPNavigationController(rootViewController: vc)
nav.modalPresentationStyle = .fullScreen
SPAPPTool.topViewController()?.present(nav, animated: true)
}
func setLoginToken(token: SPTokenModel?) {
self.token = token
UserDefaults.jx_setObject(token, forKey: kSPLoginTokenDefaultsKey)
}
///
func thirdLogin(type: LoginType, presentingViewController: UIViewController, completer: ((_ isFinish: Bool) -> Void)?) {
switch type {
case .apple:
appleSignLogin { [weak self] model in
self?.requestThirdLogin(thirdSignModel: model, completer: completer)
}
case .faceBook:
facebookSignLogin(presentingViewController: presentingViewController) { [weak self] model in
self?.requestThirdLogin(thirdSignModel: model, completer: completer)
}
default:
break
}
}
///退
func logout(completer: ((_ isFinish: Bool) -> Void)?) {
SPUserAPI.requestSignout { [weak self] token in
guard let self = self else { return }
if let token = token {
self.setLoginToken(token: token)
self.userInfo?.is_tourist = true
self.updateUserInfo(completer: nil)
completer?(true)
NotificationCenter.default.post(name: SPLoginManager.loginStateDidChangeNotification, object: nil)
} else {
completer?(false)
}
}
}
///
func deleteAccount(completer: ((_ isFinish: Bool) -> Void)?) {
SPUserAPI.requestLogoff { [weak self] isFinish in
guard let self = self else { return }
if isFinish {
self.setLoginToken(token: nil)
self.userInfo?.is_tourist = true
self.updateUserInfo(completer: nil)
completer?(true)
NotificationCenter.default.post(name: SPLoginManager.loginStateDidChangeNotification, object: nil)
} else {
completer?(false)
}
}
}
///
func updateUserInfo(completer: (() -> Void)?) {
SPUserAPI.requestUserInfo { [weak self] userInfo in
guard let self = self else { return }
if let userInfo = userInfo {
self.userInfo = userInfo
UserDefaults.jx_setObject(userInfo, forKey: kSPLoginUserInfoDefaultsKey)
}
completer?()
}
}
}
extension SPLoginManager {
///
func requestVisitorLogin(completer: (() -> Void)?) {
if isRefreshingToken {
completer?()
return
}
isRefreshingToken = true
SPNetwork.requestToken { [weak self] token in
guard let self = self else { return }
self.isRefreshingToken = false
completer?()
}
}
///
private func requestThirdLogin(thirdSignModel: SPThirdSignModel?, completer: ((_ isFinish: Bool) -> Void)?) {
guard let thirdSignModel = thirdSignModel else {
completer?(false)
return
}
SPUserAPI.requestThirdLogin(model: thirdSignModel) { [weak self] token in
guard let self = self else { return }
guard let token = token else {
completer?(false)
return
}
self.setLoginToken(token: token)
self.userInfo?.is_tourist = false
self.updateUserInfo(completer: nil)
completer?(true)
NotificationCenter.default.post(name: SPLoginManager.loginStateDidChangeNotification, object: nil)
}
}
}
extension SPLoginManager {
///
@objc static let loginStateDidChangeNotification = NSNotification.Name(rawValue: "SPLoginManager.loginStateDidChangeNotification")
}