Migrate from iOS 17 Observation to iOS 16-compatible Combine architecture.

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>
This commit is contained in:
2026-06-26 10:16:35 +08:00
parent c32a610ee0
commit 26f4d0e671
127 changed files with 2320 additions and 1465 deletions

View File

@ -0,0 +1,261 @@
//
// AppServiceEnvironment.swift
// suixinkan
//
// Created by Codex on 2026/6/26.
//
import SwiftUI
private enum EnvironmentServiceDefaults {
static func apiClient() -> APIClient {
APIClient()
}
}
private struct APIClientEnvironmentKey: EnvironmentKey {
static var defaultValue: APIClient { EnvironmentServiceDefaults.apiClient() }
}
private struct UploadAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: UploadAPI { UploadAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct PushAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: PushAPI { PushAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct AccountSnapshotStoreEnvironmentKey: EnvironmentKey {
static var defaultValue: AccountSnapshotStore { AccountSnapshotStore() }
}
private struct AuthSessionCoordinatorEnvironmentKey: EnvironmentKey {
static var defaultValue: AuthSessionCoordinator { AuthSessionCoordinator() }
}
private struct AccountContextAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: AccountContextAPI { AccountContextAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct AssetsAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: AssetsAPI { AssetsAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct AuthAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: AuthAPI { AuthAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct InviteAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: InviteAPI { InviteAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct LiveAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: LiveAPI { LiveAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct LocationReportAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: LocationReportAPI { LocationReportAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct MessageCenterAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: MessageCenterAPI { MessageCenterAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct OperatingAreaAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: OperatingAreaAPI { OperatingAreaAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct OrdersAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: OrdersAPI { OrdersAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct OSSUploadServiceEnvironmentKey: EnvironmentKey {
static var defaultValue: OSSUploadService {
OSSUploadService(configService: UploadAPI(client: EnvironmentServiceDefaults.apiClient()))
}
}
private struct PaymentAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: PaymentAPI { PaymentAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct PilotCertificationAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: PilotCertificationAPI { PilotCertificationAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct ProfileAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: ProfileAPI { ProfileAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct ProjectAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: ProjectAPI { ProjectAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct PunchPointAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: PunchPointAPI { PunchPointAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct ScenicPermissionAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: ScenicPermissionAPI { ScenicPermissionAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct ScenicQueueAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: ScenicQueueAPI { ScenicQueueAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct ScenicSettlementAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: ScenicSettlementAPI { ScenicSettlementAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct ScheduleAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: ScheduleAPI { ScheduleAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct StatisticsAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: StatisticsAPI { StatisticsAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct TaskAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: TaskAPI { TaskAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
private struct WalletAPIEnvironmentKey: EnvironmentKey {
static var defaultValue: WalletAPI { WalletAPI(client: EnvironmentServiceDefaults.apiClient()) }
}
extension EnvironmentValues {
var apiClient: APIClient {
get { self[APIClientEnvironmentKey.self] }
set { self[APIClientEnvironmentKey.self] = newValue }
}
var uploadAPI: UploadAPI {
get { self[UploadAPIEnvironmentKey.self] }
set { self[UploadAPIEnvironmentKey.self] = newValue }
}
var pushAPI: PushAPI {
get { self[PushAPIEnvironmentKey.self] }
set { self[PushAPIEnvironmentKey.self] = newValue }
}
var accountSnapshotStore: AccountSnapshotStore {
get { self[AccountSnapshotStoreEnvironmentKey.self] }
set { self[AccountSnapshotStoreEnvironmentKey.self] = newValue }
}
var authSessionCoordinator: AuthSessionCoordinator {
get { self[AuthSessionCoordinatorEnvironmentKey.self] }
set { self[AuthSessionCoordinatorEnvironmentKey.self] = newValue }
}
var accountContextAPI: AccountContextAPI {
get { self[AccountContextAPIEnvironmentKey.self] }
set { self[AccountContextAPIEnvironmentKey.self] = newValue }
}
var assetsAPI: AssetsAPI {
get { self[AssetsAPIEnvironmentKey.self] }
set { self[AssetsAPIEnvironmentKey.self] = newValue }
}
var authAPI: AuthAPI {
get { self[AuthAPIEnvironmentKey.self] }
set { self[AuthAPIEnvironmentKey.self] = newValue }
}
var inviteAPI: InviteAPI {
get { self[InviteAPIEnvironmentKey.self] }
set { self[InviteAPIEnvironmentKey.self] = newValue }
}
var liveAPI: LiveAPI {
get { self[LiveAPIEnvironmentKey.self] }
set { self[LiveAPIEnvironmentKey.self] = newValue }
}
var locationReportAPI: LocationReportAPI {
get { self[LocationReportAPIEnvironmentKey.self] }
set { self[LocationReportAPIEnvironmentKey.self] = newValue }
}
var messageCenterAPI: MessageCenterAPI {
get { self[MessageCenterAPIEnvironmentKey.self] }
set { self[MessageCenterAPIEnvironmentKey.self] = newValue }
}
var operatingAreaAPI: OperatingAreaAPI {
get { self[OperatingAreaAPIEnvironmentKey.self] }
set { self[OperatingAreaAPIEnvironmentKey.self] = newValue }
}
var ordersAPI: OrdersAPI {
get { self[OrdersAPIEnvironmentKey.self] }
set { self[OrdersAPIEnvironmentKey.self] = newValue }
}
var ossUploadService: OSSUploadService {
get { self[OSSUploadServiceEnvironmentKey.self] }
set { self[OSSUploadServiceEnvironmentKey.self] = newValue }
}
var paymentAPI: PaymentAPI {
get { self[PaymentAPIEnvironmentKey.self] }
set { self[PaymentAPIEnvironmentKey.self] = newValue }
}
var pilotCertificationAPI: PilotCertificationAPI {
get { self[PilotCertificationAPIEnvironmentKey.self] }
set { self[PilotCertificationAPIEnvironmentKey.self] = newValue }
}
var profileAPI: ProfileAPI {
get { self[ProfileAPIEnvironmentKey.self] }
set { self[ProfileAPIEnvironmentKey.self] = newValue }
}
var projectAPI: ProjectAPI {
get { self[ProjectAPIEnvironmentKey.self] }
set { self[ProjectAPIEnvironmentKey.self] = newValue }
}
var punchPointAPI: PunchPointAPI {
get { self[PunchPointAPIEnvironmentKey.self] }
set { self[PunchPointAPIEnvironmentKey.self] = newValue }
}
var scenicPermissionAPI: ScenicPermissionAPI {
get { self[ScenicPermissionAPIEnvironmentKey.self] }
set { self[ScenicPermissionAPIEnvironmentKey.self] = newValue }
}
var scenicQueueAPI: ScenicQueueAPI {
get { self[ScenicQueueAPIEnvironmentKey.self] }
set { self[ScenicQueueAPIEnvironmentKey.self] = newValue }
}
var scenicSettlementAPI: ScenicSettlementAPI {
get { self[ScenicSettlementAPIEnvironmentKey.self] }
set { self[ScenicSettlementAPIEnvironmentKey.self] = newValue }
}
var scheduleAPI: ScheduleAPI {
get { self[ScheduleAPIEnvironmentKey.self] }
set { self[ScheduleAPIEnvironmentKey.self] = newValue }
}
var statisticsAPI: StatisticsAPI {
get { self[StatisticsAPIEnvironmentKey.self] }
set { self[StatisticsAPIEnvironmentKey.self] = newValue }
}
var taskAPI: TaskAPI {
get { self[TaskAPIEnvironmentKey.self] }
set { self[TaskAPIEnvironmentKey.self] = newValue }
}
var walletAPI: WalletAPI {
get { self[WalletAPIEnvironmentKey.self] }
set { self[WalletAPIEnvironmentKey.self] = newValue }
}
}