65 lines
1.7 KiB
Swift
65 lines
1.7 KiB
Swift
import SwiftUI
|
|
|
|
struct AppRootView: View {
|
|
@EnvironmentObject private var settings: SettingsStore
|
|
@State private var mode: Mode
|
|
|
|
init() {
|
|
_mode = State(initialValue: .setup(prefill: nil, error: nil))
|
|
}
|
|
|
|
var body: some View {
|
|
Group {
|
|
switch mode {
|
|
case .setup(let prefill, let error):
|
|
ConnectView(prefill: prefill ?? settings.serverURL, error: error) { url in
|
|
settings.serverURL = url.absoluteString
|
|
mode = .web(url)
|
|
}
|
|
case .web(let url):
|
|
WebShellView(
|
|
initialURL: url,
|
|
connectToNewServer: {
|
|
mode = .setup(prefill: settings.serverURL, error: nil)
|
|
},
|
|
switchToServer: { nextURL in
|
|
settings.serverURL = nextURL.absoluteString
|
|
mode = .web(nextURL)
|
|
},
|
|
loadFailed: { failedURL, message in
|
|
mode = .setup(
|
|
prefill: failedURL.omnigentOrigin ?? failedURL.absoluteString, error: message)
|
|
},
|
|
loadSucceeded: { loadedURL in
|
|
settings.rememberRecentServer(loadedURL)
|
|
}
|
|
)
|
|
}
|
|
}
|
|
.task {
|
|
guard shouldAutoOpenSavedServer else { return }
|
|
if case .setup(nil, nil) = mode,
|
|
let saved = settings.serverURL,
|
|
let url = URL(string: saved)
|
|
{
|
|
mode = .web(url)
|
|
}
|
|
}
|
|
}
|
|
|
|
private enum Mode: Equatable {
|
|
case setup(prefill: String?, error: String?)
|
|
case web(URL)
|
|
}
|
|
|
|
private var shouldAutoOpenSavedServer: Bool {
|
|
#if DEBUG
|
|
let processInfo = ProcessInfo.processInfo
|
|
return processInfo.environment["OMNIGENT_SCREENSHOT_APP_URL"] == nil
|
|
&& !processInfo.arguments.contains("-FASTLANE_SNAPSHOT")
|
|
#else
|
|
true
|
|
#endif
|
|
}
|
|
}
|