Files

96 lines
3.6 KiB
Swift

// SPDX-FileCopyrightText: 2026 Kaede Akino
// SPDX-License-Identifier: GPL-3.0-only
import SwiftUI
/// The first pinned destination's main content. Its navigator is mounted by the
/// window-level split view and remains alive while top-level destinations change.
struct VaultView: View {
@Environment(WindowModel.self) private var window
let pages: VaultPageStates
init(pages: VaultPageStates = VaultPageStates()) {
self.pages = pages
}
var body: some View {
destination
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
@ViewBuilder
private var destination: some View {
switch window.vaultDestination {
case .welcome: WelcomeView()
case .hosts: HostsPageView(state: pages.hosts)
case .keychain: KeychainPageView(state: pages.keychain)
case .portForwarding: PortForwardingPageView(state: pages.portForwarding)
case .snippets: SnippetsPageView(state: pages.snippets)
case .knownHosts: KnownHostsPageView(state: pages.knownHosts)
}
}
}
struct VaultWorkDetailView: View {
let route: VaultWorkRoute
@Environment(AppModel.self) private var app
@Environment(WindowModel.self) private var window
@ViewBuilder
var body: some View {
switch route {
case .tailscaleDetails(let hostID):
TailscaleDetailView(hostID: hostID)
case .hostEditor(let id, let groupID, let discover):
HostEditorView(hostID: id, initialGroupID: groupID, discover: discover)
case .hostGroupEditor(let groupID, let parentID):
NewGroupSheet(
group: groupID.flatMap(app.hostLibrary.group), parentID: parentID,
create: { _ in },
close: window.closeVaultWork
)
case .forwardingEditor(let id):
PortForwardingDetailView(ruleID: id)
case .identityEditor(let id):
NewIdentitySheet(
identity: id.flatMap(app.hostLibrary.identity),
defaultPasswordStorage: app.newVaultPasswordStorage,
create: { identity, password in
try app.hostLibrary.upsert(identity, passwordUpdate: password)
window.selectVaultItem(.identity(identity.id), on: .keychain)
},
close: window.closeVaultWork
)
case .generateKey:
KeychainGenerateDetail()
case .knownHostEditor(let id):
KnownHostEditorView(entryID: id)
case .sshImport(let knownHostsOnly):
SSHImportView(knownHostsOnly: knownHostsOnly)
case .importKey:
KeychainImportDetail()
case .editKey(let id):
KeychainEditDetail(keyID: id)
case .exportKey(let id):
KeyExportDetailView(keyID: id)
case .snippetEditor(let snippetID, let packageID):
SnippetEditorView(
snippet: snippetID.flatMap(app.hostLibrary.snippet), packageID: packageID,
save: { snippet in
app.hostLibrary.upsert(snippet)
window.selectVaultItem(.snippet(snippet.id), on: .snippets)
},
close: window.closeVaultWork
)
case .snippetPackageEditor(let packageID, let parentID):
SnippetPackageSheet(
package: packageID.flatMap(app.hostLibrary.snippetPackage), parentID: parentID,
save: { app.hostLibrary.upsert($0) }, close: window.closeVaultWork
)
case .snippetExecutionTargets(let request):
SnippetExecutionTargetsView(request: request)
}
}
}