iOS/Sources/App/Thread/CredentialsManagement/ThreadCredentialsManagement...

69 lines
2.2 KiB
Swift

import Shared
import SwiftUI
struct ThreadCredentialsManagementView: View {
@StateObject private var viewModel: ThreadCredentialsManagementViewModel
@State private var showDeleteConfirmation = false
@State private var credentialPendingDelete: ThreadCredential?
init(viewModel: ThreadCredentialsManagementViewModel) {
self._viewModel = .init(wrappedValue: viewModel)
}
var body: some View {
VStack {
if viewModel.isLoading {
ProgressView()
.progressViewStyle(.circular)
} else {
listView
}
}
.navigationTitle(L10n.Thread.Management.title)
.onAppear {
Task.detached {
await viewModel.loadCredentials()
}
}
}
private var listView: some View {
List(viewModel.configs, id: \.id) { config in
Section(config.name) {
ForEach(config.credentials, id: \.autogeneratedId) { credential in
CollapsibleView(collapsedContent: {
Text(credential.networkName)
.padding(.vertical, 8)
}, expandedContent: {
ThreadCredentialDetailsView(source: config.source, credential: credential)
.padding(.top)
})
}
.onDelete { indexSet in
credentialPendingDelete = indexSet.map({ config.credentials[$0] }).first
showDeleteConfirmation = true
}
}
}
.environmentObject(viewModel)
.confirmationDialog(
L10n.SettingsDetails.Thread.DeleteCredential.Confirmation.title,
isPresented: $showDeleteConfirmation,
titleVisibility: .visible
) {
Button(L10n.yesLabel, role: .destructive) {
viewModel.deleteCredential(credentialPendingDelete)
credentialPendingDelete = nil
}
Button(L10n.noLabel, role: .cancel) {
credentialPendingDelete = nil
}
}
}
}
#Preview {
ThreadCredentialsManagementView.build()
}