78 lines
2.1 KiB
Swift
78 lines
2.1 KiB
Swift
import SwiftUI
|
|
import CryptoKit
|
|
|
|
struct SettingsKeyInputView: View {
|
|
|
|
let type: KeyManagement.KeyType
|
|
|
|
@State
|
|
private var text: String = ""
|
|
|
|
let footnote: String
|
|
|
|
@EnvironmentObject
|
|
private var keys: KeyManagement
|
|
|
|
private var hasKey: Bool {
|
|
keys.has(type)
|
|
}
|
|
|
|
private var displayText: String {
|
|
keys.get(type)?.displayString ?? "-"
|
|
}
|
|
|
|
private var copyText: String {
|
|
guard let key = keys.get(type)?.data else {
|
|
return ""
|
|
}
|
|
guard type.usesHashing else {
|
|
return key.hexEncoded
|
|
}
|
|
return SHA256.hash(data: key).hexEncoded
|
|
}
|
|
|
|
var body: some View {
|
|
ScrollView {
|
|
VStack(alignment: .leading) {
|
|
TextField(type.displayName, text: $text)
|
|
.onSubmit(validateText)
|
|
.foregroundColor(.accentColor)
|
|
Text(footnote)
|
|
.font(.footnote)
|
|
.foregroundColor(.secondary)
|
|
}
|
|
.navigationTitle(type.displayName)
|
|
.onAppear {
|
|
if text == "" {
|
|
text = displayText
|
|
print("Text inserted")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private func validateText() {
|
|
let cleanText = text.replacingOccurrences(of: " ", with: "").trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
|
|
guard let keyData = Data(fromHexEncodedString: cleanText) else {
|
|
print("Invalid key string")
|
|
return
|
|
}
|
|
let keyLength = type.keyLength.bitCount
|
|
guard keyData.count * 8 == keyLength else {
|
|
print("Invalid key length \(keyData.count * 8) bits, expected \(keyLength) (Input: '\(text)')")
|
|
return
|
|
}
|
|
keys.save(type, data: keyData)
|
|
print("Key \(type) saved")
|
|
}
|
|
}
|
|
|
|
struct SettingsKeyInputView_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
SettingsKeyInputView(
|
|
type: .remoteKey,
|
|
footnote: "Some text describing the purpose of the key.")
|
|
.environmentObject(KeyManagement())
|
|
}
|
|
}
|