Adding backend selection in settings

This commit is contained in:
Selim Mustafaev 2024-11-15 14:50:14 +03:00
parent 2283ac8fe6
commit c0473054cd
9 changed files with 57 additions and 27 deletions

View File

@ -1665,7 +1665,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements; CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 138; CURRENT_PROJECT_VERSION = 139;
DEVELOPMENT_TEAM = 46DTTB8X4S; DEVELOPMENT_TEAM = 46DTTB8X4S;
INFOPLIST_FILE = AutoCat/Info.plist; INFOPLIST_FILE = AutoCat/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = AutoCat; INFOPLIST_KEY_CFBundleDisplayName = AutoCat;
@ -1692,7 +1692,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements; CODE_SIGN_ENTITLEMENTS = AutoCat/AutoCat.entitlements;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 138; CURRENT_PROJECT_VERSION = 139;
DEVELOPMENT_TEAM = 46DTTB8X4S; DEVELOPMENT_TEAM = 46DTTB8X4S;
INFOPLIST_FILE = AutoCat/Info.plist; INFOPLIST_FILE = AutoCat/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = AutoCat; INFOPLIST_KEY_CFBundleDisplayName = AutoCat;

View File

@ -38,6 +38,14 @@ struct SettingsScreen: View {
} }
} }
Section {
Picker("Server", selection: $viewModel.settingService.backend) {
ForEach(Constants.Backend.allCases, id: \.self) { backend in
Text(backend.name)
}
}
}
Section("Plate number recognition") { Section("Plate number recognition") {
ToggleRowView(title: "Alternative order", ToggleRowView(title: "Alternative order",
description: "Recognize plate numbers in alternative form. For example 'ЕВА 123 777' instead of 'Е123ВА 777'", description: "Recognize plate numbers in alternative form. For example 'ЕВА 123 777' instead of 'Е123ВА 777'",
@ -61,9 +69,6 @@ struct SettingsScreen: View {
ToggleRowView(title: "Show debug info", ToggleRowView(title: "Show debug info",
description: nil, description: nil,
toggle: $viewModel.settingService.showDebugInfo) toggle: $viewModel.settingService.showDebugInfo)
ToggleRowView(title: "Use test backend",
description: nil,
toggle: $viewModel.settingService.useTestBackend)
} }
} }
.navigationTitle("Settings") .navigationTitle("Settings")

View File

@ -412,3 +412,4 @@
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"ZIP (or OKTMO) code" = "Индекс (или ОКТМО)"; "ZIP (or OKTMO) code" = "Индекс (или ОКТМО)";
"Server" = "Сервер";

View File

@ -20,7 +20,7 @@ public actor ApiService: ApiServiceProtocol {
private func createRequest<B,P>(api: String, method: String, body: B? = nil, params: [String:P]? = nil) async -> URLRequest? where B: Encodable, P: LosslessStringConvertible { private func createRequest<B,P>(api: String, method: String, body: B? = nil, params: [String:P]? = nil) async -> URLRequest? where B: Encodable, P: LosslessStringConvertible {
let baseUrl = await settingsService.useTestBackend ? Constants.baseUrlDebug : Constants.baseUrl let baseUrl = await settingsService.backend.baseUrl
guard var urlComponents = URLComponents(string: baseUrl + api) else { return nil } guard var urlComponents = URLComponents(string: baseUrl + api) else { return nil }

View File

@ -70,9 +70,14 @@ public final class SettingsService: SettingsServiceProtocol {
} }
} }
public var useTestBackend: Bool = false { public var backend: Constants.Backend {
get { Constants.Backend(rawValue: backendString) ?? .de }
set { backendString = newValue.rawValue }
}
public var backendString: String = Constants.Backend.de.rawValue {
didSet { didSet {
defaults.useTestBackend = useTestBackend defaults.backendString = backendString
} }
} }
@ -84,7 +89,7 @@ public final class SettingsService: SettingsServiceProtocol {
observe(key: \.defaultRegion, for: \.defaultRegion) observe(key: \.defaultRegion, for: \.defaultRegion)
observe(key: \.recordBeep, for: \.recordBeep) observe(key: \.recordBeep, for: \.recordBeep)
observe(key: \.showDebugInfo, for: \.showDebugInfo) observe(key: \.showDebugInfo, for: \.showDebugInfo)
observe(key: \.useTestBackend, for: \.useTestBackend) observe(key: \.backendString, for: \.backendString)
observe(key: \.user, for: \.userData) observe(key: \.user, for: \.userData)
register(defaultValues: [ register(defaultValues: [
@ -93,7 +98,7 @@ public final class SettingsService: SettingsServiceProtocol {
.defaultRegion: "761", .defaultRegion: "761",
.recordBeep: false, .recordBeep: false,
.showDebugInfo: false, .showDebugInfo: false,
.useTestBackend: false .backendString: Constants.Backend.de.rawValue
]) ])
} }

View File

@ -18,5 +18,5 @@ public protocol SettingsServiceProtocol {
var defaultRegion: String { get set } var defaultRegion: String { get set }
var recordBeep: Bool { get set } var recordBeep: Bool { get set }
var showDebugInfo: Bool { get set } var showDebugInfo: Bool { get set }
var useTestBackend: Bool { get set } var backend: Constants.Backend { get set }
} }

View File

@ -16,7 +16,7 @@ enum SettingsKey: String {
case defaultRegion case defaultRegion
case recordBeep case recordBeep
case showDebugInfo case showDebugInfo
case useTestBackend case backendString
} }
extension UserDefaults { extension UserDefaults {
@ -62,9 +62,9 @@ extension UserDefaults {
set { set(value: newValue, for: .showDebugInfo) } set { set(value: newValue, for: .showDebugInfo) }
} }
@objc dynamic var useTestBackend: Bool { @objc dynamic var backendString: String {
get { bool(for: .useTestBackend) } get { string(for: .backendString, defaultValue: Constants.Backend.de.rawValue) }
set { set(value: newValue, for: .useTestBackend) } set { set(value: newValue, for: .backendString) }
} }
@objc dynamic var user: Data? { @objc dynamic var user: Data? {

View File

@ -1,17 +1,30 @@
import Foundation import Foundation
public enum Constants { public enum Constants {
public static var baseUrl: String {
#if DEBUG public enum Backend: String, CaseIterable {
return "http://127.0.0.1:3000/"
//return "http://192.168.1.67:3000/" case de = "https://vps.aliencat.pro/"
//return "https://vps.aliencat.pro:8443/" case ru = "https://vps2.aliencat.pro/"
#else case debug = "http://192.168.1.2:3000/"
return "https://vps.aliencat.pro:8443/"
#endif public var name: String {
switch self {
case .de: "DE"
case .ru: "RU"
case .debug: "Debug"
}
} }
public static var baseUrlDebug = "http://192.168.1.2:3000/" public var baseUrl: String {
#if DEBUG
"http://127.0.0.1:3000/"
#else
rawValue
#endif
}
}
public static let pnLettersMap: [Character: Character] = [ public static let pnLettersMap: [Character: Character] = [
"А": "A", "В": "B", "Е": "E", "К": "K", "М": "M", "Н": "H", "О": "O", "Р": "P", "С": "C", "Т": "T", "У": "Y", "Х": "X" "А": "A", "В": "B", "Е": "E", "К": "K", "М": "M", "Н": "H", "О": "O", "Р": "P", "С": "C", "Т": "T", "У": "Y", "Х": "X"

View File

@ -68,6 +68,14 @@ struct SettingsServiceTests {
#expect(user.token == testUser.token) #expect(user.token == testUser.token)
} }
@Test("Save base url", .serialized, arguments: Constants.Backend.allCases)
func saveBaseUrl(value: Constants.Backend) {
settingsService.backend = value
#expect(defaults.string(forKey: SettingsKey.backendString.rawValue) == value.rawValue)
}
@Test("Save settings", .serialized, arguments: [true, false]) @Test("Save settings", .serialized, arguments: [true, false])
func saveSettings(value: Bool) { func saveSettings(value: Bool) {
@ -76,13 +84,11 @@ struct SettingsServiceTests {
settingsService.defaultRegion = testRegion settingsService.defaultRegion = testRegion
settingsService.recordBeep = value settingsService.recordBeep = value
settingsService.showDebugInfo = value settingsService.showDebugInfo = value
settingsService.useTestBackend = value
#expect(defaults.bool(forKey: SettingsKey.recognizeAlternativeOrder.rawValue) == value) #expect(defaults.bool(forKey: SettingsKey.recognizeAlternativeOrder.rawValue) == value)
#expect(defaults.bool(forKey: SettingsKey.recognizeShortenedNumbers.rawValue) == value) #expect(defaults.bool(forKey: SettingsKey.recognizeShortenedNumbers.rawValue) == value)
#expect(defaults.string(forKey: SettingsKey.defaultRegion.rawValue) == testRegion) #expect(defaults.string(forKey: SettingsKey.defaultRegion.rawValue) == testRegion)
#expect(defaults.bool(forKey: SettingsKey.recordBeep.rawValue) == value) #expect(defaults.bool(forKey: SettingsKey.recordBeep.rawValue) == value)
#expect(defaults.bool(forKey: SettingsKey.showDebugInfo.rawValue) == value) #expect(defaults.bool(forKey: SettingsKey.showDebugInfo.rawValue) == value)
#expect(defaults.bool(forKey: SettingsKey.useTestBackend.rawValue) == value)
} }
} }