Lower deployment target to iOS 16, replace @Observable with ObservableObject, add navigation and UI compatibility shims, and include login smoke UI tests. Co-authored-by: Cursor <cursoragent@cursor.com>
46 lines
1.1 KiB
Swift
46 lines
1.1 KiB
Swift
//
|
||
// AppSession.swift
|
||
// suixinkan
|
||
//
|
||
// Created by Codex on 2026/6/18.
|
||
//
|
||
|
||
import Foundation
|
||
import Combine
|
||
|
||
/// 登录阶段实体,表示根视图当前应该展示的认证状态。
|
||
enum AuthPhase: Equatable {
|
||
case loggedOut
|
||
case restoring
|
||
case loggedIn
|
||
}
|
||
|
||
@MainActor
|
||
/// 登录会话状态中心,保存 token 和当前认证阶段。
|
||
final class AppSession: ObservableObject {
|
||
@Published private(set) var phase: AuthPhase = .loggedOut
|
||
@Published private(set) var token: String?
|
||
|
||
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
|
||
}
|
||
}
|