Add PinCodeTextField autocomplete support

This commit is contained in:
Kyle 2023-06-20 18:04:31 +08:00
parent 9cf10125ca
commit fc35950885
No known key found for this signature in database
GPG key ID: 7056354A082F5CC2
3 changed files with 19 additions and 6 deletions

View file

@ -6,10 +6,12 @@ struct PinCodeTextField: NSViewRepresentable {
@Binding var code: String
let numberOfDigits: Int
let complete: (String) -> Void
func makeNSView(context: Context) -> NSViewType {
let view = PinCodeTextView(numberOfDigits: numberOfDigits, itemSpacing: 10)
view.codeDidChange = { c in code = c }
view.codeDidChange = { c in code = c }
view.codeDidComplete = { complete($0) }
return view
}
@ -29,8 +31,9 @@ struct PinCodeTextField_Previews: PreviewProvider {
struct PreviewContainer: View {
@State private var code = "1234567890"
var body: some View {
PinCodeTextField(code: $code, numberOfDigits: 11)
.padding()
PinCodeTextField(code: $code, numberOfDigits: 11) {
print("Input is complete \($0)")
}.padding()
}
}
@ -52,10 +55,16 @@ class PinCodeTextView: NSControl, NSTextFieldDelegate {
handler(String(code.compactMap { $0 }))
}
updateText()
if code.compactMap({ $0 }).count == numberOfDigits,
let handler = codeDidComplete {
handler(String(code.compactMap { $0 }))
}
}
}
var codeDidChange: ((String) -> Void)? = nil
var codeDidComplete: ((String) -> Void)? = nil
private let numberOfDigits: Int
private let stackView: NSStackView = .init(frame: .zero)
private var characterViews: [PinCodeCharacterTextField] = []

View file

@ -15,7 +15,9 @@ struct SignIn2FAView: View {
HStack {
Spacer()
PinCodeTextField(code: $code, numberOfDigits: authOptions.securityCode.length)
PinCodeTextField(code: $code, numberOfDigits: authOptions.securityCode.length) {
appState.submitSecurityCode(.device(code: $0), sessionData: sessionData)
}
Spacer()
}
.padding()

View file

@ -15,7 +15,9 @@ struct SignInSMSView: View {
HStack {
Spacer()
PinCodeTextField(code: $code, numberOfDigits: authOptions.securityCode.length)
PinCodeTextField(code: $code, numberOfDigits: authOptions.securityCode.length) {
appState.submitSecurityCode(.sms(code: $0, phoneNumberId: trustedPhoneNumber.id), sessionData: sessionData)
}
Spacer()
}
.padding()