Files
2026-07-13 13:12:00 +08:00

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
}
}