diff options
Diffstat (limited to 'LearnMapKit/DI')
| -rw-r--r-- | LearnMapKit/DI/DependencyContainer.swift | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/LearnMapKit/DI/DependencyContainer.swift b/LearnMapKit/DI/DependencyContainer.swift new file mode 100644 index 0000000..f0d1323 --- /dev/null +++ b/LearnMapKit/DI/DependencyContainer.swift @@ -0,0 +1,118 @@ +// +// DependencyContainer.swift +// LearnMapKit +// +// Dependency injection container for the app +// + +import Foundation + +@MainActor +class DependencyContainer { + + // MARK: - Singletons + lazy var configurationManager: ConfigurationManager = DefaultConfigurationManager() + lazy var aircraftRepository: AircraftRepository = DefaultAircraftRepository(tracker: aircraftTracker) + lazy var dataSourceFactory: DataSourceFactory = DefaultDataSourceFactory() + lazy var aircraftTracker: AircraftTracker = DefaultAircraftTracker() + + // MARK: - ViewModels + func makeAircraftTrackingViewModel() -> AircraftTrackingViewModel { + AircraftTrackingViewModel( + configurationManager: configurationManager, + aircraftRepository: aircraftRepository, + dataSourceFactory: dataSourceFactory + ) + } + + func makeSettingsViewModel() -> SettingsViewModel { + SettingsViewModel(configurationManager: configurationManager) + } + + // MARK: - Data Sources (Factory Methods) + func makeFileDataSource(configuration: FileDataSourceConfiguration) -> FileADSBDataSource { + FileADSBDataSource( + configuration: configuration, + tracker: aircraftTracker + ) + } + + func makeNetworkDataSource(configuration: NetworkDataSourceConfiguration) -> NetworkADSBDataSource { + NetworkADSBDataSource( + configuration: configuration, + tracker: aircraftTracker + ) + } +} + +// MARK: - Settings ViewModel +@MainActor +class SettingsViewModel: ObservableObject { + @Published var configuration: AppConfiguration + @Published var hasUnsavedChanges: Bool = false + @Published var validationErrors: [String] = [] + @Published var isValid: Bool = true + + private let configurationManager: ConfigurationManager + private var cancellables = Set<AnyCancellable>() + + init(configurationManager: ConfigurationManager) { + self.configurationManager = configurationManager + self.configuration = configurationManager.getCurrentConfiguration() + + setupBindings() + } + + func saveSettings() async { + let validation = configurationManager.validateConfiguration(configuration) + validationErrors = validation.errors + isValid = validation.isValid + + if validation.isValid { + do { + await configurationManager.updateConfiguration(configuration) + try await configurationManager.saveConfiguration() + } catch { + validationErrors = ["Failed to save: \(error.localizedDescription)"] + isValid = false + } + } + } + + func resetToDefaults() async { + configuration = AppConfiguration.default + await configurationManager.resetToDefaults() + } + + func validateCurrentSettings() { + let validation = configurationManager.validateConfiguration(configuration) + validationErrors = validation.errors + isValid = validation.isValid + } + + private func setupBindings() { + configurationManager.hasUnsavedChanges + .receive(on: DispatchQueue.main) + .assign(to: &$hasUnsavedChanges) + + $configuration + .removeDuplicates() + .sink { [weak self] _ in + self?.validateCurrentSettings() + } + .store(in: &cancellables) + } +} + +// MARK: - Missing Protocol Implementations (Stubs) +protocol ADSBMessageDecoder { + func decode(_ message: String) -> ADSBDataEvent? +} + +class DefaultADSBMessageDecoder: ADSBMessageDecoder { + func decode(_ message: String) -> ADSBDataEvent? { + // This would contain the actual decoding logic + // For now, return nil as a stub + return nil + } +}
\ No newline at end of file |
