import Foundation enum DefaultContainer { private static let credentials: any CredentialStore = FileCredentialStore( location: documentFileURL("credentials.json") ) private static let logStore: any LogStore = FileLogStore( location: documentFileURL("log-center.json") ) static func documentFileURL(_ name: String) -> URL { let directory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] return directory.appendingPathComponent(name) } @MainActor static func makeFleetModel() -> FleetViewModel { purgeLegacyGrouping() return FleetViewModel( repository: FileInstanceRepository(location: documentFileURL("instances.json")), probe: ConnectionProbe(client: SimAdminClient()), credentials: credentials, deviceService: DeviceService( client: SimAdminClient(), sessions: InstanceSessionStore(), credentials: credentials ) ) } /// 0.2.2 起分组被标签取代,遗留的分组文件与偏好键一次性清掉,避免 Documents 里留死数据。 private static func purgeLegacyGrouping() { try? FileManager.default.removeItem(at: documentFileURL("instance-groups.json")) UserDefaults.standard.removeObject(forKey: "fleet.groupMode") } @MainActor static func makeMessagesModel() -> MessagesViewModel { MessagesViewModel( repository: FileInstanceRepository(location: documentFileURL("instances.json")), service: MessageService( client: SimAdminClient(), sessions: InstanceSessionStore(), credentials: credentials ) ) } @MainActor static func makeLogsModel(autoRefreshOnAppear: Bool = true) -> LogsViewModel { let store = logStore return LogsViewModel( repository: FileInstanceRepository(location: documentFileURL("instances.json")), service: LogCenterService( client: SimAdminClient(), sessions: InstanceSessionStore(), credentials: credentials, store: store ), store: store, autoRefreshOnAppear: autoRefreshOnAppear ) } @MainActor static func makeSettingsModel() -> SettingsViewModel { SettingsViewModel(store: logStore) } @MainActor static func makeDeviceModel(instance: Instance) -> DeviceViewModel { DeviceViewModel( instance: instance, service: DeviceService( client: SimAdminClient(), sessions: InstanceSessionStore(), credentials: credentials ), probe: ConnectionProbe(client: SimAdminClient()) ) } }