47 lines
1.1 KiB
Swift
47 lines
1.1 KiB
Swift
//
|
||
// AppSession.swift
|
||
// suixinkan
|
||
//
|
||
// Created by Codex on 2026/6/18.
|
||
//
|
||
|
||
import Foundation
|
||
|
||
/// 登录阶段实体,表示根视图当前应该展示的认证状态。
|
||
enum AuthPhase: Equatable {
|
||
case loggedOut
|
||
case restoring
|
||
case loggedIn
|
||
}
|
||
|
||
@MainActor
|
||
/// 登录会话状态中心,保存 token 和当前认证阶段。
|
||
final class AppSession {
|
||
|
||
var onChange: (() -> Void)?
|
||
private(set) var phase: AuthPhase = .loggedOut { didSet { onChange?() } }
|
||
private(set) var token: String? { didSet { onChange?() } }
|
||
|
||
var isLoggedIn: Bool {
|
||
phase == .loggedIn
|
||
}
|
||
|
||
/// 将会话切换到恢复中状态,用于冷启动恢复登录态。
|
||
func beginRestoring(token: String? = nil) {
|
||
self.token = token?.trimmingCharacters(in: .whitespacesAndNewlines)
|
||
phase = .restoring
|
||
}
|
||
|
||
/// 标记登录成功并保存正式 token。
|
||
func markLoggedIn(token: String? = nil) {
|
||
self.token = token?.trimmingCharacters(in: .whitespacesAndNewlines)
|
||
phase = .loggedIn
|
||
}
|
||
|
||
/// 清空 token 并回到未登录状态。
|
||
func logout() {
|
||
token = nil
|
||
phase = .loggedOut
|
||
}
|
||
}
|