Sesame-iOS/Sesame-Watch Watch App/Settings/SettingsKeyInputView.swift
2023-08-09 16:29:18 +02:00

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())
}
}