import Shared import SwiftUI struct ThreadCredentialsManagementView: View { @StateObject private var viewModel = ThreadCredentialsManagementViewModel() @State private var showDeleteConfirmation = false @State private var credentialPendingDelete: ThreadCredential? 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() }