Make settings observable
This commit is contained in:
parent
41578579ef
commit
0ca4c232db
@ -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 {
|
||||
|
||||
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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")
|
||||
|
||||
@ -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
|
||||
|
||||
@ -20,6 +20,7 @@ enum SettingsKey: String {
|
||||
}
|
||||
|
||||
@MainActor
|
||||
@Observable
|
||||
public final class SettingsService: SettingsServiceProtocol {
|
||||
|
||||
let jsonEncoder = JSONEncoder()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user