diff options
| author | Arturs Artamonovs <arturs.artamonovs@protonmail.com> | 2025-11-17 00:44:09 +0000 |
|---|---|---|
| committer | Arturs Artamonovs <arturs.artamonovs@protonmail.com> | 2025-11-17 00:44:09 +0000 |
| commit | e26830439dfdb97c1d685bf5cda05a5d2df9f21f (patch) | |
| tree | 85a16662d47787d0975c05a22727ad4301d0fb5b /LearnMapKit/DI | |
| parent | 2b599499dc26f0f93537d1bea4733eae68333a1c (diff) | |
| download | ADSBDecoder-e26830439dfdb97c1d685bf5cda05a5d2df9f21f.tar.gz ADSBDecoder-e26830439dfdb97c1d685bf5cda05a5d2df9f21f.zip | |
refactor experiment
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 |
