OTP/OTP/Views/EditKeyForm.swift

124 lines
3.9 KiB
Swift

//
// EditKeyForm.swift
// OTP
//
// Created by Shadowfacts on 8/21/21.
//
import SwiftUI
import OTPKit
struct EditKeyForm: View {
let dismiss: (DismissAction) -> Void
let showCancelButton: Bool
let focusOnAppear: Bool
@State private var editedKey: EditedKey
@FocusState private var issuerFocused: Bool
init(editingKey: TOTPKey?, showCancelButton: Bool = true, focusOnAppear: Bool = false, dismiss: @escaping (DismissAction) -> Void) {
self.dismiss = dismiss
self.showCancelButton = showCancelButton
self.focusOnAppear = focusOnAppear
if let totpKey = editingKey,
let edited = EditedKey(totpKey: totpKey) {
self.editedKey = edited
} else {
self.editedKey = EditedKey()
}
}
var isValid: Bool {
editedKey.toTOTPKey() != nil
}
var body: some View {
Form {
TextField("Issuer", text: $editedKey.issuer)
.focused($issuerFocused)
TextField("Account", text: $editedKey.label)
.disableAutocorrection(true)
.autocapitalization(.none)
HStack {
TextField("Secret", text: $editedKey.secret)
if #available(iOS 16.0, *) {
PasteButton(payloadType: String.self) { pasted in
if let s = pasted.first {
self.editedKey.secret = s
}
}
.labelStyle(.iconOnly)
.buttonBorderShape(.capsule)
} else {
Button {
self.editedKey.secret = UIPasteboard.general.string ?? ""
} label: {
Label("Paste", systemImage: "doc.on.clipboard")
.labelStyle(.iconOnly)
.foregroundColor(.accentColor)
}
.buttonStyle(.plain)
.disabled(!UIPasteboard.general.hasStrings)
}
}
HStack {
Text("Period")
Spacer()
Picker("Period", selection: $editedKey.period) {
Text("30 sec").tag(EditedKey.Period.thirty)
Text("60 sec").tag(EditedKey.Period.sixty)
}
.pickerStyle(.segmented)
.frame(maxWidth: 200)
}
HStack {
Text("Digits")
Spacer()
Picker("Digits", selection: $editedKey.digits) {
Text("6").tag(EditedKey.Digits.six)
Text("8").tag(EditedKey.Digits.eight)
}
.pickerStyle(.segmented)
.frame(maxWidth: 200)
}
}
.onAppear {
if focusOnAppear {
// todo: this just doesn't work :/
// https://developer.apple.com/forums/thread/681962
// FB9551099
issuerFocused = true
}
}
.onSubmit {
if isValid {
dismiss(.save(editedKey.toTOTPKey()!))
}
}
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
// ToolbarContentBuilder doesn't support conditionals, so this has to go inside the ToolbarItem
if showCancelButton {
Button("Cancel") {
dismiss(.cancel)
}
}
}
ToolbarItem(placement: .navigationBarTrailing) {
Button("Save") {
dismiss(.save(editedKey.toTOTPKey()!))
}
.disabled(!isValid)
}
}
}
}
struct EditKeyForm_Previews: PreviewProvider {
static var previews: some View {
EditKeyForm(editingKey: nil) { (_) in }
}
}