mirror of
https://github.com/maxgoedjen/secretive.git
synced 2025-08-19 11:40:56 +00:00
* Enable language mode
* WIP
* WIP
* Fix concurrency issues in SmartCardStore
* Switch to SMAppService
* Bump runners
* Base
* Finish Testing migration
* Tweak async for updater
* More
* Backport mutex
* Revert "Backport mutex"
This reverts commit 9b02afb20c
.
* WIP
* Reenable
* Fix preview.
* Update package.
* Bump to latest public macOS and Xcode
* Bump back down to 6.1
* Update to Xcode 26.
* Fixed tests.
* More cleanup
* Env fixes
* var->let
* Cleanup
* Persist auth async
* Whitespace.
* Whitespace.
* Cleanup.
* Cleanup
* Redoing locks in actors bc of observable
* Actors.
* .
* Specify b5
* Update package to 6.2
* Fix disabled updater
* Remove preconcurrency warning
* Move updater init
64 lines
1.9 KiB
Swift
64 lines
1.9 KiB
Swift
import SwiftUI
|
|
import Combine
|
|
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
|
|
}
|
|
|
|
}
|