From 0ca4c232db68ddf612a393b72f7facf49ef8665b Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Tue, 15 Apr 2025 11:43:24 +0300 Subject: [PATCH] Make settings observable --- AutoCat/Controllers/MainTabController.swift | 9 ++++-- .../SettingsScreen/SettingsCoordinator.swift | 27 ++++------------- .../SettingsScreen/SettingsScreen.swift | 14 ++++----- .../SettingsScreen/SettingsViewModel.swift | 30 ------------------- .../SettingsService/SettingsService.swift | 1 + 5 files changed, 20 insertions(+), 61 deletions(-) diff --git a/AutoCat/Controllers/MainTabController.swift b/AutoCat/Controllers/MainTabController.swift index e1688c0..9885842 100644 --- a/AutoCat/Controllers/MainTabController.swift +++ b/AutoCat/Controllers/MainTabController.swift @@ -25,7 +25,7 @@ class MainTabController: UITabBarController, UITabBarControllerDelegate { addDummyTab() #endif addSearchTab() - Task { await addSettings() } + addSettings() } func addHistoryTab() { @@ -62,11 +62,14 @@ class MainTabController: UITabBarController, UITabBarControllerDelegate { viewControllers?.append(controller) } - func addSettings() async { + func addSettings() { let coordinator = SettingsCoordinator(tabController: self) settingsCoordinator = coordinator - try? await coordinator.start() + let controller = coordinator.start() + controller.tabBarItem = UITabBarItem(title: NSLocalizedString("Settings", comment: ""), + image: UIImage(systemName: "gear"), tag: 0) + viewControllers?.append(controller) } func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool { diff --git a/AutoCat/Screens/SettingsScreen/SettingsCoordinator.swift b/AutoCat/Screens/SettingsScreen/SettingsCoordinator.swift index 4e6bd71..f66b88d 100644 --- a/AutoCat/Screens/SettingsScreen/SettingsCoordinator.swift +++ b/AutoCat/Screens/SettingsScreen/SettingsCoordinator.swift @@ -11,44 +11,29 @@ import SwiftUI import AutoCatCore @MainActor -class SettingsCoordinator: Coordinator { +class SettingsCoordinator { - weak var viewController: UITabBarController? - var settingsController: UIViewController? + weak var tabController: UITabBarController? init(tabController: UITabBarController) { - self.viewController = tabController + self.tabController = tabController } - func start() async throws { + func start() -> UIViewController { let viewModel = SettingsViewModel(settingsService: ServiceContainer.shared.resolve(SettingsServiceProtocol.self)) viewModel.coordinator = self let controller = UIHostingController(rootView: SettingsScreen(viewModel: viewModel)) - settingsController = controller - - let navController = UINavigationController(rootViewController: controller) - navController.tabBarItem = UITabBarItem(title: NSLocalizedString("Settings", comment: ""), - image: UIImage(systemName: "gear"), tag: 0) - - viewController?.viewControllers?.append(navController) + return UINavigationController(rootViewController: controller) } func openAuthScreen() { - guard let window = viewController?.tabBar.window else { + guard let window = tabController?.tabBar.window else { return } let coordinator = AuthCoordinator(window: window) window.rootViewController = coordinator.start() } - - func openGoogleOauthPage() { - - let storyboard = UIStoryboard(name: "Main", bundle: nil) - if let vc = storyboard.instantiateViewController(identifier: "GoogleSignInController") as? GoogleSignInController { - settingsController?.present(vc, animated: true) - } - } } diff --git a/AutoCat/Screens/SettingsScreen/SettingsScreen.swift b/AutoCat/Screens/SettingsScreen/SettingsScreen.swift index 76e2c0d..b1077dd 100644 --- a/AutoCat/Screens/SettingsScreen/SettingsScreen.swift +++ b/AutoCat/Screens/SettingsScreen/SettingsScreen.swift @@ -40,7 +40,7 @@ struct SettingsScreen: View { } Section { - Picker("Server", selection: $viewModel.backend) { + Picker("Server", selection: $viewModel.settingService.backend) { ForEach(Constants.Backend.allCases, id: \.self) { backend in Text(backend.name) } @@ -50,26 +50,26 @@ struct SettingsScreen: View { Section("Plate number recognition") { ToggleRowView(title: "Alternative order", description: "Recognize plate numbers in alternative form. For example 'ЕВА 123 777' instead of 'Е123ВА 777'", - toggle: $viewModel.recognizeAlternativeOrder) + toggle: $viewModel.settingService.recognizeAlternativeOrder) ToggleRowView(title: "Shortened numbers", description: "If enabled, app will try to recognize shortened plate numbers (without region) and add default region", - toggle: $viewModel.recognizeShortenedNumbers) - if viewModel.recognizeShortenedNumbers { + toggle: $viewModel.settingService.recognizeShortenedNumbers) + if viewModel.settingService.recognizeShortenedNumbers { LabeledContent("Default region") { - TextField("", text: $viewModel.defaultRegion) + TextField("", text: $viewModel.settingService.defaultRegion) .frame(width: 50) .multilineTextAlignment(.trailing) } } ToggleRowView(title: "Beep before record", description: "When enabled, you will hear short sound before starting audio recording. This will only work when audio record is started via Siri", - toggle: $viewModel.recordBeep) + toggle: $viewModel.settingService.recordBeep) } Section("Debug") { ToggleRowView(title: "Show debug info", description: nil, - toggle: $viewModel.showDebugInfo) + toggle: $viewModel.settingService.showDebugInfo) } } .navigationTitle("Settings") diff --git a/AutoCat/Screens/SettingsScreen/SettingsViewModel.swift b/AutoCat/Screens/SettingsScreen/SettingsViewModel.swift index 17cf031..348887f 100644 --- a/AutoCat/Screens/SettingsScreen/SettingsViewModel.swift +++ b/AutoCat/Screens/SettingsScreen/SettingsViewModel.swift @@ -42,36 +42,6 @@ class SettingsViewModel { return jwt.payload.email } - var recognizeAlternativeOrder: Bool { - get { settingService.recognizeAlternativeOrder } - set { settingService.recognizeAlternativeOrder = newValue } - } - - var recognizeShortenedNumbers: Bool { - get { settingService.recognizeShortenedNumbers } - set { settingService.recognizeShortenedNumbers = newValue } - } - - var backend: Constants.Backend { - get { settingService.backend } - set { settingService.backend = newValue } - } - - var recordBeep: Bool { - get { settingService.recordBeep } - set { settingService.recordBeep = newValue } - } - - var showDebugInfo: Bool { - get { settingService.showDebugInfo } - set { settingService.showDebugInfo = newValue } - } - - var defaultRegion: String { - get { settingService.defaultRegion } - set { settingService.defaultRegion = newValue } - } - init(settingsService: SettingsServiceProtocol) { self.settingService = settingsService diff --git a/AutoCatCore/Services/SettingsService/SettingsService.swift b/AutoCatCore/Services/SettingsService/SettingsService.swift index a27cd7c..f00f343 100644 --- a/AutoCatCore/Services/SettingsService/SettingsService.swift +++ b/AutoCatCore/Services/SettingsService/SettingsService.swift @@ -20,6 +20,7 @@ enum SettingsKey: String { } @MainActor +@Observable public final class SettingsService: SettingsServiceProtocol { let jsonEncoder = JSONEncoder()