diff --git a/App/Settings/GeneralSettingsViewController.swift b/App/Settings/GeneralSettingsViewController.swift index 23ff06b..c44bfea 100644 --- a/App/Settings/GeneralSettingsViewController.swift +++ b/App/Settings/GeneralSettingsViewController.swift @@ -169,7 +169,7 @@ class GeneralSettingsViewController: UIViewController cell.contentConfiguration = ButtonContentConfiguration(menu: menu) } else if identifier == Self.SyncServerItem { cell.contentConfiguration = TextFieldContentConfiguration( - text: Settings.shared.syncServer, + text: Settings.shared.syncServer ?? "", placeholderText: "https://sync.server.com", textChanged: { newString in Settings.shared.syncServer = newString diff --git a/App/Settings/Settings.swift b/App/Settings/Settings.swift index 192ce91..a4469fb 100644 --- a/App/Settings/Settings.swift +++ b/App/Settings/Settings.swift @@ -107,5 +107,22 @@ class Settings public var userStylesheet: String = "" @SettingProperty(key: "syncServer") - public var syncServer: String = "https://attractor.severnaya.net" + public var syncServer: Optional = "https://attractor.severnaya.net" +} + +extension Optional: RawRepresentable where Wrapped == String +{ + public init?(rawValue: String?) { + if let rawValue { + self = String(rawValue: rawValue) + } else { + self = .none + } + } + + public var rawValue: String? { + return self + } + + public typealias RawValue = String? } diff --git a/App/Sync/AttractorServer.swift b/App/Sync/AttractorServer.swift index 6aed49e..c0e7f99 100644 --- a/App/Sync/AttractorServer.swift +++ b/App/Sync/AttractorServer.swift @@ -9,10 +9,20 @@ import Foundation class AttractorServer { + public enum Error: Swift.Error { + case missingEndpointURL + } + static let shared = AttractorServer() - private var endpointURL: URL { - get { URL(string: Settings.shared.syncServer) ?? URL(string: "http://localhost")! } + private var endpointURL: URL? { + get { + if let syncServer = Settings.shared.syncServer { + return URL(string: syncServer) + } + + return nil + } } private func getHostname() -> String { @@ -21,6 +31,8 @@ class AttractorServer } public func publishTabInfo(_ tabInfos: [TabInfo]) { + guard let endpointURL else { return } + let hostName = getHostname() let rpcURL = endpointURL.appendingPathComponent("publishTabInfo") var components = URLComponents(url: rpcURL, resolvingAgainstBaseURL: false)! @@ -44,7 +56,12 @@ class AttractorServer } } - public func getTabInfos(_ completion: @escaping(Result<[String: [TabInfo]], Error>) -> Void) { + public func getTabInfos(_ completion: @escaping(Result<[String: [TabInfo]], Swift.Error>) -> Void) { + guard let endpointURL else { + completion(.failure(Self.Error.missingEndpointURL)) + return + } + let rpcURL = endpointURL.appendingPathComponent("getTabInfos") let request = URLRequest(url: rpcURL) let myHostname = getHostname()