secretive/Sources/Secretive/Views/StoreListView.swift
Max Goedjen b815c1e5ad
Cleanup packages/dead imports (#625)
* Slim package

* Cleanup

* .

* Expose tokenID.

* Expose some constants.

* Open.

* Combine cleanup

* Make eraser base public.

* Reload

* Fix concurrency issue on key insertion.

* Add capabilities.

* .

* Revert "."

This reverts commit 7c5c2924fa.

* Revert "Add capabilities."

This reverts commit bfa7a3cd51.
2025-08-23 20:42:08 -07:00

63 lines
1.9 KiB
Swift

import SwiftUI
import SecretKit
struct StoreListView: View {
@Binding var activeSecret: AnySecret?
@Environment(\.secretStoreList) private var storeList
private func secretDeleted(secret: AnySecret) {
activeSecret = nextDefaultSecret
}
private func secretRenamed(secret: AnySecret) {
activeSecret = secret
}
var body: some View {
NavigationSplitView {
List(selection: $activeSecret) {
ForEach(storeList.stores) { store in
if store.isAvailable {
Section(header: Text(store.name)) {
ForEach(store.secrets) { secret in
SecretListItemView(
store: store,
secret: secret,
deletedSecret: secretDeleted,
renamedSecret: secretRenamed
)
}
}
}
}
}
} detail: {
if let activeSecret {
SecretDetailView(secret: activeSecret)
} else if let nextDefaultSecret {
// This just means onAppear hasn't executed yet.
// Do this to avoid a blip.
SecretDetailView(secret: nextDefaultSecret)
} else {
EmptyStoreView(store: storeList.modifiableStore ?? storeList.stores.first)
}
}
.navigationSplitViewStyle(.balanced)
.onAppear {
activeSecret = nextDefaultSecret
}
.frame(minWidth: 100, idealWidth: 240)
}
}
extension StoreListView {
private var nextDefaultSecret: AnySecret? {
return storeList.stores.first(where: { !$0.secrets.isEmpty })?.secrets.first
}
}